@cohesivesystems/presentation-react 0.1.0-alpha.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 (252) hide show
  1. package/LICENSE +55 -0
  2. package/dist/collection-chrome-slot-renderer-registry.d.ts +12 -0
  3. package/dist/collection-chrome-slot-renderer-registry.d.ts.map +1 -0
  4. package/dist/collection-chrome-slot-renderer-registry.js +12 -0
  5. package/dist/collection-chrome-slot-renderer-registry.js.map +1 -0
  6. package/dist/collection-selection-state-context.d.ts +6 -0
  7. package/dist/collection-selection-state-context.d.ts.map +1 -0
  8. package/dist/collection-selection-state-context.js +25 -0
  9. package/dist/collection-selection-state-context.js.map +1 -0
  10. package/dist/collection-selection-state.d.ts +3 -0
  11. package/dist/collection-selection-state.d.ts.map +1 -0
  12. package/dist/collection-selection-state.js +52 -0
  13. package/dist/collection-selection-state.js.map +1 -0
  14. package/dist/document-workspace-runtime.d.ts +262 -0
  15. package/dist/document-workspace-runtime.d.ts.map +1 -0
  16. package/dist/document-workspace-runtime.js +699 -0
  17. package/dist/document-workspace-runtime.js.map +1 -0
  18. package/dist/index.d.ts +51 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +51 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/input-form-endpoint-runtime.d.ts +140 -0
  23. package/dist/input-form-endpoint-runtime.d.ts.map +1 -0
  24. package/dist/input-form-endpoint-runtime.js +280 -0
  25. package/dist/input-form-endpoint-runtime.js.map +1 -0
  26. package/dist/local-flow-state-data-source-projection.d.ts +21 -0
  27. package/dist/local-flow-state-data-source-projection.d.ts.map +1 -0
  28. package/dist/local-flow-state-data-source-projection.js +65 -0
  29. package/dist/local-flow-state-data-source-projection.js.map +1 -0
  30. package/dist/navigation-runtime-context.d.ts +22 -0
  31. package/dist/navigation-runtime-context.d.ts.map +1 -0
  32. package/dist/navigation-runtime-context.js +23 -0
  33. package/dist/navigation-runtime-context.js.map +1 -0
  34. package/dist/navigation-shell-frame-renderer-registry.d.ts +20 -0
  35. package/dist/navigation-shell-frame-renderer-registry.d.ts.map +1 -0
  36. package/dist/navigation-shell-frame-renderer-registry.js +9 -0
  37. package/dist/navigation-shell-frame-renderer-registry.js.map +1 -0
  38. package/dist/navigation-shell-region-component-registry.d.ts +50 -0
  39. package/dist/navigation-shell-region-component-registry.d.ts.map +1 -0
  40. package/dist/navigation-shell-region-component-registry.js +44 -0
  41. package/dist/navigation-shell-region-component-registry.js.map +1 -0
  42. package/dist/navigation-shell-slot-renderer-registry.d.ts +22 -0
  43. package/dist/navigation-shell-slot-renderer-registry.d.ts.map +1 -0
  44. package/dist/navigation-shell-slot-renderer-registry.js +9 -0
  45. package/dist/navigation-shell-slot-renderer-registry.js.map +1 -0
  46. package/dist/page-host-projection.d.ts +127 -0
  47. package/dist/page-host-projection.d.ts.map +1 -0
  48. package/dist/page-host-projection.js +59 -0
  49. package/dist/page-host-projection.js.map +1 -0
  50. package/dist/page-host-renderer-registry.d.ts +72 -0
  51. package/dist/page-host-renderer-registry.d.ts.map +1 -0
  52. package/dist/page-host-renderer-registry.js +63 -0
  53. package/dist/page-host-renderer-registry.js.map +1 -0
  54. package/dist/presentation-action-group-runtime-options.d.ts +36 -0
  55. package/dist/presentation-action-group-runtime-options.d.ts.map +1 -0
  56. package/dist/presentation-action-group-runtime-options.js +50 -0
  57. package/dist/presentation-action-group-runtime-options.js.map +1 -0
  58. package/dist/presentation-action-runtime.d.ts +52 -0
  59. package/dist/presentation-action-runtime.d.ts.map +1 -0
  60. package/dist/presentation-action-runtime.js +78 -0
  61. package/dist/presentation-action-runtime.js.map +1 -0
  62. package/dist/presentation-data-source-binding-runtime.d.ts +3 -0
  63. package/dist/presentation-data-source-binding-runtime.d.ts.map +1 -0
  64. package/dist/presentation-data-source-binding-runtime.js +65 -0
  65. package/dist/presentation-data-source-binding-runtime.js.map +1 -0
  66. package/dist/presentation-data-source-binding.d.ts +12 -0
  67. package/dist/presentation-data-source-binding.d.ts.map +1 -0
  68. package/dist/presentation-data-source-binding.js +13 -0
  69. package/dist/presentation-data-source-binding.js.map +1 -0
  70. package/dist/presentation-flow-runtime.d.ts +139 -0
  71. package/dist/presentation-flow-runtime.d.ts.map +1 -0
  72. package/dist/presentation-flow-runtime.js +514 -0
  73. package/dist/presentation-flow-runtime.js.map +1 -0
  74. package/dist/presentation-module-context.d.ts +4 -0
  75. package/dist/presentation-module-context.d.ts.map +1 -0
  76. package/dist/presentation-module-context.js +6 -0
  77. package/dist/presentation-module-context.js.map +1 -0
  78. package/dist/presentation-module-provider.d.ts +7 -0
  79. package/dist/presentation-module-provider.d.ts.map +1 -0
  80. package/dist/presentation-module-provider.js +7 -0
  81. package/dist/presentation-module-provider.js.map +1 -0
  82. package/dist/presentation-projection-diagnostics-context.d.ts +8 -0
  83. package/dist/presentation-projection-diagnostics-context.d.ts.map +1 -0
  84. package/dist/presentation-projection-diagnostics-context.js +3 -0
  85. package/dist/presentation-projection-diagnostics-context.js.map +1 -0
  86. package/dist/presentation-projection-diagnostics-hooks.d.ts +4 -0
  87. package/dist/presentation-projection-diagnostics-hooks.d.ts.map +1 -0
  88. package/dist/presentation-projection-diagnostics-hooks.js +17 -0
  89. package/dist/presentation-projection-diagnostics-hooks.js.map +1 -0
  90. package/dist/presentation-projection-diagnostics-runtime.d.ts +12 -0
  91. package/dist/presentation-projection-diagnostics-runtime.d.ts.map +1 -0
  92. package/dist/presentation-projection-diagnostics-runtime.js +54 -0
  93. package/dist/presentation-projection-diagnostics-runtime.js.map +1 -0
  94. package/dist/presentation-projection-trace.d.ts +27 -0
  95. package/dist/presentation-projection-trace.d.ts.map +1 -0
  96. package/dist/presentation-projection-trace.js +54 -0
  97. package/dist/presentation-projection-trace.js.map +1 -0
  98. package/dist/presentation-query-form-runtime.d.ts +30 -0
  99. package/dist/presentation-query-form-runtime.d.ts.map +1 -0
  100. package/dist/presentation-query-form-runtime.js +75 -0
  101. package/dist/presentation-query-form-runtime.js.map +1 -0
  102. package/dist/presentation-query-form-state-adapter-registry.d.ts +4 -0
  103. package/dist/presentation-query-form-state-adapter-registry.d.ts.map +1 -0
  104. package/dist/presentation-query-form-state-adapter-registry.js +13 -0
  105. package/dist/presentation-query-form-state-adapter-registry.js.map +1 -0
  106. package/dist/presentation-query-form-state-context.d.ts +20 -0
  107. package/dist/presentation-query-form-state-context.d.ts.map +1 -0
  108. package/dist/presentation-query-form-state-context.js +20 -0
  109. package/dist/presentation-query-form-state-context.js.map +1 -0
  110. package/dist/presentation-query-form-state.d.ts +29 -0
  111. package/dist/presentation-query-form-state.d.ts.map +1 -0
  112. package/dist/presentation-query-form-state.js +99 -0
  113. package/dist/presentation-query-form-state.js.map +1 -0
  114. package/dist/presentation-renderer-registry.d.ts +109 -0
  115. package/dist/presentation-renderer-registry.d.ts.map +1 -0
  116. package/dist/presentation-renderer-registry.js +25 -0
  117. package/dist/presentation-renderer-registry.js.map +1 -0
  118. package/dist/presentation-standards-context.d.ts +4 -0
  119. package/dist/presentation-standards-context.d.ts.map +1 -0
  120. package/dist/presentation-standards-context.js +12 -0
  121. package/dist/presentation-standards-context.js.map +1 -0
  122. package/dist/presentation-standards-provider.d.ts +14 -0
  123. package/dist/presentation-standards-provider.d.ts.map +1 -0
  124. package/dist/presentation-standards-provider.js +16 -0
  125. package/dist/presentation-standards-provider.js.map +1 -0
  126. package/dist/projected-document-action-runtime-bindings.d.ts +20 -0
  127. package/dist/projected-document-action-runtime-bindings.d.ts.map +1 -0
  128. package/dist/projected-document-action-runtime-bindings.js +88 -0
  129. package/dist/projected-document-action-runtime-bindings.js.map +1 -0
  130. package/dist/projected-document-action-runtime.d.ts +76 -0
  131. package/dist/projected-document-action-runtime.d.ts.map +1 -0
  132. package/dist/projected-document-action-runtime.js +224 -0
  133. package/dist/projected-document-action-runtime.js.map +1 -0
  134. package/dist/projected-document-process-preview-action-runtime-bindings.d.ts +26 -0
  135. package/dist/projected-document-process-preview-action-runtime-bindings.d.ts.map +1 -0
  136. package/dist/projected-document-process-preview-action-runtime-bindings.js +106 -0
  137. package/dist/projected-document-process-preview-action-runtime-bindings.js.map +1 -0
  138. package/dist/projected-document-process-preview-action-runtime.d.ts +321 -0
  139. package/dist/projected-document-process-preview-action-runtime.d.ts.map +1 -0
  140. package/dist/projected-document-process-preview-action-runtime.js +729 -0
  141. package/dist/projected-document-process-preview-action-runtime.js.map +1 -0
  142. package/dist/projected-document-process-preview-capability-runtime.d.ts +47 -0
  143. package/dist/projected-document-process-preview-capability-runtime.d.ts.map +1 -0
  144. package/dist/projected-document-process-preview-capability-runtime.js +49 -0
  145. package/dist/projected-document-process-preview-capability-runtime.js.map +1 -0
  146. package/dist/projected-document-workspace-action-runtime.d.ts +87 -0
  147. package/dist/projected-document-workspace-action-runtime.d.ts.map +1 -0
  148. package/dist/projected-document-workspace-action-runtime.js +150 -0
  149. package/dist/projected-document-workspace-action-runtime.js.map +1 -0
  150. package/dist/projected-document-workspace-projection-renderer-diagnostics.d.ts +18 -0
  151. package/dist/projected-document-workspace-projection-renderer-diagnostics.d.ts.map +1 -0
  152. package/dist/projected-document-workspace-projection-renderer-diagnostics.js +207 -0
  153. package/dist/projected-document-workspace-projection-renderer-diagnostics.js.map +1 -0
  154. package/dist/projected-document-workspace-runtime-binding-diagnostics.d.ts +19 -0
  155. package/dist/projected-document-workspace-runtime-binding-diagnostics.d.ts.map +1 -0
  156. package/dist/projected-document-workspace-runtime-binding-diagnostics.js +124 -0
  157. package/dist/projected-document-workspace-runtime-binding-diagnostics.js.map +1 -0
  158. package/dist/projected-navigation-provider.d.ts +16 -0
  159. package/dist/projected-navigation-provider.d.ts.map +1 -0
  160. package/dist/projected-navigation-provider.js +51 -0
  161. package/dist/projected-navigation-provider.js.map +1 -0
  162. package/dist/projected-presentation-flow-host.d.ts +16 -0
  163. package/dist/projected-presentation-flow-host.d.ts.map +1 -0
  164. package/dist/projected-presentation-flow-host.js +14 -0
  165. package/dist/projected-presentation-flow-host.js.map +1 -0
  166. package/dist/projected-query-form-state-adapter.d.ts +12 -0
  167. package/dist/projected-query-form-state-adapter.d.ts.map +1 -0
  168. package/dist/projected-query-form-state-adapter.js +361 -0
  169. package/dist/projected-query-form-state-adapter.js.map +1 -0
  170. package/dist/react-router-binding.d.ts +133 -0
  171. package/dist/react-router-binding.d.ts.map +1 -0
  172. package/dist/react-router-binding.js +76 -0
  173. package/dist/react-router-binding.js.map +1 -0
  174. package/dist/react-router-path.d.ts +4 -0
  175. package/dist/react-router-path.d.ts.map +1 -0
  176. package/dist/react-router-path.js +11 -0
  177. package/dist/react-router-path.js.map +1 -0
  178. package/dist/scope-selection-context.d.ts +28 -0
  179. package/dist/scope-selection-context.d.ts.map +1 -0
  180. package/dist/scope-selection-context.js +13 -0
  181. package/dist/scope-selection-context.js.map +1 -0
  182. package/dist/scope-selection-provider.d.ts +33 -0
  183. package/dist/scope-selection-provider.d.ts.map +1 -0
  184. package/dist/scope-selection-provider.js +162 -0
  185. package/dist/scope-selection-provider.js.map +1 -0
  186. package/dist/scope-selection-request.d.ts +6 -0
  187. package/dist/scope-selection-request.d.ts.map +1 -0
  188. package/dist/scope-selection-request.js +12 -0
  189. package/dist/scope-selection-request.js.map +1 -0
  190. package/dist/standard-navigation-shell-frame-renderers.d.ts +15 -0
  191. package/dist/standard-navigation-shell-frame-renderers.d.ts.map +1 -0
  192. package/dist/standard-navigation-shell-frame-renderers.js +22 -0
  193. package/dist/standard-navigation-shell-frame-renderers.js.map +1 -0
  194. package/dist/standard-navigation-shell-slot-renderers.d.ts +59 -0
  195. package/dist/standard-navigation-shell-slot-renderers.d.ts.map +1 -0
  196. package/dist/standard-navigation-shell-slot-renderers.js +67 -0
  197. package/dist/standard-navigation-shell-slot-renderers.js.map +1 -0
  198. package/dist/view-chrome-slot-renderer-registry.d.ts +12 -0
  199. package/dist/view-chrome-slot-renderer-registry.d.ts.map +1 -0
  200. package/dist/view-chrome-slot-renderer-registry.js +12 -0
  201. package/dist/view-chrome-slot-renderer-registry.js.map +1 -0
  202. package/package.json +60 -0
  203. package/src/collection-chrome-slot-renderer-registry.ts +66 -0
  204. package/src/collection-selection-state-context.ts +51 -0
  205. package/src/collection-selection-state.tsx +101 -0
  206. package/src/document-workspace-runtime.tsx +1505 -0
  207. package/src/index.ts +50 -0
  208. package/src/input-form-endpoint-runtime.ts +632 -0
  209. package/src/local-flow-state-data-source-projection.ts +133 -0
  210. package/src/navigation-runtime-context.ts +40 -0
  211. package/src/navigation-shell-frame-renderer-registry.ts +54 -0
  212. package/src/navigation-shell-region-component-registry.tsx +127 -0
  213. package/src/navigation-shell-slot-renderer-registry.ts +88 -0
  214. package/src/page-host-projection.ts +356 -0
  215. package/src/page-host-renderer-registry.tsx +353 -0
  216. package/src/presentation-action-group-runtime-options.ts +121 -0
  217. package/src/presentation-action-runtime.ts +190 -0
  218. package/src/presentation-data-source-binding-runtime.ts +109 -0
  219. package/src/presentation-data-source-binding.tsx +24 -0
  220. package/src/presentation-flow-runtime.tsx +835 -0
  221. package/src/presentation-module-context.ts +10 -0
  222. package/src/presentation-module-provider.tsx +19 -0
  223. package/src/presentation-projection-diagnostics-context.ts +17 -0
  224. package/src/presentation-projection-diagnostics-hooks.ts +29 -0
  225. package/src/presentation-projection-diagnostics-runtime.tsx +95 -0
  226. package/src/presentation-projection-trace.ts +117 -0
  227. package/src/presentation-query-form-runtime.ts +148 -0
  228. package/src/presentation-query-form-state-adapter-registry.ts +25 -0
  229. package/src/presentation-query-form-state-context.ts +56 -0
  230. package/src/presentation-query-form-state.tsx +250 -0
  231. package/src/presentation-renderer-registry.ts +214 -0
  232. package/src/presentation-standards-context.ts +21 -0
  233. package/src/presentation-standards-provider.tsx +44 -0
  234. package/src/projected-document-action-runtime-bindings.ts +132 -0
  235. package/src/projected-document-action-runtime.ts +414 -0
  236. package/src/projected-document-process-preview-action-runtime-bindings.ts +231 -0
  237. package/src/projected-document-process-preview-action-runtime.ts +1725 -0
  238. package/src/projected-document-process-preview-capability-runtime.ts +216 -0
  239. package/src/projected-document-workspace-action-runtime.ts +402 -0
  240. package/src/projected-document-workspace-projection-renderer-diagnostics.ts +342 -0
  241. package/src/projected-document-workspace-runtime-binding-diagnostics.ts +208 -0
  242. package/src/projected-navigation-provider.tsx +104 -0
  243. package/src/projected-presentation-flow-host.tsx +46 -0
  244. package/src/projected-query-form-state-adapter.ts +578 -0
  245. package/src/react-router-binding.tsx +417 -0
  246. package/src/react-router-path.ts +16 -0
  247. package/src/scope-selection-context.ts +58 -0
  248. package/src/scope-selection-provider.tsx +324 -0
  249. package/src/scope-selection-request.ts +21 -0
  250. package/src/standard-navigation-shell-frame-renderers.tsx +106 -0
  251. package/src/standard-navigation-shell-slot-renderers.tsx +289 -0
  252. package/src/view-chrome-slot-renderer-registry.ts +66 -0
