Migrate UI to Lucide icons, reorder sidebar, and polish journal/groups UX

- Replace emoji icons with Lucide across admin pages; add vendor/lucide.min.js and renderIcons() helper\n- Reorder sidebar logically (Dashboard, Journal, Students, Groups, Files, Links, Trash + admin sections)\n- Groups: open photo chronology only via the Фото button; covers no longer clickable\n- Journal: show group badge over card photo, compact AI-status icon beside description, and date range in empty-state message\n- Update README (AI worker, Lucide, worker.js)
This commit is contained in:
dev
2026-09-11 14:33:41 +03:00
parent 275ed46dfb
commit ad81adfe71
21 changed files with 128 additions and 63 deletions
+6 -10
View File
@@ -25,8 +25,8 @@ async function loadGroups() {
return `
<div class="group-card" data-group-id="${g.id}">
${g.cover_path
? `<img class="group-cover" src="${API}${g.cover_path}" data-group-id="${g.id}" data-group-name="${esc(g.name)}" title="Фото группы (хронология)" alt="">`
: `<div class="group-cover empty-cover" data-group-id="${g.id}" data-group-name="${esc(g.name)}" title="Фото группы (хронология)">📷</div>`}
? `<img class="group-cover" src="${API}${g.cover_path}" alt="">`
: `<div class="group-cover empty-cover">📷</div>`}
<div class="group-head">
<input class="name-input" id="name-${g.id}" value="${esc(g.name)}">
<button class="del" data-del-group="${g.id}" title="Удалить">&times;</button>
@@ -301,10 +301,10 @@ document.getElementById('groupList').addEventListener('click', e => {
if (eg) { exportGroup(parseInt(eg.dataset.exportGroup, 10), eg.dataset.groupName); return; }
const eu = e.target.closest('[data-export-urls]');
if (eu) { exportGroupUrls(parseInt(eu.dataset.exportUrls, 10), eu.dataset.groupName); return; }
const cover = e.target.closest('[data-group-id]');
if (cover) {
const id = parseInt(cover.dataset.groupId, 10);
const name = cover.dataset.groupName;
const photoBtn = e.target.closest('.photo-btn');
if (photoBtn) {
const id = parseInt(photoBtn.dataset.groupId, 10);
const name = photoBtn.dataset.groupName;
if (!isNaN(id)) openPhotos(id, name);
}
});
@@ -313,15 +313,11 @@ function updateGroupCoverUI(coverPath) {
const card = document.querySelector(`.group-card[data-group-id="${currentGroupId}"]`);
if (!card) return;
const g = allGroups.find(x => String(x.id) === String(currentGroupId));
const name = g ? g.name : currentGroupName;
const existing = card.querySelector('.group-cover');
if (existing && existing.tagName === 'IMG') { existing.src = API + coverPath; return; }
const el = document.createElement('img');
el.className = 'group-cover';
el.src = API + coverPath;
el.dataset.groupId = String(currentGroupId);
el.dataset.groupName = name;
el.title = 'Фото группы (хронология)';
el.alt = '';
if (existing) existing.replaceWith(el);
else card.insertBefore(el, card.firstChild);