PROJECT ARCHIVE · EVENTS & CONFERENCES
会议活动项目
论坛、研讨会、闭门研讨等会议项目的策划与执行档案。圆桌讨论提纲、速记稿与嘉宾信息是最有价值的知识资产。
// ── 顶部统计 ──
const conferences = dv.pages('"02_项目档案/会议活动"').where(p => p.file.name !== "_索引");
const experts     = dv.pages('"03_提案素材库/专家资源库"').where(p => p.file.name !== "_索引");
// 圆桌记录分散在各领域文件夹的 圆桌记录/ 子目录
const roundtables = dv.pages('"01_领域知识"').where(p => p.file.path.includes("/圆桌记录/"));
 
const el = dv.el("div", "", {cls: "conf-stat-row"});
el.innerHTML = `
<a class="conf-stat-card" data-href="02_项目档案/会议活动/_索引">
  <div class="conf-stat-n">${conferences.length}</div>
  <div class="conf-stat-l">会议档案</div>
</a>
<a class="conf-stat-card internal-link" data-href="03_提案素材库/专家资源库/_索引">
  <div class="conf-stat-n">${experts.length}</div>
  <div class="conf-stat-l">专家资源库</div>
</a>
<a class="conf-stat-card internal-link" data-href="01_领域知识/_索引">
  <div class="conf-stat-n">${roundtables.length}</div>
  <div class="conf-stat-l">圆桌记录</div>
</a>`;

快速入口


历届会议

const pages = dv.pages('"02_项目档案/会议活动"')
  .where(p => p.file.name !== "_索引")
  .sort(p => p["完成时间"], "desc");
 
for (const p of pages) {
  const domains = Array.isArray(p["领域"]) ? p["领域"] : (p["领域"] ? [p["领域"]] : []);
  const tags = domains.map(d => `<span class="conf-tag">${d}</span>`).join("");
  const date = p["完成时间"] || "日期待补充";
  const client = p["客户"] || "";
  const lead = p["负责人"] || "";
 
  const card = dv.el("div", "", {cls: "conf-card"});
  card.innerHTML = `
<div class="conf-card-top">
  <span class="conf-card-date">${date}</span>
  ${lead ? `<span class="conf-card-lead">主持:${lead}</span>` : ""}
</div>
<a class="internal-link conf-card-title" data-href="${p.file.path}">${p["项目名称"] || p.file.name}</a>
<div class="conf-card-tags">${tags}</div>
${client ? `<div class="conf-card-client">🏢 ${client}</div>` : ""}
<div class="conf-card-links">
  <a class="internal-link conf-card-link" data-href="${p.file.path}">查看档案 →</a>
</div>`;
}

新建会议项目

const { Modal } = require("obsidian");
class NewProjectModal extends Modal {
    constructor(app, folder, placeholder) {
        super(app);
        this.folder = folder;
        this.placeholder = placeholder;
    }
    onOpen() {
        const { contentEl } = this;
        contentEl.createEl("h3", { text: "新建会议活动项目" });
        const input = contentEl.createEl("input", { type: "text" });
        input.placeholder = this.placeholder;
        input.style.cssText = "width:100%;padding:6px 8px;margin:8px 0 12px;border-radius:4px;border:1px solid var(--background-modifier-border);font-size:14px;";
        input.focus();
        const hint = contentEl.createEl("div");
        hint.style.cssText = "font-size:12px;color:var(--text-muted);margin-bottom:12px;";
        hint.textContent = "保存至:" + this.folder;
        const confirmBtn = contentEl.createEl("button", { text: "创建并打开" });
        confirmBtn.style.cssText = "width:100%;background:var(--background-secondary);color:var(--text-normal);border:1px solid var(--background-modifier-border);border-radius:5px;padding:6px;font-size:14px;cursor:pointer;";
        const doCreate = async () => {
            const name = input.value.trim();
            if (!name) { input.focus(); return; }
            const tpl = app.vault.getAbstractFileByPath("Templates/项目概览模板.md");
            const content = tpl ? await app.vault.read(tpl) : "";
            const path = `${this.folder}/${name}.md`;
            try {
                const file = await app.vault.create(path, content);
                app.workspace.getLeaf().openFile(file);
                this.close();
            } catch (e) { new Notice("创建失败:" + e.message); }
        };
        confirmBtn.addEventListener("click", doCreate);
        input.addEventListener("keydown", e => { if (e.key === "Enter") doCreate(); });
    }
    onClose() { this.contentEl.empty(); }
}
const btn = dv.el("button", "+ 新建会议活动项目", {attr: {style: "background:var(--background-secondary);color:var(--text-muted);border:1px solid var(--background-modifier-border);border-radius:5px;padding:4px 12px;font-size:0.82rem;cursor:pointer;"}});
btn.addEventListener("click", () => {
    new NewProjectModal(app, "02_项目档案/会议活动", "YYYY_活动简称_主办方简称").open();
});