@nocobase/client-v2 2.1.0-alpha.40 → 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 (278) hide show
  1. package/es/Application.d.ts +7 -0
  2. package/es/BaseApplication.d.ts +13 -0
  3. package/es/RouterManager.d.ts +1 -0
  4. package/es/collection-field-interface/CollectionFieldInterface.d.ts +51 -15
  5. package/es/collection-field-interface/CollectionFieldInterfaceManager.d.ts +82 -3
  6. package/es/collection-manager/field-configure.d.ts +80 -0
  7. package/es/collection-manager/field-validation.d.ts +43 -0
  8. package/es/collection-manager/filter-operators/index.d.ts +46 -0
  9. package/es/collection-manager/filter-operators/operators.d.ts +30 -0
  10. package/es/collection-manager/interfaces/checkbox.d.ts +1 -41
  11. package/es/collection-manager/interfaces/checkboxGroup.d.ts +12 -44
  12. package/es/collection-manager/interfaces/collection.d.ts +12 -51
  13. package/es/collection-manager/interfaces/color.d.ts +1 -16
  14. package/es/collection-manager/interfaces/createdAt.d.ts +1 -44
  15. package/es/collection-manager/interfaces/createdBy.d.ts +0 -4
  16. package/es/collection-manager/interfaces/dateOnly.d.ts +7 -44
  17. package/es/collection-manager/interfaces/datetime.d.ts +1 -44
  18. package/es/collection-manager/interfaces/datetimeNoTz.d.ts +1 -44
  19. package/es/collection-manager/interfaces/email.d.ts +1 -29
  20. package/es/collection-manager/interfaces/id.d.ts +1 -16
  21. package/es/collection-manager/interfaces/index.d.ts +2 -3
  22. package/es/collection-manager/interfaces/input.d.ts +1 -102
  23. package/es/collection-manager/interfaces/integer.d.ts +1 -95
  24. package/es/collection-manager/interfaces/json.d.ts +16 -7
  25. package/es/collection-manager/interfaces/m2m.d.ts +11 -19
  26. package/es/collection-manager/interfaces/m2o.d.ts +11 -19
  27. package/es/collection-manager/interfaces/markdown.d.ts +1 -63
  28. package/es/collection-manager/interfaces/multipleSelect.d.ts +12 -44
  29. package/es/collection-manager/interfaces/nanoid.d.ts +1 -34
  30. package/es/collection-manager/interfaces/number.d.ts +1 -87
  31. package/es/collection-manager/interfaces/o2m.d.ts +12 -24
  32. package/es/collection-manager/interfaces/obo.d.ts +207 -0
  33. package/es/collection-manager/interfaces/oho.d.ts +207 -0
  34. package/es/collection-manager/interfaces/password.d.ts +1 -56
  35. package/es/collection-manager/interfaces/percent.d.ts +1 -84
  36. package/es/collection-manager/interfaces/phone.d.ts +1 -25
  37. package/es/collection-manager/interfaces/properties/index.d.ts +0 -28
  38. package/es/collection-manager/interfaces/radioGroup.d.ts +1 -29
  39. package/es/collection-manager/interfaces/richText.d.ts +1 -63
  40. package/es/collection-manager/interfaces/select.d.ts +12 -44
  41. package/es/collection-manager/interfaces/snowflake-id.d.ts +1 -34
  42. package/es/collection-manager/interfaces/tableoid.d.ts +1 -10
  43. package/es/collection-manager/interfaces/textarea.d.ts +1 -51
  44. package/es/collection-manager/interfaces/time.d.ts +1 -16
  45. package/es/collection-manager/interfaces/types.d.ts +3 -12
  46. package/es/collection-manager/interfaces/unixTimestamp.d.ts +1 -44
  47. package/es/collection-manager/interfaces/updatedAt.d.ts +1 -44
  48. package/es/collection-manager/interfaces/updatedBy.d.ts +0 -4
  49. package/es/collection-manager/interfaces/url.d.ts +1 -20
  50. package/es/collection-manager/interfaces/uuid.d.ts +1 -34
  51. package/es/collection-manager/template-fields.d.ts +53 -0
  52. package/es/components/KeepAlive.d.ts +22 -0
  53. package/es/components/RouterBridge.d.ts +9 -0
  54. package/es/components/form/DialogFormLayout.d.ts +5 -29
  55. package/es/components/form/VariableInput.d.ts +53 -2
  56. package/es/components/form/filter/CollectionFilter.d.ts +49 -0
  57. package/es/components/form/filter/CollectionFilterItem.d.ts +49 -0
  58. package/es/components/form/filter/DateFilterDynamicComponent.d.ts +57 -0
  59. package/es/components/form/filter/FilterValueInput.d.ts +29 -0
  60. package/es/components/form/filter/index.d.ts +11 -0
  61. package/es/components/form/filter/useFilterActionProps.d.ts +96 -0
  62. package/es/components/form/index.d.ts +1 -0
  63. package/es/data-source/ExtendCollectionsProvider.d.ts +50 -0
  64. package/es/data-source/index.d.ts +9 -0
  65. package/es/flow/FlowPage.d.ts +2 -1
  66. package/es/flow/admin-shell/AdminLayoutRouteCoordinator.d.ts +8 -40
  67. package/es/flow/admin-shell/BaseLayoutModel.d.ts +89 -0
  68. package/es/flow/admin-shell/BaseLayoutRouteCoordinator.d.ts +74 -0
  69. package/es/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.d.ts +12 -0
  70. package/es/flow/admin-shell/admin-layout/AdminLayoutModel.d.ts +7 -92
  71. package/es/flow/admin-shell/admin-layout/AppListRender.d.ts +11 -0
  72. package/es/flow/admin-shell/admin-layout/index.d.ts +3 -0
  73. package/es/flow/admin-shell/admin-layout/useApplications.d.ts +3 -2
  74. package/es/flow/admin-shell/useAdminLayoutRoutePage.d.ts +2 -2
  75. package/es/flow/admin-shell/useLayoutRoutePage.d.ts +23 -0
  76. package/es/flow/components/FlowRoute.d.ts +10 -1
  77. package/es/flow/components/filter/index.d.ts +2 -0
  78. package/es/flow/components/filter/useFilterOptions.d.ts +66 -0
  79. package/es/flow/index.d.ts +4 -0
  80. package/es/flow/models/base/PageModel/PageModel.d.ts +3 -1
  81. package/es/flow/models/blocks/assign-form/assignFieldValuesFlow.d.ts +84 -0
  82. package/es/flow/models/blocks/assign-form/index.d.ts +1 -0
  83. package/es/flow/models/blocks/form/FormActionGroupModel.d.ts +1 -0
  84. package/es/flow/models/blocks/form/FormActionModel.d.ts +9 -2
  85. package/es/flow/models/blocks/table/TableBlockModel.d.ts +10 -0
  86. package/es/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.d.ts +1 -1
  87. package/es/flow-compat/passwordUtils.d.ts +1 -1
  88. package/es/index.d.ts +6 -0
  89. package/es/index.mjs +552 -459
  90. package/es/layout-manager/LayoutContentRoute.d.ts +14 -0
  91. package/es/layout-manager/LayoutManager.d.ts +22 -0
  92. package/es/layout-manager/LayoutRoute.d.ts +14 -0
  93. package/es/layout-manager/index.d.ts +13 -0
  94. package/es/layout-manager/types.d.ts +20 -0
  95. package/es/layout-manager/utils.d.ts +14 -0
  96. package/es/nocobase-buildin-plugin/index.d.ts +3 -10
  97. package/es/settings-center/index.d.ts +1 -1
  98. package/es/settings-center/plugin-manager/BulkEnableButton.d.ts +15 -0
  99. package/es/settings-center/plugin-manager/PluginCard.d.ts +15 -0
  100. package/es/settings-center/plugin-manager/PluginDetail.d.ts +16 -0
  101. package/es/settings-center/{PluginManagerPage.d.ts → plugin-manager/index.d.ts} +1 -7
  102. package/es/settings-center/plugin-manager/types.d.ts +34 -0
  103. package/lib/index.js +552 -459
  104. package/package.json +8 -7
  105. package/src/Application.tsx +51 -12
  106. package/src/BaseApplication.tsx +32 -0
  107. package/src/PluginSettingsManager.ts +1 -1
  108. package/src/RouterManager.tsx +17 -1
  109. package/src/__tests__/PluginSettingsManager.test.ts +41 -2
  110. package/src/__tests__/app.test.tsx +17 -1
  111. package/src/__tests__/globalDeps.test.ts +1 -0
  112. package/src/__tests__/nocobase-buildin-plugin-auth.test.tsx +45 -2
  113. package/src/__tests__/plugin-manager.test.tsx +177 -0
  114. package/src/__tests__/settings-center.test.tsx +24 -2
  115. package/src/collection-field-interface/CollectionFieldInterface.ts +71 -77
  116. package/src/collection-field-interface/CollectionFieldInterfaceManager.ts +201 -4
  117. package/src/collection-manager/field-configure.ts +548 -0
  118. package/src/collection-manager/field-validation.ts +195 -0
  119. package/src/collection-manager/filter-operators/index.ts +176 -0
  120. package/src/collection-manager/{interfaces/properties → filter-operators}/operators.ts +24 -13
  121. package/src/collection-manager/interfaces/checkbox.ts +2 -9
  122. package/src/collection-manager/interfaces/checkboxGroup.ts +2 -10
  123. package/src/collection-manager/interfaces/collection.ts +2 -15
  124. package/src/collection-manager/interfaces/color.ts +2 -2
  125. package/src/collection-manager/interfaces/createdAt.ts +2 -2
  126. package/src/collection-manager/interfaces/createdBy.ts +1 -12
  127. package/src/collection-manager/interfaces/dateOnly.ts +8 -2
  128. package/src/collection-manager/interfaces/datetime.ts +2 -2
  129. package/src/collection-manager/interfaces/datetimeNoTz.ts +2 -2
  130. package/src/collection-manager/interfaces/email.ts +2 -9
  131. package/src/collection-manager/interfaces/id.ts +1 -2
  132. package/src/collection-manager/interfaces/index.ts +2 -3
  133. package/src/collection-manager/interfaces/input.ts +2 -133
  134. package/src/collection-manager/interfaces/integer.ts +2 -71
  135. package/src/collection-manager/interfaces/json.tsx +17 -11
  136. package/src/collection-manager/interfaces/m2m.tsx +0 -21
  137. package/src/collection-manager/interfaces/m2o.tsx +0 -22
  138. package/src/collection-manager/interfaces/markdown.ts +2 -51
  139. package/src/collection-manager/interfaces/multipleSelect.ts +2 -14
  140. package/src/collection-manager/interfaces/nanoid.ts +2 -2
  141. package/src/collection-manager/interfaces/number.ts +2 -85
  142. package/src/collection-manager/interfaces/o2m.tsx +1 -22
  143. package/src/collection-manager/interfaces/obo.tsx +145 -0
  144. package/src/collection-manager/interfaces/oho.tsx +145 -0
  145. package/src/collection-manager/interfaces/password.ts +2 -44
  146. package/src/collection-manager/interfaces/percent.ts +2 -74
  147. package/src/collection-manager/interfaces/phone.ts +2 -2
  148. package/src/collection-manager/interfaces/properties/index.ts +0 -133
  149. package/src/collection-manager/interfaces/radioGroup.ts +2 -2
  150. package/src/collection-manager/interfaces/richText.ts +2 -51
  151. package/src/collection-manager/interfaces/select.ts +2 -14
  152. package/src/collection-manager/interfaces/snowflake-id.ts +2 -2
  153. package/src/collection-manager/interfaces/tableoid.ts +1 -2
  154. package/src/collection-manager/interfaces/textarea.ts +2 -51
  155. package/src/collection-manager/interfaces/time.ts +2 -2
  156. package/src/collection-manager/interfaces/types.ts +4 -12
  157. package/src/collection-manager/interfaces/unixTimestamp.tsx +2 -2
  158. package/src/collection-manager/interfaces/updatedAt.ts +2 -2
  159. package/src/collection-manager/interfaces/updatedBy.ts +1 -12
  160. package/src/collection-manager/interfaces/url.ts +2 -4
  161. package/src/collection-manager/interfaces/uuid.ts +2 -2
  162. package/src/collection-manager/template-fields.ts +109 -0
  163. package/src/components/KeepAlive.tsx +131 -0
  164. package/src/components/README.md +90 -6
  165. package/src/components/README.zh-CN.md +90 -7
  166. package/src/components/RouterBridge.tsx +28 -4
  167. package/src/components/__tests__/KeepAlive.test.tsx +63 -0
  168. package/src/components/__tests__/RouterBridge.test.tsx +27 -0
  169. package/src/components/form/DialogFormLayout.tsx +5 -29
  170. package/src/components/form/VariableInput.tsx +101 -28
  171. package/src/components/form/__tests__/VariableInput.test.ts +85 -0
  172. package/src/components/form/filter/CollectionFilter.tsx +111 -0
  173. package/src/components/form/filter/CollectionFilterItem.tsx +184 -0
  174. package/src/components/form/filter/DateFilterDynamicComponent.tsx +283 -0
  175. package/src/components/form/filter/FilterValueInput.tsx +198 -0
  176. package/src/components/form/filter/__tests__/CollectionFilterItem.test.tsx +247 -0
  177. package/src/components/form/filter/__tests__/DateFilterDynamicComponent.test.tsx +148 -0
  178. package/src/components/form/filter/__tests__/FilterValueInput.test.tsx +243 -0
  179. package/src/components/form/filter/__tests__/compileFilterGroup.test.ts +146 -0
  180. package/src/components/form/filter/index.ts +13 -0
  181. package/src/components/form/filter/useFilterActionProps.ts +203 -0
  182. package/src/components/form/index.tsx +1 -0
  183. package/src/data-source/ExtendCollectionsProvider.tsx +144 -0
  184. package/src/data-source/__tests__/ExtendCollectionsProvider.test.tsx +264 -0
  185. package/src/data-source/index.ts +10 -0
  186. package/src/flow/FlowPage.tsx +35 -7
  187. package/src/flow/__tests__/FlowPage.test.tsx +79 -0
  188. package/src/flow/__tests__/FlowRoute.test.tsx +529 -2
  189. package/src/flow/actions/__tests__/linkageRules.subFormSetFieldProps.test.ts +191 -0
  190. package/src/flow/actions/__tests__/openView.subModelKey.test.tsx +33 -0
  191. package/src/flow/actions/aclCheck.tsx +4 -0
  192. package/src/flow/actions/aclCheckRefresh.tsx +4 -0
  193. package/src/flow/actions/dateTimeFormat.tsx +12 -8
  194. package/src/flow/actions/linkageRules.tsx +122 -0
  195. package/src/flow/actions/openView.tsx +28 -4
  196. package/src/flow/admin-shell/AdminLayoutRouteCoordinator.ts +11 -329
  197. package/src/flow/admin-shell/BaseLayoutModel.tsx +455 -0
  198. package/src/flow/admin-shell/BaseLayoutRouteCoordinator.ts +502 -0
  199. package/src/flow/admin-shell/__tests__/AdminLayoutRouteCoordinator.test.ts +547 -3
  200. package/src/flow/admin-shell/admin-layout/AdminLayoutComponent.tsx +35 -7
  201. package/src/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.tsx +160 -0
  202. package/src/flow/admin-shell/admin-layout/AdminLayoutMenuModels.tsx +0 -12
  203. package/src/flow/admin-shell/admin-layout/AdminLayoutModel.tsx +28 -201
  204. package/src/flow/admin-shell/admin-layout/AdminLayoutSlotModels.tsx +11 -2
  205. package/src/flow/admin-shell/admin-layout/AppListRender.tsx +139 -0
  206. package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutMenuModels.test.ts +1 -26
  207. package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutModel.test.tsx +149 -27
  208. package/src/flow/admin-shell/admin-layout/index.ts +3 -0
  209. package/src/flow/admin-shell/admin-layout/useApplications.tsx +34 -1
  210. package/src/flow/admin-shell/useAdminLayoutRoutePage.ts +10 -26
  211. package/src/flow/admin-shell/useLayoutRoutePage.ts +61 -0
  212. package/src/flow/components/AdminLayout.tsx +4 -154
  213. package/src/flow/components/FlowRoute.tsx +105 -15
  214. package/src/flow/components/filter/index.ts +3 -0
  215. package/src/flow/components/filter/useFilterOptions.ts +102 -0
  216. package/src/flow/index.ts +4 -0
  217. package/src/flow/models/actions/UpdateRecordActionModel.tsx +14 -95
  218. package/src/flow/models/actions/UpdateRecordActionUtils.ts +4 -7
  219. package/src/flow/models/actions/__tests__/AssignFormRefill.test.ts +26 -1
  220. package/src/flow/models/base/ActionModel.tsx +8 -1
  221. package/src/flow/models/base/PageModel/PageModel.tsx +51 -18
  222. package/src/flow/models/base/PageModel/RootPageModel.tsx +6 -13
  223. package/src/flow/models/base/PageModel/__tests__/PageModel.test.ts +102 -1
  224. package/src/flow/models/base/RouteModel.tsx +1 -1
  225. package/src/flow/models/blocks/assign-form/AssignFormItemModel.tsx +63 -2
  226. package/src/flow/models/blocks/assign-form/assignFieldValuesFlow.tsx +206 -0
  227. package/src/flow/models/blocks/assign-form/index.ts +1 -0
  228. package/src/flow/models/blocks/form/FormActionGroupModel.tsx +14 -0
  229. package/src/flow/models/blocks/form/FormActionModel.tsx +30 -3
  230. package/src/flow/models/blocks/form/FormItemModel.tsx +8 -1
  231. package/src/flow/models/blocks/form/__tests__/FormActionGroupModel.test.ts +46 -0
  232. package/src/flow/models/blocks/form/__tests__/submitHandler.test.ts +71 -0
  233. package/src/flow/models/blocks/form/submitHandler.ts +8 -1
  234. package/src/flow/models/blocks/form/submitValues.ts +4 -1
  235. package/src/flow/models/blocks/table/TableBlockModel.tsx +118 -16
  236. package/src/flow/models/blocks/table/__tests__/TableBlockModel.rowSelection.test.tsx +114 -0
  237. package/src/flow/models/fields/AssociationFieldModel/SubFormFieldModel.tsx +7 -1
  238. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableField.tsx +1 -1
  239. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx +6 -5
  240. package/src/flow/models/fields/ClickableFieldModel.tsx +9 -1
  241. package/src/flow/models/fields/CollectionSelectorFieldModel.tsx +8 -2
  242. package/src/flow/models/fields/DisplayEnumFieldModel.tsx +8 -2
  243. package/src/flow/models/fields/DisplayTimeFieldModel.tsx +1 -1
  244. package/src/flow/models/fields/TimeFieldModel.tsx +1 -1
  245. package/src/flow/models/fields/__tests__/TimeFieldModel.test.tsx +61 -0
  246. package/src/flow/models/fields/mobile-components/MobileDatePicker.tsx +19 -3
  247. package/src/flow/models/fields/mobile-components/__tests__/MobileDatePicker.test.tsx +94 -0
  248. package/src/flow/models/topbar/TopbarActionModel.tsx +1 -1
  249. package/src/flow/utils/__tests__/dateTimeFormat.test.ts +91 -0
  250. package/src/index.ts +6 -0
  251. package/src/layout-manager/LayoutContentRoute.tsx +90 -0
  252. package/src/layout-manager/LayoutManager.tsx +185 -0
  253. package/src/layout-manager/LayoutRoute.tsx +138 -0
  254. package/src/layout-manager/__tests__/LayoutManager.test.tsx +335 -0
  255. package/src/layout-manager/__tests__/LayoutRoute.test.tsx +473 -0
  256. package/src/layout-manager/index.ts +14 -0
  257. package/src/layout-manager/types.ts +22 -0
  258. package/src/layout-manager/utils.ts +37 -0
  259. package/src/nocobase-buildin-plugin/index.tsx +69 -67
  260. package/src/nocobase-buildin-plugin/plugins/LocalePlugin.ts +1 -0
  261. package/src/settings-center/index.ts +1 -1
  262. package/src/settings-center/plugin-manager/BulkEnableButton.tsx +111 -0
  263. package/src/settings-center/plugin-manager/PluginCard.tsx +270 -0
  264. package/src/settings-center/plugin-manager/PluginDetail.tsx +195 -0
  265. package/src/settings-center/plugin-manager/index.tsx +254 -0
  266. package/src/settings-center/plugin-manager/types.ts +35 -0
  267. package/src/settings-center/utils.tsx +8 -1
  268. package/src/theme/__tests__/globalStyles.test.ts +24 -0
  269. package/src/theme/globalStyles.ts +10 -0
  270. package/src/utils/globalDeps.ts +2 -0
  271. package/es/collection-manager/interfaces/linkTo.d.ts +0 -90
  272. package/es/collection-manager/interfaces/o2o.d.ts +0 -621
  273. package/es/collection-manager/interfaces/properties/operators.d.ts +0 -294
  274. package/es/collection-manager/interfaces/subTable.d.ts +0 -172
  275. package/src/collection-manager/interfaces/linkTo.ts +0 -120
  276. package/src/collection-manager/interfaces/o2o.tsx +0 -561
  277. package/src/collection-manager/interfaces/subTable.ts +0 -218
  278. package/src/settings-center/PluginManagerPage.tsx +0 -162
