openxiangda 2.59.3-http.0 → 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.
Files changed (261) 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/AttachmentFileList.d.ts +5 -0
  9. package/dist/browser/components/platform-fields/AttachmentFileList.d.ts.map +1 -1
  10. package/dist/browser/components/platform-fields/AttachmentFileList.js +11 -0
  11. package/dist/browser/components/platform-fields/AttachmentFileList.js.map +1 -1
  12. package/dist/browser/components/platform-fields/DateTimeField.js +1 -1
  13. package/dist/browser/components/platform-fields/DateTimeField.js.map +1 -1
  14. package/dist/browser/components/platform-fields/MobileDateTimeField.js +1 -1
  15. package/dist/browser/components/platform-fields/MobileDateTimeField.js.map +1 -1
  16. package/dist/browser/components/platform-fields/MobileManagedFileField.d.ts +2 -1
  17. package/dist/browser/components/platform-fields/MobileManagedFileField.d.ts.map +1 -1
  18. package/dist/browser/components/platform-fields/MobileManagedFileField.js +4 -4
  19. package/dist/browser/components/platform-fields/MobileManagedFileField.js.map +1 -1
  20. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.d.ts +1 -1
  21. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.d.ts.map +1 -1
  22. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js +3 -3
  23. package/dist/browser/components/platform-fields/MobileZonedDateTimeField.js.map +1 -1
  24. package/dist/browser/components/platform-fields/SubtableField.d.ts +6 -0
  25. package/dist/browser/components/platform-fields/SubtableField.d.ts.map +1 -1
  26. package/dist/browser/components/platform-fields/SubtableField.js +17 -10
  27. package/dist/browser/components/platform-fields/SubtableField.js.map +1 -1
  28. package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts +1 -1
  29. package/dist/browser/components/platform-fields/ZonedDateTimeField.d.ts.map +1 -1
  30. package/dist/browser/components/platform-fields/ZonedDateTimeField.js +3 -2
  31. package/dist/browser/components/platform-fields/ZonedDateTimeField.js.map +1 -1
  32. package/dist/browser/components/platform-fields/zoned-date-time.d.ts +2 -0
  33. package/dist/browser/components/platform-fields/zoned-date-time.d.ts.map +1 -1
  34. package/dist/browser/components/platform-fields/zoned-date-time.js +6 -0
  35. package/dist/browser/components/platform-fields/zoned-date-time.js.map +1 -1
  36. package/dist/browser/components/resource/SurfaceFields.d.ts +5 -0
  37. package/dist/browser/components/resource/SurfaceFields.d.ts.map +1 -1
  38. package/dist/browser/components/resource/SurfaceFields.js +9 -9
  39. package/dist/browser/components/resource/SurfaceFields.js.map +1 -1
  40. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts +15 -2
  41. package/dist/browser/components/workflow/StandardWorkflowPages.d.ts.map +1 -1
  42. package/dist/browser/components/workflow/StandardWorkflowPages.js +115 -45
  43. package/dist/browser/components/workflow/StandardWorkflowPages.js.map +1 -1
  44. package/dist/browser/components/workflow/WorkflowDiagram.d.ts.map +1 -1
  45. package/dist/browser/components/workflow/WorkflowDiagram.js +12 -5
  46. package/dist/browser/components/workflow/WorkflowDiagram.js.map +1 -1
  47. package/dist/browser/components/workflow/WorkflowFlowCanvas.d.ts.map +1 -1
  48. package/dist/browser/components/workflow/WorkflowFlowCanvas.js +14 -7
  49. package/dist/browser/components/workflow/WorkflowFlowCanvas.js.map +1 -1
  50. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.d.ts.map +1 -1
  51. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js +4 -2
  52. package/dist/browser/components/workflow/WorkflowNodeConfigurationEditor.js.map +1 -1
  53. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts +9 -1
  54. package/dist/browser/components/workflow/WorkflowTaskForm.d.ts.map +1 -1
  55. package/dist/browser/components/workflow/WorkflowTaskForm.js +32 -3
  56. package/dist/browser/components/workflow/WorkflowTaskForm.js.map +1 -1
  57. package/dist/browser/components/workflow/standard-process-values.d.ts +2 -2
  58. package/dist/browser/components/workflow/standard-process-values.d.ts.map +1 -1
  59. package/dist/browser/components/workflow/standard-process-values.js +18 -3
  60. package/dist/browser/components/workflow/standard-process-values.js.map +1 -1
  61. package/dist/browser/components/workflow/workflow-graph-presentation.d.ts +1 -1
  62. package/dist/browser/components/workflow/workflow-graph-presentation.d.ts.map +1 -1
  63. package/dist/browser/components/workflow/workflow-graph-presentation.js +4 -3
  64. package/dist/browser/components/workflow/workflow-graph-presentation.js.map +1 -1
  65. package/dist/browser/components/workflow/workflow-submission-form.d.ts +9 -0
  66. package/dist/browser/components/workflow/workflow-submission-form.d.ts.map +1 -1
  67. package/dist/browser/components/workflow/workflow-submission-form.js +34 -1
  68. package/dist/browser/components/workflow/workflow-submission-form.js.map +1 -1
  69. package/dist/browser/navigation-guard.d.ts +4 -1
  70. package/dist/browser/navigation-guard.d.ts.map +1 -1
  71. package/dist/browser/navigation-guard.js +39 -10
  72. package/dist/browser/navigation-guard.js.map +1 -1
  73. package/dist/browser/styles.css +19 -0
  74. package/dist/browser/workflow-definitions.d.ts +14 -1
  75. package/dist/browser/workflow-definitions.d.ts.map +1 -1
  76. package/dist/browser/workflow-definitions.js +8 -3
  77. package/dist/browser/workflow-definitions.js.map +1 -1
  78. package/documentation/AGENTS.md +1 -0
  79. package/documentation/administration.md +5 -2
  80. package/documentation/application-operations.md +150 -0
  81. package/documentation/appspec.md +1 -1
  82. package/documentation/backend.md +21 -0
  83. package/documentation/delivery.md +31 -2
  84. package/documentation/getting-started.md +7 -7
  85. package/documentation/manifest.json +15 -9
  86. package/documentation/reference/cli.md +1 -1
  87. package/documentation/reference/mcp.md +1120 -0
  88. package/documentation/workflow-events.md +73 -5
  89. package/package.json +32 -23
  90. package/releases/2.20.2.json +30 -0
  91. package/releases/2.20.3.json +29 -0
  92. package/releases/2.60.0.json +38 -0
  93. package/skills/manifest.json +1 -1
  94. package/skills/openxiangda-v2/SKILL.md +5 -4
  95. package/skills/openxiangda-v2/references/administration.md +5 -2
  96. package/skills/openxiangda-v2/references/application-operations.md +150 -0
  97. package/skills/openxiangda-v2/references/appspec.md +1 -1
  98. package/skills/openxiangda-v2/references/backend.md +21 -0
  99. package/skills/openxiangda-v2/references/cli.md +1 -1
  100. package/skills/openxiangda-v2/references/delivery.md +31 -2
  101. package/skills/openxiangda-v2/references/getting-started.md +7 -7
  102. package/skills/openxiangda-v2/references/mcp.md +1120 -0
  103. package/skills/openxiangda-v2/references/workflow-events.md +73 -5
  104. package/releases/2.0.0.json +0 -50
  105. package/releases/2.0.1.json +0 -39
  106. package/releases/2.1.0.json +0 -44
  107. package/releases/2.1.1.json +0 -48
  108. package/releases/2.10.0.json +0 -42
  109. package/releases/2.11.0.json +0 -41
  110. package/releases/2.12.0.json +0 -38
  111. package/releases/2.13.0.json +0 -41
  112. package/releases/2.13.1.json +0 -33
  113. package/releases/2.13.2.json +0 -31
  114. package/releases/2.14.0.json +0 -41
  115. package/releases/2.15.0.json +0 -40
  116. package/releases/2.16.0.json +0 -41
  117. package/releases/2.17.0.json +0 -39
  118. package/releases/2.17.1.json +0 -34
  119. package/releases/2.18.0.json +0 -37
  120. package/releases/2.18.1.json +0 -31
  121. package/releases/2.18.10.json +0 -29
  122. package/releases/2.18.2.json +0 -30
  123. package/releases/2.18.3.json +0 -30
  124. package/releases/2.18.9.json +0 -37
  125. package/releases/2.19.0.json +0 -38
  126. package/releases/2.2.0.json +0 -48
  127. package/releases/2.2.1.json +0 -35
  128. package/releases/2.2.2.json +0 -34
  129. package/releases/2.20.0.json +0 -36
  130. package/releases/2.21.0.json +0 -35
  131. package/releases/2.21.1.json +0 -36
  132. package/releases/2.21.2.json +0 -34
  133. package/releases/2.21.3.json +0 -31
  134. package/releases/2.21.4.json +0 -31
  135. package/releases/2.22.0.json +0 -35
  136. package/releases/2.22.1.json +0 -32
  137. package/releases/2.22.2.json +0 -35
  138. package/releases/2.22.3.json +0 -32
  139. package/releases/2.22.4.json +0 -33
  140. package/releases/2.22.5.json +0 -31
  141. package/releases/2.22.6.json +0 -29
  142. package/releases/2.22.7.json +0 -29
  143. package/releases/2.23.0.json +0 -34
  144. package/releases/2.24.0.json +0 -33
  145. package/releases/2.24.1.json +0 -33
  146. package/releases/2.24.2.json +0 -31
  147. package/releases/2.24.3.json +0 -33
  148. package/releases/2.25.0.json +0 -31
  149. package/releases/2.25.1.json +0 -33
  150. package/releases/2.25.2.json +0 -32
  151. package/releases/2.25.3.json +0 -32
  152. package/releases/2.26.0.json +0 -41
  153. package/releases/2.27.0.json +0 -38
  154. package/releases/2.28.0.json +0 -37
  155. package/releases/2.28.1.json +0 -34
  156. package/releases/2.29.0.json +0 -37
  157. package/releases/2.29.1.json +0 -34
  158. package/releases/2.29.2.json +0 -32
  159. package/releases/2.3.0.json +0 -37
  160. package/releases/2.30.0.json +0 -34
  161. package/releases/2.31.0.json +0 -39
  162. package/releases/2.31.1.json +0 -38
  163. package/releases/2.31.2.json +0 -34
  164. package/releases/2.31.3.json +0 -32
  165. package/releases/2.31.4.json +0 -33
  166. package/releases/2.31.6.json +0 -29
  167. package/releases/2.31.7.json +0 -29
  168. package/releases/2.31.8.json +0 -33
  169. package/releases/2.31.9.json +0 -33
  170. package/releases/2.32.0.json +0 -38
  171. package/releases/2.33.0.json +0 -33
  172. package/releases/2.34.0.json +0 -38
  173. package/releases/2.34.1.json +0 -34
  174. package/releases/2.34.2.json +0 -36
  175. package/releases/2.34.3.json +0 -35
  176. package/releases/2.35.0.json +0 -42
  177. package/releases/2.35.1.json +0 -43
  178. package/releases/2.35.2.json +0 -45
  179. package/releases/2.35.3.json +0 -46
  180. package/releases/2.36.0.json +0 -38
  181. package/releases/2.36.1.json +0 -33
  182. package/releases/2.37.0.json +0 -39
  183. package/releases/2.37.1.json +0 -33
  184. package/releases/2.37.2.json +0 -31
  185. package/releases/2.38.0.json +0 -40
  186. package/releases/2.39.0.json +0 -37
  187. package/releases/2.39.1.json +0 -32
  188. package/releases/2.4.0.json +0 -37
  189. package/releases/2.4.1.json +0 -35
  190. package/releases/2.40.0.json +0 -38
  191. package/releases/2.40.1.json +0 -30
  192. package/releases/2.41.0.json +0 -39
  193. package/releases/2.41.1.json +0 -33
  194. package/releases/2.41.2.json +0 -34
  195. package/releases/2.42.0.json +0 -36
  196. package/releases/2.43.0.json +0 -38
  197. package/releases/2.44.0.json +0 -36
  198. package/releases/2.44.1.json +0 -33
  199. package/releases/2.45.0.json +0 -35
  200. package/releases/2.46.0.json +0 -35
  201. package/releases/2.46.1.json +0 -30
  202. package/releases/2.46.2.json +0 -29
  203. package/releases/2.46.3.json +0 -30
  204. package/releases/2.47.0.json +0 -34
  205. package/releases/2.47.1.json +0 -31
  206. package/releases/2.47.2.json +0 -28
  207. package/releases/2.47.3.json +0 -29
  208. package/releases/2.47.4.json +0 -29
  209. package/releases/2.47.5.json +0 -29
  210. package/releases/2.48.0.json +0 -33
  211. package/releases/2.48.1.json +0 -30
  212. package/releases/2.48.2.json +0 -29
  213. package/releases/2.48.3.json +0 -32
  214. package/releases/2.48.4.json +0 -31
  215. package/releases/2.49.0.json +0 -35
  216. package/releases/2.49.1.json +0 -32
  217. package/releases/2.49.10.json +0 -34
  218. package/releases/2.49.11.json +0 -30
  219. package/releases/2.49.12.json +0 -30
  220. package/releases/2.49.13.json +0 -29
  221. package/releases/2.49.14.json +0 -30
  222. package/releases/2.49.2.json +0 -31
  223. package/releases/2.49.3.json +0 -31
  224. package/releases/2.49.4.json +0 -30
  225. package/releases/2.49.5.json +0 -31
  226. package/releases/2.49.6.json +0 -30
  227. package/releases/2.49.8.json +0 -33
  228. package/releases/2.49.9.json +0 -35
  229. package/releases/2.5.0.json +0 -37
  230. package/releases/2.50.0.json +0 -32
  231. package/releases/2.51.0.json +0 -32
  232. package/releases/2.52.0.json +0 -34
  233. package/releases/2.53.0.json +0 -34
  234. package/releases/2.54.0.json +0 -35
  235. package/releases/2.54.1.json +0 -29
  236. package/releases/2.54.4.json +0 -30
  237. package/releases/2.54.6.json +0 -30
  238. package/releases/2.55.0.json +0 -34
  239. package/releases/2.55.2.json +0 -31
  240. package/releases/2.55.3.json +0 -32
  241. package/releases/2.55.4.json +0 -30
  242. package/releases/2.55.5.json +0 -30
  243. package/releases/2.56.0.json +0 -32
  244. package/releases/2.57.0.json +0 -35
  245. package/releases/2.58.0.json +0 -37
  246. package/releases/2.58.1.json +0 -31
  247. package/releases/2.59.2.json +0 -33
  248. package/releases/2.59.4.json +0 -38
  249. package/releases/2.59.5.json +0 -40
  250. package/releases/2.59.6.json +0 -30
  251. package/releases/2.59.7.json +0 -32
  252. package/releases/2.6.0.json +0 -37
  253. package/releases/2.7.0.json +0 -37
  254. package/releases/2.7.1.json +0 -31
  255. package/releases/2.8.0.json +0 -32
  256. package/releases/2.8.1.json +0 -30
  257. package/releases/2.9.0.json +0 -33
  258. package/releases/2.9.1.json +0 -31
  259. package/releases/2.9.2.json +0 -33
  260. package/releases/2.9.3.json +0 -31
  261. package/releases/2.9.4.json +0 -37
