diff --git a/deploy/popadmin/popadmin.js b/deploy/popadmin/popadmin.js index 80e63a2..fffbd1e 100644 --- a/deploy/popadmin/popadmin.js +++ b/deploy/popadmin/popadmin.js @@ -2539,6 +2539,17 @@ const pages = { + @@ -2554,7 +2565,7 @@ const pages = { ` @@ -2565,6 +2576,16 @@ const pages = {
ID名称层级父级排序启用操作
${esc(c.sortOrder)} ${c.enabled ? '是' : '否'} - +
+
@@ -2649,24 +2670,44 @@ const pages = { await api('/spark/music/categories', { method: 'POST', body: JSON.stringify(body) }); pages.music(); }; - $('content').querySelectorAll('[data-catedit]').forEach((btn) => { - btn.onclick = async () => { - const id = btn.dataset.catedit; - const row = flatCats.find((x) => String(x.id) === String(id)); - const name = prompt('分类名称', row?.name || ''); - if (name == null) return; - const sortRaw = prompt('排序(数字,越小越前)', String(row?.sortOrder ?? 0)); - if (sortRaw == null) return; - const enabled = confirm('是否启用?(确定=是,取消=否)'); + const hideCatEdit = () => { + const panel = $('musicCatEditPanel'); + if (panel) panel.classList.add('hidden'); + }; + $('catEditCancel').onclick = hideCatEdit; + $('catEditSave').onclick = async () => { + const id = $('catEditId').value; + if (!id) return; + const name = ($('catEditName').value || '').trim(); + if (!name) return alert('分类名称不能为空'); + const sortOrder = parseInt($('catEditSort').value, 10); + try { await api('/spark/music/categories/' + id, { method: 'PATCH', body: JSON.stringify({ - name: name.trim(), - sortOrder: parseInt(sortRaw, 10) || 0, - enabled, + name, + sortOrder: Number.isFinite(sortOrder) ? sortOrder : 0, + enabled: !!$('catEditEnabled').checked, }), }); + alert('分类已保存'); pages.music(); + } catch (e) { + alert('分类保存失败:' + e.message); + } + }; + $('content').querySelectorAll('[data-catedit]').forEach((btn) => { + btn.onclick = () => { + const id = btn.dataset.catedit; + const row = flatCats.find((x) => String(x.id) === String(id)); + if (!row) return alert('分类不存在'); + $('catEditId').value = id; + $('catEditIdLabel').textContent = id; + $('catEditName').value = row.name || ''; + $('catEditSort').value = String(row.sortOrder ?? 0); + $('catEditEnabled').checked = !!row.enabled; + $('musicCatEditPanel').classList.remove('hidden'); + $('catEditName').focus(); }; }); $('content').querySelectorAll('[data-catdel]').forEach((btn) => { @@ -2727,32 +2768,52 @@ const pages = { } }; }); - $('content').querySelectorAll('[data-mcats]').forEach((btn) => { - btn.onclick = async () => { - const id = btn.dataset.mcats; - const row = items.find((x) => String(x.id) === String(id)); - const selected = new Set((row?.categoryIds || []).map(String)); - const lines = flatCats.map((c) => { - const mark = selected.has(String(c.id)) ? '[x]' : '[ ]'; - const pad = c.depth ? ' ' : ''; - return `${mark} ${pad}${c.id} ${c.name}`; - }); - const tip = - '勾选归属分类(多对多)。输入要归属的分类 ID,逗号分隔;留空=清除。\n\n' + - lines.join('\n') + - '\n\n当前:' + - (row?.categoryIds || []).join(','); - const raw = prompt(tip, (row?.categoryIds || []).join(',')); - if (raw == null) return; - const categoryIds = raw - .split(/[,,\s]+/) - .map((s) => parseInt(s.trim(), 10)) - .filter((n) => Number.isFinite(n) && n > 0); + const hideTrackCat = () => { + const panel = $('musicTrackCatPanel'); + if (panel) panel.classList.add('hidden'); + }; + $('trackCatCancel').onclick = hideTrackCat; + $('trackCatSave').onclick = async () => { + const id = $('trackCatTrackId').value; + if (!id) return; + const categoryIds = Array.from($('trackCatChecks').querySelectorAll('input[type=checkbox]:checked')) + .map((el) => parseInt(el.value, 10)) + .filter((n) => Number.isFinite(n) && n > 0); + try { await api('/spark/music/' + id + '/categories', { method: 'PUT', body: JSON.stringify({ categoryIds }), }); + alert('分类绑定已保存'); pages.music(); + } catch (e) { + alert('分类绑定失败:' + e.message); + } + }; + $('content').querySelectorAll('[data-mcats]').forEach((btn) => { + btn.onclick = () => { + const id = btn.dataset.mcats; + const row = items.find((x) => String(x.id) === String(id)); + if (!row) return; + const selected = new Set((row.categoryIds || []).map(String)); + $('trackCatTrackId').value = id; + $('trackCatIdLabel').textContent = id; + $('trackCatTitle').textContent = row.title ? '· ' + row.title : ''; + $('trackCatChecks').innerHTML = flatCats.length + ? flatCats + .map((c) => { + const pad = c.depth ? 'padding-left:18px;' : ''; + const checked = selected.has(String(c.id)) ? 'checked' : ''; + const tier = c.depth === 0 ? '总分类' : '子分类'; + return ``; + }) + .join('') + : '
暂无分类,请先在上方新建
'; + $('musicTrackCatPanel').classList.remove('hidden'); + $('musicTrackCatPanel').scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }; }); $('content').querySelectorAll('[data-mdel]').forEach((btn) => {