工作台重命名:无界·无界 → 学会·无界

- ALL_TENANTS / session / seed / migrations 全部同步
- 新增 migrate_rename_tenant() 数据迁移,启动自动 UPDATE 所有表
- migrations/ 模式重构(参考 SalesManager)
This commit is contained in:
mac
2026-06-26 12:21:02 +08:00
parent 33f47acc55
commit 2bb99feda4
8 changed files with 363 additions and 58 deletions

View File

@@ -1,4 +1,4 @@
// drawer.js — 详情抽屉 + 评论 + 转移 + 删除
// drawer.js — 详情抽屉 + 评论 + 删除
function drawerField(icon, label, name, value, multiline = false, customControl = null) {
const safeValue = esc(value || "");
@@ -37,7 +37,7 @@ function openDrawer(resource, id) {
const followupTarget = resource === "sales" ? "sales" : resource === "proposals" ? "proposal" : resource === "operations" ? "operation" : resource === "products" ? "product" : "";
const title = esc(item.target_customer || item.project_name || (item.customer_or_project_name ? `${item.customer_or_project_name} · ${item.proposal_type || ''}` : "") || item.product_name);
const titleForAttr = esc(item.target_customer || item.project_name || (item.customer_or_project_name ? `${item.customer_or_project_name} · ${item.proposal_type || ''}` : "") || item.product_name);
drawer.innerHTML = `<div class="drawer-panel"><div class="sticky top-0 z-10 flex items-center justify-between border-b border-slate-200 bg-white/95 px-5 py-3 backdrop-blur"><div><p class="text-[10px] font-semibold uppercase tracking-[0.18em] text-slate-400">Detail Drawer</p><div class="flex items-center gap-2"><h2 class="drawer-title text-[17px] font-semibold leading-6 text-slate-900">${title}</h2><span id="drawerSaveStatus" class="save-status"></span></div></div><div class="flex items-center gap-2"><button class="btn btn-ghost btn-sm text-blue-600 hover:bg-blue-50" onclick="openTransferModal('${resource}', ${id}, '${titleForAttr}')" ${resource === 'operations' ? '' : 'style="display:none"'}><i data-lucide="move-right"></i>转移</button><button class="btn btn-ghost btn-sm text-red-600 hover:bg-red-50" onclick="deleteDrawerItem('${resource}', ${id})"><i data-lucide="trash-2"></i>删除</button><button class="btn btn-ghost btn-sm" onclick="closeDrawer()">关闭</button></div></div><div class="grid gap-5 p-5">
drawer.innerHTML = `<div class="drawer-panel"><div class="sticky top-0 z-10 flex items-center justify-between border-b border-slate-200 bg-white/95 px-5 py-3 backdrop-blur"><div><p class="text-[10px] font-semibold uppercase tracking-[0.18em] text-slate-400">Detail Drawer</p><div class="flex items-center gap-2"><h2 class="drawer-title text-[17px] font-semibold leading-6 text-slate-900">${title}</h2><span id="drawerSaveStatus" class="save-status"></span></div></div><div class="flex items-center gap-2"><button class="btn btn-ghost btn-sm text-red-600 hover:bg-red-50" onclick="deleteDrawerItem('${resource}', ${id})"><i data-lucide="trash-2"></i>删除</button><button class="btn btn-ghost btn-sm" onclick="closeDrawer()">关闭</button></div></div><div class="grid gap-5 p-5">
<section>
<h3 class="drawer-section-title">属性</h3>
<form id="drawerForm" class="drawer-fields">
@@ -172,33 +172,6 @@ window.deleteDrawerItem = async (resource, id) => {
}
};
window.openTransferModal = (resource, id, title) => {
document.querySelector("#transfer-resource").value = resource;
document.querySelector("#transfer-id").value = id;
document.querySelector("#transfer-title-text").textContent = "将「" + title + "」转移到:";
document.querySelector("#transferModal").classList.remove("hidden");
};
window.closeTransferModal = () => {
document.querySelector("#transferModal").classList.add("hidden");
};
window.submitTransfer = async (event) => {
event.preventDefault();
const form = event.currentTarget;
const resource = form.querySelector('[name="transfer_resource"]').value;
const id = form.querySelector('[name="transfer_id"]').value;
const newTenant = form.querySelector('[name="transfer_tenant"]').value;
try {
await api(`/api/${resource}/${id}`, { method: "PUT", body: JSON.stringify({ data: { tenant: newTenant } }) });
closeTransferModal();
closeDrawer();
await load();
} catch (error) {
toast("转移失败:" + error.message, "error");
}
};
// Squire 富文本编辑器
window.squireInstances = {};
window.squireCmd = (cmd) => {