weaver-e10-builder 1.5.5 → 1.5.6

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.
Files changed (36) hide show
  1. package/dist/commands/form-layout.d.ts.map +1 -1
  2. package/dist/commands/form-layout.js +137 -0
  3. package/dist/commands/form-layout.js.map +1 -1
  4. package/dist/commands/form-serial-mark.d.ts.map +1 -1
  5. package/dist/commands/form-serial-mark.js +7 -1
  6. package/dist/commands/form-serial-mark.js.map +1 -1
  7. package/dist/commands/form-view.d.ts.map +1 -1
  8. package/dist/commands/form-view.js +11 -2
  9. package/dist/commands/form-view.js.map +1 -1
  10. package/dist/commands/org.d.ts +7 -4
  11. package/dist/commands/org.d.ts.map +1 -1
  12. package/dist/commands/org.js +92 -54
  13. package/dist/commands/org.js.map +1 -1
  14. package/dist/commands/workflow.d.ts.map +1 -1
  15. package/dist/commands/workflow.js +23 -5
  16. package/dist/commands/workflow.js.map +1 -1
  17. package/dist/services/form-layout-copy-default.d.ts +94 -0
  18. package/dist/services/form-layout-copy-default.d.ts.map +1 -0
  19. package/dist/services/form-layout-copy-default.js +157 -0
  20. package/dist/services/form-layout-copy-default.js.map +1 -0
  21. package/dist/services/form-view-populate.d.ts +76 -0
  22. package/dist/services/form-view-populate.d.ts.map +1 -0
  23. package/dist/services/form-view-populate.js +171 -0
  24. package/dist/services/form-view-populate.js.map +1 -0
  25. package/dist/services/form-view.d.ts +4 -0
  26. package/dist/services/form-view.d.ts.map +1 -1
  27. package/dist/services/form-view.js +49 -90
  28. package/dist/services/form-view.js.map +1 -1
  29. package/dist/services/org-department.d.ts +30 -17
  30. package/dist/services/org-department.d.ts.map +1 -1
  31. package/dist/services/org-department.js +45 -65
  32. package/dist/services/org-department.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skill-docs/SKILL.md +5 -5
  35. package/skill-docs/references/common/ref-cli-commands.md +7 -2
  36. package/skill-docs/references/form/guide-form-view.md +28 -0
