dsh-task-ledger 0.0.67 → 0.0.69

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),
@@ -1341,6 +1349,8 @@ body[data-ds-dark-theme]{
1341
1349
  title,
1342
1350
  interactive: false
1343
1351
  });
1352
+ /** 子集卡占比小字:分母为 0 或自己没有 ⇒ 不显示(不拿 0% 充数)。 */
1353
+ const share = (part, whole, key) => part > 0 && whole > 0 ? t(key, { n: Math.round(part / whole * 100) }) : "";
1344
1354
  /** 统计台卡:不可点(首页没有已结案可筛),hover 给具体日期区间。
1345
1355
  * 趋势未到 / 读挂 ⇒ 数字留 '—'(StatCard 对 0 的处理)、小字整条不显示,**不拿 0 充数**。 */
1346
1356
  const periodCard = (label, period) => (0, react.createElement)(StatCard, {
@@ -1414,7 +1424,7 @@ body[data-ds-dark-theme]{
1414
1424
  }, 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
1425
  className: "dtl-stats",
1416
1426
  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", {
1427
+ }, (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, share(stats.backlog, stats.open, "statBacklogHint"), t("statBacklogTitle", { n: stats.backlogDays })), card("statOverdue", stats.overdue, share(stats.overdue, stats.doing, "statOverdueHint"), t("statOverdueTitle", { n: stats.overdueDays })), card("statStale", stats.stale, share(stats.stale, stats.doing, "statStaleHint"), t("statStaleTitle", { n: stats.staleDays })), periodCard("statWeekDone", periods?.thisWeek), periodCard("statLastWeekDone", periods?.lastWeek)), (0, react.createElement)("div", {
1418
1428
  className: "dtl-card",
1419
1429
  style: chartCardStyle
1420
1430
  }, (0, react.createElement)("div", { style: {
@@ -1598,7 +1608,7 @@ body[data-ds-dark-theme]{
1598
1608
  }
1599
1609
  /** 一个工作区分组(全部待办表格段):段头(点+名+统计)→ 列头行 → 任务行。
1600
1610
  * 统计口径(用户 2026-10-18):共 N|待办 N|进行中 N 常显(0 也显);
1601
- * 积压 / 超期 / 停滞**只在 >0 时出现**。 */
1611
+ * 积压 / 逾期 / 停滞**只在 >0 时出现**。 */
1602
1612
  function WorkspaceGroupView(props) {
1603
1613
  const { t, group, board } = props;
1604
1614
  const [open, setOpen] = (0, react.useState)(group.rows.length <= GROUP_COLLAPSE_OVER);
@@ -1647,22 +1657,25 @@ body[data-ds-dark-theme]{
1647
1657
  degradedItem: "{title}:{message}",
1648
1658
  statsPlaceholder: "统计报表尚未开建(另立任务):这里以后放分类分布、按人完成数、时间线。",
1649
1659
  statMyActive: "我的待办",
1650
- statMyActiveHint: "超期 {n} 条",
1660
+ statMyOverdueHint: "逾期 {n}",
1661
+ statMyStaleHint: "停滞 {n}",
1651
1662
  statOpen: "待认领",
1652
- statOpenHint: "最长未认领 {n}",
1663
+ statOpenHint: "最长等待 {n} 天",
1653
1664
  statDoing: "进行中",
1654
- statDoingHint: "其他成员负责 {n} 条",
1665
+ statDoingHint: "他人在办 {n}",
1666
+ statDoingAllMine: "均为我负责",
1655
1667
  statBacklog: "积压",
1656
- statOverdue: "超期",
1668
+ statOverdue: "逾期",
1657
1669
  statStale: "停滞",
1658
- statBacklogHint: "待认领共 {n} 条",
1659
- statDoingTotalHint: "进行中共 {n} 条",
1670
+ statBacklogHint: "占待认领 {n}%",
1671
+ statOverdueHint: "占进行中 {n}%",
1672
+ statStaleHint: "占进行中 {n}%",
1660
1673
  statStaleTitle: "停滞 = 进行中满 {n} 天没更新",
1661
- statOverdueTitle: "超期 = 认领后满 {n} 天还没结案",
1674
+ statOverdueTitle: "逾期 = 认领后满 {n} 天还没结案",
1662
1675
  statBacklogTitle: "积压 = 待认领满 {n} 天没人接",
1663
1676
  statWeekDone: "本周完成",
1664
1677
  statLastWeekDone: "上周完成",
1665
- statCreatedHint: "新增 {n} 条",
1678
+ statCreatedHint: "新增 {n}",
1666
1679
  daysNone: "—",
1667
1680
  daysValue: "{n} 天",
1668
1681
  chartTitle: "近 8 周",
@@ -1687,12 +1700,12 @@ body[data-ds-dark-theme]{
1687
1700
  statusActive: "进行中",
1688
1701
  statusOpen: "待认领",
1689
1702
  statusBacklog: "积压",
1690
- statusOverdue: "超期",
1703
+ statusOverdue: "逾期",
1691
1704
  statusStale: "停滞",
1692
1705
  tipOpen: "任务创建于 {created}\n尚未有人认领",
1693
1706
  tipBacklog: "任务创建于 {created}\n无人认领已满 {d}",
1694
1707
  tipDoing: "{who}\n开始执行:{started}\n最后更新:{updated}",
1695
- tipOverdue: "{who}\n开始执行:{started}\n最后更新:{updated}\n任务已开始 {d}",
1708
+ tipOverdue: "{who}\n开始执行:{started}\n最后更新:{updated}\n已逾期 {d}",
1696
1709
  tipStale: "{who}\n开始执行:{started}\n最后更新:{updated}\n已停滞 {d}",
1697
1710
  workspaceLabel: "工作区",
1698
1711
  workspaceAll: "全部工作区",
@@ -1704,7 +1717,7 @@ body[data-ds-dark-theme]{
1704
1717
  groupOpen: "待办 {n} 条",
1705
1718
  groupDoing: "进行中 {n} 条",
1706
1719
  groupBacklog: "积压 {n} 条",
1707
- groupOverdue: "超期 {n} 条",
1720
+ groupOverdue: "逾期 {n} 条",
1708
1721
  groupStale: "停滞 {n} 条",
1709
1722
  colTask: "任务",
1710
1723
  colCreator: "创建人",
@@ -1769,16 +1782,19 @@ body[data-ds-dark-theme]{
1769
1782
  degradedItem: "{title}: {message}",
1770
1783
  statsPlaceholder: "Stats reports are not built yet (separate task): category breakdown, completions by person, timeline.",
1771
1784
  statMyActive: "My todos",
1772
- statMyActiveHint: "overdue {n}",
1785
+ statMyOverdueHint: "overdue {n}",
1786
+ statMyStaleHint: "stale {n}",
1773
1787
  statOpen: "Unclaimed",
1774
- statOpenHint: "longest unclaimed {n}",
1788
+ statOpenHint: "longest waiting {n} days",
1775
1789
  statDoing: "In progress",
1776
- statDoingHint: "owned by other members: {n}",
1790
+ statDoingHint: "others: {n}",
1791
+ statDoingAllMine: "all mine",
1777
1792
  statBacklog: "Backlog",
1778
1793
  statOverdue: "Overdue",
1779
1794
  statStale: "Stale",
1780
- statBacklogHint: "{n} unclaimed in total",
1781
- statDoingTotalHint: "{n} in progress in total",
1795
+ statBacklogHint: "{n}% of unclaimed",
1796
+ statOverdueHint: "{n}% of active",
1797
+ statStaleHint: "{n}% of active",
1782
1798
  statStaleTitle: "stale = active with no update for {n}+ days",
1783
1799
  statOverdueTitle: "overdue = claimed {n}+ days ago and still open",
1784
1800
  statBacklogTitle: "backlog = unclaimed for {n}+ days",
@@ -1814,7 +1830,7 @@ body[data-ds-dark-theme]{
1814
1830
  tipOpen: "Created on {created}\nNot claimed yet",
1815
1831
  tipBacklog: "Created on {created}\nUnclaimed for {d}",
1816
1832
  tipDoing: "{who}\nStarted: {started}\nLast updated: {updated}",
1817
- tipOverdue: "{who}\nStarted: {started}\nLast updated: {updated}\nActive for {d}",
1833
+ tipOverdue: "{who}\nStarted: {started}\nLast updated: {updated}\nOverdue by {d}",
1818
1834
  tipStale: "{who}\nStarted: {started}\nLast updated: {updated}\nStalled for {d}",
1819
1835
  workspaceLabel: "Workspace",
1820
1836
  workspaceAll: "All workspaces",