diff --git a/public/admin.css b/public/admin.css index 0e17778..49b29c1 100644 --- a/public/admin.css +++ b/public/admin.css @@ -144,6 +144,8 @@ body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;b .edit-modal .actions button{flex:1;padding:12px;border:none;border-radius:8px;font-size:.9rem;font-weight:600;cursor:pointer} .edit-modal .save{background:var(--accent);color:#fff} .edit-modal .cancel{background:var(--border);color:var(--text)} +.edit-modal .cancel-btn{display:flex;flex:1;align-items:center;justify-content:center;padding:12px;border-radius:8px;font-size:.9rem;font-weight:600;cursor:pointer;text-decoration:none;background:var(--border);color:var(--text);transition:opacity .15s} +.edit-modal .cancel-btn:hover{opacity:.85} .edit-modal .actions button:hover{opacity:.85} .toast{position:fixed;bottom:24px;left:50%;transform:translateX(-50%);background:#16a34a;color:#fff;padding:12px 24px;border-radius:var(--radius);font-size:.9rem;opacity:0;transition:opacity .3s;pointer-events:none;z-index:200} .toast.show{opacity:1} \ No newline at end of file diff --git a/public/admin.js b/public/admin.js index a884dc9..bc6df29 100644 --- a/public/admin.js +++ b/public/admin.js @@ -93,6 +93,34 @@ function fallbackCopy(text, done) { document.body.removeChild(ta); } +function studentUrlContent(name) { + const url = `${location.origin}/?nameInput=${encodeURIComponent(name)}`; + return `[InternetShortcut]\r\nURL=${url}\r\n`; +} + +function safeWindowsName(name) { + return String(name).replace(/[\\/:*?"<>|]/g, '_').replace(/\s+/g, '_'); +} + +function downloadBlob(blob, filename) { + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + a.click(); + URL.revokeObjectURL(url); +} + +async function exportStudentUrlZip(students, zipName) { + if (typeof JSZip === 'undefined') { alert('JSZip не загружен'); return; } + const zip = new JSZip(); + students.forEach(s => { + zip.file(safeWindowsName(s.name) + '.url', studentUrlContent(s.name)); + }); + const blob = await zip.generateAsync({ type: 'blob' }); + downloadBlob(blob, zipName); +} + function copyText(text) { const done = () => showToast('Скопировано: ' + text); if (navigator.clipboard && window.isSecureContext) { diff --git a/public/groups.html b/public/groups.html index 073d553..05d3f3a 100644 --- a/public/groups.html +++ b/public/groups.html @@ -20,6 +20,7 @@
+ +