permit.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: РАЗРЕШ АДМИНИСТРАЦИИ НА ПРОПУСК УРОКОВ
  3. * Copyright © 2024, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // Добавление разрешения
  7. const permitAdd = async () => {
  8. let dtStart = dqs("#permitStart").value,
  9. dtFin = dqs("#permitFinish").value,
  10. dtDoc = dqs("#permitDocDate").value + " № "
  11. + dqs("#permitDocNum").value.trim(),
  12. clName = dqs("#permitSelClass").value;
  13. let pupLogins = [];
  14. document.querySelectorAll("#permitTable td:nth-child(2)").forEach(e => {
  15. if (e.innerHTML) pupLogins.push(e.id.replace("check--", ''));
  16. });
  17. let pupVal = pupLogins.length;
  18. if (!pupVal) {info (1, "Не выбраны учащиеся!"); return;}
  19. let permResp = await apireq(
  20. "permitAdd",
  21. [dtStart, dtFin, dtDoc, clName, pupLogins]
  22. );
  23. if (permResp != "success") {
  24. info(1, "Ошибка на сервере.<br>Разрешение не добавлено. " + permResp);
  25. return;
  26. }
  27. info (0, `Разрешение (${pupVal} учащ.)<br>успешно добавлено.`);
  28. permUnselAll();
  29. dqs("#permChAll").innerHTML = "Отметить всех";
  30. }
  31. // Отметить одного учащегося в таблице / снять отметку
  32. const permCheck = tdElem => {
  33. tdElem.innerHTML = tdElem.innerHTML ? '' : '■';
  34. }
  35. // Отметить в таблице всех учащихся
  36. const permSelAll = () => {
  37. document.querySelectorAll("#permitTable td:nth-child(2)").forEach(e => {
  38. e.innerHTML = '■';
  39. })
  40. }
  41. // Снять отметку в таблице со всех учащихся
  42. const permUnselAll = () => {
  43. document.querySelectorAll("#permitTable td:nth-child(2)").forEach(e => {
  44. e.innerHTML = '';
  45. })
  46. }
  47. // Формирование таблицы со списком детей и полями типа checkbox
  48. const permitPupListShow = async () => {
  49. let clName = dqs("#permitSelClass").value,
  50. permitResp, pupLgnArr, pupFioArr;
  51. // Получаем список учащихся
  52. permitResp = await apireq("gradesGet", [clName, '', "a"]);
  53. if (permitResp == "none") {
  54. info(1, "Не могу получить список учащихся");
  55. return;
  56. }
  57. let permitObj = JSON.parse(permitResp);
  58. // Формируем массивы фио детей и их логинов
  59. pupLgnArr = permitObj.puList ? permitObj.puList : [];
  60. pupFioArr = permitObj.pnList;
  61. // Формируем содержимое таблицы выбора учащихся
  62. if (pupLgnArr.length) {
  63. let tblPupilInner = '';
  64. for (let i=0; i<pupLgnArr.length; i++) tblPupilInner +=
  65. `<tr><td>${pupFioArr[i]}</td>` +
  66. `<td id="check--${pupLgnArr[i]}" onclick="permCheck(this)"></td></tr>`;
  67. dqs("#permitTable").innerHTML = tblPupilInner;
  68. dqs("#permChAll").innerHTML = "Отметить всех";
  69. }
  70. else dqs("#permitTable").innerHTML =
  71. "<tr><td colspan='2'>В этом классе нет учащихся!</td></tr>";
  72. }
  73. // Формирование контента страницы
  74. createSection("permit", `
  75. <div id="permitAddForm">
  76. <h3>Разрешение на пропуск занятий</h3>
  77. С&nbsp;<input type="date" id="permitStart">
  78. <nobr>по <input type="date" id="permitFinish"></nobr><br>
  79. <b>Документ:</b> дата <input type="date" id="permitDocDate">
  80. <nobr>номер <input type="text" id="permitDocNum" value="0"></nobr><br>
  81. <b>Выберите класс:</b>
  82. <select id="permitSelClass" onChange="permitPupListShow()"></select>
  83. <button type="button" id="permChAll" onclick="
  84. if (this.innerHTML == 'Отметить всех') {
  85. permSelAll (); this.innerHTML = 'Снять все отметки';
  86. }
  87. else {
  88. permUnselAll (); this.innerHTML = 'Отметить всех';
  89. }
  90. ">Отметить всех</button>
  91. <table id="permitTable"></table>
  92. <p><b>Будьте внимательны!</b><br>
  93. Отменить разрешение сможет только классный руководитель.</p>
  94. <button type="button" onClick="permitAdd()">Предоставить разрешение</button>
  95. </div>
  96. `);
  97. // Динамически подгружаем контент страницы (имя метода = имени пункта меню!)
  98. getContent.permit = async () => {
  99. // Сегодняшняя дата во все поля
  100. let now = (new Date()).toISOString().split('T')[0];
  101. dqs("#permitStart").value = now;
  102. dqs("#permitFinish").value = now;
  103. dqs("#permitDocDate").value = now;
  104. // Заполняем select выбора класса
  105. let selClassInner = '';
  106. let apiResp = await apireq("classesList");
  107. if (apiResp == "none") {info(1, "Не могу получить данные"); return;}
  108. let permitClasses = classSort(JSON.parse(apiResp));
  109. for (let cl of permitClasses)
  110. selClassInner += `<option>${cl}</option>`;
  111. dqs("#permitSelClass").innerHTML = selClassInner;
  112. if (selClassInner) {
  113. dqs("#permitAddForm").style.display = "block";
  114. permitPupListShow(); // показываем таблицу с учащимися выбранного класса
  115. }
  116. else {
  117. dqs("#permitAddForm").style.display = "none";
  118. info(1, "Классов пока нет.");
  119. }
  120. };