@@ -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 { 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
- return { ...workflowSubmissionFormProjection(fields, values, formOptions?.fieldState?.(values)), error: false };
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 {
@@ -1425,11 +1458,23 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1425
1458
  useEffect(() => {
1426
1459
  if (loading || commandId || pendingSubmission || !launchSurface || formProjection.error || !subjectDefinition)
1427
1460
  return;
1428
- const values = normalizeRecordForForm(formProjection.hiddenValues, subjectDefinition.surface);
1461
+ // Prefill and linkage may have written the controller since this render.
1462
+ // Recompute visibility before clearing hidden values so an old watch snapshot
1463
+ // cannot erase newly supplied source rows or other conditional defaults.
1464
+ const current = normalizeFormValues(subjectForm.getFieldsValue(true), subjectDefinition.surface);
1465
+ let hidden;
1466
+ try {
1467
+ hidden = workflowSubmissionFormProjection(fields, current, formOptions?.fieldState?.(current)).hiddenValues;
1468
+ }
1469
+ catch {
1470
+ // The next watched projection displays the rule error; preserve the input.
1471
+ return;
1472
+ }
1473
+ const values = normalizeRecordForForm(hidden, subjectDefinition.surface);
1429
1474
  const changes = Object.entries(values).filter(([key, value]) => JSON.stringify(subjectForm.getFieldValue(key)) !== JSON.stringify(value));
1430
1475
  if (changes.length)
1431
1476
  subjectForm.setFields(changes.map(([name, value]) => ({ name, value, errors: [] })));
1432
- }, [commandId, formProjection, launchSurface, loading, pendingSubmission, subjectDefinition, subjectForm]);
1477
+ }, [commandId, fields, formOptions?.fieldState, formProjection, launchSurface, loading, pendingSubmission, subjectDefinition, subjectForm]);
1433
1478
  useEffect(() => {
1434
1479
  let active = true;
1435
1480
  setLaunchSurface(null);
@@ -1670,8 +1715,13 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1670
1715
  };
1671
1716
  }, [commandId, processSurface?.subject.recordId, subjectDefinition, subjectForm]);
