@nocobase/flow-engine 2.1.0-alpha.4 → 2.1.0-alpha.45

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 (209) hide show
  1. package/LICENSE +201 -661
  2. package/README.md +79 -10
  3. package/lib/FlowContextProvider.d.ts +5 -1
  4. package/lib/FlowContextProvider.js +9 -2
  5. package/lib/JSRunner.d.ts +10 -1
  6. package/lib/JSRunner.js +50 -5
  7. package/lib/ViewScopedFlowEngine.js +5 -1
  8. package/lib/components/FieldModelRenderer.js +2 -2
  9. package/lib/components/FlowModelRenderer.d.ts +3 -1
  10. package/lib/components/FlowModelRenderer.js +12 -6
  11. package/lib/components/FormItem.d.ts +6 -0
  12. package/lib/components/FormItem.js +11 -3
  13. package/lib/components/MobilePopup.js +6 -5
  14. package/lib/components/dnd/gridDragPlanner.d.ts +59 -2
  15. package/lib/components/dnd/gridDragPlanner.js +613 -21
  16. package/lib/components/dnd/index.d.ts +31 -2
  17. package/lib/components/dnd/index.js +244 -23
  18. package/lib/components/settings/wrappers/component/SelectWithTitle.d.ts +2 -1
  19. package/lib/components/settings/wrappers/component/SelectWithTitle.js +14 -12
  20. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.d.ts +3 -0
  21. package/lib/components/settings/wrappers/contextual/DefaultSettingsIcon.js +76 -11
  22. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.d.ts +23 -43
  23. package/lib/components/settings/wrappers/contextual/FlowsFloatContextMenu.js +352 -295
  24. package/lib/components/settings/wrappers/contextual/StepSettingsDialog.js +16 -2
  25. package/lib/components/settings/wrappers/contextual/useFloatToolbarPortal.d.ts +36 -0
  26. package/lib/components/settings/wrappers/contextual/useFloatToolbarPortal.js +274 -0
  27. package/lib/components/settings/wrappers/contextual/useFloatToolbarVisibility.d.ts +30 -0
  28. package/lib/components/settings/wrappers/contextual/useFloatToolbarVisibility.js +315 -0
  29. package/lib/components/subModel/AddSubModelButton.js +27 -1
  30. package/lib/components/subModel/LazyDropdown.js +293 -52
  31. package/lib/components/subModel/index.d.ts +1 -0
  32. package/lib/components/subModel/index.js +19 -0
  33. package/lib/components/subModel/utils.d.ts +1 -1
  34. package/lib/components/subModel/utils.js +9 -3
  35. package/lib/components/variables/VariableHybridInput.d.ts +27 -0
  36. package/lib/components/variables/VariableHybridInput.js +499 -0
  37. package/lib/components/variables/index.d.ts +2 -0
  38. package/lib/components/variables/index.js +3 -0
  39. package/lib/data-source/index.d.ts +84 -0
  40. package/lib/data-source/index.js +259 -5
  41. package/lib/executor/FlowExecutor.js +32 -9
  42. package/lib/flow-registry/DetachedFlowRegistry.d.ts +21 -0
  43. package/lib/flow-registry/DetachedFlowRegistry.js +80 -0
  44. package/lib/flow-registry/index.d.ts +1 -0
  45. package/lib/flow-registry/index.js +3 -1
  46. package/lib/flowContext.d.ts +3 -0
  47. package/lib/flowContext.js +46 -1
  48. package/lib/flowEngine.d.ts +151 -1
  49. package/lib/flowEngine.js +392 -18
  50. package/lib/flowI18n.js +2 -1
  51. package/lib/flowSettings.d.ts +14 -6
  52. package/lib/flowSettings.js +34 -6
  53. package/lib/index.d.ts +2 -0
  54. package/lib/index.js +7 -0
  55. package/lib/lazy-helper.d.ts +14 -0
  56. package/lib/lazy-helper.js +71 -0
  57. package/lib/locale/en-US.json +1 -0
  58. package/lib/locale/index.d.ts +2 -0
  59. package/lib/locale/zh-CN.json +1 -0
  60. package/lib/models/DisplayItemModel.d.ts +1 -1
  61. package/lib/models/EditableItemModel.d.ts +1 -1
  62. package/lib/models/FilterableItemModel.d.ts +1 -1
  63. package/lib/models/flowModel.d.ts +13 -10
  64. package/lib/models/flowModel.js +81 -21
  65. package/lib/provider.js +38 -23
  66. package/lib/reactive/observer.js +46 -16
  67. package/lib/runjs-context/registry.d.ts +1 -1
  68. package/lib/runjs-context/setup.js +20 -12
  69. package/lib/runjs-context/snippets/index.js +13 -2
  70. package/lib/runjs-context/snippets/scene/detail/set-field-style.snippet.d.ts +11 -0
  71. package/lib/runjs-context/snippets/scene/detail/set-field-style.snippet.js +50 -0
  72. package/lib/runjs-context/snippets/scene/table/set-cell-style.snippet.d.ts +11 -0
  73. package/lib/runjs-context/snippets/scene/table/set-cell-style.snippet.js +54 -0
  74. package/lib/scheduler/ModelOperationScheduler.d.ts +5 -1
  75. package/lib/scheduler/ModelOperationScheduler.js +3 -2
  76. package/lib/types.d.ts +50 -2
  77. package/lib/types.js +1 -0
  78. package/lib/utils/createCollectionContextMeta.js +6 -2
  79. package/lib/utils/index.d.ts +3 -2
  80. package/lib/utils/index.js +7 -0
  81. package/lib/utils/parsePathnameToViewParams.d.ts +5 -1
  82. package/lib/utils/parsePathnameToViewParams.js +29 -5
  83. package/lib/utils/randomId.d.ts +39 -0
  84. package/lib/utils/randomId.js +45 -0
  85. package/lib/utils/runjsTemplateCompat.js +1 -1
  86. package/lib/utils/runjsValue.js +41 -11
  87. package/lib/utils/schema-utils.d.ts +7 -1
  88. package/lib/utils/schema-utils.js +19 -0
  89. package/lib/views/FlowView.d.ts +7 -1
  90. package/lib/views/FlowView.js +11 -1
  91. package/lib/views/PageComponent.js +8 -6
  92. package/lib/views/ViewNavigation.d.ts +12 -2
  93. package/lib/views/ViewNavigation.js +28 -9
  94. package/lib/views/createViewMeta.js +114 -50
  95. package/lib/views/inheritLayoutContext.d.ts +10 -0
  96. package/lib/views/inheritLayoutContext.js +50 -0
  97. package/lib/views/runViewBeforeClose.d.ts +10 -0
  98. package/lib/views/runViewBeforeClose.js +45 -0
  99. package/lib/views/useDialog.d.ts +2 -1
  100. package/lib/views/useDialog.js +22 -3
  101. package/lib/views/useDrawer.d.ts +2 -1
  102. package/lib/views/useDrawer.js +22 -3
  103. package/lib/views/usePage.d.ts +5 -11
  104. package/lib/views/usePage.js +304 -144
  105. package/package.json +6 -5
  106. package/src/FlowContextProvider.tsx +9 -1
  107. package/src/JSRunner.ts +68 -4
  108. package/src/ViewScopedFlowEngine.ts +4 -0
  109. package/src/__tests__/JSRunner.test.ts +27 -1
  110. package/src/__tests__/createViewMeta.popup.test.ts +115 -1
  111. package/src/__tests__/flow-engine.test.ts +166 -0
  112. package/src/__tests__/flowContext.test.ts +82 -1
  113. package/src/__tests__/flowEngine.modelLoaders.test.ts +245 -0
  114. package/src/__tests__/flowEngine.removeModel.test.ts +47 -3
  115. package/src/__tests__/flowSettings.test.ts +94 -15
  116. package/src/__tests__/objectVariable.test.ts +24 -0
  117. package/src/__tests__/provider.test.tsx +24 -2
  118. package/src/__tests__/renderHiddenInConfig.test.tsx +6 -6
  119. package/src/__tests__/runjsContext.test.ts +16 -0
  120. package/src/__tests__/runjsContextRuntime.test.ts +2 -0
  121. package/src/__tests__/runjsPreprocessDefault.test.ts +23 -0
  122. package/src/__tests__/runjsSnippets.test.ts +21 -0
  123. package/src/__tests__/viewScopedFlowEngine.test.ts +3 -3
  124. package/src/components/FieldModelRenderer.tsx +2 -1
  125. package/src/components/FlowModelRenderer.tsx +18 -6
  126. package/src/components/FormItem.tsx +7 -1
  127. package/src/components/MobilePopup.tsx +4 -2
  128. package/src/components/__tests__/FlowModelRenderer.test.tsx +65 -2
  129. package/src/components/__tests__/FormItem.test.tsx +25 -0
  130. package/src/components/__tests__/dnd.test.ts +44 -0
  131. package/src/components/__tests__/flow-model-render-error-fallback.test.tsx +20 -10
  132. package/src/components/__tests__/gridDragPlanner.test.ts +558 -3
  133. package/src/components/dnd/__tests__/DndProvider.test.tsx +98 -0
  134. package/src/components/dnd/gridDragPlanner.ts +758 -19
  135. package/src/components/dnd/index.tsx +305 -28
  136. package/src/components/settings/wrappers/component/SelectWithTitle.tsx +21 -9
  137. package/src/components/settings/wrappers/contextual/DefaultSettingsIcon.tsx +99 -11
  138. package/src/components/settings/wrappers/contextual/FlowsFloatContextMenu.tsx +487 -440
  139. package/src/components/settings/wrappers/contextual/StepSettingsDialog.tsx +18 -2
  140. package/src/components/settings/wrappers/contextual/__tests__/DefaultSettingsIcon.test.tsx +194 -5
  141. package/src/components/settings/wrappers/contextual/__tests__/FlowsFloatContextMenu.test.tsx +778 -0
  142. package/src/components/settings/wrappers/contextual/useFloatToolbarPortal.ts +360 -0
  143. package/src/components/settings/wrappers/contextual/useFloatToolbarVisibility.ts +361 -0
  144. package/src/components/subModel/AddSubModelButton.tsx +32 -2
  145. package/src/components/subModel/LazyDropdown.tsx +332 -56
  146. package/src/components/subModel/__tests__/AddSubModelButton.test.tsx +522 -37
  147. package/src/components/subModel/__tests__/utils.test.ts +24 -0
  148. package/src/components/subModel/index.ts +1 -0
  149. package/src/components/subModel/utils.ts +7 -1
  150. package/src/components/variables/VariableHybridInput.tsx +531 -0
  151. package/src/components/variables/index.ts +2 -0
  152. package/src/data-source/__tests__/collection.test.ts +41 -2
  153. package/src/data-source/__tests__/index.test.ts +68 -1
  154. package/src/data-source/index.ts +322 -6
  155. package/src/executor/FlowExecutor.ts +35 -10
  156. package/src/executor/__tests__/flowExecutor.test.ts +85 -0
  157. package/src/flow-registry/DetachedFlowRegistry.ts +46 -0
  158. package/src/flow-registry/__tests__/detachedFlowRegistry.test.ts +47 -0
  159. package/src/flow-registry/index.ts +1 -0
  160. package/src/flowContext.ts +50 -3
  161. package/src/flowEngine.ts +449 -14
  162. package/src/flowI18n.ts +2 -1
  163. package/src/flowSettings.ts +40 -6
  164. package/src/index.ts +2 -0
  165. package/src/lazy-helper.tsx +57 -0
  166. package/src/locale/en-US.json +1 -0
  167. package/src/locale/zh-CN.json +1 -0
  168. package/src/models/DisplayItemModel.tsx +1 -1
  169. package/src/models/EditableItemModel.tsx +1 -1
  170. package/src/models/FilterableItemModel.tsx +1 -1
  171. package/src/models/__tests__/dispatchEvent.when.test.ts +214 -0
  172. package/src/models/__tests__/flowEngine.resolveUse.test.ts +0 -15
  173. package/src/models/__tests__/flowModel.test.ts +80 -37
  174. package/src/models/flowModel.tsx +122 -36
  175. package/src/provider.tsx +41 -25
  176. package/src/reactive/__tests__/observer.test.tsx +82 -0
  177. package/src/reactive/observer.tsx +87 -25
  178. package/src/runjs-context/registry.ts +1 -1
  179. package/src/runjs-context/setup.ts +22 -12
  180. package/src/runjs-context/snippets/index.ts +12 -1
  181. package/src/runjs-context/snippets/scene/detail/set-field-style.snippet.ts +30 -0
  182. package/src/runjs-context/snippets/scene/table/set-cell-style.snippet.ts +34 -0
  183. package/src/scheduler/ModelOperationScheduler.ts +14 -3
  184. package/src/types.ts +62 -0
  185. package/src/utils/__tests__/createCollectionContextMeta.test.ts +48 -0
  186. package/src/utils/__tests__/parsePathnameToViewParams.test.ts +28 -0
  187. package/src/utils/__tests__/runjsValue.test.ts +11 -0
  188. package/src/utils/__tests__/utils.test.ts +62 -0
  189. package/src/utils/createCollectionContextMeta.ts +6 -2
  190. package/src/utils/index.ts +5 -1
  191. package/src/utils/parsePathnameToViewParams.ts +47 -7
  192. package/src/utils/randomId.ts +48 -0
  193. package/src/utils/runjsTemplateCompat.ts +1 -1
  194. package/src/utils/runjsValue.ts +50 -11
  195. package/src/utils/schema-utils.ts +30 -1
  196. package/src/views/FlowView.tsx +22 -2
  197. package/src/views/PageComponent.tsx +7 -4
  198. package/src/views/ViewNavigation.ts +46 -9
  199. package/src/views/__tests__/FlowView.usePage.test.tsx +243 -3
  200. package/src/views/__tests__/ViewNavigation.test.ts +52 -0
  201. package/src/views/__tests__/inheritLayoutContext.test.ts +53 -0
  202. package/src/views/__tests__/runViewBeforeClose.test.ts +30 -0
  203. package/src/views/__tests__/useDialog.closeDestroy.test.tsx +13 -12
  204. package/src/views/createViewMeta.ts +106 -34
  205. package/src/views/inheritLayoutContext.ts +26 -0
  206. package/src/views/runViewBeforeClose.ts +19 -0
  207. package/src/views/useDialog.tsx +27 -3
  208. package/src/views/useDrawer.tsx +27 -3
  209. package/src/views/usePage.tsx +367 -179
