@nocobase/client-v2 2.1.0-alpha.40 → 2.1.0-alpha.46

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 (338) 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/authRedirect.d.ts +12 -0
  5. package/es/collection-field-interface/CollectionFieldInterface.d.ts +51 -15
  6. package/es/collection-field-interface/CollectionFieldInterfaceManager.d.ts +82 -3
  7. package/es/collection-manager/field-configure.d.ts +80 -0
  8. package/es/collection-manager/field-validation.d.ts +43 -0
  9. package/es/collection-manager/filter-operators/index.d.ts +46 -0
  10. package/es/collection-manager/filter-operators/operators.d.ts +30 -0
  11. package/es/collection-manager/interfaces/checkbox.d.ts +1 -41
  12. package/es/collection-manager/interfaces/checkboxGroup.d.ts +12 -44
  13. package/es/collection-manager/interfaces/collection.d.ts +12 -51
  14. package/es/collection-manager/interfaces/color.d.ts +1 -16
  15. package/es/collection-manager/interfaces/createdAt.d.ts +1 -44
  16. package/es/collection-manager/interfaces/createdBy.d.ts +0 -4
  17. package/es/collection-manager/interfaces/dateOnly.d.ts +7 -44
  18. package/es/collection-manager/interfaces/datetime.d.ts +1 -44
  19. package/es/collection-manager/interfaces/datetimeNoTz.d.ts +1 -44
  20. package/es/collection-manager/interfaces/email.d.ts +1 -29
  21. package/es/collection-manager/interfaces/id.d.ts +1 -16
  22. package/es/collection-manager/interfaces/index.d.ts +2 -3
  23. package/es/collection-manager/interfaces/input.d.ts +1 -102
  24. package/es/collection-manager/interfaces/integer.d.ts +1 -95
  25. package/es/collection-manager/interfaces/json.d.ts +16 -7
  26. package/es/collection-manager/interfaces/m2m.d.ts +11 -19
  27. package/es/collection-manager/interfaces/m2o.d.ts +11 -19
  28. package/es/collection-manager/interfaces/markdown.d.ts +1 -63
  29. package/es/collection-manager/interfaces/multipleSelect.d.ts +12 -44
  30. package/es/collection-manager/interfaces/nanoid.d.ts +1 -34
  31. package/es/collection-manager/interfaces/number.d.ts +1 -87
  32. package/es/collection-manager/interfaces/o2m.d.ts +12 -24
  33. package/es/collection-manager/interfaces/obo.d.ts +207 -0
  34. package/es/collection-manager/interfaces/oho.d.ts +207 -0
  35. package/es/collection-manager/interfaces/password.d.ts +1 -56
  36. package/es/collection-manager/interfaces/percent.d.ts +1 -84
  37. package/es/collection-manager/interfaces/phone.d.ts +1 -25
  38. package/es/collection-manager/interfaces/properties/index.d.ts +0 -28
  39. package/es/collection-manager/interfaces/radioGroup.d.ts +1 -29
  40. package/es/collection-manager/interfaces/richText.d.ts +1 -63
  41. package/es/collection-manager/interfaces/select.d.ts +12 -44
  42. package/es/collection-manager/interfaces/snowflake-id.d.ts +1 -34
  43. package/es/collection-manager/interfaces/tableoid.d.ts +1 -10
  44. package/es/collection-manager/interfaces/textarea.d.ts +1 -51
  45. package/es/collection-manager/interfaces/time.d.ts +1 -16
  46. package/es/collection-manager/interfaces/types.d.ts +3 -12
  47. package/es/collection-manager/interfaces/unixTimestamp.d.ts +1 -44
  48. package/es/collection-manager/interfaces/updatedAt.d.ts +1 -44
  49. package/es/collection-manager/interfaces/updatedBy.d.ts +0 -4
  50. package/es/collection-manager/interfaces/url.d.ts +1 -20
  51. package/es/collection-manager/interfaces/uuid.d.ts +1 -34
  52. package/es/collection-manager/template-fields.d.ts +53 -0
  53. package/es/components/KeepAlive.d.ts +22 -0
  54. package/es/components/RouterBridge.d.ts +9 -0
  55. package/es/components/form/DialogFormLayout.d.ts +5 -29
  56. package/es/components/form/TypedVariableInput.d.ts +75 -0
  57. package/es/components/form/VariableInput.d.ts +53 -2
  58. package/es/components/form/filter/CollectionFilter.d.ts +49 -0
  59. package/es/components/form/filter/CollectionFilterItem.d.ts +49 -0
  60. package/es/components/form/filter/DateFilterDynamicComponent.d.ts +57 -0
  61. package/es/components/form/filter/FilterValueInput.d.ts +29 -0
  62. package/es/components/form/filter/index.d.ts +11 -0
  63. package/es/components/form/filter/useFilterActionProps.d.ts +96 -0
  64. package/es/components/form/index.d.ts +2 -0
  65. package/es/data-source/ExtendCollectionsProvider.d.ts +50 -0
  66. package/es/data-source/index.d.ts +9 -0
  67. package/es/flow/FlowPage.d.ts +2 -1
  68. package/es/flow/admin-shell/AdminLayoutRouteCoordinator.d.ts +8 -40
  69. package/es/flow/admin-shell/BaseLayoutModel.d.ts +89 -0
  70. package/es/flow/admin-shell/BaseLayoutRouteCoordinator.d.ts +74 -0
  71. package/es/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.d.ts +12 -0
  72. package/es/flow/admin-shell/admin-layout/AdminLayoutMenuModels.d.ts +1 -0
  73. package/es/flow/admin-shell/admin-layout/AdminLayoutModel.d.ts +7 -92
  74. package/es/flow/admin-shell/admin-layout/AppListRender.d.ts +11 -0
  75. package/es/flow/admin-shell/admin-layout/index.d.ts +3 -0
  76. package/es/flow/admin-shell/admin-layout/useApplications.d.ts +3 -2
  77. package/es/flow/admin-shell/useAdminLayoutRoutePage.d.ts +2 -2
  78. package/es/flow/admin-shell/useLayoutRoutePage.d.ts +23 -0
  79. package/es/flow/components/ConditionBuilder.d.ts +1 -0
  80. package/es/flow/components/FieldAssignRulesEditor.d.ts +3 -1
  81. package/es/flow/components/FieldAssignValueInput.d.ts +1 -0
  82. package/es/flow/components/FlowRoute.d.ts +10 -1
  83. package/es/flow/components/fieldAssignOptions.d.ts +10 -0
  84. package/es/flow/components/filter/LinkageFilterItem.d.ts +1 -0
  85. package/es/flow/components/filter/VariableFilterItem.d.ts +1 -0
  86. package/es/flow/components/filter/index.d.ts +2 -0
  87. package/es/flow/components/filter/metaTreeAssociationDepth.d.ts +13 -0
  88. package/es/flow/components/filter/useFilterOptions.d.ts +66 -0
  89. package/es/flow/index.d.ts +4 -0
  90. package/es/flow/models/base/AssociationFieldGroupModel.d.ts +2 -33
  91. package/es/flow/models/base/PageModel/PageModel.d.ts +3 -1
  92. package/es/flow/models/blocks/assign-form/assignFieldValuesFlow.d.ts +92 -0
  93. package/es/flow/models/blocks/assign-form/index.d.ts +1 -0
  94. package/es/flow/models/blocks/form/FormActionGroupModel.d.ts +1 -0
  95. package/es/flow/models/blocks/form/FormActionModel.d.ts +9 -2
  96. package/es/flow/models/blocks/table/TableBlockModel.d.ts +10 -0
  97. package/es/flow/models/blocks/table/TableColumnModel.d.ts +2 -0
  98. package/es/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.d.ts +1 -1
  99. package/es/flow-compat/passwordUtils.d.ts +1 -1
  100. package/es/index.d.ts +6 -0
  101. package/es/index.mjs +552 -459
  102. package/es/layout-manager/LayoutContentRoute.d.ts +14 -0
  103. package/es/layout-manager/LayoutManager.d.ts +22 -0
  104. package/es/layout-manager/LayoutRoute.d.ts +14 -0
  105. package/es/layout-manager/index.d.ts +13 -0
  106. package/es/layout-manager/types.d.ts +20 -0
  107. package/es/layout-manager/utils.d.ts +14 -0
  108. package/es/nocobase-buildin-plugin/index.d.ts +3 -10
  109. package/es/settings-center/index.d.ts +1 -1
  110. package/es/settings-center/plugin-manager/BulkEnableButton.d.ts +15 -0
  111. package/es/settings-center/plugin-manager/PluginCard.d.ts +15 -0
  112. package/es/settings-center/plugin-manager/PluginDetail.d.ts +16 -0
  113. package/es/settings-center/{PluginManagerPage.d.ts → plugin-manager/index.d.ts} +1 -7
  114. package/es/settings-center/plugin-manager/types.d.ts +34 -0
  115. package/lib/index.js +552 -459
  116. package/package.json +8 -7
  117. package/src/Application.tsx +51 -12
  118. package/src/BaseApplication.tsx +32 -0
  119. package/src/PluginSettingsManager.ts +1 -1
  120. package/src/RouterManager.tsx +17 -1
  121. package/src/__tests__/PluginSettingsManager.test.ts +41 -2
  122. package/src/__tests__/app.test.tsx +17 -1
  123. package/src/__tests__/globalDeps.test.ts +1 -0
  124. package/src/__tests__/nocobase-buildin-plugin-auth.test.tsx +50 -2
  125. package/src/__tests__/plugin-manager.test.tsx +177 -0
  126. package/src/__tests__/settings-center.test.tsx +24 -2
  127. package/src/authRedirect.ts +43 -0
  128. package/src/collection-field-interface/CollectionFieldInterface.ts +71 -77
  129. package/src/collection-field-interface/CollectionFieldInterfaceManager.ts +201 -4
  130. package/src/collection-manager/field-configure.ts +548 -0
  131. package/src/collection-manager/field-validation.ts +195 -0
  132. package/src/collection-manager/filter-operators/index.ts +176 -0
  133. package/src/collection-manager/{interfaces/properties → filter-operators}/operators.ts +24 -13
  134. package/src/collection-manager/interfaces/checkbox.ts +2 -9
  135. package/src/collection-manager/interfaces/checkboxGroup.ts +2 -10
  136. package/src/collection-manager/interfaces/collection.ts +2 -15
  137. package/src/collection-manager/interfaces/color.ts +2 -2
  138. package/src/collection-manager/interfaces/createdAt.ts +2 -2
  139. package/src/collection-manager/interfaces/createdBy.ts +1 -12
  140. package/src/collection-manager/interfaces/dateOnly.ts +8 -2
  141. package/src/collection-manager/interfaces/datetime.ts +2 -2
  142. package/src/collection-manager/interfaces/datetimeNoTz.ts +2 -2
  143. package/src/collection-manager/interfaces/email.ts +2 -9
  144. package/src/collection-manager/interfaces/id.ts +1 -2
  145. package/src/collection-manager/interfaces/index.ts +2 -3
  146. package/src/collection-manager/interfaces/input.ts +2 -133
  147. package/src/collection-manager/interfaces/integer.ts +2 -71
  148. package/src/collection-manager/interfaces/json.tsx +17 -11
  149. package/src/collection-manager/interfaces/m2m.tsx +0 -21
  150. package/src/collection-manager/interfaces/m2o.tsx +0 -22
  151. package/src/collection-manager/interfaces/markdown.ts +2 -51
  152. package/src/collection-manager/interfaces/multipleSelect.ts +2 -14
  153. package/src/collection-manager/interfaces/nanoid.ts +2 -2
  154. package/src/collection-manager/interfaces/number.ts +2 -85
  155. package/src/collection-manager/interfaces/o2m.tsx +1 -22
  156. package/src/collection-manager/interfaces/obo.tsx +145 -0
  157. package/src/collection-manager/interfaces/oho.tsx +145 -0
  158. package/src/collection-manager/interfaces/password.ts +2 -44
  159. package/src/collection-manager/interfaces/percent.ts +2 -74
  160. package/src/collection-manager/interfaces/phone.ts +2 -2
  161. package/src/collection-manager/interfaces/properties/index.ts +0 -133
  162. package/src/collection-manager/interfaces/radioGroup.ts +2 -2
  163. package/src/collection-manager/interfaces/richText.ts +2 -51
  164. package/src/collection-manager/interfaces/select.ts +2 -14
  165. package/src/collection-manager/interfaces/snowflake-id.ts +2 -2
  166. package/src/collection-manager/interfaces/tableoid.ts +1 -2
  167. package/src/collection-manager/interfaces/textarea.ts +2 -51
  168. package/src/collection-manager/interfaces/time.ts +2 -2
  169. package/src/collection-manager/interfaces/types.ts +4 -12
  170. package/src/collection-manager/interfaces/unixTimestamp.tsx +2 -2
  171. package/src/collection-manager/interfaces/updatedAt.ts +2 -2
  172. package/src/collection-manager/interfaces/updatedBy.ts +1 -12
  173. package/src/collection-manager/interfaces/url.ts +2 -4
  174. package/src/collection-manager/interfaces/uuid.ts +2 -2
  175. package/src/collection-manager/template-fields.ts +109 -0
  176. package/src/components/KeepAlive.tsx +131 -0
  177. package/src/components/README.md +138 -6
  178. package/src/components/README.zh-CN.md +138 -7
  179. package/src/components/RouterBridge.tsx +28 -4
  180. package/src/components/__tests__/KeepAlive.test.tsx +63 -0
  181. package/src/components/__tests__/RouterBridge.test.tsx +27 -0
  182. package/src/components/form/DialogFormLayout.tsx +5 -29
  183. package/src/components/form/TypedVariableInput.tsx +441 -0
  184. package/src/components/form/VariableInput.tsx +101 -28
  185. package/src/components/form/__tests__/TypedVariableInput.test.tsx +152 -0
  186. package/src/components/form/__tests__/VariableInput.test.ts +85 -0
  187. package/src/components/form/filter/CollectionFilter.tsx +111 -0
  188. package/src/components/form/filter/CollectionFilterItem.tsx +184 -0
  189. package/src/components/form/filter/DateFilterDynamicComponent.tsx +283 -0
  190. package/src/components/form/filter/FilterValueInput.tsx +198 -0
  191. package/src/components/form/filter/__tests__/CollectionFilterItem.test.tsx +247 -0
  192. package/src/components/form/filter/__tests__/DateFilterDynamicComponent.test.tsx +148 -0
  193. package/src/components/form/filter/__tests__/FilterValueInput.test.tsx +243 -0
  194. package/src/components/form/filter/__tests__/compileFilterGroup.test.ts +146 -0
  195. package/src/components/form/filter/index.ts +13 -0
  196. package/src/components/form/filter/useFilterActionProps.ts +203 -0
  197. package/src/components/form/index.tsx +2 -0
  198. package/src/data-source/ExtendCollectionsProvider.tsx +144 -0
  199. package/src/data-source/__tests__/ExtendCollectionsProvider.test.tsx +264 -0
  200. package/src/data-source/index.ts +10 -0
  201. package/src/flow/FlowPage.tsx +35 -7
  202. package/src/flow/__tests__/FlowPage.test.tsx +79 -0
  203. package/src/flow/__tests__/FlowRoute.test.tsx +537 -3
  204. package/src/flow/actions/__tests__/linkageRules.hiddenSync.restore.test.ts +100 -0
  205. package/src/flow/actions/__tests__/linkageRules.subFormSetFieldProps.test.ts +191 -0
  206. package/src/flow/actions/__tests__/linkageRulesRefresh.test.ts +23 -1
  207. package/src/flow/actions/__tests__/openView.subModelKey.test.tsx +33 -0
  208. package/src/flow/actions/aclCheck.tsx +4 -0
  209. package/src/flow/actions/aclCheckRefresh.tsx +4 -0
  210. package/src/flow/actions/dataScope.tsx +8 -1
  211. package/src/flow/actions/dateTimeFormat.tsx +12 -8
  212. package/src/flow/actions/linkageRules.tsx +127 -2
  213. package/src/flow/actions/linkageRulesRefresh.tsx +2 -3
  214. package/src/flow/actions/openView.tsx +28 -4
  215. package/src/flow/actions/setTargetDataScope.tsx +1 -1
  216. package/src/flow/admin-shell/AdminLayoutRouteCoordinator.ts +11 -329
  217. package/src/flow/admin-shell/BaseLayoutModel.tsx +455 -0
  218. package/src/flow/admin-shell/BaseLayoutRouteCoordinator.ts +502 -0
  219. package/src/flow/admin-shell/__tests__/AdminLayoutRouteCoordinator.test.ts +547 -3
  220. package/src/flow/admin-shell/admin-layout/AdminLayoutComponent.tsx +35 -7
  221. package/src/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.tsx +160 -0
  222. package/src/flow/admin-shell/admin-layout/AdminLayoutMenuModels.tsx +15 -13
  223. package/src/flow/admin-shell/admin-layout/AdminLayoutModel.tsx +28 -201
  224. package/src/flow/admin-shell/admin-layout/AdminLayoutSlotModels.tsx +11 -2
  225. package/src/flow/admin-shell/admin-layout/AppListRender.tsx +139 -0
  226. package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutMenuModels.test.ts +76 -27
  227. package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutModel.test.tsx +149 -27
  228. package/src/flow/admin-shell/admin-layout/index.ts +3 -0
  229. package/src/flow/admin-shell/admin-layout/resolveAdminRouteRuntimeTarget.test.ts +11 -0
  230. package/src/flow/admin-shell/admin-layout/resolveAdminRouteRuntimeTarget.ts +2 -4
  231. package/src/flow/admin-shell/admin-layout/useApplications.tsx +34 -1
  232. package/src/flow/admin-shell/useAdminLayoutRoutePage.ts +10 -26
  233. package/src/flow/admin-shell/useLayoutRoutePage.ts +61 -0
  234. package/src/flow/common/Markdown/Edit.tsx +32 -4
  235. package/src/flow/components/AdminLayout.tsx +4 -154
  236. package/src/flow/components/ConditionBuilder.tsx +12 -2
  237. package/src/flow/components/FieldAssignRulesEditor.tsx +37 -46
  238. package/src/flow/components/FieldAssignValueInput.tsx +8 -4
  239. package/src/flow/components/FlowRoute.tsx +105 -15
  240. package/src/flow/components/__tests__/FieldAssignRulesEditor.test.tsx +112 -1
  241. package/src/flow/components/__tests__/fieldAssignOptions.test.ts +71 -1
  242. package/src/flow/components/code-editor/__tests__/runjsCompletions.test.ts +272 -27
  243. package/src/flow/components/code-editor/runjsCompletions.ts +490 -9
  244. package/src/flow/components/fieldAssignOptions.ts +23 -6
  245. package/src/flow/components/filter/LinkageFilterItem.tsx +22 -9
  246. package/src/flow/components/filter/VariableFilterItem.tsx +27 -9
  247. package/src/flow/components/filter/__tests__/fieldsToOptions.test.ts +48 -0
  248. package/src/flow/components/filter/__tests__/metaTreeAssociationDepth.test.ts +60 -0
  249. package/src/flow/components/filter/fieldsToOptions.ts +9 -4
  250. package/src/flow/components/filter/index.ts +3 -0
  251. package/src/flow/components/filter/metaTreeAssociationDepth.ts +69 -0
  252. package/src/flow/components/filter/useFilterOptions.ts +102 -0
  253. package/src/flow/index.ts +4 -0
  254. package/src/flow/models/actions/FilterActionModel.tsx +15 -3
  255. package/src/flow/models/actions/UpdateRecordActionModel.tsx +14 -95
  256. package/src/flow/models/actions/UpdateRecordActionUtils.ts +4 -7
  257. package/src/flow/models/actions/__tests__/AssignFormRefill.test.ts +116 -1
  258. package/src/flow/models/base/ActionModel.tsx +8 -1
  259. package/src/flow/models/base/AssociationFieldGroupModel.tsx +20 -3
  260. package/src/flow/models/base/GridModel.tsx +1 -1
  261. package/src/flow/models/base/PageModel/ChildPageModel.tsx +5 -1
  262. package/src/flow/models/base/PageModel/PageModel.tsx +51 -18
  263. package/src/flow/models/base/PageModel/RootPageModel.tsx +6 -13
  264. package/src/flow/models/base/PageModel/__tests__/ChildPageModel.test.ts +12 -0
  265. package/src/flow/models/base/PageModel/__tests__/PageModel.test.ts +102 -1
  266. package/src/flow/models/base/RouteModel.tsx +1 -1
  267. package/src/flow/models/base/__tests__/AssociationFieldGroupModel.test.ts +86 -0
  268. package/src/flow/models/base/__tests__/GridModel.render.test.tsx +53 -0
  269. package/src/flow/models/blocks/assign-form/AssignFormGridModel.tsx +12 -3
  270. package/src/flow/models/blocks/assign-form/AssignFormItemModel.tsx +77 -6
  271. package/src/flow/models/blocks/assign-form/__tests__/assignFieldValuesFlow.editor.test.tsx +216 -0
  272. package/src/flow/models/blocks/assign-form/assignFieldValuesFlow.tsx +308 -0
  273. package/src/flow/models/blocks/assign-form/index.ts +1 -0
  274. package/src/flow/models/blocks/filter-form/FilterFormItemModel.tsx +1 -1
  275. package/src/flow/models/blocks/filter-form/__tests__/FilterFormItemModel.defineChildren.test.ts +6 -1
  276. package/src/flow/models/blocks/filter-manager/flow-actions/connectFields.tsx +48 -6
  277. package/src/flow/models/blocks/form/FormActionGroupModel.tsx +14 -0
  278. package/src/flow/models/blocks/form/FormActionModel.tsx +30 -3
  279. package/src/flow/models/blocks/form/FormAssociationItemModel.tsx +9 -0
  280. package/src/flow/models/blocks/form/FormItemModel.tsx +17 -1
  281. package/src/flow/models/blocks/form/__tests__/FormActionGroupModel.test.ts +46 -0
  282. package/src/flow/models/blocks/form/__tests__/FormBlockModel.test.tsx +17 -0
  283. package/src/flow/models/blocks/form/__tests__/FormItemModel.defineChildren.test.ts +27 -2
  284. package/src/flow/models/blocks/form/__tests__/submitHandler.test.ts +71 -0
  285. package/src/flow/models/blocks/form/submitHandler.ts +8 -1
  286. package/src/flow/models/blocks/form/submitValues.ts +4 -1
  287. package/src/flow/models/blocks/form/value-runtime/__tests__/runtime.test.ts +29 -0
  288. package/src/flow/models/blocks/form/value-runtime/runtime.ts +5 -1
  289. package/src/flow/models/blocks/table/TableBlockModel.tsx +118 -16
  290. package/src/flow/models/blocks/table/TableColumnModel.tsx +15 -5
  291. package/src/flow/models/blocks/table/TableCustomColumnModel.tsx +2 -2
  292. package/src/flow/models/blocks/table/__tests__/TableBlockModel.rowSelection.test.tsx +114 -0
  293. package/src/flow/models/blocks/table/__tests__/TableColumnModel.test.tsx +18 -0
  294. package/src/flow/models/fields/AssociationFieldModel/SubFormFieldModel.tsx +7 -1
  295. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableColumnModel.tsx +6 -7
  296. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableField.tsx +1 -1
  297. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx +6 -5
  298. package/src/flow/models/fields/ClickableFieldModel.tsx +9 -1
  299. package/src/flow/models/fields/CollectionSelectorFieldModel.tsx +8 -2
  300. package/src/flow/models/fields/DisplayEnumFieldModel.tsx +8 -2
  301. package/src/flow/models/fields/DisplayTimeFieldModel.tsx +1 -1
  302. package/src/flow/models/fields/TimeFieldModel.tsx +1 -1
  303. package/src/flow/models/fields/__tests__/TimeFieldModel.test.tsx +61 -0
  304. package/src/flow/models/fields/mobile-components/MobileDatePicker.tsx +19 -3
  305. package/src/flow/models/fields/mobile-components/MobileLazySelect.tsx +5 -3
  306. package/src/flow/models/fields/mobile-components/__tests__/MobileDatePicker.test.tsx +94 -0
  307. package/src/flow/models/fields/mobile-components/__tests__/MobileSelect.test.tsx +70 -0
  308. package/src/flow/models/topbar/TopbarActionModel.tsx +1 -1
  309. package/src/flow/utils/__tests__/dateTimeFormat.test.ts +91 -0
  310. package/src/index.ts +6 -0
  311. package/src/layout-manager/LayoutContentRoute.tsx +90 -0
  312. package/src/layout-manager/LayoutManager.tsx +185 -0
  313. package/src/layout-manager/LayoutRoute.tsx +138 -0
  314. package/src/layout-manager/__tests__/LayoutManager.test.tsx +335 -0
  315. package/src/layout-manager/__tests__/LayoutRoute.test.tsx +473 -0
  316. package/src/layout-manager/index.ts +14 -0
  317. package/src/layout-manager/types.ts +22 -0
  318. package/src/layout-manager/utils.ts +37 -0
  319. package/src/nocobase-buildin-plugin/index.tsx +69 -67
  320. package/src/nocobase-buildin-plugin/plugins/LocalePlugin.ts +1 -0
  321. package/src/settings-center/index.ts +1 -1
  322. package/src/settings-center/plugin-manager/BulkEnableButton.tsx +111 -0
  323. package/src/settings-center/plugin-manager/PluginCard.tsx +270 -0
  324. package/src/settings-center/plugin-manager/PluginDetail.tsx +195 -0
  325. package/src/settings-center/plugin-manager/index.tsx +254 -0
  326. package/src/settings-center/plugin-manager/types.ts +35 -0
  327. package/src/settings-center/utils.tsx +8 -1
  328. package/src/theme/__tests__/globalStyles.test.ts +24 -0
  329. package/src/theme/globalStyles.ts +10 -0
  330. package/src/utils/globalDeps.ts +2 -0
  331. package/es/collection-manager/interfaces/linkTo.d.ts +0 -90
  332. package/es/collection-manager/interfaces/o2o.d.ts +0 -621
  333. package/es/collection-manager/interfaces/properties/operators.d.ts +0 -294
  334. package/es/collection-manager/interfaces/subTable.d.ts +0 -172
  335. package/src/collection-manager/interfaces/linkTo.ts +0 -120
  336. package/src/collection-manager/interfaces/o2o.tsx +0 -561
  337. package/src/collection-manager/interfaces/subTable.ts +0 -218
  338. package/src/settings-center/PluginManagerPage.tsx +0 -162