1672
1717
  const drawerBusy = loading || Boolean(commandId && (!processSurface || ['accepted', 'resolving', 'ready', 'starting', 'retry_wait'].includes(processSurface.command.status)) && !processError);
1673
- const dismissDrawer = () => { if (!submitInFlight.current && !drawerBusy)
1674
- onDismiss?.(); };
1718
+ const dismissDrawer = () => {
1719
+ if (!submitInFlight.current && !drawerBusy)
1720
+ navigationGuard.confirmNavigation(() => {
1721
+ acknowledgeSubmission();
1722
+ onDismiss?.();
1723
+ });
1724
+ };
1675
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;
1676
1726
  const clearOriginal = (attempt) => {
1677
1727
  clearPendingWorkflowSubmission(submissionLocatorStorage(), recoveryScope, attempt.idempotencyKey);
@@ -1686,6 +1736,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1686
1736
  if (activeRecoveryScope.current !== recoveryScope)
1687
1737
  return;
1688
1738
  clearOriginal(attempt);
1739
+ acknowledgeSubmission();
1689
1740
  if (onDismiss) {
1690
1741
  setLocalCommandId(id);
1691
1742
  return;
@@ -1806,8 +1857,9 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1806
1857
  setRecoveryObservedAbsent(false);
1807
1858
  };
1808
1859
  try {
1809
- const encoded = namedIntent ? namedProcessFormValues(values, subjectDefinition.surface, resources, namedIntent.ownedSubject, formOptions?.subtableReadonlyFields)
1810
- : standardProcessFormValues(values, subjectDefinition.surface, resources, (field, mode) => fieldWritable(field, mode === 'create' ? 'create' : 'edit', hasCapability, identity.isAppSuperAdmin));
1860
+ const entered = workflowSubmissionFormInput(fields, subjectForm.getFieldsValue(true), values);
1861
+ const encoded = namedIntent ? namedProcessFormValues(entered, subjectDefinition.surface, resources, namedIntent.ownedSubject, formOptions?.subtableReadonlyFields, formOptions?.subtableReadonlyInputFields)
1862
+ : standardProcessFormValues(entered, subjectDefinition.surface, resources, (field, mode) => fieldWritable(field, mode === 'create' ? 'create' : 'edit', hasCapability, identity.isAppSuperAdmin));
1811
1863
  const data = workflowSubmissionFormProjection(fields, encoded, formOptions?.fieldState?.(encoded)).values;
1812
1864
  const signature = JSON.stringify({ workflowCode, subjectId, environmentKey: identity.environment.key, submissionMode, data });
1813
1865
  if (submissionAttempt.current?.signature !== signature) {
@@ -1841,6 +1893,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1841
1893
  clearOriginal(dispatched);
1842
1894
  if (activeRecoveryScope.current !== recoveryScope)
1843
1895
  return;
1896
+ acknowledgeSubmission();
1844
1897
  if (outcome.kind === 'workflow-command') {
1845
1898
  if (onDismiss) {
1846
1899
  setLocalCommandId(outcome.command.id);
@@ -1887,6 +1940,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1887
1940
  clearOriginal(dispatched);
1888
1941
  if (activeRecoveryScope.current !== recoveryScope)
1889
1942
  return;
1943
+ acknowledgeSubmission();
1890
1944
  if (onDismiss) {
1891
1945
  setLocalCommandId(command.id);
1892
1946
  return;
@@ -1927,6 +1981,8 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1927
1981
  setProcessSurface(null);
1928
1982
  setProcessRefreshAttempt(value => value + 1);
1929
1983
  requirementForm.resetFields();
1984
+ setRequirementDirty(false);
1985
+ navigationGuard.release();
1930
1986
  }
1931
1987
  catch (error) {
1932
1988
  message.error(errorMessage(error, '补充发起信息失败'));
@@ -1957,37 +2013,43 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1957
2013
  }
1958
2014
  };
1959
2015
  const selectMode = (nextMode) => {
1960
- if (!generatedNamedSubmission?.[nextMode] || submitInFlight.current || commandId)
1961
- return;
1962
- setSubmissionMode(nextMode);
1963
- setCompletion(null);
1964
- subjectForm.resetFields();
1965
- if (onDismiss) {
1966
- setLocalSubjectId('');
2016
+ if (nextMode === submissionMode || !generatedNamedSubmission?.[nextMode] || submitInFlight.current || commandId || pendingSubmission)
1967
2017
  return;
1968
- }
1969
- const next = new URLSearchParams(searchParams);
1970
- next.delete('processCommandId');
1971
- if (nextMode === 'create')
1972
- next.delete('subjectId');
1973
- setSearchParams(next, { replace: true });
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
+ });
1974
2033
  };
1975
2034
  const selectSubject = (nextSubjectId) => {
1976
- if (submitInFlight.current || commandId)
2035
+ if ((nextSubjectId || '') === subjectId || submitInFlight.current || commandId || pendingSubmission)
1977
2036
  return;
1978
- setCompletion(null);
1979
- subjectForm.resetFields();
1980
- if (onDismiss) {
1981
- setLocalSubjectId(nextSubjectId || '');
1982
- return;
1983
- }
1984
- const next = new URLSearchParams(searchParams);
1985
- next.delete('processCommandId');
1986
- if (nextSubjectId)
1987
- next.set('subjectId', nextSubjectId);
1988
- else
1989
- next.delete('subjectId');
1990
- setSearchParams(next, { replace: true });
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
+ });
1991
2053
  };