@@ -0,0 +1,50 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var inheritLayoutContext_exports = {};
29
+ __export(inheritLayoutContext_exports, {
30
+ inheritLayoutContextForDetachedView: () => inheritLayoutContextForDetachedView
31
+ });
32
+ module.exports = __toCommonJS(inheritLayoutContext_exports);
33
+ var import_flowContext = require("../flowContext");
34
+ function inheritLayoutContextForDetachedView(viewContext, sourceContext) {
35
+ var _a;
36
+ const layoutContext = sourceContext == null ? void 0 : sourceContext.layoutContext;
37
+ const engineContext = (_a = sourceContext == null ? void 0 : sourceContext.engine) == null ? void 0 : _a.context;
38
+ if (!(layoutContext instanceof import_flowContext.FlowContext)) {
39
+ return;
40
+ }
41
+ if (layoutContext === sourceContext || layoutContext === engineContext) {
42
+ return;
43
+ }
44
+ viewContext.addDelegate(layoutContext);
45
+ }
46
+ __name(inheritLayoutContextForDetachedView, "inheritLayoutContextForDetachedView");
47
+ // Annotate the CommonJS export names for ESM import in node:
48
+ 0 && (module.exports = {
49
+ inheritLayoutContextForDetachedView
50
+ });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ import type { FlowView, FlowViewBeforeClosePayload } from './FlowView';
10
+ export declare function runViewBeforeClose(view: FlowView, payload: FlowViewBeforeClosePayload): Promise<boolean>;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+
10
+ var __defProp = Object.defineProperty;
11
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
+ var __getOwnPropNames = Object.getOwnPropertyNames;
13
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
14
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
15
+ var __export = (target, all) => {
16
+ for (var name in all)
17
+ __defProp(target, name, { get: all[name], enumerable: true });
18
+ };
19
+ var __copyProps = (to, from, except, desc) => {
20
+ if (from && typeof from === "object" || typeof from === "function") {
21
+ for (let key of __getOwnPropNames(from))
22
+ if (!__hasOwnProp.call(to, key) && key !== except)
23
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
24
+ }
25
+ return to;
26
+ };
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var runViewBeforeClose_exports = {};
29
+ __export(runViewBeforeClose_exports, {
30
+ runViewBeforeClose: () => runViewBeforeClose
31
+ });
32
+ module.exports = __toCommonJS(runViewBeforeClose_exports);
33
+ async function runViewBeforeClose(view, payload) {
34
+ var _a;
35
+ if (payload.force) {
36
+ return true;
37
+ }
38
+ const result = await ((_a = view.beforeClose) == null ? void 0 : _a.call(view, payload));
39
+ return result !== false;
40
+ }
41
+ __name(runViewBeforeClose, "runViewBeforeClose");
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ runViewBeforeClose
45
+ });
@@ -12,9 +12,10 @@ export declare function useDialog(): (React.JSX.Element | {
12
12
  type: "dialog";
13
13
  inputArgs: any;
14
14
  preventClose: boolean;
15
+ beforeClose: any;
15
16
  destroy: (result?: any) => void;
16
17
  update: (newConfig: any) => void;
17
- close: (result?: any, force?: boolean) => void;
18
+ close: (result?: any, force?: boolean) => Promise<boolean>;
18
19
  Footer: React.FC<{
19
20
  children?: React.ReactNode;
20
21
  }>;
@@ -52,6 +52,8 @@ var import_viewEvents = require("./viewEvents");
52
52
  var import_provider = require("../provider");
53
53
  var import_ViewScopedFlowEngine = require("../ViewScopedFlowEngine");
54
54
  var import_variablesParams = require("../utils/variablesParams");
55
+ var import_runViewBeforeClose = require("./runViewBeforeClose");
56
+ var import_inheritLayoutContext = require("./inheritLayoutContext");
55
57
  let uuid = 0;
56
58
  function useDialog() {
57
59
  const holderRef = React.useRef(null);
@@ -102,13 +104,18 @@ function useDialog() {
102
104
  ctx.addDelegate(flowContext);
103
105
  } else {
104
106
  ctx.addDelegate(flowContext.engine.context);
107
+ (0, import_inheritLayoutContext.inheritLayoutContextForDetachedView)(ctx, flowContext);
105
108
  }
109
+ let destroyed = false;
106
110
  const currentDialog = {
107
111
  type: "dialog",
108
112
  inputArgs: config.inputArgs || {},
109
113
  preventClose: !!config.preventClose,
114
+ beforeClose: void 0,
110
115
  destroy: /* @__PURE__ */ __name((result) => {
111
116
  var _a2, _b2, _c2, _d;
117
+ if (destroyed) return;
118
+ destroyed = true;
112
119
  (_a2 = config.onClose) == null ? void 0 : _a2.call(config);
113
120
  (_b2 = dialogRef.current) == null ? void 0 : _b2.destroy();
114
121
  closeFunc == null ? void 0 : closeFunc();
@@ -122,16 +129,21 @@ function useDialog() {
122
129
  var _a2;
123
130
  return (_a2 = dialogRef.current) == null ? void 0 : _a2.update(newConfig);
124
131
  }, "update"),
125
- close: /* @__PURE__ */ __name((result, force) => {
132
+ close: /* @__PURE__ */ __name(async (result, force) => {
126
133
  var _a2, _b2;
127
134
  if (config.preventClose && !force) {
128
- return;
135
+ return false;
136
+ }
137
+ const shouldClose = await (0, import_runViewBeforeClose.runViewBeforeClose)(currentDialog, { result, force });
138
+ if (!shouldClose) {
139
+ return false;
129
140
  }
130
141
  if (config.triggerByRouter && ((_b2 = (_a2 = config.inputArgs) == null ? void 0 : _a2.navigation) == null ? void 0 : _b2.back)) {
131
142
  config.inputArgs.navigation.back();
132
- return;
143
+ return true;
133
144
  }
134
145
  currentDialog.destroy(result);
146
+ return true;
135
147
  }, "close"),
136
148
  Footer: FooterComponent,
137
149
  Header: HeaderComponent,
@@ -154,6 +166,13 @@ function useDialog() {
154
166
  get: /* @__PURE__ */ __name(() => currentDialog, "get"),
155
167
  resolveOnServer: (0, import_variablesParams.createViewRecordResolveOnServer)(ctx, () => (0, import_variablesParams.getViewRecordFromParent)(flowContext, ctx))
156
168
  });
169
+ scopedEngine.setDestroyView(() => {
170
+ var _a2, _b2;
171
+ if (config.triggerByRouter && ((_b2 = (_a2 = config.inputArgs) == null ? void 0 : _a2.navigation) == null ? void 0 : _b2.back)) {
172
+ config.inputArgs.navigation.back();
173
+ }
174
+ currentDialog.destroy();
175
+ });
157
176
  (0, import_createViewMeta.registerPopupVariable)(ctx, currentDialog);
158
177
  const DialogWithContext = (0, import__.observer)(
159
178
  () => {
@@ -13,9 +13,10 @@ export declare function useDrawer(): (React.JSX.Element | {
13
13
  type: "drawer";
14
14
  inputArgs: any;
15
15
  preventClose: boolean;
16
+ beforeClose: any;
16
17
  destroy: (result?: any) => void;
17
18
  update: (newConfig: any) => void;
18
- close: (result?: any, force?: boolean) => void;
19
+ close: (result?: any, force?: boolean) => Promise<boolean>;
19
20
  Footer: React.FC<{
20
21
  children?: React.ReactNode;
21
22
  }>;
@@ -52,6 +52,8 @@ var import_viewEvents = require("./viewEvents");
52
52
  var import_provider = require("../provider");
53
53
  var import_ViewScopedFlowEngine = require("../ViewScopedFlowEngine");
54
54
  var import_variablesParams = require("../utils/variablesParams");
55
+ var import_runViewBeforeClose = require("./runViewBeforeClose");
56
+ var import_inheritLayoutContext = require("./inheritLayoutContext");
55
57
  function useDrawer() {
56
58
  const holderRef = React.useRef(null);
57
59
  const drawerList = React.useMemo(() => import__.observable.shallow({ value: [] }), []);
@@ -121,13 +123,18 @@ function useDrawer() {
121
123
  ctx.addDelegate(flowContext);
122
124
  } else {
123
125
  ctx.addDelegate(flowContext.engine.context);
126
+ (0, import_inheritLayoutContext.inheritLayoutContextForDetachedView)(ctx, flowContext);
124
127
  }
128
+ let destroyed = false;
125
129
  const currentDrawer = {
126
130
  type: "drawer",
127
131
  inputArgs: config.inputArgs || {},
128
132
  preventClose: !!config.preventClose,
133
+ beforeClose: void 0,
129
134
  destroy: /* @__PURE__ */ __name((result) => {
130
135
  var _a2, _b2, _c, _d;
136
+ if (destroyed) return;
137
+ destroyed = true;
131
138
  (_a2 = config.onClose) == null ? void 0 : _a2.call(config);
132
139
  (_b2 = drawerRef.current) == null ? void 0 : _b2.destroy();
133
140
  closeFunc == null ? void 0 : closeFunc();
@@ -141,16 +148,21 @@ function useDrawer() {
141
148
  var _a2;
142
149
  return (_a2 = drawerRef.current) == null ? void 0 : _a2.update(newConfig);
143
150
  }, "update"),
144
- close: /* @__PURE__ */ __name((result, force) => {
151
+ close: /* @__PURE__ */ __name(async (result, force) => {
145
152
  var _a2, _b2;
146
153
  if (config.preventClose && !force) {
147
- return;
154
+ return false;
155
+ }
156
+ const shouldClose = await (0, import_runViewBeforeClose.runViewBeforeClose)(currentDrawer, { result, force });
157
+ if (!shouldClose) {
158
+ return false;
148
159
  }
149
160
  if (config.triggerByRouter && ((_b2 = (_a2 = config.inputArgs) == null ? void 0 : _a2.navigation) == null ? void 0 : _b2.back)) {
150
161
  config.inputArgs.navigation.back();
151
- return;
162
+ return true;
152
163
  }
153
164
  currentDrawer.destroy(result);
165
+ return true;
154
166
  }, "close"),
155
167
  Footer: FooterComponent,
156
168
  Header: HeaderComponent,
@@ -173,6 +185,13 @@ function useDrawer() {
173
185
  get: /* @__PURE__ */ __name(() => currentDrawer, "get"),
174
186
  resolveOnServer: (0, import_variablesParams.createViewRecordResolveOnServer)(ctx, () => (0, import_variablesParams.getViewRecordFromParent)(flowContext, ctx))
175
187
  });
188
+ scopedEngine.setDestroyView(() => {
189
+ var _a2, _b2;
190
+ if (config.triggerByRouter && ((_b2 = (_a2 = config.inputArgs) == null ? void 0 : _a2.navigation) == null ? void 0 : _b2.back)) {
191
+ config.inputArgs.navigation.back();
192
+ }
193
+ currentDrawer.destroy();
194
+ });
176
195
  (0, import_createViewMeta.registerPopupVariable)(ctx, currentDrawer);
177
196
  const DrawerWithContext = React.memo(
178
197
  (0, import__.observer)((props) => {
@@ -12,26 +12,20 @@ export declare const GLOBAL_EMBED_CONTAINER_ID = "nocobase-embed-container";
12
12
  /** Dataset key used to signal embed replacement in progress (skip style reset on close) */
13
13
  export declare const EMBED_REPLACING_DATA_KEY = "nocobaseEmbedReplacing";
14
14
  export declare function usePage(): (React.JSX.Element | {
15
- open: (config: any, flowContext: any) => Promise<unknown> & {
15
+ open: (config: any, flowContext: any) => Promise<any> & {
16
16
  type: "embed";
17
17
  inputArgs: any;
18
18
  preventClose: boolean;
19
+ Header: any;
20
+ Footer: any;
21
+ beforeClose: any;
22
+ close: (result?: any, force?: boolean) => Promise<any>;
19
23
  destroy: (result?: any) => void;
20
24
  update: (newConfig: any) => void;
21
- close: (result?: any, force?: boolean) => void;
22
- Header: React.FC<{
23
- title?: React.ReactNode;
24
- extra?: React.ReactNode;
25
- }>;
26
- Footer: React.FC<{
27
- children?: React.ReactNode;
28
- }>;
29
25
  setFooter: (footer: React.ReactNode) => void;
30
26
  setHeader: (header: {
31
27
  title?: React.ReactNode;
32
28
  extra?: React.ReactNode;
33
29
  }) => void;
34
- navigation: any;
35
- readonly record: unknown;
36
30
  };
37
31
  })[];