@@ -0,0 +1,53 @@
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
+ import { FlowEngine, FlowEngineProvider } from '@nocobase/flow-engine';
11
+ import { render } from '@testing-library/react';
12
+ import React from 'react';
13
+ import { beforeEach, describe, expect, it } from 'vitest';
14
+ import { GridModel } from '../GridModel';
15
+
16
+ describe('GridModel.render', () => {
17
+ let engine: FlowEngine;
18
+
19
+ beforeEach(async () => {
20
+ engine = new FlowEngine();
21
+ engine.registerModels({ GridModel });
22
+ await engine.flowSettings.disable();
23
+ });
24
+
25
+ it('renders the Space wrapper as block-level flex to avoid inline baseline spacing', () => {
26
+ const item = engine.createModel({ use: 'FlowModel', uid: 'item-1' });
27
+ const model = engine.createModel<GridModel>({
28
+ use: 'GridModel',
29
+ uid: 'grid-render',
30
+ props: {
31
+ rows: {
32
+ row1: [['item-1']],
33
+ },
34
+ sizes: {
35
+ row1: [24],
36
+ },
37
+ rowGap: 16,
38
+ },
39
+ structure: {} as any,
40
+ });
41
+ (model as any).subModels = { items: [item] };
42
+
43
+ expect(Object.keys((model as any).getVisibleLayout().rows)).toEqual(['row1']);
44
+
45
+ const { container } = render(<FlowEngineProvider engine={engine}>{model.render()}</FlowEngineProvider>);
46
+ const space = container.querySelector('.ant-space') as HTMLElement;
47
+
48
+ expect(space).toBeTruthy();
49
+ expect(space.style.width).toBe('100%');
50
+ expect(space.style.marginBottom).toBe('16px');
51
+ expect(space.style.display).toBe('flex');
52
+ });
53
+ });
@@ -12,11 +12,16 @@ import { AddSubModelButton, FlowSettingsButton, tExpr, EditableItemModel } from
12
12
  import { SettingOutlined } from '@ant-design/icons';
