openxiangda 2.59.5 → 2.60.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.
- package/dist/browser/admin-contributions.d.ts.map +1 -1
- package/dist/browser/admin-contributions.js +3 -4
- package/dist/browser/admin-contributions.js.map +1 -1
- package/dist/browser/application.d.ts +4 -2
- package/dist/browser/application.d.ts.map +1 -1
- package/dist/browser/application.js +2 -2
- package/dist/browser/application.js.map +1 -1
- package/dist/browser/components/platform-fields/DateTimeField.js +1 -1
- package/dist/browser/components/platform-fields/DateTimeField.js.map +1 -1
- package/dist/browser/components/platform-fields/MobileDateTimeField.js +1 -1
- package/dist/browser/components/platform-fields/MobileDateTimeField.js.map +1 -1
- package/dist/browser/components/platform-fields/MobileZonedDateTimeField.d.ts +1 -1
- package/dist/browser/components/platform-fields/MobileZonedDateTimeField.d.ts.map +1 -1
- package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js +3 -3
- package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js.map +1 -1
- package/dist/browser/components/platform-fields/SignatureField.d.ts.map +1 -1
- package/dist/browser/components/platform-fields/SignatureField.js +2 -4
- package/dist/browser/components/platform-fields/SignatureField.js.map +1 -1
- package/dist/browser/components/platform-fields/SubtableField.d.ts +3 -0
- package/dist/browser/components/platform-fields/SubtableField.d.ts.map +1 -1
- package/dist/browser/components/platform-fields/SubtableField.js +8 -6
- package/dist/browser/components/platform-fields/SubtableField.js.map +1 -1
- package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts +1 -1
- package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts.map +1 -1
- package/dist/browser/components/platform-fields/ZonedDateTimeField.js +3 -2
- package/dist/browser/components/platform-fields/ZonedDateTimeField.js.map +1 -1
- package/dist/browser/components/platform-fields/zoned-date-time.d.ts +2 -0
- package/dist/browser/components/platform-fields/zoned-date-time.d.ts.map +1 -1
- package/dist/browser/components/platform-fields/zoned-date-time.js +6 -0
- package/dist/browser/components/platform-fields/zoned-date-time.js.map +1 -1
- package/dist/browser/components/resource/SurfaceFields.d.ts +3 -0
- package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -1
- package/dist/browser/components/resource/SurfaceFields.js +2 -2
- package/dist/browser/components/resource/SurfaceFields.js.map +1 -1
- package/dist/browser/components/workflow/StandardWorkflowPages.d.ts +8 -2
- package/dist/browser/components/workflow/StandardWorkflowPages.d.ts.map +1 -1
- package/dist/browser/components/workflow/StandardWorkflowPages.js +92 -39
- package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
- package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts.map +1 -1
- package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js +4 -2
- package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js.map +1 -1
- package/dist/browser/components/workflow/WorkflowTaskForm.d.ts +9 -1
- package/dist/browser/components/workflow/WorkflowTaskForm.d.ts.map +1 -1
- package/dist/browser/components/workflow/WorkflowTaskForm.js +32 -3
- package/dist/browser/components/workflow/WorkflowTaskForm.js.map +1 -1
- package/dist/browser/components/workflow/workflow-submission-form.d.ts +5 -0
- package/dist/browser/components/workflow/workflow-submission-form.d.ts.map +1 -1
- package/dist/browser/components/workflow/workflow-submission-form.js +26 -0
- package/dist/browser/components/workflow/workflow-submission-form.js.map +1 -1
- package/dist/browser/navigation-guard.d.ts +4 -1
- package/dist/browser/navigation-guard.d.ts.map +1 -1
- package/dist/browser/navigation-guard.js +39 -10
- package/dist/browser/navigation-guard.js.map +1 -1
- package/dist/browser/sha256.d.ts +3 -0
- package/dist/browser/sha256.d.ts.map +1 -0
- package/dist/browser/sha256.js +10 -0
- package/dist/browser/sha256.js.map +1 -0
- package/dist/browser/workflow-definitions.d.ts +14 -1
- package/dist/browser/workflow-definitions.d.ts.map +1 -1
- package/dist/browser/workflow-definitions.js +8 -3
- package/dist/browser/workflow-definitions.js.map +1 -1
- package/dist/browser/workflow-task-command-recovery.d.ts.map +1 -1
- package/dist/browser/workflow-task-command-recovery.js +2 -2
- package/dist/browser/workflow-task-command-recovery.js.map +1 -1
- package/documentation/administration.md +2 -2
- package/documentation/backend.md +21 -0
- package/documentation/delivery.md +31 -2
- package/documentation/getting-started.md +7 -7
- package/documentation/manifest.json +6 -6
- package/documentation/workflow-events.md +50 -4
- package/package.json +29 -30
- package/releases/2.20.1.json +30 -0
- package/releases/2.20.2.json +30 -0
- package/releases/2.20.3.json +29 -0
- package/releases/2.20.4.json +30 -0
- package/releases/2.31.5.json +33 -0
- package/releases/{2.59.4.json → 2.59.3.json} +4 -6
- package/releases/2.60.0.json +38 -0
- package/skills/manifest.json +1 -1
- package/skills/openxiangda-v2/SKILL.md +4 -4
- package/skills/openxiangda-v2/references/administration.md +2 -2
- package/skills/openxiangda-v2/references/backend.md +21 -0
- package/skills/openxiangda-v2/references/delivery.md +31 -2
- package/skills/openxiangda-v2/references/getting-started.md +7 -7
- package/skills/openxiangda-v2/references/workflow-events.md +50 -4
- package/releases/2.59.5.json +0 -40
|
@@ -2,8 +2,8 @@ import type { WorkflowCommandResult, WorkflowDetailSurfaceV2, WorkflowSurface, W
|
|
|
2
2
|
import { type ReactNode } from 'react';
|
|
3
3
|
import { type SurfaceFieldRenderers } from '../resource/SurfaceFields';
|
|
4
4
|
import { type ResourceFormDrawerState } from '../resource/ResourceFormFrame';
|
|
5
|
-
import { type WorkflowSubmissionFieldStates } from './workflow-submission-form';
|
|
6
|
-
export type { WorkflowSubmissionFieldState, WorkflowSubmissionFieldStates } from './workflow-submission-form';
|
|
5
|
+
import { type WorkflowSubmissionFieldStates, type WorkflowSubmissionSubtableFieldStates } from './workflow-submission-form';
|
|
6
|
+
export type { WorkflowSubmissionFieldState, WorkflowSubmissionFieldStates, WorkflowSubmissionSubtableFieldStates } from './workflow-submission-form';
|
|
7
7
|
type PageVariant = 'desktop' | 'mobile';
|
|
8
8
|
export type WorkflowPageVariant = PageVariant;
|
|
9
9
|
type JsonObject = Record<string, unknown>;
|
|
@@ -145,6 +145,12 @@ export interface WorkflowSubmissionFormOptions {
|
|
|
145
145
|
* are not bound launch inputs. Never inserted into form submission/drafts. */
|
|
146
146
|
candidateScopeValues?: Readonly<JsonObject>;
|
|
147
147
|
fieldState?: (values: Readonly<JsonObject>) => WorkflowSubmissionFieldStates;
|
|
148
|
+
/** Narrows named-create child presentation; hidden values are retained and remain server-validated. */
|
|
149
|
+
subtableFieldState?: (values: Readonly<JsonObject>) => WorkflowSubmissionSubtableFieldStates;
|
|
150
|
+
/** Assistance for matched datetime/range inputs; never a server submission rule. */
|
|
151
|
+
dateTimeConstraints?: SurfaceFieldRenderers['dateTimeConstraints'];
|
|
152
|
+
/** Dynamic help next to matched fields; independent of requirements and writes. */
|
|
153
|
+
fieldHints?: (values: Readonly<JsonObject>) => Readonly<Record<string, ReactNode>>;
|
|
148
154
|
/** Synchronous canonical patch after user input, limited to editable launch fields. */
|
|
149
155
|
valueLinkage?: (changed: Readonly<JsonObject>, values: Readonly<JsonObject>) => JsonObject;
|
|
150
156
|
/** Display derived owned-child values without including them in named create input. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StandardWorkflowPages.d.ts","sourceRoot":"","sources":["../../../../src/browser/components/workflow/StandardWorkflowPages.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StandardWorkflowPages.d.ts","sourceRoot":"","sources":["../../../../src/browser/components/workflow/StandardWorkflowPages.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { applicationCode } from '../../runtime-meta';
|
|
3
|
+
import { useUnsavedChangesGuard } from '../../navigation-guard';
|
|
3
4
|
import { readPendingWorkflowSubmission, writePendingWorkflowSubmission, clearPendingWorkflowSubmission, workflowSubmissionScope, submissionLocatorStorage, standardProcessWasRejected } from '../../workflow-submission-recovery';
|
|
4
5
|
import { readPendingWorkflowTaskCommand, writePendingWorkflowTaskCommand, clearPendingWorkflowTaskCommand, workflowTaskCommandScope, workflowCommandTokenDigest, workflowTaskCommandWasRejected } from '../../workflow-task-command-recovery';
|
|
5
6
|
import { WorkflowTaskForm, useWorkflowTaskForm } from './WorkflowTaskForm';
|
|
@@ -14,7 +15,7 @@ import { Link, Navigate, useHref, useNavigate, useParams, useSearchParams, } fro
|
|
|
14
15
|
import { PlatformDirectoryPicker } from '../platform-fields/PlatformDirectoryPicker';
|
|
15
16
|
import { directoryStoredValues } from '../platform-fields/directory-value';
|
|
16
17
|
import { executeWorkflowOperation, executeWorkflowLaunchNamedOperation, loadWorkflowInstanceDetail, loadWorkflowRecordDetail, loadWorkflowDataAudit, loadWorkflowInstanceSurface, loadWorkflowLaunchSurface, loadWorkflowTaskSurface, loadWorkflowTaskDetail, loadWorkflowWorkCenter, answerBusinessProcessCommand, commitStandardProcess, resolveBusinessProcessOriginal, createNativeResourceClient, loadProcessCommandSurface, retryBusinessProcessCommand, uploadOperationManagedFile, } from '../../platform-client';
|
|
17
|
-
import { useWorkflowDefinition, } from '../../workflow-definitions';
|
|
18
|
+
import { useWorkflowDefinition, useWorkflowTaskFormBehavior, } from '../../workflow-definitions';
|
|
18
19
|
import { useResourceDefinitions } from '../../resource-definitions';
|
|
19
20
|
import { selectedSurfaceFields } from '../resource/resource-field-selection';
|
|
20
21
|
import { useRuntime, useOptionalRuntime } from '../../runtime';
|
|
@@ -29,7 +30,8 @@ import { PlatformAvatar } from '../PlatformAvatar';
|
|
|
29
30
|
import { SubtableField } from '../platform-fields/SubtableField';
|
|
30
31
|
import { assertNamedSubtableReadonlyFields, namedProcessFormValues, standardProcessFormValues } from './standard-process-values';
|
|
31
32
|
import { fieldWritable } from '../resource/resource-page-helpers';
|
|
32
|
-
import { workflowSubmissionFormInput, workflowSubmissionFormProjection, workflowSubmissionPrefill, workflowSubmissionValueLinkage } from './workflow-submission-form';
|
|
33
|
+
import { workflowSubmissionFormInput, workflowSubmissionFormProjection, workflowSubmissionPrefill, workflowSubmissionValueLinkage, workflowSubmissionSubtableStates } from './workflow-submission-form';
|
|
34
|
+
import { validateDateTimeConstraints } from '../platform-fields/zoned-date-time';
|
|
33
35
|
/**
|
|
34
36
|
* An advanced task command has completed the current task and may have
|
|
35
37
|
* created a new task. Reading the old task Surface in that case is expected
|
|
@@ -182,7 +184,9 @@ function WorkflowSubtableValue({ detail, field, instanceId, variant, }) {
|
|
|
182
184
|
const order = subtable.surface.detail?.fieldOrder || [];
|
|
183
185
|
const fields = order.flatMap((key) => {
|
|
184
186
|
const item = subtable.surface.fields[key];
|
|
185
|
-
return item && item.system !== true
|
|
187
|
+
return item && item.system !== true && item.hidden !== true &&
|
|
188
|
+
item.type !== 'subtable' && key !== field.subtable?.foreignKey &&
|
|
189
|
+
key !== field.subtable?.orderField
|
|
186
190
|
? [{ key, ...item }]
|
|
187
191
|
: [];
|
|
188
192
|
});
|
|
@@ -394,6 +398,7 @@ function WorkflowOperations({ surface, variant, onRefresh, onCommandSuccess, pen
|
|
|
394
398
|
const mounted = useRef(false);
|
|
395
399
|
const busyRef = useRef(false);
|
|
396
400
|
const taskForm = useWorkflowTaskForm(surface.taskForm);
|
|
401
|
+
const taskFormBehavior = useWorkflowTaskFormBehavior(String(surface.instance.workflowCode || ''));
|
|
397
402
|
useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);
|
|
398
403
|
useEffect(() => {
|
|
399
404
|
if (!settlement || request.current?.key !== settlement.key)
|
|
@@ -598,7 +603,7 @@ function WorkflowOperations({ surface, variant, onRefresh, onCommandSuccess, pen
|
|
|
598
603
|
return (order[left.key] ?? 10) - (order[right.key] ?? 10);
|
|
599
604
|
});
|
|
600
605
|
const secondary = operations.filter((operation) => operation.placement !== 'primary');
|
|
601
|
-
const content = surface.taskForm || commandNeedsRefresh || ((submitting || unknown) && !pendingLocator) || unknown || refreshFailure ? (_jsxs(_Fragment, { children: [commandNeedsRefresh && !unknown && !pendingLocator && !refreshFailure && _jsx(Alert, { type: "info", showIcon: true, title: "\u8BF7\u5237\u65B0\u64CD\u4F5C\u540E\u7EE7\u7EED\u529E\u7406", description: "\u9875\u9762\u505C\u7559\u8F83\u4E45\uFF0C\u9700\u91CD\u65B0\u786E\u8BA4\u5F53\u524D\u529E\u7406\u6743\u9650\u3002\u5237\u65B0\u4F1A\u4FDD\u7559\u5C1A\u672A\u4FDD\u5B58\u7684\u8F93\u5165\u3002", action: _jsx(Button, { disabled: locked, loading: submitting, onClick: () => void refreshConfirmed(), children: "\u5237\u65B0\u64CD\u4F5C" }) }), surface.taskForm && _jsx(WorkflowTaskForm, { controller: taskForm, disabled: locked, variant: variant, operationPending: submitting || unknown || Boolean(pendingLocator) || draftLocked || fileLocked, taskVersion: surface.task?.version ? Number(surface.task.version) : undefined, taskId: surface.task?.id ? String(surface.task.id) : undefined, draftDisabled: commandLocked, onRefresh: onRefresh, onDraftBusyChange: busy => { setDraftLocked(busy); onBusyChange(busy || fileLocked || busyRef.current); }, onFileBusyChange: busy => { setFileLocked(busy); onBusyChange(busy || draftLocked || busyRef.current); }, resourceCode: surface.presentation.businessDetail.resourceCode || undefined, recordId: surface.presentation.businessDetail.recordId || undefined }), (submitting || unknown) && !pendingLocator && _jsx(WorkflowPendingCommandGuard, {}), unknown && _jsx(Alert, { type: "warning", showIcon: true, title: "\u4FDD\u7559\u4E86\u539F\u63D0\u4EA4\u8BF7\u6C42", description: operationError || '提交结果待确认,请重试原请求或查询原结果。', action: _jsx(Button, { disabled: submitting, loading: submitting, onClick: () => void sendRequest(true), children: "\u91CD\u8BD5\u539F\u8BF7\u6C42" }) }), refreshFailure && _jsx(Alert, { type: "warning", showIcon: true, title: refreshFailure.outcome === 'succeeded'
|
|
606
|
+
const content = surface.taskForm || commandNeedsRefresh || ((submitting || unknown) && !pendingLocator) || unknown || refreshFailure ? (_jsxs(_Fragment, { children: [commandNeedsRefresh && !unknown && !pendingLocator && !refreshFailure && _jsx(Alert, { type: "info", showIcon: true, title: "\u8BF7\u5237\u65B0\u64CD\u4F5C\u540E\u7EE7\u7EED\u529E\u7406", description: "\u9875\u9762\u505C\u7559\u8F83\u4E45\uFF0C\u9700\u91CD\u65B0\u786E\u8BA4\u5F53\u524D\u529E\u7406\u6743\u9650\u3002\u5237\u65B0\u4F1A\u4FDD\u7559\u5C1A\u672A\u4FDD\u5B58\u7684\u8F93\u5165\u3002", action: _jsx(Button, { disabled: locked, loading: submitting, onClick: () => void refreshConfirmed(), children: "\u5237\u65B0\u64CD\u4F5C" }) }), surface.taskForm && _jsx(WorkflowTaskForm, { controller: taskForm, disabled: locked, variant: variant, valueLinkage: taskFormBehavior?.valueLinkage, linkageContext: { workflowCode: String(surface.instance.workflowCode || ''), nodeId: String(surface.task?.nodeId || ''), pageCode: surface.taskForm.pageCode }, operationPending: submitting || unknown || Boolean(pendingLocator) || draftLocked || fileLocked, taskVersion: surface.task?.version ? Number(surface.task.version) : undefined, taskId: surface.task?.id ? String(surface.task.id) : undefined, draftDisabled: commandLocked, onRefresh: onRefresh, onDraftBusyChange: busy => { setDraftLocked(busy); onBusyChange(busy || fileLocked || busyRef.current); }, onFileBusyChange: busy => { setFileLocked(busy); onBusyChange(busy || draftLocked || busyRef.current); }, resourceCode: surface.presentation.businessDetail.resourceCode || undefined, recordId: surface.presentation.businessDetail.recordId || undefined }), (submitting || unknown) && !pendingLocator && _jsx(WorkflowPendingCommandGuard, {}), unknown && _jsx(Alert, { type: "warning", showIcon: true, title: "\u4FDD\u7559\u4E86\u539F\u63D0\u4EA4\u8BF7\u6C42", description: operationError || '提交结果待确认,请重试原请求或查询原结果。', action: _jsx(Button, { disabled: submitting, loading: submitting, onClick: () => void sendRequest(true), children: "\u91CD\u8BD5\u539F\u8BF7\u6C42" }) }), refreshFailure && _jsx(Alert, { type: "warning", showIcon: true, title: refreshFailure.outcome === 'succeeded'
|
|
602
607
|
? '任务操作已成功,但资料刷新失败' : '本次未提交,最新资料读取失败', description: refreshFailure.message, action: _jsx(Button, { disabled: submitting, onClick: () => void refreshConfirmed(), children: "\u5237\u65B0\u8D44\u6599" }) })] })) : null;
|
|
603
608
|
const actions = (_jsxs(_Fragment, { children: [_jsxs("div", { className: `oxa-workflow-actions oxa-workflow-actions-${variant}`, children: [primary.map((operation) => (_jsx(Button, { danger: operation.emphasis === 'danger', disabled: locked || commandNeedsRefresh || taskForm.stale || taskForm.draftNeedsSave || !operation.enabled, onClick: () => selectOperation(operation), title: operation.disabledReason, type: operation.emphasis === 'primary' ? 'primary' : 'default', children: operation.label }, operation.key))), secondary.length > 0 && (_jsx(Button, { className: "oxa-workflow-more-trigger", disabled: locked || commandNeedsRefresh || taskForm.stale || taskForm.draftNeedsSave, icon: _jsx(EllipsisOutlined, {}), onClick: () => setMoreOpen((value) => !value), children: "\u66F4\u591A\u64CD\u4F5C" })), secondary.length > 0 && moreOpen && (_jsx("div", { className: "oxa-workflow-more-actions", children: secondary.map((operation) => (_jsx(Button, { disabled: locked || commandNeedsRefresh || taskForm.stale || taskForm.draftNeedsSave || !operation.enabled, onClick: () => {
|
|
604
609
|
setMoreOpen(false);
|
|
@@ -1318,11 +1323,27 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1318
1323
|
const [loadedSubjectRevision, setLoadedSubjectRevision] = useState();
|
|
1319
1324
|
const [localCommandId, setLocalCommandId] = useState('');
|
|
1320
1325
|
const [localSubjectId, setLocalSubjectId] = useState('');
|
|
1326
|
+
const [subjectDirty, setSubjectDirty] = useState(false);
|
|
1327
|
+
const [requirementDirty, setRequirementDirty] = useState(false);
|
|
1321
1328
|
const launchPagePath = useRef('');
|
|
1322
1329
|
const [fullScreen, setFullScreen] = useState(false);
|
|
1323
1330
|
const pathCommandId = useParams().commandId;
|
|
1324
1331
|
const commandId = onDismiss ? localCommandId : pathCommandId || searchParams.get('processCommandId') || '';
|
|
1325
1332
|
const subjectId = onDismiss ? localSubjectId : searchParams.get('subjectId') || '';
|
|
1333
|
+
const recoveryMustStay = Boolean(pendingSubmission && !recoveryPersisted);
|
|
1334
|
+
const navigationGuard = useUnsavedChangesGuard({
|
|
1335
|
+
when: subjectDirty || requirementDirty || loading || recoveryMustStay,
|
|
1336
|
+
preventNavigation: loading || recoveryMustStay,
|
|
1337
|
+
message: loading ? '正在提交,请等待当前操作结果。'
|
|
1338
|
+
: recoveryMustStay ? '提交结果尚未确认,恢复信息未能保存。请留在本页查询原操作。'
|
|
1339
|
+
: pendingSubmission ? '原提交结果尚未确认。离开后可返回查询原操作,请勿重复申请。'
|
|
1340
|
+
: '填写内容尚未提交,离开后将丢失。',
|
|
1341
|
+
});
|
|
1342
|
+
const acknowledgeSubmission = () => {
|
|
1343
|
+
setSubjectDirty(false);
|
|
1344
|
+
setRequirementDirty(false);
|
|
1345
|
+
navigationGuard.release();
|
|
1346
|
+
};
|
|
1326
1347
|
const newPageQuery = new URLSearchParams();
|
|
1327
1348
|
if (commandId)
|
|
1328
1349
|
newPageQuery.set('processCommandId', commandId);
|
|
@@ -1382,15 +1403,27 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1382
1403
|
const formProjection = useMemo(() => {
|
|
1383
1404
|
try {
|
|
1384
1405
|
const values = subjectDefinition ? normalizeFormValues(watchedFormValues || {}, subjectDefinition.surface) : {};
|
|
1385
|
-
|
|
1406
|
+
const subtableStates = workflowSubmissionSubtableStates(subjectDefinition?.surface || { fields: {} }, namedIntent?.ownedSubject, formOptions?.subtableFieldState?.(structuredClone(values)));
|
|
1407
|
+
for (const [code, constraints] of Object.entries(formOptions?.dateTimeConstraints || {})) {
|
|
1408
|
+
if (!fields.some(field => field.key === code && ['datetime', 'datetime-range'].includes(field.type)))
|
|
1409
|
+
throw new Error('OPENXIANGDA_WORKFLOW_FORM_DATE_FIELD_UNAVAILABLE');
|
|
1410
|
+
validateDateTimeConstraints(constraints);
|
|
1411
|
+
}
|
|
1412
|
+
const fieldHints = formOptions?.fieldHints?.(structuredClone(values)) || {};
|
|
1413
|
+
if (Object.keys(fieldHints).some(code => !fields.some(field => field.key === code)))
|
|
1414
|
+
throw new Error('OPENXIANGDA_WORKFLOW_FORM_FIELD_UNAVAILABLE');
|
|
1415
|
+
return { ...workflowSubmissionFormProjection(fields, values, formOptions?.fieldState?.(values)), subtableStates, fieldHints, error: false };
|
|
1386
1416
|
}
|
|
1387
1417
|
catch {
|
|
1388
|
-
return { fields, values: {}, hiddenValues: {}, error: true };
|
|
1418
|
+
return { fields, values: {}, hiddenValues: {}, subtableStates: {}, fieldHints: {}, error: true };
|
|
1389
1419
|
}
|
|
1390
|
-
}, [fields, formOptions?.fieldState, subjectDefinition, watchedFormValues]);
|
|
1420
|
+
}, [fields, formOptions?.fieldState, formOptions?.subtableFieldState, formOptions?.dateTimeConstraints, formOptions?.fieldHints, namedIntent?.ownedSubject, subjectDefinition, watchedFormValues]);
|
|
1391
1421
|
const prefillContext = JSON.stringify([recoveryScope, identity.environment.activeAppVersionId, submissionMode, subjectId]);
|
|
1392
1422
|
useEffect(() => { setLinkageError(false); }, [prefillContext]);
|
|
1423
|
+
useEffect(() => { setSubjectDirty(false); }, [prefillContext]);
|
|
1393
1424
|
const onValuesChange = (changed, values) => {
|
|
1425
|
+
if (!loading && !commandId && !pendingSubmission)
|
|
1426
|
+
setSubjectDirty(true);
|
|
1394
1427
|
if (!formOptions?.valueLinkage || loading || commandId || pendingSubmission || !subjectDefinition)
|
|
1395
1428
|
return;
|
|
1396
1429
|
try {
|
|
@@ -1682,8 +1715,13 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1682
1715
|
};
|
|
1683
1716
|
}, [commandId, processSurface?.subject.recordId, subjectDefinition, subjectForm]);
|
|
1684
1717
|
const drawerBusy = loading || Boolean(commandId && (!processSurface || ['accepted', 'resolving', 'ready', 'starting', 'retry_wait'].includes(processSurface.command.status)) && !processError);
|
|
1685
|
-
const dismissDrawer = () => {
|
|
1686
|
-
|
|
1718
|
+
const dismissDrawer = () => {
|
|
1719
|
+
if (!submitInFlight.current && !drawerBusy)
|
|
1720
|
+
navigationGuard.confirmNavigation(() => {
|
|
1721
|
+
acknowledgeSubmission();
|
|
1722
|
+
onDismiss?.();
|
|
1723
|
+
});
|
|
1724
|
+
};
|
|
1687
1725
|
const frame = (content) => onDismiss ? _jsx(Drawer, { open: true, title: definition?.title || '新增流程申请', closable: false, rootClassName: "oxa-resource-drawer oxa-workflow-launch-drawer", size: fullScreen || variant === 'mobile' ? '100vw' : 'min(850px, calc(100vw - 48px))', styles: { body: { padding: 0, overflow: 'auto' } }, keyboard: !drawerBusy, mask: { closable: !drawerBusy }, onClose: dismissDrawer, extra: _jsxs(Space, { size: 4, children: [_jsx(Button, { type: "text", "aria-label": fullScreen ? '退出全屏' : '全屏', icon: fullScreen ? _jsx(CompressOutlined, {}) : _jsx(ExpandOutlined, {}), onClick: () => setFullScreen(value => !value) }), launchPagePath.current && _jsx(Tooltip, { title: commandId ? '新开页面继续查看当前申请' : '新开页面(未提交内容不会带入)', children: _jsx(Button, { type: "text", "aria-label": "\u65B0\u5F00\u9875\u9762", icon: _jsx(ExportOutlined, {}), href: newPageHref, target: "_blank", rel: "noopener noreferrer", disabled: loading }) }), _jsx(Button, { type: "text", "aria-label": "\u5173\u95ED", disabled: drawerBusy, icon: _jsx(CloseOutlined, {}), onClick: dismissDrawer })] }), children: content }) : variant === 'desktop' ? (_jsx("div", { className: "oxa-workflow-desktop-page oxa-workflow-submission-standalone-page", children: content })) : content;
|
|
1688
1726
|
const clearOriginal = (attempt) => {
|
|
1689
1727
|
clearPendingWorkflowSubmission(submissionLocatorStorage(), recoveryScope, attempt.idempotencyKey);
|
|
@@ -1698,6 +1736,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1698
1736
|
if (activeRecoveryScope.current !== recoveryScope)
|
|
1699
1737
|
return;
|
|
1700
1738
|
clearOriginal(attempt);
|
|
1739
|
+
acknowledgeSubmission();
|
|
1701
1740
|
if (onDismiss) {
|
|
1702
1741
|
setLocalCommandId(id);
|
|
1703
1742
|
return;
|
|
@@ -1854,6 +1893,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1854
1893
|
clearOriginal(dispatched);
|
|
1855
1894
|
if (activeRecoveryScope.current !== recoveryScope)
|
|
1856
1895
|
return;
|
|
1896
|
+
acknowledgeSubmission();
|
|
1857
1897
|
if (outcome.kind === 'workflow-command') {
|
|
1858
1898
|
if (onDismiss) {
|
|
1859
1899
|
setLocalCommandId(outcome.command.id);
|
|
@@ -1900,6 +1940,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1900
1940
|
clearOriginal(dispatched);
|
|
1901
1941
|
if (activeRecoveryScope.current !== recoveryScope)
|
|
1902
1942
|
return;
|
|
1943
|
+
acknowledgeSubmission();
|
|
1903
1944
|
if (onDismiss) {
|
|
1904
1945
|
setLocalCommandId(command.id);
|
|
1905
1946
|
return;
|
|
@@ -1940,6 +1981,8 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1940
1981
|
setProcessSurface(null);
|
|
1941
1982
|
setProcessRefreshAttempt(value => value + 1);
|
|
1942
1983
|
requirementForm.resetFields();
|
|
1984
|
+
setRequirementDirty(false);
|
|
1985
|
+
navigationGuard.release();
|
|
1943
1986
|
}
|
|
1944
1987
|
catch (error) {
|
|
1945
1988
|
message.error(errorMessage(error, '补充发起信息失败'));
|
|
@@ -1970,37 +2013,43 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1970
2013
|
}
|
|
1971
2014
|
};
|
|
1972
2015
|
const selectMode = (nextMode) => {
|
|
1973
|
-
if (!generatedNamedSubmission?.[nextMode] || submitInFlight.current || commandId)
|
|
1974
|
-
return;
|
|
1975
|
-
setSubmissionMode(nextMode);
|
|
1976
|
-
setCompletion(null);
|
|
1977
|
-
subjectForm.resetFields();
|
|
1978
|
-
if (onDismiss) {
|
|
1979
|
-
setLocalSubjectId('');
|
|
2016
|
+
if (nextMode === submissionMode || !generatedNamedSubmission?.[nextMode] || submitInFlight.current || commandId || pendingSubmission)
|
|
1980
2017
|
return;
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
2018
|
+
navigationGuard.confirmNavigation(() => {
|
|
2019
|
+
acknowledgeSubmission();
|
|
2020
|
+
setSubmissionMode(nextMode);
|
|
2021
|
+
setCompletion(null);
|
|
2022
|
+
subjectForm.resetFields();
|
|
2023
|
+
if (onDismiss) {
|
|
2024
|
+
setLocalSubjectId('');
|
|
2025
|
+
return;
|
|
2026
|
+
}
|
|
2027
|
+
const next = new URLSearchParams(searchParams);
|
|
2028
|
+
next.delete('processCommandId');
|
|
2029
|
+
if (nextMode === 'create')
|
|
2030
|
+
next.delete('subjectId');
|
|
2031
|
+
setSearchParams(next, { replace: true });
|
|
2032
|
+
});
|
|
1987
2033
|
};
|
|
1988
2034
|
const selectSubject = (nextSubjectId) => {
|
|
1989
|
-
if (submitInFlight.current || commandId)
|
|
1990
|
-
return;
|
|
1991
|
-
setCompletion(null);
|
|
1992
|
-
subjectForm.resetFields();
|
|
1993
|
-
if (onDismiss) {
|
|
1994
|
-
setLocalSubjectId(nextSubjectId || '');
|
|
2035
|
+
if ((nextSubjectId || '') === subjectId || submitInFlight.current || commandId || pendingSubmission)
|
|
1995
2036
|
return;
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2037
|
+
navigationGuard.confirmNavigation(() => {
|
|
2038
|
+
acknowledgeSubmission();
|
|
2039
|
+
setCompletion(null);
|
|
2040
|
+
subjectForm.resetFields();
|
|
2041
|
+
if (onDismiss) {
|
|
2042
|
+
setLocalSubjectId(nextSubjectId || '');
|
|
2043
|
+
return;
|
|
2044
|
+
}
|
|
2045
|
+
const next = new URLSearchParams(searchParams);
|
|
2046
|
+
next.delete('processCommandId');
|
|
2047
|
+
if (nextSubjectId)
|
|
2048
|
+
next.set('subjectId', nextSubjectId);
|
|
2049
|
+
else
|
|
2050
|
+
next.delete('subjectId');
|
|
2051
|
+
setSearchParams(next, { replace: true });
|
|
2052
|
+
});
|
|
2004
2053
|
};
|
|
2005
2054
|
const launchControls = generatedNamedSubmission ? (_jsxs(Space, { direction: "vertical", size: "middle", style: { width: '100%' }, children: [generatedNamedSubmission.create && generatedNamedSubmission.existing ? (_jsx(Segmented, { onChange: value => selectMode(value), options: [
|
|
2006
2055
|
{ label: '新建并提交', value: 'create' },
|
|
@@ -2009,12 +2058,15 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
2009
2058
|
const uploadOperationCode = namedIntent?.operationCode || definition.processOperationCode;
|
|
2010
2059
|
const fieldRenderers = uploadOperationCode
|
|
2011
2060
|
? {
|
|
2061
|
+
dateTimeConstraints: formOptions?.dateTimeConstraints,
|
|
2062
|
+
renderExtra: ({ field }) => formProjection.fieldHints[field.key],
|
|
2012
2063
|
renderSubtable: ({ field, disabled, operation, recordId }) => {
|
|
2013
2064
|
const grant = namedIntent?.ownedSubject?.subtables.find(table => table.fieldCode === field.key);
|
|
2014
2065
|
assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyFields || {}, formOptions?.subtableFixedRows);
|
|
2015
2066
|
assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyInputFields || {});
|
|
2016
2067
|
return _jsx(SubtableField, { field: field, disabled: disabled, operation: operation, parentRecordId: recordId, mobile: variant === 'mobile', ...(namedIntent && grant ? { launch: { fieldCodes: grant.fieldCodes,
|
|
2017
2068
|
readonlyFieldCodes: [...(formOptions?.subtableReadonlyFields?.[field.key] || []), ...(formOptions?.subtableReadonlyInputFields?.[field.key] || [])],
|
|
2069
|
+
fieldState: formProjection.subtableStates[field.key],
|
|
2018
2070
|
fixedRows: formOptions?.subtableFixedRows?.includes(field.key),
|
|
2019
2071
|
fileResourceCodes: formOptions?.fileResourceCodes,
|
|
2020
2072
|
reference: { workflowCode: definition.code, operationCode: namedIntent.operationCode, subtableFieldCode: field.key },
|
|
@@ -2071,13 +2123,14 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
2071
2123
|
onBack: onDismiss ? dismissDrawer : () => navigate(-1),
|
|
2072
2124
|
onSubmit: submit,
|
|
2073
2125
|
onValuesChange,
|
|
2126
|
+
onRequirementsChange: () => setRequirementDirty(true),
|
|
2074
2127
|
onAnswer: answer,
|
|
2075
2128
|
onRetry: retry,
|
|
2076
2129
|
onRefresh: () => { setProcessError(null); setProcessRefreshAttempt(value => value + 1); },
|
|
2077
2130
|
};
|
|
2078
2131
|
return frame(variant === 'mobile' ? (_jsx(MobileProcessSubmissionRenderer, { ...shared })) : (_jsx(DesktopProcessSubmissionRenderer, { ...shared })));
|
|
2079
2132
|
}
|
|
2080
|
-
function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry, onRefresh, }) {
|
|
2133
|
+
function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry, onRefresh, onValuesChange, }) {
|
|
2081
2134
|
if (error) {
|
|
2082
2135
|
return (_jsx(Alert, { description: "\u8BF7\u5237\u65B0\u63D0\u4EA4\u72B6\u6001\u786E\u8BA4\u7ED3\u679C\uFF0C\u5F53\u524D\u7533\u8BF7\u4E0D\u4F1A\u91CD\u590D\u53D1\u8D77\u3002", action: _jsx(Button, { onClick: onRefresh, children: "\u5237\u65B0\u63D0\u4EA4\u72B6\u6001" }), message: "\u6682\u65F6\u65E0\u6CD5\u786E\u8BA4\u7533\u8BF7\u72B6\u6001", showIcon: true, type: "warning" }));
|
|
2083
2136
|
}
|
|
@@ -2087,7 +2140,7 @@ function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry,
|
|
|
2087
2140
|
if (!['awaiting_input', 'cancelled', 'dead_letter'].includes(command.status)) {
|
|
2088
2141
|
return null;
|
|
2089
2142
|
}
|
|
2090
|
-
return (_jsxs("div", { className: "oxa-workflow-submission-followup", children: [command.status === 'awaiting_input' ? (_jsx(Card, { title: "\u8FD8\u9700\u8981\u8865\u5145\u4E00\u4E9B\u4FE1\u606F", children: _jsxs(Form, { form: form, layout: "vertical", onFinish: values => void onAnswer(values), children: [_jsx(RequirementFields, { requirements: surface.requirements }), _jsx(Button, { htmlType: "submit", loading: loading, type: "primary", children: "\u63D0\u4EA4\u8865\u5145\u4FE1\u606F" })] }) })) : null, ['cancelled', 'dead_letter'].includes(command.status) ? (_jsx(Result, { extra: surface.resume.retry ? (_jsx(Button, { loading: loading, onClick: () => void onRetry(), type: "primary", children: "\u91CD\u65B0\u5C1D\u8BD5" })) : null, status: "error", subTitle: "\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF1B\u5982\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002", title: "\u7533\u8BF7\u6682\u672A\u53D1\u8D77\u6210\u529F" })) : null] }));
|
|
2143
|
+
return (_jsxs("div", { className: "oxa-workflow-submission-followup", children: [command.status === 'awaiting_input' ? (_jsx(Card, { title: "\u8FD8\u9700\u8981\u8865\u5145\u4E00\u4E9B\u4FE1\u606F", children: _jsxs(Form, { form: form, layout: "vertical", onValuesChange: onValuesChange, onFinish: values => void onAnswer(values), children: [_jsx(RequirementFields, { requirements: surface.requirements }), _jsx(Button, { htmlType: "submit", loading: loading, type: "primary", children: "\u63D0\u4EA4\u8865\u5145\u4FE1\u606F" })] }) })) : null, ['cancelled', 'dead_letter'].includes(command.status) ? (_jsx(Result, { extra: surface.resume.retry ? (_jsx(Button, { loading: loading, onClick: () => void onRetry(), type: "primary", children: "\u91CD\u65B0\u5C1D\u8BD5" })) : null, status: "error", subTitle: "\u8BF7\u7A0D\u540E\u91CD\u8BD5\uFF1B\u5982\u95EE\u9898\u6301\u7EED\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u3002", title: "\u7533\u8BF7\u6682\u672A\u53D1\u8D77\u6210\u529F" })) : null] }));
|
|
2091
2144
|
}
|
|
2092
2145
|
function StandardProcessSubmissionRenderer(props) {
|
|
2093
2146
|
const groups = [...props.fields.reduce((groups, field) => {
|
|
@@ -2097,7 +2150,7 @@ function StandardProcessSubmissionRenderer(props) {
|
|
|
2097
2150
|
}, new Map())].map(([section, fields]) => ({ section, fields }));
|
|
2098
2151
|
if (props.completion)
|
|
2099
2152
|
return _jsx(Result, { status: "success", title: "\u63D0\u4EA4\u6210\u529F", extra: _jsx(Button, { onClick: props.onBack, children: "\u8FD4\u56DE" }) });
|
|
2100
|
-
return _jsxs("div", { className: props.variant === 'mobile' ? 'oxa-mobile-page oxa-mobile-entry oxa-workflow-submission-mobile' : 'oxa-workflow-entry', children: [!props.embedded && _jsxs("header", { className: props.variant === 'mobile' ? 'oxa-mobile-header' : 'oxa-workflow-entry-header', children: [_jsx(Button, { type: "text", "aria-label": "\u8FD4\u56DE", icon: _jsx(ArrowLeftOutlined, {}), disabled: props.processing, onClick: props.onBack }), _jsx("h3", { children: props.title }), _jsx("span", {})] }), _jsx(ResourceFormContent, { variant: props.variant, mode: props.mutationMode === 'update' ? 'edit' : 'create', resourceCode: props.subjectDefinition.code, recordId: props.recordId, groups: groups, expectedRevision: props.expectedRevision, initialValues: props.mutationMode === 'update' ? undefined : Object.fromEntries(props.fields.filter(field => field.type === 'user.multiple').map(field => [field.key, []])), form: props.subjectForm, busy: props.loading || props.submitted, pending: props.loading || props.processing, submitDisabled: props.submitted || Boolean(props.formError), submitLabel: "\u63D0\u4EA4\u5BA1\u6279", canWriteField: () => true, renderers: props.fieldRenderers, feedback: _jsxs(_Fragment, { children: [props.formIntro, props.launchControls, props.formError && _jsx(Alert, { type: "error", showIcon: true, title: props.formError }), props.processing && _jsx(Alert, { type: "info", showIcon: true, title: "\u6B63\u5728\u63D0\u4EA4\u7533\u8BF7\uFF0C\u8BF7\u7A0D\u5019\u2026" })] }), onValuesChange: props.onValuesChange, onSubmit: values => void props.onSubmit(values) }), _jsx(ProcessCommandPanel, { error: props.processError, form: props.requirementForm, loading: props.loading, onAnswer: props.onAnswer, onRetry: props.onRetry, onRefresh: props.onRefresh, surface: props.processSurface })] });
|
|
2153
|
+
return _jsxs("div", { className: props.variant === 'mobile' ? 'oxa-mobile-page oxa-mobile-entry oxa-workflow-submission-mobile' : 'oxa-workflow-entry', children: [!props.embedded && _jsxs("header", { className: props.variant === 'mobile' ? 'oxa-mobile-header' : 'oxa-workflow-entry-header', children: [_jsx(Button, { type: "text", "aria-label": "\u8FD4\u56DE", icon: _jsx(ArrowLeftOutlined, {}), disabled: props.processing, onClick: props.onBack }), _jsx("h3", { children: props.title }), _jsx("span", {})] }), _jsx(ResourceFormContent, { variant: props.variant, mode: props.mutationMode === 'update' ? 'edit' : 'create', resourceCode: props.subjectDefinition.code, recordId: props.recordId, groups: groups, expectedRevision: props.expectedRevision, initialValues: props.mutationMode === 'update' ? undefined : Object.fromEntries(props.fields.filter(field => field.type === 'user.multiple').map(field => [field.key, []])), form: props.subjectForm, busy: props.loading || props.submitted, pending: props.loading || props.processing, submitDisabled: props.submitted || Boolean(props.formError), submitLabel: "\u63D0\u4EA4\u5BA1\u6279", canWriteField: () => true, renderers: props.fieldRenderers, feedback: _jsxs(_Fragment, { children: [props.formIntro, props.launchControls, props.formError && _jsx(Alert, { type: "error", showIcon: true, title: props.formError }), props.processing && _jsx(Alert, { type: "info", showIcon: true, title: "\u6B63\u5728\u63D0\u4EA4\u7533\u8BF7\uFF0C\u8BF7\u7A0D\u5019\u2026" })] }), onValuesChange: props.onValuesChange, onSubmit: values => void props.onSubmit(values) }), _jsx(ProcessCommandPanel, { error: props.processError, form: props.requirementForm, loading: props.loading, onValuesChange: props.onRequirementsChange, onAnswer: props.onAnswer, onRetry: props.onRetry, onRefresh: props.onRefresh, surface: props.processSurface })] });
|
|
2101
2154
|
}
|
|
2102
2155
|
function DesktopProcessSubmissionRenderer(props) { return _jsx(StandardProcessSubmissionRenderer, { ...props, variant: "desktop" }); }
|
|
2103
2156
|
function MobileProcessSubmissionRenderer(props) { return _jsx(StandardProcessSubmissionRenderer, { ...props, variant: "mobile" }); }
|