@nocobase/client-v2 2.1.0-beta.37 → 2.1.0-beta.38

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 (123) hide show
  1. package/es/Application.d.ts +1 -0
  2. package/es/BaseApplication.d.ts +3 -0
  3. package/es/RouterManager.d.ts +1 -0
  4. package/es/components/KeepAlive.d.ts +22 -0
  5. package/es/components/RouterBridge.d.ts +9 -0
  6. package/es/data-source/ExtendCollectionsProvider.d.ts +28 -2
  7. package/es/flow/FlowPage.d.ts +2 -1
  8. package/es/flow/admin-shell/AdminLayoutRouteCoordinator.d.ts +8 -40
  9. package/es/flow/admin-shell/BaseLayoutModel.d.ts +89 -0
  10. package/es/flow/admin-shell/BaseLayoutRouteCoordinator.d.ts +74 -0
  11. package/es/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.d.ts +12 -0
  12. package/es/flow/admin-shell/admin-layout/AdminLayoutModel.d.ts +7 -92
  13. package/es/flow/admin-shell/admin-layout/index.d.ts +2 -0
  14. package/es/flow/admin-shell/useAdminLayoutRoutePage.d.ts +2 -2
  15. package/es/flow/admin-shell/useLayoutRoutePage.d.ts +23 -0
  16. package/es/flow/components/FlowRoute.d.ts +10 -1
  17. package/es/flow/index.d.ts +4 -0
  18. package/es/flow/models/base/PageModel/PageModel.d.ts +3 -1
  19. package/es/flow/models/blocks/form/FormActionGroupModel.d.ts +1 -0
  20. package/es/flow/models/blocks/table/TableBlockModel.d.ts +10 -0
  21. package/es/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.d.ts +1 -1
  22. package/es/index.d.ts +1 -0
  23. package/es/index.mjs +484 -437
  24. package/es/layout-manager/LayoutContentRoute.d.ts +14 -0
  25. package/es/layout-manager/LayoutManager.d.ts +22 -0
  26. package/es/layout-manager/LayoutRoute.d.ts +14 -0
  27. package/es/layout-manager/index.d.ts +13 -0
  28. package/es/layout-manager/types.d.ts +20 -0
  29. package/es/layout-manager/utils.d.ts +14 -0
  30. package/es/settings-center/index.d.ts +1 -1
  31. package/es/settings-center/plugin-manager/BulkEnableButton.d.ts +15 -0
  32. package/es/settings-center/plugin-manager/PluginCard.d.ts +15 -0
  33. package/es/settings-center/plugin-manager/PluginDetail.d.ts +16 -0
  34. package/es/settings-center/{PluginManagerPage.d.ts → plugin-manager/index.d.ts} +1 -7
  35. package/es/settings-center/plugin-manager/types.d.ts +34 -0
  36. package/lib/index.js +484 -437
  37. package/package.json +8 -7
  38. package/src/Application.tsx +27 -12
  39. package/src/BaseApplication.tsx +6 -0
  40. package/src/PluginSettingsManager.ts +1 -1
  41. package/src/RouterManager.tsx +17 -1
  42. package/src/__tests__/PluginSettingsManager.test.ts +41 -2
  43. package/src/__tests__/app.test.tsx +8 -1
  44. package/src/__tests__/globalDeps.test.ts +1 -0
  45. package/src/__tests__/nocobase-buildin-plugin-auth.test.tsx +45 -2
  46. package/src/__tests__/plugin-manager.test.tsx +177 -0
  47. package/src/__tests__/settings-center.test.tsx +24 -2
  48. package/src/components/KeepAlive.tsx +131 -0
  49. package/src/components/RouterBridge.tsx +28 -4
  50. package/src/components/__tests__/KeepAlive.test.tsx +63 -0
  51. package/src/components/__tests__/RouterBridge.test.tsx +27 -0
  52. package/src/data-source/ExtendCollectionsProvider.tsx +94 -20
  53. package/src/data-source/__tests__/ExtendCollectionsProvider.test.tsx +264 -0
  54. package/src/flow/FlowPage.tsx +35 -7
  55. package/src/flow/__tests__/FlowPage.test.tsx +79 -0
  56. package/src/flow/__tests__/FlowRoute.test.tsx +529 -2
  57. package/src/flow/actions/__tests__/linkageRules.subFormSetFieldProps.test.ts +191 -0
  58. package/src/flow/actions/__tests__/openView.subModelKey.test.tsx +33 -0
  59. package/src/flow/actions/aclCheck.tsx +4 -0
  60. package/src/flow/actions/aclCheckRefresh.tsx +4 -0
  61. package/src/flow/actions/dateTimeFormat.tsx +12 -8
  62. package/src/flow/actions/linkageRules.tsx +122 -0
  63. package/src/flow/actions/openView.tsx +28 -4
  64. package/src/flow/admin-shell/AdminLayoutRouteCoordinator.ts +11 -329
  65. package/src/flow/admin-shell/BaseLayoutModel.tsx +455 -0
  66. package/src/flow/admin-shell/BaseLayoutRouteCoordinator.ts +502 -0
  67. package/src/flow/admin-shell/__tests__/AdminLayoutRouteCoordinator.test.ts +547 -3
  68. package/src/flow/admin-shell/admin-layout/AdminLayoutComponent.tsx +4 -4
  69. package/src/flow/admin-shell/admin-layout/AdminLayoutEntryGuard.tsx +160 -0
  70. package/src/flow/admin-shell/admin-layout/AdminLayoutMenuModels.tsx +0 -12
  71. package/src/flow/admin-shell/admin-layout/AdminLayoutModel.tsx +28 -201
  72. package/src/flow/admin-shell/admin-layout/AdminLayoutSlotModels.tsx +11 -2
  73. package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutMenuModels.test.ts +1 -26
  74. package/src/flow/admin-shell/admin-layout/__tests__/AdminLayoutModel.test.tsx +149 -27
  75. package/src/flow/admin-shell/admin-layout/index.ts +2 -0
  76. package/src/flow/admin-shell/useAdminLayoutRoutePage.ts +10 -26
  77. package/src/flow/admin-shell/useLayoutRoutePage.ts +61 -0
  78. package/src/flow/components/AdminLayout.tsx +4 -154
  79. package/src/flow/components/FlowRoute.tsx +105 -15
  80. package/src/flow/index.ts +4 -0
  81. package/src/flow/models/base/ActionModel.tsx +8 -1
  82. package/src/flow/models/base/PageModel/PageModel.tsx +51 -18
  83. package/src/flow/models/base/PageModel/RootPageModel.tsx +6 -13
  84. package/src/flow/models/base/PageModel/__tests__/PageModel.test.ts +102 -1
  85. package/src/flow/models/base/RouteModel.tsx +1 -1
  86. package/src/flow/models/blocks/form/FormActionGroupModel.tsx +14 -0
  87. package/src/flow/models/blocks/form/FormItemModel.tsx +8 -1
  88. package/src/flow/models/blocks/form/__tests__/FormActionGroupModel.test.ts +46 -0
  89. package/src/flow/models/blocks/form/submitValues.ts +4 -1
  90. package/src/flow/models/blocks/table/TableBlockModel.tsx +118 -16
  91. package/src/flow/models/blocks/table/__tests__/TableBlockModel.rowSelection.test.tsx +114 -0
  92. package/src/flow/models/fields/AssociationFieldModel/SubFormFieldModel.tsx +7 -1
  93. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/SubTableField.tsx +1 -1
  94. package/src/flow/models/fields/AssociationFieldModel/SubTableFieldModel/index.tsx +6 -5
  95. package/src/flow/models/fields/ClickableFieldModel.tsx +9 -1
  96. package/src/flow/models/fields/DisplayTimeFieldModel.tsx +1 -1
  97. package/src/flow/models/fields/TimeFieldModel.tsx +1 -1
  98. package/src/flow/models/fields/__tests__/TimeFieldModel.test.tsx +61 -0
  99. package/src/flow/models/fields/mobile-components/MobileDatePicker.tsx +19 -3
  100. package/src/flow/models/fields/mobile-components/__tests__/MobileDatePicker.test.tsx +94 -0
  101. package/src/flow/models/topbar/TopbarActionModel.tsx +1 -1
  102. package/src/flow/utils/__tests__/dateTimeFormat.test.ts +91 -0
  103. package/src/index.ts +1 -0
  104. package/src/layout-manager/LayoutContentRoute.tsx +90 -0
  105. package/src/layout-manager/LayoutManager.tsx +185 -0
  106. package/src/layout-manager/LayoutRoute.tsx +138 -0
  107. package/src/layout-manager/__tests__/LayoutManager.test.tsx +335 -0
  108. package/src/layout-manager/__tests__/LayoutRoute.test.tsx +473 -0
  109. package/src/layout-manager/index.ts +14 -0
  110. package/src/layout-manager/types.ts +22 -0
  111. package/src/layout-manager/utils.ts +37 -0
  112. package/src/nocobase-buildin-plugin/index.tsx +56 -48
  113. package/src/settings-center/index.ts +1 -1
  114. package/src/settings-center/plugin-manager/BulkEnableButton.tsx +111 -0
  115. package/src/settings-center/plugin-manager/PluginCard.tsx +270 -0
  116. package/src/settings-center/plugin-manager/PluginDetail.tsx +195 -0
  117. package/src/settings-center/plugin-manager/index.tsx +254 -0
  118. package/src/settings-center/plugin-manager/types.ts +35 -0
  119. package/src/settings-center/utils.tsx +8 -1
  120. package/src/theme/__tests__/globalStyles.test.ts +24 -0
  121. package/src/theme/globalStyles.ts +10 -0
  122. package/src/utils/globalDeps.ts +2 -0
  123. package/src/settings-center/PluginManagerPage.tsx +0 -162