@@ -0,0 +1,94 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ /**
3
+ * 「复制布局」与「设为默认布局」。
4
+ *
5
+ * ⚠ 这两个端点走的是**前端 bs 路由** `/api/bs/ebuilder/form/layout/*`,
6
+ * 与我们其它布局读写那条 `/api/ebuilder/flow/form/layout/*` 不是同一条 —— 前缀、报文
7
+ * 形状、`ebbusinessid` 传什么都不同(这两条要传 **appId**,不是 formId)。
8
+ *
9
+ * 契约均由真机抓包 + 实打确认。
10
+ */
11
+ export declare const COPY_LAYOUT_PATH = "/api/bs/ebuilder/form/layout/copy";
12
+ export declare const SAVE_DEFAULT_LAYOUT_PATH = "/api/bs/ebuilder/form/layout/saveDefaultLayout";
13
+ export declare const DELETE_LAYOUT_PATH = "/api/bs/ebuilder/form/layout/delete";
14
+ /**
15
+ * 「设为默认布局」的**用途档位** —— 对应设计器右键「设为默认布局」那四档。
16
+ *
17
+ * ⚠ 它在报文里叫 `layoutType`,但**不是** FLOW/EXCEL 那个布局类型,别混。
18
+ * 一套布局同时只能承担**一个**档位:把它从 `add` 改成 `view`,`add` 就没了。
19
+ */
20
+ export declare const LAYOUT_DEFAULT_SCOPES: readonly ["all", "add", "view", "edit"];
21
+ export type LayoutDefaultScope = (typeof LAYOUT_DEFAULT_SCOPES)[number];
22
+ /** 档位在设计器菜单里的字面。 */
23
+ export declare const LAYOUT_DEFAULT_SCOPE_LABELS: Record<LayoutDefaultScope, string>;
24
+ /** 解析档位:收英文码与菜单里的中文说法。 */
25
+ export declare function parseDefaultScope(input: string): LayoutDefaultScope;
26
+ export interface CopyLayoutInput {
27
+ /** 源布局 ID(就是视图 ID)。 */
28
+ from: string;
29
+ name: string;
30
+ describe?: string;
31
+ terminal?: string;
32
+ /** 源的布局类型是不是**表格式**(EXCEL)。平台按它决定复制出来的形态。 */
33
+ isExcelView: boolean;
34
+ }
35
+ /**
36
+ * 复制报文。
37
+ *
38
+ * ⚠ **响应里没有新布局的 ID**(只回一句「复制成功!」),新 ID 只能靠回读列表反查 —— 见
39
+ * `findNewLayoutId`。
40
+ */
41
+ export declare function buildCopyLayoutBody(input: CopyLayoutInput): Record<string, unknown>;
42
+ /**
43
+ * 复制 URL。
44
+ *
45
+ * `tpaid` 平台**不校验**(实测传旧默认 id、传与源同值都过),照前端填源布局 ID。
46
+ */
47
+ export declare function buildCopyLayoutUrl(baseUrl: string, appId: string, objId: string, from: string): string;
48
+ export interface SaveDefaultInput {
49
+ objId: string;
50
+ /** 要设为默认的那套布局。 */
51
+ layoutId: string;
52
+ scope: LayoutDefaultScope;
53
+ /** 终端;缺省 PC。 */
54
+ clientType?: string;
55
+ /** 视图族;缺省 formView。 */
56
+ viewType?: string;
57
+ }
58
+ /** 设默认报文。注意键名是 `layoutType`,但装的是**用途档位**。 */
59
+ export declare function buildSaveDefaultBody(input: SaveDefaultInput): Record<string, unknown>;
60
+ export declare function buildSaveDefaultUrl(baseUrl: string, appId: string, objId: string, layoutId: string): string;
61
+ /** 从「复制前 / 复制后」的视图列表里认出新建的那一套。 */
62
+ export declare function findNewLayoutId(before: Array<Record<string, any>>, after: Array<Record<string, any>>, name?: string): string;
63
+ export interface CopyFormLayoutResult {
64
+ createdId: string;
65
+ layout: Record<string, any>;
66
+ }
67
+ /** 复制一套布局。响应不含新 ID,所以复制前后各读一次列表来反查。 */
68
+ export declare function copyFormLayout(client: ApiClient, baseUrl: string, appId: string, objId: string, input: CopyLayoutInput): Promise<CopyFormLayoutResult>;
69
+ export interface SetDefaultFormLayoutResult {
70
+ /** 平台回显的报文(含 thirdPartyFlag)。 */
71
+ echoed: any;
72
+ /** 回读到的目标布局行。 */
73
+ layout: Record<string, any>;
74
+ /** 回读是否确认档位已生效。 */
75
+ matched: boolean;
76
+ }
77
+ /** 删除一套布局的 URL。与复制/设默认同族,也是 GET 打在前端 bs 路由上。 */
78
+ export declare function buildDeleteLayoutUrl(baseUrl: string, appId: string, objId: string, layoutId: string): string;
79
+ export interface DeleteFormLayoutResult {
80
+ /** 回读确认是否真的没了。 */
81
+ deleted: boolean;
82
+ /** 删之前读到的那一行(拿名字与档位去打印)。 */
83
+ layout: Record<string, any>;
84
+ }
85
+ /**
86
+ * 删除一套布局。**不可逆**。
87
+ *
88
+ * 先读一次列表拿到目标(顺手把「id 打错」挡在发请求之前),删完**再读一次确认它真的没了** ——
89
+ * 平台普遍「返回成功但没删掉」,只看响应不算数。
90
+ */
91
+ export declare function deleteFormLayout(client: ApiClient, baseUrl: string, appId: string, objId: string, layoutId: string): Promise<DeleteFormLayoutResult>;
92
+ /** 设为默认。回读确认 `defaultType` 落在目标档位上 —— 平台的响应只是回显,不算数。 */
93
+ export declare function setDefaultFormLayout(client: ApiClient, baseUrl: string, appId: string, objId: string, input: SaveDefaultInput): Promise<SetDefaultFormLayoutResult>;
94
+ //# sourceMappingURL=form-layout-copy-default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-layout-copy-default.d.ts","sourceRoot":"","sources":["../../src/services/form-layout-copy-default.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { listFormViews } from './form-view.js';
2
+ /**
3
+ * 「复制布局」与「设为默认布局」。
4
+ *
5
+ * ⚠ 这两个端点走的是**前端 bs 路由** `/api/bs/ebuilder/form/layout/*`,
6
+ * 与我们其它布局读写那条 `/api/ebuilder/flow/form/layout/*` 不是同一条 —— 前缀、报文
7
+ * 形状、`ebbusinessid` 传什么都不同(这两条要传 **appId**,不是 formId)。
8
+ *
9
+ * 契约均由真机抓包 + 实打确认。
10
+ */
11
+ export const COPY_LAYOUT_PATH = '/api/bs/ebuilder/form/layout/copy';
12
+ export const SAVE_DEFAULT_LAYOUT_PATH = '/api/bs/ebuilder/form/layout/saveDefaultLayout';
13
+ export const DELETE_LAYOUT_PATH = '/api/bs/ebuilder/form/layout/delete';
14
+ /**
15
+ * 「设为默认布局」的**用途档位** —— 对应设计器右键「设为默认布局」那四档。
16
+ *
17
+ * ⚠ 它在报文里叫 `layoutType`,但**不是** FLOW/EXCEL 那个布局类型,别混。
18
+ * 一套布局同时只能承担**一个**档位:把它从 `add` 改成 `view`,`add` 就没了。
19
+ */
20
+ export const LAYOUT_DEFAULT_SCOPES = ['all', 'add', 'view', 'edit'];
21
+ /** 档位在设计器菜单里的字面。 */
22
+ export const LAYOUT_DEFAULT_SCOPE_LABELS = {
23
+ all: '全部布局',
24
+ add: '新建布局',
25
+ view: '显示布局',
26
+ edit: '编辑布局',
27
+ };
28
+ const SCOPE_ALIASES = {
29
+ all: 'all', 全部: 'all', 全部布局: 'all',
30
+ add: 'add', 新建: 'add', 新建布局: 'add',
31
+ view: 'view', 显示: 'view', 显示布局: 'view',
32
+ edit: 'edit', 编辑: 'edit', 编辑布局: 'edit',
33
+ };
34
+ /** 解析档位:收英文码与菜单里的中文说法。 */
35
+ export function parseDefaultScope(input) {
36
+ const key = String(input ?? '').trim();
37
+ const hit = SCOPE_ALIASES[key] || SCOPE_ALIASES[key.toLowerCase()];
38
+ if (!hit) {
39
+ throw new Error(`未知的默认档位「${input}」。可选:`
40
+ + LAYOUT_DEFAULT_SCOPES.map((s) => `${s}(${LAYOUT_DEFAULT_SCOPE_LABELS[s]})`).join(' / '));
41
+ }
42
+ return hit;
43
+ }
44
+ /**
45
+ * 复制报文。
46
+ *
47
+ * ⚠ **响应里没有新布局的 ID**(只回一句「复制成功!」),新 ID 只能靠回读列表反查 —— 见
48
+ * `findNewLayoutId`。
49
+ */
50
+ export function buildCopyLayoutBody(input) {
51
+ return {
52
+ name: input.name,
53
+ describe: input.describe || '',
54
+ isExcelView: input.isExcelView === true,
55
+ terminalType: input.terminal || 'PC',
56
+ id: String(input.from),
57
+ isChanged: false,
58
+ };
59
+ }
60
+ /**
61
+ * 复制 URL。
62
+ *
63
+ * `tpaid` 平台**不校验**(实测传旧默认 id、传与源同值都过),照前端填源布局 ID。
64
+ */
65
+ export function buildCopyLayoutUrl(baseUrl, appId, objId, from) {
66
+ const query = `apid=${encodeURIComponent(appId)}`
67
+ + `&tpaid=${encodeURIComponent(from)}`
68
+ + `&objId=${encodeURIComponent(objId)}`;
69
+ return `${baseUrl}${COPY_LAYOUT_PATH}/${encodeURIComponent(from)}?${query}`;
70
+ }
71
+ /** 设默认报文。注意键名是 `layoutType`,但装的是**用途档位**。 */
72
+ export function buildSaveDefaultBody(input) {
73
+ return {
74
+ objId: String(input.objId),
75
+ layoutId: String(input.layoutId),
76
+ layoutType: input.scope,
77
+ clientType: input.clientType || 'PC',
78
+ viewType: input.viewType || 'formView',
79
+ };
80
+ }
81
+ export function buildSaveDefaultUrl(baseUrl, appId, objId, layoutId) {
82
+ const query = `apid=${encodeURIComponent(appId)}`
83
+ + `&tpaid=${encodeURIComponent(layoutId)}`
84
+ + `&objId=${encodeURIComponent(objId)}`;
85
+ return `${baseUrl}${SAVE_DEFAULT_LAYOUT_PATH}?${query}`;
86
+ }
87
+ /** 从「复制前 / 复制后」的视图列表里认出新建的那一套。 */
88
+ export function findNewLayoutId(before, after, name) {
89
+ const beforeIds = new Set(before.map((v) => String(v?.id ?? '')));
90
+ const fresh = after.filter((v) => !beforeIds.has(String(v?.id ?? '')));
91
+ if (!fresh.length) {
92
+ throw new Error('复制接口报成功,但回读视图列表没有多出任何布局 —— 请到设计器确认');
93
+ }
94
+ if (fresh.length === 1)
95
+ return String(fresh[0].id);
96
+ // 一次多出好几套(别人同时在动这张表)时,用名字再筛一道。
97
+ if (name) {
98
+ const byName = fresh.filter((v) => String(v?.name ?? '') === name);
99
+ if (byName.length === 1)
100
+ return String(byName[0].id);
101
+ }
102
+ throw new Error(`复制后回读多出 ${fresh.length} 套布局,无法确定哪套是新的:`
103
+ + fresh.map((v) => `${v.name}(${v.id})`).join('、'));
104
+ }
105
+ function assertOk(response, operation) {
106
+ if (response?.code !== 200 || response?.status === false || response?.success === false || response?.fail === true) {
107
+ throw new Error(response?.msg || `${operation}未确认成功`);
108
+ }
109
+ return response;
110
+ }
111
+ /** 复制一套布局。响应不含新 ID,所以复制前后各读一次列表来反查。 */
112
+ export async function copyFormLayout(client, baseUrl, appId, objId, input) {
113
+ const before = await listFormViews(client, baseUrl, appId, objId);
114
+ assertOk(await client.post(buildCopyLayoutUrl(baseUrl, appId, objId, input.from), buildCopyLayoutBody(input), { ebbusinessid: appId }), '复制布局');
115
+ const after = await listFormViews(client, baseUrl, appId, objId);
116
+ const createdId = findNewLayoutId(before, after, input.name);
117
+ return { createdId, layout: after.find((v) => String(v?.id ?? '') === createdId) || {} };
118
+ }
119
+ /** 删除一套布局的 URL。与复制/设默认同族,也是 GET 打在前端 bs 路由上。 */
120
+ export function buildDeleteLayoutUrl(baseUrl, appId, objId, layoutId) {
121
+ const query = `apid=${encodeURIComponent(appId)}`
122
+ + `&tpaid=${encodeURIComponent(layoutId)}`
123
+ + `&objId=${encodeURIComponent(objId)}`;
124
+ return `${baseUrl}${DELETE_LAYOUT_PATH}/${encodeURIComponent(layoutId)}?${query}`;
125
+ }
126
+ /**
127
+ * 删除一套布局。**不可逆**。
128
+ *
129
+ * 先读一次列表拿到目标(顺手把「id 打错」挡在发请求之前),删完**再读一次确认它真的没了** ——
130
+ * 平台普遍「返回成功但没删掉」,只看响应不算数。
131
+ */
132
+ export async function deleteFormLayout(client, baseUrl, appId, objId, layoutId) {
133
+ const before = await listFormViews(client, baseUrl, appId, objId);
134
+ const target = before.find((v) => String(v?.id ?? '') === String(layoutId));
135
+ if (!target) {
136
+ throw new Error(`这张表单下找不到布局 ${layoutId}。现有:`
137
+ + (before.map((v) => `${v.name}(${v.id})`).join('、') || '(无)'));
138
+ }
139
+ assertOk(await client.get(buildDeleteLayoutUrl(baseUrl, appId, objId, layoutId), { ebbusinessid: appId }), '删除布局');
140
+ const after = await listFormViews(client, baseUrl, appId, objId);
141
+ return {
142
+ deleted: !after.some((v) => String(v?.id ?? '') === String(layoutId)),
143
+ layout: target,
144
+ };
145
+ }
146
+ /** 设为默认。回读确认 `defaultType` 落在目标档位上 —— 平台的响应只是回显,不算数。 */
147
+ export async function setDefaultFormLayout(client, baseUrl, appId, objId, input) {
148
+ const response = assertOk(await client.post(buildSaveDefaultUrl(baseUrl, appId, objId, input.layoutId), buildSaveDefaultBody(input), { ebbusinessid: appId }), '设为默认布局');
149
+ const after = await listFormViews(client, baseUrl, appId, objId);
150
+ const layout = after.find((v) => String(v?.id ?? '') === String(input.layoutId)) || {};
151
+ return {
152
+ echoed: response?.data ?? null,
153
+ layout,
154
+ matched: String(layout.defaultType ?? '') === input.scope,
155
+ };
156
+ }
157
+ //# sourceMappingURL=form-layout-copy-default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-layout-copy-default.js","sourceRoot":"","sources":["../../src/services/form-layout-copy-default.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { NewCompCell } from './form-layout-grid.js';
2
+ /**
3
+ * `form view populate` 的纯逻辑:算「缺哪些字段」、为缺字段造 comp、算追加落点。
4
+ *
5
+ * 抽出来是为了可测:真机往返(读布局 → 改 → 存 → 回读)没法单测,但**报文的形状**可以。
6
+ *
7
+ * ⚠ 本族按 `config.fieldId` 认字段归属 —— **不是** `form-layout-insert` 那套的
8
+ * `config.associatedId`。两套认法不一样,改的时候别混。
9
+ */
10
+ /** 字段记录(`getFormFieldPage` 的一行)里我们用到的键。 */
11
+ export interface PopulateFieldDef {
12
+ fieldId?: unknown;
13
+ id?: unknown;
14
+ type?: string;
15
+ componentKey?: string;
16
+ title?: string;
17
+ fieldName?: string;
18
+ [key: string]: unknown;
19
+ }
20
+ /** comp 认字段用的键(`config.fieldId`)。 */
21
+ export declare function compFieldIdOf(comp: any): string;
22
+ /**
23
+ * 目标视图里**缺**的字段 id —— 按 expected 顺序返回、去重。
24
+ *
25
+ * 空数组 = 已齐(等价于旧代码的 `expectedFieldIds.every(id => targetFieldIds.has(id))`)。
26
+ * 视图里的非字段组件(文本/按钮等)没有 `config.fieldId`,自动不参与。
27
+ */
28
+ export declare function selectMissingFieldIds(targetComponents: any[], expectedFieldIds: string[]): string[];
29
+ /**
30
+ * EXCEL 追加时的起始行 = 所有带 `config.excel` 的 comp 的 `max(row) + 1`;无则 0。
31
+ *
32
+ * 取**所有**带 excel 的 comp(含非字段组件),保证新行落在没人占用的行上 ——
33
+ * 直接绕开 `fillCells` 的「位置已被占用 → 跳过并告警」分支。FLOW comp 没有 `config.excel`,不参与。
34
+ */
35
+ export declare function nextExcelRow(comps: any[]): number;
36
+ export interface BuildFieldCompsContext {
37
+ /** 源布局(默认布局)comp,按 `config.fieldId` 索引 —— 用来抄同字段的 config。 */
38
+ sourceByFieldId: Map<string, any>;
39
+ formId: string;
40
+ /** 'EXCEL' 才写 `config.excel`(并落网格);其余按 FLOW 处理(只写 `config.flow`)。 */
41
+ layoutType: string;
42
+ /** 起始 showOrder(追加时 = 已有 comp 数);缺省 0(= 旧行为)。 */
43
+ startShowOrder?: number;
44
+ /** EXCEL 起始行(追加时 = nextExcelRow(已有 comps));缺省 0(= 旧行为)。 */
45
+ startRow?: number;
46
+ readOnly?: boolean;
47
+ required?: boolean;
48
+ /** 注入值生成器,便于测试确定性。 */
49
+ newCompId?: () => string;
50
+ newNodeId?: () => string;
51
+ }
52
+ /**
53
+ * 为**给定字段列表**构造 comp。不判定该不该建、不碰已有 comp —— 调用方只把缺的字段传进来。
54
+ *
55
+ * 与旧实现(`populateFormViewFields` 里那段 `fields.map(...)`)逐字等价:
56
+ * `startShowOrder = 0` 且 `startRow = 0` 时,产出的 comp 与旧代码只差随机 id / nodeId。
57
+ * (旧该段在**空视图**时整表重建,所以那两个基准都是 0。)
58
+ */
59
+ export declare function buildFieldComps(fields: PopulateFieldDef[], ctx: BuildFieldCompsContext): any[];
60
+ /** 新 comp → 补网格格子的条目。模板格取源布局里同字段那一格;源里没有 → `''`(找不到模板)。 */
61
+ export declare function excelCellEntries(comps: any[], sourceByFieldId: Map<string, any>): NewCompCell[];
62
+ export interface ExistingCompDiff {
63
+ /** 回读时消失的 comp id。 */
64
+ missingIds: string[];
65
+ /** 回读时位置变了的 comp id(比较 `config.excel.row/col` 与 `config.flow.nodeId`)。 */
66
+ movedIds: string[];
67
+ }
68
+ /**
69
+ * 回读安全网:确认「已有组件没被动过」。
70
+ *
71
+ * **不做 deep-equal** —— 平台保存时会对 comp 的键做归一化(键序、派生键),严格比对必误报。
72
+ * 只查「id 还在不在」与「位置变没变」,能抓到组件消失 / 被挪位这类真破坏,又不因抖动报假警。
73
+ * 结果只作**非致命提示**,不阻断。
74
+ */
75
+ export declare function diffExistingComps(before: any[], after: any[]): ExistingCompDiff;
76
+ //# sourceMappingURL=form-view-populate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-view-populate.d.ts","sourceRoot":"","sources":["../../src/services/form-view-populate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;GAOG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qCAAqC;AACrC,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,GAAG,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAYnG;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CASjD;AAED,MAAM,WAAW,sBAAsB;IACrC,6DAA6D;IAC7D,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B;AAKD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE,sBAAsB,GAAG,GAAG,EAAE,CAgF9F;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,WAAW,EAAE,CAW/F;AAED,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAQD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,gBAAgB,CAkB/E"}
@@ -0,0 +1,171 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ /** comp 认字段用的键(`config.fieldId`)。 */
3
+ export function compFieldIdOf(comp) {
4
+ const id = comp?.config?.fieldId;
5
+ if (id === undefined || id === null)
6
+ return '';
7
+ return String(id);
8
+ }
9
+ /**
10
+ * 目标视图里**缺**的字段 id —— 按 expected 顺序返回、去重。
11
+ *
12
+ * 空数组 = 已齐(等价于旧代码的 `expectedFieldIds.every(id => targetFieldIds.has(id))`)。
13
+ * 视图里的非字段组件(文本/按钮等)没有 `config.fieldId`,自动不参与。
14
+ */
15
+ export function selectMissingFieldIds(targetComponents, expectedFieldIds) {
16
+ const present = new Set(targetComponents.map(compFieldIdOf).filter((id) => Boolean(id)));
17
+ const missing = [];
18
+ const seen = new Set();
19
+ for (const id of expectedFieldIds) {
20
+ if (!id || seen.has(id) || present.has(id))
21
+ continue;
22
+ seen.add(id);
23
+ missing.push(id);
24
+ }
25
+ return missing;
26
+ }
27
+ /**
28
+ * EXCEL 追加时的起始行 = 所有带 `config.excel` 的 comp 的 `max(row) + 1`;无则 0。
29
+ *
30
+ * 取**所有**带 excel 的 comp(含非字段组件),保证新行落在没人占用的行上 ——
31
+ * 直接绕开 `fillCells` 的「位置已被占用 → 跳过并告警」分支。FLOW comp 没有 `config.excel`,不参与。
32
+ */
33
+ export function nextExcelRow(comps) {
34
+ let max = -1;
35
+ for (const comp of comps) {
36
+ const row = comp?.config?.excel?.row;
37
+ if (row === undefined || row === null)
38
+ continue;
39
+ const n = Number(row);
40
+ if (Number.isFinite(n) && n > max)
41
+ max = n;
42
+ }
43
+ return max + 1;
44
+ }
45
+ const defaultCompId = () => randomUUID().replaceAll('-', '');
46
+ const defaultNodeId = () => `NODE_${randomUUID().replaceAll('-', '').slice(0, 8)}`;
47
+ /**
48
+ * 为**给定字段列表**构造 comp。不判定该不该建、不碰已有 comp —— 调用方只把缺的字段传进来。
49
+ *
50
+ * 与旧实现(`populateFormViewFields` 里那段 `fields.map(...)`)逐字等价:
51
+ * `startShowOrder = 0` 且 `startRow = 0` 时,产出的 comp 与旧代码只差随机 id / nodeId。
52
+ * (旧该段在**空视图**时整表重建,所以那两个基准都是 0。)
53
+ */
54
+ export function buildFieldComps(fields, ctx) {
55
+ const { sourceByFieldId, formId, layoutType, startShowOrder = 0, startRow = 0, readOnly = false, required = false, newCompId = defaultCompId, newNodeId = defaultNodeId, } = ctx;
56
+ const isExcel = layoutType === 'EXCEL';
57
+ return fields.map((field, i) => {
58
+ const id = String(field.fieldId ?? field.id);
59
+ const type = field.type ?? field.componentKey ?? 'Text';
60
+ const title = field.title ?? field.fieldName ?? '';
61
+ const showOrder = startShowOrder + i;
62
+ const nodeId = newNodeId();
63
+ const sourceComponent = sourceByFieldId.get(id);
64
+ const config = structuredClone(sourceComponent?.config ?? {
65
+ compPackage: '@weapp/ebdfpage',
66
+ fieldId: id,
67
+ fieldKey: type,
68
+ formId,
69
+ layout: { selected: false },
70
+ name: title,
71
+ title,
72
+ type,
73
+ permission: {},
74
+ size: 'large',
75
+ showOrder,
76
+ disableEdit: false,
77
+ display: true,
78
+ singleRow: false,
79
+ readOnly: false,
80
+ required: false,
81
+ associatedId: id,
82
+ });
83
+ delete config.excel;
84
+ delete config.flow;
85
+ Object.assign(config, {
86
+ fieldId: id,
87
+ formId,
88
+ name: title,
89
+ title,
90
+ type,
91
+ showOrder,
92
+ associatedId: id,
93
+ // readOnly/required 由调用方定;显式覆盖掉从源布局抄来的值,让新视图从干净状态起步。
94
+ readOnly,
95
+ required,
96
+ flow: {
97
+ parent: 'ROOT',
98
+ nodes: [],
99
+ isCanvas: false,
100
+ linkedNodes: {},
101
+ nodeId,
102
+ },
103
+ });
104
+ if (isExcel) {
105
+ config.excel = { row: startRow + i, col: 0, parent: 'ROOT', nodeId };
106
+ }
107
+ return {
108
+ ...(sourceComponent ? structuredClone(sourceComponent) : {}),
109
+ id: newCompId(),
110
+ refCompId: '',
111
+ type,
112
+ category: '',
113
+ refModule: '',
114
+ styleCategoryCompKey: '',
115
+ styleCategoryPackage: '',
116
+ applyStyle: '',
117
+ isCover: 0,
118
+ prop: 'EB',
119
+ config,
120
+ package: '@weapp/ebdfpage',
121
+ };
122
+ });
123
+ }
124
+ /** 新 comp → 补网格格子的条目。模板格取源布局里同字段那一格;源里没有 → `''`(找不到模板)。 */
125
+ export function excelCellEntries(comps, sourceByFieldId) {
126
+ return comps.map((comp) => {
127
+ const source = sourceByFieldId.get(String(comp.config?.fieldId ?? ''));
128
+ return {
129
+ compId: String(comp.id),
130
+ type: String(comp.type),
131
+ row: Number(comp.config?.excel?.row) || 0,
132
+ col: Number(comp.config?.excel?.col) || 0,
133
+ templateCompId: source ? String(source.id) : '',
134
+ };
135
+ });
136
+ }
137
+ function positionKey(comp) {
138
+ const excel = comp?.config?.excel;
139
+ const flow = comp?.config?.flow;
140
+ return [excel?.row ?? '', excel?.col ?? '', flow?.nodeId ?? ''].join('|');
141
+ }
142
+ /**
143
+ * 回读安全网:确认「已有组件没被动过」。
144
+ *
145
+ * **不做 deep-equal** —— 平台保存时会对 comp 的键做归一化(键序、派生键),严格比对必误报。
146
+ * 只查「id 还在不在」与「位置变没变」,能抓到组件消失 / 被挪位这类真破坏,又不因抖动报假警。
147
+ * 结果只作**非致命提示**,不阻断。
148
+ */
149
+ export function diffExistingComps(before, after) {
150
+ const afterById = new Map();
151
+ for (const comp of after) {
152
+ if (comp?.id !== undefined && comp?.id !== null)
153
+ afterById.set(String(comp.id), comp);
154
+ }
155
+ const missingIds = [];
156
+ const movedIds = [];
157
+ for (const comp of before) {
158
+ const id = String(comp?.id ?? '');
159
+ if (!id)
160
+ continue;
161
+ const match = afterById.get(id);
162
+ if (!match) {
163
+ missingIds.push(id);
164
+ continue;
165
+ }
166
+ if (positionKey(comp) !== positionKey(match))
167
+ movedIds.push(id);
168
+ }
169
+ return { missingIds, movedIds };
170
+ }
171
+ //# sourceMappingURL=form-view-populate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-view-populate.js","sourceRoot":"","sources":["../../src/services/form-view-populate.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,10 @@ export interface PopulateFormViewResult {
23
23
  componentCount: number;
24
24
  fieldComponentCount: number;
25
25
  alreadyPopulated: boolean;
26
+ /** 本次补入的字段 id(视图原本已有的字段不算)。已齐时不返回。 */
27
+ addedFieldIds?: string[];
28
+ /** 本次补入的 comp 数(本构造下一个字段一个 comp)。 */
29
+ addedComponentCount?: number;
26
30
  /** 非致命提示(EXCEL 视图补网格格子的情况)—— 命令层负责打印。 */
27
31
  warnings?: string[];
28
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"form-view.d.ts","sourceRoot":"","sources":["../../src/services/form-view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form-view.d.ts","sourceRoot":"","sources":["../../src/services/form-view.ts"],"names":[],"mappings":"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"}