dsh-task-ledger 0.0.67 → 0.0.68
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/dist/client.js +44 -30
- package/dist/client.js.map +1 -1
- package/dist/host/services/home.service.d.ts +1 -1
- package/dist/host/services/home.service.js +15 -7
- package/dist/host/types.d.ts +9 -4
- package/package.json +1 -1
- package/skill/README.md +1 -1
- package/skill/SKILL.md +2 -2
- package/skill/package.json +1 -1
- package/skill/references/state-model.md +2 -2
package/dist/client.js
CHANGED
|
@@ -202,7 +202,7 @@ window.__ModuleLoader__.load({
|
|
|
202
202
|
finish: false,
|
|
203
203
|
release: false
|
|
204
204
|
};
|
|
205
|
-
/** 状态档命中(积压 /
|
|
205
|
+
/** 状态档命中(积压 / 逾期 / 停滞由 host 标记,前端不判阈值)——只作用于第二区。 */
|
|
206
206
|
function statusHit(task, status) {
|
|
207
207
|
if (status === "all") return true;
|
|
208
208
|
if (status === "active") return task.status === "doing" || task.status === "blocked";
|
|
@@ -378,7 +378,7 @@ body{
|
|
|
378
378
|
/* ⚠️ 宿主是 state-warn(不是 state-warning,后者无此定义) */
|
|
379
379
|
--dtl-warning:var(--dsw-alias-state-warn-primary,#f59e0b);
|
|
380
380
|
--dtl-danger:var(--dsw-alias-state-error-primary,#ec1313);
|
|
381
|
-
/*
|
|
381
|
+
/* 逾期橙:在「积压黄」与「停滞红」之间再取一档(语义阶梯 灰→黄→橙→红),
|
|
382
382
|
宿主没有现成的橙 token ⇒ 用 warn + error 两色现算,主题一换自动跟随 */
|
|
383
383
|
--dtl-overdue:color-mix(in srgb,var(--dtl-warning) 55%,var(--dtl-danger));
|
|
384
384
|
--dtl-link:var(--dsw-alias-link,#3b5bdb);
|
|
@@ -667,7 +667,7 @@ body[data-ds-dark-theme]{
|
|
|
667
667
|
/* 「查看」钮在表格行里也要常驻布局(display:none 会不算宽度 ⇒ hover 一出就又把行撑开) */
|
|
668
668
|
.dtl-orow .dtl-viewbtn{display:inline-flex;visibility:hidden;}
|
|
669
669
|
.dtl-orow:hover .dtl-viewbtn{visibility:visible;}
|
|
670
|
-
/* 行首状态圆点:灰=待认领 / 浅蓝=进行中(比「我的」蓝灰一档)/ 黄=积压 /
|
|
670
|
+
/* 行首状态圆点:灰=待认领 / 浅蓝=进行中(比「我的」蓝灰一档)/ 黄=积压 / 橙=逾期 / 红=停滞;
|
|
671
671
|
6px(用户 2026-10-18:8px 太大) */
|
|
672
672
|
.dtl-dot{display:inline-block;width:6px;height:6px;flex:none;border-radius:50%;}
|
|
673
673
|
.dtl-dot--doing{background:var(--dtl-business-dim);}
|
|
@@ -724,7 +724,7 @@ body[data-ds-dark-theme]{
|
|
|
724
724
|
background:var(--dtl-chip-bg);color:var(--dtl-fg-3);font-size:10px;line-height:16px;
|
|
725
725
|
white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;}
|
|
726
726
|
/* 状态四色 = **实心色块**(用户 2026-10-18:彩色字看不清 ⇒ 改色块 + 反色字):
|
|
727
|
-
待认领灰 / 进行中蓝 / 积压黄 /
|
|
727
|
+
待认领灰 / 进行中蓝 / 积压黄 / 逾期橙 / 停滞红(与行首圆点同色系)。
|
|
728
728
|
红黄蓝都是中调 ⇒ 白字两个主题都可读;灰块用「字色底 + 面色字」⇒ 明暗自动反过来 */
|
|
729
729
|
.dtl-tag--open{background:var(--dtl-fg-3);color:var(--dtl-surface-1);font-weight:600;}
|
|
730
730
|
.dtl-tag--doing{background:var(--dtl-business);color:var(--dtl-on-signal);font-weight:600;}
|
|
@@ -1088,7 +1088,7 @@ body[data-ds-dark-theme]{
|
|
|
1088
1088
|
* + **执行人列**(原状态位,有执行人才摆 `@名字` 标签)+ 最右「@创建人 创建于 年-月-日 时:分:秒」
|
|
1089
1089
|
* (悬停掉时分秒并让位给操作钮)+ 查看。
|
|
1090
1090
|
* 状态一律**标签型、五色**(用户 2026-10-18:原来是一排素字 / pill,现在与人员**位置互换**):
|
|
1091
|
-
* 灰=待认领 / 蓝=进行中 / 黄=积压 /
|
|
1091
|
+
* 灰=待认领 / 蓝=进行中 / 黄=积压 / 橙=逾期 / 红=停滞;三个异常标签悬停给**配置出来的**
|
|
1092
1092
|
* 阈值解释(staleDays / overdueDays / backlogDays 由 host 下发)。圆点颜色同色系。
|
|
1093
1093
|
*
|
|
1094
1094
|
* 按钮(含查看)**不各判各的**:权限一律问 `resolveActions()`(rows.ts),本文件只按返回值画。
|
|
@@ -1101,7 +1101,8 @@ body[data-ds-dark-theme]{
|
|
|
1101
1101
|
const title = row.record.workpackage ?? row.record.summary;
|
|
1102
1102
|
return title !== void 0 && title !== "" ? title : row.record.src ?? "—";
|
|
1103
1103
|
}
|
|
1104
|
-
/** 状态语义(异常优先:停滞 >
|
|
1104
|
+
/** 状态语义(异常优先:停滞 > 逾期 > 积压;三者都是 host 按时间算出来的,不是状态)。
|
|
1105
|
+
* 只决定圆点 / 左缘色条这类**单色位**——标签可以多枚,见 MARKS。 */
|
|
1105
1106
|
function toneOf(row) {
|
|
1106
1107
|
if (row.kind !== "task") return "closed";
|
|
1107
1108
|
if (row.task.stale === true) return "stale";
|
|
@@ -1110,6 +1111,13 @@ body[data-ds-dark-theme]{
|
|
|
1110
1111
|
if (row.task.status === "open") return "open";
|
|
1111
1112
|
return "doing";
|
|
1112
1113
|
}
|
|
1114
|
+
/** 三个异常标记**可叠加**(用户 2026-10-19):一条任务能同时逾期 + 停滞,两枚标签都要摆。
|
|
1115
|
+
* 积压与逾期 / 停滞不会共存(前者是待认领,后两者是进行中),故最多 2 枚。 */
|
|
1116
|
+
const MARKS = [
|
|
1117
|
+
"backlog",
|
|
1118
|
+
"overdue",
|
|
1119
|
+
"stale"
|
|
1120
|
+
];
|
|
1113
1121
|
/** 状态文案(已结案没有在办状态 ⇒ 不给标签)。 */
|
|
1114
1122
|
function statusLabel(tone, t) {
|
|
1115
1123
|
if (tone === "stale") return t("statusStale");
|
|
@@ -1195,12 +1203,13 @@ body[data-ds-dark-theme]{
|
|
|
1195
1203
|
tip: tip ?? detailTip(which)
|
|
1196
1204
|
});
|
|
1197
1205
|
};
|
|
1198
|
-
const
|
|
1199
|
-
const
|
|
1206
|
+
const markTones = isTask ? MARKS.filter((which) => row.task[which] === true) : [];
|
|
1207
|
+
const statusTags = tone === "closed" ? [] : (markTones.length > 0 ? markTones : [tone]).map((which) => tagOf(which));
|
|
1208
|
+
const alarmTags = markTones.map((which) => tagOf(which));
|
|
1200
1209
|
const titleLine = (0, react.createElement)("div", { className: "dtl-taskrow__l1" }, (0, react.createElement)("span", {
|
|
1201
1210
|
className: "dtl-taskrow__title dtl-ellipsis",
|
|
1202
1211
|
title: titleOf(row)
|
|
1203
|
-
}, titleOf(row)), createdDay === null ? null : (0, react.createElement)("span", { className: "dtl-taskrow__stamp" }, `[${t("fieldCreatedStamp", { day: createdDay })}]`),
|
|
1212
|
+
}, titleOf(row)), createdDay === null ? null : (0, react.createElement)("span", { className: "dtl-taskrow__stamp" }, `[${t("fieldCreatedStamp", { day: createdDay })}]`), ...alarmTags);
|
|
1204
1213
|
const orowTitleLine = (0, react.createElement)("div", { className: "dtl-orow__title" }, (0, react.createElement)("span", {
|
|
1205
1214
|
className: "dtl-orow__name dtl-ellipsis",
|
|
1206
1215
|
title: titleOf(row)
|
|
@@ -1216,7 +1225,7 @@ body[data-ds-dark-theme]{
|
|
|
1216
1225
|
who: String(owner),
|
|
1217
1226
|
when: startedOk ? formatDateTime(String(row.task.started)) : t("timeUnknown")
|
|
1218
1227
|
});
|
|
1219
|
-
const tagLine = (0, react.createElement)("div", { className: "dtl-orow__tags" },
|
|
1228
|
+
const tagLine = (0, react.createElement)("div", { className: "dtl-orow__tags" }, ...statusTags, tags.map((tag) => (0, react.createElement)(Tag, {
|
|
1220
1229
|
key: tag,
|
|
1221
1230
|
text: `#${tag}`
|
|
1222
1231
|
})));
|
|
@@ -1332,7 +1341,6 @@ body[data-ds-dark-theme]{
|
|
|
1332
1341
|
value: id,
|
|
1333
1342
|
label: title
|
|
1334
1343
|
}))], [board, t]);
|
|
1335
|
-
const days = (value) => value === null || value === void 0 ? t("daysNone") : t("daysValue", { n: value });
|
|
1336
1344
|
/** 统计卡:纯展示(用户 2026-10-17:先全去掉点击,界面定稿后再议滚动 / 筛选联动)。 */
|
|
1337
1345
|
const card = (label, value, hint, title) => (0, react.createElement)(StatCard, {
|
|
1338
1346
|
label: t(label),
|
|
@@ -1414,7 +1422,7 @@ body[data-ds-dark-theme]{
|
|
|
1414
1422
|
}, state.refreshing ? t("refreshing") : t("refresh")))), tab === "stats" ? (0, react.createElement)("div", { style: hintStyle }, t("statsPlaceholder")) : (0, react.createElement)("div", null, stats === void 0 ? null : (0, react.createElement)("div", {
|
|
1415
1423
|
className: "dtl-stats",
|
|
1416
1424
|
style: statsRowStyle
|
|
1417
|
-
}, (0, react.createElement)("div", { className: "dtl-stats__cards" }, card("statMyActive", stats.myActive, t("
|
|
1425
|
+
}, (0, react.createElement)("div", { className: "dtl-stats__cards" }, card("statMyActive", stats.myActive, [stats.myOverdue > 0 ? t("statMyOverdueHint", { n: stats.myOverdue }) : null, stats.myStale > 0 ? t("statMyStaleHint", { n: stats.myStale }) : null].filter((part) => part !== null).join(" | ")), card("statDoing", stats.doing, stats.doing - stats.myActive > 0 ? t("statDoingHint", { n: stats.doing - stats.myActive }) : t("statDoingAllMine")), card("statOpen", stats.open, stats.oldestOpenDays === null ? "" : t("statOpenHint", { n: stats.oldestOpenDays })), card("statBacklog", stats.backlog, stats.backlog > 0 && stats.open > 0 ? t("statBacklogHint", { n: Math.round(stats.backlog / stats.open * 100) }) : "", t("statBacklogTitle", { n: stats.backlogDays })), card("statOverdue", stats.overdue, stats.maxOverdueAge === null ? "" : t("statOverdueHint", { n: stats.maxOverdueAge }), t("statOverdueTitle", { n: stats.overdueDays })), card("statStale", stats.stale, stats.maxStaleIdle === null ? "" : t("statStaleHint", { n: stats.maxStaleIdle }), t("statStaleTitle", { n: stats.staleDays })), periodCard("statWeekDone", periods?.thisWeek), periodCard("statLastWeekDone", periods?.lastWeek)), (0, react.createElement)("div", {
|
|
1418
1426
|
className: "dtl-card",
|
|
1419
1427
|
style: chartCardStyle
|
|
1420
1428
|
}, (0, react.createElement)("div", { style: {
|
|
@@ -1598,7 +1606,7 @@ body[data-ds-dark-theme]{
|
|
|
1598
1606
|
}
|
|
1599
1607
|
/** 一个工作区分组(全部待办表格段):段头(点+名+统计)→ 列头行 → 任务行。
|
|
1600
1608
|
* 统计口径(用户 2026-10-18):共 N|待办 N|进行中 N 常显(0 也显);
|
|
1601
|
-
* 积压 /
|
|
1609
|
+
* 积压 / 逾期 / 停滞**只在 >0 时出现**。 */
|
|
1602
1610
|
function WorkspaceGroupView(props) {
|
|
1603
1611
|
const { t, group, board } = props;
|
|
1604
1612
|
const [open, setOpen] = (0, react.useState)(group.rows.length <= GROUP_COLLAPSE_OVER);
|
|
@@ -1647,22 +1655,25 @@ body[data-ds-dark-theme]{
|
|
|
1647
1655
|
degradedItem: "{title}:{message}",
|
|
1648
1656
|
statsPlaceholder: "统计报表尚未开建(另立任务):这里以后放分类分布、按人完成数、时间线。",
|
|
1649
1657
|
statMyActive: "我的待办",
|
|
1650
|
-
|
|
1658
|
+
statMyOverdueHint: "逾期 {n}",
|
|
1659
|
+
statMyStaleHint: "停滞 {n}",
|
|
1651
1660
|
statOpen: "待认领",
|
|
1652
|
-
statOpenHint: "
|
|
1661
|
+
statOpenHint: "最长等待 {n} 天",
|
|
1653
1662
|
statDoing: "进行中",
|
|
1654
|
-
statDoingHint: "
|
|
1663
|
+
statDoingHint: "他人在办 {n}",
|
|
1664
|
+
statDoingAllMine: "均为我负责",
|
|
1655
1665
|
statBacklog: "积压",
|
|
1656
|
-
statOverdue: "
|
|
1666
|
+
statOverdue: "逾期",
|
|
1657
1667
|
statStale: "停滞",
|
|
1658
|
-
statBacklogHint: "
|
|
1659
|
-
|
|
1668
|
+
statBacklogHint: "占待认领 {n}%",
|
|
1669
|
+
statOverdueHint: "最长 {n} 天未结",
|
|
1670
|
+
statStaleHint: "最长 {n} 天未更新",
|
|
1660
1671
|
statStaleTitle: "停滞 = 进行中满 {n} 天没更新",
|
|
1661
|
-
statOverdueTitle: "
|
|
1672
|
+
statOverdueTitle: "逾期 = 认领后满 {n} 天还没结案",
|
|
1662
1673
|
statBacklogTitle: "积压 = 待认领满 {n} 天没人接",
|
|
1663
1674
|
statWeekDone: "本周完成",
|
|
1664
1675
|
statLastWeekDone: "上周完成",
|
|
1665
|
-
statCreatedHint: "新增 {n}
|
|
1676
|
+
statCreatedHint: "新增 {n}",
|
|
1666
1677
|
daysNone: "—",
|
|
1667
1678
|
daysValue: "{n} 天",
|
|
1668
1679
|
chartTitle: "近 8 周",
|
|
@@ -1687,12 +1698,12 @@ body[data-ds-dark-theme]{
|
|
|
1687
1698
|
statusActive: "进行中",
|
|
1688
1699
|
statusOpen: "待认领",
|
|
1689
1700
|
statusBacklog: "积压",
|
|
1690
|
-
statusOverdue: "
|
|
1701
|
+
statusOverdue: "逾期",
|
|
1691
1702
|
statusStale: "停滞",
|
|
1692
1703
|
tipOpen: "任务创建于 {created}\n尚未有人认领",
|
|
1693
1704
|
tipBacklog: "任务创建于 {created}\n无人认领已满 {d}",
|
|
1694
1705
|
tipDoing: "{who}\n开始执行:{started}\n最后更新:{updated}",
|
|
1695
|
-
tipOverdue: "{who}\n开始执行:{started}\n最后更新:{updated}\n
|
|
1706
|
+
tipOverdue: "{who}\n开始执行:{started}\n最后更新:{updated}\n已逾期 {d}",
|
|
1696
1707
|
tipStale: "{who}\n开始执行:{started}\n最后更新:{updated}\n已停滞 {d}",
|
|
1697
1708
|
workspaceLabel: "工作区",
|
|
1698
1709
|
workspaceAll: "全部工作区",
|
|
@@ -1704,7 +1715,7 @@ body[data-ds-dark-theme]{
|
|
|
1704
1715
|
groupOpen: "待办 {n} 条",
|
|
1705
1716
|
groupDoing: "进行中 {n} 条",
|
|
1706
1717
|
groupBacklog: "积压 {n} 条",
|
|
1707
|
-
groupOverdue: "
|
|
1718
|
+
groupOverdue: "逾期 {n} 条",
|
|
1708
1719
|
groupStale: "停滞 {n} 条",
|
|
1709
1720
|
colTask: "任务",
|
|
1710
1721
|
colCreator: "创建人",
|
|
@@ -1769,16 +1780,19 @@ body[data-ds-dark-theme]{
|
|
|
1769
1780
|
degradedItem: "{title}: {message}",
|
|
1770
1781
|
statsPlaceholder: "Stats reports are not built yet (separate task): category breakdown, completions by person, timeline.",
|
|
1771
1782
|
statMyActive: "My todos",
|
|
1772
|
-
|
|
1783
|
+
statMyOverdueHint: "overdue {n}",
|
|
1784
|
+
statMyStaleHint: "stale {n}",
|
|
1773
1785
|
statOpen: "Unclaimed",
|
|
1774
|
-
statOpenHint: "longest
|
|
1786
|
+
statOpenHint: "longest waiting {n} days",
|
|
1775
1787
|
statDoing: "In progress",
|
|
1776
|
-
statDoingHint: "
|
|
1788
|
+
statDoingHint: "others: {n}",
|
|
1789
|
+
statDoingAllMine: "all mine",
|
|
1777
1790
|
statBacklog: "Backlog",
|
|
1778
1791
|
statOverdue: "Overdue",
|
|
1779
1792
|
statStale: "Stale",
|
|
1780
|
-
statBacklogHint: "{n} unclaimed
|
|
1781
|
-
|
|
1793
|
+
statBacklogHint: "{n}% of unclaimed",
|
|
1794
|
+
statOverdueHint: "longest {n} days open",
|
|
1795
|
+
statStaleHint: "longest {n} days idle",
|
|
1782
1796
|
statStaleTitle: "stale = active with no update for {n}+ days",
|
|
1783
1797
|
statOverdueTitle: "overdue = claimed {n}+ days ago and still open",
|
|
1784
1798
|
statBacklogTitle: "backlog = unclaimed for {n}+ days",
|
|
@@ -1814,7 +1828,7 @@ body[data-ds-dark-theme]{
|
|
|
1814
1828
|
tipOpen: "Created on {created}\nNot claimed yet",
|
|
1815
1829
|
tipBacklog: "Created on {created}\nUnclaimed for {d}",
|
|
1816
1830
|
tipDoing: "{who}\nStarted: {started}\nLast updated: {updated}",
|
|
1817
|
-
tipOverdue: "{who}\nStarted: {started}\nLast updated: {updated}\
|
|
1831
|
+
tipOverdue: "{who}\nStarted: {started}\nLast updated: {updated}\nOverdue by {d}",
|
|
1818
1832
|
tipStale: "{who}\nStarted: {started}\nLast updated: {updated}\nStalled for {d}",
|
|
1819
1833
|
workspaceLabel: "Workspace",
|
|
1820
1834
|
workspaceAll: "All workspaces",
|