13
13
  import { FormGridModel } from '../form/FormGridModel';
14
14
 
15
+ const MAX_ASSIGN_FORM_ASSOCIATION_FIELD_DEPTH = 2;
16
+
15
17
  // 使用范型准确标注 subModels.items 的类型
16
18
  export class AssignFormGridModel extends FormGridModel {
17
19
  renderAddSubModelButton() {
18
20
  const collection = (this.context as any)?.collection;
19
21
  const fields = collection?.getFields?.() || [];
22
+ const associationDepth = this.context.prefixFieldPath
23
+ ? this.context.prefixFieldPath.split('.').filter(Boolean).length
24
+ : 0;
20
25
  // 过滤主键/过滤键字段,避免产生“更新主键”的无效配置
21
26
  const pk = typeof collection?.getPrimaryKey === 'function' ? collection.getPrimaryKey() : undefined;
22
27
  const filterKey = collection?.filterTargetKey;
@@ -29,6 +34,12 @@ export class AssignFormGridModel extends FormGridModel {
29
34
  };
30
35
  const items = fields
31
36
  .filter((field: any) => !isForbidden(field?.name))
37
+ .filter((field: any) => {
38
+ if (associationDepth < MAX_ASSIGN_FORM_ASSOCIATION_FIELD_DEPTH) {
39
+ return true;
40
+ }
41
+ return !(field?.isAssociationField?.() || field?.target || field?.targetCollection);
42
+ })
32
43
  .map((field: any) => {
33
44
  const fullName = field.name as string;
34
45
  const label = field.title || field.name;
@@ -111,7 +122,7 @@ export class AssignFormGridModel extends FormGridModel {
111
122
  return;
112
123
  }
113
124
  const fieldModel = binding.modelName;
114
- const created = this.flowEngine.createModel({
125
+ const created = this.addSubModel('items', {
115
126
  use: 'AssignFormItemModel',
116
127
  stepParams: {
117
128
  fieldSettings: {
@@ -137,8 +148,6 @@ export class AssignFormGridModel extends FormGridModel {
137
148
  },
138
149
  },
139
150
  },
140
- parentId: this.uid,
141
- subKey: 'items',
142
151
  });
143
152
  created['assignValue'] = value;
144
153
  }
@@ -28,6 +28,72 @@ import { customAlphabet as Alphabet } from 'nanoid';
28
28
  import { ensureOptionsFromUiSchemaEnumIfAbsent } from '../../../internal/utils/enumOptionsUtils';
29
29
  import { RunJSValueEditor } from '../../../components/RunJSValueEditor';
30
30
 
31
+ type AssignFormTempOriginField = {
32
+ uid?: string;
33
+ props?: {
34
+ fieldNames?: unknown;
35
+ titleField?: unknown;
36
+ };
37
+ getStepParams?: (flowKey: string, stepKey: string) => unknown;
38
+ };
39
+
40
+ function getAssignFormTempFieldOptions(
41
+ originField: AssignFormTempOriginField | undefined,
42
+ init: Record<string, unknown>,
43
+ ) {
44
+ const inheritedFieldNames = originField?.props?.fieldNames;
45
+ const inheritedTitleField = originField?.props?.titleField;
46
+ const inheritedSelectFieldNamesStep = originField?.getStepParams?.('selectSettings', 'fieldNames');
47
+
48
+ return {
49
+ stepParams: {
50
+ fieldSettings: {
51
+ init,
52
+ },
53
+ ...(inheritedSelectFieldNamesStep
54
+ ? {
55
+ selectSettings: {
56
+ fieldNames: inheritedSelectFieldNamesStep,
57
+ },
58
+ }
59
+ : {}),
60
+ },
61
+ props: {
62
+ ...(typeof inheritedFieldNames !== 'undefined' ? { fieldNames: inheritedFieldNames } : {}),
63
+ ...(typeof inheritedTitleField !== 'undefined' ? { titleField: inheritedTitleField } : {}),
64
+ },
65
+ };
66
+ }
67
+
68
+ function stringifyAssignFormTempFieldOption(value: unknown) {
69
+ try {
70
+ return JSON.stringify(value) ?? '';
71
+ } catch {
72
+ return String(value);
73
+ }
74
+ }
75
+
76
+ function getAssignFormTempFieldRefreshKey(originField: AssignFormTempOriginField | undefined) {
77
+ const inheritedFieldNames = originField?.props?.fieldNames;
78
+ const inheritedTitleField = originField?.props?.titleField;
79
+ const inheritedSelectFieldNamesStep = originField?.getStepParams?.('selectSettings', 'fieldNames');
80
+
81
+ return [
82
+ originField?.uid || '',
83
+ stringifyAssignFormTempFieldOption(inheritedFieldNames),
84
+ stringifyAssignFormTempFieldOption(inheritedTitleField),
85
+ stringifyAssignFormTempFieldOption(inheritedSelectFieldNamesStep),
86
+ ].join('|');
87
+ }
88
+
89
+ function normalizeAssignFormInputValue(value: unknown) {
90
+ if (!value || typeof value !== 'object' || !('target' in value)) {
91
+ return value;
92
+ }
93
+ const target = (value as { target?: { value?: unknown } }).target;
94
+ return target && 'value' in target ? target.value : value;
95
+ }
96
+
31
97
  /**
32
98
  * 使用 FormItemModel 的“表单项”包装,内部渲染 VariableInput,并将“常量”映射到临时字段模型。
33
99
  */
@@ -108,6 +174,8 @@ export class AssignFormItemModel extends FormItemModel {
108
174
  const init = this.fieldInit;
109
175
  const namePath = this.props?.name || (this.fieldPath ? [this.fieldPath] : undefined);
110
176
  const fieldPath = this.fieldPath;
177
+ const originField = this.subModels?.field as AssignFormTempOriginField | undefined;
178
+ const tempFieldRefreshKey = getAssignFormTempFieldRefreshKey(originField);
111
179
 
112
180
  const FieldRow: React.FC = () => {
113
181
  const [tempRoot, setTempRoot] = React.useState<any>(null);
@@ -121,13 +189,14 @@ export class AssignFormItemModel extends FormItemModel {
121
189
  return;
122
190
  }
123
191
  const fieldModel = binding.modelName;
192
+ const tempFieldOptions = getAssignFormTempFieldOptions(originField, init);
124
193
  const created = ctx?.engine?.createModel?.({
125
194
  use: 'VariableFieldFormModel',
126
195
  subModels: {
127
196
  fields: [
128
197
  {
129
198
  use: fieldModel,
130
- stepParams: { fieldSettings: { init } },
199
+ ...tempFieldOptions,
131
200
  },
132
201
  ],
133
202
  },
@@ -169,7 +238,6 @@ export class AssignFormItemModel extends FormItemModel {
169
238
  fm?.setProps?.({
170
239
  disabled: false,
171
240
  readPretty: false,
172
- pattern: 'editable',
173
241
  updateAssociation: false,
174
242
  multiple: multi,
175
243
  });
@@ -199,9 +267,12 @@ export class AssignFormItemModel extends FormItemModel {
199
267
  if (fm) {
200
268
  fm.setProps?.({
201
269
  value: inputProps?.value,
202
- onChange: (...args: any[]) => {
203
- const next = args && args.length ? args[0] : undefined;
204
- inputProps?.onChange?.(next);
270
+ onChange: (...args: unknown[]) => {
271
+ const nextArg = args && args.length ? args[0] : undefined;
272
+ const nextValue = normalizeAssignFormInputValue(nextArg);
273
+ fm.setProps?.({ value: nextValue });
274
+ this.assignValue = nextValue;
275
+ inputProps?.onChange?.(nextValue);
205
276
  },
206
277
  });
207
278
  }
@@ -302,7 +373,7 @@ export class AssignFormItemModel extends FormItemModel {
302
373
  );
303
374
  };
304
375
 
305
- return <FieldRow />;
376
+ return <FieldRow key={tempFieldRefreshKey} />;
306
377
  }
307
378
  }
308
379
 
@@ -0,0 +1,216 @@
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
+ import React from 'react';
11
+ import { App, ConfigProvider } from 'antd';
12
+ import { describe, expect, it } from 'vitest';
13
+ import { render, screen, userEvent, waitFor } from '@nocobase/test/client';
14
+ import {
15
+ FlowEngine,
16
+ FlowEngineProvider,
17
+ FlowRuntimeContext,
18
+ FlowSettingsContextProvider,
19
+ type FlowModel,
20
+ type IFlowModelRepository,
21
+ } from '@nocobase/flow-engine';
22
+ import { AssignFormGridModel } from '../AssignFormGridModel';
23
+ import { AssignFormItemModel } from '../AssignFormItemModel';
24
+ import { AssignFormModel } from '../AssignFormModel';
25
+ import { createAssignFieldValuesStep } from '../assignFieldValuesFlow';
26
+ import { InputFieldModel } from '../../../fields/InputFieldModel';
27
+ import { VariableFieldFormModel } from '../../../fields/VariableFieldFormModel';
28
+
29
+ class MockFlowModelRepository implements IFlowModelRepository {
30
+ async findOne(): Promise<Record<string, any> | null> {
31
+ return null;
32
+ }
33
+
34
+ async save(model: FlowModel): Promise<Record<string, any>> {
35
+ return { uid: model.uid };
36
+ }
37
+
38
+ async destroy(): Promise<boolean> {
39
+ return true;
40
+ }
41
+
42
+ async move(): Promise<void> {}
43
+
44
+ async duplicate(): Promise<Record<string, any> | null> {
45
+ return null;
46
+ }
47
+ }
48
+
49
+ describe('assignFieldValuesFlow (editor)', () => {
50
+ it('repairs AssignFormModel resource init and clears cached collection', async () => {
51
+ const engine = new FlowEngine();
52
+ engine.setModelRepository(new MockFlowModelRepository());
53
+ engine.registerModels({
54
+ AssignFormModel,
55
+ AssignFormGridModel,
56
+ AssignFormItemModel,
57
+ InputFieldModel,
58
+ VariableFieldFormModel,
59
+ });
60
+ engine.context.defineProperty('location', { value: { search: '' } });
61
+ engine.context.defineProperty('themeToken', { value: { marginLG: 24 } });
62
+
63
+ const dsm = engine.context.dataSourceManager;
64
+ const main = dsm.getDataSource('main');
65
+ main.addCollection({
66
+ name: 'users',
67
+ fields: [{ name: 'nickname', type: 'string', interface: 'input' }],
68
+ });
69
+ const users = dsm.getCollection('main', 'users');
70
+ expect(users?.name).toBe('users');
71
+
72
+ const action = engine.createModel({
73
+ use: 'FlowModel',
74
+ uid: 'act-assign',
75
+ });
76
+ action.setStepParams('assignSettings', 'assignFieldValues', { assignedValues: { nickname: '1111' } });
77
+
78
+ const existing = engine.createModel<AssignFormModel>({
79
+ use: 'AssignFormModel',
80
+ uid: 'form-assign',
81
+ parentId: action.uid,
82
+ subKey: 'assignForm',
83
+ stepParams: {
84
+ resourceSettings: {
85
+ init: {
86
+ dataSourceKey: 'main',
87
+ collectionName: 'missing',
88
+ },
89
+ },
90
+ },
91
+ });
92
+ expect(existing.context.collection).toBeUndefined();
93
+
94
+ action.context.defineProperty('blockModel', { value: { collection: users } });
95
+
96
+ const step = createAssignFieldValuesStep({ settingsFlowKey: 'assignSettings' });
97
+ const schema = step.uiSchema();
98
+ const Editor = schema.editor?.['x-component'] as React.ComponentType;
99
+ expect(Editor).toBeTypeOf('function');
100
+
101
+ const flowSettingsCtx = new FlowRuntimeContext(action as any, 'assignSettings', 'settings');
102
+
103
+ render(
104
+ <FlowEngineProvider engine={engine}>
105
+ <ConfigProvider>
106
+ <App>
107
+ <FlowSettingsContextProvider value={flowSettingsCtx}>
108
+ <Editor />
109
+ </FlowSettingsContextProvider>
110
+ </App>
111
+ </ConfigProvider>
112
+ </FlowEngineProvider>,
113
+ );
114
+
115
+ await waitFor(() => {
116
+ const form = engine.findModelByParentId<AssignFormModel>(action.uid, 'assignForm');
117
+ expect(form?.getStepParams('resourceSettings', 'init')).toEqual({
118
+ dataSourceKey: 'main',
119
+ collectionName: 'users',
120
+ });
121
+ expect(form?.context.collection?.name).toBe('users');
122
+ expect(form?.context.collection?.getFields?.().length).toBeGreaterThan(0);
123
+ });
124
+
125
+ await waitFor(() => {
126
+ expect(screen.getByText('nickname')).toBeInTheDocument();
127
+ const form = engine.findModelByParentId<AssignFormModel>(action.uid, 'assignForm');
128
+ expect(form?.subModels.grid.subModels.items.length).toBe(1);
129
+ });
130
+
131
+ await waitFor(() => {
132
+ expect(screen.getByDisplayValue('1111')).toBeInTheDocument();
133
+ });
134
+
135
+ const input = screen.getByDisplayValue('1111') as HTMLInputElement;
136
+ await userEvent.clear(input);
137
+ await userEvent.type(input, '2222');
138
+
139
+ await waitFor(() => {
140
+ const form = engine.findModelByParentId<AssignFormModel>(action.uid, 'assignForm');
141
+ expect(form?.getAssignedValues()).toEqual({ nickname: '2222' });
142
+ });
143
+ });
144
+
145
+ it('does not clear delegated parent resource cache when repairing AssignFormModel init', async () => {
146
+ const engine = new FlowEngine();
147
+ engine.setModelRepository(new MockFlowModelRepository());
148
+ engine.registerModels({ AssignFormModel, AssignFormGridModel, AssignFormItemModel, InputFieldModel });
149
+ engine.context.defineProperty('location', { value: { search: '' } });
150
+ engine.context.defineProperty('themeToken', { value: { marginLG: 24 } });
151
+
152
+ const dsm = engine.context.dataSourceManager;
153
+ const main = dsm.getDataSource('main');
154
+ main.addCollection({
155
+ name: 'users',
156
+ fields: [{ name: 'nickname', type: 'string', interface: 'input' }],
157
+ });
158
+ const users = dsm.getCollection('main', 'users');
159
+
160
+ const action = engine.createModel({
161
+ use: 'FlowModel',
162
+ uid: 'act-assign-parent-resource',
163
+ });
164
+
165
+ let resourceCreateCount = 0;
166
+ action.context.defineProperty('resource', {
167
+ get: () => ({ id: ++resourceCreateCount }),
168
+ });
169
+ const cachedResource = action.context.resource;
170
+
171
+ engine.createModel<AssignFormModel>({
172
+ use: 'AssignFormModel',
173
+ uid: 'form-assign-parent-resource',
174
+ parentId: action.uid,
175
+ subKey: 'assignForm',
176
+ stepParams: {
177
+ resourceSettings: {
178
+ init: {
179
+ dataSourceKey: 'main',
180
+ collectionName: 'missing',
181
+ },
182
+ },
183
+ },
184
+ });
185
+
186
+ action.context.defineProperty('blockModel', { value: { collection: users } });
187
+
188
+ const step = createAssignFieldValuesStep({ settingsFlowKey: 'assignSettings' });
189
+ const schema = step.uiSchema();
190
+ const Editor = schema.editor?.['x-component'] as React.ComponentType;
191
+ const flowSettingsCtx = new FlowRuntimeContext(action as any, 'assignSettings', 'settings');
192
+
193
+ render(
194
+ <FlowEngineProvider engine={engine}>
195
+ <ConfigProvider>
196
+ <App>
197
+ <FlowSettingsContextProvider value={flowSettingsCtx}>
198
+ <Editor />
199
+ </FlowSettingsContextProvider>
200
+ </App>
201
+ </ConfigProvider>
202
+ </FlowEngineProvider>,
203
+ );
204
+
205
+ await waitFor(() => {
206
+ const form = engine.findModelByParentId<AssignFormModel>(action.uid, 'assignForm');
207
+ expect(form?.getStepParams('resourceSettings', 'init')).toEqual({
208
+ dataSourceKey: 'main',
209
+ collectionName: 'users',
210
+ });
211
+ });
212
+
213
+ expect(action.context.resource).toBe(cachedResource);
214
+ expect(resourceCreateCount).toBe(1);
215
+ });
216
+ });