123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- /**
- * ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: РАБОТА С ЗАПИСЯМИ О ПРИЧИНАХ ПРОПУСКОВ УРОКОВ
- * И ДОБАВЛЕНИЕ ЗАЯВЛЕНИЙ О ПРИЧИНАХ ПРОПУСКОВ РОДИТЕЛЯМИ
- * Copyright © 2019, А.М.Гольдин. Modified BSD License
- */
- "use strict";
- const statuses = {
- new: ["новая", ''],
- reject: ["отклонена", "style='background:#fabec3'"],
- accept: ["одобрена", "style='background:#bbc274'"]
- };
- // Добавление нового заявления от родителей (запрос к API)
- const sprAdd = async () => {
- let vid = dqs("#sprVid").value,
- start = dqs("#sprStart").value,
- fin = dqs("#sprFin").value;
-
- if (start > fin) {info(1, "Неверные даты!"); return;}
- let apiResp = await apireq("sprAdd", [vid, start, fin]);
- if (apiResp == "success") {
- info(0, "Ваше заявление принято "
- + "и будет рассмотрено классным руководителем");
- sprDocsShow("pupil");
- }
- else info(1, "Ошибка на сервере,<br>заявление не принято");
- }
- // Удаление записи по её id
- const sprDel = async (id) => {
- if (!confirm("Заявление будет удалено. Вы уверены?")) return;
- let apiResp = await apireq("sprDel", [id]);
- if (apiResp != "none") sprDocsShow(dqs("#sprSelPupil").value);
- else info(1, "Ошибка на сервере,<br>запись не удалена");
- }
- // Редактирование статуса записи по её id
- // Без второго аргумента - одобрить, со вторым аргументом - отклонить
- const sprEdit = async (id, reject) => {
- let act = reject ? "reject" : "accept",
- go = reject ? "отклонено" : "одобрено";
- if (!confirm(`Заявление будет ${go}. Вы уверены?`)) return;
- let apiResp = await apireq("sprEdit", [id, act]);
- if (apiResp == "success") {
- info(0, `Заявление отредактировано (${go})`);
- sprDocsShow(dqs("#sprSelPupil").value);
- }
- else info(1, "Ошибка на сервере,<br>запись не изменена");
- }
- // Формирование содержимого таблицы с записями по одному учащемуся
- // (API возвращает массив объектов записей по одному учащемуся)
- const sprDocsShow = async pupil => {
- // Преобразование даты вида 2019-09-13 к формату 13.09
- const dConv = d => `${d.substr(8,2)}.${d.substr(5,2)}`;
-
- let innerTable = "<tr><th> </th><th> </th><th> </th>"
- + "<th>Кем внесена</th><th>Даты</th>"
- + "<th>Основание</th><th>Статус</th></tr>";
- let apiResp = await apireq("sprGet", [pupil]);
- if (apiResp != "none") {
- let sprList = JSON.parse(apiResp);
- if (!sprList.length) innerTable +=
- "<tr><td colspan=7 class='bg0'>Записей не найдено</td></tr>";
- else {
- sprList.sort((x,y) => x.start < y.start); // свежие сверху
- let i = 0;
- for (let spr of sprList) {
- i++;
- let start = dConv(spr.start), fin = dConv(spr.fin);
- let dt = (start == fin) ? start : `${start} – ${fin}`;
- let firstTD =
- `<td title="Одобрить" `
- + `onClick="sprEdit('${spr._id}')">➕</td>`
- + `<td title="Отклонить" `
- + `onClick="sprEdit('${spr._id}', 1)">➖</td>`
- + `<td title="Удалить" `
- + `onClick="sprDel('${spr._id}')">❌</td>`;
- if (
- dqs("#selRole").value == "pupil" ||
- dqs("#selRole").value == "parent"
- ) firstTD = `<td class="bg0">${i}</td>`
- + `<td class="bg0"> </td><td class="bg0"> </td>`;
-
- let vidSpr = spr.vid == "par" ? "родители" : spr.vid,
- osnov = spr.prim == "med" ? "медсправка" :
- (spr.prim == "doc" ? "документ" :
- (spr.prim == "fam" ? "семейные обст." : spr.prim));
- innerTable += `<tr>${firstTD}<td>${vidSpr}</td>`
- + `<td>${dt}</td><td>${osnov}</td>`
- + `<td ${statuses[spr.state][1]}>`
- + `${statuses[spr.state][0]}</td></tr>`;
- }
- }
- dqs("#sprShowDel").innerHTML = innerTable;
- }
- else info(1, "Не могу загрузить записи");
- };
- // Формирование списка детей в селекте выбора учащегося
- const sprPupListShow = async () => {
- let clName = dqs("#sprSelClass").value;
- let apiResp = await apireq("pupilsList", [clName]);
- if (apiResp != "none") {
- let pupilsList = JSON.parse(apiResp);
- let selPupilInner = '';
- for (let pup of pupilsList)
- selPupilInner += `<option value="${pup[1]}">${pup[0]}</option>`;
- dqs("#sprSelPupil").innerHTML = selPupilInner;
- sprDocsShow(pupilsList[0][1]); // показываем записи первого учащегося
- }
- else info(1, "Не могу загрузить список учащихся");
- }
- // Формирование контента страницы (regNow, regYst, regYfin определены в ini.js)
- createSection("docs", `
- <h2>Уважительные причины <nobr>пропуска уроков</nobr></h2>
- <select id="sprSelClass" onChange="sprPupListShow()"></select>
- <select id="sprSelPupil" onChange="sprDocsShow(this.value)"></select>
- <div id="sprAdd">
- <h3>Подать заявление<br>об уважительной причине
- <nobr>пропуска уроков</nobr></h3>
- <p><b>Уважаемые родители!</b> Указанное вами основание пропуска уроков
- может быть признано уважительным (одобрено) только после представления
- классному руководителю документа на бумажном носителе.
- Ис­клю­че­ни­ем являются семейные обстоятельства, но и
- их необходимо разъяснить классному руководителю по согласованным с ним
- каналам связи (телефонный звонок, email, мессенджеры).</p><p>Под
- «документом организации» понимается, например, письмо из музыкальной или
- спортивной школы, повестка из военкомата и т. п.</p>
- <b>Выберите основание пропуска:</b>
- <select id="sprVid">
- <option value="med">медицинская справка</option>
- <option value="doc">документ организации</option>
- <option value="fam">семейные обстоятельства</option>
- </select><br>
- <b>Пропуск уроков:</b> <nobr>с <input id="sprStart" type="date"
- min="${regYst}" max="${regYfin}" value="${regNow}"></nobr>
- <nobr>по <input id="sprFin" type="date"
- min="${regYst}" max="${regYfin}" value="${regNow}"></nobr>
- <button id="sprSubm" type="button" onClick="sprAdd()"
- >Подать заявление</button>
- <h3>Зарегистрированные записи</h3>
- </div>
- <table id="sprShowDel"></table>
- `);
- // Динамически формируем содержимое страницы (имя метода = имени пункта меню!)
- getContent.docs = async () => {
-
- let sprRole = dqs("#selRole").value;
-
- // Если он учащийся или родитель, показываем ему только его записи
- if (sprRole == "pupil" || sprRole == "parent") {
- dqs("#sprSelClass").style.display = "none";
- dqs("#sprSelPupil").style.display = "none";
- // Если он учащийся, не показываем ему блок добавления заявления
- if (sprRole == "pupil") dqs("#sprAdd").style.display = "none";
- sprDocsShow("pupil"); // реальный логин подпишется на бэкенде
- }
-
- // Если он классный руководитель, показываем ему его классы
- // и не показываем блок добавления заявления
- else if (sprRole == "tutor") {
- let selClassInner = '';
- for (let cl of uTutorCls) selClassInner += `<option>${cl}</option>`;
- dqs("#sprSelClass").innerHTML = selClassInner;
- sprPupListShow(); // показываем список детей
- dqs("#sprAdd").style.display = "none";
- }
- }
|