export.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /**
  2. * ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: ЭКСПОРТ ЭЛЕКТРОННОГО ЖУРНАЛА В ФАЙЛ
  3. * Copyright © 2020, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // Объект со списком всех предметов
  7. let expSbListFull = {};
  8. // Учебные периоды типа ["1ч", "2ч", ...]
  9. let PERDS = [];
  10. for (let perN=0; perN<STPER.length; perN++) PERDS[perN] = STPER[perN][0];
  11. // Функция получает файл журнала с бэкенда и отдает его юзеру
  12. const getExpFile = async () => {
  13. // Получаем файл со скриптом показа журнала
  14. let scrContent = await (await fetch("/js/viewExport.js")).text();
  15. if (!scrContent.includes("use strict")) {
  16. info(1, "Не могу получить данные");
  17. return;
  18. }
  19. scrContent = scrContent.replace(/\r/g, '').replace(/\/\/.*?\n/g, '')
  20. . replace(/\/\*.*?\*\//g, '').replace(/ /g, '¤')
  21. . replace(/\s+/g, ' ').replace(/¤/g, ' ').trim();
  22. // Получаем собственно файл с данными журнала
  23. dqs("#expGet").innerHTML = "<img src='static/preloader.gif'>";
  24. dqs("#expGet").style.display = "inline";
  25. let className = dqs("#expSelClass").value;
  26. let fileContent = await apireq("export", [className]);
  27. if (fileContent == "none") {info(1, "Не могу получить данные"); return;}
  28. // Заменяем коды предметов и дат на названия и собственно даты
  29. let expObj = JSON.parse(fileContent);
  30. for (let i=0; i<expObj.content.length; i++) {
  31. // Код предмета заменяем на название
  32. expObj.content[i].s = expSbListFull[expObj.content[i].s];
  33. // Заменяем код даты на собственно дату
  34. for (let j=0; j<expObj.content[i].l.length; j++) {
  35. let dtCode = (expObj.content[i].l)[j].d;
  36. let dt;
  37. if (dtCode.length == 4) dt = dateConv(dtCode);
  38. else {
  39. if (DTSIT[dtCode]) dt = `<b>${DTSIT[dtCode][0]}</b>`;
  40. else dt = `<b>${dateConv(dtCode.slice(0,4))}</b>`;
  41. }
  42. (expObj.content[i].l)[j].d = dt;
  43. }
  44. }
  45. fileContent = "<!DOCTYPE html><html lang='ru'><head>"
  46. + `<meta charset='utf-8'></head><body><article>${JSON.stringify(expObj)}`
  47. + `</article><script>"use strict"; const PERDS = ${JSON.stringify(PERDS)}`
  48. + `</script><script>${scrContent}</script></body></html>`;
  49. // Отдаем юзеру
  50. let dataLink = new Blob([fileContent], {type: "text/html"});
  51. let linkElem = dqs("#expGet");
  52. linkElem.href = window.URL.createObjectURL(dataLink);
  53. linkElem.download = `${className}.html`;
  54. linkElem.innerHTML = `Скачать файл ${className}.html`;
  55. }
  56. // Формирование контента страницы
  57. createSection("export", `
  58. <h3>Экспорт журнала одного класса в файл</h3>
  59. <select id="expSelClass"></select>
  60. <button type="button" onClick="getExpFile()">Экспортировать</button>
  61. <p>&nbsp;<a id="expGet">Скачать файл</a></p>
  62. <h3 id="expMan">Инструкция</h3><ol>
  63. <li>Выберите класс из выпадающего списка и нажмите кнопку «Экс&shy;пор&shy;ти&shy;ро&shy;вать».</li>
  64. <li>После загрузки электронного журнала выбранного класса (это может занять
  65. некоторое время) появится ссылка «Скачать файл». Кликните по ней и выберите
  66. один из вариантов: «Открыть в...» или «Сохранить» (этот вариант
  67. предпочтительнее, так как позволит работать с экспортированным электронным
  68. журналом в последующем).</li>
  69. <li>Если вы выбрали вариант «Сохранить», для просмотра сохраненного журнала
  70. просто откройте соответствующий html-файл в браузере. Предпочтительнее
  71. использовать браузер, поддерживающий русские переносы, например, Mozilla
  72. Firefox. В случае выбора варианта «Открыть в...» экспортированный журнал
  73. откроется для просмотра сразу (в отдельной вкладке браузера).</li>
  74. <li>Для печати нажмите на значок принтера в правом верхнем углу окна
  75. просмотра экспортированного журнала. Вы можете как напечатать журнал на
  76. бумаге, так и сохранить его в виде pdf-файла (выберите необходимый способ в
  77. появившемся окне выбора принтера). В случае печати на бумаге печатать
  78. необходимо <b>на двух сторонах листа</b>.</li>
  79. <li>Следует иметь в виду, что если по какому-либо предмету не записано ни
  80. одной темы урока, этот предмет <b>не попадает в экспортируемый файл</b>,
  81. даже если по этому предмету выставлены отметки промежуточной аттестации.</li>
  82. <li>В случае, если в бумажный вариант журнала необходимо включить сводную
  83. ведомость посещаемости учащихся, следует сгенерировать и распечатать эту
  84. ведомость отдельно (вкладка «Посещаемость», пункт выпадающего списка «Весь
  85. класс»).</li>
  86. <li>Журналы учета внеурочной деятельности в межклассных группах экспортируются педагогами, проводящими занятия в этих группах, либо администратором при просмотре журнальных страниц этих групп (значок «Экспорт» справа от названия группы).</li></ol>
  87. `);
  88. // Динамически подгружаем контент страницы (имя метода = имени пункта меню!)
  89. getContent.export = async () => {
  90. let expRole = dqs("#selRole").value;
  91. let selClassInner = '';
  92. dqs("#expGet").style.display = "none";
  93. // Если он классный руководитель, показываем ему его классы
  94. if (expRole == "tutor")
  95. for (let cl of uTutorCls) selClassInner += `<option>${cl}</option>`;
  96. // Если он администратор, показываем ему все классы
  97. else if (expRole == "admin") {
  98. let apiResp = await apireq("classesList");
  99. if (apiResp == "none") {info(1, "Не могу получить данные"); return;}
  100. let absAllClasses = classSort(JSON.parse(apiResp));
  101. for (let cl of absAllClasses) selClassInner += `<option>${cl}</option>`;
  102. }
  103. dqs("#expSelClass").innerHTML = selClassInner;
  104. // Заполняем объект со списком всех предметов
  105. expSbListFull = await sbListFullGet();
  106. };