dsh-group-status 0.2.2 → 0.3.0
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/CHANGELOG.md +53 -0
- package/README.en.md +36 -18
- package/README.md +39 -19
- package/lib/client.js +659 -300
- package/lib/client.js.map +1 -1
- package/lib/index.js +22 -9
- package/lib/types/client/BadgeSettingsCard.d.ts +24 -0
- package/lib/types/client/BadgeSettingsCard.d.ts.map +1 -0
- package/lib/types/client/BadgeSettingsCard.js +73 -0
- package/lib/types/client/BadgeSettingsCard.js.map +1 -0
- package/lib/types/client/badge-field.d.ts +44 -0
- package/lib/types/client/badge-field.d.ts.map +1 -0
- package/lib/types/client/badge-field.js +77 -0
- package/lib/types/client/badge-field.js.map +1 -0
- package/lib/types/client/badge-labels.d.ts +92 -0
- package/lib/types/client/badge-labels.d.ts.map +1 -0
- package/lib/types/client/badge-labels.js +150 -0
- package/lib/types/client/badge-labels.js.map +1 -0
- package/lib/types/client/badge-settings.d.ts +31 -3
- package/lib/types/client/badge-settings.d.ts.map +1 -1
- package/lib/types/client/badge-settings.js +50 -6
- package/lib/types/client/badge-settings.js.map +1 -1
- package/lib/types/client/facet-store.d.ts +46 -0
- package/lib/types/client/facet-store.d.ts.map +1 -0
- package/lib/types/client/facet-store.js +123 -0
- package/lib/types/client/facet-store.js.map +1 -0
- package/lib/types/client/facet-visibility.d.ts +17 -0
- package/lib/types/client/facet-visibility.d.ts.map +1 -0
- package/lib/types/client/facet-visibility.js +18 -0
- package/lib/types/client/facet-visibility.js.map +1 -0
- package/lib/types/client/facets.d.ts +265 -0
- package/lib/types/client/facets.d.ts.map +1 -0
- package/lib/types/client/facets.js +209 -0
- package/lib/types/client/facets.js.map +1 -0
- package/lib/types/client/group-status.d.ts +97 -45
- package/lib/types/client/group-status.d.ts.map +1 -1
- package/lib/types/client/group-status.js +148 -85
- package/lib/types/client/group-status.js.map +1 -1
- package/lib/types/client/index.d.ts +25 -0
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/index.js +59 -1
- package/lib/types/client/index.js.map +1 -1
- package/lib/types/client/legacy/bridge.d.ts +30 -0
- package/lib/types/client/legacy/bridge.d.ts.map +1 -0
- package/lib/types/client/legacy/bridge.js +58 -0
- package/lib/types/client/legacy/bridge.js.map +1 -0
- package/lib/types/client/legacy/register-legacy-facets.d.ts +14 -0
- package/lib/types/client/legacy/register-legacy-facets.d.ts.map +1 -0
- package/lib/types/client/legacy/register-legacy-facets.js +77 -0
- package/lib/types/client/legacy/register-legacy-facets.js.map +1 -0
- package/lib/types/client/legacy/schedule.d.ts +49 -0
- package/lib/types/client/legacy/schedule.d.ts.map +1 -0
- package/lib/types/client/legacy/schedule.js +73 -0
- package/lib/types/client/legacy/schedule.js.map +1 -0
- package/lib/types/client/legacy/store-source.d.ts +78 -0
- package/lib/types/client/legacy/store-source.d.ts.map +1 -0
- package/lib/types/client/legacy/store-source.js +82 -0
- package/lib/types/client/legacy/store-source.js.map +1 -0
- package/lib/types/client/legacy/waiting-review.d.ts +85 -0
- package/lib/types/client/legacy/waiting-review.d.ts.map +1 -0
- package/lib/types/client/legacy/waiting-review.js +179 -0
- package/lib/types/client/legacy/waiting-review.js.map +1 -0
- package/lib/types/client/locales.d.ts +46 -4
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +46 -4
- package/lib/types/client/locales.js.map +1 -1
- package/lib/types/client/rows/GroupBadge.d.ts +19 -25
- package/lib/types/client/rows/GroupBadge.d.ts.map +1 -1
- package/lib/types/client/rows/GroupBadge.js +45 -106
- package/lib/types/client/rows/GroupBadge.js.map +1 -1
- package/lib/types/client/rows/Rows.d.ts +7 -3
- package/lib/types/client/rows/Rows.d.ts.map +1 -1
- package/lib/types/client/rows/Rows.js +6 -6
- package/lib/types/client/rows/Rows.js.map +1 -1
- package/lib/types/client/rows/WorkspaceBrowser.d.ts.map +1 -1
- package/lib/types/client/rows/WorkspaceBrowser.js +21 -21
- package/lib/types/client/rows/WorkspaceBrowser.js.map +1 -1
- package/lib/types/client/tree.d.ts +2 -5
- package/lib/types/client/tree.d.ts.map +1 -1
- package/lib/types/client/tree.js +0 -5
- package/lib/types/client/tree.js.map +1 -1
- package/lib/types/index.d.ts +31 -1
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +13 -1
- package/lib/types/index.js.map +1 -1
- package/package.json +1 -5
package/lib/index.js
CHANGED
|
@@ -23,16 +23,29 @@ const name = "dsh-group-status";
|
|
|
23
23
|
* 并把保存结果回灌到条目配置。浏览器半通过 `configForms.get('dsh-group-status')`
|
|
24
24
|
* 读取同一份文档,改完即时生效、无需刷新。
|
|
25
25
|
*
|
|
26
|
-
*
|
|
26
|
+
* 全部可选且带默认值:未配置时即开箱即用(所有来源默认显示)。
|
|
27
27
|
*/
|
|
28
|
-
const Config = Schema.object({
|
|
29
|
-
/**
|
|
30
|
-
* 折叠分组徽标是否显示「已完成」绿点。
|
|
31
|
-
*
|
|
32
|
-
* 关闭后 `done` 既不画绿点,也不计入徽标数字与 hover 明细里的分组聚合行
|
|
33
|
-
* (会话行自身的绿点不受影响——那是行级状态,不是分组提示)。
|
|
34
|
-
*/
|
|
35
|
-
showCompletedInBadge: Schema.boolean().default(true)
|
|
28
|
+
const Config = Schema.object({
|
|
29
|
+
/**
|
|
30
|
+
* 折叠分组徽标是否显示「已完成」绿点。
|
|
31
|
+
*
|
|
32
|
+
* 关闭后 `done` 既不画绿点,也不计入徽标数字与 hover 明细里的分组聚合行
|
|
33
|
+
* (会话行自身的绿点不受影响——那是行级状态,不是分组提示)。
|
|
34
|
+
*/
|
|
35
|
+
showCompletedInBadge: Schema.boolean().default(true),
|
|
36
|
+
/** 折叠分组徽标是否显示「进行中」转圈(含子智能体)。 */
|
|
37
|
+
showRunningInBadge: Schema.boolean().default(true),
|
|
38
|
+
/** 折叠分组徽标是否显示「待审批」黄点(approval / plan-review / question)。 */
|
|
39
|
+
showPendingInBadge: Schema.boolean().default(true),
|
|
40
|
+
/** 折叠分组徽标是否显示「定时任务」时钟图标(数据来自 dsh-later)。 */
|
|
41
|
+
showScheduledInBadge: Schema.boolean().default(true),
|
|
42
|
+
/** 折叠分组徽标是否显示「等待评审」沙漏图标(数据来自 dsh-gitea-dispatch)。 */
|
|
43
|
+
showWaitingReviewInBadge: Schema.boolean().default(true),
|
|
44
|
+
/** 悬停卡里是否显示聚合明细行("1 等待回答 · 1 进行中…")。 */
|
|
45
|
+
showHoverDetails: Schema.boolean().default(true),
|
|
46
|
+
/** 徽标数字显示阈值:数量 >= 此值时才显示数字(默认 2,即 count=1 时省略)。 */
|
|
47
|
+
countThreshold: Schema.number().default(2)
|
|
48
|
+
}).volatile();
|
|
36
49
|
/**
|
|
37
50
|
* Host plugin body. Cordis passes `(ctx, config)`; only the Config matters here
|
|
38
51
|
* and even that is read by the browser half, not here — the body stays empty so
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { JSX } from 'react';
|
|
2
|
+
import { type SettingsFormScope } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
3
|
+
import type { WorkspaceKey } from './locales.ts';
|
|
4
|
+
/**
|
|
5
|
+
* 卡片 props:宿主设置表单 + 本命名空间文案取值器。
|
|
6
|
+
*
|
|
7
|
+
* `scope` 直接用官方 `SettingsFormScope`(= `configForms.get(条目 id)` 的运行时形状:
|
|
8
|
+
* `getSnapshot` / `subscribe` / `mutate`),因此不需要本地复刻契约,也就不会与宿主漂移。
|
|
9
|
+
* `locale: NS` 由框架按声明注入 `t`。
|
|
10
|
+
*/
|
|
11
|
+
export interface BadgeSettingsCardProps {
|
|
12
|
+
readonly scope: SettingsFormScope<Record<string, unknown>>;
|
|
13
|
+
readonly t: (key: WorkspaceKey) => string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 渲染折叠徽标的设置表单。
|
|
17
|
+
*
|
|
18
|
+
* 模型与投影都按 `scope` 记忆:宿主换一份表单(条目重新服务)时整体重建,旧模型
|
|
19
|
+
* 在 effect 清理里 `dispose()`,不会留下悬挂订阅。
|
|
20
|
+
* @param props - 宿主设置表单与文案取值器。
|
|
21
|
+
* @returns 官方表单框架包着本插件的开关字段。
|
|
22
|
+
*/
|
|
23
|
+
export declare function BadgeSettingsCard({ scope, t }: BadgeSettingsCardProps): JSX.Element;
|
|
24
|
+
//# sourceMappingURL=BadgeSettingsCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BadgeSettingsCard.d.ts","sourceRoot":"","sources":["../../../src/client/BadgeSettingsCard.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAChC,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uCAAuC,CAAA;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAGhD;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC1D,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,CAAA;CAC1C;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,sBAAsB,GAAG,GAAG,CAAC,OAAO,CA2DnF"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* 折叠徽标的设置卡片:插件 → dsh-group-status(bundle 详情页的配置表单)。
|
|
4
|
+
*
|
|
5
|
+
* 为什么需要这张卡片:0.2.0 起宿主把插件 `Config`(`src/index.ts`,根节点
|
|
6
|
+
* `.volatile()`)投影到客户端 `configForms` 服务上,但**不会**自动把表单画进
|
|
7
|
+
* 「插件」页——插件页只在客户端往 `plugins.bundle.config` 注册了卡片时才渲染
|
|
8
|
+
* (见 dsh-later / dsh-gitea-dispatch 的同款做法)。没有它,README「设置项」一节
|
|
9
|
+
* 描述的配置表单在 GUI 里根本不存在。
|
|
10
|
+
*
|
|
11
|
+
* 视觉与交互**不自造**,全部交给官方组件(`@deepseek-ai/dsh-client-ui-primitives`):
|
|
12
|
+
* - `SettingsForm`:表单框架——只读提示、不可用提示、保存按钮、失败行、间距;
|
|
13
|
+
* - `SettingsFormModel`:分步草稿与保存(revision 围栏、宿主拒绝时不丢草稿);
|
|
14
|
+
* - `Switch`:开关本体。
|
|
15
|
+
* 官方设置页(设置 → 内置插件 → 子智能体 / 网页搜索)用的就是这三件,本卡片的
|
|
16
|
+
* 类名与取值也逐条对齐它们的 CSS(见 `BadgeSettingsCard.module.css` 头部)。
|
|
17
|
+
*
|
|
18
|
+
* 字段定义在 `badge-field.ts`(纯逻辑,可单测);这里只管把它们接到模型与槽位上。
|
|
19
|
+
*/
|
|
20
|
+
import { useEffect, useId, useMemo, useSyncExternalStore } from 'react';
|
|
21
|
+
import { SettingsForm, SettingsFormModel, Switch, } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
22
|
+
import { ALL_BADGE_FIELDS, BADGE_FIELDS, isDraftEnabled } from "./badge-field.js";
|
|
23
|
+
import css from './BadgeSettingsCard.module.css';
|
|
24
|
+
/**
|
|
25
|
+
* 渲染折叠徽标的设置表单。
|
|
26
|
+
*
|
|
27
|
+
* 模型与投影都按 `scope` 记忆:宿主换一份表单(条目重新服务)时整体重建,旧模型
|
|
28
|
+
* 在 effect 清理里 `dispose()`,不会留下悬挂订阅。
|
|
29
|
+
* @param props - 宿主设置表单与文案取值器。
|
|
30
|
+
* @returns 官方表单框架包着本插件的开关字段。
|
|
31
|
+
*/
|
|
32
|
+
export function BadgeSettingsCard({ scope, t }) {
|
|
33
|
+
const model = useMemo(() => new SettingsFormModel(scope, ALL_BADGE_FIELDS), [scope]);
|
|
34
|
+
useEffect(() => () => { model.dispose(); }, [model]);
|
|
35
|
+
// 投影:框架状态 + 所有字段的草稿。模型的 publish 会在宿主折叠或草稿变化时重算。
|
|
36
|
+
const store = useMemo(() => model.bind(() => ({
|
|
37
|
+
...model.shell(),
|
|
38
|
+
fields: ALL_BADGE_FIELDS.map(spec => ({ field: spec.field, text: model.field(spec.field).text })),
|
|
39
|
+
})), [model]);
|
|
40
|
+
const state = useSyncExternalStore(store.subscribe, store.getSnapshot);
|
|
41
|
+
const actions = useMemo(() => model.actions(), [model]);
|
|
42
|
+
const badgeSectionId = useId();
|
|
43
|
+
const hoverSectionId = useId();
|
|
44
|
+
const countSectionId = useId();
|
|
45
|
+
const labels = {
|
|
46
|
+
unavailable: t('settings.unavailable'),
|
|
47
|
+
readOnly: t('settings.readOnly'),
|
|
48
|
+
saveFailed: t('settings.saveFailed'),
|
|
49
|
+
save: t('settings.save'),
|
|
50
|
+
saving: t('settings.saving'),
|
|
51
|
+
};
|
|
52
|
+
// 按字段名查草稿文本。
|
|
53
|
+
const fieldText = (field) => {
|
|
54
|
+
const found = state.fields.find(f => f.field === field);
|
|
55
|
+
return found?.text ?? 'true';
|
|
56
|
+
};
|
|
57
|
+
return (_jsxs(SettingsForm, { labels: labels, state: state, onSave: () => { actions.save(); }, onDiscard: () => { actions.discard(); }, children: [_jsxs("section", { className: css.section, "aria-labelledby": badgeSectionId, children: [_jsx("h3", { className: css.heading, id: badgeSectionId, children: t('settings.badge.section') }), _jsx(ToggleRow, { field: BADGE_FIELDS.showRunningInBadge, text: fieldText(BADGE_FIELDS.showRunningInBadge), label: t('settings.badge.showRunning'), hint: t('settings.badge.showRunningHint'), state: state, actions: actions }), _jsx(ToggleRow, { field: BADGE_FIELDS.showPendingInBadge, text: fieldText(BADGE_FIELDS.showPendingInBadge), label: t('settings.badge.showPending'), hint: t('settings.badge.showPendingHint'), state: state, actions: actions }), _jsx(ToggleRow, { field: BADGE_FIELDS.showCompletedInBadge, text: fieldText(BADGE_FIELDS.showCompletedInBadge), label: t('settings.badge.showCompleted'), hint: t('settings.badge.showCompletedHint'), state: state, actions: actions }), _jsx(ToggleRow, { field: BADGE_FIELDS.showScheduledInBadge, text: fieldText(BADGE_FIELDS.showScheduledInBadge), label: t('settings.badge.showScheduled'), hint: t('settings.badge.showScheduledHint'), state: state, actions: actions }), _jsx(ToggleRow, { field: BADGE_FIELDS.showWaitingReviewInBadge, text: fieldText(BADGE_FIELDS.showWaitingReviewInBadge), label: t('settings.badge.showWaitingReview'), hint: t('settings.badge.showWaitingReviewHint'), state: state, actions: actions })] }), _jsxs("section", { className: css.section, "aria-labelledby": hoverSectionId, children: [_jsx("h3", { className: css.heading, id: hoverSectionId, children: t('settings.hover.section') }), _jsx(ToggleRow, { field: BADGE_FIELDS.showHoverDetails, text: fieldText(BADGE_FIELDS.showHoverDetails), label: t('settings.hover.showDetails'), hint: t('settings.hover.showDetailsHint'), state: state, actions: actions })] }), _jsxs("section", { className: css.section, "aria-labelledby": countSectionId, children: [_jsx("h3", { className: css.heading, id: countSectionId, children: t('settings.count.section') }), _jsx(NumberRow, { field: BADGE_FIELDS.countThreshold, text: fieldText(BADGE_FIELDS.countThreshold), label: t('settings.count.threshold'), hint: t('settings.count.thresholdHint'), state: state, actions: actions })] })] }));
|
|
58
|
+
}
|
|
59
|
+
/** 单行开关:label + Switch + hint。 */
|
|
60
|
+
function ToggleRow({ field, text, label, hint, state, actions }) {
|
|
61
|
+
return (_jsxs("div", { className: css.badgeField, children: [_jsxs("div", { className: css.badgeToggleRow, children: [_jsx("span", { className: css.badgeToggleLabel, children: label }), _jsx(Switch, { checked: isDraftEnabled(text), label: label, disabled: !state.writable || state.saving, onChange: next => { actions.edit(field, next ? 'true' : 'false'); } })] }), _jsx("p", { className: css.hint, children: hint })] }));
|
|
62
|
+
}
|
|
63
|
+
/** 单行数字输入:label + 带加减按钮的数字输入 + hint。 */
|
|
64
|
+
function NumberRow({ field, text, label, hint, state, actions }) {
|
|
65
|
+
const disabled = !state.writable || state.saving;
|
|
66
|
+
const currentValue = Number(text) || 0;
|
|
67
|
+
const decrement = () => { if (!disabled && currentValue > 0)
|
|
68
|
+
actions.edit(field, String(currentValue - 1)); };
|
|
69
|
+
const increment = () => { if (!disabled)
|
|
70
|
+
actions.edit(field, String(currentValue + 1)); };
|
|
71
|
+
return (_jsxs("div", { className: css.badgeField, children: [_jsxs("div", { className: css.badgeToggleRow, children: [_jsx("span", { className: css.badgeToggleLabel, children: label }), _jsxs("div", { className: css.badgeNumberControl, children: [_jsx("button", { type: "button", className: css.badgeNumberButton, disabled: disabled || currentValue <= 0, onClick: decrement, "aria-label": "\u51CF\u5C11", children: "\u2212" }), _jsx("span", { className: css.badgeNumberValue, children: text }), _jsx("button", { type: "button", className: css.badgeNumberButton, disabled: disabled, onClick: increment, "aria-label": "\u589E\u52A0", children: "+" })] })] }), _jsx("p", { className: css.hint, children: hint })] }));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=BadgeSettingsCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BadgeSettingsCard.js","sourceRoot":"","sources":["../../../src/client/BadgeSettingsCard.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 折叠徽标设置项的字段定义(纯逻辑,不碰 React / 宿主组件)。
|
|
3
|
+
*
|
|
4
|
+
* 官方设置卡片的模型(`SettingsFormModel`)把每个字段都当**草稿文本**处理:控件读
|
|
5
|
+
* `format(存储值)` 得到文本,用户编辑后 `parse(文本)` 决定这次保存写什么。布尔字段
|
|
6
|
+
* 没有现成的官方 spec(官方只提供 `settingsTextField` / `settingsNumberField`),所以
|
|
7
|
+
* 这里按同一契约写一份:文本就是 schema 的布尔字面量。
|
|
8
|
+
*
|
|
9
|
+
* 单独成文件是为了可测:`parse` 必须对非法草稿返回 `undefined`(模型据此把该字段标为
|
|
10
|
+
* invalid 并挡住保存,而不是把畸形值写下去),`format` 必须把缺失值读成默认 `true`
|
|
11
|
+
* ——与 `Config` 各字段的 schema 默认、`badge-settings.ts` 的解析同源。
|
|
12
|
+
*
|
|
13
|
+
* 类型从 primitives **type-only** 引入:编译期接住官方契约,运行时不留依赖,
|
|
14
|
+
* 测试里也就不必把那个包(及其整棵依赖闭包)拉进来。
|
|
15
|
+
*/
|
|
16
|
+
import type { SettingsFieldSpec } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
17
|
+
/** 卡片字段名(与 `src/index.ts` 的 `Config` 同名同义)。 */
|
|
18
|
+
export declare const BADGE_FIELDS: {
|
|
19
|
+
readonly showCompletedInBadge: "showCompletedInBadge";
|
|
20
|
+
readonly showRunningInBadge: "showRunningInBadge";
|
|
21
|
+
readonly showPendingInBadge: "showPendingInBadge";
|
|
22
|
+
readonly showScheduledInBadge: "showScheduledInBadge";
|
|
23
|
+
readonly showWaitingReviewInBadge: "showWaitingReviewInBadge";
|
|
24
|
+
readonly showHoverDetails: "showHoverDetails";
|
|
25
|
+
readonly countThreshold: "countThreshold";
|
|
26
|
+
};
|
|
27
|
+
/** 存储值解析成开关状态:只有显式 false 才是「关闭」。 */
|
|
28
|
+
export declare function isFieldEnabled(value: unknown): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* 草稿文本解析成开关状态:与 {@link isFieldEnabled} 不同,这里比较的是模型给的
|
|
31
|
+
* **文本**,别把字符串喂给上面那个函数(`'false' !== false` 恒真)。
|
|
32
|
+
*/
|
|
33
|
+
export declare function isDraftEnabled(text: string): boolean;
|
|
34
|
+
/** 各字段的字段转换规格。 */
|
|
35
|
+
export declare const showCompletedField: SettingsFieldSpec;
|
|
36
|
+
export declare const showRunningField: SettingsFieldSpec;
|
|
37
|
+
export declare const showPendingField: SettingsFieldSpec;
|
|
38
|
+
export declare const showScheduledField: SettingsFieldSpec;
|
|
39
|
+
export declare const showWaitingReviewField: SettingsFieldSpec;
|
|
40
|
+
export declare const showHoverDetailsField: SettingsFieldSpec;
|
|
41
|
+
export declare const countThresholdField: SettingsFieldSpec;
|
|
42
|
+
/** 所有字段规格(按卡片渲染顺序)。 */
|
|
43
|
+
export declare const ALL_BADGE_FIELDS: SettingsFieldSpec[];
|
|
44
|
+
//# sourceMappingURL=badge-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-field.d.ts","sourceRoot":"","sources":["../../../src/client/badge-field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAA;AAE9E,+CAA+C;AAC/C,eAAO,MAAM,YAAY;;;;;;;;CAQf,CAAA;AAEV,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AA2BD,kBAAkB;AAClB,eAAO,MAAM,kBAAkB,EAAE,iBAA6E,CAAA;AAC9G,eAAO,MAAM,gBAAgB,EAAE,iBAA2E,CAAA;AAC1G,eAAO,MAAM,gBAAgB,EAAE,iBAA2E,CAAA;AAC1G,eAAO,MAAM,kBAAkB,EAAE,iBAA6E,CAAA;AAC9G,eAAO,MAAM,sBAAsB,EAAE,iBAAiF,CAAA;AACtH,eAAO,MAAM,qBAAqB,EAAE,iBAAyE,CAAA;AAC7G,eAAO,MAAM,mBAAmB,EAAE,iBAajC,CAAA;AAED,uBAAuB;AACvB,eAAO,MAAM,gBAAgB,EAAE,iBAAiB,EAQ/C,CAAA"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** 卡片字段名(与 `src/index.ts` 的 `Config` 同名同义)。 */
|
|
2
|
+
export const BADGE_FIELDS = {
|
|
3
|
+
showCompletedInBadge: 'showCompletedInBadge',
|
|
4
|
+
showRunningInBadge: 'showRunningInBadge',
|
|
5
|
+
showPendingInBadge: 'showPendingInBadge',
|
|
6
|
+
showScheduledInBadge: 'showScheduledInBadge',
|
|
7
|
+
showWaitingReviewInBadge: 'showWaitingReviewInBadge',
|
|
8
|
+
showHoverDetails: 'showHoverDetails',
|
|
9
|
+
countThreshold: 'countThreshold',
|
|
10
|
+
};
|
|
11
|
+
/** 存储值解析成开关状态:只有显式 false 才是「关闭」。 */
|
|
12
|
+
export function isFieldEnabled(value) {
|
|
13
|
+
return value !== false;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 草稿文本解析成开关状态:与 {@link isFieldEnabled} 不同,这里比较的是模型给的
|
|
17
|
+
* **文本**,别把字符串喂给上面那个函数(`'false' !== false` 恒真)。
|
|
18
|
+
*/
|
|
19
|
+
export function isDraftEnabled(text) {
|
|
20
|
+
return text !== 'false';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 构造一个布尔字段的字段转换规格。
|
|
24
|
+
*
|
|
25
|
+
* `parse` 只接受 `'true'` / `'false'`:空串、任意其它文本都返回 `undefined`,
|
|
26
|
+
* 让模型把字段判为 invalid 并拒绝保存(官方模型的既定行为)。
|
|
27
|
+
*
|
|
28
|
+
* @param field - 字段名(与 Config 同名)。
|
|
29
|
+
* @param defaultValue - 缺失值时的默认(true = 默认显示,false = 默认隐藏)。
|
|
30
|
+
*/
|
|
31
|
+
function makeBooleanField(field, defaultValue) {
|
|
32
|
+
return {
|
|
33
|
+
field,
|
|
34
|
+
format: value => {
|
|
35
|
+
const enabled = value === undefined || value === null || typeof value !== 'boolean'
|
|
36
|
+
? defaultValue
|
|
37
|
+
: value;
|
|
38
|
+
return enabled ? 'true' : 'false';
|
|
39
|
+
},
|
|
40
|
+
parse: text => text === 'true' ? { kind: 'set', value: true }
|
|
41
|
+
: text === 'false' ? { kind: 'set', value: false }
|
|
42
|
+
: undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** 各字段的字段转换规格。 */
|
|
46
|
+
export const showCompletedField = makeBooleanField(BADGE_FIELDS.showCompletedInBadge, true);
|
|
47
|
+
export const showRunningField = makeBooleanField(BADGE_FIELDS.showRunningInBadge, true);
|
|
48
|
+
export const showPendingField = makeBooleanField(BADGE_FIELDS.showPendingInBadge, true);
|
|
49
|
+
export const showScheduledField = makeBooleanField(BADGE_FIELDS.showScheduledInBadge, true);
|
|
50
|
+
export const showWaitingReviewField = makeBooleanField(BADGE_FIELDS.showWaitingReviewInBadge, true);
|
|
51
|
+
export const showHoverDetailsField = makeBooleanField(BADGE_FIELDS.showHoverDetails, true);
|
|
52
|
+
export const countThresholdField = {
|
|
53
|
+
field: BADGE_FIELDS.countThreshold,
|
|
54
|
+
format: value => {
|
|
55
|
+
const n = value === undefined || value === null || typeof value !== 'number' || !Number.isFinite(value)
|
|
56
|
+
? 2
|
|
57
|
+
: Math.floor(value);
|
|
58
|
+
return String(n < 0 ? 0 : n);
|
|
59
|
+
},
|
|
60
|
+
parse: text => {
|
|
61
|
+
const n = Number(text);
|
|
62
|
+
if (!Number.isFinite(n) || n < 0 || n !== Math.floor(n))
|
|
63
|
+
return undefined;
|
|
64
|
+
return { kind: 'set', value: n };
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
/** 所有字段规格(按卡片渲染顺序)。 */
|
|
68
|
+
export const ALL_BADGE_FIELDS = [
|
|
69
|
+
showCompletedField,
|
|
70
|
+
showRunningField,
|
|
71
|
+
showPendingField,
|
|
72
|
+
showScheduledField,
|
|
73
|
+
showWaitingReviewField,
|
|
74
|
+
showHoverDetailsField,
|
|
75
|
+
countThresholdField,
|
|
76
|
+
];
|
|
77
|
+
//# sourceMappingURL=badge-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-field.js","sourceRoot":"","sources":["../../../src/client/badge-field.ts"],"names":[],"mappings":"AAiBA,+CAA+C;AAC/C,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,wBAAwB,EAAE,0BAA0B;IACpD,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;CACxB,CAAA;AAEV,oCAAoC;AACpC,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,KAAK,KAAK,CAAA;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,KAAK,OAAO,CAAA;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,KAAa,EAAE,YAAqB;IAC5D,OAAO;QACL,KAAK;QACL,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS;gBACjF,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,KAAK,CAAA;YACT,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAA;QACnC,CAAC;QACD,KAAK,EAAE,IAAI,CAAC,EAAE,CACZ,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YAC5C,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;gBAChD,CAAC,CAAC,SAAS;KAClB,CAAA;AACH,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,MAAM,kBAAkB,GAAsB,gBAAgB,CAAC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;AAC9G,MAAM,CAAC,MAAM,gBAAgB,GAAsB,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;AAC1G,MAAM,CAAC,MAAM,gBAAgB,GAAsB,gBAAgB,CAAC,YAAY,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;AAC1G,MAAM,CAAC,MAAM,kBAAkB,GAAsB,gBAAgB,CAAC,YAAY,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;AAC9G,MAAM,CAAC,MAAM,sBAAsB,GAAsB,gBAAgB,CAAC,YAAY,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAA;AACtH,MAAM,CAAC,MAAM,qBAAqB,GAAsB,gBAAgB,CAAC,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;AAC7G,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,KAAK,EAAE,YAAY,CAAC,cAAc;IAClC,MAAM,EAAE,KAAK,CAAC,EAAE;QACd,MAAM,CAAC,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACrG,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACrB,OAAO,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9B,CAAC;IACD,KAAK,EAAE,IAAI,CAAC,EAAE;QACZ,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA;QACzE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAA;IAClC,CAAC;CACF,CAAA;AAED,uBAAuB;AACvB,MAAM,CAAC,MAAM,gBAAgB,GAAwB;IACnD,kBAAkB;IAClB,gBAAgB;IAChB,gBAAgB;IAChB,kBAAkB;IAClB,sBAAsB;IACtB,qBAAqB;IACrB,mBAAmB;CACpB,CAAA"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fork-owned: the **wording** of a folded group's aggregated status.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `rows/GroupBadge.tsx` for one concrete reason: that file imports the
|
|
5
|
+
* host icon set, and a published `…/client` bundle's `require` graph only resolves
|
|
6
|
+
* inside the DSH app (see `vitest.config.ts`, exclusion reason (b)). Keeping these
|
|
7
|
+
* functions free of runtime imports is what lets the badge behaviour be tested at all
|
|
8
|
+
* instead of being asserted by a screenshot nobody re-runs.
|
|
9
|
+
*
|
|
10
|
+
* 本模块**不认识任何具体状态源**:外部状态一律经 `./facets.ts` 的协议进来,文案、图标、
|
|
11
|
+
* 脉冲都由该状态的所有者声明,本模块只管排布顺序与分隔符。
|
|
12
|
+
*
|
|
13
|
+
* @module
|
|
14
|
+
*/
|
|
15
|
+
import type { ReactNode } from 'react';
|
|
16
|
+
import type { WorkspaceBrowserProps } from './contract/slots.ts';
|
|
17
|
+
import type { FacetEntry, GroupLiveStatus } from './group-status.ts';
|
|
18
|
+
import type { ResolvedBadgeSettings } from './badge-settings.ts';
|
|
19
|
+
/** The standard locale seat, prop-passed from the browser root (type-only import). */
|
|
20
|
+
type RowTranslate = WorkspaceBrowserProps['t'];
|
|
21
|
+
/** 一条悬停明细:一个状态点(或来源自己的图标)加它的文案。 */
|
|
22
|
+
export interface HoverStatusLine {
|
|
23
|
+
state: 'warning' | 'ongoing' | 'done';
|
|
24
|
+
text: string;
|
|
25
|
+
/** #24:来源自己交的图标(已含色档)。宿主会话状态没有它,仍用三档 `StateDot`。 */
|
|
26
|
+
glyph?: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
/** 该 facet 贡献进徽标数字的条数。 */
|
|
29
|
+
export declare function facetCountTotal(s: GroupLiveStatus): number;
|
|
30
|
+
/**
|
|
31
|
+
* 每个外部状态来源的那句话,按登记顺序。
|
|
32
|
+
*
|
|
33
|
+
* facet 没实现 `label` 时**不能**退化成 `2 dsh-later.schedule` 这种读法,所以给一句
|
|
34
|
+
* 通用措辞兜底:只说有几个来源在响,具体语义等该来源自己补文案。
|
|
35
|
+
*/
|
|
36
|
+
export declare function facetLines(s: GroupLiveStatus, t: RowTranslate, now: number): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Accessible label for a folded group's aggregated status, reusing the
|
|
39
|
+
* session-row locale keys so both surfaces read identically.
|
|
40
|
+
*
|
|
41
|
+
* 按设置过滤:**关掉的外部来源根本不在折果里**(`WorkspaceBrowser` 折叠前就按
|
|
42
|
+
* `facet.settingKey` 过滤了登记面),所以这里不必再判设置,`aria-label` 与徽标视觉
|
|
43
|
+
* 天然一致;宿主的行级状态仍按设置逐项过滤。
|
|
44
|
+
*/
|
|
45
|
+
export declare function groupLiveLabel(s: GroupLiveStatus, t: RowTranslate, settings: ResolvedBadgeSettings, now?: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* 每个外部状态来源的明细行,**带它自己的图标**(#24)。
|
|
48
|
+
*
|
|
49
|
+
* 徽标侧画的是 provider 交出的、已含色档的元素(`rows/GroupBadge.tsx` 的 `facetGlyph`),
|
|
50
|
+
* 明细侧此前只画一个统一的 `StateDot`,于是同一条状态、同一次悬停里,徽标是红色沙漏、
|
|
51
|
+
* 明细是黄点——同一行的两个视图各说一套。宿主 `StateDot` 只有 warning / ongoing / done
|
|
52
|
+
* 三档、没有 error 档,所以色档**只能**由来源自己的图标表达,这也是本函数存在的理由。
|
|
53
|
+
*
|
|
54
|
+
* provider 没交图标时退回通用点(与徽标侧同一套兜底),陌生来源仍然可见。
|
|
55
|
+
*
|
|
56
|
+
* @returns 明细行;`glyph` 为 `undefined` 表示该行用 `StateDot` 渲染。
|
|
57
|
+
*/
|
|
58
|
+
export declare function facetDetailLines(s: GroupLiveStatus, t: RowTranslate, now: number): HoverStatusLine[];
|
|
59
|
+
/**
|
|
60
|
+
* Build the status detail lines for the workspace hover card.
|
|
61
|
+
*
|
|
62
|
+
* Extracted so `WorkspaceHoverContent` in `Rows.tsx` only needs to map the returned
|
|
63
|
+
* array — the fork-specific status→line logic lives here.
|
|
64
|
+
*
|
|
65
|
+
* 按设置过滤:关掉的来源不出现在明细行里;`showHoverDetails=false` 时整段返回空。
|
|
66
|
+
* 明细行的顺序与徽标**完全一致**(外部来源排在会话状态之后、已完成之前):两处顺序
|
|
67
|
+
* 不一样会让人怀疑它们是两套事实。
|
|
68
|
+
*/
|
|
69
|
+
export declare function hoverStatusLines(status: GroupLiveStatus | undefined, t: RowTranslate, settings: ResolvedBadgeSettings, now?: number): HoverStatusLine[];
|
|
70
|
+
/**
|
|
71
|
+
* 某一条外部来源的元素该带哪只 class(#22)。
|
|
72
|
+
*
|
|
73
|
+
* 脉冲判据仍由各 facet 自己声明(`FacetFold.pulse`),但**作用对象必须下沉到声明它的那个
|
|
74
|
+
* 元素**。此前 `groupBadgeIsUrgent()` 只返回一个整徽标的布尔值、class 加在容器上,于是同组
|
|
75
|
+
* 里任何一家声明 `pulse: true` 都会让别家本该静止的图标跟着呼吸:`pulse: false` 是否生效,
|
|
76
|
+
* 取决于同组里恰好有没有别人开了闪。判断交出去了,作用对象没交出去——这是修过一次的回归
|
|
77
|
+
* (见下)。
|
|
78
|
+
*
|
|
79
|
+
* 保留这条历史的原因写在所有者那边:dsh-gitea-dispatch 把 `overdue` 画成**静止**(其
|
|
80
|
+
* `lib/waiting-glyph.js`:「超时后停动画:静止即不再期待」),且它只代表 CI 窗口到期、
|
|
81
|
+
* 不代表评审失败。同一条等待在行内静止、在父级闪动,就是同一事实的两种说法。
|
|
82
|
+
*/
|
|
83
|
+
export declare function facetPulseClass(entry: FacetEntry, urgentClass: string): string | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* 一个来源的图标。
|
|
86
|
+
*
|
|
87
|
+
* 归 provider 画(`facet.renderIcon`):「这个状态长什么样」是它的知识。没实现时本插件
|
|
88
|
+
* 按色档退回一个通用点(见 `rows/GroupBadge.tsx`),保证陌生来源仍然可见、只是朴素。
|
|
89
|
+
*/
|
|
90
|
+
export declare function facetGlyph(entry: FacetEntry, t: RowTranslate, now: number): ReactNode;
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=badge-labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-labels.d.ts","sourceRoot":"","sources":["../../../src/client/badge-labels.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAEhE,sFAAsF;AACtF,KAAK,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;AAE9C,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAA;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,oDAAoD;IACpD,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB;AAcD,0BAA0B;AAC1B,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAI1D;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAQrF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,CAAC,EAAE,eAAe,EAClB,CAAC,EAAE,YAAY,EACf,QAAQ,EAAE,qBAAqB,EAC/B,GAAG,GAAE,MAAmB,GACvB,MAAM,CAgBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CASpG;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,eAAe,GAAG,SAAS,EACnC,CAAC,EAAE,YAAY,EACf,QAAQ,EAAE,qBAAqB,EAC/B,GAAG,GAAE,MAAmB,GACvB,eAAe,EAAE,CAsBnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE1F;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAErF"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 把侧栏行的翻译位交给 facet。
|
|
3
|
+
*
|
|
4
|
+
* 这里有一次**故意的放宽**:协议的 `t` 收任意字符串键,而行位只收本插件 `workspace`
|
|
5
|
+
* 命名空间的键。放宽是安全的——宿主 locale 服务对未注册的键一律**原样回显键名**(不是
|
|
6
|
+
* 抛错),所以外来 facet 传了自己命名空间的键,最坏读出的是那串键名而不是崩渲染。
|
|
7
|
+
* 要正确本地化,provider 应当闭包自己的翻译函数、忽略这里传入的 `t`。
|
|
8
|
+
*/
|
|
9
|
+
function asFacetTranslate(t) {
|
|
10
|
+
return (key, options) => t(key, options);
|
|
11
|
+
}
|
|
12
|
+
/** 该 facet 贡献进徽标数字的条数。 */
|
|
13
|
+
export function facetCountTotal(s) {
|
|
14
|
+
let total = 0;
|
|
15
|
+
for (const entry of s.facets.values())
|
|
16
|
+
total += entry.fold.count;
|
|
17
|
+
return total;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 每个外部状态来源的那句话,按登记顺序。
|
|
21
|
+
*
|
|
22
|
+
* facet 没实现 `label` 时**不能**退化成 `2 dsh-later.schedule` 这种读法,所以给一句
|
|
23
|
+
* 通用措辞兜底:只说有几个来源在响,具体语义等该来源自己补文案。
|
|
24
|
+
*/
|
|
25
|
+
export function facetLines(s, t, now) {
|
|
26
|
+
const translate = asFacetTranslate(t);
|
|
27
|
+
const lines = [];
|
|
28
|
+
for (const entry of s.facets.values()) {
|
|
29
|
+
const text = entry.facet.label?.(entry.fold, { now, t: translate });
|
|
30
|
+
lines.push(text === undefined || text === '' ? `${entry.fold.count} ${t('status.needsAttention')}` : text);
|
|
31
|
+
}
|
|
32
|
+
return lines;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Accessible label for a folded group's aggregated status, reusing the
|
|
36
|
+
* session-row locale keys so both surfaces read identically.
|
|
37
|
+
*
|
|
38
|
+
* 按设置过滤:**关掉的外部来源根本不在折果里**(`WorkspaceBrowser` 折叠前就按
|
|
39
|
+
* `facet.settingKey` 过滤了登记面),所以这里不必再判设置,`aria-label` 与徽标视觉
|
|
40
|
+
* 天然一致;宿主的行级状态仍按设置逐项过滤。
|
|
41
|
+
*/
|
|
42
|
+
export function groupLiveLabel(s, t, settings, now = Date.now()) {
|
|
43
|
+
const parts = [];
|
|
44
|
+
if (settings.showPendingInBadge) {
|
|
45
|
+
if (s.approval > 0)
|
|
46
|
+
parts.push(`${s.approval} ${t('status.waitingApproval')}`);
|
|
47
|
+
if (s.planReview > 0)
|
|
48
|
+
parts.push(`${s.planReview} ${t('status.planReview')}`);
|
|
49
|
+
if (s.question > 0)
|
|
50
|
+
parts.push(`${s.question} ${t('status.waitingAnswer')}`);
|
|
51
|
+
}
|
|
52
|
+
if (settings.showRunningInBadge) {
|
|
53
|
+
if (s.running > 0)
|
|
54
|
+
parts.push(`${s.running} ${t('status.running')}`);
|
|
55
|
+
if (s.subagents > 0) {
|
|
56
|
+
parts.push(t(s.subagents === 1 ? 'status.subagentsRunning.one' : 'status.subagentsRunning.other', { n: s.subagents }));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
parts.push(...facetLines(s, t, now));
|
|
60
|
+
if (settings.showCompletedInBadge && s.done > 0)
|
|
61
|
+
parts.push(`${s.done} ${t('status.completed')}`);
|
|
62
|
+
return parts.join(' · ');
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* 每个外部状态来源的明细行,**带它自己的图标**(#24)。
|
|
66
|
+
*
|
|
67
|
+
* 徽标侧画的是 provider 交出的、已含色档的元素(`rows/GroupBadge.tsx` 的 `facetGlyph`),
|
|
68
|
+
* 明细侧此前只画一个统一的 `StateDot`,于是同一条状态、同一次悬停里,徽标是红色沙漏、
|
|
69
|
+
* 明细是黄点——同一行的两个视图各说一套。宿主 `StateDot` 只有 warning / ongoing / done
|
|
70
|
+
* 三档、没有 error 档,所以色档**只能**由来源自己的图标表达,这也是本函数存在的理由。
|
|
71
|
+
*
|
|
72
|
+
* provider 没交图标时退回通用点(与徽标侧同一套兜底),陌生来源仍然可见。
|
|
73
|
+
*
|
|
74
|
+
* @returns 明细行;`glyph` 为 `undefined` 表示该行用 `StateDot` 渲染。
|
|
75
|
+
*/
|
|
76
|
+
export function facetDetailLines(s, t, now) {
|
|
77
|
+
const translate = asFacetTranslate(t);
|
|
78
|
+
const lines = [];
|
|
79
|
+
for (const entry of s.facets.values()) {
|
|
80
|
+
const raw = entry.facet.label?.(entry.fold, { now, t: translate });
|
|
81
|
+
const text = raw === undefined || raw === '' ? `${entry.fold.count} ${t('status.needsAttention')}` : raw;
|
|
82
|
+
lines.push({ state: 'warning', text, glyph: facetGlyph(entry, t, now) });
|
|
83
|
+
}
|
|
84
|
+
return lines;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build the status detail lines for the workspace hover card.
|
|
88
|
+
*
|
|
89
|
+
* Extracted so `WorkspaceHoverContent` in `Rows.tsx` only needs to map the returned
|
|
90
|
+
* array — the fork-specific status→line logic lives here.
|
|
91
|
+
*
|
|
92
|
+
* 按设置过滤:关掉的来源不出现在明细行里;`showHoverDetails=false` 时整段返回空。
|
|
93
|
+
* 明细行的顺序与徽标**完全一致**(外部来源排在会话状态之后、已完成之前):两处顺序
|
|
94
|
+
* 不一样会让人怀疑它们是两套事实。
|
|
95
|
+
*/
|
|
96
|
+
export function hoverStatusLines(status, t, settings, now = Date.now()) {
|
|
97
|
+
const lines = [];
|
|
98
|
+
if (status === undefined || !settings.showHoverDetails)
|
|
99
|
+
return lines;
|
|
100
|
+
if (settings.showPendingInBadge) {
|
|
101
|
+
if (status.approval > 0)
|
|
102
|
+
lines.push({ state: 'warning', text: `${status.approval} ${t('status.waitingApproval')}` });
|
|
103
|
+
if (status.planReview > 0)
|
|
104
|
+
lines.push({ state: 'warning', text: `${status.planReview} ${t('status.planReview')}` });
|
|
105
|
+
if (status.question > 0)
|
|
106
|
+
lines.push({ state: 'warning', text: `${status.question} ${t('status.waitingAnswer')}` });
|
|
107
|
+
}
|
|
108
|
+
if (settings.showRunningInBadge) {
|
|
109
|
+
if (status.running > 0)
|
|
110
|
+
lines.push({ state: 'ongoing', text: `${status.running} ${t('status.running')}` });
|
|
111
|
+
if (status.subagents > 0) {
|
|
112
|
+
lines.push({
|
|
113
|
+
state: 'ongoing',
|
|
114
|
+
text: t(status.subagents === 1 ? 'status.subagentsRunning.one' : 'status.subagentsRunning.other', { n: status.subagents }),
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// #24:外部来源的明细行改用来源自己的图标(已含色档),与徽标同源。宿主的三档点仍用在
|
|
119
|
+
// 宿主会话状态上——那些档位本就是宿主的语义,色档无处可失。
|
|
120
|
+
lines.push(...facetDetailLines(status, t, now));
|
|
121
|
+
if (settings.showCompletedInBadge && status.done > 0)
|
|
122
|
+
lines.push({ state: 'done', text: `${status.done} ${t('status.completed')}` });
|
|
123
|
+
return lines;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 某一条外部来源的元素该带哪只 class(#22)。
|
|
127
|
+
*
|
|
128
|
+
* 脉冲判据仍由各 facet 自己声明(`FacetFold.pulse`),但**作用对象必须下沉到声明它的那个
|
|
129
|
+
* 元素**。此前 `groupBadgeIsUrgent()` 只返回一个整徽标的布尔值、class 加在容器上,于是同组
|
|
130
|
+
* 里任何一家声明 `pulse: true` 都会让别家本该静止的图标跟着呼吸:`pulse: false` 是否生效,
|
|
131
|
+
* 取决于同组里恰好有没有别人开了闪。判断交出去了,作用对象没交出去——这是修过一次的回归
|
|
132
|
+
* (见下)。
|
|
133
|
+
*
|
|
134
|
+
* 保留这条历史的原因写在所有者那边:dsh-gitea-dispatch 把 `overdue` 画成**静止**(其
|
|
135
|
+
* `lib/waiting-glyph.js`:「超时后停动画:静止即不再期待」),且它只代表 CI 窗口到期、
|
|
136
|
+
* 不代表评审失败。同一条等待在行内静止、在父级闪动,就是同一事实的两种说法。
|
|
137
|
+
*/
|
|
138
|
+
export function facetPulseClass(entry, urgentClass) {
|
|
139
|
+
return entry.fold.pulse ? urgentClass : undefined;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 一个来源的图标。
|
|
143
|
+
*
|
|
144
|
+
* 归 provider 画(`facet.renderIcon`):「这个状态长什么样」是它的知识。没实现时本插件
|
|
145
|
+
* 按色档退回一个通用点(见 `rows/GroupBadge.tsx`),保证陌生来源仍然可见、只是朴素。
|
|
146
|
+
*/
|
|
147
|
+
export function facetGlyph(entry, t, now) {
|
|
148
|
+
return entry.facet.renderIcon?.(entry.fold, { now, t: asFacetTranslate(t) });
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=badge-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-labels.js","sourceRoot":"","sources":["../../../src/client/badge-labels.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
* 引用——每次都构造新对象会让选择器的 `Object.is` 比较永不成立,触发
|
|
17
17
|
* 「Maximum update depth exceeded」死循环(React #185),折叠行徽标会整块崩掉。
|
|
18
18
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
19
|
+
* 设置面缺席或未就绪时,回落到**默认全部显示**,与 `Config` 各字段的 schema 默认值同源:
|
|
20
|
+
* 读不到配置不是「关掉」。
|
|
21
21
|
*/
|
|
22
22
|
/** Loader 条目 id —— 设置页的寻址键,也是宿主 `describe()` 的 ns。 */
|
|
23
23
|
export declare const ENTRY_ID = "dsh-group-status";
|
|
@@ -35,7 +35,35 @@ export interface SettingsScopeLike {
|
|
|
35
35
|
export interface ResolvedBadgeSettings {
|
|
36
36
|
/** 折叠徽标是否显示「已完成」绿点;缺失/非法一律回落 true。 */
|
|
37
37
|
showCompletedInBadge: boolean;
|
|
38
|
+
/** 折叠徽标是否显示「进行中」转圈(含子智能体);缺失/非法一律回落 true。 */
|
|
39
|
+
showRunningInBadge: boolean;
|
|
40
|
+
/** 折叠徽标是否显示「待审批」黄点(approval / plan-review / question);缺失/非法一律回落 true。 */
|
|
41
|
+
showPendingInBadge: boolean;
|
|
42
|
+
/** 折叠徽标是否显示「定时任务」时钟图标(数据来自 dsh-later);缺失/非法一律回落 true。 */
|
|
43
|
+
showScheduledInBadge: boolean;
|
|
44
|
+
/** 折叠徽标是否显示「等待评审」沙漏图标(数据来自 dsh-gitea-dispatch,自其 #56 起画沙漏;缺失/非法一律回落 true)。 */
|
|
45
|
+
showWaitingReviewInBadge: boolean;
|
|
46
|
+
/** 悬停卡里是否显示聚合明细行;缺失/非法一律回落 true。 */
|
|
47
|
+
showHoverDetails: boolean;
|
|
48
|
+
/** 徽标数字显示阈值:数量 >= 此值时才显示数字;缺失/非法一律回落 2(默认 count=1 时省略)。 */
|
|
49
|
+
countThreshold: number;
|
|
38
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* `ResolvedBadgeSettings` 里的布尔开关键。
|
|
53
|
+
*
|
|
54
|
+
* facet 的 `settingKey` 就是它的字符串形态:状态所有者声明"我受哪个开关管",
|
|
55
|
+
* 而开关的语义与取值仍由本插件判定。
|
|
56
|
+
*/
|
|
57
|
+
export type BooleanSettingKey = {
|
|
58
|
+
[K in keyof ResolvedBadgeSettings]: ResolvedBadgeSettings[K] extends boolean ? K : never;
|
|
59
|
+
}[keyof ResolvedBadgeSettings];
|
|
60
|
+
/**
|
|
61
|
+
* 一个 facet 是否被设置关掉。
|
|
62
|
+
*
|
|
63
|
+
* - 没有 `settingKey` → 始终参与(缺省是"显示",与其余开关的默认值同源)。
|
|
64
|
+
* - 声明了但不是布尔开关键 → 同样按显示处理:拼错的键不该让一个状态整块消失。
|
|
65
|
+
*/
|
|
66
|
+
export declare function facetVisibleBySettings(settings: ResolvedBadgeSettings, settingKey: string | undefined): boolean;
|
|
39
67
|
/** 标准 props 源的结构面(与 `HostObservable<ResolvedBadgeSettings>` 兼容)。 */
|
|
40
68
|
export interface BadgeSettingsSource {
|
|
41
69
|
getSnapshot(): ResolvedBadgeSettings;
|
|
@@ -52,7 +80,7 @@ export interface MutableBadgeSettingsSource extends BadgeSettingsSource {
|
|
|
52
80
|
*/
|
|
53
81
|
publish(snapshot: SettingsSnapshotLike | undefined): void;
|
|
54
82
|
}
|
|
55
|
-
/** 默认值:与 `Config
|
|
83
|
+
/** 默认值:与 `Config` 各字段的 schema 默认同源(全部显示,数字阈值 2 即 count=1 时省略)。 */
|
|
56
84
|
export declare const DEFAULT_BADGE_SETTINGS: ResolvedBadgeSettings;
|
|
57
85
|
/**
|
|
58
86
|
* 建一个恒在、取值稳定的徽标设置源。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge-settings.d.ts","sourceRoot":"","sources":["../../../src/client/badge-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,sDAAsD;AACtD,eAAO,MAAM,QAAQ,qBAAqB,CAAA;AAE1C,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,WAAW,IAAI,oBAAoB,CAAA;IACnC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C;AAED,sBAAsB;AACtB,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,oBAAoB,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"badge-settings.d.ts","sourceRoot":"","sources":["../../../src/client/badge-settings.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,sDAAsD;AACtD,eAAO,MAAM,QAAQ,qBAAqB,CAAA;AAE1C,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,sCAAsC;AACtC,MAAM,WAAW,iBAAiB;IAChC,WAAW,IAAI,oBAAoB,CAAA;IACnC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C;AAED,sBAAsB;AACtB,MAAM,WAAW,qBAAqB;IACpC,sCAAsC;IACtC,oBAAoB,EAAE,OAAO,CAAA;IAC7B,6CAA6C;IAC7C,kBAAkB,EAAE,OAAO,CAAA;IAC3B,yEAAyE;IACzE,kBAAkB,EAAE,OAAO,CAAA;IAC3B,yDAAyD;IACzD,oBAAoB,EAAE,OAAO,CAAA;IAC7B,8EAA8E;IAC9E,wBAAwB,EAAE,OAAO,CAAA;IACjC,oCAAoC;IACpC,gBAAgB,EAAE,OAAO,CAAA;IACzB,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;KAC7B,CAAC,IAAI,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,GAAG,KAAK;CACzF,CAAC,MAAM,qBAAqB,CAAC,CAAA;AAE9B;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAI/G;AAED,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,WAAW,IAAI,qBAAqB,CAAA;IACpC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;CAC5C;AAED,qDAAqD;AACrD,MAAM,WAAW,0BAA2B,SAAQ,mBAAmB;IACrE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI,CAAA;CAC1D;AAED,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,EAAE,qBAQnC,CAAA;AAuCF;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,IAAI,0BAA0B,CAuBtE;AAED,qCAAqC;AACrC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,SAAS,GAAG,qBAAqB,CAEtG"}
|