@nocobase/flow-engine 2.3.0-alpha.1 → 2.3.0-beta.2
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/lib/acl/Acl.d.ts +2 -1
- package/lib/acl/Acl.js +28 -0
- package/lib/components/FlowContextSelector.js +7 -1
- package/lib/components/MobilePopup.js +14 -3
- package/lib/components/subModel/LazyDropdown.js +62 -33
- package/lib/flowContext.d.ts +12 -1
- package/lib/flowContext.js +47 -6
- package/lib/locale/en-US.json +2 -0
- package/lib/locale/index.d.ts +4 -0
- package/lib/locale/zh-CN.json +2 -0
- package/lib/resources/flowResource.js +1 -0
- package/lib/utils/associationObjectVariable.d.ts +10 -0
- package/lib/utils/associationObjectVariable.js +10 -7
- package/lib/utils/dateVariable.d.ts +22 -0
- package/lib/utils/dateVariable.js +123 -16
- package/lib/utils/dirtyAwareApiClient.d.ts +1 -0
- package/lib/utils/dirtyAwareApiClient.js +15 -2
- package/lib/utils/index.d.ts +3 -3
- package/lib/utils/index.js +8 -0
- package/lib/utils/params-resolvers.d.ts +3 -0
- package/lib/utils/params-resolvers.js +10 -0
- package/lib/utils/variablesParams.js +5 -0
- package/lib/views/createViewMeta.d.ts +1 -0
- package/lib/views/createViewMeta.js +53 -22
- package/package.json +4 -4
- package/src/__tests__/createViewMeta.popup.test.ts +84 -1
- package/src/__tests__/flowContext.test.ts +8 -0
- package/src/__tests__/objectVariable.test.ts +6 -1
- package/src/__tests__/runjsFormSubmit.test.ts +138 -0
- package/src/acl/Acl.tsx +36 -1
- package/src/acl/__tests__/Acl.test.tsx +70 -0
- package/src/components/FlowContextSelector.tsx +7 -1
- package/src/components/MobilePopup.tsx +16 -4
- package/src/components/__tests__/MobilePopup.test.tsx +42 -1
- package/src/components/subModel/LazyDropdown.tsx +71 -38
- package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +85 -2
- package/src/components/subModel/__tests__/LazyDropdown.test.tsx +202 -0
- package/src/components/variables/__tests__/FlowContextSelector.test.tsx +35 -0
- package/src/flowContext.ts +79 -6
- package/src/locale/__tests__/index.test.ts +21 -0
- package/src/locale/en-US.json +2 -0
- package/src/locale/zh-CN.json +2 -0
- package/src/resources/__tests__/flowResource.test.ts +3 -0
- package/src/resources/flowResource.ts +1 -0
- package/src/utils/__tests__/dateVariable.test.ts +57 -4
- package/src/utils/__tests__/variablesParams.test.ts +28 -1
- package/src/utils/associationObjectVariable.ts +9 -6
- package/src/utils/dateVariable.ts +145 -18
- package/src/utils/dirtyAwareApiClient.ts +25 -2
- package/src/utils/index.ts +17 -2
- package/src/utils/params-resolvers.ts +12 -0
- package/src/utils/variablesParams.ts +10 -0
- package/src/views/createViewMeta.ts +52 -18
|
@@ -38,7 +38,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
38
38
|
var associationObjectVariable_exports = {};
|
|
39
39
|
__export(associationObjectVariable_exports, {
|
|
40
40
|
createAssociationAwareObjectMetaFactory: () => createAssociationAwareObjectMetaFactory,
|
|
41
|
-
createAssociationSubpathResolver: () => createAssociationSubpathResolver
|
|
41
|
+
createAssociationSubpathResolver: () => createAssociationSubpathResolver,
|
|
42
|
+
getAssociationFilterByTk: () => getAssociationFilterByTk
|
|
42
43
|
});
|
|
43
44
|
module.exports = __toCommonJS(associationObjectVariable_exports);
|
|
44
45
|
var import_lodash = __toESM(require("lodash"));
|
|
@@ -58,13 +59,14 @@ function findFieldByName(collection, name) {
|
|
|
58
59
|
return fields.find((f) => f.name === name);
|
|
59
60
|
}
|
|
60
61
|
__name(findFieldByName, "findFieldByName");
|
|
61
|
-
function
|
|
62
|
+
function getAssociationFilterByTk(value, primaryKey) {
|
|
62
63
|
if (value == null) return void 0;
|
|
63
64
|
if (Array.isArray(primaryKey)) {
|
|
64
65
|
if (typeof value !== "object" || !value) return void 0;
|
|
66
|
+
const record = value;
|
|
65
67
|
const out = {};
|
|
66
68
|
for (const k of primaryKey) {
|
|
67
|
-
const v =
|
|
69
|
+
const v = record[k];
|
|
68
70
|
if (typeof v === "undefined" || v === null) return void 0;
|
|
69
71
|
out[k] = v;
|
|
70
72
|
}
|
|
@@ -76,7 +78,7 @@ function toFilterByTk(value, primaryKey) {
|
|
|
76
78
|
}
|
|
77
79
|
return void 0;
|
|
78
80
|
}
|
|
79
|
-
__name(
|
|
81
|
+
__name(getAssociationFilterByTk, "getAssociationFilterByTk");
|
|
80
82
|
function createAssociationSubpathResolver(collectionAccessor, valueAccessor) {
|
|
81
83
|
return (p) => {
|
|
82
84
|
if (!p || !p.includes(".")) return false;
|
|
@@ -122,7 +124,7 @@ function createAssociationAwareObjectMetaFactory(collectionAccessor, title, valu
|
|
|
122
124
|
const associationValue = obj[name];
|
|
123
125
|
if (associationValue == null) continue;
|
|
124
126
|
if (Array.isArray(associationValue)) {
|
|
125
|
-
const ids = associationValue.map((item) =>
|
|
127
|
+
const ids = associationValue.map((item) => getAssociationFilterByTk(item, primaryKey)).filter((v) => v != null);
|
|
126
128
|
if (ids.length) {
|
|
127
129
|
params[name] = {
|
|
128
130
|
collection: target,
|
|
@@ -131,7 +133,7 @@ function createAssociationAwareObjectMetaFactory(collectionAccessor, title, valu
|
|
|
131
133
|
};
|
|
132
134
|
}
|
|
133
135
|
} else {
|
|
134
|
-
const id =
|
|
136
|
+
const id = getAssociationFilterByTk(associationValue, primaryKey);
|
|
135
137
|
if (id != null) {
|
|
136
138
|
params[name] = {
|
|
137
139
|
collection: target,
|
|
@@ -153,5 +155,6 @@ __name(createAssociationAwareObjectMetaFactory, "createAssociationAwareObjectMet
|
|
|
153
155
|
// Annotate the CommonJS export names for ESM import in node:
|
|
154
156
|
0 && (module.exports = {
|
|
155
157
|
createAssociationAwareObjectMetaFactory,
|
|
156
|
-
createAssociationSubpathResolver
|
|
158
|
+
createAssociationSubpathResolver,
|
|
159
|
+
getAssociationFilterByTk
|
|
157
160
|
});
|
|
@@ -6,11 +6,33 @@
|
|
|
6
6
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
|
7
7
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
|
8
8
|
*/
|
|
9
|
+
declare const PRESET_KEY_LIST: readonly ["today", "now", "yesterday", "tomorrow", "thisWeek", "lastWeek", "nextWeek", "thisMonth", "lastMonth", "nextMonth", "thisQuarter", "lastQuarter", "nextQuarter", "thisYear", "lastYear", "nextYear"];
|
|
10
|
+
export type CtxDatePreset = (typeof PRESET_KEY_LIST)[number];
|
|
11
|
+
export type CtxDateRelativeDirection = 'next' | 'past';
|
|
12
|
+
export type CtxDateRelativeUnit = 'day' | 'week' | 'month' | 'year';
|
|
13
|
+
export type CtxDateExpressionConfig = {
|
|
14
|
+
kind: 'exact';
|
|
15
|
+
value: string | [string, string];
|
|
16
|
+
format?: string;
|
|
17
|
+
} | {
|
|
18
|
+
kind: 'relative';
|
|
19
|
+
direction: CtxDateRelativeDirection;
|
|
20
|
+
amount: number;
|
|
21
|
+
unit: CtxDateRelativeUnit;
|
|
22
|
+
format?: string;
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'preset';
|
|
25
|
+
preset: CtxDatePreset;
|
|
26
|
+
format?: string;
|
|
27
|
+
};
|
|
9
28
|
export declare function isCtxDatePathPrefix(pathSegments: string[]): boolean;
|
|
10
29
|
export declare function encodeBase64Url(input: string): string;
|
|
11
30
|
export declare function decodeBase64Url(input: string): string | undefined;
|
|
12
31
|
export declare function isCtxDateExpression(value: unknown): value is string;
|
|
13
32
|
export declare function isCompleteCtxDatePath(pathSegments: string[]): boolean;
|
|
14
33
|
export declare function parseCtxDateExpression(value: unknown): any;
|
|
34
|
+
export declare function parseCtxDateExpressionConfig(value: unknown): CtxDateExpressionConfig | undefined;
|
|
35
|
+
export declare function serializeCtxDateExpressionConfig(config: CtxDateExpressionConfig): string | undefined;
|
|
15
36
|
export declare function serializeCtxDateValue(value: unknown): string | undefined;
|
|
16
37
|
export declare function resolveCtxDatePath(pathSegments: string[]): any;
|
|
38
|
+
export {};
|
|
@@ -43,13 +43,15 @@ __export(dateVariable_exports, {
|
|
|
43
43
|
isCtxDateExpression: () => isCtxDateExpression,
|
|
44
44
|
isCtxDatePathPrefix: () => isCtxDatePathPrefix,
|
|
45
45
|
parseCtxDateExpression: () => parseCtxDateExpression,
|
|
46
|
+
parseCtxDateExpressionConfig: () => parseCtxDateExpressionConfig,
|
|
46
47
|
resolveCtxDatePath: () => resolveCtxDatePath,
|
|
48
|
+
serializeCtxDateExpressionConfig: () => serializeCtxDateExpressionConfig,
|
|
47
49
|
serializeCtxDateValue: () => serializeCtxDateValue
|
|
48
50
|
});
|
|
49
51
|
module.exports = __toCommonJS(dateVariable_exports);
|
|
50
52
|
var import_dayjs = __toESM(require("dayjs"));
|
|
51
53
|
const CTX_DATE_REGEX = /^\{\{\s*ctx\.date(?:\.(.+?))?\s*\}\}$/;
|
|
52
|
-
const
|
|
54
|
+
const PRESET_KEY_LIST = [
|
|
53
55
|
"today",
|
|
54
56
|
"now",
|
|
55
57
|
"yesterday",
|
|
@@ -66,9 +68,11 @@ const PRESET_KEYS = /* @__PURE__ */ new Set([
|
|
|
66
68
|
"thisYear",
|
|
67
69
|
"lastYear",
|
|
68
70
|
"nextYear"
|
|
69
|
-
]
|
|
71
|
+
];
|
|
72
|
+
const PRESET_KEYS = new Set(PRESET_KEY_LIST);
|
|
70
73
|
const RELATIVE_DIRECTIONS = /* @__PURE__ */ new Set(["next", "past"]);
|
|
71
74
|
const RELATIVE_UNITS = /* @__PURE__ */ new Set(["day", "week", "month", "year"]);
|
|
75
|
+
const MAX_DATE_FORMAT_LENGTH = 128;
|
|
72
76
|
function parseCtxDateSegments(value) {
|
|
73
77
|
if (typeof value !== "string") return null;
|
|
74
78
|
const trimmed = value.trim();
|
|
@@ -79,8 +83,7 @@ function parseCtxDateSegments(value) {
|
|
|
79
83
|
return rawPath.split(".").map((seg) => seg.trim()).filter(Boolean);
|
|
80
84
|
}
|
|
81
85
|
__name(parseCtxDateSegments, "parseCtxDateSegments");
|
|
82
|
-
function
|
|
83
|
-
const segments = withDatePrefix((pathSegments || []).map((seg) => String(seg)));
|
|
86
|
+
function isBaseCtxDatePathPrefix(segments) {
|
|
84
87
|
if (segments[0] !== "date") return false;
|
|
85
88
|
if (segments.length === 1) return true;
|
|
86
89
|
if (segments[1] === "preset") {
|
|
@@ -117,6 +120,34 @@ function isCtxDatePathPrefix(pathSegments) {
|
|
|
117
120
|
}
|
|
118
121
|
return false;
|
|
119
122
|
}
|
|
123
|
+
__name(isBaseCtxDatePathPrefix, "isBaseCtxDatePathPrefix");
|
|
124
|
+
function decodeFormatToken(token) {
|
|
125
|
+
const raw = String(token || "");
|
|
126
|
+
if (!raw.startsWith("v")) return void 0;
|
|
127
|
+
const decoded = decodeBase64Url(raw.slice(1));
|
|
128
|
+
if (!decoded || decoded.length > MAX_DATE_FORMAT_LENGTH) return void 0;
|
|
129
|
+
return decoded;
|
|
130
|
+
}
|
|
131
|
+
__name(decodeFormatToken, "decodeFormatToken");
|
|
132
|
+
function splitFormattedDateSegments(segments) {
|
|
133
|
+
if (segments[0] !== "date") return null;
|
|
134
|
+
if (segments[1] !== "format") return { baseSegments: segments };
|
|
135
|
+
if (segments.length < 4) return null;
|
|
136
|
+
const format = decodeFormatToken(segments[2]);
|
|
137
|
+
if (!format) return null;
|
|
138
|
+
return { baseSegments: ["date", ...segments.slice(3)], format };
|
|
139
|
+
}
|
|
140
|
+
__name(splitFormattedDateSegments, "splitFormattedDateSegments");
|
|
141
|
+
function isCtxDatePathPrefix(pathSegments) {
|
|
142
|
+
const segments = withDatePrefix((pathSegments || []).map((seg) => String(seg)));
|
|
143
|
+
if (segments[0] !== "date") return false;
|
|
144
|
+
if (segments.length === 1) return true;
|
|
145
|
+
if (segments[1] !== "format") return isBaseCtxDatePathPrefix(segments);
|
|
146
|
+
if (segments.length === 2) return true;
|
|
147
|
+
if (segments.length === 3) return typeof decodeFormatToken(segments[2]) === "string";
|
|
148
|
+
const formatted = splitFormattedDateSegments(segments);
|
|
149
|
+
return formatted ? isBaseCtxDatePathPrefix(formatted.baseSegments) : false;
|
|
150
|
+
}
|
|
120
151
|
__name(isCtxDatePathPrefix, "isCtxDatePathPrefix");
|
|
121
152
|
function withDatePrefix(pathSegments) {
|
|
122
153
|
if (pathSegments[0] === "date") {
|
|
@@ -225,26 +256,31 @@ __name(isCtxDateExpression, "isCtxDateExpression");
|
|
|
225
256
|
function isCompleteCtxDatePath(pathSegments) {
|
|
226
257
|
if (!isCtxDatePathPrefix(pathSegments)) return false;
|
|
227
258
|
const segments = withDatePrefix((pathSegments || []).map((seg) => String(seg)));
|
|
228
|
-
|
|
229
|
-
if (
|
|
230
|
-
|
|
259
|
+
const formatted = splitFormattedDateSegments(segments);
|
|
260
|
+
if (!formatted) return false;
|
|
261
|
+
const baseSegments = formatted.baseSegments;
|
|
262
|
+
if (baseSegments[1] === "preset") {
|
|
263
|
+
return baseSegments.length === 3 && PRESET_KEYS.has(baseSegments[2]);
|
|
231
264
|
}
|
|
232
|
-
if (
|
|
233
|
-
if (
|
|
234
|
-
return RELATIVE_DIRECTIONS.has(
|
|
265
|
+
if (baseSegments[1] === "relative") {
|
|
266
|
+
if (baseSegments.length !== 5) return false;
|
|
267
|
+
return RELATIVE_DIRECTIONS.has(baseSegments[2]) && RELATIVE_UNITS.has(baseSegments[3]) && typeof parseNumberToken(baseSegments[4]) === "number";
|
|
235
268
|
}
|
|
236
|
-
if (
|
|
237
|
-
return
|
|
269
|
+
if (baseSegments[1] === "exact" && baseSegments[2] === "single" && baseSegments[3] === "date") {
|
|
270
|
+
return baseSegments.length === 5 && /^v.+/.test(baseSegments[4]);
|
|
238
271
|
}
|
|
239
|
-
if (
|
|
240
|
-
return
|
|
272
|
+
if (baseSegments[1] === "exact" && baseSegments[2] === "range" && baseSegments[3] === "date") {
|
|
273
|
+
return baseSegments.length === 6 && /^v.+/.test(baseSegments[4]) && /^v.+/.test(baseSegments[5]);
|
|
241
274
|
}
|
|
242
275
|
return false;
|
|
243
276
|
}
|
|
244
277
|
__name(isCompleteCtxDatePath, "isCompleteCtxDatePath");
|
|
245
278
|
function parseCtxDateExpression(value) {
|
|
246
279
|
if (!isCtxDateExpression(value)) return void 0;
|
|
247
|
-
const
|
|
280
|
+
const rawSegments = withDatePrefix(parseCtxDateSegments(value) || []);
|
|
281
|
+
const formatted = splitFormattedDateSegments(rawSegments);
|
|
282
|
+
if (!formatted) return void 0;
|
|
283
|
+
const segments = formatted.baseSegments;
|
|
248
284
|
if (segments[1] === "preset" && segments.length === 3 && PRESET_KEYS.has(segments[2])) {
|
|
249
285
|
return { type: segments[2] };
|
|
250
286
|
}
|
|
@@ -272,6 +308,60 @@ function parseCtxDateExpression(value) {
|
|
|
272
308
|
return void 0;
|
|
273
309
|
}
|
|
274
310
|
__name(parseCtxDateExpression, "parseCtxDateExpression");
|
|
311
|
+
function parseCtxDateExpressionConfig(value) {
|
|
312
|
+
if (!isCtxDateExpression(value)) return void 0;
|
|
313
|
+
const segments = withDatePrefix(parseCtxDateSegments(value) || []);
|
|
314
|
+
const formatted = splitFormattedDateSegments(segments);
|
|
315
|
+
if (!formatted) return void 0;
|
|
316
|
+
const parsed = parseCtxDateExpression(value);
|
|
317
|
+
const formatConfig = formatted.format ? { format: formatted.format } : {};
|
|
318
|
+
if (typeof parsed === "string") {
|
|
319
|
+
return { kind: "exact", value: parsed, ...formatConfig };
|
|
320
|
+
}
|
|
321
|
+
if (Array.isArray(parsed) && parsed.length === 2 && typeof parsed[0] === "string" && typeof parsed[1] === "string") {
|
|
322
|
+
return { kind: "exact", value: [parsed[0], parsed[1]], ...formatConfig };
|
|
323
|
+
}
|
|
324
|
+
if (!parsed || typeof parsed !== "object") return void 0;
|
|
325
|
+
const typed = parsed;
|
|
326
|
+
if (typed.type === "past" || typed.type === "next") {
|
|
327
|
+
if (typeof typed.unit !== "string" || !RELATIVE_UNITS.has(typed.unit) || typeof typed.number !== "number") {
|
|
328
|
+
return void 0;
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
kind: "relative",
|
|
332
|
+
direction: typed.type,
|
|
333
|
+
amount: typed.number,
|
|
334
|
+
unit: typed.unit,
|
|
335
|
+
...formatConfig
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
if (typeof typed.type === "string" && PRESET_KEYS.has(typed.type)) {
|
|
339
|
+
return { kind: "preset", preset: typed.type, ...formatConfig };
|
|
340
|
+
}
|
|
341
|
+
return void 0;
|
|
342
|
+
}
|
|
343
|
+
__name(parseCtxDateExpressionConfig, "parseCtxDateExpressionConfig");
|
|
344
|
+
function serializeCtxDateExpressionConfig(config) {
|
|
345
|
+
let legacyValue;
|
|
346
|
+
if (config.kind === "preset") {
|
|
347
|
+
if (!PRESET_KEYS.has(config.preset)) return void 0;
|
|
348
|
+
legacyValue = { type: config.preset };
|
|
349
|
+
} else if (config.kind === "relative") {
|
|
350
|
+
if (!RELATIVE_DIRECTIONS.has(config.direction) || !RELATIVE_UNITS.has(config.unit)) return void 0;
|
|
351
|
+
const amount = Math.floor(Number(config.amount));
|
|
352
|
+
if (!Number.isFinite(amount) || amount <= 0) return void 0;
|
|
353
|
+
legacyValue = { type: config.direction, unit: config.unit, number: amount };
|
|
354
|
+
} else {
|
|
355
|
+
legacyValue = config.value;
|
|
356
|
+
}
|
|
357
|
+
const expression = serializeCtxDateValue(legacyValue);
|
|
358
|
+
if (!expression || !config.format) return expression;
|
|
359
|
+
const format = String(config.format);
|
|
360
|
+
if (!format.trim() || format.length > MAX_DATE_FORMAT_LENGTH) return void 0;
|
|
361
|
+
const segments = withDatePrefix(parseCtxDateSegments(expression) || []);
|
|
362
|
+
return toCtxDateExpression(["date", "format", `v${encodeBase64Url(format)}`, ...segments.slice(1)]);
|
|
363
|
+
}
|
|
364
|
+
__name(serializeCtxDateExpressionConfig, "serializeCtxDateExpressionConfig");
|
|
275
365
|
function serializeCtxDateValue(value) {
|
|
276
366
|
if (isCtxDateExpression(value)) {
|
|
277
367
|
return String(value).trim();
|
|
@@ -317,8 +407,23 @@ function serializeCtxDateValue(value) {
|
|
|
317
407
|
return void 0;
|
|
318
408
|
}
|
|
319
409
|
__name(serializeCtxDateValue, "serializeCtxDateValue");
|
|
410
|
+
function formatResolvedDateValue(value, format) {
|
|
411
|
+
const formatValue = /* @__PURE__ */ __name((item) => {
|
|
412
|
+
if (typeof item !== "string") return item;
|
|
413
|
+
const parsed = (0, import_dayjs.default)(item);
|
|
414
|
+
return parsed.isValid() ? parsed.format(format) : item;
|
|
415
|
+
}, "formatValue");
|
|
416
|
+
return Array.isArray(value) ? value.map(formatValue) : formatValue(value);
|
|
417
|
+
}
|
|
418
|
+
__name(formatResolvedDateValue, "formatResolvedDateValue");
|
|
320
419
|
function resolveCtxDatePath(pathSegments) {
|
|
321
|
-
const
|
|
420
|
+
const rawSegments = withDatePrefix((pathSegments || []).map((seg) => String(seg)));
|
|
421
|
+
const formatted = splitFormattedDateSegments(rawSegments);
|
|
422
|
+
if (!formatted) return void 0;
|
|
423
|
+
if (formatted.format) {
|
|
424
|
+
return formatResolvedDateValue(resolveCtxDatePath(formatted.baseSegments), formatted.format);
|
|
425
|
+
}
|
|
426
|
+
const segments = formatted.baseSegments;
|
|
322
427
|
if (segments[0] !== "date") return void 0;
|
|
323
428
|
if (segments[1] === "preset" && segments.length === 3) {
|
|
324
429
|
const key = segments[2];
|
|
@@ -375,6 +480,8 @@ __name(resolveCtxDatePath, "resolveCtxDatePath");
|
|
|
375
480
|
isCtxDateExpression,
|
|
376
481
|
isCtxDatePathPrefix,
|
|
377
482
|
parseCtxDateExpression,
|
|
483
|
+
parseCtxDateExpressionConfig,
|
|
378
484
|
resolveCtxDatePath,
|
|
485
|
+
serializeCtxDateExpressionConfig,
|
|
379
486
|
serializeCtxDateValue
|
|
380
487
|
});
|
|
@@ -8,4 +8,5 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { FlowContext } from '../flowContext';
|
|
10
10
|
export declare const SKIP_DATA_SOURCE_DIRTY = "__nocobaseSkipDataSourceDirty";
|
|
11
|
+
export declare const PREPARE_CONTEXT_RESOURCE_ACTION_PARAMS: unique symbol;
|
|
11
12
|
export declare function getDirtyAwareApiClient(value: unknown, context: FlowContext): unknown;
|
|
@@ -27,6 +27,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
27
27
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
28
|
var dirtyAwareApiClient_exports = {};
|
|
29
29
|
__export(dirtyAwareApiClient_exports, {
|
|
30
|
+
PREPARE_CONTEXT_RESOURCE_ACTION_PARAMS: () => PREPARE_CONTEXT_RESOURCE_ACTION_PARAMS,
|
|
30
31
|
SKIP_DATA_SOURCE_DIRTY: () => SKIP_DATA_SOURCE_DIRTY,
|
|
31
32
|
getDirtyAwareApiClient: () => getDirtyAwareApiClient
|
|
32
33
|
});
|
|
@@ -35,6 +36,7 @@ var import_sdk = require("@nocobase/sdk");
|
|
|
35
36
|
var import_dataSourceDirty = require("./dataSourceDirty");
|
|
36
37
|
const SKIP_DATA_SOURCE_DIRTY = "__nocobaseSkipDataSourceDirty";
|
|
37
38
|
const DIRTY_DISPATCH_TOKEN = Symbol("nocobaseDirtyDispatchToken");
|
|
39
|
+
const PREPARE_CONTEXT_RESOURCE_ACTION_PARAMS = Symbol("prepareContextResourceActionParams");
|
|
38
40
|
const dirtyAwareApiClientCache = /* @__PURE__ */ new WeakMap();
|
|
39
41
|
const dirtyAwareApiClientProxies = /* @__PURE__ */ new WeakSet();
|
|
40
42
|
const MUTATING_RESOURCE_ACTIONS = [
|
|
@@ -277,6 +279,7 @@ function resolveDirtyResourceActionFromResource(resourceName, resourceOf, action
|
|
|
277
279
|
}
|
|
278
280
|
return {
|
|
279
281
|
resourceName: normalizedResourceName,
|
|
282
|
+
resourceOf,
|
|
280
283
|
actionName: normalizedActionName
|
|
281
284
|
};
|
|
282
285
|
}
|
|
@@ -359,6 +362,15 @@ function createDirtyAwareResource(context, resource, resourceName, resourceOf, h
|
|
|
359
362
|
return async (...args) => {
|
|
360
363
|
const actionOptions = isObjectRecord(args[1]) ? args[1] : void 0;
|
|
361
364
|
const dirtyResourceAction = resolveDirtyResourceActionFromResource(resourceName, resourceOf, prop, context);
|
|
365
|
+
const prepareParams = context[PREPARE_CONTEXT_RESOURCE_ACTION_PARAMS];
|
|
366
|
+
const actionParams = dirtyResourceAction && typeof prepareParams === "function" ? prepareParams.call(
|
|
367
|
+
context,
|
|
368
|
+
{
|
|
369
|
+
...dirtyResourceAction,
|
|
370
|
+
dataSourceKey: dirtyResourceAction.dataSourceKey || (0, import_dataSourceDirty.getDataSourceKeyFromHeaders)(headers)
|
|
371
|
+
},
|
|
372
|
+
args[0]
|
|
373
|
+
) : args[0];
|
|
362
374
|
const requestKey = getDirtyResourceActionDispatchKey(dirtyResourceAction, headers);
|
|
363
375
|
const resourceKey = getResourceDispatchKey(resourceName, resourceOf, headers);
|
|
364
376
|
const inheritedToken = getMatchingRequestToken(
|
|
@@ -373,12 +385,12 @@ function createDirtyAwareResource(context, resource, resourceName, resourceOf, h
|
|
|
373
385
|
token.skip = true;
|
|
374
386
|
}
|
|
375
387
|
const forwardedArgs = actionOptions || args[1] == null ? [
|
|
376
|
-
|
|
388
|
+
actionParams,
|
|
377
389
|
{
|
|
378
390
|
...actionOptions,
|
|
379
391
|
[DIRTY_DISPATCH_TOKEN]: token
|
|
380
392
|
}
|
|
381
|
-
] : args;
|
|
393
|
+
] : [actionParams, args[1]];
|
|
382
394
|
let actionResult;
|
|
383
395
|
requestTokenStack.push({ key: requestKey, token });
|
|
384
396
|
try {
|
|
@@ -627,6 +639,7 @@ function getDirtyAwareApiClient(value, context) {
|
|
|
627
639
|
__name(getDirtyAwareApiClient, "getDirtyAwareApiClient");
|
|
628
640
|
// Annotate the CommonJS export names for ESM import in node:
|
|
629
641
|
0 && (module.exports = {
|
|
642
|
+
PREPARE_CONTEXT_RESOURCE_ACTION_PARAMS,
|
|
630
643
|
SKIP_DATA_SOURCE_DIRTY,
|
|
631
644
|
getDirtyAwareApiClient
|
|
632
645
|
});
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -11,17 +11,17 @@ export { escapeT, getT, tExpr } from './translation';
|
|
|
11
11
|
export { FlowCancelSaveException, FlowExitAllException, FlowExitException } from './exceptions';
|
|
12
12
|
export { defineAction } from './flow-definitions';
|
|
13
13
|
export { isInheritedFrom } from './inheritance';
|
|
14
|
-
export { resolveCreateModelOptions, resolveDefaultParams, resolveExpressions } from './params-resolvers';
|
|
14
|
+
export { buildFlowModelResolveDescriptor, resolveCreateModelOptions, resolveDefaultParams, resolveExpressions, } from './params-resolvers';
|
|
15
15
|
export { compileUiSchema, resolveStepUiSchema, resolveStepDisabledInSettings, resolveUiMode, shouldHideEventInSettings, shouldHideStepInSettings, } from './schema-utils';
|
|
16
16
|
export { setupRuntimeContextSteps } from './setupRuntimeContextSteps';
|
|
17
17
|
export { createCollectionContextMeta } from './createCollectionContextMeta';
|
|
18
|
-
export { createAssociationAwareObjectMetaFactory, createAssociationSubpathResolver } from './associationObjectVariable';
|
|
18
|
+
export { createAssociationAwareObjectMetaFactory, createAssociationSubpathResolver, getAssociationFilterByTk, } from './associationObjectVariable';
|
|
19
19
|
export { buildRecordMeta, collectContextParamsForTemplate, createCurrentRecordMetaFactory, createRecordResolveOnServerWithLocal, createRecordMetaFactory, extractUsedVariableNames, extractUsedVariablePaths, inferRecordRef, type RecordParamsBuilder, } from './variablesParams';
|
|
20
20
|
export { extractPropertyPath, formatPathToVariable, isVariableExpression } from './context';
|
|
21
21
|
export { clearAutoFlowError, getAutoFlowError, setAutoFlowError, type AutoFlowError } from './autoFlowError';
|
|
22
22
|
export { parsePathnameToViewParams, type ViewParam } from './parsePathnameToViewParams';
|
|
23
23
|
export { createOpenViewRouteState, decodeOpenViewRouteState, encodeOpenViewRouteState, isOpenViewRouteStateToken, RUNJS_OPEN_VIEW_ROUTE_STATE, type OpenViewRouteMode, type OpenViewRouteSize, type OpenViewRouteState, } from './openViewRouteState';
|
|
24
|
-
export { decodeBase64Url, encodeBase64Url, isCompleteCtxDatePath, isCtxDatePathPrefix, isCtxDateExpression, parseCtxDateExpression, resolveCtxDatePath, serializeCtxDateValue, } from './dateVariable';
|
|
24
|
+
export { decodeBase64Url, encodeBase64Url, isCompleteCtxDatePath, isCtxDatePathPrefix, isCtxDateExpression, parseCtxDateExpression, parseCtxDateExpressionConfig, resolveCtxDatePath, serializeCtxDateExpressionConfig, serializeCtxDateValue, type CtxDateExpressionConfig, type CtxDatePreset, type CtxDateRelativeDirection, type CtxDateRelativeUnit, } from './dateVariable';
|
|
25
25
|
export { isRunJSValue, normalizeRunJSValue, extractUsedVariablePathsFromRunJS, type RunJSValue } from './runjsValue';
|
|
26
26
|
export { resolveRunJSObjectValues } from './resolveRunJSObjectValues';
|
|
27
27
|
export { prepareRunJsCode, preprocessRunJsTemplates } from './runjsTemplateCompat';
|
package/lib/utils/index.js
CHANGED
|
@@ -34,6 +34,7 @@ __export(utils_exports, {
|
|
|
34
34
|
FlowExitException: () => import_exceptions.FlowExitException,
|
|
35
35
|
MENU_KEYS: () => import_constants.MENU_KEYS,
|
|
36
36
|
RUNJS_OPEN_VIEW_ROUTE_STATE: () => import_openViewRouteState.RUNJS_OPEN_VIEW_ROUTE_STATE,
|
|
37
|
+
buildFlowModelResolveDescriptor: () => import_params_resolvers.buildFlowModelResolveDescriptor,
|
|
37
38
|
buildRecordMeta: () => import_variablesParams.buildRecordMeta,
|
|
38
39
|
clearAutoFlowError: () => import_autoFlowError.clearAutoFlowError,
|
|
39
40
|
collectContextParamsForTemplate: () => import_variablesParams.collectContextParamsForTemplate,
|
|
@@ -57,6 +58,7 @@ __export(utils_exports, {
|
|
|
57
58
|
extractUsedVariablePaths: () => import_variablesParams.extractUsedVariablePaths,
|
|
58
59
|
extractUsedVariablePathsFromRunJS: () => import_runjsValue.extractUsedVariablePathsFromRunJS,
|
|
59
60
|
formatPathToVariable: () => import_context.formatPathToVariable,
|
|
61
|
+
getAssociationFilterByTk: () => import_associationObjectVariable.getAssociationFilterByTk,
|
|
60
62
|
getAutoFlowError: () => import_autoFlowError.getAutoFlowError,
|
|
61
63
|
getT: () => import_translation.getT,
|
|
62
64
|
inferRecordRef: () => import_variablesParams.inferRecordRef,
|
|
@@ -71,6 +73,7 @@ __export(utils_exports, {
|
|
|
71
73
|
isVariableExpression: () => import_context.isVariableExpression,
|
|
72
74
|
normalizeRunJSValue: () => import_runjsValue.normalizeRunJSValue,
|
|
73
75
|
parseCtxDateExpression: () => import_dateVariable.parseCtxDateExpression,
|
|
76
|
+
parseCtxDateExpressionConfig: () => import_dateVariable.parseCtxDateExpressionConfig,
|
|
74
77
|
parsePathnameToViewParams: () => import_parsePathnameToViewParams.parsePathnameToViewParams,
|
|
75
78
|
prepareRunJsCode: () => import_runjsTemplateCompat.prepareRunJsCode,
|
|
76
79
|
preprocessRunJsTemplates: () => import_runjsTemplateCompat.preprocessRunJsTemplates,
|
|
@@ -85,6 +88,7 @@ __export(utils_exports, {
|
|
|
85
88
|
resolveStepDisabledInSettings: () => import_schema_utils.resolveStepDisabledInSettings,
|
|
86
89
|
resolveStepUiSchema: () => import_schema_utils.resolveStepUiSchema,
|
|
87
90
|
resolveUiMode: () => import_schema_utils.resolveUiMode,
|
|
91
|
+
serializeCtxDateExpressionConfig: () => import_dateVariable.serializeCtxDateExpressionConfig,
|
|
88
92
|
serializeCtxDateValue: () => import_dateVariable.serializeCtxDateValue,
|
|
89
93
|
setAutoFlowError: () => import_autoFlowError.setAutoFlowError,
|
|
90
94
|
setupRuntimeContextSteps: () => import_setupRuntimeContextSteps.setupRuntimeContextSteps,
|
|
@@ -127,6 +131,7 @@ var import_randomId = require("./randomId");
|
|
|
127
131
|
FlowExitException,
|
|
128
132
|
MENU_KEYS,
|
|
129
133
|
RUNJS_OPEN_VIEW_ROUTE_STATE,
|
|
134
|
+
buildFlowModelResolveDescriptor,
|
|
130
135
|
buildRecordMeta,
|
|
131
136
|
clearAutoFlowError,
|
|
132
137
|
collectContextParamsForTemplate,
|
|
@@ -150,6 +155,7 @@ var import_randomId = require("./randomId");
|
|
|
150
155
|
extractUsedVariablePaths,
|
|
151
156
|
extractUsedVariablePathsFromRunJS,
|
|
152
157
|
formatPathToVariable,
|
|
158
|
+
getAssociationFilterByTk,
|
|
153
159
|
getAutoFlowError,
|
|
154
160
|
getT,
|
|
155
161
|
inferRecordRef,
|
|
@@ -164,6 +170,7 @@ var import_randomId = require("./randomId");
|
|
|
164
170
|
isVariableExpression,
|
|
165
171
|
normalizeRunJSValue,
|
|
166
172
|
parseCtxDateExpression,
|
|
173
|
+
parseCtxDateExpressionConfig,
|
|
167
174
|
parsePathnameToViewParams,
|
|
168
175
|
prepareRunJsCode,
|
|
169
176
|
preprocessRunJsTemplates,
|
|
@@ -178,6 +185,7 @@ var import_randomId = require("./randomId");
|
|
|
178
185
|
resolveStepDisabledInSettings,
|
|
179
186
|
resolveStepUiSchema,
|
|
180
187
|
resolveUiMode,
|
|
188
|
+
serializeCtxDateExpressionConfig,
|
|
181
189
|
serializeCtxDateValue,
|
|
182
190
|
setAutoFlowError,
|
|
183
191
|
setupRuntimeContextSteps,
|
|
@@ -27,10 +27,13 @@ export type JSONValue = string | {
|
|
|
27
27
|
[key: string]: JSONValue;
|
|
28
28
|
} | JSONValue[];
|
|
29
29
|
type BatchPayload = {
|
|
30
|
+
contractRd?: string;
|
|
31
|
+
rd?: string;
|
|
30
32
|
template: JSONValue;
|
|
31
33
|
contextParams?: ServerContextParams | undefined;
|
|
32
34
|
};
|
|
33
35
|
export declare function enqueueVariablesResolve(ctx: FlowRuntimeContext, payload: BatchPayload): Promise<unknown>;
|
|
36
|
+
export declare function buildFlowModelResolveDescriptor(ctx: Pick<FlowModelContext, 'api'>, flowModelUid?: string | number | null): any;
|
|
34
37
|
/**
|
|
35
38
|
* 解析参数中的 {{xxx}} 表达式,自动处理异步属性访问
|
|
36
39
|
*/
|
|
@@ -37,6 +37,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
37
37
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
38
38
|
var params_resolvers_exports = {};
|
|
39
39
|
__export(params_resolvers_exports, {
|
|
40
|
+
buildFlowModelResolveDescriptor: () => buildFlowModelResolveDescriptor,
|
|
40
41
|
enqueueVariablesResolve: () => enqueueVariablesResolve,
|
|
41
42
|
preprocessExpression: () => preprocessExpression,
|
|
42
43
|
resolveCreateModelOptions: () => resolveCreateModelOptions,
|
|
@@ -45,6 +46,7 @@ __export(params_resolvers_exports, {
|
|
|
45
46
|
});
|
|
46
47
|
module.exports = __toCommonJS(params_resolvers_exports);
|
|
47
48
|
var import_shared = require("@nocobase/shared");
|
|
49
|
+
var import_client = require("@nocobase/utils/client");
|
|
48
50
|
var import_lodash = __toESM(require("lodash"));
|
|
49
51
|
async function resolveDefaultParams(defaultParams, ctx) {
|
|
50
52
|
if (!defaultParams) {
|
|
@@ -144,6 +146,8 @@ function enqueueVariablesResolve(ctx, payload) {
|
|
|
144
146
|
try {
|
|
145
147
|
const batch = items.map((it) => ({
|
|
146
148
|
id: it.id,
|
|
149
|
+
contractRd: it.payload.contractRd,
|
|
150
|
+
rd: it.payload.rd,
|
|
147
151
|
template: it.payload.template,
|
|
148
152
|
contextParams: it.payload.contextParams || {}
|
|
149
153
|
}));
|
|
@@ -187,6 +191,11 @@ function enqueueVariablesResolve(ctx, payload) {
|
|
|
187
191
|
return p;
|
|
188
192
|
}
|
|
189
193
|
__name(enqueueVariablesResolve, "enqueueVariablesResolve");
|
|
194
|
+
function buildFlowModelResolveDescriptor(ctx, flowModelUid) {
|
|
195
|
+
var _a, _b;
|
|
196
|
+
return (0, import_client.generateFlowModelRdFromToken)(flowModelUid, (_b = (_a = ctx == null ? void 0 : ctx.api) == null ? void 0 : _a.auth) == null ? void 0 : _b.token);
|
|
197
|
+
}
|
|
198
|
+
__name(buildFlowModelResolveDescriptor, "buildFlowModelResolveDescriptor");
|
|
190
199
|
async function resolveExpressions(params, ctx) {
|
|
191
200
|
const compile = /* @__PURE__ */ __name(async (source) => {
|
|
192
201
|
if (typeof source === "string" && /\{\{.*?\}\}/.test(source)) {
|
|
@@ -308,6 +317,7 @@ async function compileExpression(expression, ctx) {
|
|
|
308
317
|
__name(compileExpression, "compileExpression");
|
|
309
318
|
// Annotate the CommonJS export names for ESM import in node:
|
|
310
319
|
0 && (module.exports = {
|
|
320
|
+
buildFlowModelResolveDescriptor,
|
|
311
321
|
enqueueVariablesResolve,
|
|
312
322
|
preprocessExpression,
|
|
313
323
|
resolveCreateModelOptions,
|
|
@@ -210,6 +210,11 @@ async function collectContextParamsForTemplate(ctx, template) {
|
|
|
210
210
|
input[key] = built;
|
|
211
211
|
}
|
|
212
212
|
}
|
|
213
|
+
const viewPaths = usage.view || [];
|
|
214
|
+
if (!input.view && viewPaths.some((path) => path === "record" || path.startsWith("record.") || path.startsWith("record["))) {
|
|
215
|
+
const recordRef = inferViewRecordRef(ctx);
|
|
216
|
+
if (recordRef) input.view = { record: recordRef };
|
|
217
|
+
}
|
|
213
218
|
return (0, import_serverContextParams.buildServerContextParams)(ctx, input);
|
|
214
219
|
}
|
|
215
220
|
__name(collectContextParamsForTemplate, "collectContextParamsForTemplate");
|
|
@@ -28,6 +28,7 @@ interface PopupNodeResource {
|
|
|
28
28
|
interface PopupNode {
|
|
29
29
|
uid?: string;
|
|
30
30
|
resource: PopupNodeResource;
|
|
31
|
+
sourceRecord?: unknown;
|
|
31
32
|
parent?: PopupNode;
|
|
32
33
|
}
|
|
33
34
|
export declare function buildPopupRuntime(ctx: FlowContext, view: FlowView): Promise<PopupNode | undefined>;
|