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.
Files changed (101) hide show
  1. package/dist/browser/admin-contributions.d.ts.map +1 -1
  2. package/dist/browser/admin-contributions.js +3 -4
  3. package/dist/browser/admin-contributions.js.map +1 -1
  4. package/dist/browser/application.d.ts +4 -2
  5. package/dist/browser/application.d.ts.map +1 -1
  6. package/dist/browser/application.js +2 -2
  7. package/dist/browser/application.js.map +1 -1
  8. package/dist/browser/components/platform-fields/DateTimeField.js +1 -1
  9. package/dist/browser/components/platform-fields/DateTimeField.js.map +1 -1
  10. package/dist/browser/components/platform-fields/MobileDateTimeField.js +1 -1
  11. package/dist/browser/components/platform-fields/MobileDateTimeField.js.map +1 -1
  12. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.d.ts +1 -1
  13. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.d.ts.map +1 -1
  14. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js +3 -3
  15. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js.map +1 -1
  16. package/dist/browser/components/platform-fields/SignatureField.d.ts.map +1 -1
  17. package/dist/browser/components/platform-fields/SignatureField.js +2 -4
  18. package/dist/browser/components/platform-fields/SignatureField.js.map +1 -1
  19. package/dist/browser/components/platform-fields/SubtableField.d.ts +3 -0
  20. package/dist/browser/components/platform-fields/SubtableField.d.ts.map +1 -1
  21. package/dist/browser/components/platform-fields/SubtableField.js +8 -6
  22. package/dist/browser/components/platform-fields/SubtableField.js.map +1 -1
  23. package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts +1 -1
  24. package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts.map +1 -1
  25. package/dist/browser/components/platform-fields/ZonedDateTimeField.js +3 -2
  26. package/dist/browser/components/platform-fields/ZonedDateTimeField.js.map +1 -1
  27. package/dist/browser/components/platform-fields/zoned-date-time.d.ts +2 -0
  28. package/dist/browser/components/platform-fields/zoned-date-time.d.ts.map +1 -1
  29. package/dist/browser/components/platform-fields/zoned-date-time.js +6 -0
  30. package/dist/browser/components/platform-fields/zoned-date-time.js.map +1 -1
  31. package/dist/browser/components/resource/SurfaceFields.d.ts +3 -0
  32. package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -1
  33. package/dist/browser/components/resource/SurfaceFields.js +2 -2
  34. package/dist/browser/components/resource/SurfaceFields.js.map +1 -1
  35. package/dist/browser/components/resource/useResourceFormDrafts.d.ts.map +1 -1
  36. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts +8 -2
  37. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts.map +1 -1
  38. package/dist/browser/components/workflow/StandardWorkflowPages.js +96 -39
  39. package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
  40. package/dist/browser/components/workflow/WorkflowDiagram.d.ts +4 -1
  41. package/dist/browser/components/workflow/WorkflowDiagram.d.ts.map +1 -1
  42. package/dist/browser/components/workflow/WorkflowDiagram.js +9 -7
  43. package/dist/browser/components/workflow/WorkflowDiagram.js.map +1 -1
  44. package/dist/browser/components/workflow/WorkflowFlowCanvas.d.ts +1 -0
  45. package/dist/browser/components/workflow/WorkflowFlowCanvas.d.ts.map +1 -1
  46. package/dist/browser/components/workflow/WorkflowFlowCanvas.js +20 -11
  47. package/dist/browser/components/workflow/WorkflowFlowCanvas.js.map +1 -1
  48. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts +2 -1
  49. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts.map +1 -1
  50. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js +26 -9
  51. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js.map +1 -1
  52. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts +9 -1
  53. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts.map +1 -1
  54. package/dist/browser/components/workflow/WorkflowTaskForm.js +32 -3
  55. package/dist/browser/components/workflow/WorkflowTaskForm.js.map +1 -1
  56. package/dist/browser/components/workflow/workflow-graph-presentation.d.ts +2 -0
  57. package/dist/browser/components/workflow/workflow-graph-presentation.d.ts.map +1 -1
  58. package/dist/browser/components/workflow/workflow-graph-presentation.js +15 -0
  59. package/dist/browser/components/workflow/workflow-graph-presentation.js.map +1 -1
  60. package/dist/browser/components/workflow/workflow-submission-form.d.ts +5 -0
  61. package/dist/browser/components/workflow/workflow-submission-form.d.ts.map +1 -1
  62. package/dist/browser/components/workflow/workflow-submission-form.js +26 -0
  63. package/dist/browser/components/workflow/workflow-submission-form.js.map +1 -1
  64. package/dist/browser/navigation-guard.d.ts +6 -1
  65. package/dist/browser/navigation-guard.d.ts.map +1 -1
  66. package/dist/browser/navigation-guard.js +51 -12
  67. package/dist/browser/navigation-guard.js.map +1 -1
  68. package/dist/browser/platform-client.d.ts +2 -0
  69. package/dist/browser/platform-client.d.ts.map +1 -1
  70. package/dist/browser/platform-client.js +2 -0
  71. package/dist/browser/platform-client.js.map +1 -1
  72. package/dist/browser/sha256.d.ts +3 -0
  73. package/dist/browser/sha256.d.ts.map +1 -0
  74. package/dist/browser/sha256.js +10 -0
  75. package/dist/browser/sha256.js.map +1 -0
  76. package/dist/browser/styles.css +13 -0
  77. package/dist/browser/workflow-definitions.d.ts +14 -1
  78. package/dist/browser/workflow-definitions.d.ts.map +1 -1
  79. package/dist/browser/workflow-definitions.js +8 -3
  80. package/dist/browser/workflow-definitions.js.map +1 -1
  81. package/dist/browser/workflow-task-command-recovery.d.ts.map +1 -1
  82. package/dist/browser/workflow-task-command-recovery.js +2 -2
  83. package/dist/browser/workflow-task-command-recovery.js.map +1 -1
  84. package/documentation/administration.md +2 -2
  85. package/documentation/backend.md +21 -0
  86. package/documentation/delivery.md +31 -2
  87. package/documentation/getting-started.md +7 -7
  88. package/documentation/manifest.json +6 -6
  89. package/documentation/workflow-events.md +50 -4
  90. package/package.json +26 -30
  91. package/releases/2.60.0.json +38 -0
  92. package/releases/2.60.1.json +35 -0
  93. package/skills/manifest.json +1 -1
  94. package/skills/openxiangda-v2/SKILL.md +4 -4
  95. package/skills/openxiangda-v2/references/administration.md +2 -2
  96. package/skills/openxiangda-v2/references/backend.md +21 -0
  97. package/skills/openxiangda-v2/references/delivery.md +31 -2
  98. package/skills/openxiangda-v2/references/getting-started.md +7 -7
  99. package/skills/openxiangda-v2/references/workflow-events.md +50 -4
  100. package/releases/2.59.4.json +0 -38
  101. 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":"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"}
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
- return { ...workflowSubmissionFormProjection(fields, values, formOptions?.fieldState?.(values)), error: false };
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 = () => { if (!submitInFlight.current && !drawerBusy)
1686
- onDismiss?.(); };
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
- const next = new URLSearchParams(searchParams);
1983
- next.delete('processCommandId');
1984
- if (nextMode === 'create')
1985
- next.delete('subjectId');
1986
- setSearchParams(next, { replace: true });
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
- const next = new URLSearchParams(searchParams);
1998
- next.delete('processCommandId');
1999
- if (nextSubjectId)
2000
- next.set('subjectId', nextSubjectId);
2001
- else
2002
- next.delete('subjectId');
2003
- setSearchParams(next, { replace: true });
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" }); }