templates/menu_components/header_nav_bar/header_nav_bar_new.html.twig line 1

Open in your IDE?
  1. <div class="header navbar">
  2. <div class="header-container">
  3. <ul class="nav-left">
  4. <li>
  5. <a id='sidebar-toggle' class="sidebar-toggle" href="javascript:void(0);">
  6. <i class="fa-solid fa-bars"></i>
  7. <i class="fa-solid fa-xmark"></i>
  8. </a>
  9. <a class="sidebar-link mobile-logo" href="{{ path('dashboard') }}">
  10. <img src="{{ asset('assets/images/core-logo-full.png') }}" alt="logo"/>
  11. </a>
  12. </li>
  13. </ul>
  14. <ul class="nav-mid p-0">
  15. <div class="header-lesson-list">
  16. {% set lessonExtension = getNewestLessons() %}
  17. {% for lesson in lessonExtension.lessons %}
  18. {% set wasOnline = (lesson.attendedAtTeacher and lesson.attendedAtChild) ? true : false %}
  19. <div class="card has-timer active h-100p ">
  20. <div class="card-body">
  21. <div class="card-item h-100p"
  22. data-start="{{ lesson.startTime ? lesson.startTime|date('Y-m-d H:i') : '' }}"
  23. data-end="{{ lesson.endTime ? lesson.endTime|date('Y-m-d H:i') : '' }}"
  24. data-lesson-id="{{ lesson.id }}">
  25. <div class="discipline">
  26. <div class="name">{{ lesson.discipline.displayName }}</div>
  27. </div>
  28. <div class="users {{ wasOnline ? "was-joined" : "" }}">
  29. <div class="teacher">
  30. <div class="status">
  31. <div class="box {{ lesson.statusTeacher ? "joined" : "not-joined" }}"></div>
  32. </div>
  33. <div class="label-wrap">
  34. <div class="text">{% trans %}Korepetitorius:{% endtrans %}</div>
  35. <div class="name">{% set name = lesson.teacher|split(' ') %}{{ name[0] }}</div>
  36. </div>
  37. </div>
  38. <div class="student">
  39. <div class="status">
  40. <div class="box {{ lesson.statusChild ? "joined" : "not-joined" }}"></div>
  41. </div>
  42. <div class="label-wrap">
  43. <div class="text">{% trans %}Mokinys:{% endtrans %}</div>
  44. <div class="name">{{ lesson.child.fullname }}</div>
  45. </div>
  46. </div>
  47. </div>
  48. {# <div class="timer"> #}
  49. {# Pradžia: {{ lesson.startTime ? lesson.startTime|date('Y-m-d H:i') : '' }} #}
  50. {# </div> #}
  51. {# <div style="display: none" class="img"><img #}
  52. {# src="{{ lesson.teacher.profileImagePath ? lesson.teacher.profileImagePath : asset('assets/images/default.png') }}"> #}
  53. {# </div> #}
  54. <div class="actions">
  55. <div class="notice"></div>
  56. <button class='btn btn-success join-lesson'
  57. {{ lesson.getLessonJoin() ? "" : "disabled" }}
  58. data-href="{{ path('unicko_router', {'id':lesson.id}) }}">
  59. Jungtis
  60. </button>
  61. </div>
  62. </div>
  63. </div>
  64. </div>
  65. {% endfor %}
  66. </div>
  67. </ul>
  68. <ul class="nav-right">
  69. {% if is_granted('ROLE_ADMIN') %}
  70. {% macro counter_badge(href, icon, count, title) %}
  71. <li class="admin-counter-item">
  72. <a href="{{ href }}" title="{{ title }}">
  73. <span class="counter-icon-wrap">
  74. <i class="fa-solid {{ icon }}"></i>
  75. <span class="badge badge-pill {{ count > 0 ? 'badge-danger' : 'badge-secondary' }}">{{ count }}</span>
  76. </span>
  77. </a>
  78. </li>
  79. {% endmacro %}
  80. {{ _self.counter_badge('/guardian_register/registrations', 'fa-user-plus', getNewRegistrationsCount(), 'Naujos registracijos') }}
  81. {{ _self.counter_badge('/child_preference_assigment/', 'fa-list-check', getPendingAssignmentsCount(), 'Priskyrimo laukia') }}
  82. <li class="admin-counter-item dropdown bug-report">
  83. <a href="javascript:void(0);" title="Klaidos">
  84. <span class="counter-icon-wrap">
  85. <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" fill="currentColor" class="bi bi-bug" viewBox="0 0 16 16">
  86. <path d="M4.355.522a.5.5 0 0 1 .623.333l.291.956A5 5 0 0 1 8 1c1.007 0 1.946.298 2.731.811l.29-.956a.5.5 0 1 1 .957.29l-.41 1.352A5 5 0 0 1 13 6h.5a.5.5 0 0 0 .5-.5V5a.5.5 0 0 1 1 0v.5A1.5 1.5 0 0 1 13.5 7H13v1h1.5a.5.5 0 0 1 0 1H13v1h.5a1.5 1.5 0 0 1 1.5 1.5v.5a.5.5 0 1 1-1 0v-.5a.5.5 0 0 0-.5-.5H13a5 5 0 0 1-10 0h-.5a.5.5 0 0 0-.5.5v.5a.5.5 0 1 1-1 0v-.5A1.5 1.5 0 0 1 2.5 10H3V9H1.5a.5.5 0 0 1 0-1H3V7h-.5A1.5 1.5 0 0 1 1 5.5V5a.5.5 0 0 1 1 0v.5a.5.5 0 0 0 .5.5H3c0-1.364.547-2.601 1.432-3.503l-.41-1.352a.5.5 0 0 1 .333-.623M4 7v4a4 4 0 0 0 3.5 3.97V7zm4.5 0v7.97A4 4 0 0 0 12 11V7zM12 6a4 4 0 0 0-1.334-2.982A3.98 3.98 0 0 0 8 2a3.98 3.98 0 0 0-2.667 1.018A4 4 0 0 0 4 6z"/>
  87. </svg>
  88. </span>
  89. </a>
  90. </li>
  91. {% endif %}
  92. {# <a href="{{ path('app_sync_google_lessons') }}">SYNC</a> #}
  93. {% if is_granted('ROLE_GUARDIAN') or is_granted('ROLE_CHILD') %}
  94. <li class="dropdown">
  95. <a href="https://pagalba.corepetitus.lt/hc/lt/sections/22038273075346-Klientams"
  96. class="peers fxw-nw ai-c lh-1">
  97. <div class="peer">
  98. <i class="fa-solid fa-circle-question"></i>
  99. </div>
  100. </a>
  101. </li>
  102. {% endif %}
  103. {% if is_granted('ROLE_TEACHER') %}
  104. <li class="dropdown">
  105. <a href="https://pagalba.corepetitus.lt/hc/lt/sections/22038256444690-Korepetitoriams"
  106. class="peers fxw-nw ai-c lh-1">
  107. <div class="peer">
  108. <i class="fa-solid fa-circle-question"></i>
  109. </div>
  110. </a>
  111. {# <ul class="dropdown-menu "> #}
  112. {# <li> #}
  113. {# <span class="menu-item sub-headline">{% trans %}Pasirinkite užklausos temą{% endtrans %}</span> #}
  114. {# </li> #}
  115. {# <li> #}
  116. {# <a href="{{ path('me_teacher_stop_lessons_landing') }}" class="menu-item"> #}
  117. {# <span>{% trans %}Korepetitoriaus laikinas veiklos stabdymas{% endtrans %}</span> #}
  118. {# </a> #}
  119. {# </li> #}
  120. {# <li> #}
  121. {# <a href="{{ path('me_teacher_sick_leaves_landing') }}" class="menu-item"> #}
  122. {# <span>{% trans %}Korepetitorius susirgo{% endtrans %}</span> #}
  123. {# </a> #}
  124. {# </li> #}
  125. {# <li> #}
  126. {# <a href="{{ path('me_teacher_cancel_discipline') }}" class="menu-item"> #}
  127. {# <span>{% trans %}Nebegaliu mokyti tam tikros disciplinos{% endtrans %}</span> #}
  128. {# </a> #}
  129. {# </li> #}
  130. {# <li> #}
  131. {# <a href="{{ path('me_teacher_cancel_class') }}" class="menu-item"> #}
  132. {# <span>{% trans %}Nebegaliu mokyti tam tikros klasės{% endtrans %}</span> #}
  133. {# </a> #}
  134. {# </li> #}
  135. {# </ul> #}
  136. </li>
  137. <li class="nav-badge">
  138. <a href="{{ path('app_salary_vacation') }}" class="peers">
  139. <div class="peer">
  140. <img class="w-3r"
  141. src="{{ asset("assets/images/badge_#{app.user.levelInfo.badge}.svg") }}" alt="">
  142. </div>
  143. </a>
  144. </li>
  145. {% endif %}
  146. <li class="{{ is_granted('ROLE_ADMIN') ? 'admin-counter-item ' : '' }}notifications dropdown">
  147. <a href="" class="dropdown-toggle user-notifications no-after {{ is_granted('ROLE_ADMIN') ? '' : 'peers fxw-nw ai-c lh-1' }}"
  148. data-toggle="dropdown">
  149. {% if is_granted('ROLE_ADMIN') %}
  150. <span class="counter-icon-wrap">
  151. <i class="fa fa-bell {% if getUserNotificationCount() %}ring{% endif %}"></i>
  152. <span class="badge badge-pill {{ getUserNotificationCount() > 0 ? 'badge-danger' : 'badge-secondary' }}">{{ getUserNotificationCount() }}</span>
  153. </span>
  154. {% else %}
  155. <div class="peer">
  156. <i class="fa fa-bell {% if getUserNotificationCount() %}ring{% endif %}">
  157. {% if getUserNotificationCount() %}
  158. <span class="badge badge-danger badge-pill user-notification-badge"><span class="number">{{ getUserNotificationCount() }}</span></span>
  159. {% endif %}
  160. </i>
  161. </div>
  162. {% endif %}
  163. </a>
  164. <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1" data-bs-popper="none">
  165. <li class="notification-title"><i class="fa fa-bell pR-10"></i> <span class="text">Pranešimai</span>
  166. </li>
  167. {% if getUserNotificationData().notifications | length > 0 %}
  168. {% for notification in getUserNotificationData().notifications %}
  169. <li class="">
  170. <a href="{{ path('app_me_notification_index_id',{id:notification.id}) }}"
  171. class="{{ notification.seen ? "" : "new" }} peers fxw-nw td-n bdB c-grey-800 cH-blue bgcH-grey-100">
  172. <div class="peer mR-10">
  173. <div class="image w-3r"
  174. style="background-image: url({{ notification.createdBy.profileImagePath }})"></div>
  175. </div>
  176. <div class="peer peer-greed">
  177. <div>
  178. <div class="peers jc-sb fxw-nw mB-5">
  179. <div class="peer"><p
  180. class="fw-500 mB-0">{{ notification.topic | truncate(25, false) }}</p>
  181. </div>
  182. <div class="peer alt-text">
  183. <small class="fsz-xs">prieš {{ notification.getAgo(app.user) }}</small>
  184. </div>
  185. </div>
  186. <span class="sub-headline">{{ notification.message | striptags | truncate(60, true) | split('.')|first | raw }}</span>
  187. </div>
  188. </div>
  189. </a>
  190. </li>
  191. {% endfor %}
  192. {% else %}
  193. <li class="c-grey-600 cH-blue td-n ta-c p-10">Pranešimų nėra</li>
  194. {% endif %}
  195. <li class="notification-title ta-c">
  196. <span>
  197. <a href="{{ path('app_me_notification_index') }}" class="td-n">Visi pranešimai
  198. <i class="ti-angle-right fsz-xs mL-10"></i>
  199. </a>
  200. </span>
  201. </li>
  202. </ul>
  203. </li>
  204. {% if is_granted('ROLE_TEACHER') %}
  205. {% set teacherPublicProfiles = app.user.teacherPublicProfiles|default([]) %}
  206. {% set teacherEditablePublicProfiles = teacherPublicProfiles|filter(publicProfile => publicProfile.status in [constant('App\\Entity\\TeacherPublicProfile::STATUS_IN_REVIEW'), constant('App\\Entity\\TeacherPublicProfile::STATUS_REJECTED')]) %}
  207. {% set teacherConfirmedPublicProfiles = teacherPublicProfiles|filter(publicProfile => publicProfile.status == constant('App\\Entity\\TeacherPublicProfile::STATUS_CONFIRMED')) %}
  208. {% set teacherPublicProfile = teacherEditablePublicProfiles|length ? teacherEditablePublicProfiles|first : (teacherConfirmedPublicProfiles|length ? teacherConfirmedPublicProfiles|first : null) %}
  209. {% set isTeacherPublicProfileCanceled = teacherPublicProfile and teacherPublicProfile.status == constant('App\\Entity\\TeacherPublicProfile::STATUS_REJECTED') %}
  210. {% if not teacherPublicProfile or isTeacherPublicProfileCanceled %}
  211. <li class="nav-fill-profile-item">
  212. <span class="nav-fill-profile-btn"{% if isTeacherPublicProfileCanceled %} style="border-color:#dc3545;color:#dc3545;"{% endif %}>
  213. <a href="{{ path('me_teacher_public_profile') }}" class="td-n"{% if isTeacherPublicProfileCanceled %} style="color:#dc3545;"{% endif %}>
  214. <i class="fas fa-exclamation-triangle" style="margin-right:6px;"></i>{% trans %}Reikia užpildyti viešą profilį{% endtrans %}
  215. </a>
  216. </span>
  217. </li>
  218. {% endif %}
  219. {% endif %}
  220. <li class="dropdown">
  221. <a href="" class="dropdown-toggle no-after peers fxw-nw ai-c lh-1" data-toggle="dropdown">
  222. <div class="peer">
  223. <img class="w-2r bdrs-50p"
  224. src="{% if app.user is defined and app.user is not null and app.user.profileImagePath is not null %}{{ app.user.profileImagePath }}{% else %}{{ asset('assets/images/default.png') }}{% endif %}"
  225. alt="">
  226. </div>
  227. <div class="peer pl-2">
  228. <span class=" user-name">{% if app.user is defined and app.user is not null and app.user.fullname is not null %}{{ app.user.fullname }}{% endif %}</span>
  229. </div>
  230. </a>
  231. <ul class="dropdown-menu ">
  232. {% if is_granted('ROLE_TEACHER') %}
  233. <li>
  234. {% if not teacherPublicProfile %}
  235. <a href="{{ path('me_teacher_public_profile') }}" class="menu-item fill-profile-dropdown-link" style="color:#e08c00;font-weight:600;display:flex;align-items:center;">
  236. <i class="fas fa-exclamation-triangle" style="padding-left:25px;margin-right:4px;flex-shrink:0;"></i><span style="padding:0;margin:0;font-weight:700;">{% trans %}Užpildyk savo viešą profilį{% endtrans %}</span>
  237. </a>
  238. {% elseif teacherPublicProfile.status == constant('App\\Entity\\TeacherPublicProfile::STATUS_REJECTED') %}
  239. <a href="{{ path('me_teacher_public_profile') }}" class="menu-item fill-profile-dropdown-link" style="color:#dc3545;font-weight:600;display:flex;align-items:center;">
  240. <i class="fas fa-exclamation-triangle" style="padding-left:25px;margin-right:4px;flex-shrink:0;"></i><span style="padding:0;margin:0;font-weight:700;">{% trans %}Užpildyk savo viešą profilį{% endtrans %}</span>
  241. </a>
  242. {% else %}
  243. <a href="{{ path('me_teacher_public_profile') }}" class="menu-item">
  244. <span>{% trans %}Public Profile{% endtrans %}</span>
  245. </a>
  246. {% endif %}
  247. </li>
  248. <li class="divider"></li>
  249. {% endif %}
  250. <li>
  251. <a href="{{ path('me_edit') }}" class="menu-item">
  252. <span>{% trans %}Edit Profile{% endtrans %}</span>
  253. </a>
  254. </li>
  255. <li>
  256. <a href="/logout" class="menu-item">
  257. <span>{% trans %}Logout{% endtrans %}</span>
  258. </a>
  259. </li>
  260. </ul>
  261. </li>
  262. <li>
  263. <a id="sidebar-toggle" class="sidebar-toggle" href="javascript:void(0);">
  264. <i class="fa-solid fa-bars"></i>
  265. <i class="fa-solid fa-xmark"></i>
  266. </a>
  267. </li>
  268. </ul>
  269. </div>
  270. </div>
  271. {% if not is_granted('ROLE_ADMIN') %}
  272. {% block stylesheets %}
  273. {% endblock %}
  274. {% block javascripts %}
  275. {# {{ encore_entry_script_tags('app') }}#}
  276. <script>
  277. document.addEventListener("DOMContentLoaded", function(event) {
  278. $('.card.has-timer').each(function (index, item) {
  279. CountDownTimer(item);
  280. })
  281. $('.move-lesson').on('click', function () {
  282. Swal.fire({
  283. title: "Ar tikrai?",
  284. text: "Norint perkelti užsiėmimą į naują dieną ir laiką privaloma susitarti su mokinio ar mokinio tėvais/ globėjais. Nesusitarus, perkelti draudžiama.",
  285. icon: "warning",
  286. showCancelButton: true,
  287. confirmButtonColor: "#3085d6",
  288. cancelButtonColor: "#d33",
  289. confirmButtonText: "Tėvai/mokinys sutiko",
  290. cancelButtonText: "Dar nesusitariau",
  291. customClass: {container: "version_2"},
  292. }).then((result) => {
  293. if (result.isConfirmed) {
  294. initLessonMoveModal(this.getAttribute('data-lesson'))
  295. }
  296. })
  297. })
  298. $('.missed-lesson').on('click', function () {
  299. let modal = $('#missedLessonModal');
  300. modal.modal().show();
  301. modal.attr('data-lesson', this.getAttribute('data-lesson'))
  302. })
  303. $('#modal .modal-save').on('click', function (e) {
  304. e.stopPropagation()
  305. if ($('.modal-body form').get(0).reportValidity()) {
  306. if (confirm("Ar tikrai norite perkelti šią pamoką?")) {
  307. let lessonId = this.getAttribute('lesson');
  308. let url = `{{ path('me_teacher_lesson_move', {'id': 'id'}) }}`;
  309. url = url.replace('id', lessonId);
  310. $.ajax({
  311. type: 'POST',
  312. url: url,
  313. data: $('.modal-body form').serialize(),
  314. success: function (res) {
  315. $('#modal').modal('hide')
  316. $('#modal .modal-footer .modal-save').removeAttr('lesson')
  317. window.location.reload()
  318. },
  319. error: function (error) {
  320. toastr.error(error.responseJSON.status);
  321. }
  322. });
  323. }
  324. }
  325. })
  326. let searchParams = new URLSearchParams(window.location.search)
  327. if (searchParams.has('action') && searchParams.get('action') == 'missed') {// true
  328. initModal('Informacija', `
  329. <p>Kadangi kita pusė neinformuotai praleido užsiėmimą (neprisijungė laiku), užsiėmimas laikomas kaip kitos pusės neinformuotai praleistas.</p>
  330. <p>Klientas už tokį korepetitoriaus praleistą užsiėmimą pinigų nemoka. Esant galimybei, korepetitorius susisieks su Jumis ir sutars naują laiką užsiėmimui atidirbti.</p>
  331. <p>Korepetitorius už tokį mokinio praleistą užsiėmimą atlygį gauna ir klientas už mokinio neinformuotai praleistą užsiėmimą moka pilną kainą. Esant galimybei, korepetitorius susisieks su Jumis ir sutars naują laiką užsiėmimui atidirbti.</p>`);
  332. let url = document.location.href;
  333. window.history.pushState({}, "", url.split("?")[0]);
  334. }
  335. if (searchParams.has('action') && searchParams.get('action') == 'moved') {// true
  336. initModal('Informacija', `
  337. <div class="ta-c">
  338. <p>Korepetitorius šį užsiėmimą ką tik perkėlė ir užsiėmimas vyks kitu laiku!</p>
  339. <p>Pradinė užsiėmimo data ir laikas:<br>${searchParams.get('from')}</p>
  340. <p>Nauja užsiėmimo data ir laikas:<br>${searchParams.get('to')}</p>
  341. </div>`);
  342. let url = document.location.href;
  343. window.history.pushState({}, "", url.split("?")[0]);
  344. }
  345. if (searchParams.has('action') && searchParams.get('action') == 'denied') {// true
  346. initModal('Šiuo metu nėra galimybės prisijungti prie užsiėmimo.', `
  347. <div class="ta-c">
  348. <p><b>Taip yra dėl vienos iš žemiau pateiktų priežasčių:</b></p>
  349. <p>A) šiuo metu vienas vartotojas jau yra prisijungęs (mokinys arba tėvas/ globėjas);</p>
  350. <p>B) jūs neplanuotai atsijungėte nuo užsiėmimo.</p>
  351. <p><b>JEI NORITE PRISIJUNGTI:</b></p>
  352. <p>A) atveju privaloma, jog vienas vartotojas atsijungtų ir tik tada galės prisijungti kitas vartotojas;</p>
  353. <p>B) atveju vėl galėsite prisijungti 60 sekundžių eigoje nuo neplanuoto atsijungimo;</p>
  354. </div>`);
  355. let url = document.location.href;
  356. // window.history.pushState({}, "", url.split("?")[0]);
  357. }
  358. // create new scope
  359. var timer;
  360. // bind event handler
  361. $('.join-lesson').on('click', function () {
  362. var buttonClicked = this;
  363. if (timer) {
  364. clearTimeout(timer);
  365. }
  366. timer = setTimeout(function () {
  367. window.open(buttonClicked.getAttribute('data-href'), "_blank")
  368. }, 700, buttonClicked);
  369. });
  370. })
  371. function initModal(header, body, footerVisible = false) {
  372. let modal = $('#modal').modal();
  373. modal.find('.modal-header .modal-title').html(header)
  374. modal.find('.modal-body .content').html(body)
  375. if (footerVisible) {
  376. modal.find('.modal-footer').show();
  377. } else {
  378. modal.find('.modal-footer').hide();
  379. }
  380. modal.show();
  381. }
  382. function initLessonMoveModal(lessonId) {
  383. let url = `{{ path('me_teacher_lesson_move', {'id': 'id'}) }}`;
  384. url = url.replace('id', lessonId);
  385. $('#modal .modal-footer .modal-save').attr('lesson', lessonId);
  386. $.ajax({
  387. type: 'GET',
  388. url: url,
  389. success: function (res) {
  390. initModal('Perkelti...', res, true);
  391. $('#lesson_move_startTime').flatpickr({
  392. locale: "lt",
  393. altInput: true,
  394. enableTime: true,
  395. altFormat: "Y-m-d H:i",
  396. dateFormat: "Y-m-d H:i",
  397. minTime: "05:00",
  398. time_24hr: true,
  399. allowInput: true,
  400. onClose: function (change, string, event) {
  401. var duration = $('#lesson_move_duration').val();
  402. var endTime = moment(string).add(duration, 'minutes').format('YYYY-MM-DD HH:mm')
  403. $('#lesson_move_endTime').val(endTime);
  404. }
  405. })
  406. }
  407. })
  408. }
  409. function CountDownTimer(selector) {
  410. var timeBlock = $(selector).find('.card-item');
  411. var startTime = new Date(timeBlock.attr('data-start').replace(/-/g, "/"));
  412. var endTime = new Date(timeBlock.attr('data-end').replace(/-/g, "/"));
  413. endTime = endTime.setMinutes(endTime.getMinutes() + 4);
  414. var _second = 1000;
  415. var _minute = _second * 60;
  416. var _hour = _minute * 60;
  417. var _day = _hour * 24;
  418. var timer;
  419. ///var now = new Date("{{ "now"|date('Y-m-d H:i:s') }}");
  420. var server = moment('{{ "now"|date('Y-m-d H:i:s') }}')
  421. var user = moment()
  422. var difference = user - server;
  423. // console.log(server);
  424. function showRemaining() {
  425. var now = new Date(new Date().toLocaleString("en-US", {timeZone: "Europe/Vilnius"})) - difference;
  426. // console.log(moment(now).format())
  427. // console.log(moment().format())
  428. var distanceUntilStart = startTime - now;
  429. var days = Math.floor(distanceUntilStart / _day);
  430. var hours = Math.floor((distanceUntilStart % _day) / _hour);
  431. var minutes = Math.floor((distanceUntilStart % _hour) / _minute);
  432. var seconds = Math.floor((distanceUntilStart % _minute) / _second);
  433. //how long lesson is already going
  434. var distanceFromStart = now - startTime;
  435. var goingHours = Math.floor((distanceFromStart % _day) / _hour);
  436. var goingMinutes = Math.floor((distanceFromStart % _hour) / _minute) + (goingHours * 60);
  437. var goingSeconds = Math.floor((distanceFromStart % _minute) / _second);
  438. //how long after the lesson end to remove the card dom object.
  439. var distanceFromEnd = endTime - now;
  440. var afterMinutes = Math.floor((distanceFromEnd % _hour) / _minute);
  441. var afterSeconds = Math.floor((distanceFromEnd % _minute) / _second);
  442. //console.log(goingMinutes + " going");
  443. if (distanceUntilStart > 0) {
  444. // timeText = days + 'days ';
  445. timeText = hours + 'val. ';
  446. timeText += minutes + 'min. ';
  447. timeText += seconds + 's.';
  448. // $(selector).find('.timer').html(timeText);//bug
  449. checkminutes = 5
  450. {% if is_granted('ROLE_TEACHER') %}
  451. checkminutes = 10
  452. {% endif %}
  453. if (days == 0 && hours == 0 && minutes < checkminutes) {
  454. // $(selector).find('.timer').hide()
  455. $(selector).find('.notice').html(`Iki pradžios liko: <b>${minutes} min. ${seconds} s.</b><br>Junkitės į užsiėmimą!`)
  456. $(selector).find('.join-lesson').removeAttr('disabled')
  457. } else {
  458. if (days > 0) {
  459. $(selector).find('.notice').html(`Iki užsiėmimo pradžios liko: <b>${days + " d."} ${hours} val ${minutes} min.</b>`)
  460. } else {
  461. if (hours == 0) {
  462. let text = `Iki užsiėmimo pradžios: <b>${minutes} min. ${seconds} s.</b>`
  463. {% if is_granted('ROLE_TEACHER') %}
  464. minutes = minutes - 10
  465. {% else %}
  466. minutes = minutes - 5
  467. {% endif %}
  468. text += `<br>Jungtis galėsite po: <b>${minutes} min. ${seconds} s.</b>`;
  469. $(selector).find('.notice').html(text)
  470. } else {
  471. let text = `Iki užsiėmimo pradžios: <b>${hours} val ${minutes} min.</b>`
  472. {% if is_granted('ROLE_TEACHER') %}
  473. minutes = minutes - 10
  474. {% else %}
  475. minutes = minutes - 5
  476. {% endif %}
  477. if (minutes < 0) {
  478. hours = hours - 1;
  479. minutes = minutes + 60;
  480. }
  481. text += `<br>Jungtis galėsite po: <b>${hours ? hours : ""} ${hours ? "val" : ""} ${minutes} min.</b>`;
  482. $(selector).find('.notice').html(text)
  483. }
  484. }
  485. }
  486. if (days == 0 && hours == 0 && minutes < 60) {
  487. $(selector).find('.missed-lesson').attr('disabled', false);
  488. } else {
  489. $(selector).find('.missed-lesson').attr('disabled', true);
  490. }
  491. return;
  492. }
  493. //console.log('after', afterMinutes)
  494. // console.log(`afterminutes`,afterMinutes);
  495. // console.log(`going`,goingMinutes);
  496. if (distanceFromStart > 0) {
  497. lesson = $(selector).find('.card-item').data('lesson-id');
  498. if (!$(`[data-lesson-id=${lesson}]`).find('.users').hasClass('was-joined')) {
  499. if ($(selector).find('.teacher').find('.box').hasClass('not-joined') && $(selector).find('.student').find('.box').hasClass('not-joined') && goingMinutes > 4) {
  500. $(`[data-lesson-id=${lesson}]`).parent().parent().hide();
  501. }
  502. if ($(selector).find('.student').find('.box').hasClass('not-joined') && $(selector).find('.teacher').find('.box').hasClass('not-joined') && goingMinutes > 14) {
  503. $(`[data-lesson-id=${lesson}]`).parent().parent().hide();
  504. // $(selector).find('.btn').hide();
  505. }
  506. }
  507. // $(selector).find('.timer').hide()
  508. $(selector).find('.notice').html(``);
  509. $(selector).find('.notice').html(`Jau vyksta (${goingMinutes}min. ${goingSeconds}s.)!`);
  510. }
  511. if (afterMinutes < 0) {
  512. clearInterval(timer);
  513. $(selector).hide();
  514. }
  515. }
  516. timer = setInterval(showRemaining, 1000);
  517. }
  518. {% set userType = lessonExtension.learncubeUser %}
  519. {% if is_granted('ROLE_GUARDIAN') %}
  520. {% set userType = constant('App\\Service\\LearnCubeService::tag_guardian') %}
  521. {% endif %}
  522. const eventSource = new EventSource("{{ mercure('lesson_status/' ~ userType ~ '/' ~ app.user.id )|escape('js') }}");
  523. eventSource.onmessage = event => {
  524. event = JSON.parse(event.data);
  525. console.log(event);
  526. if (event.action == "reload") {
  527. window.location.reload();
  528. }
  529. if (event.id > 0) {
  530. $(`.lesson-list .card-item[data-lesson-id=${event.id}] .box`).removeClass('joined')
  531. $(`.lesson-list .card-item[data-lesson-id=${event.id}] .box`).removeClass('not-joined')
  532. $(`.lesson-list .card-item[data-lesson-id=${event.id}] .teacher .box`).toggleClass(parseStatus(event.teacher))
  533. $(`.lesson-list .card-item[data-lesson-id=${event.id}] .student .box`).toggleClass(parseStatus(event.student))
  534. }
  535. }
  536. function parseStatus(status) {
  537. if (status) {
  538. return "joined"
  539. } else {
  540. return `not-joined`
  541. }
  542. }
  543. </script>
  544. {% endblock %}
  545. {% endif %}