dsh-life-pack 0.2.6 → 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/dist/client.js +380 -163
- package/dist/client.js.map +1 -1
- package/dist/dsh-ctx.d.ts +9 -5
- package/dist/dsh-ctx.d.ts.map +1 -1
- package/dist/health-fetch.d.ts +5 -12
- package/dist/health-fetch.d.ts.map +1 -1
- package/dist/health-fetch.js +12 -3
- package/dist/health-fetch.js.map +1 -1
- package/dist/health-panel.d.ts +6 -0
- package/dist/health-panel.d.ts.map +1 -1
- package/dist/health-panel.js +13 -0
- package/dist/health-panel.js.map +1 -1
- package/dist/health-view.d.ts +46 -10
- package/dist/health-view.d.ts.map +1 -1
- package/dist/health-view.js +111 -81
- package/dist/health-view.js.map +1 -1
- package/dist/manager-version.d.ts +7 -0
- package/dist/manager-version.d.ts.map +1 -0
- package/dist/manager-version.js +62 -0
- package/dist/manager-version.js.map +1 -0
- package/dist/nav.d.ts +18 -2
- package/dist/nav.d.ts.map +1 -1
- package/dist/nav.js +10 -8
- package/dist/nav.js.map +1 -1
- package/dist/update-client.d.ts +5 -0
- package/dist/update-client.d.ts.map +1 -1
- package/dist/update-client.js +16 -4
- package/dist/update-client.js.map +1 -1
- package/dist/update-contract.d.ts +18 -0
- package/dist/update-contract.d.ts.map +1 -1
- package/dist/update-contract.js +19 -1
- package/dist/update-contract.js.map +1 -1
- package/dist/update-host.d.ts.map +1 -1
- package/dist/update-host.js +4 -0
- package/dist/update-host.js.map +1 -1
- package/package.json +1 -1
package/dist/dsh-ctx.d.ts
CHANGED
|
@@ -15,20 +15,24 @@ export interface SlotsRegisterOptions {
|
|
|
15
15
|
readonly order?: number;
|
|
16
16
|
readonly label?: string | (() => string);
|
|
17
17
|
readonly locale?: string;
|
|
18
|
-
/** 本包自己那条 RPC 通道(单段,例 `/ilife-calorie
|
|
19
|
-
*
|
|
18
|
+
/** 本包自己那条 RPC 通道(单段,例 `/ilife-calorie`):注册方交出来。
|
|
19
|
+
*
|
|
20
|
+
* #735 实测:装机上的槽位面**不透传自定义注册选项**(条目 options 只留 `{key,id,order,label,priority}`),
|
|
21
|
+
* 读方(总管)拿不到这一格——面板的取值面已改成导航表那份镜像(见 `nav.ts` 的 `ManagerTab.channel`)。
|
|
22
|
+
* 这一格留着:上游哪天开始透传,可以一行切回。 */
|
|
20
23
|
readonly channel?: string;
|
|
21
24
|
readonly inject?: () => Record<string, unknown>;
|
|
22
25
|
readonly children?: Record<string, SlotChildSpec>;
|
|
23
26
|
}
|
|
24
|
-
/** 子槽 ledger 条目(只读投影 settings-plugins:1751-1756 同形)。
|
|
27
|
+
/** 子槽 ledger 条目(只读投影 settings-plugins:1751-1756 同形)。
|
|
28
|
+
*
|
|
29
|
+
* 这里**没有** `channel` 一格(#735):注册方交出去的自定义键到不了账本(实测只留 id/order/label 那几格),
|
|
30
|
+
* 面板因此不从这条路上取通道名。 */
|
|
25
31
|
export interface SlotLedgerEntry {
|
|
26
32
|
readonly options: {
|
|
27
33
|
readonly id?: string;
|
|
28
34
|
readonly order?: number;
|
|
29
35
|
readonly label?: string | (() => string);
|
|
30
|
-
/** 见 `SlotsRegisterOptions.channel`(缺席即这一家没声明体检通道)。 */
|
|
31
|
-
readonly channel?: string;
|
|
32
36
|
};
|
|
33
37
|
}
|
|
34
38
|
export interface SlotsFace {
|
package/dist/dsh-ctx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;
|
|
1
|
+
{"version":3,"file":"dsh-ctx.d.ts","sourceRoot":"","sources":["../src/dsh-ctx.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB;;;;iCAI6B;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACnD;AAED;;;sBAGsB;AACtB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;IACxE,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAAC;IACxC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC1D;AAED;;;qBAGqB;AACrB,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,4EAA4E;AAC5E,MAAM,WAAW,aAAa;IAC5B,WAAW,IAAI,YAAY,EAAE,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CAC7C;AAED;4EAC4E;AAC5E,MAAM,WAAW,WAAW;IAC1B,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC;CAChF;AAED;wFACwF;AACxF,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;CACvF;AAED;2DAC2D;AAC3D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;CAC/B;AAED,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAE3I,MAAM,WAAW,WAAW;IAC1B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACrG;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;YAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;SAAE,CAAA;KAAE,CAAC;IACxE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC1E,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAExG;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,UAAU,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;IACrF,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,IAAI,CAAC;IAC1E,gDAAgD;IAChD,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B"}
|
package/dist/health-fetch.d.ts
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
import type { HealthReport } from './health-contract.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
readonly ok: false;
|
|
8
|
-
readonly error: {
|
|
9
|
-
readonly code: string;
|
|
10
|
-
readonly message: string;
|
|
11
|
-
readonly details: Record<string, unknown>;
|
|
12
|
-
};
|
|
13
|
-
}>;
|
|
2
|
+
import type { CallFace } from './update-client.js';
|
|
3
|
+
/** 传输口:与更新面**同一张脸**(`connection.rpc.call` 的四参形状,cookbook §6)——一张脸一处定义。 */
|
|
4
|
+
export type HealthCallFace = CallFace;
|
|
5
|
+
/** 一家的电话名:通道名去掉前导斜杠那一段(各家宿主半注册在 `/api` + 通道名,信封 `method` 就是它)。 */
|
|
6
|
+
export declare function phoneOf(channel: string): string;
|
|
14
7
|
/** 一次取数的时限(毫秒):技能侧 spawn 上限 20 s,这里留一点余量。 */
|
|
15
8
|
export declare const HEALTH_TIMEOUT_MS: 25000;
|
|
16
9
|
/** 一家的一行:报告取到了就是 `report`,取不到就是 `error`(缺席的包不进这张表)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-fetch.d.ts","sourceRoot":"","sources":["../src/health-fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health-fetch.d.ts","sourceRoot":"","sources":["../src/health-fetch.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEtC,kEAAkE;AAClE,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,EAAG,KAAe,CAAC;AAEjD,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,cAAc,EAAE,CAAC;IACzC,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAiCD,oCAAoC;AACpC,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAO9H"}
|
package/dist/health-fetch.js
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
/** 面板到各家的配置体检:一次取数、六份报告(纯异步函数:无 DOM、无 react;传输口注入,便于单测)。
|
|
2
2
|
*
|
|
3
3
|
* 三条纪律:
|
|
4
|
-
* ·
|
|
5
|
-
*
|
|
4
|
+
* · **只走各家自己的电话**(`rpc.call(CARRIER_BASE, <电话名>, {method, payload}, …)`)——总管不认任何
|
|
5
|
+
* 一家的端点、也不加任何单品的依赖;电话名与端点名都是各家契约件公开的事实。
|
|
6
|
+
* ⚠ **载体形状**(#735 真机踩到):第一段必须是**载体基段** `/api`,第二段是那家的电话名
|
|
7
|
+
* (=它注册在 `/api<通道>` 上的那一段),端点名写进载荷的 `method`。写错第一段就是 404,
|
|
8
|
+
* 而 404 只落成「那一家取不到数」,屏上看起来像按钮坏了(先例:总管自己的电话在 #678 栽过同一处,
|
|
9
|
+
* 见 `update-contract.ts` 的 `CARRIER_BASE`)。
|
|
6
10
|
* · **一次取数,六份报告**:总览那行与各家那张表读的是同一份结果(见 `health-panel.ts` 的单一状态源),
|
|
7
11
|
* 不许两处各算一遍。
|
|
8
12
|
* · 有界超时:一家不回不该拖死整屏(技能侧 spawn 上限 20 s,这里给 25 s)。
|
|
9
13
|
*/
|
|
10
14
|
import { HEALTH_ENDPOINT, isHealthReport } from './health-contract.js';
|
|
15
|
+
import { CARRIER_BASE } from './update-contract.js';
|
|
16
|
+
/** 一家的电话名:通道名去掉前导斜杠那一段(各家宿主半注册在 `/api` + 通道名,信封 `method` 就是它)。 */
|
|
17
|
+
export function phoneOf(channel) {
|
|
18
|
+
return channel.startsWith('/') ? channel.slice(1) : channel;
|
|
19
|
+
}
|
|
11
20
|
/** 一次取数的时限(毫秒):技能侧 spawn 上限 20 s,这里留一点余量。 */
|
|
12
21
|
export const HEALTH_TIMEOUT_MS = 25_000;
|
|
13
22
|
function timeoutText() {
|
|
@@ -15,7 +24,7 @@ function timeoutText() {
|
|
|
15
24
|
}
|
|
16
25
|
async function fetchOne(call, row) {
|
|
17
26
|
try {
|
|
18
|
-
const result = await call(row.channel, HEALTH_ENDPOINT, {}, AbortSignal.timeout(HEALTH_TIMEOUT_MS));
|
|
27
|
+
const result = await call(CARRIER_BASE, phoneOf(row.channel), { method: HEALTH_ENDPOINT, payload: {} }, AbortSignal.timeout(HEALTH_TIMEOUT_MS));
|
|
19
28
|
if (!result || typeof result !== 'object' || typeof result.ok !== 'boolean') {
|
|
20
29
|
return { report: null, error: '回执信封异常(非 ok 信封)。' };
|
|
21
30
|
}
|
package/dist/health-fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-fetch.js","sourceRoot":"","sources":["../src/health-fetch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"health-fetch.js","sourceRoot":"","sources":["../src/health-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMpD,kEAAkE;AAClE,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9D,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAe,CAAC;AAuBjD,SAAS,WAAW;IAClB,OAAO,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,GAAG,eAAe,CAAC;AAClF,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAoB,EAAE,GAAiB;IAC7D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,YAAY,EACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EACpB,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,EACxC,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CACvC,CAAC;QACF,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAQ,MAA2B,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAClG,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,KAAK,GAAI,MAA4D,CAAC,KAAK,CAAC;YAClF,MAAM,OAAO,GAAG,OAAO,KAAK,EAAE,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;YAC3G,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,GAAI,MAA8B,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QACvF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;YAC7F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACvG,CAAC;AACH,CAAC;AAED,oCAAoC;AACpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAA2B,EAAE,IAA6B;IAChG,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;IAC7F,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAA2B,EAAE;QAC7E,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC,CAAC;IACJ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC"}
|
package/dist/health-panel.d.ts
CHANGED
|
@@ -22,4 +22,10 @@ export declare function lightOf(row: {
|
|
|
22
22
|
} | undefined): HealthStatus | null;
|
|
23
23
|
/** 体检状态源:挂载时不自动跑(体检要读盘、要起子进程,按需跑),点一次跑六家。 */
|
|
24
24
|
export declare function useHealthPanel(getCall: () => HealthCallFace | null, tabs: readonly HealthTabRow[]): HealthPanelFace;
|
|
25
|
+
/** 汇总行该显示哪一句错(票 #735):取数过程本身的错优先;**一家报告都没回来**时,把第一条家错误顶上来。
|
|
26
|
+
*
|
|
27
|
+
* 为什么要有这一格:各家的错只画在那家页签里的体检表上,一行摘要看不见 ⇒ 用户点完只见「体检中…」闪一下、
|
|
28
|
+
* 接着仍旧「还没体检」,会以为按钮坏了(真机上就是这么被误判的;那次六家全 404,汇总行一声不吭)。
|
|
29
|
+
* 有报告回来时不顶:那时各家那张表里已经把错说清楚了,摘要行只管读数。 */
|
|
30
|
+
export declare function summaryErrorOf(face: Pick<HealthPanelFace, 'rows' | 'error'>): string | null;
|
|
25
31
|
//# sourceMappingURL=health-panel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-panel.d.ts","sourceRoot":"","sources":["../src/health-panel.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAC9I,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW;IACX,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iBAAiB;IACjB,GAAG,IAAI,IAAI,CAAC;CACb;AAID,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAEtG;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,eAAe,CAyCnH"}
|
|
1
|
+
{"version":3,"file":"health-panel.d.ts","sourceRoot":"","sources":["../src/health-panel.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,+BAA+B;AAC/B,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAElE,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC,CAAC;IAC9I,wBAAwB;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW;IACX,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,iBAAiB;IACjB,GAAG,IAAI,IAAI,CAAC;CACb;AAID,6BAA6B;AAC7B,wBAAgB,OAAO,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAEtG;AAED,6CAA6C;AAC7C,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,cAAc,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,eAAe,CAyCnH;AAED;;;;wCAIwC;AACxC,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAK3F"}
|
package/dist/health-panel.js
CHANGED
|
@@ -60,4 +60,17 @@ export function useHealthPanel(getCall, tabs) {
|
|
|
60
60
|
}
|
|
61
61
|
return face;
|
|
62
62
|
}
|
|
63
|
+
/** 汇总行该显示哪一句错(票 #735):取数过程本身的错优先;**一家报告都没回来**时,把第一条家错误顶上来。
|
|
64
|
+
*
|
|
65
|
+
* 为什么要有这一格:各家的错只画在那家页签里的体检表上,一行摘要看不见 ⇒ 用户点完只见「体检中…」闪一下、
|
|
66
|
+
* 接着仍旧「还没体检」,会以为按钮坏了(真机上就是这么被误判的;那次六家全 404,汇总行一声不吭)。
|
|
67
|
+
* 有报告回来时不顶:那时各家那张表里已经把错说清楚了,摘要行只管读数。 */
|
|
68
|
+
export function summaryErrorOf(face) {
|
|
69
|
+
if (face.error !== null)
|
|
70
|
+
return face.error;
|
|
71
|
+
const rows = Object.values(face.rows);
|
|
72
|
+
if (rows.some((row) => row.report !== null))
|
|
73
|
+
return null;
|
|
74
|
+
return rows.find((row) => row.error !== null)?.error ?? null;
|
|
75
|
+
}
|
|
63
76
|
//# sourceMappingURL=health-panel.js.map
|
package/dist/health-panel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-panel.js","sourceRoot":"","sources":["../src/health-panel.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"health-panel.js","sourceRoot":"","sources":["../src/health-panel.ts"],"names":[],"mappings":"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"}
|
package/dist/health-view.d.ts
CHANGED
|
@@ -7,17 +7,27 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import * as React from 'react';
|
|
9
9
|
import type { HealthReport, HealthStatus } from './health-contract.js';
|
|
10
|
+
/** 三档的配色(绿走主题别名;红黄用实色,理由见下)。
|
|
11
|
+
*
|
|
12
|
+
* 红与黄为什么必须落在**不同明度带**上:这两档要一起出现在同一行灯里,用户扫一眼要能分开
|
|
13
|
+
* 「红了(用不了)」与「黄了(能用但要撞上)」。评审连着两轮点「黄灯偏暗与红相近」,所以:
|
|
14
|
+
* · 红=深红(暗、重);
|
|
15
|
+
* · 黄=高饱和的琥珀(亮、跳)——它在白底上的对比度仍然够(`#b45309` 对白 ≈ 4.9:1)。
|
|
16
|
+
* 绿不给底色:它是「正常」,不该和要处理的那两档抢注意力。 */
|
|
17
|
+
export declare const STATUS_COLOR: Readonly<Record<HealthStatus, string>>;
|
|
18
|
+
/** 档位词(灯里那几个字)用的色:红黄要**够深**才读得清,故另取一枚比灯更深的值。 */
|
|
19
|
+
export declare const STATUS_TEXT: Readonly<Record<HealthStatus, string>>;
|
|
10
20
|
export declare const HEALTH_STYLE: {
|
|
11
21
|
readonly box: React.CSSProperties;
|
|
12
22
|
readonly headRow: React.CSSProperties;
|
|
13
23
|
readonly head: React.CSSProperties;
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
readonly
|
|
17
|
-
readonly
|
|
18
|
-
|
|
19
|
-
readonly lightIdle: React.CSSProperties;
|
|
24
|
+
/** 顶部那一行汇总(票 #732):一行装下「配置体检 + 一句总账 + 体检按钮」,三样都不独占行。
|
|
25
|
+
* 它替掉了原先「标题行 + 单独一行的按钮 + 一排灯按钮 + 两行图例」(同屏实测 153px → 一行)。 */
|
|
26
|
+
readonly summaryRow: React.CSSProperties;
|
|
27
|
+
readonly summaryText: React.CSSProperties;
|
|
28
|
+
/** 各家那张表里的说明行(「还没体检:点上面那个…」那几句)。 */
|
|
20
29
|
readonly meta: React.CSSProperties;
|
|
30
|
+
readonly btn: React.CSSProperties;
|
|
21
31
|
readonly error: React.CSSProperties;
|
|
22
32
|
};
|
|
23
33
|
/** 「去哪修」那一行的正文:各家交回来的 action 里若已自带「去哪修:」,这里剥掉一层——
|
|
@@ -35,25 +45,51 @@ export declare function pathsOf(report: HealthReport): readonly string[];
|
|
|
35
45
|
/** 把报文里那一长串路径按公共前缀缩短(只动打印,不动事实)。
|
|
36
46
|
* 只按**扫得出来的那一段段落点**去缩,不做全串替换:既不误伤长路径,也不会把一段路劈成半截。 */
|
|
37
47
|
export declare function shortenPathsIn(text: string, prefixes: readonly string[]): string;
|
|
38
|
-
/**
|
|
48
|
+
/** 一盏灯:一家一名一档(数到几个红黄绿)。落点是那家页签(票 #732:面板不再单开一排灯按钮)。 */
|
|
39
49
|
export interface HealthLightRow {
|
|
40
50
|
readonly id: string;
|
|
41
51
|
readonly title: string;
|
|
42
52
|
readonly status: HealthStatus | null;
|
|
43
53
|
readonly counts: Readonly<Record<HealthStatus, number>>;
|
|
54
|
+
/** 这一家交没交体检通道(页签槽 `options.channel`)。false=这家没装/没接上:圆点保持缺席态,不许点。 */
|
|
55
|
+
readonly hasChannel: boolean;
|
|
44
56
|
}
|
|
45
57
|
/** 从六份报告数出那一行的灯(每家按最严重那一档上色)。 */
|
|
46
58
|
export declare function lightsOf(tabs: readonly {
|
|
47
59
|
readonly id: string;
|
|
48
60
|
readonly title: string;
|
|
61
|
+
readonly hasChannel?: boolean;
|
|
49
62
|
}[], reports: Readonly<Record<string, HealthReport | undefined>>): readonly HealthLightRow[];
|
|
50
|
-
/**
|
|
51
|
-
export
|
|
63
|
+
/** 一截读数:`红 2`/`黄 3`/`绿`/`—`(缺席没报告)。`status` 为 null 的那些走淡色。 */
|
|
64
|
+
export interface HealthCountSeg {
|
|
65
|
+
readonly status: HealthStatus | null;
|
|
66
|
+
readonly text: string;
|
|
67
|
+
}
|
|
68
|
+
/** 把一份计数拆成**按档分色**的几截。红黄各自一截、各自上色,互不串色;
|
|
69
|
+
* 「黄 3」这一截为什么不能被染成红——见 `countSegments` 的注释(出图复评逮到的真缺陷)。 */
|
|
70
|
+
export declare function countSegsOf(light: HealthLightRow): readonly HealthCountSeg[];
|
|
71
|
+
/** 页签圆点的颜色与语义(票 #732):从「实心/空心=装没装」改成「颜色=体检档位」。 */
|
|
72
|
+
export declare const TAB_DOT: {
|
|
73
|
+
/** 没装(页签槽账本里没有这一家)。 */
|
|
74
|
+
readonly absent: string;
|
|
75
|
+
/** 装了、但还没跑过体检。 */
|
|
76
|
+
readonly unchecked: "var(--dsw-alias-label-secondary, #9a9a9a)";
|
|
77
|
+
};
|
|
78
|
+
/** 页签圆点该用什么色:装了按档位(红黄绿),没装/没跑过走缺席态。 */
|
|
79
|
+
export declare function tabDotColor(light: HealthLightRow): string;
|
|
80
|
+
/** 页签上那枚小数字(票 #732):红黄那几家,家名后带一条计数;全绿与没跑过不带。 */
|
|
81
|
+
export declare const TAB_NOTE_STYLE: React.CSSProperties;
|
|
82
|
+
/** 那枚小数字写什么:只报「要处理」的那两档;一家里红黄都有时先报红那一档(圆点已经按最严重的档上色了)。 */
|
|
83
|
+
export declare function tabNote(light: HealthLightRow): HealthCountSeg | null;
|
|
84
|
+
/** 顶部那一行汇总(票 #732:不再一家一盏灯按钮,一行总账 + 一个体检按钮)。
|
|
85
|
+
*
|
|
86
|
+
* 与页签的分工:这行只答「一共几条要处理」;「哪几家、各几条」由页签的圆点与小数字答;
|
|
87
|
+
* 「具体哪一条坏了、去哪修」由那家页签里的 `HealthTable` 答。 */
|
|
88
|
+
export declare function HealthSummaryLine(props: {
|
|
52
89
|
readonly lights: readonly HealthLightRow[];
|
|
53
90
|
readonly running: boolean;
|
|
54
91
|
readonly error: string | null;
|
|
55
92
|
readonly onRun: () => void;
|
|
56
|
-
readonly onJump: (id: string) => void;
|
|
57
93
|
}): React.ReactElement;
|
|
58
94
|
/** 一家那张表:**要处理的**(红黄)一条一块、整行上底带一句话与「去哪修」;
|
|
59
95
|
* **正常的**(绿)收成一行并列的小字,点得到、扫得完(票面验收第一条:正常的收成一行,有问题的才展开)。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-view.d.ts","sourceRoot":"","sources":["../src/health-view.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAc,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"health-view.d.ts","sourceRoot":"","sources":["../src/health-view.ts"],"names":[],"mappings":"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"}
|
package/dist/health-view.js
CHANGED
|
@@ -14,7 +14,7 @@ import { countByStatus, worstStatus } from './health-contract.js';
|
|
|
14
14
|
* · 红=深红(暗、重);
|
|
15
15
|
* · 黄=高饱和的琥珀(亮、跳)——它在白底上的对比度仍然够(`#b45309` 对白 ≈ 4.9:1)。
|
|
16
16
|
* 绿不给底色:它是「正常」,不该和要处理的那两档抢注意力。 */
|
|
17
|
-
const STATUS_COLOR = {
|
|
17
|
+
export const STATUS_COLOR = {
|
|
18
18
|
red: '#c0392b',
|
|
19
19
|
yellow: '#e08a00',
|
|
20
20
|
green: 'var(--dsw-alias-state-success-primary, #4ec9a0)',
|
|
@@ -28,7 +28,7 @@ const STATUS_TINT = {
|
|
|
28
28
|
green: 'transparent',
|
|
29
29
|
};
|
|
30
30
|
/** 档位词(灯里那几个字)用的色:红黄要**够深**才读得清,故另取一枚比灯更深的值。 */
|
|
31
|
-
const STATUS_TEXT = {
|
|
31
|
+
export const STATUS_TEXT = {
|
|
32
32
|
red: '#a5281b',
|
|
33
33
|
yellow: '#8a5200',
|
|
34
34
|
green: 'var(--dsw-alias-state-success-primary, #4ec9a0)',
|
|
@@ -49,33 +49,28 @@ export const HEALTH_STYLE = {
|
|
|
49
49
|
},
|
|
50
50
|
headRow: { display: 'flex', flexWrap: 'wrap', alignItems: 'center', gap: 8, marginBottom: 4 },
|
|
51
51
|
head: { fontSize: 13, fontWeight: 700, color: INK },
|
|
52
|
-
/**
|
|
53
|
-
|
|
52
|
+
/** 顶部那一行汇总(票 #732):一行装下「配置体检 + 一句总账 + 体检按钮」,三样都不独占行。
|
|
53
|
+
* 它替掉了原先「标题行 + 单独一行的按钮 + 一排灯按钮 + 两行图例」(同屏实测 153px → 一行)。 */
|
|
54
|
+
summaryRow: {
|
|
55
|
+
display: 'flex',
|
|
56
|
+
alignItems: 'center',
|
|
57
|
+
gap: 10,
|
|
58
|
+
marginBottom: 10,
|
|
59
|
+
},
|
|
60
|
+
summaryText: { flex: '1 1 auto', minWidth: 0, fontSize: 12.5, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' },
|
|
61
|
+
/** 各家那张表里的说明行(「还没体检:点上面那个…」那几句)。 */
|
|
62
|
+
meta: { color: INK_DIM, fontSize: 12, lineHeight: 1.7, marginTop: 12 },
|
|
54
63
|
btn: {
|
|
55
64
|
border: '1px solid ' + BORDER,
|
|
56
65
|
background: 'transparent',
|
|
57
66
|
color: INK,
|
|
58
67
|
borderRadius: 8,
|
|
59
|
-
|
|
60
|
-
fontSize: 13,
|
|
61
|
-
fontWeight: 600,
|
|
62
|
-
cursor: 'pointer',
|
|
63
|
-
},
|
|
64
|
-
lightsRow: { display: 'flex', flexWrap: 'wrap', gap: 8 },
|
|
65
|
-
light: {
|
|
66
|
-
display: 'inline-flex',
|
|
67
|
-
alignItems: 'center',
|
|
68
|
-
gap: 4,
|
|
69
|
-
background: 'transparent',
|
|
70
|
-
border: '1px solid ' + BORDER,
|
|
71
|
-
borderRadius: 999,
|
|
68
|
+
flex: '0 0 auto',
|
|
72
69
|
padding: '3px 10px',
|
|
73
70
|
fontSize: 12.5,
|
|
74
|
-
|
|
71
|
+
fontWeight: 600,
|
|
75
72
|
cursor: 'pointer',
|
|
76
73
|
},
|
|
77
|
-
lightIdle: { cursor: 'default', color: INK_DIM },
|
|
78
|
-
meta: { color: INK_DIM, fontSize: 12, lineHeight: 1.7, marginTop: 12 },
|
|
79
74
|
error: { color: STATUS_COLOR.red, fontSize: 12, lineHeight: 1.7, marginTop: 6 },
|
|
80
75
|
};
|
|
81
76
|
/** 值得一眼看见的那两档(档位名与整行文字都上色;绿行保持淡)。 */
|
|
@@ -168,13 +163,15 @@ export function lightsOf(tabs, reports) {
|
|
|
168
163
|
title: tab.title,
|
|
169
164
|
status: report ? worstStatus(items) : null,
|
|
170
165
|
counts: countByStatus(items),
|
|
166
|
+
// 缺席与「装了但还没体检」在报告上都长成 null,分开只能靠这一格(票 #732)。
|
|
167
|
+
hasChannel: tab.hasChannel ?? true,
|
|
171
168
|
// 这里曾短期印过「最严重那一项的名字」当区分度,**已撤回**:实测六家常坏在同一条通用检查项上
|
|
172
169
|
// (都是「数据目录」),印出来六家一模一样,是噪声不是区分度(出图复评实测逐字抄了六个「数据目录」)。
|
|
173
170
|
// 「哪一项坏了」本来就由那家自己那张表回答,灯上不再重复。
|
|
174
171
|
};
|
|
175
172
|
});
|
|
176
173
|
}
|
|
177
|
-
/** 一家的一句话读数:「红 1 黄 2
|
|
174
|
+
/** 一家的一句话读数:「红 1 黄 2」,全绿就是「绿」。面板侧要**上色**的那几处不用它(见 `countSegments`)。 */
|
|
178
175
|
function countsText(counts) {
|
|
179
176
|
const parts = [];
|
|
180
177
|
if (counts.red > 0)
|
|
@@ -185,78 +182,111 @@ function countsText(counts) {
|
|
|
185
182
|
return '绿';
|
|
186
183
|
return parts.join(' · ');
|
|
187
184
|
}
|
|
188
|
-
/**
|
|
189
|
-
*
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
185
|
+
/** 把一份计数拆成**按档分色**的几截。红黄各自一截、各自上色,互不串色;
|
|
186
|
+
* 「黄 3」这一截为什么不能被染成红——见 `countSegments` 的注释(出图复评逮到的真缺陷)。 */
|
|
187
|
+
export function countSegsOf(light) {
|
|
188
|
+
if (light.status === null)
|
|
189
|
+
return [{ status: null, text: '—' }];
|
|
190
|
+
const segs = [];
|
|
191
|
+
for (const status of ['red', 'yellow']) {
|
|
192
|
+
const count = light.counts[status];
|
|
193
|
+
if (count > 0)
|
|
194
|
+
segs.push({ status, text: STATUS_LABEL[status] + ' ' + String(count) });
|
|
195
|
+
}
|
|
196
|
+
return segs.length > 0 ? segs : [{ status: 'green', text: '绿' }];
|
|
197
|
+
}
|
|
198
|
+
/** 几截读数之间那个分隔符:不许染档位色(它不属于任何一档)。 */
|
|
199
|
+
const SEG_SEP = ' · ';
|
|
200
|
+
/** 一家的读数**写成一行**(纯文本版:给页签上那枚小数字用)。 */
|
|
201
|
+
function countText(light) {
|
|
202
|
+
return countSegsOf(light).map((piece) => piece.text).join(SEG_SEP);
|
|
203
|
+
}
|
|
204
|
+
/** 汇总行那一句:绿要显眼(它是「正常」这件事本身),没通道的那几家不冒充绿。
|
|
205
|
+
*
|
|
206
|
+
* 「没有体检出口」与「还没跑过体检」是**两件事**(票 #735):前者那颗「体检一次」按下去不会有任何反应,
|
|
207
|
+
* 必须自己说出来——两态共用一句「还没体检」时,用户与诊断都会被引到「点了没跑」上去。 */
|
|
208
|
+
function overallText(lights) {
|
|
209
|
+
const pending = lights.filter((light) => !light.hasChannel).length;
|
|
210
|
+
const withChannel = lights.filter((light) => light.hasChannel);
|
|
211
|
+
const tail = pending > 0 ? ' · ' + String(pending) + ' 家没有体检出口' : '';
|
|
212
|
+
if (withChannel.length === 0) {
|
|
213
|
+
const what = lights.length === 0
|
|
214
|
+
? '还没有任何一家登记体检出口'
|
|
215
|
+
: String(lights.length) + ' 家都没有体检出口(通道名没登记上)';
|
|
216
|
+
return React.createElement('span', { style: { color: STATUS_TEXT.red, fontWeight: 700 } }, '没有可体检的家:' + what);
|
|
217
|
+
}
|
|
218
|
+
const allGreen = withChannel.every((light) => light.status === 'green');
|
|
219
|
+
if (allGreen && pending === 0) {
|
|
220
|
+
return React.createElement('span', { style: { color: STATUS_COLOR.green, fontWeight: 700 } }, '六家正常');
|
|
194
221
|
}
|
|
195
222
|
const parts = [];
|
|
196
223
|
for (const status of ['red', 'yellow']) {
|
|
197
|
-
|
|
224
|
+
let count = 0;
|
|
225
|
+
for (const light of lights)
|
|
226
|
+
count += light.counts[status];
|
|
198
227
|
if (count === 0)
|
|
199
228
|
continue;
|
|
200
|
-
if (parts.length > 0)
|
|
201
|
-
parts.push(React.createElement('span', { key: status + '-sep', style: { color: INK_DIM } },
|
|
202
|
-
}
|
|
229
|
+
if (parts.length > 0)
|
|
230
|
+
parts.push(React.createElement('span', { key: status + '-sep', style: { color: INK_DIM } }, SEG_SEP));
|
|
203
231
|
parts.push(React.createElement('span', { key: status, style: { color: STATUS_TEXT[status], fontWeight: 700 } }, STATUS_LABEL[status] + ' ' + String(count)));
|
|
204
232
|
}
|
|
205
|
-
if (parts.length === 0)
|
|
206
|
-
|
|
207
|
-
|
|
233
|
+
if (parts.length === 0) {
|
|
234
|
+
// 一份报告都没跑过;有出口的已经全绿、只是还有没出口的家时,不许把「还没体检」安到它们头上。
|
|
235
|
+
return React.createElement('span', { style: { color: INK_DIM } }, (allGreen ? '有出口的都正常' : '还没体检') + tail);
|
|
236
|
+
}
|
|
237
|
+
parts.push(React.createElement('span', { key: 'todo', style: { color: INK } }, ' 要处理' + tail));
|
|
238
|
+
return React.createElement('span', null, parts);
|
|
208
239
|
}
|
|
209
|
-
/**
|
|
210
|
-
|
|
211
|
-
|
|
240
|
+
/** 那枚小数字用的底色(比灯色浅一档,压在页签上不抢眼)。 */
|
|
241
|
+
const STATUS_DOT = {
|
|
242
|
+
red: STATUS_COLOR.red,
|
|
243
|
+
yellow: STATUS_COLOR.yellow,
|
|
244
|
+
green: STATUS_COLOR.green,
|
|
245
|
+
};
|
|
246
|
+
/** 页签圆点的颜色与语义(票 #732):从「实心/空心=装没装」改成「颜色=体检档位」。 */
|
|
247
|
+
export const TAB_DOT = {
|
|
248
|
+
/** 没装(页签槽账本里没有这一家)。 */
|
|
249
|
+
absent: STATUS_DOT.green,
|
|
250
|
+
/** 装了、但还没跑过体检。 */
|
|
251
|
+
unchecked: INK_DIM,
|
|
252
|
+
};
|
|
253
|
+
/** 页签圆点该用什么色:装了按档位(红黄绿),没装/没跑过走缺席态。 */
|
|
254
|
+
export function tabDotColor(light) {
|
|
255
|
+
if (!light.hasChannel)
|
|
256
|
+
return TAB_DOT.absent;
|
|
257
|
+
return light.status === null ? TAB_DOT.unchecked : STATUS_DOT[light.status];
|
|
258
|
+
}
|
|
259
|
+
/** 页签上那枚小数字(票 #732):红黄那几家,家名后带一条计数;全绿与没跑过不带。 */
|
|
260
|
+
export const TAB_NOTE_STYLE = {
|
|
261
|
+
marginLeft: 5,
|
|
262
|
+
border: '1px solid ' + BORDER,
|
|
263
|
+
borderRadius: 999,
|
|
264
|
+
padding: '0 5px',
|
|
265
|
+
fontSize: 11,
|
|
266
|
+
fontWeight: 700,
|
|
267
|
+
};
|
|
268
|
+
/** 那枚小数字写什么:只报「要处理」的那两档;一家里红黄都有时先报红那一档(圆点已经按最严重的档上色了)。 */
|
|
269
|
+
export function tabNote(light) {
|
|
270
|
+
if (!light.hasChannel || light.status === null || light.status === 'green')
|
|
271
|
+
return null;
|
|
272
|
+
return countSegsOf(light)[0] ?? null;
|
|
273
|
+
}
|
|
274
|
+
/** 顶部那一行汇总(票 #732:不再一家一盏灯按钮,一行总账 + 一个体检按钮)。
|
|
275
|
+
*
|
|
276
|
+
* 与页签的分工:这行只答「一共几条要处理」;「哪几家、各几条」由页签的圆点与小数字答;
|
|
277
|
+
* 「具体哪一条坏了、去哪修」由那家页签里的 `HealthTable` 答。 */
|
|
278
|
+
export function HealthSummaryLine(props) {
|
|
279
|
+
return React.createElement('div', { style: HEALTH_STYLE.summaryRow, 'data-ilife-health': 'summary' }, React.createElement('div', { style: HEALTH_STYLE.head }, '配置体检'), React.createElement('div', { style: HEALTH_STYLE.summaryText },
|
|
280
|
+
// 一家都没有出口这一态由 overallText 自己说(#735):这里不再用一句「还没体检」把两件事糊成一件。
|
|
281
|
+
props.error !== null ? React.createElement('span', { style: { color: STATUS_TEXT.red } }, props.error) : overallText(props.lights)), React.createElement('button', {
|
|
212
282
|
type: 'button',
|
|
213
283
|
style: props.running ? { ...HEALTH_STYLE.btn, opacity: 0.55, cursor: 'default' } : HEALTH_STYLE.btn,
|
|
214
284
|
disabled: props.running,
|
|
215
285
|
onClick: props.onRun,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
'data-ilife-health': 'light',
|
|
221
|
-
'data-skill': light.id,
|
|
222
|
-
// 档位落到按钮自身的边框与底色上:一眼扫过去先看到颜色,再读家名(票面验收:一屏看红黄)。
|
|
223
|
-
style: light.status === null
|
|
224
|
-
? { ...HEALTH_STYLE.light, ...HEALTH_STYLE.lightIdle }
|
|
225
|
-
: {
|
|
226
|
-
...HEALTH_STYLE.light,
|
|
227
|
-
borderColor: STATUS_COLOR[light.status],
|
|
228
|
-
borderWidth: 1.5,
|
|
229
|
-
background: STATUS_TINT[light.status],
|
|
230
|
-
},
|
|
231
|
-
disabled: light.status === null,
|
|
232
|
-
onClick: () => props.onJump(light.id),
|
|
233
|
-
title: light.status === null
|
|
234
|
-
? '还没体检(或这一家没装)'
|
|
235
|
-
: light.title + ':' + countsText(light.counts),
|
|
236
|
-
}, React.createElement('span', {
|
|
237
|
-
style: {
|
|
238
|
-
width: 10,
|
|
239
|
-
height: 10,
|
|
240
|
-
borderRadius: '50%',
|
|
241
|
-
background: light.status === null ? INK_DIM : STATUS_COLOR[light.status],
|
|
242
|
-
display: 'inline-block',
|
|
243
|
-
},
|
|
244
|
-
}), React.createElement('span', { style: { color: INK, fontWeight: 650 } }, light.title), ...countSegments(light)))), React.createElement('div', { style: HEALTH_STYLE.meta },
|
|
245
|
-
// 三档的含义要**写在屏上**(复评五份里三份独立指出「全屏没有图例,红黄绿只能靠猜」),
|
|
246
|
-
// 且三个词要**按档上色**——「定义红黄绿的那把钥匙自己不上色」是复评点名过的一处。
|
|
247
|
-
props.error !== null
|
|
248
|
-
? props.error
|
|
249
|
-
: [
|
|
250
|
-
React.createElement('span', { key: 'r', style: { color: STATUS_TEXT.red, fontWeight: 700 } }, '红'),
|
|
251
|
-
React.createElement('span', { key: 'r2' }, '=坏了 · '),
|
|
252
|
-
React.createElement('span', { key: 'y', style: { color: STATUS_TEXT.yellow, fontWeight: 700 } }, '黄'),
|
|
253
|
-
React.createElement('span', { key: 'y2' }, '=还没配 · '),
|
|
254
|
-
React.createElement('span', { key: 'g', style: { color: STATUS_TEXT.green, fontWeight: 700 } }, '绿'),
|
|
255
|
-
React.createElement('span', { key: 'g2' }, '=正常 | 只看不改:不建目录、不改配置、不自动重置'),
|
|
256
|
-
// 页签那排也用圆点(`● 装上了/○ 没装`),这里把**顶部那排**的语义写清楚,
|
|
257
|
-
// 免得两排同构的圆点互相抢解释权(复评两份点名)。
|
|
258
|
-
React.createElement('span', { key: 'tab' }, ' · 上面那排圆点是体检灯,点一下跳到那家配置页;下面那排圆点是页签(实心=装上了)'),
|
|
259
|
-
]));
|
|
286
|
+
// 「只看不改」那三条口径从屏上撤下来了(它原先和两排圆点的图例挤在一行),
|
|
287
|
+
// 但它**仍然要说出口**:按钮悬停是它能待的地方(票 #732;测试按产物里的字符串守着)。
|
|
288
|
+
title: '对六家各跑一次配置体检(只看不改:不建目录、不改配置、不自动重置)',
|
|
289
|
+
}, props.running ? '体检中…' : '体检一次'));
|
|
260
290
|
}
|
|
261
291
|
/** 正正常常的那些:绿条只留「名字」,一句话与「去哪修」都不印(票面验收第一条:正常的收成一行)。 */
|
|
262
292
|
function isAttentionItem(item) {
|