feat: uninstall button for locally installed market packages

This commit is contained in:
2026-07-27 08:49:20 +08:00
parent d04ab1138c
commit 2a51026587
+18
View File
@@ -66,6 +66,7 @@ const PageMarket = {
const icon = isScene ? '🎬' : (d.icon || '📦'); const icon = isScene ? '🎬' : (d.icon || '📦');
const label = installed ? '已安装' : (isScene ? '安装场景' : '安装'); const label = installed ? '已安装' : (isScene ? '安装场景' : '安装');
const btnClass = isScene ? 'btn-m-install-scene' : 'btn-m-install'; const btnClass = isScene ? 'btn-m-install-scene' : 'btn-m-install';
const uninstallBtn = installed ? `<button class="btn btn-sm btn-danger btn-m-uninstall" data-name="${d.name||d.id}" style="margin-top:4px;width:100%">卸载</button>` : '';
return `<div class="glass-card theme-card"> return `<div class="glass-card theme-card">
<div class="theme-card-preview">${icon}</div> <div class="theme-card-preview">${icon}</div>
<div class="theme-card-info"> <div class="theme-card-info">
@@ -77,6 +78,7 @@ const PageMarket = {
<span>${d.author||''}</span><span style="color:var(--text-tertiary)">${d.downloads||0} 次</span> <span>${d.author||''}</span><span style="color:var(--text-tertiary)">${d.downloads||0} 次</span>
</div> </div>
<button class="btn btn-sm btn-primary ${btnClass}" data-id="${d.id}" data-file="${d.file||''}" style="margin-top:8px;width:100%" ${installed?'disabled':''}>${label}</button> <button class="btn btn-sm btn-primary ${btnClass}" data-id="${d.id}" data-file="${d.file||''}" style="margin-top:8px;width:100%" ${installed?'disabled':''}>${label}</button>
${uninstallBtn}
</div></div>`; </div></div>`;
}, },
@@ -107,6 +109,22 @@ const PageMarket = {
const btnUpdate = e.target.closest('.btn-my-update'); const btnUpdate = e.target.closest('.btn-my-update');
const btnDelete = e.target.closest('.btn-my-delete'); const btnDelete = e.target.closest('.btn-my-delete');
if (e.target.closest('.btn-m-uninstall')) {
const ubtn = e.target.closest('.btn-m-uninstall');
if (!confirm('确定卸载 "' + (ubtn.dataset.name||'') + '"')) return;
try {
const r = await fetch('/api/dashboards?category=all');
const list = (await r.json()) || [];
const dash = list.find(d => d.id === ubtn.dataset.name || d.name === ubtn.dataset.name);
if (dash) {
await fetch('/api/dashboards/' + dash.id, { method: 'DELETE' });
Toast.show('已卸载', 'success');
this._loadItems();
} else { Toast.show('未找到本地安装', 'error'); }
} catch (e) { Toast.show('卸载失败', 'error'); }
return;
}
if (btnUpdate) { if (btnUpdate) {
const input = document.createElement('input'); input.type = 'file'; input.accept = btnUpdate.dataset.type; const input = document.createElement('input'); input.type = 'file'; input.accept = btnUpdate.dataset.type;
input.onchange = async (ev) => { input.onchange = async (ev) => {