Files
LMS/web/src/main/resources/static/js/admin-group.js

130 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function $id(id) { return document.getElementById(id); }
/* ---------- Оценка + комментарии ---------- */
function openGradeEditor(btn) {
var all = [];
try { all = JSON.parse(btn.getAttribute('data-comments') || '[]'); } catch (e) { all = []; }
var idx = parseInt(btn.getAttribute('data-ci') || '0', 10);
var list = Array.isArray(all[idx]) ? all[idx] : [];
$id('grade-student').value = btn.getAttribute('data-student') || '';
$id('grade-lab').value = btn.getAttribute('data-lab') || '';
$id('grade-who').value = btn.getAttribute('data-student-name') || '';
var title = $id('grade-title');
if (title) title.textContent = (btn.getAttribute('data-lab-name') || '') + ' — ' + (btn.getAttribute('data-student-name') || '');
$id('grade-score').value = btn.getAttribute('data-score') || '';
var box = $id('cs-rows');
box.innerHTML = '';
list.forEach(function (c) { csRow(c.text, c.tone); });
if (!list.length) csRow('', 'neutral');
var d = $id('modal-grade');
if (d && d.showModal) d.showModal();
}
function csRow(text, tone) {
var box = $id('cs-rows');
var row = document.createElement('div');
row.className = 'cs-row';
var inp = document.createElement('input');
inp.className = 'input cs-text';
inp.placeholder = 'Комментарий';
inp.value = text || '';
var sel = document.createElement('select');
sel.className = 'input cs-tone';
[['positive', '+ позитивный'], ['negative', '— негативный'], ['neutral', '○ нейтральный']].forEach(function (o) {
var op = document.createElement('option');
op.value = o[0];
op.textContent = o[1];
sel.appendChild(op);
});
sel.value = tone || 'neutral';
var rm = document.createElement('button');
rm.type = 'button';
rm.className = 'btn btn-secondary btn-sm';
rm.textContent = 'удалить';
rm.onclick = function () { row.remove(); };
row.appendChild(inp);
row.appendChild(sel);
row.appendChild(rm);
box.appendChild(row);
}
function csSerialize() {
var out = [];
document.querySelectorAll('#cs-rows .cs-row').forEach(function (r) {
var t = r.querySelector('.cs-text').value.trim();
if (t) out.push({ text: t, tone: r.querySelector('.cs-tone').value });
});
$id('grade-comments').value = JSON.stringify(out);
}
/* ---------- Индивидуальное задание (защита) ---------- */
/** Открывает диалог задания; кнопка может не нести data-* (тогда это «назначить новое»). */
function openDefense(btn) {
var form = $id('defense-form');
if (!form) return;
form.reset();
var student = btn.getAttribute('data-student') || '';
var lab = btn.getAttribute('data-lab') || '';
if (student) $id('defense-student-select').value = student;
if (lab) $id('defense-lab-select').value = lab;
$id('defense-md').value = btn.getAttribute('data-md') || '';
var session = btn.getAttribute('data-session') || '';
var status = btn.getAttribute('data-status') || '';
var actions = $id('defense-actions');
if (session) {
$id('defense-issue-form').action = '/admin/defenses/' + session + '/issue-code';
$id('defense-reset-form').action = '/admin/defenses/' + session + '/reset';
if ($id('defense-action-lab')) $id('defense-action-lab').value = lab;
if ($id('defense-reset-lab')) $id('defense-reset-lab').value = lab;
$id('defense-reset-form').hidden = status !== 'ready';
if (actions) actions.hidden = false;
} else if (actions) {
actions.hidden = true;
}
var d = $id('modal-defense');
if (d && d.showModal) d.showModal();
}
function showDefenseFromModal() {
var el = $id('defense-text-body');
if (el) el.textContent = $id('defense-md').value || '(пусто)';
var title = $id('defense-text-title');
if (title) {
var s = $id('defense-student-select');
var l = $id('defense-lab-select');
var who = s && s.selectedOptions[0] ? s.selectedOptions[0].textContent : '';
var lab = l && l.selectedOptions[0] ? l.selectedOptions[0].textContent : '';
title.textContent = who + ' — ' + lab;
}
var d = $id('modal-defense-text');
if (d && d.showModal) d.showModal();
}
/* ---------- Матрица: фокус на лабораторной ---------- */
function focusLab() {
var s = $id('lab-focus');
if (!s) return;
var labId = s.value;
document.querySelectorAll('th.lab-col[data-lab], td.cell-lab[data-lab], .filter-row th[data-lab]').forEach(function (el) {
el.style.display = (!labId || el.getAttribute('data-lab') === labId) ? '' : 'none';
});
}
document.addEventListener('submit', function (ev) {
if (ev.target && ev.target.id === 'grade-form') csSerialize();
}, true);
window.addEventListener('DOMContentLoaded', function () { focusLab(); });