groups.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /**
  2. * ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: БЛОК РЕДАКТИРОВАНИЯ СПИСКА СВОДНЫХ ГРУПП
  3. * Copyright © 2020, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. let ingrList = [], ingrTeachList = {};
  7. // Публикация списка групп на страничке из массива ingrArr
  8. const ingrListPubl = ingrArr => {
  9. if (!ingrArr.length) {
  10. dqs("#ingrList").innerHTML = "<p>Межклассных групп пока нет.</p>";
  11. return;
  12. }
  13. // Сортируем массив и публикуем с иконками удаления и редактирования
  14. ingrArr.sort((a, b) => a[0].localeCompare(b[0], "ru"));
  15. let cont = '';
  16. for (let cGr of ingrArr) {
  17. let
  18. divDel = `<div onclick="ingrDel('${cGr[0]}')"
  19. title="Удалить">&#10060;</div>`,
  20. divName = `<div>${cGr[0]}</div>`,
  21. divTitle = `<div>${cGr[1]} (${ingrTeachList[cGr[2]]})</div>`;
  22. cont += `<span>${divDel}${divName}${divTitle}</span>`;
  23. }
  24. dqs("#ingrList").innerHTML = cont;
  25. };
  26. // Отправка запроса к API для добавления/редактирования группы
  27. const ingrEdit = async () => {
  28. let namesArr = ingrList.map(x => x[0]);
  29. let grNameNum = dqs("#ingrNewNameNum").value || "20",
  30. grName = grNameNum + dqs("#ingrNewNameLit").value,
  31. grTitle = dqs("#ingrNewTitle").value.trim(),
  32. grTeach = dqs("#ingrNewTeach").value;
  33. dqs("#ingrNewNameNum").value = '';
  34. dqs("#ingrNewNameLit").value = 'А';
  35. dqs("#ingrNewTitle").value = '';
  36. dqs("#ingrNewTeach").selectedIndex = 0;
  37. if (!grTitle) {
  38. info(1, "Не указано наименование предмета внеурочной деятельности.");
  39. return;
  40. }
  41. let rN = /^[A-Za-z0-9А-Яа-яЁё(). \-]{2,100}$/;
  42. if (!rN.test(grTitle)) {
  43. info(1, "Наименование предмета может содержать от 2 до 100 букв русского "
  44. + "и латинского алфавитов, дефисов, цифр, скобок, точек и пробелов.");
  45. return;
  46. }
  47. if (namesArr.includes(grName)) {
  48. let mess = `Данные группы ${grName} будут перезаписаны. Вы уверены?`;
  49. if (!confirm(mess)) return;
  50. }
  51. let apiResp = await apireq("interGroupEdit", [grName, grTitle, grTeach]);
  52. if (apiResp == "none") info(1, "Запрашиваемая операция отклонена.");
  53. else {
  54. if (namesArr.includes(grName))
  55. ingrList[namesArr.indexOf(grName)] = [grName, grTitle, grTeach];
  56. else ingrList.push([grName, grTitle, grTeach]);
  57. ingrListPubl(ingrList);
  58. }
  59. };
  60. // Удаление группы
  61. const ingrDel = async (grName) => {
  62. if (!confirm(
  63. "Все учащиеся должны быть предварительно удалены из группы. "
  64. + "Все темы занятий и все отметки будут удалены. Вы уверены?"
  65. )) return;
  66. let apiResp = await apireq("interGroupDel", grName);
  67. if (apiResp == "none") info(1, "Запрашиваемая операция отклонена.");
  68. else {
  69. ingrList.splice(ingrList.map(x => x[0]).indexOf(grName), 1);
  70. ingrListPubl(ingrList);
  71. }
  72. }
  73. // Формирование контента странички
  74. createSection("groups", `
  75. <h3>Межклассные группы обучающихся</h3>
  76. <div id="ingrList"></div>
  77. <h3>Добавление/редактирование группы</h3>
  78. <p>При добавлении группы укажите ее условный номер (типа <b>23Б</b>, числа
  79. от 20 до 99), наименование предмета внеурочной деятельности (факультатива,
  80. кружка, секции и пр., например, <b>Вязание крючком</b> или <b>Олимпиадная
  81. химия</b>), для которого создана группа, а также учителя, ведущего занятия
  82. в этой группе. Если вы укажете условный номер уже существующей группы, её
  83. данные будут перезаписаны.</p>
  84. <input type="number" id="ingrNewNameNum" min=20 max=99 placeholder=20>
  85. <select id="ingrNewNameLit"></select>
  86. <input type="text" id="ingrNewTitle" maxlength="100"
  87. placeholder="Наименование предмета ВД">
  88. <select id="ingrNewTeach"></select>
  89. <button type="button" onclick="ingrEdit()">Добавить/Редактировать</button>
  90. `);
  91. let ingrLiterArr = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЫЭЮЯ",
  92. ingrSelLiter = '';
  93. for (let iLit of ingrLiterArr) ingrSelLiter += `<option>${iLit}</option>`;
  94. dqs("#ingrNewNameLit").innerHTML = ingrSelLiter;
  95. // Получаем массив с логинами и фио учителей; заполняем select выбора учителя.
  96. // Динамически подгружаем список групп в массив ingrList
  97. // и публикуем его на страничке (имя метода = имени пункта меню!)
  98. getContent.groups = async () => {
  99. let apiResp = await apireq("teachList");
  100. let teachArr = JSON.parse(apiResp);
  101. teachArr.sort((a, b) => a.fio.localeCompare(b.fio, "ru"));
  102. for (let teach of teachArr)
  103. ingrTeachList[teach.login] = teach.fio;
  104. let selInner = '';
  105. for (let tch of teachArr)
  106. selInner += `<option value="${tch.login}">${tch.fio}</option>`;
  107. dqs("#ingrNewTeach").innerHTML = selInner;
  108. apiResp = await apireq("interGroupList");
  109. ingrList = JSON.parse(apiResp);
  110. ingrListPubl(ingrList);
  111. }