openxiangda 2.59.5 → 2.60.1
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/resource/useResourceFormDrafts.d.ts.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 +96 -39
- package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
- package/dist/browser/components/workflow/WorkflowDiagram.d.ts +4 -1
- package/dist/browser/components/workflow/WorkflowDiagram.d.ts.map +1 -1
- package/dist/browser/components/workflow/WorkflowDiagram.js +9 -7
- package/dist/browser/components/workflow/WorkflowDiagram.js.map +1 -1
- package/dist/browser/components/workflow/WorkflowFlowCanvas.d.ts +1 -0
- package/dist/browser/components/workflow/WorkflowFlowCanvas.d.ts.map +1 -1
- package/dist/browser/components/workflow/WorkflowFlowCanvas.js +20 -11
- package/dist/browser/components/workflow/WorkflowFlowCanvas.js.map +1 -1
- package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts +2 -1
- package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts.map +1 -1
- package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js +26 -9
- 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-graph-presentation.d.ts +2 -0
- package/dist/browser/components/workflow/workflow-graph-presentation.d.ts.map +1 -1
- package/dist/browser/components/workflow/workflow-graph-presentation.js +15 -0
- package/dist/browser/components/workflow/workflow-graph-presentation.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 +6 -1
- package/dist/browser/navigation-guard.d.ts.map +1 -1
- package/dist/browser/navigation-guard.js +51 -12
- package/dist/browser/navigation-guard.js.map +1 -1
- package/dist/browser/platform-client.d.ts +2 -0
- package/dist/browser/platform-client.d.ts.map +1 -1
- package/dist/browser/platform-client.js +2 -0
- package/dist/browser/platform-client.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/styles.css +13 -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 +26 -30
- package/releases/2.60.0.json +38 -0
- package/releases/2.60.1.json +35 -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.4.json +0 -38
- 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
|
|
@@ -68,6 +70,10 @@ export async function completeWorkflowCommand(kind, result, options) {
|
|
|
68
70
|
function errorMessage(error, fallback) {
|
|
69
71
|
const code = error?.code;
|
|
70
72
|
const taskPageMessages = {
|
|
73
|
+
WORKFLOW_V2_INSTANCE_FORBIDDEN: '你暂时无法查看此申请,请联系管理员确认查看权限。',
|
|
74
|
+
WORKFLOW_V2_INSTANCE_NOT_FOUND: '此申请暂时无法查看,请返回申请列表核对。',
|
|
75
|
+
WORKFLOW_V2_TASK_FORBIDDEN: '你暂时无法查看此待办,请返回待办列表核对或联系管理员。',
|
|
76
|
+
WORKFLOW_V2_TASK_NOT_FOUND: '此待办暂时无法查看,请返回待办列表核对。',
|
|
71
77
|
WORKFLOW_TASK_FORM_REQUIRED: '请完成本页必填资料后再提交。',
|
|
72
78
|
WORKFLOW_TASK_FORM_REVISION_CONFLICT: '业务资料已被其他处理人更新。请刷新并核对,当前输入会保留。',
|
|
73
79
|
WORKFLOW_TASK_FORM_RECOMPUTATION_REQUIRED: '这些资料会影响已完成的计算,请退回到计算前的节点重新办理。',
|
|
@@ -182,7 +188,9 @@ function WorkflowSubtableValue({ detail, field, instanceId, variant, }) {
|
|
|
182
188
|
const order = subtable.surface.detail?.fieldOrder || [];
|
|
183
189
|
const fields = order.flatMap((key) => {
|
|
184
190
|
const item = subtable.surface.fields[key];
|
|
185
|
-
return item && item.system !== true
|
|
191
|
+
return item && item.system !== true && item.hidden !== true &&
|
|
192
|
+
item.type !== 'subtable' && key !== field.subtable?.foreignKey &&
|
|
193
|
+
key !== field.subtable?.orderField
|
|
186
194
|
? [{ key, ...item }]
|
|
187
195
|
: [];
|
|
188
196
|
});
|
|
@@ -394,6 +402,7 @@ function WorkflowOperations({ surface, variant, onRefresh, onCommandSuccess, pen
|
|
|
394
402
|
const mounted = useRef(false);
|
|
395
403
|
const busyRef = useRef(false);
|
|
396
404
|
const taskForm = useWorkflowTaskForm(surface.taskForm);
|
|
405
|
+
const taskFormBehavior = useWorkflowTaskFormBehavior(String(surface.instance.workflowCode || ''));
|
|
397
406
|
useEffect(() => { mounted.current = true; return () => { mounted.current = false; }; }, []);
|
|
398
407
|
useEffect(() => {
|
|
399
408
|
if (!settlement || request.current?.key !== settlement.key)
|
|
@@ -598,7 +607,7 @@ function WorkflowOperations({ surface, variant, onRefresh, onCommandSuccess, pen
|
|
|
598
607
|
return (order[left.key] ?? 10) - (order[right.key] ?? 10);
|
|
599
608
|
});
|
|
600
609
|
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'
|
|
610
|
+
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
611
|
? '任务操作已成功,但资料刷新失败' : '本次未提交,最新资料读取失败', description: refreshFailure.message, action: _jsx(Button, { disabled: submitting, onClick: () => void refreshConfirmed(), children: "\u5237\u65B0\u8D44\u6599" }) })] })) : null;
|
|
603
612
|
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
613
|
setMoreOpen(false);
|
|
@@ -1318,11 +1327,27 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1318
1327
|
const [loadedSubjectRevision, setLoadedSubjectRevision] = useState();
|
|
1319
1328
|
const [localCommandId, setLocalCommandId] = useState('');
|
|
1320
1329
|
const [localSubjectId, setLocalSubjectId] = useState('');
|
|
1330
|
+
const [subjectDirty, setSubjectDirty] = useState(false);
|
|
1331
|
+
const [requirementDirty, setRequirementDirty] = useState(false);
|
|
1321
1332
|
const launchPagePath = useRef('');
|
|
1322
1333
|
const [fullScreen, setFullScreen] = useState(false);
|
|
1323
1334
|
const pathCommandId = useParams().commandId;
|
|
1324
1335
|
const commandId = onDismiss ? localCommandId : pathCommandId || searchParams.get('processCommandId') || '';
|
|
1325
1336
|
const subjectId = onDismiss ? localSubjectId : searchParams.get('subjectId') || '';
|
|
1337
|
+
const recoveryMustStay = Boolean(pendingSubmission && !recoveryPersisted);
|
|
1338
|
+
const navigationGuard = useUnsavedChangesGuard({
|
|
1339
|
+
when: subjectDirty || requirementDirty || loading || recoveryMustStay,
|
|
1340
|
+
preventNavigation: loading || recoveryMustStay,
|
|
1341
|
+
message: loading ? '正在提交,请等待当前操作结果。'
|
|
1342
|
+
: recoveryMustStay ? '提交结果尚未确认,恢复信息未能保存。请留在本页查询原操作。'
|
|
1343
|
+
: pendingSubmission ? '原提交结果尚未确认。离开后可返回查询原操作,请勿重复申请。'
|
|
1344
|
+
: '填写内容尚未提交,离开后将丢失。',
|
|
1345
|
+
});
|
|
1346
|
+
const acknowledgeSubmission = () => {
|
|
1347
|
+
setSubjectDirty(false);
|
|
1348
|
+
setRequirementDirty(false);
|
|
1349
|
+
navigationGuard.release();
|
|
1350
|
+
};
|
|
1326
1351
|
const newPageQuery = new URLSearchParams();
|
|
1327
1352
|
if (commandId)
|
|
1328
1353
|
newPageQuery.set('processCommandId', commandId);
|
|
@@ -1382,15 +1407,27 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1382
1407
|
const formProjection = useMemo(() => {
|
|
1383
1408
|
try {
|
|
1384
1409
|
const values = subjectDefinition ? normalizeFormValues(watchedFormValues || {}, subjectDefinition.surface) : {};
|
|
1385
|
-
|
|
1410
|
+
const subtableStates = workflowSubmissionSubtableStates(subjectDefinition?.surface || { fields: {} }, namedIntent?.ownedSubject, formOptions?.subtableFieldState?.(structuredClone(values)));
|
|
1411
|
+
for (const [code, constraints] of Object.entries(formOptions?.dateTimeConstraints || {})) {
|
|
1412
|
+
if (!fields.some(field => field.key === code && ['datetime', 'datetime-range'].includes(field.type)))
|
|
1413
|
+
throw new Error('OPENXIANGDA_WORKFLOW_FORM_DATE_FIELD_UNAVAILABLE');
|
|
1414
|
+
validateDateTimeConstraints(constraints);
|
|
1415
|
+
}
|
|
1416
|
+
const fieldHints = formOptions?.fieldHints?.(structuredClone(values)) || {};
|
|
1417
|
+
if (Object.keys(fieldHints).some(code => !fields.some(field => field.key === code)))
|
|
1418
|
+
throw new Error('OPENXIANGDA_WORKFLOW_FORM_FIELD_UNAVAILABLE');
|
|
1419
|
+
return { ...workflowSubmissionFormProjection(fields, values, formOptions?.fieldState?.(values)), subtableStates, fieldHints, error: false };
|
|
1386
1420
|
}
|
|
1387
1421
|
catch {
|
|
1388
|
-
return { fields, values: {}, hiddenValues: {}, error: true };
|
|
1422
|
+
return { fields, values: {}, hiddenValues: {}, subtableStates: {}, fieldHints: {}, error: true };
|
|
1389
1423
|
}
|
|
1390
|
-
}, [fields, formOptions?.fieldState, subjectDefinition, watchedFormValues]);
|
|
1424
|
+
}, [fields, formOptions?.fieldState, formOptions?.subtableFieldState, formOptions?.dateTimeConstraints, formOptions?.fieldHints, namedIntent?.ownedSubject, subjectDefinition, watchedFormValues]);
|
|
1391
1425
|
const prefillContext = JSON.stringify([recoveryScope, identity.environment.activeAppVersionId, submissionMode, subjectId]);
|
|
1392
1426
|
useEffect(() => { setLinkageError(false); }, [prefillContext]);
|
|
1427
|
+
useEffect(() => { setSubjectDirty(false); }, [prefillContext]);
|
|
1393
1428
|
const onValuesChange = (changed, values) => {
|
|
1429
|
+
if (!loading && !commandId && !pendingSubmission)
|
|
1430
|
+
setSubjectDirty(true);
|
|
1394
1431
|
if (!formOptions?.valueLinkage || loading || commandId || pendingSubmission || !subjectDefinition)
|
|
1395
1432
|
return;
|
|
1396
1433
|
try {
|
|
@@ -1682,8 +1719,13 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1682
1719
|
};
|
|
1683
1720
|
}, [commandId, processSurface?.subject.recordId, subjectDefinition, subjectForm]);
|
|
1684
1721
|
const drawerBusy = loading || Boolean(commandId && (!processSurface || ['accepted', 'resolving', 'ready', 'starting', 'retry_wait'].includes(processSurface.command.status)) && !processError);
|
|
1685
|
-
const dismissDrawer = () => {
|
|
1686
|
-
|
|
1722
|
+
const dismissDrawer = () => {
|
|
1723
|
+
if (!submitInFlight.current && !drawerBusy)
|
|
1724
|
+
navigationGuard.confirmNavigation(() => {
|
|
1725
|
+
acknowledgeSubmission();
|
|
1726
|
+
onDismiss?.();
|
|
1727
|
+
});
|
|
1728
|
+
};
|
|
1687
1729
|
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
1730
|
const clearOriginal = (attempt) => {
|
|
1689
1731
|
clearPendingWorkflowSubmission(submissionLocatorStorage(), recoveryScope, attempt.idempotencyKey);
|
|
@@ -1698,6 +1740,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1698
1740
|
if (activeRecoveryScope.current !== recoveryScope)
|
|
1699
1741
|
return;
|
|
1700
1742
|
clearOriginal(attempt);
|
|
1743
|
+
acknowledgeSubmission();
|
|
1701
1744
|
if (onDismiss) {
|
|
1702
1745
|
setLocalCommandId(id);
|
|
1703
1746
|
return;
|
|
@@ -1854,6 +1897,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1854
1897
|
clearOriginal(dispatched);
|
|
1855
1898
|
if (activeRecoveryScope.current !== recoveryScope)
|
|
1856
1899
|
return;
|
|
1900
|
+
acknowledgeSubmission();
|
|
1857
1901
|
if (outcome.kind === 'workflow-command') {
|
|
1858
1902
|
if (onDismiss) {
|
|
1859
1903
|
setLocalCommandId(outcome.command.id);
|
|
@@ -1900,6 +1944,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1900
1944
|
clearOriginal(dispatched);
|
|
1901
1945
|
if (activeRecoveryScope.current !== recoveryScope)
|
|
1902
1946
|
return;
|
|
1947
|
+
acknowledgeSubmission();
|
|
1903
1948
|
if (onDismiss) {
|
|
1904
1949
|
setLocalCommandId(command.id);
|
|
1905
1950
|
return;
|
|
@@ -1940,6 +1985,8 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1940
1985
|
setProcessSurface(null);
|
|
1941
1986
|
setProcessRefreshAttempt(value => value + 1);
|
|
1942
1987
|
requirementForm.resetFields();
|
|
1988
|
+
setRequirementDirty(false);
|
|
1989
|
+
navigationGuard.release();
|
|
1943
1990
|
}
|
|
1944
1991
|
catch (error) {
|
|
1945
1992
|
message.error(errorMessage(error, '补充发起信息失败'));
|
|
@@ -1970,37 +2017,43 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
1970
2017
|
}
|
|
1971
2018
|
};
|
|
1972
2019
|
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('');
|
|
2020
|
+
if (nextMode === submissionMode || !generatedNamedSubmission?.[nextMode] || submitInFlight.current || commandId || pendingSubmission)
|
|
1980
2021
|
return;
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
2022
|
+
navigationGuard.confirmNavigation(() => {
|
|
2023
|
+
acknowledgeSubmission();
|
|
2024
|
+
setSubmissionMode(nextMode);
|
|
2025
|
+
setCompletion(null);
|
|
2026
|
+
subjectForm.resetFields();
|
|
2027
|
+
if (onDismiss) {
|
|
2028
|
+
setLocalSubjectId('');
|
|
2029
|
+
return;
|
|
2030
|
+
}
|
|
2031
|
+
const next = new URLSearchParams(searchParams);
|
|
2032
|
+
next.delete('processCommandId');
|
|
2033
|
+
if (nextMode === 'create')
|
|
2034
|
+
next.delete('subjectId');
|
|
2035
|
+
setSearchParams(next, { replace: true });
|
|
2036
|
+
});
|
|
1987
2037
|
};
|
|
1988
2038
|
const selectSubject = (nextSubjectId) => {
|
|
1989
|
-
if (submitInFlight.current || commandId)
|
|
1990
|
-
return;
|
|
1991
|
-
setCompletion(null);
|
|
1992
|
-
subjectForm.resetFields();
|
|
1993
|
-
if (onDismiss) {
|
|
1994
|
-
setLocalSubjectId(nextSubjectId || '');
|
|
2039
|
+
if ((nextSubjectId || '') === subjectId || submitInFlight.current || commandId || pendingSubmission)
|
|
1995
2040
|
return;
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2041
|
+
navigationGuard.confirmNavigation(() => {
|
|
2042
|
+
acknowledgeSubmission();
|
|
2043
|
+
setCompletion(null);
|
|
2044
|
+
subjectForm.resetFields();
|
|
2045
|
+
if (onDismiss) {
|
|
2046
|
+
setLocalSubjectId(nextSubjectId || '');
|
|
2047
|
+
return;
|
|
2048
|
+
}
|
|
2049
|
+
const next = new URLSearchParams(searchParams);
|
|
2050
|
+
next.delete('processCommandId');
|
|
2051
|
+
if (nextSubjectId)
|
|
2052
|
+
next.set('subjectId', nextSubjectId);
|
|
2053
|
+
else
|
|
2054
|
+
next.delete('subjectId');
|
|
2055
|
+
setSearchParams(next, { replace: true });
|
|
2056
|
+
});
|
|
2004
2057
|
};
|
|
2005
2058
|
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
2059
|
{ label: '新建并提交', value: 'create' },
|
|
@@ -2009,12 +2062,15 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
2009
2062
|
const uploadOperationCode = namedIntent?.operationCode || definition.processOperationCode;
|
|
2010
2063
|
const fieldRenderers = uploadOperationCode
|
|
2011
2064
|
? {
|
|
2065
|
+
dateTimeConstraints: formOptions?.dateTimeConstraints,
|
|
2066
|
+
renderExtra: ({ field }) => formProjection.fieldHints[field.key],
|
|
2012
2067
|
renderSubtable: ({ field, disabled, operation, recordId }) => {
|
|
2013
2068
|
const grant = namedIntent?.ownedSubject?.subtables.find(table => table.fieldCode === field.key);
|
|
2014
2069
|
assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyFields || {}, formOptions?.subtableFixedRows);
|
|
2015
2070
|
assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyInputFields || {});
|
|
2016
2071
|
return _jsx(SubtableField, { field: field, disabled: disabled, operation: operation, parentRecordId: recordId, mobile: variant === 'mobile', ...(namedIntent && grant ? { launch: { fieldCodes: grant.fieldCodes,
|
|
2017
2072
|
readonlyFieldCodes: [...(formOptions?.subtableReadonlyFields?.[field.key] || []), ...(formOptions?.subtableReadonlyInputFields?.[field.key] || [])],
|
|
2073
|
+
fieldState: formProjection.subtableStates[field.key],
|
|
2018
2074
|
fixedRows: formOptions?.subtableFixedRows?.includes(field.key),
|
|
2019
2075
|
fileResourceCodes: formOptions?.fileResourceCodes,
|
|
2020
2076
|
reference: { workflowCode: definition.code, operationCode: namedIntent.operationCode, subtableFieldCode: field.key },
|
|
@@ -2071,13 +2127,14 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
|
|
|
2071
2127
|
onBack: onDismiss ? dismissDrawer : () => navigate(-1),
|
|
2072
2128
|
onSubmit: submit,
|
|
2073
2129
|
onValuesChange,
|
|
2130
|
+
onRequirementsChange: () => setRequirementDirty(true),
|
|
2074
2131
|
onAnswer: answer,
|
|
2075
2132
|
onRetry: retry,
|
|
2076
2133
|
onRefresh: () => { setProcessError(null); setProcessRefreshAttempt(value => value + 1); },
|
|
2077
2134
|
};
|
|
2078
2135
|
return frame(variant === 'mobile' ? (_jsx(MobileProcessSubmissionRenderer, { ...shared })) : (_jsx(DesktopProcessSubmissionRenderer, { ...shared })));
|
|
2079
2136
|
}
|
|
2080
|
-
function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry, onRefresh, }) {
|
|
2137
|
+
function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry, onRefresh, onValuesChange, }) {
|
|
2081
2138
|
if (error) {
|
|
2082
2139
|
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
2140
|
}
|
|
@@ -2087,7 +2144,7 @@ function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry,
|
|
|
2087
2144
|
if (!['awaiting_input', 'cancelled', 'dead_letter'].includes(command.status)) {
|
|
2088
2145
|
return null;
|
|
2089
2146
|
}
|
|
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] }));
|
|
2147
|
+
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
2148
|
}
|
|
2092
2149
|
function StandardProcessSubmissionRenderer(props) {
|
|
2093
2150
|
const groups = [...props.fields.reduce((groups, field) => {
|
|
@@ -2097,7 +2154,7 @@ function StandardProcessSubmissionRenderer(props) {
|
|
|
2097
2154
|
}, new Map())].map(([section, fields]) => ({ section, fields }));
|
|
2098
2155
|
if (props.completion)
|
|
2099
2156
|
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 })] });
|
|
2157
|
+
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
2158
|
}
|
|
2102
2159
|
function DesktopProcessSubmissionRenderer(props) { return _jsx(StandardProcessSubmissionRenderer, { ...props, variant: "desktop" }); }
|
|
2103
2160
|
function MobileProcessSubmissionRenderer(props) { return _jsx(StandardProcessSubmissionRenderer, { ...props, variant: "mobile" }); }
|