@@ -7,339 +7,21 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import {
11
- FlowEngine,
12
- FlowModel,
13
- observable,
14
- parsePathnameToViewParams,
15
- ViewNavigation,
16
- type ViewParam,
17
- } from '@nocobase/flow-engine';
18
- import React from 'react';
19
- import { getViewDiffAndUpdateHidden, getKey } from '../getViewDiffAndUpdateHidden';
20
- import { getOpenViewStepParams } from '../flows/openViewFlow';
21
- import { resolveViewParamsToViewList, updateViewListHidden, type ViewItem } from '../resolveViewParamsToViewList';
22
-
23
- export interface RoutePageMeta {
24
- active: boolean;
25
- refreshDesktopRoutes?: () => Promise<unknown>;
26
- layoutContentElement?: HTMLElement | null;
27
- }
28
-
29
- interface ViewRuntimeState {
30
- destroy: (force?: boolean) => void;
31
- update: (value: any) => void;
32
- navigation: ViewNavigation;
33
- }
34
-
35
- interface RoutePageRuntime {
36
- pageUid: string;
37
- routeModel: FlowModel;
38
- meta: RoutePageMeta;
39
- viewState: Record<string, ViewRuntimeState>;
40
- prevViewList: ViewItem[];
41
- hasStepNavigated: boolean;
42
- forceStop: boolean;
43
- }
44
-
45
- interface RouteLike {
46
- params?: { name?: string };
47
- pathname?: string;
48
- }
49
-
50
- const hasUsableSourceId = (sourceId: unknown) => sourceId !== undefined && sourceId !== null && String(sourceId) !== '';
10
+ import type { FlowEngine } from '@nocobase/flow-engine';
11
+ import { BaseLayoutRouteCoordinator, type BaseLayoutRouteCoordinatorOptions } from './BaseLayoutRouteCoordinator';
51
12
 
