sy-page-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,1383 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/react/index.ts
31
+ var react_exports = {};
32
+ __export(react_exports, {
33
+ PageProvider: () => PageProvider,
34
+ createPageSdk: () => createPageSdk,
35
+ createReactPage: () => createReactPage,
36
+ useCurrentUser: () => useCurrentUser,
37
+ useDataSource: () => useDataSource,
38
+ useFormViewPermissions: () => useFormViewPermissions,
39
+ useMessage: () => useMessage,
40
+ useModal: () => useModal,
41
+ useNavigation: () => useNavigation,
42
+ usePageContext: () => usePageContext,
43
+ usePageProps: () => usePageProps,
44
+ usePageRoute: () => usePageRoute,
45
+ usePageSdk: () => usePageSdk
46
+ });
47
+ module.exports = __toCommonJS(react_exports);
48
+
49
+ // src/react/createReactPage.tsx
50
+ var import_cssinjs = require("@ant-design/cssinjs");
51
+ var import_antd = require("antd");
52
+ var import_zh_CN = __toESM(require("antd/locale/zh_CN"), 1);
53
+ var import_client2 = require("react-dom/client");
54
+
55
+ // src/react/provider.tsx
56
+ var import_react2 = require("react");
57
+
58
+ // src/react/store.ts
59
+ var import_react = require("react");
60
+ var ReactPageContext = (0, import_react.createContext)(null);
61
+ var usePageSdkStore = () => {
62
+ const store = (0, import_react.useContext)(ReactPageContext);
63
+ if (!store) {
64
+ throw new Error("usePageSdkStore \u5FC5\u987B\u5728 PageProvider \u5185\u4F7F\u7528");
65
+ }
66
+ return store;
67
+ };
68
+
69
+ // src/core/client.ts
70
+ var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
71
+ var isSearchRuleLike = (value) => isRecord(value) && typeof value.key === "string" && (value.componentName === void 0 || typeof value.componentName === "string");
72
+ var isBlobLike = (value) => typeof Blob !== "undefined" && value instanceof Blob;
73
+ var normalizeMethod = (value) => {
74
+ const method = String(value || "get").toLowerCase();
75
+ if (method === "get" || method === "post" || method === "put" || method === "delete" || method === "patch") {
76
+ return method;
77
+ }
78
+ return "get";
79
+ };
80
+ var resolveAppType = (context, explicitAppType) => {
81
+ const appType = String(explicitAppType || context.app.appType || "").trim();
82
+ if (!appType) {
83
+ throw new Error("appType \u4E0D\u80FD\u4E3A\u7A7A");
84
+ }
85
+ return appType;
86
+ };
87
+ var buildAppPath = (context, explicitAppType, suffix) => `/${resolveAppType(context, explicitAppType)}${suffix}`;
88
+ var encodePathSegment = (value) => encodeURIComponent(String(value));
89
+ var getHeaderValue = (headers, name) => {
90
+ if (!headers) {
91
+ return void 0;
92
+ }
93
+ const target = name.toLowerCase();
94
+ const entry = Object.entries(headers).find(
95
+ ([key]) => key.toLowerCase() === target
96
+ );
97
+ return entry ? String(entry[1]) : void 0;
98
+ };
99
+ var parseContentDispositionFileName = (contentDisposition) => {
100
+ if (!contentDisposition) {
101
+ return void 0;
102
+ }
103
+ const utf8Match = contentDisposition.match(/filename\*=UTF-8''([^;]+)/i);
104
+ if (utf8Match?.[1]) {
105
+ try {
106
+ return decodeURIComponent(utf8Match[1]);
107
+ } catch {
108
+ return utf8Match[1];
109
+ }
110
+ }
111
+ const quotedMatch = contentDisposition.match(/filename="([^"]+)"/i);
112
+ if (quotedMatch?.[1]) {
113
+ return quotedMatch[1];
114
+ }
115
+ const plainMatch = contentDisposition.match(/filename=([^;]+)/i);
116
+ if (plainMatch?.[1]) {
117
+ return plainMatch[1].trim();
118
+ }
119
+ return void 0;
120
+ };
121
+ var serializeQuery = (query) => {
122
+ if (!query) {
123
+ return void 0;
124
+ }
125
+ const params = new URLSearchParams();
126
+ const appendValue = (key, value) => {
127
+ if (value === void 0 || value === null || value === "") {
128
+ return;
129
+ }
130
+ if (Array.isArray(value)) {
131
+ value.forEach((item) => appendValue(key, item));
132
+ return;
133
+ }
134
+ if (value instanceof Date) {
135
+ params.append(key, value.toISOString());
136
+ return;
137
+ }
138
+ params.append(key, String(value));
139
+ };
140
+ Object.entries(query).forEach(([key, value]) => {
141
+ appendValue(key, value);
142
+ });
143
+ const serialized = params.toString();
144
+ return serialized || void 0;
145
+ };
146
+ var toLegacyRules = (value) => Object.entries(value).flatMap(([key, itemValue]) => {
147
+ if (itemValue === void 0) {
148
+ return [];
149
+ }
150
+ return [
151
+ {
152
+ key,
153
+ operator: Array.isArray(itemValue) ? "IN" : "EQ",
154
+ value: itemValue
155
+ }
156
+ ];
157
+ });
158
+ var toSearchGroup = (value) => {
159
+ if (value === void 0 || value === null || value === "") {
160
+ return void 0;
161
+ }
162
+ if (typeof value === "string") {
163
+ try {
164
+ return toSearchGroup(JSON.parse(value));
165
+ } catch {
166
+ return void 0;
167
+ }
168
+ }
169
+ if (Array.isArray(value)) {
170
+ const rules = [];
171
+ const conditions = [];
172
+ value.forEach((item) => {
173
+ const group = toSearchGroup(item);
174
+ if (group) {
175
+ if (group.rules?.length) {
176
+ rules.push(...group.rules);
177
+ }
178
+ if (group.conditions?.length) {
179
+ conditions.push(...group.conditions);
180
+ }
181
+ return;
182
+ }
183
+ if (isSearchRuleLike(item)) {
184
+ rules.push(item);
185
+ return;
186
+ }
187
+ if (isRecord(item)) {
188
+ rules.push(...toLegacyRules(item));
189
+ }
190
+ });
191
+ if (rules.length === 0 && conditions.length === 0) {
192
+ return void 0;
193
+ }
194
+ return {
195
+ logic: "AND",
196
+ ...rules.length > 0 ? { rules } : {},
197
+ ...conditions.length > 0 ? { conditions } : {}
198
+ };
199
+ }
200
+ if (isRecord(value)) {
201
+ if (isSearchRuleLike(value)) {
202
+ return {
203
+ logic: "AND",
204
+ rules: [value]
205
+ };
206
+ }
207
+ if ("rules" in value || "conditions" in value || "logic" in value) {
208
+ const nextGroup = {
209
+ logic: value.logic === "OR" || value.logic === "AND" ? value.logic : "AND"
210
+ };
211
+ if (Array.isArray(value.rules)) {
212
+ nextGroup.rules = value.rules.filter(isSearchRuleLike);
213
+ }
214
+ if (Array.isArray(value.conditions)) {
215
+ nextGroup.conditions = value.conditions.map((item) => toSearchGroup(item)).filter((item) => Boolean(item));
216
+ }
217
+ if (!nextGroup.rules?.length && !nextGroup.conditions?.length) {
218
+ return void 0;
219
+ }
220
+ return nextGroup;
221
+ }
222
+ const rules = toLegacyRules(value);
223
+ if (rules.length === 0) {
224
+ return void 0;
225
+ }
226
+ return {
227
+ logic: "AND",
228
+ rules
229
+ };
230
+ }
231
+ return void 0;
232
+ };
233
+ var mergeSearchExpressions = (base, extra) => {
234
+ const baseGroup = toSearchGroup(base);
235
+ const extraGroup = toSearchGroup(extra);
236
+ if (!baseGroup) {
237
+ return extraGroup;
238
+ }
239
+ if (!extraGroup) {
240
+ return baseGroup;
241
+ }
242
+ return {
243
+ logic: "AND",
244
+ conditions: [baseGroup, extraGroup]
245
+ };
246
+ };
247
+ var serializeSearchExpression = (value) => {
248
+ if (value === void 0 || value === null || value === "") {
249
+ return void 0;
250
+ }
251
+ if (typeof value === "string") {
252
+ return value;
253
+ }
254
+ const group = toSearchGroup(value);
255
+ return group ? JSON.stringify(group) : void 0;
256
+ };
257
+ var normalizeAdvancedOrder = (value) => {
258
+ if (!value) {
259
+ return void 0;
260
+ }
261
+ const nextValue = Array.isArray(value) ? value : [value];
262
+ return JSON.stringify(nextValue);
263
+ };
264
+ var normalizeDynamicOrder = (value) => {
265
+ if (!value) {
266
+ return void 0;
267
+ }
268
+ if (typeof value === "string") {
269
+ return value;
270
+ }
271
+ return `${value.id}:${value.isAsc === "n" ? "-" : "+"}`;
272
+ };
273
+ var normalizeJsonResponse = (rawResponse) => {
274
+ const topLevelCode = Number(rawResponse?.code);
275
+ const nestedCode = Number(
276
+ rawResponse?.data?.code
277
+ );
278
+ const code = Number.isFinite(topLevelCode) ? topLevelCode : Number.isFinite(nestedCode) ? nestedCode : 200;
279
+ const topLevelResult = isRecord(rawResponse) && "result" in rawResponse ? rawResponse.result : void 0;
280
+ const nestedResult = isRecord(rawResponse?.data) && "result" in (rawResponse.data || {}) ? rawResponse.data?.result : void 0;
281
+ const topLevelData = isRecord(rawResponse) && "data" in rawResponse ? rawResponse.data : void 0;
282
+ const result = topLevelResult !== void 0 ? topLevelResult : nestedResult !== void 0 ? nestedResult : topLevelData !== void 0 ? topLevelData : isRecord(rawResponse) ? rawResponse : null;
283
+ const nestedSuccess = typeof rawResponse?.data?.success === "boolean" ? rawResponse.data?.success : void 0;
284
+ const success = typeof rawResponse?.success === "boolean" ? Boolean(rawResponse.success) : typeof nestedSuccess === "boolean" ? Boolean(nestedSuccess) : code >= 200 && code < 300;
285
+ return {
286
+ code,
287
+ success,
288
+ message: typeof rawResponse?.message === "string" ? rawResponse.message : typeof rawResponse?.data?.message === "string" ? rawResponse.data?.message : void 0,
289
+ result,
290
+ data: topLevelData !== void 0 ? topLevelData : topLevelResult !== void 0 ? topLevelResult : void 0,
291
+ raw: rawResponse
292
+ };
293
+ };
294
+ var normalizeBinaryResponse = (rawResponse) => {
295
+ if (isRecord(rawResponse) && isBlobLike(rawResponse.blob)) {
296
+ return rawResponse;
297
+ }
298
+ if (isBlobLike(rawResponse)) {
299
+ return {
300
+ blob: rawResponse,
301
+ raw: rawResponse
302
+ };
303
+ }
304
+ const responseData = rawResponse?.data;
305
+ const responseHeaders = isRecord(
306
+ rawResponse?.headers
307
+ ) ? rawResponse.headers : void 0;
308
+ if (!isBlobLike(responseData)) {
309
+ throw new Error("transport.download \u672A\u8FD4\u56DE Blob \u6570\u636E");
310
+ }
311
+ const contentDisposition = getHeaderValue(
312
+ responseHeaders,
313
+ "content-disposition"
314
+ );
315
+ return {
316
+ blob: responseData,
317
+ fileName: parseContentDispositionFileName(contentDisposition),
318
+ contentType: getHeaderValue(responseHeaders, "content-type") || responseData.type,
319
+ headers: responseHeaders ? Object.fromEntries(
320
+ Object.entries(responseHeaders).map(([key, value]) => [
321
+ key,
322
+ value === void 0 ? void 0 : String(value)
323
+ ])
324
+ ) : void 0,
325
+ raw: rawResponse
326
+ };
327
+ };
328
+ var toSdkError = (input, payload) => {
329
+ const normalizedResponse = isRecord(input) ? normalizeJsonResponse(input) : void 0;
330
+ const nextError = input instanceof Error ? input : new Error(
331
+ normalizedResponse?.message || `\u8BF7\u6C42\u5931\u8D25: ${String(payload.method).toUpperCase()} ${payload.path}`
332
+ );
333
+ const sdkError = nextError;
334
+ sdkError.method = String(payload.method).toUpperCase();
335
+ sdkError.path = payload.path;
336
+ sdkError.response = normalizedResponse;
337
+ sdkError.raw = input;
338
+ return sdkError;
339
+ };
340
+ var ensureSuccess = (response, payload) => {
341
+ if (!response.success) {
342
+ throw toSdkError(response, payload);
343
+ }
344
+ return response;
345
+ };
346
+ var resolveFormInstanceId = (params) => {
347
+ const formInstanceId = String(
348
+ params.formInstId || params.formInstanceId || ""
349
+ ).trim();
350
+ if (!formInstanceId) {
351
+ throw new Error("formInstanceId \u4E0D\u80FD\u4E3A\u7A7A");
352
+ }
353
+ return formInstanceId;
354
+ };
355
+ var withDefaultAppType = (context, params) => {
356
+ if (!params) {
357
+ return params;
358
+ }
359
+ if (params.appType) {
360
+ return params;
361
+ }
362
+ if (params.scope === "app") {
363
+ return {
364
+ ...params,
365
+ appType: context.app.appType
366
+ };
367
+ }
368
+ return params;
369
+ };
370
+ var createPageSdk = (context) => {
371
+ const request = async (options) => {
372
+ const payload = {
373
+ path: options.path,
374
+ method: normalizeMethod(options.method),
375
+ query: serializeQuery(options.query),
376
+ body: options.body,
377
+ headers: options.headers
378
+ };
379
+ try {
380
+ const rawResponse = await context.bridge.invoke(
381
+ "transport.request",
382
+ payload
383
+ );
384
+ return ensureSuccess(
385
+ normalizeJsonResponse(rawResponse),
386
+ payload
387
+ );
388
+ } catch (error) {
389
+ throw toSdkError(error, payload);
390
+ }
391
+ };
392
+ const download = async (options) => {
393
+ const payload = {
394
+ path: options.path,
395
+ method: normalizeMethod(options.method),
396
+ query: serializeQuery(options.query),
397
+ body: options.body,
398
+ headers: options.headers
399
+ };
400
+ try {
401
+ const rawResponse = await context.bridge.invoke(
402
+ "transport.download",
403
+ payload
404
+ );
405
+ return normalizeBinaryResponse(rawResponse);
406
+ } catch (error) {
407
+ throw toSdkError(error, payload);
408
+ }
409
+ };
410
+ const form = {
411
+ getDetail: (params) => request({
412
+ path: buildAppPath(
413
+ context,
414
+ params.appType,
415
+ "/v1/form/getFormDataById.json"
416
+ ),
417
+ method: "get",
418
+ query: {
419
+ formUuid: params.formUuid,
420
+ formInstId: resolveFormInstanceId(params)
421
+ }
422
+ }),
423
+ create: (params) => request({
424
+ path: buildAppPath(
425
+ context,
426
+ params.appType,
427
+ "/v1/form/saveFormData.json"
428
+ ),
429
+ method: "post",
430
+ body: {
431
+ formUuid: params.formUuid,
432
+ formDataJson: JSON.stringify(params.data || {})
433
+ }
434
+ }),
435
+ update: (params) => request({
436
+ path: buildAppPath(
437
+ context,
438
+ params.appType,
439
+ "/v1/form/updateFormData.json"
440
+ ),
441
+ method: "post",
442
+ body: {
443
+ formUuid: params.formUuid,
444
+ formInstId: resolveFormInstanceId(params),
445
+ updateFormDataJson: params.updateFormDataJson || JSON.stringify(params.data || {})
446
+ }
447
+ }),
448
+ remove: (params) => request({
449
+ path: buildAppPath(
450
+ context,
451
+ params.appType,
452
+ "/v1/form/deleteFormData.json"
453
+ ),
454
+ method: "post",
455
+ body: {
456
+ formUuid: params.formUuid,
457
+ formInstId: resolveFormInstanceId(params)
458
+ }
459
+ }),
460
+ getChangeRecords: (params) => request({
461
+ path: buildAppPath(
462
+ context,
463
+ params.appType,
464
+ "/v1/form/getFormDataChangeRecords.json"
465
+ ),
466
+ method: "get",
467
+ query: {
468
+ formUuid: params.formUuid,
469
+ formInstId: resolveFormInstanceId(params),
470
+ page: params.page,
471
+ pageSize: params.pageSize
472
+ }
473
+ }),
474
+ search: (params) => request({
475
+ path: buildAppPath(
476
+ context,
477
+ params.appType,
478
+ "/v1/form/searchFormDatas.json"
479
+ ),
480
+ method: "get",
481
+ query: {
482
+ formUuid: params.formUuid,
483
+ searchFieldJson: serializeSearchExpression(params.search),
484
+ currentPage: params.currentPage,
485
+ pageSize: params.pageSize,
486
+ originatorId: params.originatorId,
487
+ createFrom: params.createFrom,
488
+ createTo: params.createTo,
489
+ modifiedFrom: params.modifiedFrom,
490
+ modifiedTo: params.modifiedTo,
491
+ dynamicOrder: normalizeDynamicOrder(params.dynamicOrder),
492
+ instanceStatus: params.instanceStatus
493
+ }
494
+ }),
495
+ searchIds: (params) => request({
496
+ path: buildAppPath(
497
+ context,
498
+ params.appType,
499
+ "/v1/form/searchFormDataIds.json"
500
+ ),
501
+ method: "get",
502
+ query: {
503
+ formUuid: params.formUuid,
504
+ searchFieldJson: serializeSearchExpression(params.search),
505
+ currentPage: params.currentPage,
506
+ pageSize: params.pageSize,
507
+ originatorId: params.originatorId,
508
+ createFrom: params.createFrom,
509
+ createTo: params.createTo,
510
+ modifiedFrom: params.modifiedFrom,
511
+ modifiedTo: params.modifiedTo,
512
+ dynamicOrder: normalizeDynamicOrder(params.dynamicOrder),
513
+ instanceStatus: params.instanceStatus
514
+ }
515
+ }),
516
+ advancedSearch: (params) => request({
517
+ path: buildAppPath(
518
+ context,
519
+ params.appType,
520
+ "/v1/form/advancedSearch.json"
521
+ ),
522
+ method: "get",
523
+ query: {
524
+ formUuid: params.formUuid,
525
+ filters: serializeSearchExpression(params.filters),
526
+ conditionType: params.conditionType,
527
+ searchKeyWord: params.searchKeyWord,
528
+ currentPage: params.currentPage,
529
+ pageSize: params.pageSize,
530
+ order: normalizeAdvancedOrder(params.order),
531
+ instanceStatus: params.instanceStatus
532
+ }
533
+ }),
534
+ advancedExport: (params) => download({
535
+ path: buildAppPath(
536
+ context,
537
+ params.appType,
538
+ "/v1/form/advancedExport.xlsx"
539
+ ),
540
+ method: "get",
541
+ query: {
542
+ formUuid: params.formUuid,
543
+ filters: serializeSearchExpression(params.filters),
544
+ conditionType: params.conditionType,
545
+ searchKeyWord: params.searchKeyWord,
546
+ currentPage: params.currentPage,
547
+ pageSize: params.pageSize,
548
+ order: normalizeAdvancedOrder(params.order),
549
+ instanceStatus: params.instanceStatus,
550
+ exportAll: params.exportAll,
551
+ embedImages: params.embedImages,
552
+ exportFields: params.exportFields?.join(",")
553
+ }
554
+ }),
555
+ downloadImportTemplate: (params) => download({
556
+ path: buildAppPath(
557
+ context,
558
+ params.appType,
559
+ "/v1/form/advancedExportTemplate.xlsx"
560
+ ),
561
+ method: "get",
562
+ query: {
563
+ formUuid: params.formUuid
564
+ }
565
+ }),
566
+ importPreview: (params) => request({
567
+ path: buildAppPath(
568
+ context,
569
+ params.appType,
570
+ "/v1/form/importPreview.xlsx"
571
+ ),
572
+ method: "post",
573
+ body: {
574
+ formUuid: params.formUuid,
575
+ fileBase64: params.fileBase64,
576
+ fileName: params.fileName
577
+ }
578
+ }),
579
+ importExcel: (params) => request({
580
+ path: buildAppPath(context, params.appType, "/v1/form/import.xlsx"),
581
+ method: "post",
582
+ body: {
583
+ formUuid: params.formUuid,
584
+ fileBase64: params.fileBase64,
585
+ fileName: params.fileName
586
+ }
587
+ }),
588
+ getImportRecords: (params) => request({
589
+ path: buildAppPath(
590
+ context,
591
+ params.appType,
592
+ "/v1/form/importRecords.json"
593
+ ),
594
+ method: "get",
595
+ query: {
596
+ formUuid: params.formUuid,
597
+ currentPage: params.currentPage,
598
+ pageSize: params.pageSize
599
+ }
600
+ }),
601
+ getExportRecords: (params) => request({
602
+ path: buildAppPath(
603
+ context,
604
+ params.appType,
605
+ "/v1/form/exportRecords.json"
606
+ ),
607
+ method: "get",
608
+ query: {
609
+ formUuid: params.formUuid,
610
+ currentPage: params.currentPage,
611
+ pageSize: params.pageSize
612
+ }
613
+ }),
614
+ downloadImportSource: (params) => download({
615
+ path: buildAppPath(
616
+ context,
617
+ params.appType,
618
+ "/v1/form/importRecord/downloadSource.xlsx"
619
+ ),
620
+ method: "get",
621
+ query: {
622
+ recordId: params.recordId
623
+ }
624
+ }),
625
+ downloadImportFailed: (params) => download({
626
+ path: buildAppPath(
627
+ context,
628
+ params.appType,
629
+ "/v1/form/importRecord/downloadFailed.xlsx"
630
+ ),
631
+ method: "get",
632
+ query: {
633
+ recordId: params.recordId
634
+ }
635
+ }),
636
+ downloadExportRecord: (params) => download({
637
+ path: buildAppPath(
638
+ context,
639
+ params.appType,
640
+ "/v1/form/exportRecord/download.xlsx"
641
+ ),
642
+ method: "get",
643
+ query: {
644
+ recordId: params.recordId
645
+ }
646
+ }),
647
+ getDataManagementConfig: (params) => request({
648
+ path: buildAppPath(
649
+ context,
650
+ params.appType,
651
+ "/v1/form/dataManagement/config/get.json"
652
+ ),
653
+ method: "get",
654
+ query: {
655
+ formUuid: params.formUuid
656
+ }
657
+ }),
658
+ saveDataManagementConfig: (params) => request({
659
+ path: buildAppPath(
660
+ context,
661
+ params.appType,
662
+ "/v1/form/dataManagement/config/save.json"
663
+ ),
664
+ method: "post",
665
+ body: {
666
+ formUuid: params.formUuid,
667
+ config: params.config
668
+ }
669
+ })
670
+ };
671
+ const user = {
672
+ create: (params) => request({
673
+ path: "/user/create",
674
+ method: "post",
675
+ body: params
676
+ }),
677
+ update: (params) => request({
678
+ path: "/user/update",
679
+ method: "put",
680
+ body: params
681
+ }),
682
+ remove: (id) => request({
683
+ path: `/user/${encodePathSegment(id)}`,
684
+ method: "delete"
685
+ }),
686
+ get: (id = "current") => request({
687
+ path: `/user/${encodePathSegment(id)}`,
688
+ method: "get"
689
+ }),
690
+ getCurrent: () => request({
691
+ path: "/user/current",
692
+ method: "get"
693
+ }),
694
+ getByUsername: (username) => request({
695
+ path: `/user/username/${encodePathSegment(username)}`,
696
+ method: "get"
697
+ }),
698
+ list: (params) => request({
699
+ path: "/user/list",
700
+ method: "get",
701
+ query: {
702
+ ids: params?.ids,
703
+ departmentIds: params?.departmentIds,
704
+ name: params?.name,
705
+ username: params?.username,
706
+ phone: params?.phone,
707
+ email: params?.email,
708
+ page: params?.page,
709
+ pageSize: params?.pageSize
710
+ }
711
+ }),
712
+ search: (keyword) => request({
713
+ path: "/user/search",
714
+ method: "get",
715
+ query: {
716
+ keyword
717
+ }
718
+ }),
719
+ listAll: () => request({
720
+ path: "/user/all",
721
+ method: "get"
722
+ }),
723
+ listByDepartment: (departmentId) => request({
724
+ path: `/user/department/${encodePathSegment(departmentId)}`,
725
+ method: "get"
726
+ }),
727
+ validate: (params) => request({
728
+ path: "/user/validate",
729
+ method: "post",
730
+ body: params
731
+ })
732
+ };
733
+ const role = {
734
+ create: (params) => request({
735
+ path: "/role/",
736
+ method: "post",
737
+ body: params
738
+ }),
739
+ update: (id, params) => request({
740
+ path: `/role/${encodePathSegment(id)}`,
741
+ method: "put",
742
+ body: params
743
+ }),
744
+ remove: (id) => request({
745
+ path: `/role/${encodePathSegment(id)}`,
746
+ method: "delete"
747
+ }),
748
+ get: (id) => request({
749
+ path: `/role/${encodePathSegment(id)}`,
750
+ method: "get"
751
+ }),
752
+ list: (params) => request({
753
+ path: "/role/",
754
+ method: "get",
755
+ query: withDefaultAppType(context, params)
756
+ }),
757
+ listUsers: (roleId, params) => request({
758
+ path: `/role/${encodePathSegment(roleId)}/users`,
759
+ method: "get",
760
+ query: params
761
+ }),
762
+ assignRoles: (params) => request({
763
+ path: "/role/assign",
764
+ method: "post",
765
+ body: params
766
+ }),
767
+ addUserRole: (params) => request({
768
+ path: "/role/add",
769
+ method: "post",
770
+ body: params
771
+ }),
772
+ removeUserRole: (params) => request({
773
+ path: "/role/remove",
774
+ method: "post",
775
+ body: params
776
+ }),
777
+ batchAddUsers: (params) => request({
778
+ path: "/role/batch-add-users",
779
+ method: "post",
780
+ body: params
781
+ }),
782
+ getMyRoles: (params) => request({
783
+ path: "/role/my/roles",
784
+ method: "get",
785
+ query: withDefaultAppType(context, params)
786
+ }),
787
+ getCurrentRole: (params) => request({
788
+ path: "/role/my/current",
789
+ method: "get",
790
+ query: withDefaultAppType(context, params)
791
+ }),
792
+ switchPlatformRole: (params) => request({
793
+ path: "/role/switch/platform",
794
+ method: "post",
795
+ body: params
796
+ }),
797
+ switchAppRole: (params) => request({
798
+ path: "/role/switch/app",
799
+ method: "post",
800
+ body: {
801
+ ...params,
802
+ appType: resolveAppType(context, params.appType)
803
+ }
804
+ })
805
+ };
806
+ const permission = {
807
+ formGroup: {
808
+ create: (params) => request({
809
+ path: "/permission/form-group/",
810
+ method: "post",
811
+ body: {
812
+ ...params,
813
+ appType: resolveAppType(context, params.appType)
814
+ }
815
+ }),
816
+ update: (id, params) => request({
817
+ path: `/permission/form-group/${encodePathSegment(id)}`,
818
+ method: "put",
819
+ body: {
820
+ ...params,
821
+ ...params.appType ? { appType: resolveAppType(context, params.appType) } : {}
822
+ }
823
+ }),
824
+ remove: (id) => request({
825
+ path: `/permission/form-group/${encodePathSegment(id)}`,
826
+ method: "delete"
827
+ }),
828
+ get: (id) => request({
829
+ path: `/permission/form-group/${encodePathSegment(id)}`,
830
+ method: "get"
831
+ }),
832
+ list: (params) => request({
833
+ path: "/permission/form-group/",
834
+ method: "get",
835
+ query: {
836
+ ...params,
837
+ appType: resolveAppType(context, params?.appType)
838
+ }
839
+ }),
840
+ getViewFieldPermissions: (params) => request({
841
+ path: "/permission/form-group/field-permissions",
842
+ method: "get",
843
+ query: {
844
+ appType: resolveAppType(context, params.appType),
845
+ formUuid: params.formUuid
846
+ }
847
+ }),
848
+ getViewPermissionSummary: (params) => request({
849
+ path: "/permission/form-group/view-permissions",
850
+ method: "get",
851
+ query: {
852
+ appType: resolveAppType(context, params.appType),
853
+ formUuid: params.formUuid
854
+ }
855
+ })
856
+ },
857
+ pageGroup: {
858
+ create: (params) => request({
859
+ path: "/permission/page-group/",
860
+ method: "post",
861
+ body: {
862
+ ...params,
863
+ appType: resolveAppType(context, params.appType)
864
+ }
865
+ }),
866
+ update: (id, params) => request({
867
+ path: `/permission/page-group/${encodePathSegment(id)}`,
868
+ method: "put",
869
+ body: {
870
+ ...params,
871
+ ...params.appType ? { appType: resolveAppType(context, params.appType) } : {}
872
+ }
873
+ }),
874
+ remove: (id) => request({
875
+ path: `/permission/page-group/${encodePathSegment(id)}`,
876
+ method: "delete"
877
+ }),
878
+ get: (id) => request({
879
+ path: `/permission/page-group/${encodePathSegment(id)}`,
880
+ method: "get"
881
+ }),
882
+ list: (params) => request({
883
+ path: "/permission/page-group/",
884
+ method: "get",
885
+ query: {
886
+ ...params,
887
+ appType: resolveAppType(context, params?.appType)
888
+ }
889
+ }),
890
+ getUserMenuPermissions: (appType) => request({
891
+ path: "/permission/page-group/user-menu-permissions",
892
+ method: "get",
893
+ query: {
894
+ appType: resolveAppType(context, appType)
895
+ }
896
+ })
897
+ },
898
+ api: {
899
+ create: (params) => request({
900
+ path: "/permission/api",
901
+ method: "post",
902
+ body: params
903
+ }),
904
+ update: (id, params) => request({
905
+ path: `/permission/api/${encodePathSegment(id)}`,
906
+ method: "put",
907
+ body: params
908
+ }),
909
+ remove: (id) => request({
910
+ path: `/permission/api/${encodePathSegment(id)}`,
911
+ method: "delete"
912
+ }),
913
+ list: (params) => request({
914
+ path: "/permission/api",
915
+ method: "get",
916
+ query: withDefaultAppType(context, params)
917
+ }),
918
+ assign: (params) => request({
919
+ path: "/permission/api/assign",
920
+ method: "post",
921
+ body: params
922
+ }),
923
+ getByRole: (roleId) => request({
924
+ path: `/permission/api/role/${encodePathSegment(roleId)}`,
925
+ method: "get"
926
+ }),
927
+ getRolesByPermission: (permissionId) => request({
928
+ path: `/permission/api/${encodePathSegment(permissionId)}/roles`,
929
+ method: "get"
930
+ })
931
+ },
932
+ ui: {
933
+ create: (params) => request({
934
+ path: "/permission/api/ui",
935
+ method: "post",
936
+ body: params
937
+ }),
938
+ update: (id, params) => request({
939
+ path: `/permission/api/ui/${encodePathSegment(id)}`,
940
+ method: "put",
941
+ body: params
942
+ }),
943
+ remove: (id) => request({
944
+ path: `/permission/api/ui/${encodePathSegment(id)}`,
945
+ method: "delete"
946
+ }),
947
+ list: (params) => request({
948
+ path: "/permission/api/ui",
949
+ method: "get",
950
+ query: withDefaultAppType(context, params)
951
+ }),
952
+ assign: (params) => request({
953
+ path: "/permission/api/ui/assign",
954
+ method: "post",
955
+ body: params
956
+ }),
957
+ getMyPlatform: () => request({
958
+ path: "/permission/api/ui/me/platform",
959
+ method: "get"
960
+ }),
961
+ getMyApp: (appType) => request({
962
+ path: "/permission/api/ui/me/app",
963
+ method: "get",
964
+ query: {
965
+ appType: resolveAppType(context, appType)
966
+ }
967
+ })
968
+ }
969
+ };
970
+ const process = {
971
+ getInstance: (params) => request({
972
+ path: buildAppPath(context, params.appType, "/v1/process/instance"),
973
+ method: "get",
974
+ query: {
975
+ instanceId: params.instanceId
976
+ }
977
+ }),
978
+ terminateInstance: (params) => request({
979
+ path: buildAppPath(
980
+ context,
981
+ params.appType,
982
+ "/v1/process/terminateInstance.json"
983
+ ),
984
+ method: "post",
985
+ body: {
986
+ processInstanceId: params.processInstanceId,
987
+ reason: params.reason
988
+ }
989
+ }),
990
+ approveTask: (params) => request({
991
+ path: buildAppPath(
992
+ context,
993
+ params.appType,
994
+ "/v1/process/approveTask.json"
995
+ ),
996
+ method: "post",
997
+ body: {
998
+ ...params,
999
+ appType: resolveAppType(context, params.appType)
1000
+ }
1001
+ }),
1002
+ triggerCallbackTask: (params) => request({
1003
+ path: buildAppPath(
1004
+ context,
1005
+ params.appType,
1006
+ "/v1/process/triggerCallback.json"
1007
+ ),
1008
+ method: "post",
1009
+ body: {
1010
+ taskId: params.taskId,
1011
+ payload: params.payload
1012
+ }
1013
+ })
1014
+ };
1015
+ const notification = {
1016
+ sendByType: (params) => request({
1017
+ path: "/api/notification-config/send-by-type",
1018
+ method: "post",
1019
+ body: {
1020
+ ...params,
1021
+ appType: resolveAppType(context, params.appType)
1022
+ }
1023
+ }),
1024
+ batchSendByType: (params) => request({
1025
+ path: "/api/notification-config/batch-send-by-type",
1026
+ method: "post",
1027
+ body: {
1028
+ ...params,
1029
+ appType: resolveAppType(context, params.appType)
1030
+ }
1031
+ })
1032
+ };
1033
+ const sdk = {
1034
+ context,
1035
+ request,
1036
+ download,
1037
+ transport: {
1038
+ request,
1039
+ download
1040
+ },
1041
+ form,
1042
+ user,
1043
+ role,
1044
+ permission,
1045
+ process,
1046
+ notification,
1047
+ dataSource: {
1048
+ run: async (name, params = {}) => {
1049
+ const descriptor = (context.page.dataSources || []).find(
1050
+ (item) => item.key === name
1051
+ );
1052
+ if (!descriptor) {
1053
+ throw new Error(`\u672A\u627E\u5230\u6570\u636E\u6E90: ${String(name || "")}`);
1054
+ }
1055
+ const runtimeParams = params;
1056
+ const resolvedFormUuid = String(
1057
+ runtimeParams.formUuid || descriptor.formUuid || ""
1058
+ ).trim();
1059
+ switch (descriptor.type) {
1060
+ case "form.list":
1061
+ return form.advancedSearch({
1062
+ ...runtimeParams,
1063
+ formUuid: resolvedFormUuid,
1064
+ filters: mergeSearchExpressions(
1065
+ descriptor.defaultFilter,
1066
+ runtimeParams.filters
1067
+ )
1068
+ });
1069
+ case "form.detail":
1070
+ return form.getDetail({
1071
+ ...runtimeParams,
1072
+ formUuid: resolvedFormUuid
1073
+ });
1074
+ case "form.create":
1075
+ return form.create({
1076
+ ...runtimeParams,
1077
+ formUuid: resolvedFormUuid
1078
+ });
1079
+ case "form.update":
1080
+ return form.update({
1081
+ ...runtimeParams,
1082
+ formUuid: resolvedFormUuid
1083
+ });
1084
+ case "form.delete":
1085
+ return form.remove({
1086
+ ...runtimeParams,
1087
+ formUuid: resolvedFormUuid
1088
+ });
1089
+ default:
1090
+ throw new Error(`\u6682\u4E0D\u652F\u6301\u7684\u6570\u636E\u6E90\u7C7B\u578B: ${String(descriptor.type)}`);
1091
+ }
1092
+ }
1093
+ },
1094
+ navigation: context.navigation,
1095
+ ui: context.ui
1096
+ };
1097
+ return sdk;
1098
+ };
1099
+
1100
+ // src/react/provider.tsx
1101
+ var import_jsx_runtime = require("react/jsx-runtime");
1102
+ var PageProvider = ({
1103
+ context,
1104
+ children
1105
+ }) => {
1106
+ const value = (0, import_react2.useMemo)(
1107
+ () => ({
1108
+ context,
1109
+ sdk: createPageSdk(context)
1110
+ }),
1111
+ [context]
1112
+ );
1113
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReactPageContext.Provider, { value, children });
1114
+ };
1115
+
1116
+ // src/react/createReactPage.tsx
1117
+ var import_jsx_runtime2 = require("react/jsx-runtime");
1118
+ var createRuntimeRoot = (el) => {
1119
+ return (0, import_client2.createRoot)(el);
1120
+ };
1121
+ var getStyleContainer = (el) => {
1122
+ const rootNode = el.getRootNode?.();
1123
+ if (typeof ShadowRoot !== "undefined" && rootNode instanceof ShadowRoot) {
1124
+ return rootNode;
1125
+ }
1126
+ return document.head;
1127
+ };
1128
+ var createReactPage = (AppComponent) => {
1129
+ let root = null;
1130
+ let currentContainer = null;
1131
+ const render = (el, context) => {
1132
+ if (!root || currentContainer !== el) {
1133
+ root?.unmount();
1134
+ root = createRuntimeRoot(el);
1135
+ currentContainer = el;
1136
+ }
1137
+ root.render(
1138
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_cssinjs.StyleProvider, { layer: true, container: getStyleContainer(el), children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_antd.ConfigProvider, { locale: import_zh_CN.default, theme: { cssVar: {} }, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_antd.App, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PageProvider, { context, children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AppComponent, {}) }) }) }) })
1139
+ );
1140
+ };
1141
+ return {
1142
+ mount: (el, context) => {
1143
+ render(el, context);
1144
+ },
1145
+ update: (el, context) => {
1146
+ render(el, context);
1147
+ },
1148
+ unmount: () => {
1149
+ root?.unmount();
1150
+ root = null;
1151
+ currentContainer = null;
1152
+ }
1153
+ };
1154
+ };
1155
+
1156
+ // src/react/hooks/useCurrentUser.ts
1157
+ var import_react3 = require("react");
1158
+
1159
+ // src/react/hooks/usePageContext.ts
1160
+ var usePageContext = () => {
1161
+ return usePageSdkStore().context;
1162
+ };
1163
+
1164
+ // src/react/hooks/useCurrentUser.ts
1165
+ var useCurrentUser = () => {
1166
+ const { user } = usePageContext();
1167
+ return (0, import_react3.useMemo)(() => {
1168
+ const userType = user.userType === "guest" || user.isGuest ? "guest" : "normal";
1169
+ const isGuest = userType === "guest";
1170
+ return {
1171
+ user: {
1172
+ ...user,
1173
+ isGuest,
1174
+ userType
1175
+ },
1176
+ isGuest,
1177
+ isInternalUser: !isGuest,
1178
+ displayName: user.name || user.username || user.id,
1179
+ primaryDepartment: user.departments?.[0] || null
1180
+ };
1181
+ }, [user]);
1182
+ };
1183
+
1184
+ // src/react/hooks/useDataSource.ts
1185
+ var import_react4 = require("react");
1186
+
1187
+ // src/react/hooks/usePageSdk.ts
1188
+ var usePageSdk = () => {
1189
+ return usePageSdkStore().sdk;
1190
+ };
1191
+
1192
+ // src/react/hooks/useDataSource.ts
1193
+ var createParamsSignature = (value) => {
1194
+ try {
1195
+ return JSON.stringify(value || {});
1196
+ } catch {
1197
+ return "";
1198
+ }
1199
+ };
1200
+ var useDataSource = (name, options = {}) => {
1201
+ const sdk = usePageSdk();
1202
+ const { params, immediate = true, transform } = options;
1203
+ const paramsRef = (0, import_react4.useRef)(params);
1204
+ const transformRef = (0, import_react4.useRef)(transform);
1205
+ const paramsSignature = createParamsSignature(params);
1206
+ const [response, setResponse] = (0, import_react4.useState)(
1207
+ null
1208
+ );
1209
+ const [result, setResult] = (0, import_react4.useState)(null);
1210
+ const [data, setData] = (0, import_react4.useState)(null);
1211
+ const [loading, setLoading] = (0, import_react4.useState)(false);
1212
+ const [error, setError] = (0, import_react4.useState)(null);
1213
+ paramsRef.current = params;
1214
+ transformRef.current = transform;
1215
+ const run = (0, import_react4.useCallback)(
1216
+ async (overrideParams) => {
1217
+ setLoading(true);
1218
+ setError(null);
1219
+ try {
1220
+ const response2 = await sdk.dataSource.run(
1221
+ name,
1222
+ overrideParams || paramsRef.current || {}
1223
+ );
1224
+ setResponse(response2);
1225
+ setResult(response2.result);
1226
+ const activeTransform = transformRef.current;
1227
+ const nextData = activeTransform ? activeTransform(response2.result, response2) : response2.result ?? null;
1228
+ setData(nextData);
1229
+ return response2;
1230
+ } catch (runtimeError) {
1231
+ const nextError = runtimeError instanceof Error ? runtimeError : new Error(String(runtimeError));
1232
+ setError(nextError);
1233
+ setResponse(null);
1234
+ setResult(null);
1235
+ return null;
1236
+ } finally {
1237
+ setLoading(false);
1238
+ }
1239
+ },
1240
+ [name, sdk.dataSource]
1241
+ );
1242
+ (0, import_react4.useEffect)(() => {
1243
+ if (!immediate) {
1244
+ return;
1245
+ }
1246
+ void run();
1247
+ }, [immediate, paramsSignature, run]);
1248
+ return {
1249
+ response,
1250
+ result,
1251
+ data,
1252
+ loading,
1253
+ error,
1254
+ refresh: run,
1255
+ run,
1256
+ setResponse,
1257
+ setResult,
1258
+ setData
1259
+ };
1260
+ };
1261
+
1262
+ // src/react/hooks/useFormViewPermissions.ts
1263
+ var import_react5 = require("react");
1264
+ var EMPTY_SUMMARY = {
1265
+ fieldPermissions: {},
1266
+ operations: []
1267
+ };
1268
+ var toError = (error) => {
1269
+ if (error instanceof Error) {
1270
+ return error;
1271
+ }
1272
+ if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
1273
+ return new Error(error.message);
1274
+ }
1275
+ return new Error(String(error || "\u83B7\u53D6\u67E5\u770B\u6001\u6743\u9650\u5931\u8D25"));
1276
+ };
1277
+ var useFormViewPermissions = (formUuid, options = {}) => {
1278
+ const sdk = usePageSdk();
1279
+ const [summary, setSummary] = (0, import_react5.useState)(EMPTY_SUMMARY);
1280
+ const [response, setResponse] = (0, import_react5.useState)(null);
1281
+ const [loading, setLoading] = (0, import_react5.useState)(false);
1282
+ const [error, setError] = (0, import_react5.useState)(null);
1283
+ const immediate = options.immediate ?? true;
1284
+ const refresh = (0, import_react5.useCallback)(async () => {
1285
+ const normalizedFormUuid = String(formUuid || "").trim();
1286
+ if (!normalizedFormUuid) {
1287
+ setSummary(EMPTY_SUMMARY);
1288
+ setResponse(null);
1289
+ return null;
1290
+ }
1291
+ setLoading(true);
1292
+ setError(null);
1293
+ try {
1294
+ const nextResponse = await sdk.permission.formGroup.getViewPermissionSummary({
1295
+ appType: options.appType,
1296
+ formUuid: normalizedFormUuid
1297
+ });
1298
+ const nextSummary = nextResponse.result || EMPTY_SUMMARY;
1299
+ setResponse(nextResponse);
1300
+ setSummary({
1301
+ fieldPermissions: nextSummary.fieldPermissions || {},
1302
+ operations: nextSummary.operations || []
1303
+ });
1304
+ return nextResponse;
1305
+ } catch (requestError) {
1306
+ const nextError = toError(requestError);
1307
+ setError(nextError);
1308
+ setResponse(null);
1309
+ setSummary(EMPTY_SUMMARY);
1310
+ return null;
1311
+ } finally {
1312
+ setLoading(false);
1313
+ }
1314
+ }, [formUuid, options.appType, sdk]);
1315
+ (0, import_react5.useEffect)(() => {
1316
+ if (!immediate) {
1317
+ return;
1318
+ }
1319
+ void refresh();
1320
+ }, [immediate, refresh]);
1321
+ const operationSet = (0, import_react5.useMemo)(
1322
+ () => new Set(summary.operations),
1323
+ [summary.operations]
1324
+ );
1325
+ const can = (0, import_react5.useCallback)(
1326
+ (operation) => operationSet.has(operation),
1327
+ [operationSet]
1328
+ );
1329
+ const getFieldPermission = (0, import_react5.useCallback)(
1330
+ (fieldName) => summary.fieldPermissions[fieldName] || null,
1331
+ [summary.fieldPermissions]
1332
+ );
1333
+ return {
1334
+ summary,
1335
+ response,
1336
+ loading,
1337
+ error,
1338
+ refresh,
1339
+ can,
1340
+ getFieldPermission
1341
+ };
1342
+ };
1343
+
1344
+ // src/react/hooks/useMessage.ts
1345
+ var useMessage = () => {
1346
+ return usePageContext().ui.message;
1347
+ };
1348
+
1349
+ // src/react/hooks/useModal.ts
1350
+ var useModal = () => {
1351
+ return usePageContext().ui.modal;
1352
+ };
1353
+
1354
+ // src/react/hooks/useNavigation.ts
1355
+ var useNavigation = () => {
1356
+ return usePageContext().navigation;
1357
+ };
1358
+
1359
+ // src/react/hooks/usePageProps.ts
1360
+ var usePageProps = () => {
1361
+ return usePageContext().page.props;
1362
+ };
1363
+
1364
+ // src/react/hooks/usePageRoute.ts
1365
+ var usePageRoute = () => {
1366
+ return usePageContext().route;
1367
+ };
1368
+ // Annotate the CommonJS export names for ESM import in node:
1369
+ 0 && (module.exports = {
1370
+ PageProvider,
1371
+ createPageSdk,
1372
+ createReactPage,
1373
+ useCurrentUser,
1374
+ useDataSource,
1375
+ useFormViewPermissions,
1376
+ useMessage,
1377
+ useModal,
1378
+ useNavigation,
1379
+ usePageContext,
1380
+ usePageProps,
1381
+ usePageRoute,
1382
+ usePageSdk
1383
+ });