1992
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: [
1993
2055
  { label: '新建并提交', value: 'create' },
@@ -1996,11 +2058,17 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
1996
2058
  const uploadOperationCode = namedIntent?.operationCode || definition.processOperationCode;
1997
2059
  const fieldRenderers = uploadOperationCode
1998
2060
  ? {
2061
+ dateTimeConstraints: formOptions?.dateTimeConstraints,
2062
+ renderExtra: ({ field }) => formProjection.fieldHints[field.key],
1999
2063
  renderSubtable: ({ field, disabled, operation, recordId }) => {
2000
2064
  const grant = namedIntent?.ownedSubject?.subtables.find(table => table.fieldCode === field.key);
2001
- assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyFields || {});
2065
+ assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyFields || {}, formOptions?.subtableFixedRows);
2066
+ assertNamedSubtableReadonlyFields(subjectDefinition.surface, namedIntent?.ownedSubject, formOptions?.subtableReadonlyInputFields || {});
2002
2067
  return _jsx(SubtableField, { field: field, disabled: disabled, operation: operation, parentRecordId: recordId, mobile: variant === 'mobile', ...(namedIntent && grant ? { launch: { fieldCodes: grant.fieldCodes,
2003
- readonlyFieldCodes: formOptions?.subtableReadonlyFields?.[field.key],
2068
+ readonlyFieldCodes: [...(formOptions?.subtableReadonlyFields?.[field.key] || []), ...(formOptions?.subtableReadonlyInputFields?.[field.key] || [])],
2069
+ fieldState: formProjection.subtableStates[field.key],
2070
+ fixedRows: formOptions?.subtableFixedRows?.includes(field.key),
2071
+ fileResourceCodes: formOptions?.fileResourceCodes,
2004
2072
  reference: { workflowCode: definition.code, operationCode: namedIntent.operationCode, subtableFieldCode: field.key },
2005
2073
  upload: (childField, file) => uploadOperationManagedFile({
2006
2074
  operationCode: uploadOperationCode, resourceCode: field.subtable.resourceCode,
@@ -2009,6 +2077,7 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
2009
2077
  } } : {}) });
2010
2078
  },
2011
2079
  ...(namedIntent ? { referenceLaunch: { workflowCode: definition.code, operationCode: namedIntent.operationCode } } : {}),
2080
+ fileResourceCodes: formOptions?.fileResourceCodes,
2012
2081
  candidateScopeValues: { ...formOptions?.candidateScopeValues, ...formProjection.values },
2013
2082
  upload: async (field, file) => await uploadOperationManagedFile({
2014
2083
  operationCode: uploadOperationCode,
@@ -2054,13 +2123,14 @@ export function WorkflowSubmissionPage({ instancePath, workflowCode: declaredWor
2054
2123
  onBack: onDismiss ? dismissDrawer : () => navigate(-1),
2055
2124
  onSubmit: submit,
2056
2125
  onValuesChange,
2126
+ onRequirementsChange: () => setRequirementDirty(true),
2057
2127
  onAnswer: answer,
2058
2128
  onRetry: retry,
2059
2129
  onRefresh: () => { setProcessError(null); setProcessRefreshAttempt(value => value + 1); },
2060
2130
  };
2061
2131
  return frame(variant === 'mobile' ? (_jsx(MobileProcessSubmissionRenderer, { ...shared })) : (_jsx(DesktopProcessSubmissionRenderer, { ...shared })));
2062
2132
  }
2063
- function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry, onRefresh, }) {
2133
+ function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry, onRefresh, onValuesChange, }) {
2064
2134
  if (error) {
2065
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" }));
2066
2136
  }
@@ -2070,7 +2140,7 @@ function ProcessCommandPanel({ form, surface, error, loading, onAnswer, onRetry,
2070
2140
  if (!['awaiting_input', 'cancelled', 'dead_letter'].includes(command.status)) {
2071
2141
  return null;
2072
2142
  }
2073
- 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] }));
2074
2144
  }
2075
2145
  function StandardProcessSubmissionRenderer(props) {
2076
2146
  const groups = [...props.fields.reduce((groups, field) => {
@@ -2080,7 +2150,7 @@ function StandardProcessSubmissionRenderer(props) {
2080
2150
  }, new Map())].map(([section, fields]) => ({ section, fields }));
2081
2151
  if (props.completion)
2082
2152
  return _jsx(Result, { status: "success", title: "\u63D0\u4EA4\u6210\u529F", extra: _jsx(Button, { onClick: props.onBack, children: "\u8FD4\u56DE" }) });
2083
- 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 })] });
2084
2154
  }
2085
2155
  function DesktopProcessSubmissionRenderer(props) { return _jsx(StandardProcessSubmissionRenderer, { ...props, variant: "desktop" }); }
2086
2156
  function MobileProcessSubmissionRenderer(props) { return _jsx(StandardProcessSubmissionRenderer, { ...props, variant: "mobile" }); }