diff --git a/static/app.js b/static/app.js
index 8f02565..675ad03 100644
--- a/static/app.js
+++ b/static/app.js
@@ -220,6 +220,50 @@ function renderProjects() {
`;
}
+function renderProposals() {
+ const proposalRows = state.data.proposals.map((p) => [p.customer_or_project_name, p.version, badge(p.status), p.files.length + " 个"]);
+ const proposalClicks = state.data.proposals.map((p) => ({ resource: "proposals", id: p.id }));
+ document.querySelector("#proposals").innerHTML = `
+ ${card(formHtml([
+ { label: "客户/项目", input: `` },
+ { label: "版本号", input: `` },
+ { label: "状态", input: `` },
+ ], { handler: "createProposal", text: "新增版本" }), "p-4")}
+ ${renderTable(["客户/项目", "版本号", "状态", "文件数"], proposalRows, proposalClicks)}
+
`;
+}
+
+function fileGroup(module, ownerId, version, category, files) {
+ return `
+
+
${files.length ? files.map(fileItem).join("") : `
暂无文件
`}
+
`;
+}
+
+function fileItem(file) {
+ return ``;
+}
+
+window.deleteFile = async (fileId) => {
+ if (!confirm("确认删除此文件?")) return;
+ await api(`/api/files/${fileId}`, { method: "DELETE" });
+ await load();
+ closeDrawer();
+};
+
+window.uploadFile = async (event, module, ownerId, version, category) => {
+ const file = event.target.files[0];
+ if (!file) return;
+ const form = new FormData();
+ form.append("module", module);
+ form.append("owner_id", ownerId);
+ form.append("owner_version", version);
+ form.append("file_category", category);
+ form.append("file", file);
+ await api("/api/files/upload", { method: "POST", body: form });
+ await load();
+};
+
function renderProducts() {
const items = state.productPlatform === "all" ? state.data.products : state.data.products.filter((x) => (x.platform || "") === state.productPlatform);
document.querySelector("#products").innerHTML = `