stat.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: СТАТИСТИЧЕСКИЕ ДАННЫЕ
  3. * Copyright © 2020, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // Запрос к API для получения статистики и публикация результатов
  7. // tip - тип запроса ("sloven", "classes", "teacher" или "subject")
  8. // hd - заголовок, печатаемый перед таблицей с результатами
  9. const getStat = async (tip, hd) => {
  10. let resEl = dqs("#stResult");
  11. resEl.innerHTML = "<img src='static/preloader.gif'>";
  12. let args = {
  13. sloven: "a",
  14. classes: dqs("#stSelParall").value.toString(),
  15. teacher: dqs("#stSelTeach").value,
  16. subject: dqs("#stSelSubj").value
  17. };
  18. // Выбранный класс
  19. let selParall = dqs("#stSelParall").value;
  20. // ФИО выбранного учителя
  21. let fioTeach =
  22. dqs("#stSelTeach").options[dqs("#stSelTeach").selectedIndex].innerHTML;
  23. // Выбранный предмет
  24. let selSubj =
  25. dqs("#stSelSubj").options[dqs("#stSelSubj").selectedIndex].innerHTML;
  26. // Уточнение после заголовка перед таблицей
  27. let subHead = {
  28. sloven: '', classes: `: ${selParall}-е классы`,
  29. teacher: `: ${fioTeach}`, subject: `: ${selSubj}`
  30. };
  31. let resContent = `<h3>${hd}${subHead[tip]}</h3>`;
  32. let apiResp = await apireq("statGet", [tip, args[tip]]);
  33. let resp = [];
  34. if (apiResp != "none") resp = JSON.parse(apiResp);
  35. if (!resp.length) {
  36. resContent += "<p>Не найдено данных, удовлетворяющих запросу</p>";
  37. resEl.innerHTML = resContent;
  38. return;
  39. }
  40. resContent += "<table class='firstLeft'>";
  41. // Печатаем заголовочную строку
  42. resContent += "<tr>";
  43. for (let thInner of resp[0]) resContent += `<th>${thInner}</th>`;
  44. resContent += "</tr>";
  45. // Печатаем тело таблицы
  46. for (let i=1; i<resp.length; i++) {
  47. resContent += "<tr>";
  48. for (let tdInner of resp[i]) resContent += `<td>${tdInner}</td>`;
  49. resContent += "</tr>";
  50. }
  51. resContent += "</table>";
  52. resEl.innerHTML = resContent;
  53. }
  54. // Формирование контента страницы
  55. createSection("stat", `
  56. <h3>Выбор типа статистических данных</h3>
  57. <p>Своевременность заполнения журнала
  58. <button type="button"
  59. onClick="getStat('sloven', 'Учителя, не заполнявшие журнал последние 14 дней')"
  60. > &gt;&gt; </button></p>
  61. <p>Статистика по параллели классов</p>
  62. <select id="stSelParall"></select>
  63. <button type="button"
  64. onClick="getStat('classes', 'Статистика по параллели')"
  65. > &gt;&gt; </button>
  66. <p>Статистика по одному учителю</p>
  67. <select id="stSelTeach"></select>
  68. <button type="button"
  69. onClick="getStat('teacher', 'Статистика по одному учителю')"
  70. > &gt;&gt; </button>
  71. <p>Статистика по одному предмету</p>
  72. <select id="stSelSubj"></select>
  73. <button type="button"
  74. onClick="getStat('subject', 'Статистика по одному предмету')"
  75. > &gt;&gt; </button>
  76. <div id="stResult"></div>
  77. `);
  78. // Динамически подгружаем контент страницы (имя метода = имени пункта меню!)
  79. getContent.stat = async () => {
  80. dqs("#stResult").innerHTML =
  81. "<h3>Статистические данные</h3><p>Выберите тип данных</p>";
  82. // Показываем все номера параллелей классов
  83. let selClassInner = '';
  84. let apiResp = await apireq("classesList");
  85. if (apiResp == "none") {info(1, "Не могу получить список классов"); return;}
  86. let stClasses = classSort(JSON.parse(apiResp))
  87. . map(x => x.replace(/[^0-9]/g, ''));
  88. for (let cl of new Set(stClasses))
  89. selClassInner += `<option>${cl}</option>`;
  90. dqs("#stSelParall").innerHTML = selClassInner;
  91. // Показываем всех учителей
  92. let selTeachInner = '';
  93. apiResp = await apireq("teachList");
  94. if (apiResp == "none") {info(1, "Не могу получить список учителей"); return;}
  95. let stAllTeach = JSON.parse(apiResp).sort(
  96. (u1, u2) => (u1.fio).localeCompare(u2.fio, "ru"));
  97. for (let t of stAllTeach)
  98. selTeachInner += `<option value="${t.login}">${t.fio}</option>`;
  99. dqs("#stSelTeach").innerHTML = selTeachInner;
  100. // Показываем все предметы
  101. let selSubjInner = '';
  102. let stSubjList = await sbListFullGet();
  103. if (!Object.keys(stSubjList).length) {
  104. info(1, "Не могу получить список предметов");
  105. return;
  106. }
  107. for (let k of Object.keys(stSubjList))
  108. selSubjInner += `<option value="${k}">${stSubjList[k]}</option>`;
  109. dqs("#stSelSubj").innerHTML = selSubjInner;
  110. };