weaver-e10-builder 1.5.10 → 1.5.11
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/commands/app.d.ts.map +1 -1
- package/dist/commands/app.js +159 -8
- package/dist/commands/app.js.map +1 -1
- package/dist/commands/designer-setters.d.ts.map +1 -1
- package/dist/commands/designer-setters.js +26 -4
- package/dist/commands/designer-setters.js.map +1 -1
- package/dist/commands/form-association-manage.d.ts.map +1 -1
- package/dist/commands/form-association-manage.js +3 -0
- package/dist/commands/form-association-manage.js.map +1 -1
- package/dist/commands/form-button-actions-cmd.d.ts +3 -0
- package/dist/commands/form-button-actions-cmd.d.ts.map +1 -0
- package/dist/commands/form-button-actions-cmd.js +309 -0
- package/dist/commands/form-button-actions-cmd.js.map +1 -0
- package/dist/commands/form-button-permission-cmd.d.ts +3 -0
- package/dist/commands/form-button-permission-cmd.d.ts.map +1 -0
- package/dist/commands/form-button-permission-cmd.js +132 -0
- package/dist/commands/form-button-permission-cmd.js.map +1 -0
- package/dist/commands/form-button-props-cmd.d.ts +3 -0
- package/dist/commands/form-button-props-cmd.d.ts.map +1 -0
- package/dist/commands/form-button-props-cmd.js +236 -0
- package/dist/commands/form-button-props-cmd.js.map +1 -0
- package/dist/commands/form-button.d.ts.map +1 -1
- package/dist/commands/form-button.js +82 -55
- package/dist/commands/form-button.js.map +1 -1
- package/dist/commands/form-formula-linkage.d.ts.map +1 -1
- package/dist/commands/form-formula-linkage.js +154 -63
- package/dist/commands/form-formula-linkage.js.map +1 -1
- package/dist/commands/form-list-permission.d.ts.map +1 -1
- package/dist/commands/form-list-permission.js +29 -3
- package/dist/commands/form-list-permission.js.map +1 -1
- package/dist/commands/form-list-search-group.d.ts.map +1 -1
- package/dist/commands/form-list-search-group.js +66 -3
- package/dist/commands/form-list-search-group.js.map +1 -1
- package/dist/commands/form-list-utils.d.ts +14 -0
- package/dist/commands/form-list-utils.d.ts.map +1 -1
- package/dist/commands/form-list-utils.js +65 -4
- package/dist/commands/form-list-utils.js.map +1 -1
- package/dist/commands/form-message.d.ts.map +1 -1
- package/dist/commands/form-message.js +16 -4
- package/dist/commands/form-message.js.map +1 -1
- package/dist/commands/form-permission.d.ts +20 -0
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +69 -11
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/menu-permission.d.ts.map +1 -1
- package/dist/commands/menu-permission.js +6 -7
- package/dist/commands/menu-permission.js.map +1 -1
- package/dist/commands/menu.d.ts.map +1 -1
- package/dist/commands/menu.js +63 -40
- package/dist/commands/menu.js.map +1 -1
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +56 -36
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-function-management.d.ts +5 -0
- package/dist/commands/workflow-function-management.d.ts.map +1 -0
- package/dist/commands/workflow-function-management.js +91 -0
- package/dist/commands/workflow-function-management.js.map +1 -0
- package/dist/commands/workflow-node-assign-flow.d.ts.map +1 -1
- package/dist/commands/workflow-node-assign-flow.js +1 -0
- package/dist/commands/workflow-node-assign-flow.js.map +1 -1
- package/dist/commands/workflow-node-sign.d.ts +0 -12
- package/dist/commands/workflow-node-sign.d.ts.map +1 -1
- package/dist/commands/workflow-node-sign.js +31 -102
- package/dist/commands/workflow-node-sign.js.map +1 -1
- package/dist/commands/workflow-opinion-settings.d.ts +5 -0
- package/dist/commands/workflow-opinion-settings.d.ts.map +1 -0
- package/dist/commands/workflow-opinion-settings.js +51 -0
- package/dist/commands/workflow-opinion-settings.js.map +1 -0
- package/dist/commands/workflow-subprocess.d.ts.map +1 -1
- package/dist/commands/workflow-subprocess.js +370 -20
- package/dist/commands/workflow-subprocess.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +35 -61
- package/dist/commands/workflow.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/calendar_mapper.d.ts.map +1 -1
- package/dist/services/actionflow/calendar_mapper.js +30 -4
- package/dist/services/actionflow/calendar_mapper.js.map +1 -1
- package/dist/services/actionflow/component_registry.d.ts.map +1 -1
- package/dist/services/actionflow/component_registry.js +6 -0
- package/dist/services/actionflow/component_registry.js.map +1 -1
- package/dist/services/actionflow/components/meeting_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/meeting_create.js +5 -1
- package/dist/services/actionflow/components/meeting_create.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +15 -3
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +7 -0
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +25 -0
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/app-publish.d.ts +25 -0
- package/dist/services/app-publish.d.ts.map +1 -1
- package/dist/services/app-publish.js +38 -0
- package/dist/services/app-publish.js.map +1 -1
- package/dist/services/app-range.d.ts +66 -0
- package/dist/services/app-range.d.ts.map +1 -0
- package/dist/services/app-range.js +137 -0
- package/dist/services/app-range.js.map +1 -0
- package/dist/services/form-association.d.ts +13 -0
- package/dist/services/form-association.d.ts.map +1 -1
- package/dist/services/form-association.js +42 -0
- package/dist/services/form-association.js.map +1 -1
- package/dist/services/form-button-action.d.ts +82 -0
- package/dist/services/form-button-action.d.ts.map +1 -1
- package/dist/services/form-button-action.js +194 -2
- package/dist/services/form-button-action.js.map +1 -1
- package/dist/services/form-button-condition.d.ts +45 -0
- package/dist/services/form-button-condition.d.ts.map +1 -0
- package/dist/services/form-button-condition.js +106 -0
- package/dist/services/form-button-condition.js.map +1 -0
- package/dist/services/form-button-context.d.ts +41 -0
- package/dist/services/form-button-context.d.ts.map +1 -0
- package/dist/services/form-button-context.js +54 -0
- package/dist/services/form-button-context.js.map +1 -0
- package/dist/services/form-button-logicflow.d.ts +30 -0
- package/dist/services/form-button-logicflow.d.ts.map +1 -0
- package/dist/services/form-button-logicflow.js +59 -0
- package/dist/services/form-button-logicflow.js.map +1 -0
- package/dist/services/form-button-org.d.ts +30 -0
- package/dist/services/form-button-org.d.ts.map +1 -0
- package/dist/services/form-button-org.js +80 -0
- package/dist/services/form-button-org.js.map +1 -0
- package/dist/services/form-button-permission.d.ts +65 -0
- package/dist/services/form-button-permission.d.ts.map +1 -0
- package/dist/services/form-button-permission.js +113 -0
- package/dist/services/form-button-permission.js.map +1 -0
- package/dist/services/form-button-position.d.ts +4 -18
- package/dist/services/form-button-position.d.ts.map +1 -1
- package/dist/services/form-button-position.js +4 -36
- package/dist/services/form-button-position.js.map +1 -1
- package/dist/services/form-button-props.d.ts +55 -0
- package/dist/services/form-button-props.d.ts.map +1 -0
- package/dist/services/form-button-props.js +90 -0
- package/dist/services/form-button-props.js.map +1 -0
- package/dist/services/form-button-save.d.ts +49 -0
- package/dist/services/form-button-save.d.ts.map +1 -0
- package/dist/services/form-button-save.js +54 -0
- package/dist/services/form-button-save.js.map +1 -0
- package/dist/services/form-formula-linkage.d.ts +116 -20
- package/dist/services/form-formula-linkage.d.ts.map +1 -1
- package/dist/services/form-formula-linkage.js +250 -38
- package/dist/services/form-formula-linkage.js.map +1 -1
- package/dist/services/form-list-search-group.d.ts +17 -2
- package/dist/services/form-list-search-group.d.ts.map +1 -1
- package/dist/services/form-list-search-group.js +29 -12
- package/dist/services/form-list-search-group.js.map +1 -1
- package/dist/services/form-list-search.d.ts.map +1 -1
- package/dist/services/form-list-search.js +4 -0
- package/dist/services/form-list-search.js.map +1 -1
- package/dist/services/form-list-stats.d.ts.map +1 -1
- package/dist/services/form-list-stats.js +9 -2
- package/dist/services/form-list-stats.js.map +1 -1
- package/dist/services/form-message.d.ts +26 -7
- package/dist/services/form-message.d.ts.map +1 -1
- package/dist/services/form-message.js +52 -5
- package/dist/services/form-message.js.map +1 -1
- package/dist/services/form-permission-archive.d.ts +9 -1
- package/dist/services/form-permission-archive.d.ts.map +1 -1
- package/dist/services/form-permission-archive.js +38 -22
- package/dist/services/form-permission-archive.js.map +1 -1
- package/dist/services/form-view-populate.d.ts.map +1 -1
- package/dist/services/form-view-populate.js +7 -0
- package/dist/services/form-view-populate.js.map +1 -1
- package/dist/services/icon-path.d.ts +70 -0
- package/dist/services/icon-path.d.ts.map +1 -0
- package/dist/services/icon-path.js +80 -0
- package/dist/services/icon-path.js.map +1 -0
- package/dist/services/matrix-condition.d.ts +161 -0
- package/dist/services/matrix-condition.d.ts.map +1 -0
- package/dist/services/matrix-condition.js +403 -0
- package/dist/services/matrix-condition.js.map +1 -0
- package/dist/services/menu-catalog.d.ts +33 -0
- package/dist/services/menu-catalog.d.ts.map +1 -1
- package/dist/services/menu-catalog.js +56 -0
- package/dist/services/menu-catalog.js.map +1 -1
- package/dist/services/permission-entity.d.ts +55 -0
- package/dist/services/permission-entity.d.ts.map +1 -0
- package/dist/services/permission-entity.js +79 -0
- package/dist/services/permission-entity.js.map +1 -0
- package/dist/services/workflow-assign-flow.d.ts.map +1 -1
- package/dist/services/workflow-assign-flow.js.map +1 -1
- package/dist/services/workflow-function-management.d.ts +123 -0
- package/dist/services/workflow-function-management.d.ts.map +1 -0
- package/dist/services/workflow-function-management.js +425 -0
- package/dist/services/workflow-function-management.js.map +1 -0
- package/dist/services/workflow-matrix-rule.d.ts +34 -0
- package/dist/services/workflow-matrix-rule.d.ts.map +1 -0
- package/dist/services/workflow-matrix-rule.js +94 -0
- package/dist/services/workflow-matrix-rule.js.map +1 -0
- package/dist/services/workflow-opinion-settings.d.ts +67 -0
- package/dist/services/workflow-opinion-settings.d.ts.map +1 -0
- package/dist/services/workflow-opinion-settings.js +328 -0
- package/dist/services/workflow-opinion-settings.js.map +1 -0
- package/package.json +1 -1
- package/skill-docs/SKILL.md +5 -5
- package/skill-docs/_catalog.md +3 -0
- package/skill-docs/actionflows/references/components/calendar/MeetingCreate.md +2 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveDelete.md +1 -1
- package/skill-docs/references/common/ref-cli-commands.md +60 -22
- package/skill-docs/references/ebuilder-designer/guide-designer-components.md +9 -0
- package/skill-docs/references/form/guide-form-archive-permission.md +55 -2
- package/skill-docs/references/form/guide-form-association.md +13 -0
- package/skill-docs/references/form/guide-form-button.md +87 -0
- package/skill-docs/references/form/guide-form-message.md +19 -2
- package/skill-docs/references/form/guide-form-view.md +23 -3
- package/skill-docs/references/form/guide-formula-linkage.md +42 -11
- package/skill-docs/references/workflow/guide-function-management.md +154 -0
- package/skill-docs/references/workflow/guide-opinion-settings.md +126 -0
- package/skill-docs/references/workflow/guide-workflow.md +22 -6
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 逻辑流(前端逻辑编排)按名字解析 —— 给按钮的「触发逻辑流」动作找 `id`。
|
|
3
|
+
*
|
|
4
|
+
* 端点:`POST /api/bs/component/logic/flow/page`,body `{current, size, appId, type:'FRONTEND'}`,
|
|
5
|
+
* 返回 `data.records[]`(`id` / `name` / `scene` / `isEnable` …)。
|
|
6
|
+
*
|
|
7
|
+
* ⚠ **流的 `ecodeId` 这里查不到** —— 它只在逻辑流 `create` 返回里。
|
|
8
|
+
* 好在运行时不消费它(`ExecLogicFlow.ts` 只读 `data[0].id`),绑定时留空即可,
|
|
9
|
+
* 已经绑过的可以沿用旧 action 里的值。这一条是同事 `logic-flow-composer` skill 的实测结论。
|
|
10
|
+
*/
|
|
11
|
+
import type { ApiClient } from '../core/client.js';
|
|
12
|
+
type Client = Pick<ApiClient, 'get' | 'post'>;
|
|
13
|
+
/** 列表里的一行(只取绑定用得到的字段)。 */
|
|
14
|
+
export interface LogicFlowOption {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
scene: string;
|
|
18
|
+
isEnable: number;
|
|
19
|
+
}
|
|
20
|
+
/** 拉全量前端逻辑流(分页翻完;`page` 上限兜底防死循环)。 */
|
|
21
|
+
export declare function listLogicFlows(client: Client, base: string, appId: string, pageSize?: number): Promise<LogicFlowOption[]>;
|
|
22
|
+
/**
|
|
23
|
+
* 按 **id 或名字** 解析出一条逻辑流。
|
|
24
|
+
*
|
|
25
|
+
* 名字必须**精确同名**:撞名不取首条(取错流等于把按钮绑到别的流程上,事后很难查),
|
|
26
|
+
* 报错时并列候选 id;找不到时列出该应用现有的流名,省一次来回。
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveLogicFlow(client: Client, base: string, appId: string, nameOrId: string): Promise<LogicFlowOption>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=form-button-logicflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-logicflow.d.ts","sourceRoot":"","sources":["../../src/services/form-button-logicflow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE9C,0BAA0B;AAC1B,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,sCAAsC;AACtC,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAkB5H;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAgB9H"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 逻辑流(前端逻辑编排)按名字解析 —— 给按钮的「触发逻辑流」动作找 `id`。
|
|
3
|
+
*
|
|
4
|
+
* 端点:`POST /api/bs/component/logic/flow/page`,body `{current, size, appId, type:'FRONTEND'}`,
|
|
5
|
+
* 返回 `data.records[]`(`id` / `name` / `scene` / `isEnable` …)。
|
|
6
|
+
*
|
|
7
|
+
* ⚠ **流的 `ecodeId` 这里查不到** —— 它只在逻辑流 `create` 返回里。
|
|
8
|
+
* 好在运行时不消费它(`ExecLogicFlow.ts` 只读 `data[0].id`),绑定时留空即可,
|
|
9
|
+
* 已经绑过的可以沿用旧 action 里的值。这一条是同事 `logic-flow-composer` skill 的实测结论。
|
|
10
|
+
*/
|
|
11
|
+
const LOGIC_FLOW_PAGE = '/api/bs/component/logic/flow/page';
|
|
12
|
+
/** 拉全量前端逻辑流(分页翻完;`page` 上限兜底防死循环)。 */
|
|
13
|
+
export async function listLogicFlows(client, base, appId, pageSize = 100) {
|
|
14
|
+
const all = [];
|
|
15
|
+
for (let current = 1; current <= 100; current += 1) {
|
|
16
|
+
const response = await client.post(`${base}${LOGIC_FLOW_PAGE}`, {
|
|
17
|
+
current, size: pageSize, appId, type: 'FRONTEND',
|
|
18
|
+
});
|
|
19
|
+
if (response?.code !== 200)
|
|
20
|
+
throw new Error(`读取逻辑流列表失败: ${response?.msg || '未知错误'}`);
|
|
21
|
+
const records = Array.isArray(response?.data?.records) ? response.data.records : [];
|
|
22
|
+
all.push(...records.map((r) => ({
|
|
23
|
+
id: String(r?.id ?? ''),
|
|
24
|
+
name: String(r?.name ?? ''),
|
|
25
|
+
scene: String(r?.scene ?? ''),
|
|
26
|
+
isEnable: Number(r?.isEnable ?? 0),
|
|
27
|
+
})));
|
|
28
|
+
const pages = Number(response?.data?.pages ?? 1);
|
|
29
|
+
if (!records.length || current >= pages)
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
return all.filter((f) => f.id);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 按 **id 或名字** 解析出一条逻辑流。
|
|
36
|
+
*
|
|
37
|
+
* 名字必须**精确同名**:撞名不取首条(取错流等于把按钮绑到别的流程上,事后很难查),
|
|
38
|
+
* 报错时并列候选 id;找不到时列出该应用现有的流名,省一次来回。
|
|
39
|
+
*/
|
|
40
|
+
export async function resolveLogicFlow(client, base, appId, nameOrId) {
|
|
41
|
+
const value = String(nameOrId ?? '').trim();
|
|
42
|
+
if (!value)
|
|
43
|
+
throw new Error('逻辑流不能为空');
|
|
44
|
+
const flows = await listLogicFlows(client, base, appId);
|
|
45
|
+
const byId = flows.filter((f) => f.id === value);
|
|
46
|
+
if (byId.length === 1)
|
|
47
|
+
return byId[0];
|
|
48
|
+
const exact = flows.filter((f) => f.name === value);
|
|
49
|
+
if (exact.length === 1)
|
|
50
|
+
return exact[0];
|
|
51
|
+
if (exact.length > 1) {
|
|
52
|
+
throw new Error(`逻辑流「${value}」匹配到 ${exact.length} 条同名记录,无法确定是哪一个:`
|
|
53
|
+
+ `${exact.map((f) => f.id).join('、')}。改用 --logic-id 指定`);
|
|
54
|
+
}
|
|
55
|
+
if (!flows.length)
|
|
56
|
+
throw new Error(`应用 ${appId} 下没有任何前端逻辑流`);
|
|
57
|
+
throw new Error(`未找到逻辑流「${value}」。应用下现有:${flows.map((f) => f.name).join('、')}`);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=form-button-logicflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-logicflow.js","sourceRoot":"","sources":["../../src/services/form-button-logicflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按钮权限的「授权对象」解析:名字或 ID → `content`(id) + `contentSpan`(显示名)。
|
|
3
|
+
*
|
|
4
|
+
* 按钮权限条目里主体是**两个键**:`content` 存 id、`contentSpan` 存显示名,
|
|
5
|
+
* 少了 `contentSpan` 界面上那行就是空的。所以**不能只写 id**,必须把名字也取回来。
|
|
6
|
+
*
|
|
7
|
+
* 复用两条既有入口(同 `role add-member`):
|
|
8
|
+
* - **按名字**:人员走 `getEmployeeByKeyWords`;部门/分部走 `browser/data/{kind}`。都过 `pickExact`
|
|
9
|
+
* (精确同名优先,撞名报错并列候选)—— 绝不取首条,否则同名时静默配错对象。
|
|
10
|
+
* - **按 ID**:走 `browser/destData/{kind}` 把对象取回来(`destData` 对不存在的 id
|
|
11
|
+
* **一声不吭地丢掉**,所以必须 `assertAllIdsResolved` 核对)。
|
|
12
|
+
*/
|
|
13
|
+
import type { ApiClient } from '../core/client.js';
|
|
14
|
+
type Client = Pick<ApiClient, 'get' | 'post'>;
|
|
15
|
+
/** 按钮权限里认得的三类「具体对象」(不含「全体」,全体没有主体)。 */
|
|
16
|
+
export type PermissionSubjectKind = 'company' | 'department' | 'resource';
|
|
17
|
+
/** 按关键词搜人员。 */
|
|
18
|
+
export declare function searchEmployees(client: Client, base: string, keyword: string): Promise<any[]>;
|
|
19
|
+
/**
|
|
20
|
+
* 解析一个授权对象。
|
|
21
|
+
*
|
|
22
|
+
* 入参是**很长的纯数字**就按 ID 走 `destData`,否则按名字搜。两条路都必须拿到显示名 ——
|
|
23
|
+
* 拿不到就报错,绝不用 id 冒充 `contentSpan`(那样界面上是一行空白,事后没法查)。
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolvePermissionSubject(client: Client, base: string, kind: PermissionSubjectKind, nameOrId: string): Promise<{
|
|
26
|
+
id: string;
|
|
27
|
+
name: string;
|
|
28
|
+
}>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=form-button-org.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-org.d.ts","sourceRoot":"","sources":["../../src/services/form-button-org.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAE9C,uCAAuC;AACvC,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,CAAC;AAc1E,eAAe;AACf,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAOnG;AAsBD;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,GAC1E,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBvC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按钮权限的「授权对象」解析:名字或 ID → `content`(id) + `contentSpan`(显示名)。
|
|
3
|
+
*
|
|
4
|
+
* 按钮权限条目里主体是**两个键**:`content` 存 id、`contentSpan` 存显示名,
|
|
5
|
+
* 少了 `contentSpan` 界面上那行就是空的。所以**不能只写 id**,必须把名字也取回来。
|
|
6
|
+
*
|
|
7
|
+
* 复用两条既有入口(同 `role add-member`):
|
|
8
|
+
* - **按名字**:人员走 `getEmployeeByKeyWords`;部门/分部走 `browser/data/{kind}`。都过 `pickExact`
|
|
9
|
+
* (精确同名优先,撞名报错并列候选)—— 绝不取首条,否则同名时静默配错对象。
|
|
10
|
+
* - **按 ID**:走 `browser/destData/{kind}` 把对象取回来(`destData` 对不存在的 id
|
|
11
|
+
* **一声不吭地丢掉**,所以必须 `assertAllIdsResolved` 核对)。
|
|
12
|
+
*/
|
|
13
|
+
import { ORG_BROWSER_BASE, ORG_BROWSE_LABEL, buildOrgListPayload, extractOrgList } from './org-browser.js';
|
|
14
|
+
import { DEST_DATA_BASE, MEMBER_KIND_LABEL, buildDestDataPayload, extractDestDataItems, assertAllIdsResolved, pickExact, } from './role-member.js';
|
|
15
|
+
/** 按钮权限的 `permissionType` → 组织接口的 `kind`。 */
|
|
16
|
+
const ORG_KIND_OF = {
|
|
17
|
+
company: 'subcompany',
|
|
18
|
+
department: 'department',
|
|
19
|
+
resource: 'resource',
|
|
20
|
+
};
|
|
21
|
+
/** 平台 id 的形态(19 位数字)。够长的纯数字就当 ID,否则当名字。 */
|
|
22
|
+
function looksLikeId(value) {
|
|
23
|
+
return /^\d{10,}$/.test(value);
|
|
24
|
+
}
|
|
25
|
+
/** 按关键词搜人员。 */
|
|
26
|
+
export async function searchEmployees(client, base, keyword) {
|
|
27
|
+
const res = await client.post(`${base}/api/hrm/common/getEmployeeByKeyWords`, {
|
|
28
|
+
keyword, searchType: 1, searchCount: 20, appDetachModule: 'EM',
|
|
29
|
+
disableAppDetach: 0, pageNo: 1, pageSize: 20,
|
|
30
|
+
});
|
|
31
|
+
if (res?.code !== 200)
|
|
32
|
+
throw new Error(`搜索人员「${keyword}」失败: ${res?.msg || '未知错误'}`);
|
|
33
|
+
return res?.data?.userList || [];
|
|
34
|
+
}
|
|
35
|
+
/** 按关键词搜部门/分部。 */
|
|
36
|
+
async function searchOrgs(client, base, kind, keyword) {
|
|
37
|
+
const res = await client.post(`${base}${ORG_BROWSER_BASE}/${kind}`, buildOrgListPayload(kind, { name: keyword, pageSize: 50 }));
|
|
38
|
+
if (res?.code !== 200)
|
|
39
|
+
throw new Error(`搜索${ORG_BROWSE_LABEL[kind]}「${keyword}」失败: ${res?.msg || '未知错误'}`);
|
|
40
|
+
return extractOrgList(res).rows;
|
|
41
|
+
}
|
|
42
|
+
/** 按 ID 取对象(第二条入口)。 */
|
|
43
|
+
async function readByIds(client, base, kind, ids) {
|
|
44
|
+
const label = MEMBER_KIND_LABEL[kind];
|
|
45
|
+
const res = await client.post(`${base}${DEST_DATA_BASE}/${kind}`, buildDestDataPayload(kind, ids));
|
|
46
|
+
if (res?.code !== 200)
|
|
47
|
+
throw new Error(`按 ID 取${label}失败: ${res?.msg || '未知错误'}`);
|
|
48
|
+
const items = extractDestDataItems(res);
|
|
49
|
+
assertAllIdsResolved(ids, items, label);
|
|
50
|
+
return items;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 解析一个授权对象。
|
|
54
|
+
*
|
|
55
|
+
* 入参是**很长的纯数字**就按 ID 走 `destData`,否则按名字搜。两条路都必须拿到显示名 ——
|
|
56
|
+
* 拿不到就报错,绝不用 id 冒充 `contentSpan`(那样界面上是一行空白,事后没法查)。
|
|
57
|
+
*/
|
|
58
|
+
export async function resolvePermissionSubject(client, base, kind, nameOrId) {
|
|
59
|
+
const value = String(nameOrId ?? '').trim();
|
|
60
|
+
if (!value)
|
|
61
|
+
throw new Error('授权对象不能为空');
|
|
62
|
+
const orgKind = ORG_KIND_OF[kind];
|
|
63
|
+
const label = MEMBER_KIND_LABEL[orgKind];
|
|
64
|
+
if (looksLikeId(value)) {
|
|
65
|
+
const item = (await readByIds(client, base, orgKind, [value]))[0];
|
|
66
|
+
const name = String(item?.name ?? item?.content ?? '').trim();
|
|
67
|
+
if (!name)
|
|
68
|
+
throw new Error(`${label} ${value} 取回来了但拿不到名称,无法写入按钮权限`);
|
|
69
|
+
return { id: String(item?.id ?? value), name };
|
|
70
|
+
}
|
|
71
|
+
const rows = orgKind === 'resource'
|
|
72
|
+
? await searchEmployees(client, base, value)
|
|
73
|
+
: await searchOrgs(client, base, orgKind, value);
|
|
74
|
+
const picked = pickExact(rows, value, label, (x) => x?.name);
|
|
75
|
+
const name = String(picked?.name ?? '').trim();
|
|
76
|
+
if (!name)
|
|
77
|
+
throw new Error(`${label}「${value}」搜索到了但没有名称,无法写入按钮权限`);
|
|
78
|
+
return { id: String(picked?.id ?? ''), name };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=form-button-org.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-org.js","sourceRoot":"","sources":["../../src/services/form-button-org.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按钮权限(`permissionDatas[]`)的构造与识别(纯函数)。
|
|
3
|
+
*
|
|
4
|
+
* ⚠ **这不是表单数据权限那套。** 表单/台账/归档权限走 `permission/addRight`,
|
|
5
|
+
* 对象形状是 `orgType` / `codeType` / `rightType`(见 `src/commands/form-permission.ts`)。
|
|
6
|
+
* 按钮权限是**另一套**:判别键叫 `permissionType`,值形如 `all` / `company` / `department` / `resource`,
|
|
7
|
+
* 主体直接写 `content`(id) + `contentSpan`(显示名),**和 `saveOrUpdate` 一起提交**,没有独立端点。
|
|
8
|
+
*
|
|
9
|
+
* 形状来自真机抓包(设计器往按钮上挂 分部/部门/人员 各一条):
|
|
10
|
+
* 分部 `permissionType:"company"`、部门 `"department"`、人员 `"resource"` + `fieldType:"employee"`。
|
|
11
|
+
* 「全体」的默认行是平台**自己建**的(创建按钮时 `permissionDatas:[]` 也会落一条 `all`)。
|
|
12
|
+
*
|
|
13
|
+
* 条目里那些空键(`jobLevel` / `excludeObj` / `condition` …)都是平台自己的占位,必须原样带上。
|
|
14
|
+
*/
|
|
15
|
+
/** 目前支持的授权对象类型(其余类型形状未知,遇到就报错,不猜着写)。 */
|
|
16
|
+
export declare const BUTTON_PERMISSION_TYPES: readonly ["all", "company", "department", "resource"];
|
|
17
|
+
export type ButtonPermissionType = (typeof BUTTON_PERMISSION_TYPES)[number];
|
|
18
|
+
/** 类型的中文名。 */
|
|
19
|
+
export declare const BUTTON_PERMISSION_LABEL: Record<ButtonPermissionType, string>;
|
|
20
|
+
/** 认得出的 `permissionType` 才能继续;其余一律抛错并列出可用的。 */
|
|
21
|
+
export declare function assertKnownPermissionType(value: string): asserts value is ButtonPermissionType;
|
|
22
|
+
export interface PermissionEntryInput {
|
|
23
|
+
permissionType: ButtonPermissionType;
|
|
24
|
+
/** 授权对象的 id(全体为空)。 */
|
|
25
|
+
content?: string;
|
|
26
|
+
/** 授权对象的显示名(全体为空)。 */
|
|
27
|
+
contentSpan?: string;
|
|
28
|
+
/** 是否含下级(部门/分部常见)。 */
|
|
29
|
+
containExtra?: boolean;
|
|
30
|
+
/** 更新既有条目时带上原 id;新增留空串。 */
|
|
31
|
+
id?: string;
|
|
32
|
+
/** 1 总部 / 2 分部 / 3 部门;缺省 `'1'`。 */
|
|
33
|
+
roleLevel?: string;
|
|
34
|
+
/** 「是否启用该行」;抓包里设计器新建的条目是 0,平台自建的 `all` 是 1。 */
|
|
35
|
+
opened?: number;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 造一条按钮权限。
|
|
39
|
+
*
|
|
40
|
+
* 逐键对齐抓包:分部/部门带 `fieldType:''` + `creatorType:'0'` + `fieldtype:''`,
|
|
41
|
+
* 人员则是 `fieldType:'employee'` 且**不带** `creatorType`/`fieldtype`(设计器就是这么发的,照抄)。
|
|
42
|
+
*/
|
|
43
|
+
export declare function buildPermissionEntry(input: PermissionEntryInput): Record<string, unknown>;
|
|
44
|
+
/** 「全体」条目 —— 平台自建的那条长这样(`opened:1`)。 */
|
|
45
|
+
export declare function allPermissionEntry(): Record<string, unknown>;
|
|
46
|
+
/** 条目的可读标签,如「分部:泛微北京」。 */
|
|
47
|
+
export declare function permissionLabel(entry: any): string;
|
|
48
|
+
/**
|
|
49
|
+
* 条目的可比签名 —— 回读校验用。
|
|
50
|
+
*
|
|
51
|
+
* 只比「类型 + 主体 + 含不含下级」:平台会给新条目补 `id` / `buttonId` / `index` / `layoutNames`
|
|
52
|
+
* 之类的服务端字段,顺序也可能变,逐字比必然误报。
|
|
53
|
+
*/
|
|
54
|
+
export declare function permissionSignature(entry: any): string;
|
|
55
|
+
/** 按签名判断某条权限是否已在列表里(用于幂等去重)。 */
|
|
56
|
+
export declare function hasPermission(entries: any[], entry: any): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* 在列表里找一条权限:选择器是纯数字就当 **1-based 序号**(与 `list` 输出一致),
|
|
59
|
+
* 否则按权限 id 匹配。找不到抛错(静默不删会让人以为删掉了)。
|
|
60
|
+
*/
|
|
61
|
+
export declare function findPermission(entries: any[], selector: string): {
|
|
62
|
+
entry: any;
|
|
63
|
+
index: number;
|
|
64
|
+
};
|
|
65
|
+
//# sourceMappingURL=form-button-permission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-permission.d.ts","sourceRoot":"","sources":["../../src/services/form-button-permission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,wCAAwC;AACxC,eAAO,MAAM,uBAAuB,uDAAwD,CAAC;AAE7F,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,cAAc;AACd,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAKxE,CAAC;AAEF,+CAA+C;AAC/C,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,IAAI,oBAAoB,CAO9F;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,oBAAoB,CAAC;IACrC,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2BAA2B;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0BzF;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE5D;AAED,0BAA0B;AAC1B,wBAAgB,eAAe,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAKlD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAMtD;AAED,gCAAgC;AAChC,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAGjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,GAAG,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAa9F"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按钮权限(`permissionDatas[]`)的构造与识别(纯函数)。
|
|
3
|
+
*
|
|
4
|
+
* ⚠ **这不是表单数据权限那套。** 表单/台账/归档权限走 `permission/addRight`,
|
|
5
|
+
* 对象形状是 `orgType` / `codeType` / `rightType`(见 `src/commands/form-permission.ts`)。
|
|
6
|
+
* 按钮权限是**另一套**:判别键叫 `permissionType`,值形如 `all` / `company` / `department` / `resource`,
|
|
7
|
+
* 主体直接写 `content`(id) + `contentSpan`(显示名),**和 `saveOrUpdate` 一起提交**,没有独立端点。
|
|
8
|
+
*
|
|
9
|
+
* 形状来自真机抓包(设计器往按钮上挂 分部/部门/人员 各一条):
|
|
10
|
+
* 分部 `permissionType:"company"`、部门 `"department"`、人员 `"resource"` + `fieldType:"employee"`。
|
|
11
|
+
* 「全体」的默认行是平台**自己建**的(创建按钮时 `permissionDatas:[]` 也会落一条 `all`)。
|
|
12
|
+
*
|
|
13
|
+
* 条目里那些空键(`jobLevel` / `excludeObj` / `condition` …)都是平台自己的占位,必须原样带上。
|
|
14
|
+
*/
|
|
15
|
+
/** 目前支持的授权对象类型(其余类型形状未知,遇到就报错,不猜着写)。 */
|
|
16
|
+
export const BUTTON_PERMISSION_TYPES = ['all', 'company', 'department', 'resource'];
|
|
17
|
+
/** 类型的中文名。 */
|
|
18
|
+
export const BUTTON_PERMISSION_LABEL = {
|
|
19
|
+
all: '全体',
|
|
20
|
+
company: '分部',
|
|
21
|
+
department: '部门',
|
|
22
|
+
resource: '人员',
|
|
23
|
+
};
|
|
24
|
+
/** 认得出的 `permissionType` 才能继续;其余一律抛错并列出可用的。 */
|
|
25
|
+
export function assertKnownPermissionType(value) {
|
|
26
|
+
if (!BUTTON_PERMISSION_TYPES.includes(value)) {
|
|
27
|
+
throw new Error(`不认识的按钮权限类型「${value}」;可用:`
|
|
28
|
+
+ BUTTON_PERMISSION_TYPES.map((t) => `${BUTTON_PERMISSION_LABEL[t]} ${t}`).join(' / '));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 造一条按钮权限。
|
|
33
|
+
*
|
|
34
|
+
* 逐键对齐抓包:分部/部门带 `fieldType:''` + `creatorType:'0'` + `fieldtype:''`,
|
|
35
|
+
* 人员则是 `fieldType:'employee'` 且**不带** `creatorType`/`fieldtype`(设计器就是这么发的,照抄)。
|
|
36
|
+
*/
|
|
37
|
+
export function buildPermissionEntry(input) {
|
|
38
|
+
const { permissionType } = input;
|
|
39
|
+
const entry = {
|
|
40
|
+
roleLevel: input.roleLevel ?? '1',
|
|
41
|
+
};
|
|
42
|
+
if (permissionType === 'resource') {
|
|
43
|
+
entry.fieldType = 'employee';
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
entry.fieldType = '';
|
|
47
|
+
entry.creatorType = '0';
|
|
48
|
+
entry.fieldtype = '';
|
|
49
|
+
}
|
|
50
|
+
entry.id = input.id ?? '';
|
|
51
|
+
entry.permissionType = permissionType;
|
|
52
|
+
entry.contentSpan = input.contentSpan ?? '';
|
|
53
|
+
entry.content = input.content ?? '';
|
|
54
|
+
entry.levelScope = { minShowlevel: '', maxShowlevel: '' };
|
|
55
|
+
entry.relation = '0';
|
|
56
|
+
entry.jobLevel = '';
|
|
57
|
+
entry.jobLevelText = '';
|
|
58
|
+
entry.jobLevelTextSpan = '';
|
|
59
|
+
entry.excludeObj = '';
|
|
60
|
+
entry.containExtra = input.containExtra ? '1' : '0';
|
|
61
|
+
entry.opened = input.opened ?? (permissionType === 'all' ? 1 : 0);
|
|
62
|
+
entry.condition = { conditionsql: '', rootdata: '' };
|
|
63
|
+
return entry;
|
|
64
|
+
}
|
|
65
|
+
/** 「全体」条目 —— 平台自建的那条长这样(`opened:1`)。 */
|
|
66
|
+
export function allPermissionEntry() {
|
|
67
|
+
return buildPermissionEntry({ permissionType: 'all' });
|
|
68
|
+
}
|
|
69
|
+
/** 条目的可读标签,如「分部:泛微北京」。 */
|
|
70
|
+
export function permissionLabel(entry) {
|
|
71
|
+
const type = String(entry?.permissionType ?? '');
|
|
72
|
+
const label = BUTTON_PERMISSION_LABEL[type] ?? (type || '未知');
|
|
73
|
+
const span = String(entry?.contentSpan ?? '').trim();
|
|
74
|
+
return span ? `${label}:${span}` : label;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 条目的可比签名 —— 回读校验用。
|
|
78
|
+
*
|
|
79
|
+
* 只比「类型 + 主体 + 含不含下级」:平台会给新条目补 `id` / `buttonId` / `index` / `layoutNames`
|
|
80
|
+
* 之类的服务端字段,顺序也可能变,逐字比必然误报。
|
|
81
|
+
*/
|
|
82
|
+
export function permissionSignature(entry) {
|
|
83
|
+
return JSON.stringify([
|
|
84
|
+
String(entry?.permissionType ?? ''),
|
|
85
|
+
String(entry?.content ?? ''),
|
|
86
|
+
String(entry?.containExtra ?? ''),
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
/** 按签名判断某条权限是否已在列表里(用于幂等去重)。 */
|
|
90
|
+
export function hasPermission(entries, entry) {
|
|
91
|
+
const target = permissionSignature(entry);
|
|
92
|
+
return (entries ?? []).some((item) => permissionSignature(item) === target);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 在列表里找一条权限:选择器是纯数字就当 **1-based 序号**(与 `list` 输出一致),
|
|
96
|
+
* 否则按权限 id 匹配。找不到抛错(静默不删会让人以为删掉了)。
|
|
97
|
+
*/
|
|
98
|
+
export function findPermission(entries, selector) {
|
|
99
|
+
const all = entries ?? [];
|
|
100
|
+
const raw = String(selector).trim();
|
|
101
|
+
if (/^\d+$/.test(raw)) {
|
|
102
|
+
const index = Number(raw) - 1;
|
|
103
|
+
if (index < 0 || index >= all.length) {
|
|
104
|
+
throw new Error(`序号 ${raw} 越界(当前 ${all.length} 条,序号从 1 起)`);
|
|
105
|
+
}
|
|
106
|
+
return { entry: all[index], index };
|
|
107
|
+
}
|
|
108
|
+
const index = all.findIndex((item) => String(item?.id ?? '') === raw);
|
|
109
|
+
if (index < 0)
|
|
110
|
+
throw new Error(`找不到按钮权限 ${raw}(用 form button permission 看现有列表)`);
|
|
111
|
+
return { entry: all[index], index };
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=form-button-permission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-permission.js","sourceRoot":"","sources":["../../src/services/form-button-permission.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,21 @@
|
|
|
1
1
|
import type { ApiClient } from '../core/client.js';
|
|
2
|
+
import { readButton, readButtonContext, type ButtonContext, type ButtonViews } from './form-button-context.js';
|
|
3
|
+
export { readButton, readButtonContext };
|
|
4
|
+
export type { ButtonContext, ButtonViews };
|
|
2
5
|
type Client = Pick<ApiClient, 'get' | 'post'>;
|
|
3
6
|
export type Positions = Record<string, string[]>;
|
|
4
|
-
export interface ButtonViews {
|
|
5
|
-
table?: Array<{
|
|
6
|
-
id: string;
|
|
7
|
-
name: string;
|
|
8
|
-
}>;
|
|
9
|
-
form?: Array<{
|
|
10
|
-
id: string;
|
|
11
|
-
name: string;
|
|
12
|
-
}>;
|
|
13
|
-
}
|
|
14
7
|
export declare function parsePositions(value: unknown): Positions;
|
|
15
8
|
export declare function resolveButtonView(view: string, catalog: ButtonViews): string;
|
|
16
9
|
export declare function buildButtonPosition(existing: unknown, patch: Positions, catalog: ButtonViews, replace?: boolean): {
|
|
17
10
|
showPosition: string;
|
|
18
11
|
showPositionSpan: any;
|
|
19
12
|
};
|
|
20
|
-
export declare function readButton(client: Client, base: string, appId: string, objId: string, buttonId: string): Promise<any>;
|
|
21
|
-
export declare function readButtonContext(client: Client, base: string, appId: string, objId: string, buttonId: string): Promise<{
|
|
22
|
-
button: any;
|
|
23
|
-
details: any;
|
|
24
|
-
views: ButtonViews;
|
|
25
|
-
}>;
|
|
26
13
|
export declare function samePositions(a: unknown, b: unknown): boolean;
|
|
27
|
-
export declare function saveButtonPosition(client: Client, base: string, appId: string, objId: string, context:
|
|
14
|
+
export declare function saveButtonPosition(client: Client, base: string, appId: string, objId: string, context: ButtonContext, config: ReturnType<typeof buildButtonPosition>): Promise<{
|
|
28
15
|
showPosition: string;
|
|
29
16
|
showPositionSpan: any;
|
|
30
17
|
success: boolean;
|
|
31
18
|
verified: boolean;
|
|
32
19
|
buttonId: any;
|
|
33
20
|
}>;
|
|
34
|
-
export {};
|
|
35
21
|
//# sourceMappingURL=form-button-position.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-button-position.d.ts","sourceRoot":"","sources":["../../src/services/form-button-position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"form-button-position.d.ts","sourceRoot":"","sources":["../../src/services/form-button-position.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAW,UAAU,EAAE,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIxH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAE3C,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAC9C,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAQjD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CAaxD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAS5E;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,UAAQ;;;EAmB7G;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAG7D;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC;;;;;;GAY1K"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import { checked, readButton, readButtonContext } from './form-button-context.js';
|
|
2
|
+
// 读上下文的两个函数住在 `form-button-context.ts`(公共保存链路也要用),这里原样转出去:
|
|
3
|
+
// 既保持既有 import 路径不变,也避免两个 service 互相 import 成环。
|
|
4
|
+
export { readButton, readButtonContext };
|
|
1
5
|
const aliases = {
|
|
2
6
|
'右上': 'rightTop', '右上角': 'rightTop', righttop: 'rightTop',
|
|
3
7
|
'右上下拉': 'rightTopDropDown', righttopdropdown: 'rightTopDropDown',
|
|
@@ -55,42 +59,6 @@ export function buildButtonPosition(existing, patch, catalog, replace = false) {
|
|
|
55
59
|
}
|
|
56
60
|
return { showPosition: JSON.stringify(merged), showPositionSpan: span };
|
|
57
61
|
}
|
|
58
|
-
function checked(result, operation) {
|
|
59
|
-
if (result?.code !== 200 || result?.status === false || result?.data == null)
|
|
60
|
-
throw new Error(`${operation}失败: ${result?.msg || '返回结构无效'}`);
|
|
61
|
-
return result.data;
|
|
62
|
-
}
|
|
63
|
-
export async function readButton(client, base, appId, objId, buttonId) {
|
|
64
|
-
for (let current = 1;; current++) {
|
|
65
|
-
const data = checked(await client.post(`${base}/api/bs/ebuilder/form/button/getButtonList?apid=${appId}&objId=${objId}`, { objId, searchVal: '', current, pageSize: 50, searchParamData: {} }, { ebBusinessId: appId }), '读取按钮');
|
|
66
|
-
if (!Array.isArray(data.datas))
|
|
67
|
-
throw new Error('按钮列表返回结构无效');
|
|
68
|
-
const button = data.datas.find((b) => String(b.id) === buttonId);
|
|
69
|
-
if (button)
|
|
70
|
-
return button;
|
|
71
|
-
if (!data.datas.length || current * 50 >= Number(data.total))
|
|
72
|
-
break;
|
|
73
|
-
if (current >= 1000)
|
|
74
|
-
throw new Error('按钮分页超出上限');
|
|
75
|
-
}
|
|
76
|
-
throw new Error(`按钮 ${buttonId} 不存在`);
|
|
77
|
-
}
|
|
78
|
-
export async function readButtonContext(client, base, appId, objId, buttonId) {
|
|
79
|
-
const button = await readButton(client, base, appId, objId, buttonId);
|
|
80
|
-
// `buttonKey` 只在按钮**有**这个键时才带 —— 界面自己建的自定义按钮记录里根本没有它,
|
|
81
|
-
// 硬拼会发一个 `buttonKey=undefined`。
|
|
82
|
-
const query = new URLSearchParams({
|
|
83
|
-
apid: appId, objId, tpaid: objId, buttonId, buttonType: button.buttonType,
|
|
84
|
-
thirdPartyFlag: String(button.thirdPartyFlag || 0),
|
|
85
|
-
...(button.buttonKey ? { buttonKey: String(button.buttonKey) } : {}),
|
|
86
|
-
});
|
|
87
|
-
const headers = { ebBusinessId: appId };
|
|
88
|
-
const details = checked(await client.get(`${base}/api/bs/ebuilder/form/button/getActionAndPermission?${query}`, headers), '读取动作权限');
|
|
89
|
-
if (!Array.isArray(details.actions) || !Array.isArray(details.permissions))
|
|
90
|
-
throw new Error('动作/权限返回不完整,停止保存');
|
|
91
|
-
const views = checked(await client.get(`${base}/api/bs/ebuilder/form/button/getViewDatas?${query}`, headers), '读取可选视图');
|
|
92
|
-
return { button, details, views };
|
|
93
|
-
}
|
|
94
62
|
export function samePositions(a, b) {
|
|
95
63
|
const canonical = (v) => JSON.stringify(Object.entries(parsePositions(v)).sort(([a], [b]) => a.localeCompare(b)).map(([k, p]) => [k, [...p].sort()]));
|
|
96
64
|
return canonical(a) === canonical(b);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-button-position.js","sourceRoot":"","sources":["../../src/services/form-button-position.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"form-button-position.js","sourceRoot":"","sources":["../../src/services/form-button-position.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 按钮「基础属性」的构造/解析(纯函数)。
|
|
3
|
+
*
|
|
4
|
+
* 平台侧这些值都挂在 `button` 记录上,`saveOrUpdate` 时整个 `button` 一起提交:
|
|
5
|
+
* - `iconPath` 图标 —— **存的是 JSON 字符串**,不是对象(`{"path":"#Icon-xxx","style":{...}}`)
|
|
6
|
+
* - `onlyIcon` 只显示图标(0/1)
|
|
7
|
+
* - `tipsMessage` 提示内容(纯文本;与 `customTips` 那套「动态提示」不是一回事)
|
|
8
|
+
* - `buttonDescription` 备注(纯文本)
|
|
9
|
+
* - `logMessage` 点击日志 `{ enableLog, message }`
|
|
10
|
+
*
|
|
11
|
+
* 读回的形状与写入一致(`iconPath` 也是字符串),所以这一层只做「对象 ⇄ 字符串」的搬运。
|
|
12
|
+
*/
|
|
13
|
+
/** 图标的描述(对应 `iconPath` JSON 串里的三个键)。 */
|
|
14
|
+
export interface IconSpec {
|
|
15
|
+
/** 图标名,如 `Icon-N-Authorized-Administrator`;不带 `#` 会自动补。 */
|
|
16
|
+
path: string;
|
|
17
|
+
/** 线条/文字颜色,缺省 `#999`(平台自己给系统图标用的就是这个)。 */
|
|
18
|
+
color?: string;
|
|
19
|
+
/** 背景色;空串表示无背景。 */
|
|
20
|
+
bgColor?: string;
|
|
21
|
+
/** `line` 描边 / `fill` 填充。不传就不写这个键(系统图标存的也没有它)。 */
|
|
22
|
+
display?: 'line' | 'fill';
|
|
23
|
+
}
|
|
24
|
+
/** 平台给图标描边的缺省色,与系统按钮一致。 */
|
|
25
|
+
export declare const DEFAULT_ICON_COLOR = "#999";
|
|
26
|
+
/**
|
|
27
|
+
* 组装 `iconPath`。
|
|
28
|
+
*
|
|
29
|
+
* ⚠ 那是**字符串**:直接发对象会被平台按空图标存下(按钮上什么都不显示)。
|
|
30
|
+
* 设计器发的是 `{"path":"#Icon-N-Authorized-Administrator","style":{"color":"#999","bgColor":""},"iconDisplayType":"line"}` ——
|
|
31
|
+
* `iconDisplayType` 只在选过描边/填充时才出现,没选就没有这个键。
|
|
32
|
+
*/
|
|
33
|
+
export declare function buildIconPath(spec: IconSpec): string;
|
|
34
|
+
/** 解析 `iconPath`(读回也是字符串)。空/坏串一律回 `null` —— 读侧不该因为历史脏数据让整条命令失败。 */
|
|
35
|
+
export declare function parseIconPath(raw?: string): IconSpec | null;
|
|
36
|
+
/** 图标的可比签名 —— 回读校验用(平台可能补 `style.fillType` 之类的键,只比我们给过的几样)。 */
|
|
37
|
+
export declare function iconSignature(raw?: string): string;
|
|
38
|
+
/** 默认日志文案 —— 平台自己建按钮时用的就是这个格式(中文引号,别换成英文引号)。 */
|
|
39
|
+
export declare function defaultLogMessage(buttonName: string): {
|
|
40
|
+
enableLog: number;
|
|
41
|
+
message: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* 组装 `logMessage`。
|
|
45
|
+
*
|
|
46
|
+
* 关掉日志时**文案照样保留**(读回里 `enableLog:0` 的记录仍带着 message),
|
|
47
|
+
* 所以 `message` 优先用传进来的,其次沿用旧值,最后才回落默认文案。
|
|
48
|
+
*/
|
|
49
|
+
export declare function buildLogMessage(enable: 0 | 1, buttonName: string, message?: string, previous?: string): {
|
|
50
|
+
enableLog: number;
|
|
51
|
+
message: string;
|
|
52
|
+
};
|
|
53
|
+
/** 布尔 → 平台的 0/1。 */
|
|
54
|
+
export declare function toFlag(value: boolean | undefined): 0 | 1;
|
|
55
|
+
//# sourceMappingURL=form-button-props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-button-props.d.ts","sourceRoot":"","sources":["../../src/services/form-button-props.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,2BAA2B;AAC3B,eAAO,MAAM,kBAAkB,SAAS,CAAC;AAEzC;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAWpD;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAiB3D;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CASlD;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAE5F;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GACrE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAGxC;AAED,oBAAoB;AACpB,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,CAAC,GAAG,CAAC,CAExD"}
|