sage-mem 1.5.1 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +201 -157
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -3741,6 +3741,181 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
3741
3741
|
notice ? h("div", { className: "smem-ok", key: "ok" }, "✓ " + notice) : null,
|
|
3742
3742
|
]);
|
|
3743
3743
|
}
|
|
3744
|
+
// ── 文件列表这一屏(1.5.3 从 Section 里抽出;D23 计划的 72 片)──────────
|
|
3745
|
+
// 只负责「按状态/筛选把卡片摆出来 + 四种空态」;状态、筛选语义、动作回调全部由 Section 传。
|
|
3746
|
+
// 抽出的判据:它是 Section 里最大的一块纯渲染,而卡片组件(Card / ArchivedCard)本来就在 50 共享层。
|
|
3747
|
+
function FilesView(props) {
|
|
3748
|
+
const { loading, totalCount, openAdd, statusFilter, setStatusFilter, items, archiveItems, filtered, setTypeFilter, setTagFilter, setQuery, busy, restoring, archDelete, archEdit, archLoad, archSaving, archText, setArchText, openArchEdit, saveArchEdit, cancelArchEdit, restoreFile, setArchDelete, setArchEdit, deleteArchivedFile, expanded, deleting, archiving, archiveReason, setArchiveReason, setArchiving, setDeleting, confirmArchive, toggleLock, openEdit, confirmDelete } = props;
|
|
3749
|
+
let filesView;
|
|
3750
|
+
if (loading && totalCount === 0) {
|
|
3751
|
+
filesView = h("div", { className: "smem-skeleton", key: "loading", "data-loading": "1" }, [0, 1, 2].map(function (i) {
|
|
3752
|
+
return h("div", { className: "smem-skeleton-row", key: i });
|
|
3753
|
+
}));
|
|
3754
|
+
} else if (totalCount === 0) {
|
|
3755
|
+
filesView = h("div", { className: "smem-empty", key: "empty" }, [
|
|
3756
|
+
h("div", { key: "t" }, "还没有记忆文件。对话中值得记住的事会写到这里,也可以手动写入。"),
|
|
3757
|
+
h("button", { type: "button", className: "smem-btn smem-btn-primary", key: "add", onClick: openAdd }, "+ 添加记忆"),
|
|
3758
|
+
]);
|
|
3759
|
+
} else if (statusFilter === "archived" && archiveItems.length === 0) {
|
|
3760
|
+
filesView = h("div", { className: "smem-empty", key: "empty" }, [
|
|
3761
|
+
h("div", { key: "t" }, "档案馆是空的 —— 在活动记忆那张卡上点「归档」,它就会收到这里。"),
|
|
3762
|
+
h("button", { type: "button", className: "smem-btn", key: "back", onClick: function () { setStatusFilter("active"); } }, "回文件列表"),
|
|
3763
|
+
]);
|
|
3764
|
+
} else if (statusFilter === "active" && items.length === 0) {
|
|
3765
|
+
filesView = h("div", { className: "smem-empty", key: "empty" }, [
|
|
3766
|
+
h("div", { key: "t" }, "活动记忆是空的 —— 状态筛到「已归档」还能捞出 " + archiveItems.length + " 条。"),
|
|
3767
|
+
h("button", { type: "button", className: "smem-btn", key: "go", onClick: function () { setStatusFilter("archived"); } }, "切到已归档"),
|
|
3768
|
+
]);
|
|
3769
|
+
} else if (filtered.length === 0) {
|
|
3770
|
+
filesView = h("div", { className: "smem-empty", key: "empty" }, [
|
|
3771
|
+
h("div", { key: "t" }, "没有符合搜索或筛选条件的文件。"),
|
|
3772
|
+
h("button", { type: "button", className: "smem-btn", key: "clear", onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); } }, "清除筛选"),
|
|
3773
|
+
]);
|
|
3774
|
+
} else {
|
|
3775
|
+
const list = h("div", { className: "smem-list", key: "list" }, filtered.map(function (it) {
|
|
3776
|
+
if (it.archived === true) {
|
|
3777
|
+
return h(ArchivedCard, {
|
|
3778
|
+
key: it.file,
|
|
3779
|
+
item: it,
|
|
3780
|
+
busy: busy,
|
|
3781
|
+
restoring: restoring === it.file,
|
|
3782
|
+
deleting: archDelete === it.file,
|
|
3783
|
+
editing: archEdit === it.file,
|
|
3784
|
+
loading: archLoad && archEdit === it.file,
|
|
3785
|
+
saving: archSaving && archEdit === it.file,
|
|
3786
|
+
text: archText,
|
|
3787
|
+
onText: setArchText,
|
|
3788
|
+
onEdit: openArchEdit,
|
|
3789
|
+
onSave: saveArchEdit,
|
|
3790
|
+
onCancel: cancelArchEdit,
|
|
3791
|
+
onRestore: restoreFile,
|
|
3792
|
+
// 两个「危险动作的确认」互斥:问到一半又去改文本,界面就会同时摆两个确认条。
|
|
3793
|
+
onAskDelete: function (file) { setArchDelete(file); setArchEdit(null); },
|
|
3794
|
+
onCancelDelete: function () { setArchDelete(null); },
|
|
3795
|
+
onConfirmDelete: deleteArchivedFile,
|
|
3796
|
+
});
|
|
3797
|
+
}
|
|
3798
|
+
return h(Card, {
|
|
3799
|
+
key: it.file,
|
|
3800
|
+
item: it,
|
|
3801
|
+
expanded: !!expanded[it.file],
|
|
3802
|
+
deleting: deleting === it.file,
|
|
3803
|
+
archiving: archiving === it.file,
|
|
3804
|
+
archiveReason: archiveReason,
|
|
3805
|
+
busy: busy,
|
|
3806
|
+
onArchiveReason: setArchiveReason,
|
|
3807
|
+
onAskArchive: function (file) { setArchiving(file); setArchiveReason(""); setDeleting(null); },
|
|
3808
|
+
onCancelArchive: function () { setArchiving(null); setArchiveReason(""); },
|
|
3809
|
+
onConfirmArchive: confirmArchive,
|
|
3810
|
+
onToggleLock: toggleLock,
|
|
3811
|
+
onToggle: function (file) {
|
|
3812
|
+
const nx = {};
|
|
3813
|
+
nx[file] = !expanded[file];
|
|
3814
|
+
setExpanded(Object.assign({}, expanded, nx));
|
|
3815
|
+
},
|
|
3816
|
+
onEdit: openEdit,
|
|
3817
|
+
onAskDelete: function (file) { setDeleting(file); setArchiving(null); },
|
|
3818
|
+
onCancelDelete: function () { setDeleting(null); },
|
|
3819
|
+
onConfirmDelete: confirmDelete,
|
|
3820
|
+
});
|
|
3821
|
+
}));
|
|
3822
|
+
filesView = statusFilter === "archived"
|
|
3823
|
+
? [
|
|
3824
|
+
h("div", { className: "smem-ar-banner", key: "banner" },
|
|
3825
|
+
"档案馆里的记忆不参与检索与星图,原文仍在记忆目录的 archive/ 下 —— 恢复后它就回到活动列表;" +
|
|
3826
|
+
"「编辑」是原样文本编辑,改完存回同一份文件;「彻底删除」会真的从 archive/ 里删掉它(不可恢复,删除前还要再确认一次)。"),
|
|
3827
|
+
list,
|
|
3828
|
+
]
|
|
3829
|
+
: list;
|
|
3830
|
+
}
|
|
3831
|
+
|
|
3832
|
+
return filesView;
|
|
3833
|
+
}
|
|
3834
|
+
|
|
3835
|
+
// ── 筛选条(1.5.2 从 Section 里抽出)────────────────────────────────
|
|
3836
|
+
// 只接收 props、只渲染;筛选语义(哪些项互斥、怎么 AND/OR)仍在 Section 里算好再传进来。
|
|
3837
|
+
// 抽出来的收益是 Section 少了 60 行 UI 细节,而筛选条可以单独看、单独改(比如以后再加
|
|
3838
|
+
// 「只显示锁定」这类维度),不用在一千行的 Section 里翻。
|
|
3839
|
+
function FilterBar(props) {
|
|
3840
|
+
const { hasFilter, statusFilter, setStatusFilter, totalCount, items, archiveItems, statusItems, typeFilter, setTypeFilter, typeList, typeCounts, tagList, tagShown, tagHiddenCount, tagCounts, tagFilter, setTagFilter, tagOpen, setTagOpen, TAG_VISIBLE_MAX, query, setQuery, toggleIn, sumItem } = props;
|
|
3841
|
+
return h("div", { className: "smem-filters" }, [
|
|
3842
|
+
hasFilter
|
|
3843
|
+
? h("div", { className: "smem-filter-summary", key: "sum" }, [
|
|
3844
|
+
statusFilter !== "all"
|
|
3845
|
+
? sumItem("状态:" + (statusFilter === "active" ? "活动中" : "已归档"), function () { setStatusFilter("all"); })
|
|
3846
|
+
: null,
|
|
3847
|
+
typeFilter.map(function (t) {
|
|
3848
|
+
return sumItem("类型:" + (TYPE_LABEL[t] || t), function () { toggleIn(setTypeFilter, t); });
|
|
3849
|
+
}),
|
|
3850
|
+
tagFilter.map(function (g) {
|
|
3851
|
+
return sumItem("标签:#" + g, function () { toggleIn(setTagFilter, g); });
|
|
3852
|
+
}),
|
|
3853
|
+
query.trim() ? sumItem("搜索:" + query.trim(), function () { setQuery(""); }) : null,
|
|
3854
|
+
h("button", {
|
|
3855
|
+
type: "button", className: "smem-sum-clear", key: "all",
|
|
3856
|
+
onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
|
|
3857
|
+
}, "清除全部"),
|
|
3858
|
+
])
|
|
3859
|
+
: null,
|
|
3860
|
+
h("span", { className: "smem-filters-label", key: "lst" }, "状态"),
|
|
3861
|
+
h("button", {
|
|
3862
|
+
type: "button", key: "st-all", className: "smem-chip",
|
|
3863
|
+
"data-on": statusFilter === "all" ? "1" : "0",
|
|
3864
|
+
title: "活动与已归档一起看(归档条走灰色)",
|
|
3865
|
+
onClick: function () { setStatusFilter("all"); },
|
|
3866
|
+
}, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(totalCount))]),
|
|
3867
|
+
h("button", {
|
|
3868
|
+
type: "button", key: "st-active", className: "smem-chip",
|
|
3869
|
+
"data-on": statusFilter === "active" ? "1" : "0",
|
|
3870
|
+
title: "正在参与检索与星图的记忆",
|
|
3871
|
+
onClick: function () { setStatusFilter("active"); },
|
|
3872
|
+
}, ["活动中", h("span", { className: "smem-chip-n", key: "n" }, String(items.length))]),
|
|
3873
|
+
h("button", {
|
|
3874
|
+
type: "button", key: "st-arch", className: "smem-chip",
|
|
3875
|
+
"data-on": statusFilter === "archived" ? "1" : "0",
|
|
3876
|
+
title: "已收进档案馆:不参与检索与星图,可编辑 / 恢复",
|
|
3877
|
+
onClick: function () { setStatusFilter("archived"); },
|
|
3878
|
+
}, ["已归档", h("span", { className: "smem-chip-n", key: "n" }, String(archiveItems.length))]),
|
|
3879
|
+
h("span", { className: "smem-sep", key: "sep0" }),
|
|
3880
|
+
h("span", { className: "smem-filters-label", key: "lt" }, "类型"),
|
|
3881
|
+
h("button", {
|
|
3882
|
+
type: "button", key: "all", className: "smem-chip",
|
|
3883
|
+
"data-on": typeFilter.length ? "0" : "1",
|
|
3884
|
+
onClick: function () { setTypeFilter([]); },
|
|
3885
|
+
}, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(statusItems.length))]),
|
|
3886
|
+
typeList.map(function (t) {
|
|
3887
|
+
return h("button", {
|
|
3888
|
+
type: "button", key: t, className: "smem-chip",
|
|
3889
|
+
"data-on": typeFilter.indexOf(t) >= 0 ? "1" : "0",
|
|
3890
|
+
onClick: function () { toggleIn(setTypeFilter, t); },
|
|
3891
|
+
}, [TYPE_LABEL[t] || t, h("span", { className: "smem-chip-n", key: "n" }, String(typeCounts[t]))]);
|
|
3892
|
+
}),
|
|
3893
|
+
tagList.length ? h("span", { className: "smem-sep", key: "sep" }) : null,
|
|
3894
|
+
tagList.length ? h("span", { className: "smem-filters-label", key: "lgt" }, "标签") : null,
|
|
3895
|
+
tagShown.map(function (g) {
|
|
3896
|
+
return h("button", {
|
|
3897
|
+
type: "button", key: "tag-" + g, className: "smem-chip",
|
|
3898
|
+
"data-on": tagFilter.indexOf(g) >= 0 ? "1" : "0",
|
|
3899
|
+
onClick: function () { toggleIn(setTagFilter, g); },
|
|
3900
|
+
}, ["#" + g, h("span", { className: "smem-chip-n", key: "n" }, String(tagCounts[g]))]);
|
|
3901
|
+
}),
|
|
3902
|
+
tagList.length > TAG_VISIBLE_MAX
|
|
3903
|
+
? h("button", {
|
|
3904
|
+
type: "button", key: "moretag", className: "smem-btn",
|
|
3905
|
+
title: tagOpen ? "收起标签" : "还有一些标签没显示",
|
|
3906
|
+
onClick: function () { setTagOpen(!tagOpen); },
|
|
3907
|
+
}, tagOpen ? "收起标签" : ("更多标签 (" + String(tagHiddenCount) + ")") )
|
|
3908
|
+
: null,
|
|
3909
|
+
hasFilter
|
|
3910
|
+
? h("button", {
|
|
3911
|
+
type: "button", key: "clear", className: "smem-btn",
|
|
3912
|
+
onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
|
|
3913
|
+
}, "清除筛选")
|
|
3914
|
+
: null,
|
|
3915
|
+
|
|
3916
|
+
]);
|
|
3917
|
+
}
|
|
3918
|
+
|
|
3744
3919
|
function Section(props) {
|
|
3745
3920
|
// 走 stableRemote:真实宿主里 `ctx.get()` 每次返回新对象(issue #3 的成因)。
|
|
3746
3921
|
// 这个面板的 effect 依赖是 `[]`、暂时不会爆,但引用稳定是**所有**面板的共同前提。
|
|
@@ -4397,88 +4572,23 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
4397
4572
|
|
|
4398
4573
|
// 「文件列表」这一屏:状态筛选决定看哪一批,灰色卡片与留痕块自带「退役」语义。
|
|
4399
4574
|
// banner 只在**专门看归档**时出现,切到全部时不重复说一遍。
|
|
4400
|
-
|
|
4401
|
-
|
|
4402
|
-
|
|
4403
|
-
|
|
4404
|
-
|
|
4405
|
-
|
|
4406
|
-
|
|
4407
|
-
|
|
4408
|
-
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4412
|
-
|
|
4413
|
-
|
|
4414
|
-
|
|
4415
|
-
}
|
|
4416
|
-
|
|
4417
|
-
h("div", { key: "t" }, "活动记忆是空的 —— 状态筛到「已归档」还能捞出 " + archiveItems.length + " 条。"),
|
|
4418
|
-
h("button", { type: "button", className: "smem-btn", key: "go", onClick: function () { setStatusFilter("archived"); } }, "切到已归档"),
|
|
4419
|
-
]);
|
|
4420
|
-
} else if (filtered.length === 0) {
|
|
4421
|
-
filesView = h("div", { className: "smem-empty", key: "empty" }, [
|
|
4422
|
-
h("div", { key: "t" }, "没有符合搜索或筛选条件的文件。"),
|
|
4423
|
-
h("button", { type: "button", className: "smem-btn", key: "clear", onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); } }, "清除筛选"),
|
|
4424
|
-
]);
|
|
4425
|
-
} else {
|
|
4426
|
-
const list = h("div", { className: "smem-list", key: "list" }, filtered.map(function (it) {
|
|
4427
|
-
if (it.archived === true) {
|
|
4428
|
-
return h(ArchivedCard, {
|
|
4429
|
-
key: it.file,
|
|
4430
|
-
item: it,
|
|
4431
|
-
busy: busy,
|
|
4432
|
-
restoring: restoring === it.file,
|
|
4433
|
-
deleting: archDelete === it.file,
|
|
4434
|
-
editing: archEdit === it.file,
|
|
4435
|
-
loading: archLoad && archEdit === it.file,
|
|
4436
|
-
saving: archSaving && archEdit === it.file,
|
|
4437
|
-
text: archText,
|
|
4438
|
-
onText: setArchText,
|
|
4439
|
-
onEdit: openArchEdit,
|
|
4440
|
-
onSave: saveArchEdit,
|
|
4441
|
-
onCancel: cancelArchEdit,
|
|
4442
|
-
onRestore: restoreFile,
|
|
4443
|
-
// 两个「危险动作的确认」互斥:问到一半又去改文本,界面就会同时摆两个确认条。
|
|
4444
|
-
onAskDelete: function (file) { setArchDelete(file); setArchEdit(null); },
|
|
4445
|
-
onCancelDelete: function () { setArchDelete(null); },
|
|
4446
|
-
onConfirmDelete: deleteArchivedFile,
|
|
4447
|
-
});
|
|
4448
|
-
}
|
|
4449
|
-
return h(Card, {
|
|
4450
|
-
key: it.file,
|
|
4451
|
-
item: it,
|
|
4452
|
-
expanded: !!expanded[it.file],
|
|
4453
|
-
deleting: deleting === it.file,
|
|
4454
|
-
archiving: archiving === it.file,
|
|
4455
|
-
archiveReason: archiveReason,
|
|
4456
|
-
busy: busy,
|
|
4457
|
-
onArchiveReason: setArchiveReason,
|
|
4458
|
-
onAskArchive: function (file) { setArchiving(file); setArchiveReason(""); setDeleting(null); },
|
|
4459
|
-
onCancelArchive: function () { setArchiving(null); setArchiveReason(""); },
|
|
4460
|
-
onConfirmArchive: confirmArchive,
|
|
4461
|
-
onToggleLock: toggleLock,
|
|
4462
|
-
onToggle: function (file) {
|
|
4463
|
-
const nx = {};
|
|
4464
|
-
nx[file] = !expanded[file];
|
|
4465
|
-
setExpanded(Object.assign({}, expanded, nx));
|
|
4466
|
-
},
|
|
4467
|
-
onEdit: openEdit,
|
|
4468
|
-
onAskDelete: function (file) { setDeleting(file); setArchiving(null); },
|
|
4469
|
-
onCancelDelete: function () { setDeleting(null); },
|
|
4470
|
-
onConfirmDelete: confirmDelete,
|
|
4471
|
-
});
|
|
4472
|
-
}));
|
|
4473
|
-
filesView = statusFilter === "archived"
|
|
4474
|
-
? [
|
|
4475
|
-
h("div", { className: "smem-ar-banner", key: "banner" },
|
|
4476
|
-
"档案馆里的记忆不参与检索与星图,原文仍在记忆目录的 archive/ 下 —— 恢复后它就回到活动列表;" +
|
|
4477
|
-
"「编辑」是原样文本编辑,改完存回同一份文件;「彻底删除」会真的从 archive/ 里删掉它(不可恢复,删除前还要再确认一次)。"),
|
|
4478
|
-
list,
|
|
4479
|
-
]
|
|
4480
|
-
: list;
|
|
4481
|
-
}
|
|
4575
|
+
const filesView = h(FilesView, {
|
|
4576
|
+
loading: loading, totalCount: totalCount, openAdd: openAdd,
|
|
4577
|
+
statusFilter: statusFilter, setStatusFilter: setStatusFilter,
|
|
4578
|
+
items: items, archiveItems: archiveItems, filtered: filtered,
|
|
4579
|
+
setTypeFilter: setTypeFilter, setTagFilter: setTagFilter, setQuery: setQuery,
|
|
4580
|
+
busy: busy, restoring: restoring,
|
|
4581
|
+
archDelete: archDelete, archEdit: archEdit, archLoad: archLoad, archSaving: archSaving,
|
|
4582
|
+
archText: archText, setArchText: setArchText,
|
|
4583
|
+
openArchEdit: openArchEdit, saveArchEdit: saveArchEdit, cancelArchEdit: cancelArchEdit,
|
|
4584
|
+
restoreFile: restoreFile, setArchDelete: setArchDelete, setArchEdit: setArchEdit, deleteArchivedFile: deleteArchivedFile,
|
|
4585
|
+
expanded: expanded, deleting: deleting, archiving: archiving,
|
|
4586
|
+
archiveReason: archiveReason, setArchiveReason: setArchiveReason,
|
|
4587
|
+
setArchiving: setArchiving, setDeleting: setDeleting,
|
|
4588
|
+
confirmArchive: confirmArchive, toggleLock: toggleLock,
|
|
4589
|
+
openEdit: openEdit, confirmDelete: confirmDelete,
|
|
4590
|
+
});
|
|
4591
|
+
|
|
4482
4592
|
|
|
4483
4593
|
return h("div", { className: "smem-root" }, [
|
|
4484
4594
|
h("div", { className: "smem-tabs", key: "tabs", role: "tablist" }, [
|
|
@@ -4620,81 +4730,15 @@ h("span", { key: "sep", className: "smem-actions-sep", "aria-hidden": "true" }),
|
|
|
4620
4730
|
: null,
|
|
4621
4731
|
// 三排筛选:状态 / 类型 / 标签。组内 OR、组间 AND,再与搜索框 AND。
|
|
4622
4732
|
tab === "files" && totalCount
|
|
4623
|
-
? h(
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
4627
|
-
|
|
4628
|
-
|
|
4629
|
-
|
|
4630
|
-
|
|
4631
|
-
|
|
4632
|
-
tagFilter.map(function (g) {
|
|
4633
|
-
return sumItem("标签:#" + g, function () { toggleIn(setTagFilter, g); });
|
|
4634
|
-
}),
|
|
4635
|
-
query.trim() ? sumItem("搜索:" + query.trim(), function () { setQuery(""); }) : null,
|
|
4636
|
-
h("button", {
|
|
4637
|
-
type: "button", className: "smem-sum-clear", key: "all",
|
|
4638
|
-
onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
|
|
4639
|
-
}, "清除全部"),
|
|
4640
|
-
])
|
|
4641
|
-
: null,
|
|
4642
|
-
h("span", { className: "smem-filters-label", key: "lst" }, "状态"),
|
|
4643
|
-
h("button", {
|
|
4644
|
-
type: "button", key: "st-all", className: "smem-chip",
|
|
4645
|
-
"data-on": statusFilter === "all" ? "1" : "0",
|
|
4646
|
-
title: "活动与已归档一起看(归档条走灰色)",
|
|
4647
|
-
onClick: function () { setStatusFilter("all"); },
|
|
4648
|
-
}, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(totalCount))]),
|
|
4649
|
-
h("button", {
|
|
4650
|
-
type: "button", key: "st-active", className: "smem-chip",
|
|
4651
|
-
"data-on": statusFilter === "active" ? "1" : "0",
|
|
4652
|
-
title: "正在参与检索与星图的记忆",
|
|
4653
|
-
onClick: function () { setStatusFilter("active"); },
|
|
4654
|
-
}, ["活动中", h("span", { className: "smem-chip-n", key: "n" }, String(items.length))]),
|
|
4655
|
-
h("button", {
|
|
4656
|
-
type: "button", key: "st-arch", className: "smem-chip",
|
|
4657
|
-
"data-on": statusFilter === "archived" ? "1" : "0",
|
|
4658
|
-
title: "已收进档案馆:不参与检索与星图,可编辑 / 恢复",
|
|
4659
|
-
onClick: function () { setStatusFilter("archived"); },
|
|
4660
|
-
}, ["已归档", h("span", { className: "smem-chip-n", key: "n" }, String(archiveItems.length))]),
|
|
4661
|
-
h("span", { className: "smem-sep", key: "sep0" }),
|
|
4662
|
-
h("span", { className: "smem-filters-label", key: "lt" }, "类型"),
|
|
4663
|
-
h("button", {
|
|
4664
|
-
type: "button", key: "all", className: "smem-chip",
|
|
4665
|
-
"data-on": typeFilter.length ? "0" : "1",
|
|
4666
|
-
onClick: function () { setTypeFilter([]); },
|
|
4667
|
-
}, ["全部", h("span", { className: "smem-chip-n", key: "n" }, String(statusItems.length))]),
|
|
4668
|
-
typeList.map(function (t) {
|
|
4669
|
-
return h("button", {
|
|
4670
|
-
type: "button", key: t, className: "smem-chip",
|
|
4671
|
-
"data-on": typeFilter.indexOf(t) >= 0 ? "1" : "0",
|
|
4672
|
-
onClick: function () { toggleIn(setTypeFilter, t); },
|
|
4673
|
-
}, [TYPE_LABEL[t] || t, h("span", { className: "smem-chip-n", key: "n" }, String(typeCounts[t]))]);
|
|
4674
|
-
}),
|
|
4675
|
-
tagList.length ? h("span", { className: "smem-sep", key: "sep" }) : null,
|
|
4676
|
-
tagList.length ? h("span", { className: "smem-filters-label", key: "lgt" }, "标签") : null,
|
|
4677
|
-
tagShown.map(function (g) {
|
|
4678
|
-
return h("button", {
|
|
4679
|
-
type: "button", key: "tag-" + g, className: "smem-chip",
|
|
4680
|
-
"data-on": tagFilter.indexOf(g) >= 0 ? "1" : "0",
|
|
4681
|
-
onClick: function () { toggleIn(setTagFilter, g); },
|
|
4682
|
-
}, ["#" + g, h("span", { className: "smem-chip-n", key: "n" }, String(tagCounts[g]))]);
|
|
4683
|
-
}),
|
|
4684
|
-
tagList.length > TAG_VISIBLE_MAX
|
|
4685
|
-
? h("button", {
|
|
4686
|
-
type: "button", key: "moretag", className: "smem-btn",
|
|
4687
|
-
title: tagOpen ? "收起标签" : "还有一些标签没显示",
|
|
4688
|
-
onClick: function () { setTagOpen(!tagOpen); },
|
|
4689
|
-
}, tagOpen ? "收起标签" : ("更多标签 (" + String(tagHiddenCount) + ")") )
|
|
4690
|
-
: null,
|
|
4691
|
-
hasFilter
|
|
4692
|
-
? h("button", {
|
|
4693
|
-
type: "button", key: "clear", className: "smem-btn",
|
|
4694
|
-
onClick: function () { setStatusFilter("all"); setTypeFilter([]); setTagFilter([]); setQuery(""); },
|
|
4695
|
-
}, "清除筛选")
|
|
4696
|
-
: null,
|
|
4697
|
-
])
|
|
4733
|
+
? h(FilterBar, {
|
|
4734
|
+
hasFilter: hasFilter, statusFilter: statusFilter, setStatusFilter: setStatusFilter,
|
|
4735
|
+
totalCount: totalCount, items: items, archiveItems: archiveItems, statusItems: statusItems,
|
|
4736
|
+
typeFilter: typeFilter, setTypeFilter: setTypeFilter, typeList: typeList, typeCounts: typeCounts,
|
|
4737
|
+
tagList: tagList, tagShown: tagShown, tagHiddenCount: tagHiddenCount, tagCounts: tagCounts,
|
|
4738
|
+
tagFilter: tagFilter, setTagFilter: setTagFilter, tagOpen: tagOpen, setTagOpen: setTagOpen,
|
|
4739
|
+
TAG_VISIBLE_MAX: TAG_VISIBLE_MAX, query: query, setQuery: setQuery,
|
|
4740
|
+
toggleIn: toggleIn, sumItem: sumItem,
|
|
4741
|
+
})
|
|
4698
4742
|
: null,
|
|
4699
4743
|
error ? h("div", { className: "smem-err", key: "err", role: "alert" }, "⚠ " + error) : null,
|
|
4700
4744
|
notice && !error ? h("div", { className: "smem-ok", key: "ok", role: "status" }, "✓ " + notice) : null,
|
package/package.json
CHANGED