weaver-e10-builder 1.6.13 → 1.6.14
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/cli-register.d.ts.map +1 -1
- package/dist/cli-register.js +14 -2
- package/dist/cli-register.js.map +1 -1
- package/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +4 -0
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/designer-event.d.ts +3 -0
- package/dist/commands/designer-event.d.ts.map +1 -0
- package/dist/commands/designer-event.js +106 -0
- package/dist/commands/designer-event.js.map +1 -0
- package/dist/commands/designer-source.d.ts +3 -0
- package/dist/commands/designer-source.d.ts.map +1 -0
- package/dist/commands/designer-source.js +51 -0
- package/dist/commands/designer-source.js.map +1 -0
- package/dist/commands/form-browser-scope-rules.d.ts +2 -1
- package/dist/commands/form-browser-scope-rules.d.ts.map +1 -1
- package/dist/commands/form-browser-scope-rules.js +8 -4
- package/dist/commands/form-browser-scope-rules.js.map +1 -1
- package/dist/commands/form-browser-scope-tree.js +1 -1
- package/dist/commands/form-browser-scope-tree.js.map +1 -1
- package/dist/commands/form-field-linkage.d.ts.map +1 -1
- package/dist/commands/form-field-linkage.js +6 -11
- package/dist/commands/form-field-linkage.js.map +1 -1
- package/dist/commands/form-layout-detail-settings.d.ts +3 -0
- package/dist/commands/form-layout-detail-settings.d.ts.map +1 -0
- package/dist/commands/form-layout-detail-settings.js +36 -0
- package/dist/commands/form-layout-detail-settings.js.map +1 -0
- package/dist/commands/form-list-columns.d.ts.map +1 -1
- package/dist/commands/form-list-columns.js +178 -5
- package/dist/commands/form-list-columns.js.map +1 -1
- package/dist/commands/form-list-config.d.ts.map +1 -1
- package/dist/commands/form-list-config.js +81 -5
- package/dist/commands/form-list-config.js.map +1 -1
- package/dist/commands/form-list-event.d.ts.map +1 -1
- package/dist/commands/form-list-event.js +2 -1
- package/dist/commands/form-list-event.js.map +1 -1
- package/dist/commands/form-list-hierarchy.d.ts.map +1 -1
- package/dist/commands/form-list-hierarchy.js +2 -1
- package/dist/commands/form-list-hierarchy.js.map +1 -1
- package/dist/commands/form-list-utils.d.ts.map +1 -1
- package/dist/commands/form-list-utils.js +4 -3
- package/dist/commands/form-list-utils.js.map +1 -1
- package/dist/commands/form-list.d.ts.map +1 -1
- package/dist/commands/form-list.js +2 -1
- package/dist/commands/form-list.js.map +1 -1
- package/dist/commands/form-nlist.d.ts.map +1 -1
- package/dist/commands/form-nlist.js +77 -0
- package/dist/commands/form-nlist.js.map +1 -1
- package/dist/commands/form-permission.d.ts.map +1 -1
- package/dist/commands/form-permission.js +743 -77
- package/dist/commands/form-permission.js.map +1 -1
- package/dist/commands/page-combination.d.ts +3 -0
- package/dist/commands/page-combination.d.ts.map +1 -0
- package/dist/commands/page-combination.js +86 -0
- package/dist/commands/page-combination.js.map +1 -0
- package/dist/commands/page-permission.d.ts +3 -0
- package/dist/commands/page-permission.d.ts.map +1 -0
- package/dist/commands/page-permission.js +46 -0
- package/dist/commands/page-permission.js.map +1 -0
- package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update.js +7 -0
- package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
- package/dist/services/actionflow/components/enquiry_form.js +1 -1
- package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
- package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
- package/dist/services/actionflow/components/form_data_builder.js +19 -3
- package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
- package/dist/services/actionflow/context_discovery.d.ts +2 -0
- package/dist/services/actionflow/context_discovery.d.ts.map +1 -1
- package/dist/services/actionflow/context_discovery.js +32 -4
- package/dist/services/actionflow/context_discovery.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +20 -3
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +5 -8
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts +8 -0
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +80 -13
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +27 -13
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/designer-event.d.ts +54 -0
- package/dist/services/designer-event.d.ts.map +1 -0
- package/dist/services/designer-event.js +312 -0
- package/dist/services/designer-event.js.map +1 -0
- package/dist/services/designer-source.d.ts +46 -0
- package/dist/services/designer-source.d.ts.map +1 -0
- package/dist/services/designer-source.js +145 -0
- package/dist/services/designer-source.js.map +1 -0
- package/dist/services/field-identity.d.ts +3 -0
- package/dist/services/field-identity.d.ts.map +1 -0
- package/dist/services/field-identity.js +8 -0
- package/dist/services/field-identity.js.map +1 -0
- package/dist/services/form-layout-detail-advanced.d.ts +10 -0
- package/dist/services/form-layout-detail-advanced.d.ts.map +1 -0
- package/dist/services/form-layout-detail-advanced.js +134 -0
- package/dist/services/form-layout-detail-advanced.js.map +1 -0
- package/dist/services/form-layout-detail-settings.d.ts +151 -0
- package/dist/services/form-layout-detail-settings.d.ts.map +1 -0
- package/dist/services/form-layout-detail-settings.js +131 -0
- package/dist/services/form-layout-detail-settings.js.map +1 -0
- package/dist/services/form-list-columns.d.ts.map +1 -1
- package/dist/services/form-list-columns.js +2 -1
- package/dist/services/form-list-columns.js.map +1 -1
- package/dist/services/form-list-config.d.ts +36 -1
- package/dist/services/form-list-config.d.ts.map +1 -1
- package/dist/services/form-list-config.js +252 -23
- package/dist/services/form-list-config.js.map +1 -1
- package/dist/services/form-list-fields.d.ts +3 -1
- package/dist/services/form-list-fields.d.ts.map +1 -1
- package/dist/services/form-list-fields.js +95 -16
- package/dist/services/form-list-fields.js.map +1 -1
- package/dist/services/form-list-search-group.d.ts.map +1 -1
- package/dist/services/form-list-search-group.js +3 -2
- 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 +3 -13
- package/dist/services/form-list-search.js.map +1 -1
- package/dist/services/form-list-table-fields.d.ts +58 -0
- package/dist/services/form-list-table-fields.d.ts.map +1 -0
- package/dist/services/form-list-table-fields.js +265 -0
- package/dist/services/form-list-table-fields.js.map +1 -0
- package/dist/services/form-nlist-field-attrs.d.ts +43 -0
- package/dist/services/form-nlist-field-attrs.d.ts.map +1 -0
- package/dist/services/form-nlist-field-attrs.js +170 -0
- package/dist/services/form-nlist-field-attrs.js.map +1 -0
- package/dist/services/form-nlist.d.ts.map +1 -1
- package/dist/services/form-nlist.js +4 -3
- package/dist/services/form-nlist.js.map +1 -1
- package/dist/services/form-permission-edit.d.ts +115 -0
- package/dist/services/form-permission-edit.d.ts.map +1 -0
- package/dist/services/form-permission-edit.js +552 -0
- package/dist/services/form-permission-edit.js.map +1 -0
- package/dist/services/matrix-condition.d.ts +0 -30
- package/dist/services/matrix-condition.d.ts.map +1 -1
- package/dist/services/matrix-condition.js +3 -2
- package/dist/services/matrix-condition.js.map +1 -1
- package/dist/services/page-combination.d.ts +58 -0
- package/dist/services/page-combination.d.ts.map +1 -0
- package/dist/services/page-combination.js +296 -0
- package/dist/services/page-combination.js.map +1 -0
- package/dist/services/page-permission.d.ts +74 -0
- package/dist/services/page-permission.d.ts.map +1 -0
- package/dist/services/page-permission.js +287 -0
- package/dist/services/page-permission.js.map +1 -0
- package/dist/services/report/verify.d.ts.map +1 -1
- package/dist/services/report/verify.js +1 -7
- package/dist/services/report/verify.js.map +1 -1
- package/package.json +1 -1
- package/skill-docs/SKILL.md +14 -4
- package/skill-docs/_catalog.md +7 -0
- package/skill-docs/actionflows/SKILL.md +7 -3
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +5 -1
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +5 -1
- package/skill-docs/actionflows/references/components/ebuilder/EnquiryForm.md +2 -0
- package/skill-docs/references/common/ref-cli-commands.md +20 -5
- package/skill-docs/references/ebuilder-designer/events/actions-integration.md +88 -0
- package/skill-docs/references/ebuilder-designer/events/actions-interaction.md +108 -0
- package/skill-docs/references/ebuilder-designer/events/guide-events.md +57 -0
- package/skill-docs/references/ebuilder-designer/guide-designer.md +296 -288
- package/skill-docs/references/ebuilder-designer/guide-page-combination.md +142 -0
- package/skill-docs/references/ebuilder-designer/guide-page-permission.md +145 -0
- package/skill-docs/references/ebuilder-designer/page-source/page-source-guide.md +129 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-chart.md +49 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-coverage.json +372 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-date.md +54 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-dialogs.md +279 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-form.md +255 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-foundations.md +401 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-index.md +34 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-list.md +297 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-native.md +193 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-navigation.md +156 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-other.md +242 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-refresh.md +132 -0
- package/skill-docs/references/ebuilder-designer/page-source/sdk-sql.md +39 -0
- package/skill-docs/references/form/guide-form-permission.md +185 -0
- package/skill-docs/references/form/guide-form-view.md +725 -624
- package/skill-docs/references/form/layout/detail-advanced.md +124 -0
- package/skill-docs/references/form/layout/detail-settings.md +106 -0
- package/skill-docs/references/form/layout/layout-overview.md +2 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ApiClient } from '../core/client.js';
|
|
2
|
+
type Client = Pick<ApiClient, 'get' | 'post' | 'postMultipart'>;
|
|
3
|
+
export type EventScope = {
|
|
4
|
+
compId?: string;
|
|
5
|
+
collection?: string;
|
|
6
|
+
itemId?: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const EVENT_OPEN_MODES: {
|
|
9
|
+
'4': string;
|
|
10
|
+
'0': string;
|
|
11
|
+
'5': string;
|
|
12
|
+
'1': string;
|
|
13
|
+
'7': string;
|
|
14
|
+
};
|
|
15
|
+
export declare const EVENT_ACTIONS: Record<string, {
|
|
16
|
+
label: string;
|
|
17
|
+
key?: string;
|
|
18
|
+
}>;
|
|
19
|
+
export declare function eventTarget(layout: any, scope: EventScope): any;
|
|
20
|
+
export declare function validateEventGroups(groups: any): void;
|
|
21
|
+
export declare function compileEventJs(code: string): any;
|
|
22
|
+
export declare function eventCondition(spec: any): any;
|
|
23
|
+
export declare function compileEventAction(input: any, layout: any, previous?: any, depth?: number): any;
|
|
24
|
+
export declare function patchDesignerEvent(layouts: any[], scope: EventScope, terminal: string, trigger: string, operation: 'set' | 'remove' | 'enable', input: any): any;
|
|
25
|
+
export declare function mutateDesignerEvent(client: Client, base: string, pageId: string, scope: EventScope, terminal: string, trigger: string, op: 'set' | 'remove' | 'enable', input: any, apply: boolean): Promise<{
|
|
26
|
+
saved: boolean;
|
|
27
|
+
changed: boolean;
|
|
28
|
+
pageId: string;
|
|
29
|
+
terminal: string;
|
|
30
|
+
trigger: string;
|
|
31
|
+
scope: EventScope;
|
|
32
|
+
layouts: any;
|
|
33
|
+
} | {
|
|
34
|
+
saved: boolean;
|
|
35
|
+
changed: boolean;
|
|
36
|
+
pageId: string;
|
|
37
|
+
terminal: string;
|
|
38
|
+
trigger: string;
|
|
39
|
+
scope: EventScope;
|
|
40
|
+
layouts?: undefined;
|
|
41
|
+
}>;
|
|
42
|
+
export declare function createRefreshCondition(client: Client, base: string, compId: string, sqlWhere: string, apply: boolean): Promise<{
|
|
43
|
+
saved: boolean;
|
|
44
|
+
compId: string;
|
|
45
|
+
sqlWhere: string;
|
|
46
|
+
id?: undefined;
|
|
47
|
+
} | {
|
|
48
|
+
saved: boolean;
|
|
49
|
+
id: string;
|
|
50
|
+
compId: string;
|
|
51
|
+
sqlWhere: string;
|
|
52
|
+
}>;
|
|
53
|
+
export {};
|
|
54
|
+
//# sourceMappingURL=designer-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer-event.d.ts","sourceRoot":"","sources":["../../src/services/designer-event.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAMnD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe,CAAC,CAAC;AAChE,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACnF,eAAO,MAAM,gBAAgB;;;;;;CAAqE,CAAC;AACnG,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CASzE,CAAC;AAiBF,wBAAgB,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,OAQzD;AACD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,QAQ9C;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,OAI1C;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,CAe7C;AAOD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,SAAI,GAAG,GAAG,CAwD1F;AAcD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,GAAG,OAoB1J;AACD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;GAcxM;AACD,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;GAM1H"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { lzwCompress } from '../core/lzw.js';
|
|
4
|
+
import { readSourceLayouts } from './designer-source.js';
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
const Babel = require('../../ecodecmd/src/lib/@babel/standalone@7.5.5/babel.js');
|
|
7
|
+
const uid = () => randomUUID().replace(/-/g, '');
|
|
8
|
+
export const EVENT_OPEN_MODES = { '4': '当前页面', '0': '新窗口', '5': '弹出窗口', '1': '右侧滑出', '7': '右侧推出' };
|
|
9
|
+
export const EVENT_ACTIONS = {
|
|
10
|
+
NewPage: { label: '打开页面', key: 'linkInfo' }, RefreshComp: { label: '刷新组件', key: 'refreshInfo' }, ClosePage: { label: '关闭页面' },
|
|
11
|
+
IF: { label: '条件控制', key: 'conditionData' }, JsCode: { label: 'JavaScript', key: 'jsCode' },
|
|
12
|
+
ShowHideComponent: { label: '显示/隐藏组件', key: 'displayComs' }, ShowMenu: { label: '显示菜单', key: 'menuInfo' },
|
|
13
|
+
ScanUpload: { label: '扫描上传', key: 'scanUploadInfo' }, CopyLink: { label: '复制链接' },
|
|
14
|
+
LoginAuthentication: { label: '身份识别', key: 'loginAuthenticationInfo' }, EsbFlow: { label: '执行 ESB', key: 'esbFlow' },
|
|
15
|
+
ExecLogicFlow: { label: '执行逻辑流', key: 'execLogicFlow' }, OpenWeComSession: { label: '打开企业微信会话', key: 'openWeComSession' },
|
|
16
|
+
StartSignAction: { label: '发起签署', key: 'startSignAction' }, ReportPrint: { label: '报表打印' }, ReportExport: { label: '报表导出' },
|
|
17
|
+
CreateReportShot: { label: '生成报表快照' }, ViewReportShot: { label: '查看报表快照' },
|
|
18
|
+
};
|
|
19
|
+
function check(value, message) { if (!value)
|
|
20
|
+
throw new Error(message); }
|
|
21
|
+
function object(v, allowed) { check(v && typeof v === 'object' && !Array.isArray(v), '配置必须为对象'); if (allowed)
|
|
22
|
+
check(Object.keys(v).every(k => allowed.includes(k)), '配置包含未知属性'); }
|
|
23
|
+
function response(r, label) { check(r?.code === 200 && r.status === true && r.fail !== true && r.data !== undefined && r.data !== false, `${label}失败:${r?.msg || '无效响应'}`); return r.data; }
|
|
24
|
+
function stable(v) { return Array.isArray(v) ? v.map(stable) : v && typeof v === 'object' ? Object.fromEntries(Object.keys(v).sort().map(k => [k, stable(v[k])])) : v; }
|
|
25
|
+
const same = (a, b) => JSON.stringify(stable(a)) === JSON.stringify(stable(b));
|
|
26
|
+
function savedComps(comps) {
|
|
27
|
+
const value = clone(comps);
|
|
28
|
+
for (const c of value) {
|
|
29
|
+
if (c.type === 'NList' && c.config) {
|
|
30
|
+
delete c.config._fieldUsageLastChangeId;
|
|
31
|
+
delete c.config._fieldUsageUpdateTime;
|
|
32
|
+
}
|
|
33
|
+
// The platform materializes the default when a component receives its first event.
|
|
34
|
+
if (c.config?.layout && c.config.layout.hidden === undefined)
|
|
35
|
+
c.config.layout.hidden = false;
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
const clone = (x) => structuredClone(x);
|
|
40
|
+
const eventNames = { CLICK: '单击', DIDMOUNT: '加载完成' };
|
|
41
|
+
export function eventTarget(layout, scope) {
|
|
42
|
+
if (!scope.compId) {
|
|
43
|
+
check(!scope.collection && !scope.itemId, '子项必须指定组件');
|
|
44
|
+
return layout.config ||= {};
|
|
45
|
+
}
|
|
46
|
+
const matches = layout.comps.filter((c) => String(c.id) === scope.compId);
|
|
47
|
+
check(matches.length === 1, '组件不属于该终端或未唯一匹配');
|
|
48
|
+
const config = matches[0].config ||= {};
|
|
49
|
+
if (!scope.collection) {
|
|
50
|
+
check(!scope.itemId, '子项需要 collection');
|
|
51
|
+
return config;
|
|
52
|
+
}
|
|
53
|
+
check(['menuConfig', 'btnGroup', 'navMenus', 'newButtons'].includes(scope.collection) && scope.itemId, '子项集合或 ID 无效');
|
|
54
|
+
const items = config[scope.collection];
|
|
55
|
+
check(Array.isArray(items), '组件没有指定子项集合');
|
|
56
|
+
const rows = items.filter((x) => String(x.id) === scope.itemId);
|
|
57
|
+
check(rows.length === 1, '子项未唯一匹配');
|
|
58
|
+
return rows[0];
|
|
59
|
+
}
|
|
60
|
+
export function validateEventGroups(groups) {
|
|
61
|
+
check(Array.isArray(groups) && groups.every(Array.isArray), 'eventGroup 必须为双层数组');
|
|
62
|
+
const seen = new Set();
|
|
63
|
+
for (const entry of groups.flat()) {
|
|
64
|
+
check(entry && typeof entry.type === 'string' && entry.id, '事件类型或 ID 缺失');
|
|
65
|
+
check(!seen.has(entry.type), '同一触发事件最多配置一条');
|
|
66
|
+
seen.add(entry.type);
|
|
67
|
+
check(Array.isArray(entry.events) && entry.events.length <= 1, '每种触发事件最多一个动作');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export function compileEventJs(code) {
|
|
71
|
+
check(typeof code === 'string', 'JavaScript code 必须为字符串');
|
|
72
|
+
try {
|
|
73
|
+
return Babel.transform(code, { filename: 'event.js', sourceType: 'script', parserOpts: { allowReturnOutsideFunction: true }, presets: ['es2015', 'react', ['stage-2', { decoratorsLegacy: true, loose: true }]], plugins: ['proposal-object-rest-spread', 'proposal-optional-chaining'] }).code;
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
throw new Error(`事件 JavaScript 编译失败:${e.message}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export function eventCondition(spec) {
|
|
80
|
+
let count = 0;
|
|
81
|
+
const build = (n, parent, depth) => {
|
|
82
|
+
check(depth <= 12 && ++count <= 500, '条件树过深或过大');
|
|
83
|
+
const key = uid();
|
|
84
|
+
if (n?.rules !== undefined) {
|
|
85
|
+
object(n, ['logic', 'rules']);
|
|
86
|
+
check(['and', 'or'].includes(n.logic) && Array.isArray(n.rules) && n.rules.length, '条件组需 and/or 和非空 rules');
|
|
87
|
+
// This event condition protocol uses 1 = AND, 0 = OR (different from other scopes).
|
|
88
|
+
return { key, relationship: n.logic === 'and' ? '1' : '0', isParent: true, parentNode: parent, datas: n.rules.map((r) => build(r, key, depth + 1)) };
|
|
89
|
+
}
|
|
90
|
+
object(n, ['left', 'operator', 'right']);
|
|
91
|
+
check(typeof n.left === 'string' && n.left, '条件 left 需平台表达式或文字');
|
|
92
|
+
check(['eq', 'gt'].includes(n.operator), '当前事件规则结构化条件支持 eq/gt;其他操作符需补充本入口依据');
|
|
93
|
+
check(typeof n.right === 'string', '条件 right 必须为字符串');
|
|
94
|
+
return { isParent: false, parentNode: parent, id: `Custom_${uid()}`, fieldName: 'customField', fieldType: 'String', text: n.left, objId: '', optionType: '', compType: 'Text', formatType: '', opts: [], type: 'condition', conditions: { func: n.operator, value: n.right, type: '', text: '', isEsb: false }, refObjId: '', key };
|
|
95
|
+
};
|
|
96
|
+
return build(spec.rules !== undefined ? spec : { logic: 'and', rules: [spec] }, '', 0);
|
|
97
|
+
}
|
|
98
|
+
function conditionText(tree) {
|
|
99
|
+
if (tree.isParent)
|
|
100
|
+
return `(${tree.datas.map(conditionText).join(tree.relationship === '1' ? ' AND ' : ' OR ')})`;
|
|
101
|
+
return `${tree.text} ${tree.conditions.func === 'gt' ? '大于' : '等于'} ${JSON.stringify(tree.conditions.value)}`;
|
|
102
|
+
}
|
|
103
|
+
function requireComp(layout, id) { check(typeof id === 'string' && layout.comps.some((c) => String(c.id) === id), `目标组件 ${id} 不属于本终端`); }
|
|
104
|
+
function realObjects(rows, label, minimum = 1) { check(Array.isArray(rows) && rows.length >= minimum && rows.every((x) => x && typeof x.id === 'string' && x.id), `${label}需要真实浏览对象数组`); }
|
|
105
|
+
export function compileEventAction(input, layout, previous, depth = 0) {
|
|
106
|
+
check(depth <= 8, '菜单子事件嵌套过深');
|
|
107
|
+
object(input, ['type', 'enabled', 'config']);
|
|
108
|
+
const descriptor = EVENT_ACTIONS[input.type];
|
|
109
|
+
check(descriptor, '不支持该事件动作类型');
|
|
110
|
+
if (input.enabled !== undefined)
|
|
111
|
+
check(typeof input.enabled === 'boolean', 'enabled 必须为布尔值');
|
|
112
|
+
const a = { id: previous?.id || uid(), type: input.type, enable: input.enabled ?? true };
|
|
113
|
+
const config = clone(input.config ?? {});
|
|
114
|
+
if (!descriptor.key) {
|
|
115
|
+
check(Object.keys(config).length === 0, '此动作不接收 config');
|
|
116
|
+
return a;
|
|
117
|
+
}
|
|
118
|
+
if (input.type === 'JsCode') {
|
|
119
|
+
object(config, ['code']);
|
|
120
|
+
a.jsCode = { code: config.code, compiledCode: compileEventJs(config.code) };
|
|
121
|
+
return a;
|
|
122
|
+
}
|
|
123
|
+
if (input.type === 'IF') {
|
|
124
|
+
object(config, ['mode', 'title', 'content', 'confirmText', 'cancelText', 'condition']);
|
|
125
|
+
check(['rule', 'dialog'].includes(config.mode), '条件 mode 只能为 rule/dialog');
|
|
126
|
+
a.conditionData = { conditionType: config.mode === 'rule' ? 'Rule' : 'Dialog', conditionTitle: config.title ?? '确认', conditionContent: config.content ?? '', confirmBtnText: config.confirmText ?? '是', cancelBtnText: config.cancelText ?? '否' };
|
|
127
|
+
if (config.mode === 'rule') {
|
|
128
|
+
check(config.condition, '规则模式需要 condition');
|
|
129
|
+
a.conditionData.conditions = eventCondition(config.condition);
|
|
130
|
+
a.conditionData.conditionsText = conditionText(a.conditionData.conditions);
|
|
131
|
+
}
|
|
132
|
+
return a;
|
|
133
|
+
}
|
|
134
|
+
if (input.type === 'ShowHideComponent') {
|
|
135
|
+
check(Array.isArray(config) && config.length, '显示隐藏 config 为非空数组');
|
|
136
|
+
for (const item of config) {
|
|
137
|
+
object(item, ['id', 'display', 'children']);
|
|
138
|
+
requireComp(layout, item.id);
|
|
139
|
+
check(['show', 'hide', 'switchover'].includes(item.display), 'display 需 show/hide/switchover');
|
|
140
|
+
if (item.children !== undefined) {
|
|
141
|
+
check(Array.isArray(item.children), 'children 需数组');
|
|
142
|
+
for (const child of item.children) {
|
|
143
|
+
check(child.id && ['show', 'hide', 'switchover'].includes(child.display), '子项显示设置无效');
|
|
144
|
+
const parent = layout.comps.find((c) => c.id === item.id);
|
|
145
|
+
check(['menuConfig', 'btnGroup', 'navMenus', 'newButtons'].some(k => parent.config?.[k]?.some((x) => x.id === child.id)), '显示隐藏子项不属于目标组件');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
a.displayComs = config;
|
|
150
|
+
return a;
|
|
151
|
+
}
|
|
152
|
+
object(config);
|
|
153
|
+
if (input.type === 'NewPage') {
|
|
154
|
+
check(config.page && typeof config.page.pageId === 'string' && config.page.pageName && config.page.pageType && config.page.appid, 'linkInfo 需真实 page 对象');
|
|
155
|
+
check(['0', '1', '4', '5', '7'].includes(String(config.openMode)), '打开方式仅支持本入口 0/1/4/5/7');
|
|
156
|
+
if (config.paramsMode !== undefined)
|
|
157
|
+
check(['1', '2'].includes(String(config.paramsMode)), 'paramsMode 仅接受 1/2');
|
|
158
|
+
check(config.params === undefined || Array.isArray(config.params), 'params 需要数组');
|
|
159
|
+
for (const p of config.params || [])
|
|
160
|
+
check(p.name && p.type === 'fixed' && typeof p.value === 'string', '本轮打开页面参数支持 name/value/type:fixed');
|
|
161
|
+
if (config.isBlankClose !== undefined)
|
|
162
|
+
check(typeof config.isBlankClose === 'boolean', 'isBlankClose 必须为布尔值');
|
|
163
|
+
}
|
|
164
|
+
else if (input.type === 'RefreshComp') {
|
|
165
|
+
check(Array.isArray(config.selectedCom) && config.selectedCom.length, '刷新需要 selectedCom');
|
|
166
|
+
config.selectedCom.forEach((id) => requireComp(layout, id));
|
|
167
|
+
if (config.conditionSet?.type === 'sql_where')
|
|
168
|
+
check(config.conditionSet.data?.condition && config.conditionSet.data?.sourceId, 'SQL 刷新条件需要已创建的 condition ID 和数据源 ID');
|
|
169
|
+
for (const k of ['filterIsNull', 'isOverrideFilter'])
|
|
170
|
+
if (config[k] !== undefined)
|
|
171
|
+
check(typeof config[k] === 'boolean', `${k} 必须为布尔值`);
|
|
172
|
+
}
|
|
173
|
+
else if (input.type === 'ShowMenu') {
|
|
174
|
+
check(['dropDownMenu', 'footerMenu'].includes(config.menuType), 'menuType 需 dropDownMenu/footerMenu');
|
|
175
|
+
check(['vertical', 'horizontal'].includes(config.displayMode), 'displayMode 需 vertical/horizontal');
|
|
176
|
+
check(Array.isArray(config.menuItems), 'menuItems 需数组');
|
|
177
|
+
for (const m of config.menuItems) {
|
|
178
|
+
m.id ||= uid();
|
|
179
|
+
check(typeof m.menuName === 'string' && m.menuName, '菜单项需要 menuName');
|
|
180
|
+
if (m.action !== undefined) {
|
|
181
|
+
check(!m.menuEvent, '菜单项 action 与 menuEvent 二选一');
|
|
182
|
+
const child = compileEventAction(m.action, layout, undefined, depth + 1);
|
|
183
|
+
m.menuEvent = [[{ type: 'CLICK', name: '单击', id: uid(), disableDelete: true, events: [child] }]];
|
|
184
|
+
delete m.action;
|
|
185
|
+
}
|
|
186
|
+
validateEventGroups(m.menuEvent || []);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (input.type === 'ScanUpload') {
|
|
190
|
+
realObjects(config.deviceType, '设备类型');
|
|
191
|
+
realObjects(config.useDevice, '扫描设备');
|
|
192
|
+
for (const k of ['deviceTypeSelect', 'dataProcess', 'fileType', 'uploadPathSelect', 'scanFileNameType'])
|
|
193
|
+
check(typeof config[k] === 'string', `扫描设置缺少 ${k}`);
|
|
194
|
+
if (config.actionFlow?.length)
|
|
195
|
+
realObjects(config.actionFlow, '动作流');
|
|
196
|
+
for (const k of ['isMerge', 'isAutoCheck', 'isParallel'])
|
|
197
|
+
if (config[k] !== undefined)
|
|
198
|
+
check(typeof config[k] === 'boolean', `${k} 需布尔值`);
|
|
199
|
+
}
|
|
200
|
+
else if (input.type === 'LoginAuthentication') {
|
|
201
|
+
realObjects(config.deviceType, '识别类型');
|
|
202
|
+
realObjects(config.useDevice, '识别设备');
|
|
203
|
+
}
|
|
204
|
+
else if (input.type === 'EsbFlow') {
|
|
205
|
+
realObjects(config.esbData, 'ESB');
|
|
206
|
+
check(config.params && Array.isArray(config.params.tableList), 'ESB 需要完整输入表结构 params.tableList');
|
|
207
|
+
}
|
|
208
|
+
else if (input.type === 'ExecLogicFlow') {
|
|
209
|
+
realObjects(config.data, '前端逻辑流');
|
|
210
|
+
check(config.data.every((x) => x.type === 'FRONTEND'), '只能绑定前端逻辑流');
|
|
211
|
+
check(Array.isArray(config.inputParams), 'inputParams 需数组');
|
|
212
|
+
}
|
|
213
|
+
else if (input.type === 'OpenWeComSession') {
|
|
214
|
+
check(typeof config.chatidInput === 'string' && config.chatidInputType === 'fixvalue' && config.useridsType === 'fixvalue', '当前企业微信输入支持 fixvalue');
|
|
215
|
+
realObjects(config.userids, '会话人员', 0);
|
|
216
|
+
check(typeof config.chatidOutput === 'string', 'chatidOutput 需变量名字符串');
|
|
217
|
+
}
|
|
218
|
+
else if (input.type === 'StartSignAction') {
|
|
219
|
+
// Only the empty selector was captured; do not invent the nonempty target serialization.
|
|
220
|
+
throw new Error('签署动作目前仅可查询、保留、删除或启停;需非空签署设置保存报文后才能新增/替换');
|
|
221
|
+
}
|
|
222
|
+
a[descriptor.key] = config;
|
|
223
|
+
return a;
|
|
224
|
+
}
|
|
225
|
+
function pairScope(layouts, primary, target, scope) {
|
|
226
|
+
if (!scope.compId || primary.id === target.id)
|
|
227
|
+
return scope;
|
|
228
|
+
const comp = primary.comps.find((c) => c.id === scope.compId);
|
|
229
|
+
check(comp?.refCompId, '组件缺少另一终端配对');
|
|
230
|
+
check(target.comps.some((c) => c.id === comp.refCompId && c.refCompId === comp.id), '组件跨端引用未互相匹配');
|
|
231
|
+
return { ...scope, compId: comp.refCompId };
|
|
232
|
+
}
|
|
233
|
+
function remapAction(input, primary, target) {
|
|
234
|
+
const next = clone(input);
|
|
235
|
+
const map = (id) => { const c = primary.comps.find((x) => x.id === id); check(c?.refCompId && target.comps.some((x) => x.id === c.refCompId), `目标组件 ${id} 无跨端配对`); return c.refCompId; };
|
|
236
|
+
if (next.type === 'RefreshComp')
|
|
237
|
+
next.config.selectedCom = next.config.selectedCom.map(map);
|
|
238
|
+
if (next.type === 'ShowHideComponent')
|
|
239
|
+
next.config.forEach((x) => { x.id = map(x.id); });
|
|
240
|
+
return next;
|
|
241
|
+
}
|
|
242
|
+
export function patchDesignerEvent(layouts, scope, terminal, trigger, operation, input) {
|
|
243
|
+
check(['pc', 'mobile', 'both'].includes(terminal), 'terminal 需 pc/mobile/both');
|
|
244
|
+
check(eventNames[trigger], '仅支持 CLICK/DIDMOUNT');
|
|
245
|
+
const next = clone(layouts), primary = next.find((l) => l.terminalType === (terminal === 'mobile' ? 'MOBILE' : 'PC'));
|
|
246
|
+
check(primary, '缺少目标终端');
|
|
247
|
+
const targets = terminal === 'both' ? next.filter((l) => ['PC', 'MOBILE'].includes(l.terminalType)) : [primary];
|
|
248
|
+
if (terminal === 'both')
|
|
249
|
+
check(targets.length === 2, 'both 需要完整 PC/MOBILE 两端');
|
|
250
|
+
for (const layout of targets) {
|
|
251
|
+
const target = eventTarget(layout, pairScope(next, primary, layout, scope)), groups = target.eventGroup || [];
|
|
252
|
+
validateEventGroups(groups);
|
|
253
|
+
const entries = groups.flat(), hits = entries.filter((e) => e.type === trigger);
|
|
254
|
+
check(hits.length <= 1, '事件重复,不能按类型唯一定位');
|
|
255
|
+
if (operation === 'remove') {
|
|
256
|
+
check(hits.length === 1, '没有对应事件');
|
|
257
|
+
target.eventGroup = groups.map((g) => g.filter(e => e.type !== trigger)).filter((g) => g.length);
|
|
258
|
+
}
|
|
259
|
+
else if (operation === 'enable') {
|
|
260
|
+
check(hits.length === 1 && hits[0].events.length === 1, '没有对应动作');
|
|
261
|
+
check(typeof input === 'boolean', '启停需布尔值');
|
|
262
|
+
hits[0].events[0].enable = input;
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
const actionInput = layout.id === primary.id ? input : remapAction(input, primary, layout);
|
|
266
|
+
const old = hits[0];
|
|
267
|
+
const action = compileEventAction(actionInput, layout, old?.events[0]);
|
|
268
|
+
const entry = { ...(old || {}), id: old?.id || uid(), type: trigger, name: eventNames[trigger], disableDelete: old?.disableDelete ?? false, events: [action], actionDesc: EVENT_ACTIONS[action.type].label };
|
|
269
|
+
if (old)
|
|
270
|
+
target.eventGroup = groups.map((g) => g.map(e => e.type === trigger ? entry : e));
|
|
271
|
+
else
|
|
272
|
+
target.eventGroup = groups.length ? groups.map((g, i) => i === 0 ? [...g, entry] : g) : [[entry]];
|
|
273
|
+
}
|
|
274
|
+
validateEventGroups(target.eventGroup);
|
|
275
|
+
}
|
|
276
|
+
return next;
|
|
277
|
+
}
|
|
278
|
+
export async function mutateDesignerEvent(client, base, pageId, scope, terminal, trigger, op, input, apply) {
|
|
279
|
+
check(/^[1-9]\d*$/.test(pageId), 'pageId 必须为正整数字符串');
|
|
280
|
+
const infoUrl = `${base}/api/bs/ebuilder/designer/layout/page/info?pageId=${pageId}`;
|
|
281
|
+
const info = response(await client.get(infoUrl), '读取页面');
|
|
282
|
+
check(info.module === 'EB_PAGE' && String(info.pageId || info.id) === pageId && info.allowEdit === true && !info.isLock, '页面身份、编辑权限或软锁状态不允许保存');
|
|
283
|
+
const before = await readSourceLayouts(client, base, pageId), after = patchDesignerEvent(before, scope, terminal, trigger, op, input);
|
|
284
|
+
const changed = !same(before, after);
|
|
285
|
+
if (!apply || !changed)
|
|
286
|
+
return { saved: apply, changed, pageId, terminal, trigger, scope, layouts: after };
|
|
287
|
+
check(same(before, await readSourceLayouts(client, base, pageId)), '布局已变化,停止覆盖');
|
|
288
|
+
const latestInfo = response(await client.get(infoUrl), '检查编辑状态');
|
|
289
|
+
check(latestInfo.allowEdit === true && !latestInfo.isLock, '页面编辑状态变化');
|
|
290
|
+
response(await client.post(`${base}/api/bs/ebuilder/designer/layout/save?pageId=${pageId}`, lzwCompress(JSON.stringify(after)), { 'content-type': 'application/json;charset=UTF-8', ebbusinessid: pageId }), '保存事件');
|
|
291
|
+
const readback = await readSourceLayouts(client, base, pageId);
|
|
292
|
+
check(readback.length === after.length, '保存后布局集合变化');
|
|
293
|
+
for (const l of after) {
|
|
294
|
+
const actual = readback.find((x) => String(x.id) === String(l.id));
|
|
295
|
+
check(actual && same(savedComps(l.comps), savedComps(actual.comps)) && same(l.config, actual.config) && same(l.sourceCode, actual.sourceCode), '事件保存后回读不一致,请检查实际状态');
|
|
296
|
+
}
|
|
297
|
+
const unlock = await client.post(`${base}/api/bs/ebuilder/designer/layout/lock?pageId=${pageId}&isLock=false`, {});
|
|
298
|
+
check(unlock?.code === 200 && unlock.status === true, '事件已保存,但释放本次软锁失败');
|
|
299
|
+
return { saved: true, changed: true, pageId, terminal, trigger, scope };
|
|
300
|
+
}
|
|
301
|
+
export async function createRefreshCondition(client, base, compId, sqlWhere, apply) {
|
|
302
|
+
check(/^[a-fA-F0-9]{32}$/.test(compId) && typeof sqlWhere === 'string' && sqlWhere.trim(), '需要真实组件 ID 及非空 SQL WHERE');
|
|
303
|
+
if (!apply)
|
|
304
|
+
return { saved: false, compId, sqlWhere };
|
|
305
|
+
const form = new FormData();
|
|
306
|
+
form.set('compId', compId);
|
|
307
|
+
form.set('conditionValue', lzwCompress(sqlWhere));
|
|
308
|
+
const id = response(await client.postMultipart(`${base}/api/ebuilder/designer/comssdk/condition/create`, form), '创建刷新条件');
|
|
309
|
+
check(typeof id === 'string' && /^[1-9]\d*$/.test(id), '条件 ID 无效');
|
|
310
|
+
return { saved: true, id, compId, sqlWhere };
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=designer-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer-event.js","sourceRoot":"","sources":["../../src/services/designer-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ApiClient } from '../core/client.js';
|
|
2
|
+
type Client = Pick<ApiClient, 'get' | 'post'>;
|
|
3
|
+
export declare function decodePageSource(layout: any): any;
|
|
4
|
+
export declare function compilePageJs(source: string): string;
|
|
5
|
+
/** Structural validation only; selectors and property support are checked in the browser. */
|
|
6
|
+
export declare function validatePageCss(source: string): void;
|
|
7
|
+
export declare function patchPageSource(layouts: any[], pageId: string, terminal: string, change: {
|
|
8
|
+
js?: string;
|
|
9
|
+
css?: string;
|
|
10
|
+
}): {
|
|
11
|
+
layouts: any[];
|
|
12
|
+
code: any;
|
|
13
|
+
layoutId: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function readSourceLayouts(client: Client, base: string, pageId: string): Promise<any[]>;
|
|
16
|
+
export declare function readPageSource(client: Client, base: string, pageId: string, terminal: string): Promise<{
|
|
17
|
+
pageId: string;
|
|
18
|
+
layoutId: any;
|
|
19
|
+
terminal: string;
|
|
20
|
+
ecodeId: any;
|
|
21
|
+
ecodeVersion: any;
|
|
22
|
+
code: any;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function writePageSource(client: Client, base: string, pageId: string, terminal: string, change: {
|
|
25
|
+
js?: string;
|
|
26
|
+
css?: string;
|
|
27
|
+
}, apply: boolean): Promise<{
|
|
28
|
+
saved: boolean;
|
|
29
|
+
changed: boolean;
|
|
30
|
+
pageId: string;
|
|
31
|
+
terminal: string;
|
|
32
|
+
layoutId: string;
|
|
33
|
+
code: any;
|
|
34
|
+
response?: undefined;
|
|
35
|
+
} | {
|
|
36
|
+
saved: boolean;
|
|
37
|
+
changed: boolean;
|
|
38
|
+
pageId: string;
|
|
39
|
+
terminal: string;
|
|
40
|
+
layoutId: string;
|
|
41
|
+
response: any;
|
|
42
|
+
code: any;
|
|
43
|
+
}>;
|
|
44
|
+
export declare function readPageSdkCatalog(client: Client, base: string): Promise<any[]>;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=designer-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer-source.d.ts","sourceRoot":"","sources":["../../src/services/designer-source.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAKnD,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAM9C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAQjD;AACD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAepD;AACD,6FAA6F;AAC7F,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,QAY7C;AACD,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;;;;EAmBtH;AACD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAKnF;AACD,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;;;;;;;GAIlG;AACD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;GAuB1J;AACD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAGpE"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { lzwCompress } from '../core/lzw.js';
|
|
3
|
+
import { parseLayoutJson } from './form-layout-source/json.js';
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const Babel = require('../../ecodecmd/src/lib/@babel/standalone@7.5.5/babel.js');
|
|
6
|
+
function check(v, msg) { if (!v)
|
|
7
|
+
throw new Error(msg); }
|
|
8
|
+
function result(r, name) { check(r?.code === 200 && r.status === true && r.fail !== true && r.data !== undefined && r.data !== false, `${name}失败:${r?.msg || '无效响应'}`); return r.data; }
|
|
9
|
+
function pageIdentity(id) { check(/^[1-9]\d*$/.test(id), 'pageId 必须是正整数字符串'); }
|
|
10
|
+
function stable(v) { return Array.isArray(v) ? v.map(stable) : v && typeof v === 'object' ? Object.fromEntries(Object.keys(v).sort().map(k => [k, stable(v[k])])) : v; }
|
|
11
|
+
const same = (a, b) => JSON.stringify(stable(a)) === JSON.stringify(stable(b));
|
|
12
|
+
export function decodePageSource(layout) {
|
|
13
|
+
const encoded = layout.sourceCode?.ecode;
|
|
14
|
+
if (!encoded)
|
|
15
|
+
return { js: { content: '', compiledContent: '' }, css: { content: '', compiledContent: '' } };
|
|
16
|
+
check(typeof encoded === 'string', 'ecode 不是编码字符串');
|
|
17
|
+
const decoded = parseLayoutJson(decodeURI(encoded));
|
|
18
|
+
check(decoded && typeof decoded === 'object' && !Array.isArray(decoded), 'ecode 结构无效');
|
|
19
|
+
for (const lang of ['js', 'css'])
|
|
20
|
+
check(decoded[lang] && typeof decoded[lang].content === 'string' && typeof decoded[lang].compiledContent === 'string', `源码缺少完整 ${lang} 内容`);
|
|
21
|
+
return decoded;
|
|
22
|
+
}
|
|
23
|
+
export function compilePageJs(source) {
|
|
24
|
+
if (!source.trim())
|
|
25
|
+
return '';
|
|
26
|
+
let body;
|
|
27
|
+
try {
|
|
28
|
+
// Compile as a module first: exports become assignments on this layout module's exports,
|
|
29
|
+
// while their functions retain the current pageSdk closure when invoked later.
|
|
30
|
+
body = Babel.transform(source, {
|
|
31
|
+
filename: 'index.js', sourceType: 'module', parserOpts: { allowReturnOutsideFunction: true },
|
|
32
|
+
presets: ['es2015', 'react', ['stage-2', { decoratorsLegacy: true, loose: true }]],
|
|
33
|
+
plugins: ['proposal-object-rest-spread', 'proposal-optional-chaining'],
|
|
34
|
+
}).code;
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
throw new Error(`页面 JavaScript 编译失败:${e.message}`);
|
|
38
|
+
}
|
|
39
|
+
check(!/\bexports\.load\s*=/.test(body) && !/\bexports\[\s*['"]load['"]\s*\]\s*=/.test(body), 'load 是页面运行入口保留导出名');
|
|
40
|
+
body = body.replace(/^"use strict";\s*/, '');
|
|
41
|
+
return `(function () {\n "use strict";\n window.weappEcodesdk.jsonp.export("\${appId}", "index.js", function () {\n var exports = {};\n var require = window.weappEcodesdk.jsonp.require.bind(null, "\${appId}", "index.js");\n Object.defineProperty(exports, "__esModule", { value: true });\n exports.load = function(pageId) {\n var ebSdk = window.ebuilderSDK;\n var pageSdk = window.ebuilderSDK && window.ebuilderSDK.getPageSDK && window.ebuilderSDK.getPageSDK(pageId);\n${body}\n };\n return exports;\n });\n})();`;
|
|
42
|
+
}
|
|
43
|
+
/** Structural validation only; selectors and property support are checked in the browser. */
|
|
44
|
+
export function validatePageCss(source) {
|
|
45
|
+
const stack = [];
|
|
46
|
+
let quote = '';
|
|
47
|
+
let comment = false;
|
|
48
|
+
for (let i = 0; i < source.length; i++) {
|
|
49
|
+
const c = source[i], next = source[i + 1];
|
|
50
|
+
if (comment) {
|
|
51
|
+
if (c === '*' && next === '/') {
|
|
52
|
+
comment = false;
|
|
53
|
+
i++;
|
|
54
|
+
}
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (quote) {
|
|
58
|
+
if (c === '\\')
|
|
59
|
+
i++;
|
|
60
|
+
else if (c === quote)
|
|
61
|
+
quote = '';
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (c === '/' && next === '*') {
|
|
65
|
+
comment = true;
|
|
66
|
+
i++;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (c === '"' || c === "'") {
|
|
70
|
+
quote = c;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if ('{(['.includes(c))
|
|
74
|
+
stack.push(c);
|
|
75
|
+
else if ('})]'.includes(c))
|
|
76
|
+
check(stack.pop() === { '}': '{', ')': '(', ']': '[' }[c], 'CSS 括号不匹配');
|
|
77
|
+
}
|
|
78
|
+
check(!quote && !comment && stack.length === 0, 'CSS 字符串、注释或括号未闭合');
|
|
79
|
+
}
|
|
80
|
+
export function patchPageSource(layouts, pageId, terminal, change) {
|
|
81
|
+
pageIdentity(pageId);
|
|
82
|
+
check(['PC', 'MOBILE'].includes(terminal), 'terminal 仅支持 pc/mobile');
|
|
83
|
+
check(Object.keys(change).length > 0 && (change.js !== undefined || change.css !== undefined), '至少提供 JS 或 CSS;空字符串用于显式清空');
|
|
84
|
+
check(layouts.length > 0 && layouts.every(l => String(l.pageId) === pageId && l.id && Array.isArray(l.comps)), '布局身份或组件结构不完整');
|
|
85
|
+
const hits = layouts.filter(l => l.terminalType === terminal);
|
|
86
|
+
check(hits.length === 1, '终端布局未唯一匹配');
|
|
87
|
+
const next = structuredClone(layouts), target = next.find(l => l.id === hits[0].id);
|
|
88
|
+
const code = decodePageSource(target);
|
|
89
|
+
if (change.js !== undefined) {
|
|
90
|
+
check(typeof change.js === 'string', 'js 必须为字符串');
|
|
91
|
+
code.js = { ...code.js, content: change.js, compiledContent: compilePageJs(change.js), pageId: `if (${pageId} == String(props.pageId))`, name: 'index', state: 'n' };
|
|
92
|
+
}
|
|
93
|
+
if (change.css !== undefined) {
|
|
94
|
+
check(typeof change.css === 'string', 'css 必须为字符串');
|
|
95
|
+
validatePageCss(change.css);
|
|
96
|
+
// No inferred scoping: keep CSS explicit. A caller can scope to the actual page/comp root.
|
|
97
|
+
code.css = { ...code.css, content: change.css, compiledContent: change.css, name: 'index', state: 'n' };
|
|
98
|
+
}
|
|
99
|
+
target.sourceCode = { ...target.sourceCode, ecode: encodeURI(JSON.stringify(code)) };
|
|
100
|
+
check(same(decodePageSource(target), code), '源码编码往返校验失败');
|
|
101
|
+
return { layouts: next, code, layoutId: String(target.id) };
|
|
102
|
+
}
|
|
103
|
+
export async function readSourceLayouts(client, base, pageId) {
|
|
104
|
+
pageIdentity(pageId);
|
|
105
|
+
const layouts = result(await client.get(`${base}/api/bs/ebuilder/designer/layout/list?pageId=${pageId}&returnCusComp=true`), '读取页面布局');
|
|
106
|
+
check(Array.isArray(layouts) && layouts.length > 0 && layouts.every(l => String(l.pageId) === pageId && l.id && Array.isArray(l.comps)), '页面布局不完整或身份不一致');
|
|
107
|
+
return layouts;
|
|
108
|
+
}
|
|
109
|
+
export async function readPageSource(client, base, pageId, terminal) {
|
|
110
|
+
const layouts = await readSourceLayouts(client, base, pageId);
|
|
111
|
+
const hits = layouts.filter(l => l.terminalType === terminal);
|
|
112
|
+
check(hits.length === 1, '终端布局未唯一匹配');
|
|
113
|
+
return { pageId, layoutId: hits[0].id, terminal, ecodeId: hits[0].ecodeId, ecodeVersion: hits[0].ecodeVersion, code: decodePageSource(hits[0]) };
|
|
114
|
+
}
|
|
115
|
+
export async function writePageSource(client, base, pageId, terminal, change, apply) {
|
|
116
|
+
pageIdentity(pageId);
|
|
117
|
+
const info = result(await client.get(`${base}/api/bs/ebuilder/designer/layout/page/info?pageId=${pageId}`), '读取页面信息');
|
|
118
|
+
check(info.module === 'EB_PAGE' && String(info.pageId || info.id) === pageId, '该命令仅用于 EB 普通页面源码');
|
|
119
|
+
check(info.allowEdit === true && !info.isLock, '页面不可编辑或已锁定;先处理设计器会话,勿覆盖他人的编辑');
|
|
120
|
+
const before = await readSourceLayouts(client, base, pageId), patched = patchPageSource(before, pageId, terminal, change);
|
|
121
|
+
const changed = !same(before, patched.layouts);
|
|
122
|
+
if (!apply || !changed)
|
|
123
|
+
return { saved: apply, changed, pageId, terminal, layoutId: patched.layoutId, code: patched.code };
|
|
124
|
+
const latest = await readSourceLayouts(client, base, pageId);
|
|
125
|
+
check(same(before, latest), '预检期间布局发生变化,停止覆盖,请重新读取');
|
|
126
|
+
const currentInfo = result(await client.get(`${base}/api/bs/ebuilder/designer/layout/page/info?pageId=${pageId}`), '检查编辑状态');
|
|
127
|
+
check(currentInfo.allowEdit === true && !currentInfo.isLock, '预检期间页面编辑状态变化,停止覆盖');
|
|
128
|
+
const response = result(await client.post(`${base}/api/bs/ebuilder/designer/layout/save?pageId=${pageId}`, lzwCompress(JSON.stringify(patched.layouts)), { 'content-type': 'application/json;charset=UTF-8', ebbusinessid: pageId }), '保存页面源码');
|
|
129
|
+
const after = await readSourceLayouts(client, base, pageId);
|
|
130
|
+
check(after.length === before.length && after.every(l => before.some(x => String(x.id) === String(l.id))), '保存后终端布局集合变化');
|
|
131
|
+
for (const expected of patched.layouts) {
|
|
132
|
+
const actual = after.find(l => String(l.id) === String(expected.id));
|
|
133
|
+
check(same(actual.comps, expected.comps) && same(actual.config, expected.config), '源码保存后组件或布局配置变化,请核对实际状态');
|
|
134
|
+
check(same(actual.sourceCode, expected.sourceCode), '源码或编译产物回读不一致,请核对实际状态');
|
|
135
|
+
}
|
|
136
|
+
const unlock = await client.post(`${base}/api/bs/ebuilder/designer/layout/lock?pageId=${pageId}&isLock=false`, {});
|
|
137
|
+
check(unlock?.code === 200 && unlock.status === true, '源码已保存且回读一致,但释放本次保存软锁失败;请查询编辑状态');
|
|
138
|
+
return { saved: true, changed: true, pageId, terminal, layoutId: patched.layoutId, response, code: decodePageSource(after.find(l => String(l.id) === patched.layoutId)) };
|
|
139
|
+
}
|
|
140
|
+
export async function readPageSdkCatalog(client, base) {
|
|
141
|
+
const categories = result(await client.get(`${base}/api/ebuilder/designer/function/listWithCategory?module=EB_PAGE&isCustom=false`), '读取页面 SDK 文档');
|
|
142
|
+
check(Array.isArray(categories) && categories.every(c => Array.isArray(c.functions)), '页面 SDK 文档结构不完整');
|
|
143
|
+
return categories;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=designer-source.js.map
|