52
13
  /**
53
- * 管理 admin 场景下每个 page 的 v2 视图栈编排。
54
- * 该协调器只负责状态机和开关视图,不直接绑定 React 生命周期。
14
+ * Admin Layout 路由协调器。
15
+ *
16
+ * 该类保留旧导出路径,内部复用通用 BaseLayoutRouteCoordinator。
55
17
  */
56
- export class AdminLayoutRouteCoordinator {
57
- private readonly flowEngine: FlowEngine;
58
- private readonly runtimes = new Map<string, RoutePageRuntime>();
59
- private layoutContentElement: HTMLElement | null = null;
60
-
61
- private setRuntimeActive(runtime: RoutePageRuntime, active: boolean) {
62
- runtime.meta.active = active;
63
- if (runtime.routeModel.context.pageActive?.value !== active) {
64
- runtime.routeModel.context.pageActive.value = active;
65
- }
66
- }
67
-
68
- private getCurrentRouteByPageUid(pageUid: string) {
69
- return this.flowEngine.context.routeRepository?.getRouteBySchemaUid?.(pageUid) || {};
70
- }
71
-
72
- constructor(flowEngine: FlowEngine) {
73
- this.flowEngine = flowEngine;
74
- }
75
-
76
- setLayoutContentElement(element: HTMLElement | null) {
77
- this.layoutContentElement = element;
78
- }
79
-
80
- registerPage(pageUid: string, meta: RoutePageMeta) {
81
- const routeModel = this.getOrCreateRouteModel(pageUid);
82
- const runtime: RoutePageRuntime = {
83
- pageUid,
84
- routeModel,
85
- meta: {
86
- active: !!meta.active,
87
- refreshDesktopRoutes: meta.refreshDesktopRoutes,
88
- layoutContentElement: meta.layoutContentElement || null,
89
- },
90
- viewState: {},
91
- prevViewList: [],
92
- hasStepNavigated: false,
93
- forceStop: false,
94
- };
95
-
96
- this.ensureRouteModelContext(runtime);
97
- this.runtimes.set(pageUid, runtime);
98
- this.syncPageMeta(pageUid, meta);
99
- this.syncRoute(this.flowEngine.context.route || {});
100
-
101
- return runtime.routeModel;
102
- }
103
-
104
- syncPageMeta(pageUid: string, meta: Partial<RoutePageMeta>) {
105
- const runtime = this.runtimes.get(pageUid);
106
- if (!runtime) {
107
- return;
108
- }
109
-
110
- runtime.meta = {
111
- ...runtime.meta,
112
- ...meta,
113
- active: typeof meta.active === 'boolean' ? meta.active : runtime.meta.active,
114
- layoutContentElement: meta.layoutContentElement ?? runtime.meta.layoutContentElement,
115
- };
116
-
117
- this.setRuntimeActive(runtime, runtime.meta.active);
118
- }
119
-
120
- unregisterPage(pageUid: string) {
121
- this.cleanupPage(pageUid);
122
- this.runtimes.delete(pageUid);
123
- }
124
-
125
- syncRoute(routeLike: RouteLike) {
126
- const activePageUid = routeLike?.params?.name;
127
- const pathname = routeLike?.pathname;
128
-
129
- this.runtimes.forEach((runtime) => {
130
- this.setRuntimeActive(runtime, runtime.pageUid === activePageUid);
131
- });
132
-
133
- if (!activePageUid || !pathname) {
134
- return;
135
- }
136
-
137
- this.runtimes.forEach((runtime) => {
138
- if (runtime.pageUid !== activePageUid) {
139
- runtime.forceStop = true;
140
- }
141
- });
142
-
143
- const runtime = this.runtimes.get(activePageUid);
144
- if (!runtime) {
145
- return;
146
- }
147
-
148
- runtime.forceStop = false;
149
- this.syncRuntimeWithPathname(runtime, pathname);
150
- }
151
-
152
- cleanupPage(pageUid: string) {
153
- const runtime = this.runtimes.get(pageUid);
154
- if (!runtime) {
155
- return;
156
- }
157
-
158
- runtime.forceStop = true;
159
- runtime.prevViewList.forEach((viewItem) => {
160
- this.flowEngine.removeModelWithSubModels(viewItem.params.viewUid);
161
- runtime.viewState[getKey(viewItem)]?.destroy?.();
162
- delete runtime.viewState[getKey(viewItem)];
18
+ export class AdminLayoutRouteCoordinator extends BaseLayoutRouteCoordinator {
19
+ constructor(flowEngine: FlowEngine, options: BaseLayoutRouteCoordinatorOptions = {}) {
20
+ super(flowEngine, {
21
+ basePathname: '/admin',
22
+ ...options,
163
23
  });
164
- runtime.prevViewList = [];
165
- runtime.hasStepNavigated = false;
166
- }
167
-
168
- destroy() {
169
- Array.from(this.runtimes.keys()).forEach((pageUid) => {
170
- this.cleanupPage(pageUid);
171
- this.runtimes.delete(pageUid);
172
- });
173
- }
174
-
175
- private syncRuntimeWithPathname(runtime: RoutePageRuntime, pathname: string) {
176
- try {
177
- const viewStack = parsePathnameToViewParams(pathname);
178
- const viewList = resolveViewParamsToViewList(this.flowEngine, viewStack, runtime.routeModel);
179
-
180
- if (this.shouldStepNavigate(runtime, viewList)) {
181
- this.stepNavigate(viewList, 0);
182
- runtime.hasStepNavigated = true;
183
- return;
184
- }
185
-
186
- const { viewsToClose, viewsToOpen } = getViewDiffAndUpdateHidden(runtime.prevViewList, viewList);
187
-
188
- if (viewsToClose.length) {
189
- viewsToClose.forEach((viewItem) => {
190
- runtime.viewState[getKey(viewItem)]?.destroy?.(true);
191
- delete runtime.viewState[getKey(viewItem)];
192
- });
193
- updateViewListHidden(viewList);
194
- }
195
-
196
- if (viewsToOpen.length) {
197
- void this.handleOpenViews(runtime, viewList, viewsToOpen);
198
- }
199
-
200
- if (viewsToClose.length === 0 && viewsToOpen.length === 0) {
201
- const currentViewItem = viewList.at(-1);
202
- if (currentViewItem) {
203
- runtime.viewState[getKey(currentViewItem)]?.navigation.setViewStack(viewList.map((item) => item.params));
204
- }
205
- }
206
-
207
- runtime.prevViewList = [...viewList];
208
- } catch (error) {
209
- console.error(`[NocoBase] Failed to resolve view params to view list:`, error);
210
- }
211
- }
212
-
213
- private shouldStepNavigate(runtime: RoutePageRuntime, viewList: ViewItem[]) {
214
- return runtime.prevViewList.length === 0 && viewList.length > 1 && !runtime.hasStepNavigated;
215
- }
216
-
217
- private stepNavigate(viewList: ViewItem[], index: number) {
218
- if (!viewList[index]) {
219
- return;
220
- }
221
-
222
- if (index === 0) {
223
- new ViewNavigation(this.flowEngine.context, []).navigateTo(viewList[index].params, { replace: true });
224
- } else {
225
- new ViewNavigation(
226
- this.flowEngine.context,
227
- viewList.slice(0, index).map((item) => item.params),
228
- ).navigateTo(viewList[index].params);
229
- }
230
-
231
- this.stepNavigate(viewList, index + 1);
232
- }
233
-
234
- private async handleOpenViews(runtime: RoutePageRuntime, viewList: ViewItem[], viewsToOpen: ViewItem[]) {
235
- const missingModels = viewsToOpen.filter((v) => !v.model);
236
- if (missingModels.length > 0) {
237
- await Promise.all(
238
- missingModels.map(async (viewItem) => {
239
- try {
240
- viewItem.model = await this.flowEngine.loadModel({ uid: viewItem.modelUid });
241
- } catch (error) {
242
- console.error(`[NocoBase] Failed to load model ${viewItem.modelUid}:`, error);
243
- }
244
- }),
245
- );
246
- }
247
-
248
- if (runtime.forceStop) {
249
- return;
250
- }
251
-
252
- updateViewListHidden(viewList);
253
- this.openViews(runtime, viewList, viewsToOpen, 0);
254
- }
255
-
256
- private openViews(runtime: RoutePageRuntime, viewList: ViewItem[], viewsToOpen: ViewItem[], index: number) {
257
- if (!viewsToOpen[index]) {
258
- return;
259
- }
260
-
261
- const viewItem = viewsToOpen[index];
262
- if (!viewItem.model) {
263
- return;
264
- }
265
-
266
- const destroyRef = React.createRef<(result?: any, force?: boolean) => void>();
267
- const updateRef = React.createRef<(value: any) => void>();
268
- const openViewParams = getOpenViewStepParams(viewItem.model);
269
- const associationName =
270
- openViewParams?.associationName && !hasUsableSourceId(viewItem.params.sourceId)
271
- ? null
272
- : openViewParams?.associationName;
273
- const openerUids = viewList.slice(0, viewItem.index).map((item) => item.params.viewUid);
274
- const navigation = new ViewNavigation(
275
- this.flowEngine.context,
276
- viewList.slice(0, viewItem.index + 1).map((item) => item.params),
277
- );
278
-
279
- viewItem.model.dispatchEvent('click', {
280
- target: runtime.meta.layoutContentElement || this.layoutContentElement,
281
- collectionName: openViewParams?.collectionName,
282
- associationName,
283
- dataSourceKey: openViewParams?.dataSourceKey,
284
- destroyRef,
285
- updateRef,
286
- openerUids,
287
- ...viewItem.params,
288
- navigation,
289
- onOpen: () => {
290
- this.openViews(runtime, viewList, viewsToOpen, index + 1);
291
- },
292
- hidden: viewItem.hidden,
293
- isMobileLayout: !!this.flowEngine.context.isMobileLayout,
294
- triggerByRouter: true,
295
- });
296
-
297
- runtime.viewState[getKey(viewItem)] = {
298
- destroy: (_force?: boolean) => destroyRef.current?.(),
299
- update: (value: any) => updateRef.current?.(value),
300
- navigation,
301
- };
302
- }
303
-
304
- private ensureRouteModelContext(runtime: RoutePageRuntime) {
305
- if (!runtime.routeModel.context.pageActive) {
306
- runtime.routeModel.context.defineProperty('pageActive', {
307
- value: observable.ref(false),
308
- info: {
309
- description:
310
- 'Whether current page route is active (keep-alive). This is an observable.ref<boolean> (use ctx.pageActive.value to read/write).',
311
- detail: 'observable.ref<boolean>',
312
- },
313
- });
314
- }
315
-
316
- runtime.routeModel.context.defineProperty('currentRoute', {
317
- get: () => this.getCurrentRouteByPageUid(runtime.pageUid),
318
- // 当前路由来自 routeRepository,菜单更新后必须实时读取最新对象。
319
- cache: false,
320
- });
321
-
322
- runtime.routeModel.context.defineProperty('refreshDesktopRoutes', {
323
- get: () => runtime.meta.refreshDesktopRoutes,
324
- // refresh 回调来自页面桥接层,切页后也需要读取最新引用。
325
- cache: false,
326
- });
327
- }
328
-
329
- private getOrCreateRouteModel(pageUid: string): FlowModel {
330
- return (
331
- this.flowEngine.getModel(pageUid) ||
332
- this.flowEngine.createModel({
333
- uid: pageUid,
334
- use: 'RouteModel',
335
- })
336
- );
337
24
  }
338
25
  }
339
26
 
340
- /**
341
- * 将 pathname 解析结果和 pageUid 对齐,便于测试里复用。
342
- */
343
- export function toViewStack(pathname: string): ViewParam[] {
344
- return parsePathnameToViewParams(pathname);
345
- }
27
+ export { toViewStack, type BaseLayoutRouteCoordinatorOptions, type RoutePageMeta } from './BaseLayoutRouteCoordinator';