@@ -0,0 +1,729 @@
1
+ import { useMemo, useState } from 'react';
2
+ import { useProjectedInputFormEndpointRuntime } from './input-form-endpoint-runtime.js';
3
+ import { findPresentationFlow, findPresentationInputFormForView, findPresentationView, } from '@cohesivesystems/presentation-core';
4
+ import { getPresentationViewProjectedActionPlacements, } from '@cohesivesystems/presentation-core';
5
+ import { projectRequiredPresentationActionEndpointRequest, } from '@cohesivesystems/presentation-core';
6
+ import { projectDocumentLocalActionEnablement, } from '@cohesivesystems/presentation-core';
7
+ import { usePresentationActionExecutor, } from './presentation-action-runtime.js';
8
+ import { advancePresentationFlowToStateKind, findPresentationFlowTransition, findPresentationFlowSurfaceState, isPresentationFlowSurfaceOpenForData, resolvePresentationActionPreparedFlow, } from './presentation-flow-runtime.js';
9
+ import { findDocumentProcessPreviewAction, findInputFormActionPlacement, findPromptCommitAction, findPromptDismissAction, } from '@cohesivesystems/presentation-core';
10
+ import { findPromptDocumentPreviewView, projectPromptDocumentPreviewData, } from '@cohesivesystems/presentation-core';
11
+ import {} from '@cohesivesystems/presentation-core';
12
+ import { projectProcessTaskActionEnablement, projectProcessTaskStartRegistration, projectProcessTaskSelector, } from '@cohesivesystems/presentation-core';
13
+ import { flowStateKinds } from '@cohesivesystems/presentation-contracts';
14
+ /**
15
+ * Generic runtime for document-scoped process-preview flows declared in the
16
+ * presentation IR.
17
+ *
18
+ * It resolves the preview flow, projects the prompt input form, executes the
19
+ * preview endpoint, manages prompt preview state, and starts the confirmed
20
+ * process. Product code supplies domain validation and process-result
21
+ * interpretation.
22
+ */
23
+ export function useProjectedDocumentProcessPreviewActionRuntime({ actionId: runtimeActionId, actionPlacements, createProcessFlowData = createDefaultProcessFlowData, createProcessTaskStartRegistration, createStartInput, createStartFlowData = createDefaultStartFlowData, dataSourceId, dataSourceQueryKey, defaultValue, executeEndpoint, findActiveTask, flowId: runtimeFlowId, flowRegistry, createHref, inputStateKey, isActionAvailable = true, isPreviewBlocked = false, isStartBlocked = false, localActionEnablement, module, processStartResult, processTaskContext, processTaskSelectors = emptyProcessTaskSelectors, projectPreviewResource, projectPreviewValues, projectProcessTaskSelector: projectTaskSelector = projectProcessTaskSelector, preparePreviewRequest, prepareStartRequest, resource, resourceId, resourceKey, registerProcessTaskStart, unavailableMessage = 'This document does not expose a process preview action.', validatePreviewRequest, validateStartRequest, }) {
24
+ const [preview, setPreview] = useState(null);
25
+ const previewAction = useMemo(() => findDocumentProcessPreviewAction({
26
+ actionId: runtimeActionId,
27
+ actionPlacements,
28
+ dataSourceId,
29
+ flowId: runtimeFlowId,
30
+ module,
31
+ }), [actionPlacements, dataSourceId, module, runtimeActionId, runtimeFlowId]);
32
+ const actionFlow = useMemo(() => resolvePresentationActionPreparedFlow(previewAction), [previewAction]);
33
+ const flowId = runtimeFlowId ?? actionFlow?.flowId ?? '';
34
+ const flow = useMemo(() => findPresentationFlow(module, flowId), [flowId, module]);
35
+ const promptView = useMemo(() => {
36
+ const promptViewId = actionFlow?.promptViewId ??
37
+ findPresentationFlowSurfaceState(flow)?.ViewId;
38
+ return promptViewId
39
+ ? findPresentationView(module, promptViewId)
40
+ : null;
41
+ }, [actionFlow?.promptViewId, flow, module]);
42
+ const diagnosticActionPlacements = useMemo(() => getPresentationViewProjectedActionPlacements(promptView), [promptView]);
43
+ const inputForm = useMemo(() => findPresentationInputFormForView(module, promptView), [module, promptView]);
44
+ const previewDefinition = useMemo(() => findPromptDocumentPreviewView(module, promptView)?.PromptDocumentPreview ?? null, [module, promptView]);
45
+ const startAction = useMemo(() => findPromptCommitAction({ module, view: promptView }), [module, promptView]);
46
+ const dismissAction = useMemo(() => findPromptDismissAction({ module, view: promptView }), [module, promptView]);
47
+ const inputFormActionPlacement = useMemo(() => findInputFormActionPlacement(inputForm, previewAction), [inputForm, previewAction]);
48
+ const flowRuntime = flowRegistry.getRuntime(flowId);
49
+ const activePreview = resourceKey !== null && preview?.resourceKey === resourceKey
50
+ ? preview
51
+ : null;
52
+ const isPromptOpen = isPresentationFlowSurfaceOpenForData({
53
+ dataKey: 'resourceKey',
54
+ dataValue: resourceKey,
55
+ flowId,
56
+ runtime: flowRuntime,
57
+ });
58
+ const previewActionId = optionalActionId(previewAction, 'document-process-preview');
59
+ const startActionId = optionalActionId(startAction, 'document-process-start');
60
+ const dismissActionId = optionalActionId(dismissAction, 'document-process-dismiss');
61
+ const hasAction = Boolean(previewAction);
62
+ const processTaskActionEnablement = projectProcessTaskActionEnablement({
63
+ action: previewAction,
64
+ context: processTaskContext ?? {
65
+ resource,
66
+ resourceId,
67
+ route: { id: resourceId },
68
+ },
69
+ findActiveTask: findActiveTask ?? noActiveProcessTask,
70
+ projectSelector: projectTaskSelector,
71
+ selectors: processTaskSelectors,
72
+ });
73
+ const previewActionEnablement = projectDocumentLocalActionEnablement({
74
+ action: previewAction,
75
+ context: localActionEnablement,
76
+ });
77
+ const startActionEnablement = projectDocumentLocalActionEnablement({
78
+ action: startAction,
79
+ context: localActionEnablement,
80
+ });
81
+ const processStart = usePresentationActionExecutor({
82
+ actionId: startActionId,
83
+ dataSourceId,
84
+ dataSourceQueryKey,
85
+ executeEndpoint,
86
+ module,
87
+ prepareRequest: ({ action, actionId, endpointId, input, module: requestModule }) => {
88
+ if (!hasAction || !isActionAvailable || !resource) {
89
+ throw new Error(unavailableMessage);
90
+ }
91
+ if (startActionEnablement.isDisabled) {
92
+ throw new Error(startActionEnablement.message ?? unavailableMessage);
93
+ }
94
+ validateStartRequest?.();
95
+ return prepareStartRequest?.({
96
+ action,
97
+ actionId,
98
+ dataSourceId,
99
+ endpointId,
100
+ input,
101
+ module: requestModule,
102
+ resource,
103
+ resourceId,
104
+ }) ?? projectRequiredPresentationActionEndpointRequest({
105
+ action,
106
+ actionId,
107
+ dataSourceId,
108
+ endpointId,
109
+ sources: {
110
+ input,
111
+ resource,
112
+ route: { id: resourceId },
113
+ },
114
+ });
115
+ },
116
+ processResult: (context) => {
117
+ const successContext = {
118
+ ...context,
119
+ preview: activePreview,
120
+ };
121
+ const registration = createProcessTaskStartRegistration?.({
122
+ ...successContext,
123
+ actionEnablement: processTaskActionEnablement,
124
+ selector: processTaskActionEnablement.selector,
125
+ }) ?? projectProcessTaskStartRegistration({
126
+ action: context.action,
127
+ context: {
128
+ input: context.input,
129
+ resource,
130
+ resourceId,
131
+ result: context.result,
132
+ route: { id: resourceId },
133
+ },
134
+ createHref,
135
+ dataSourceQueryKey,
136
+ result: context.result,
137
+ selector: processTaskActionEnablement.selector,
138
+ });
139
+ if (registration) {
140
+ registerProcessTaskStart?.(registration);
141
+ }
142
+ processStartResult?.(successContext);
143
+ advancePresentationFlowToStateKind({
144
+ allowStateFallback: false,
145
+ data: createProcessFlowData(successContext),
146
+ flow,
147
+ runtime: flowRuntime,
148
+ stateKinds: [flowStateKinds.process],
149
+ });
150
+ },
151
+ onSuccess: () => {
152
+ setPreview(null);
153
+ },
154
+ });
155
+ const previewEndpoint = useProjectedInputFormEndpointRuntime({
156
+ dataSourceId,
157
+ defaultValue,
158
+ defaultValueSources: {
159
+ resource,
160
+ route: { id: resourceId },
161
+ },
162
+ executeEndpoint,
163
+ inputForm,
164
+ invalidateDataSourceIds: [],
165
+ module,
166
+ prepareRequest: (context) => {
167
+ if (!hasAction || !isActionAvailable || !resource || !resourceKey) {
168
+ throw new Error(unavailableMessage);
169
+ }
170
+ if (previewActionEnablement.isDisabled) {
171
+ throw new Error(previewActionEnablement.message ?? unavailableMessage);
172
+ }
173
+ validatePreviewRequest?.();
174
+ return preparePreviewRequest?.({
175
+ action: context.action,
176
+ actionContext: context.actionContext,
177
+ actionId: previewActionId,
178
+ dataSourceId,
179
+ endpointId: context.endpointId,
180
+ inputForm: context.inputForm,
181
+ module: context.module,
182
+ resource,
183
+ resourceId,
184
+ resourceKey,
185
+ value: context.value,
186
+ }) ?? projectRequiredPresentationActionEndpointRequest({
187
+ action: context.action,
188
+ actionId: previewActionId,
189
+ dataSourceId,
190
+ endpointId: context.endpointId,
191
+ sources: {
192
+ input: context.value,
193
+ resource,
194
+ route: { id: resourceId },
195
+ },
196
+ });
197
+ },
198
+ onSuccess: ({ result, value }) => {
199
+ if (!resource || !resourceKey) {
200
+ return;
201
+ }
202
+ const projectedPreview = projectPromptDocumentPreviewData({
203
+ definition: previewDefinition,
204
+ request: value,
205
+ resource: projectPreviewResource?.({
206
+ request: value,
207
+ resource,
208
+ resourceKey,
209
+ response: result,
210
+ }) ?? undefined,
211
+ response: result,
212
+ values: {
213
+ ...(projectPreviewValues?.({
214
+ request: value,
215
+ resource,
216
+ resourceKey,
217
+ response: result,
218
+ }) ?? {}),
219
+ resourceKey,
220
+ },
221
+ });
222
+ advancePresentationFlowToStateKind({
223
+ allowStateFallback: false,
224
+ data: projectedPreview,
225
+ flow,
226
+ runtime: flowRuntime,
227
+ stateKinds: [flowStateKinds.prompt],
228
+ });
229
+ setPreview(projectedPreview);
230
+ },
231
+ stateKey: inputStateKey ?? null,
232
+ });
233
+ const canStartPreviewTransition = Boolean(resourceKey &&
234
+ canStartFlowAction({
235
+ action: previewAction,
236
+ actionId: previewActionId,
237
+ data: { resourceKey },
238
+ flow,
239
+ }));
240
+ const previewDisabledReason = resolveProcessPreviewDisabledReason({
241
+ canStartPreviewTransition,
242
+ flow,
243
+ inputForm,
244
+ inputFormActionPlacement,
245
+ isActionAvailable,
246
+ previewAction,
247
+ previewActionEnablement,
248
+ previewDefinition,
249
+ previewEndpointId: previewEndpoint.endpointId,
250
+ processStartEndpointId: processStart.endpointId,
251
+ processTaskActionEnablement,
252
+ promptView,
253
+ resourceKey,
254
+ });
255
+ const activePreviewStartFlowData = activePreview
256
+ ? createStartFlowData(activePreview)
257
+ : null;
258
+ const canDispatchStartTransition = Boolean(activePreviewStartFlowData &&
259
+ canDispatchFlowAction({
260
+ action: startAction,
261
+ actionId: startActionId,
262
+ data: activePreviewStartFlowData,
263
+ flow,
264
+ runtime: flowRuntime,
265
+ }));
266
+ const startDisabledReason = resolveProcessStartDisabledReason({
267
+ activePreview,
268
+ canDispatchStartTransition,
269
+ isStartBlocked,
270
+ processStartEndpointId: processStart.endpointId,
271
+ processTaskActionEnablement,
272
+ startAction,
273
+ startActionEnablement,
274
+ });
275
+ const diagnostics = projectProcessPreviewRuntimeDiagnostics({
276
+ actionId: runtimeActionId,
277
+ dismissAction,
278
+ flow,
279
+ flowId,
280
+ inputForm,
281
+ inputFormActionPlacement,
282
+ previewAction,
283
+ previewDefinition,
284
+ previewEndpointId: previewEndpoint.endpointId,
285
+ promptView,
286
+ source: 'document-process-preview-action-runtime',
287
+ startAction,
288
+ startEndpointId: processStart.endpointId,
289
+ });
290
+ const canExecuteAction = previewDisabledReason === null;
291
+ const canAcceptPreview = Boolean(activePreview && startDisabledReason === null);
292
+ const inputRuntime = previewEndpoint.runtime
293
+ ? {
294
+ invokeAction: requestPreview,
295
+ setValue: previewEndpoint.runtime.setValue,
296
+ value: previewEndpoint.runtime.value,
297
+ }
298
+ : null;
299
+ function reset() {
300
+ processStart.reset();
301
+ previewEndpoint.reset();
302
+ flowRuntime.clearFlow();
303
+ setPreview(null);
304
+ }
305
+ function requestPreview(actionContext) {
306
+ if (!hasAction ||
307
+ !isActionAvailable ||
308
+ !canExecuteAction ||
309
+ !resource ||
310
+ !resourceKey ||
311
+ isPreviewBlocked ||
312
+ previewEndpoint.isPending ||
313
+ processStart.isPending) {
314
+ return;
315
+ }
316
+ processStart.reset();
317
+ previewEndpoint.resetExecution();
318
+ setPreview(null);
319
+ const started = flowRuntime.startFlow({
320
+ actionId: previewActionId,
321
+ data: { resourceKey },
322
+ flowId,
323
+ });
324
+ if (!started) {
325
+ return;
326
+ }
327
+ requestInputFormPreview(actionContext);
328
+ }
329
+ function cancelPrompt() {
330
+ previewEndpoint.reset();
331
+ if (!flowRuntime.dispatchAction(dismissActionId)) {
332
+ flowRuntime.clearFlow();
333
+ return;
334
+ }
335
+ flowRuntime.clearFlow();
336
+ }
337
+ function cancelPreview() {
338
+ processStart.reset();
339
+ if (!flowRuntime.dispatchAction(dismissActionId)) {
340
+ flowRuntime.clearFlow();
341
+ setPreview(null);
342
+ return;
343
+ }
344
+ flowRuntime.clearFlow();
345
+ setPreview(null);
346
+ }
347
+ function acceptPreview() {
348
+ if (processStart.isPending || !canAcceptPreview || !activePreview) {
349
+ return;
350
+ }
351
+ const startFlowData = createStartFlowData(activePreview);
352
+ if (!flowRuntime.dispatchAction(startActionId, { data: startFlowData })) {
353
+ return;
354
+ }
355
+ processStart.execute(createStartInput?.(activePreview) ??
356
+ projectDefaultProcessStartInput(activePreview));
357
+ }
358
+ function requestInputFormPreview(actionContext) {
359
+ if (!inputForm || !previewEndpoint.runtime) {
360
+ return;
361
+ }
362
+ if (!inputFormActionPlacement) {
363
+ return;
364
+ }
365
+ previewEndpoint.runtime.invokeAction(actionContext ?? {
366
+ action: previewAction,
367
+ choiceValuesByFieldId: Object.fromEntries(inputForm.Fields.map((field) => [field.Id, []])),
368
+ inputForm,
369
+ placement: inputFormActionPlacement,
370
+ target: {
371
+ stateId: inputForm.SharedStateId ??
372
+ inputForm.Target.Id ??
373
+ inputForm.StateDataSourceId,
374
+ },
375
+ value: previewEndpoint.value,
376
+ });
377
+ }
378
+ return {
379
+ actions: {
380
+ dismiss: dismissAction,
381
+ preview: previewAction,
382
+ start: processStart.action,
383
+ },
384
+ actionEnablement: {
385
+ preview: previewActionEnablement,
386
+ start: startActionEnablement,
387
+ },
388
+ actionIds: {
389
+ dismiss: dismissActionId,
390
+ preview: previewActionId,
391
+ start: startActionId,
392
+ },
393
+ acceptPreview,
394
+ activePreview,
395
+ canAcceptPreview,
396
+ canExecuteAction,
397
+ cancelPreview,
398
+ cancelPrompt,
399
+ diagnosticActionPlacements,
400
+ diagnostics,
401
+ disabledReasons: {
402
+ preview: previewDisabledReason,
403
+ start: startDisabledReason,
404
+ },
405
+ flow,
406
+ flowId,
407
+ flowRuntime,
408
+ hasAction,
409
+ input: {
410
+ form: inputForm,
411
+ runtime: inputRuntime,
412
+ },
413
+ isPromptOpen,
414
+ preview: {
415
+ endpointId: previewEndpoint.endpointId,
416
+ error: previewEndpoint.error,
417
+ isPending: previewEndpoint.isPending,
418
+ reset: previewEndpoint.reset,
419
+ resetExecution: previewEndpoint.resetExecution,
420
+ },
421
+ processTask: processTaskActionEnablement,
422
+ promptView,
423
+ requestPreview,
424
+ reset,
425
+ start: {
426
+ action: processStart.action,
427
+ endpointId: processStart.endpointId,
428
+ error: processStart.error,
429
+ isPending: processStart.isPending,
430
+ reset: processStart.reset,
431
+ },
432
+ };
433
+ }
434
+ function createDefaultStartFlowData(preview) {
435
+ return {
436
+ request: preview.request,
437
+ resourceKey: preview.resourceKey,
438
+ ...readRecord(preview.response),
439
+ };
440
+ }
441
+ function createDefaultProcessFlowData(context) {
442
+ return readRecord(context.result) ?? { result: context.result };
443
+ }
444
+ function readRecord(value) {
445
+ return value && typeof value === 'object' && !Array.isArray(value)
446
+ ? value
447
+ : null;
448
+ }
449
+ function projectDefaultProcessStartInput(preview) {
450
+ const response = readRecord(preview.response);
451
+ const startRequest = readCaseInsensitiveField(response, 'StartRequest') ??
452
+ readCaseInsensitiveField(response, 'Request');
453
+ return (startRequest ?? preview.request);
454
+ }
455
+ function readCaseInsensitiveField(record, field) {
456
+ if (!record) {
457
+ return undefined;
458
+ }
459
+ if (Object.prototype.hasOwnProperty.call(record, field)) {
460
+ return record[field];
461
+ }
462
+ const match = Object.keys(record).find((candidate) => candidate.toLowerCase() === field.toLowerCase());
463
+ return match ? record[match] : undefined;
464
+ }
465
+ function optionalActionId(action, fallback) {
466
+ return action?.Id ?? `missing:${fallback}`;
467
+ }
468
+ const emptyProcessTaskSelectors = [];
469
+ function noActiveProcessTask() {
470
+ return null;
471
+ }
472
+ function resolveProcessPreviewDisabledReason({ canStartPreviewTransition, flow, inputForm, inputFormActionPlacement, isActionAvailable, previewAction, previewActionEnablement, previewDefinition, previewEndpointId, processStartEndpointId, processTaskActionEnablement, promptView, resourceKey, }) {
473
+ if (!previewAction || !isActionAvailable) {
474
+ return 'This document does not expose a process preview action.';
475
+ }
476
+ if (!flow) {
477
+ return `Action '${previewAction.Name}' does not resolve a preview flow.`;
478
+ }
479
+ if (!promptView) {
480
+ return `Preview flow '${flow.Name}' does not resolve a prompt view.`;
481
+ }
482
+ if (!inputForm) {
483
+ return `Prompt view '${promptView.Name}' does not resolve an input form.`;
484
+ }
485
+ if (!inputFormActionPlacement) {
486
+ return `Input form '${inputForm.Name}' does not place the preview action.`;
487
+ }
488
+ if (!previewDefinition) {
489
+ return `Prompt view '${promptView.Name}' does not declare a document preview surface.`;
490
+ }
491
+ if (!previewEndpointId) {
492
+ return `No preview endpoint is bound for action '${previewAction.Name}'.`;
493
+ }
494
+ if (!processStartEndpointId) {
495
+ return 'No process start endpoint is bound for the preview confirmation action.';
496
+ }
497
+ if (!resourceKey) {
498
+ return 'A loaded resource is required before previewing this process.';
499
+ }
500
+ if (!canStartPreviewTransition) {
501
+ return `Preview flow '${flow.Name}' cannot start from its initial state.`;
502
+ }
503
+ if (previewActionEnablement.isDisabled) {
504
+ return previewActionEnablement.message;
505
+ }
506
+ if (processTaskActionEnablement.isDisabled) {
507
+ return processTaskActionEnablement.message;
508
+ }
509
+ return null;
510
+ }
511
+ function resolveProcessStartDisabledReason({ activePreview, canDispatchStartTransition, isStartBlocked, processStartEndpointId, processTaskActionEnablement, startAction, startActionEnablement, }) {
512
+ if (!activePreview) {
513
+ return 'A preview is required before starting this process.';
514
+ }
515
+ if (!startAction) {
516
+ return 'The preview prompt does not declare a process start action.';
517
+ }
518
+ if (!processStartEndpointId) {
519
+ return `No process start endpoint is bound for action '${startAction.Name}'.`;
520
+ }
521
+ if (!canDispatchStartTransition) {
522
+ return 'The preview flow is not in a startable state.';
523
+ }
524
+ if (startActionEnablement.isDisabled) {
525
+ return startActionEnablement.message;
526
+ }
527
+ if (processTaskActionEnablement.isDisabled) {
528
+ return processTaskActionEnablement.message;
529
+ }
530
+ if (isStartBlocked) {
531
+ return 'Starting this process is currently blocked.';
532
+ }
533
+ return null;
534
+ }
535
+ function canDispatchFlowAction({ action, actionId, data, flow, runtime, }) {
536
+ const instance = runtime.activeInstance;
537
+ if (!flow || !instance || instance.flowId !== flow.Id) {
538
+ return false;
539
+ }
540
+ return Boolean(findPresentationFlowTransition({
541
+ actionId,
542
+ data: {
543
+ ...instance.data,
544
+ ...data,
545
+ },
546
+ event: action?.Binding.Id ?? actionId,
547
+ flow,
548
+ fromStateId: instance.stateId,
549
+ }));
550
+ }
551
+ function canStartFlowAction({ action, actionId, data, flow, }) {
552
+ if (!flow) {
553
+ return false;
554
+ }
555
+ return Boolean(findPresentationFlowTransition({
556
+ actionId,
557
+ data,
558
+ event: action?.Binding.Id ?? actionId,
559
+ flow,
560
+ fromStateId: flow.InitialStateId,
561
+ }));
562
+ }
563
+ function projectProcessPreviewRuntimeDiagnostics({ actionId, dismissAction, flow, flowId, inputForm, inputFormActionPlacement, previewAction, previewDefinition, previewEndpointId, promptView, source, startAction, startEndpointId, }) {
564
+ if (!actionId && !previewAction) {
565
+ return [];
566
+ }
567
+ return [
568
+ ...diagnoseProcessPreviewAction({ actionId, previewAction, source }),
569
+ ...diagnoseProcessPreviewFlow({
570
+ flow,
571
+ flowId,
572
+ inputForm,
573
+ inputFormActionPlacement,
574
+ previewAction,
575
+ previewDefinition,
576
+ previewEndpointId,
577
+ promptView,
578
+ source,
579
+ startAction,
580
+ startEndpointId,
581
+ }),
582
+ ...diagnoseProcessPreviewDismissAction({
583
+ dismissAction,
584
+ promptView,
585
+ source,
586
+ }),
587
+ ];
588
+ }
589
+ function diagnoseProcessPreviewAction({ actionId, previewAction, source, }) {
590
+ if (!actionId || previewAction) {
591
+ return [];
592
+ }
593
+ return [
594
+ createProcessPreviewRuntimeDiagnostic({
595
+ details: { actionId },
596
+ id: `process-preview.${actionId}.missing-action`,
597
+ message: `Document action runtime profile references process preview action '${actionId}', ` +
598
+ 'but the action is not placed or cannot be interpreted as a document process preview.',
599
+ severity: 'error',
600
+ source,
601
+ subject: {
602
+ id: actionId,
603
+ kind: 'action',
604
+ },
605
+ }),
606
+ ];
607
+ }
608
+ function diagnoseProcessPreviewFlow({ flow, flowId, inputForm, inputFormActionPlacement, previewAction, previewDefinition, previewEndpointId, promptView, source, startAction, startEndpointId, }) {
609
+ if (!previewAction) {
610
+ return [];
611
+ }
612
+ const diagnostics = [];
613
+ if (!flow) {
614
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
615
+ details: { actionId: previewAction.Id, flowId },
616
+ id: `process-preview.${previewAction.Id}.missing-flow`,
617
+ message: `Process preview action '${previewAction.Name}' references flow '${flowId}', ` +
618
+ 'but that flow is not present in the presentation module.',
619
+ severity: 'error',
620
+ source,
621
+ subject: { id: previewAction.Id, kind: 'action', name: previewAction.Name },
622
+ }));
623
+ return diagnostics;
624
+ }
625
+ if (!promptView) {
626
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
627
+ details: { actionId: previewAction.Id, flowId: flow.Id },
628
+ id: `process-preview.${previewAction.Id}.missing-prompt-view`,
629
+ message: `Process preview flow '${flow.Name}' does not resolve a prompt view for ` +
630
+ `action '${previewAction.Name}'.`,
631
+ severity: 'error',
632
+ source,
633
+ subject: { id: flow.Id, kind: 'flow', name: flow.Name },
634
+ }));
635
+ }
636
+ if (!inputForm) {
637
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
638
+ details: { actionId: previewAction.Id, flowId: flow.Id, viewId: promptView?.Id },
639
+ id: `process-preview.${previewAction.Id}.missing-input-form`,
640
+ message: `Process preview prompt '${promptView?.Name ?? flow.Name}' does not resolve ` +
641
+ 'an input form.',
642
+ severity: 'error',
643
+ source,
644
+ subject: { id: promptView?.Id ?? flow.Id, kind: promptView ? 'view' : 'flow' },
645
+ }));
646
+ }
647
+ if (inputForm && !inputFormActionPlacement) {
648
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
649
+ details: { actionId: previewAction.Id, inputFormId: inputForm.Id },
650
+ id: `process-preview.${previewAction.Id}.missing-input-form-action`,
651
+ message: `Input form '${inputForm.Name}' does not place process preview action ` +
652
+ `'${previewAction.Name}'.`,
653
+ severity: 'error',
654
+ source,
655
+ subject: { id: inputForm.Id, kind: 'input-form', name: inputForm.Name },
656
+ }));
657
+ }
658
+ if (!previewDefinition) {
659
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
660
+ details: { actionId: previewAction.Id, flowId: flow.Id, viewId: promptView?.Id },
661
+ id: `process-preview.${previewAction.Id}.missing-preview-surface`,
662
+ message: `Process preview prompt '${promptView?.Name ?? flow.Name}' does not declare ` +
663
+ 'a document preview surface.',
664
+ severity: 'error',
665
+ source,
666
+ subject: { id: promptView?.Id ?? flow.Id, kind: promptView ? 'view' : 'flow' },
667
+ }));
668
+ }
669
+ if (!previewEndpointId) {
670
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
671
+ details: { actionId: previewAction.Id, inputFormId: inputForm?.Id },
672
+ id: `process-preview.${previewAction.Id}.missing-preview-endpoint`,
673
+ message: `No endpoint binding is registered for process preview action ` +
674
+ `'${previewAction.Name}'.`,
675
+ severity: 'error',
676
+ source,
677
+ subject: { id: previewAction.Id, kind: 'action', name: previewAction.Name },
678
+ }));
679
+ }
680
+ if (!startAction) {
681
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
682
+ details: { actionId: previewAction.Id, flowId: flow.Id, viewId: promptView?.Id },
683
+ id: `process-preview.${previewAction.Id}.missing-start-action`,
684
+ message: `Process preview prompt '${promptView?.Name ?? flow.Name}' does not declare ` +
685
+ 'a process start action.',
686
+ severity: 'error',
687
+ source,
688
+ subject: { id: promptView?.Id ?? flow.Id, kind: promptView ? 'view' : 'flow' },
689
+ }));
690
+ }
691
+ else if (!startEndpointId) {
692
+ diagnostics.push(createProcessPreviewRuntimeDiagnostic({
693
+ details: { actionId: startAction.Id, flowId: flow.Id },
694
+ id: `process-preview.${startAction.Id}.missing-start-endpoint`,
695
+ message: `No endpoint binding is registered for process start action ` +
696
+ `'${startAction.Name}'.`,
697
+ severity: 'error',
698
+ source,
699
+ subject: { id: startAction.Id, kind: 'action', name: startAction.Name },
700
+ }));
701
+ }
702
+ return diagnostics;
703
+ }
704
+ function diagnoseProcessPreviewDismissAction({ dismissAction, promptView, source, }) {
705
+ if (!promptView || dismissAction) {
706
+ return [];
707
+ }
708
+ return [
709
+ createProcessPreviewRuntimeDiagnostic({
710
+ details: { viewId: promptView.Id },
711
+ id: `process-preview.${promptView.Id}.missing-dismiss-action`,
712
+ message: `Process preview prompt '${promptView.Name}' does not declare a dismiss action.`,
713
+ severity: 'warning',
714
+ source,
715
+ subject: { id: promptView.Id, kind: 'view', name: promptView.Name },
716
+ }),
717
+ ];
718
+ }
719
+ function createProcessPreviewRuntimeDiagnostic({ details, id, message, severity, source, subject, }) {
720
+ return {
721
+ details,
722
+ id,
723
+ message,
724
+ severity,
725
+ source,
726
+ subject,
727
+ };
728
+ }
729
+ //# sourceMappingURL=projected-document-process-preview-action-runtime.js.map