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 CHANGED
@@ -202,7 +202,7 @@ window.__ModuleLoader__.load({
202
202
  finish: false,
203
203
  release: false
204
204
  };
205
- /** 状态档命中(积压 / 超期 / 停滞由 host 标记,前端不判阈值)——只作用于第二区。 */
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
- /** 状态语义(异常优先:停滞 > 超期 > 积压;三者都是 host 按时间算出来的,不是状态)。 */
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 statusTag = tone === "closed" ? null : tagOf(tone);
1199
- const alarmTag = tone === "backlog" || tone === "overdue" || tone === "stale" ? tagOf(tone) : null;
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 })}]`), alarmTag);
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" }, statusTag, tags.map((tag) => (0, react.createElement)(Tag, {
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("statMyActiveHint", { n: stats.myOverdue })), card("statDoing", stats.doing, t("statDoingHint", { n: stats.doing - stats.myActive })), card("statOpen", stats.open, t("statOpenHint", { n: days(stats.oldestOpenDays) })), card("statBacklog", stats.backlog, t("statBacklogHint", { n: stats.open }), t("statBacklogTitle", { n: stats.backlogDays })), card("statOverdue", stats.overdue, t("statDoingTotalHint", { n: stats.doing }), t("statOverdueTitle", { n: stats.overdueDays })), card("statStale", stats.stale, t("statDoingTotalHint", { n: stats.doing }), t("statStaleTitle", { n: stats.staleDays })), periodCard("statWeekDone", periods?.thisWeek), periodCard("statLastWeekDone", periods?.lastWeek)), (0, react.createElement)("div", {
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
- * 积压 / 超期 / 停滞**只在 >0 时出现**。 */
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
- statMyActiveHint: "超期 {n} 条",
1658
+ statMyOverdueHint: "逾期 {n}",
1659
+ statMyStaleHint: "停滞 {n}",
1651
1660
  statOpen: "待认领",
1652
- statOpenHint: "最长未认领 {n}",
1661
+ statOpenHint: "最长等待 {n} 天",
1653
1662
  statDoing: "进行中",
1654
- statDoingHint: "其他成员负责 {n} 条",
1663
+ statDoingHint: "他人在办 {n}",
1664
+ statDoingAllMine: "均为我负责",
1655
1665
  statBacklog: "积压",
1656
- statOverdue: "超期",
1666
+ statOverdue: "逾期",
1657
1667
  statStale: "停滞",
1658
- statBacklogHint: "待认领共 {n} 条",
1659
- statDoingTotalHint: "进行中共 {n} 条",
1668
+ statBacklogHint: "占待认领 {n}%",
1669
+ statOverdueHint: "最长 {n} 天未结",
1670
+ statStaleHint: "最长 {n} 天未更新",
1660
1671
  statStaleTitle: "停滞 = 进行中满 {n} 天没更新",
1661
- statOverdueTitle: "超期 = 认领后满 {n} 天还没结案",
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任务已开始 {d}",
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: "超期 {n} 条",
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
- statMyActiveHint: "overdue {n}",
1783
+ statMyOverdueHint: "overdue {n}",
1784
+ statMyStaleHint: "stale {n}",
1773
1785
  statOpen: "Unclaimed",
1774
- statOpenHint: "longest unclaimed {n}",
1786
+ statOpenHint: "longest waiting {n} days",
1775
1787
  statDoing: "In progress",
1776
- statDoingHint: "owned by other members: {n}",
1788
+ statDoingHint: "others: {n}",
1789
+ statDoingAllMine: "all mine",
1777
1790
  statBacklog: "Backlog",
1778
1791
  statOverdue: "Overdue",
1779
1792
  statStale: "Stale",
1780
- statBacklogHint: "{n} unclaimed in total",
1781
- statDoingTotalHint: "{n} in progress in total",
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}\nActive for {d}",
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",