@@ -7,15 +7,33 @@
7
7
  * For more information, please refer to: https://www.nocobase.com/agreement.
8
8
  */
9
9
 
10
- import { FlowModelRenderer, useFlowEngine, useFlowModelById, useFlowViewContext } from '@nocobase/flow-engine';
11
- import type { FlowModel } from '@nocobase/flow-engine';
10
+ import {
11
+ FlowModelRenderer,
12
+ isInheritedFrom,
13
+ useFlowEngine,
14
+ useFlowModelById,
15
+ useFlowViewContext,
16
+ } from '@nocobase/flow-engine';
17
+ import type { FlowModel, FlowModelRendererProps, ModelConstructor } from '@nocobase/flow-engine';
12
18
  import { useRequest } from 'ahooks';
13
19
  import React from 'react';
14
20
  import FlowRoute from './components/FlowRoute';
15
21
  import { SkeletonFallback } from './components/SkeletonFallback';
22
+ import { ChildPageModel } from './models';
16
23
 
17
- function InternalFlowPage({ uid, ...props }) {
24
+ const defaultPageFlowSettings: FlowModelRendererProps['showFlowSettings'] = {
25
+ showBackground: false,
26
+ showBorder: false,
27
+ };
28
+
29
+ function InternalFlowPage({
30
+ uid,
31
+ showFlowSettings,
32
+ ...props
33
+ }: { uid: string; showFlowSettings?: FlowModelRendererProps['showFlowSettings'] } & Record<string, unknown>) {
18
34
  const model = useFlowModelById(uid);
35
+ const resolvedShowFlowSettings = showFlowSettings ?? model?.props?.showFlowSettings ?? defaultPageFlowSettings;
36
+
19
37
  return (
20
38
  <FlowModelRenderer
21
39
  model={model}
@@ -25,7 +43,7 @@ function InternalFlowPage({ uid, ...props }) {
25
43
  />
26
44
  }
27
45
  hideRemoveInSettings
28
- showFlowSettings={{ showBackground: false, showBorder: false }}
46
+ showFlowSettings={resolvedShowFlowSettings}
29
47
  {...props}
30
48
  />
31
49
  );
@@ -36,14 +54,21 @@ type FlowPageProps = {
36
54
  parentId?: string;
37
55
  onModelLoaded?: (uid: string, model: FlowModel) => void;
38
56
  defaultTabTitle?: string;
57
+ showFlowSettings?: FlowModelRendererProps['showFlowSettings'];
39
58
  };
40
59
 
41
60
  export const FlowPage = React.memo((props: FlowPageProps & Record<string, unknown>) => {
42
61
  const { pageModelClass = 'ChildPageModel', parentId, onModelLoaded, defaultTabTitle, ...rest } = props;
43
62
  const flowEngine = useFlowEngine();
44
63
  const ctx = useFlowViewContext();
45
- const { loading, data } = useRequest(
64
+ const { loading, data, error } = useRequest(
46
65
  async () => {
66
+ const ModelClass = await flowEngine.getModelClassAsync(pageModelClass);
67
+ if (!ModelClass) {
68
+ throw new Error(`[NocoBase] Page model class '${pageModelClass}' is not registered.`);
69
+ }
70
+ const shouldInjectDefaultChildTab =
71
+ ModelClass === ChildPageModel || isInheritedFrom(ModelClass as ModelConstructor, ChildPageModel);
47
72
  const options = {
48
73
  async: true,
49
74
  parentId,
@@ -51,7 +76,7 @@ export const FlowPage = React.memo((props: FlowPageProps & Record<string, unknow
51
76
  subType: 'object',
52
77
  use: pageModelClass,
53
78
  };
54
- if (pageModelClass === 'ChildPageModel') {
79
+ if (shouldInjectDefaultChildTab) {
55
80
  const tabTitle = defaultTabTitle || flowEngine.translate?.('Details');
56
81
  options['subModels'] = {
57
82
  tabs: [
@@ -86,9 +111,12 @@ export const FlowPage = React.memo((props: FlowPageProps & Record<string, unknow
86
111
  return data;
87
112
  },
88
113
  {
89
- refreshDeps: [parentId],
114
+ refreshDeps: [parentId, pageModelClass, defaultTabTitle],
90
115
  },
91
116
  );
117
+ if (error) {
118
+ throw error;
119
+ }
92
120
  if (loading || !data?.uid) {
93
121
  return <SkeletonFallback style={{ margin: ctx?.isMobileLayout ? 8 : ctx?.themeToken.marginBlock }} />;
94
122
  }
@@ -0,0 +1,79 @@
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 { render } from '@testing-library/react';
11
+ import React from 'react';
12
+ import { afterEach, describe, expect, it, vi } from 'vitest';
13
+ import { FlowPage } from '../FlowPage';
14
+
15
+ const mocks = vi.hoisted(() => ({
16
+ rendererProps: undefined as any,
17
+ model: {
18
+ uid: 'public-form-page',
19
+ props: {
20
+ showFlowSettings: false,
21
+ },
22
+ context: {
23
+ isMobileLayout: false,
24
+ themeToken: {
25
+ marginBlock: 16,
26
+ },
27
+ },
28
+ },
29
+ }));
30
+
31
+ vi.mock('@nocobase/flow-engine', async () => {
32
+ const actual = await vi.importActual<any>('@nocobase/flow-engine');
33
+ const ReactModule = await import('react');
34
+
35
+ return {
36
+ ...actual,
37
+ FlowModelRenderer: vi.fn((props: any) => {
38
+ mocks.rendererProps = props;
39
+ return ReactModule.createElement('div', { 'data-testid': 'flow-model-renderer' });
40
+ }),
41
+ useFlowEngine: vi.fn(() => ({
42
+ getModelClassAsync: vi.fn(),
43
+ loadOrCreateModel: vi.fn(),
44
+ context: {},
45
+ })),
46
+ useFlowModelById: vi.fn(() => mocks.model),
47
+ useFlowViewContext: vi.fn(() => ({
48
+ themeToken: {
49
+ marginBlock: 16,
50
+ },
51
+ })),
52
+ };
53
+ });
54
+
55
+ vi.mock('ahooks', async () => {
56
+ const actual = await vi.importActual<any>('ahooks');
57
+ return {
58
+ ...actual,
59
+ useRequest: vi.fn(() => ({
60
+ loading: false,
61
+ data: {
62
+ uid: 'public-form-page',
63
+ },
64
+ error: null,
65
+ })),
66
+ };
67
+ });
68
+
69
+ describe('FlowPage', () => {
70
+ afterEach(() => {
71
+ mocks.rendererProps = undefined;
72
+ });
73
+
74
+ it('uses showFlowSettings from page model props', () => {
75
+ render(<FlowPage />);
76
+
77
+ expect(mocks.rendererProps?.showFlowSettings).toBe(false);
78
+ });
79
+ });