@ibiz-template/vue3-util 0.0.3-beta.1 → 0.0.3-beta.3

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 (120) hide show
  1. package/dist/system/index.system.js +1 -1
  2. package/out/interface/util/route/route.d.ts +7 -0
  3. package/out/interface/util/route/route.d.ts.map +1 -1
  4. package/out/props/editor/index.d.ts +5 -0
  5. package/out/props/editor/index.d.ts.map +1 -1
  6. package/out/props/editor/index.js +5 -0
  7. package/out/props/editor/rate.d.ts +53 -0
  8. package/out/props/editor/rate.d.ts.map +1 -0
  9. package/out/props/editor/rate.js +21 -0
  10. package/out/props/editor/raw.d.ts +53 -0
  11. package/out/props/editor/raw.d.ts.map +1 -0
  12. package/out/props/editor/raw.js +21 -0
  13. package/out/props/editor/slider.d.ts +53 -0
  14. package/out/props/editor/slider.d.ts.map +1 -0
  15. package/out/props/editor/slider.js +21 -0
  16. package/out/props/editor/stepper.d.ts +53 -0
  17. package/out/props/editor/stepper.d.ts.map +1 -0
  18. package/out/props/editor/stepper.js +21 -0
  19. package/out/props/editor/switch.d.ts +53 -0
  20. package/out/props/editor/switch.d.ts.map +1 -0
  21. package/out/props/editor/switch.js +21 -0
  22. package/out/use/route/route.d.ts +13 -0
  23. package/out/use/route/route.d.ts.map +1 -1
  24. package/out/use/route/route.js +27 -0
  25. package/out/use/view/index.d.ts +7 -0
  26. package/out/use/view/index.d.ts.map +1 -1
  27. package/out/use/view/index.js +7 -0
  28. package/out/use/view/use-dashboard-view/use-dashboard-view.d.ts +12 -0
  29. package/out/use/view/use-dashboard-view/use-dashboard-view.d.ts.map +1 -0
  30. package/out/use/view/use-dashboard-view/use-dashboard-view.js +16 -0
  31. package/out/use/view/use-dataview-view/use-dataview-view.d.ts +12 -0
  32. package/out/use/view/use-dataview-view/use-dataview-view.d.ts.map +1 -0
  33. package/out/use/view/use-dataview-view/use-dataview-view.js +16 -0
  34. package/out/use/view/use-grid-exp-view/use-grid-exp-view.d.ts +10 -0
  35. package/out/use/view/use-grid-exp-view/use-grid-exp-view.d.ts.map +1 -0
  36. package/out/use/view/use-grid-exp-view/use-grid-exp-view.js +14 -0
  37. package/out/use/view/use-kanban-view/use-kanban-view.d.ts +12 -0
  38. package/out/use/view/use-kanban-view/use-kanban-view.d.ts.map +1 -0
  39. package/out/use/view/use-kanban-view/use-kanban-view.js +16 -0
  40. package/out/use/view/use-list-exp-view/use-list-exp-view.d.ts +10 -0
  41. package/out/use/view/use-list-exp-view/use-list-exp-view.d.ts.map +1 -0
  42. package/out/use/view/use-list-exp-view/use-list-exp-view.js +14 -0
  43. package/out/use/view/use-list-view/use-list-view.d.ts +10 -0
  44. package/out/use/view/use-list-view/use-list-view.d.ts.map +1 -0
  45. package/out/use/view/use-list-view/use-list-view.js +14 -0
  46. package/out/use/view/use-view-controller/use-view-controller.d.ts.map +1 -1
  47. package/out/use/view/use-view-controller/use-view-controller.js +3 -1
  48. package/out/use/view/use-wizard-view/use-wizard-view.d.ts +12 -0
  49. package/out/use/view/use-wizard-view/use-wizard-view.d.ts.map +1 -0
  50. package/out/use/view/use-wizard-view/use-wizard-view.js +16 -0
  51. package/out/use/vue/vue.d.ts +10 -0
  52. package/out/use/vue/vue.d.ts.map +1 -1
  53. package/out/use/vue/vue.js +16 -3
  54. package/out/use/widget/index.d.ts +5 -0
  55. package/out/use/widget/index.d.ts.map +1 -1
  56. package/out/use/widget/index.js +5 -0
  57. package/out/use/widget/use-control-controller/use-control-controller.d.ts.map +1 -1
  58. package/out/use/widget/use-control-controller/use-control-controller.js +2 -1
  59. package/out/use/widget/use-dataview-controller/use-dataview-controller.d.ts +16 -0
  60. package/out/use/widget/use-dataview-controller/use-dataview-controller.d.ts.map +1 -0
  61. package/out/use/widget/use-dataview-controller/use-dataview-controller.js +22 -0
  62. package/out/use/widget/use-grid-controller/use-grid-controller.d.ts.map +1 -1
  63. package/out/use/widget/use-grid-controller/use-grid-controller.js +4 -1
  64. package/out/use/widget/use-kanban-controller/use-kanban-controller.d.ts +16 -0
  65. package/out/use/widget/use-kanban-controller/use-kanban-controller.d.ts.map +1 -0
  66. package/out/use/widget/use-kanban-controller/use-kanban-controller.js +22 -0
  67. package/out/use/widget/use-layout-panel-controller/use-layout-panel-controller.d.ts +14 -0
  68. package/out/use/widget/use-layout-panel-controller/use-layout-panel-controller.d.ts.map +1 -0
  69. package/out/use/widget/use-layout-panel-controller/use-layout-panel-controller.js +20 -0
  70. package/out/use/widget/use-list-controller/use-list-controller.d.ts.map +1 -1
  71. package/out/use/widget/use-list-controller/use-list-controller.js +6 -0
  72. package/out/use/widget/use-tree-controller/use-tree-controller.d.ts.map +1 -1
  73. package/out/use/widget/use-tree-controller/use-tree-controller.js +3 -0
  74. package/out/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.d.ts +14 -0
  75. package/out/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.d.ts.map +1 -0
  76. package/out/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.js +17 -0
  77. package/out/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.d.ts +17 -0
  78. package/out/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.d.ts.map +1 -0
  79. package/out/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.js +19 -0
  80. package/out/util/index.d.ts +1 -0
  81. package/out/util/index.d.ts.map +1 -1
  82. package/out/util/index.js +1 -0
  83. package/out/util/route/route-listener.d.ts +42 -0
  84. package/out/util/route/route-listener.d.ts.map +1 -0
  85. package/out/util/route/route-listener.js +77 -0
  86. package/out/util/route/route.d.ts +1 -1
  87. package/out/util/route/route.d.ts.map +1 -1
  88. package/out/util/route/route.js +65 -63
  89. package/package.json +5 -5
  90. package/src/interface/util/route/route.ts +8 -0
  91. package/src/props/editor/index.ts +5 -0
  92. package/src/props/editor/rate.ts +24 -0
  93. package/src/props/editor/raw.ts +24 -0
  94. package/src/props/editor/slider.ts +24 -0
  95. package/src/props/editor/stepper.ts +24 -0
  96. package/src/props/editor/switch.ts +24 -0
  97. package/src/use/route/route.ts +33 -1
  98. package/src/use/view/index.ts +7 -0
  99. package/src/use/view/use-dashboard-view/use-dashboard-view.ts +21 -0
  100. package/src/use/view/use-dataview-view/use-dataview-view.ts +21 -0
  101. package/src/use/view/use-grid-exp-view/use-grid-exp-view.ts +17 -0
  102. package/src/use/view/use-kanban-view/use-kanban-view.ts +19 -0
  103. package/src/use/view/use-list-exp-view/use-list-exp-view.ts +17 -0
  104. package/src/use/view/use-list-view/use-list-view.ts +17 -0
  105. package/src/use/view/use-view-controller/use-view-controller.ts +3 -1
  106. package/src/use/view/use-wizard-view/use-wizard-view.ts +19 -0
  107. package/src/use/vue/vue.ts +18 -2
  108. package/src/use/widget/index.ts +5 -0
  109. package/src/use/widget/use-control-controller/use-control-controller.ts +2 -1
  110. package/src/use/widget/use-dataview-controller/use-dataview-controller.ts +29 -0
  111. package/src/use/widget/use-grid-controller/use-grid-controller.ts +4 -1
  112. package/src/use/widget/use-kanban-controller/use-kanban-controller.ts +29 -0
  113. package/src/use/widget/use-layout-panel-controller/use-layout-panel-controller.ts +27 -0
  114. package/src/use/widget/use-list-controller/use-list-controller.ts +6 -0
  115. package/src/use/widget/use-tree-controller/use-tree-controller.ts +3 -0
  116. package/src/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.ts +24 -0
  117. package/src/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.ts +26 -0
  118. package/src/util/index.ts +1 -0
  119. package/src/util/route/route-listener.ts +92 -0
  120. package/src/util/route/route.ts +68 -59
@@ -26,7 +26,9 @@ export function useViewController<T extends ViewController>(
26
26
  const vue = proxy!;
27
27
  // 获取 props
28
28
  const props = useProps();
29
- const c = reactive(fn(props.context, props.params)) as T;
29
+ const c = fn(props.context, props.params);
30
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
31
+ c.state = reactive(c.state) as any;
30
32
 
31
33
  // 挂载强制更新方法
32
34
  onBeforeMount(() => {
@@ -0,0 +1,19 @@
1
+ import { WizardViewController } from '@ibiz-template/runtime';
2
+ import { useViewController } from '../use-view-controller/use-view-controller';
3
+
4
+ /**
5
+ * 向导视图控制器
6
+ *
7
+ * @author lxm
8
+ * @date 2023-02-16 11:28:16
9
+ * @export
10
+ * @param {string} path
11
+ * @returns {*} {WizardViewController}
12
+ */
13
+ export function useWizardViewController(path: string): WizardViewController {
14
+ return useViewController<WizardViewController>(
15
+ (context: IContext, params: IParams) => {
16
+ return new WizardViewController(path, context, params);
17
+ },
18
+ );
19
+ }
@@ -2,6 +2,8 @@ import { isFunc } from 'qx-util';
2
2
  import {
3
3
  ComponentPublicInstance,
4
4
  getCurrentInstance,
5
+ isReactive,
6
+ toRaw,
5
7
  watch,
6
8
  WatchOptions,
7
9
  } from 'vue';
@@ -19,6 +21,20 @@ export function useProps(): IData {
19
21
  return vue.$props;
20
22
  }
21
23
 
24
+ /**
25
+ * 如果是reactive代理过的对象,返回原始对象
26
+ *
27
+ * @author lxm
28
+ * @date 2023-02-15 10:56:00
29
+ * @export
30
+ * @param {*} val
31
+ * @returns {*}
32
+ */
33
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
34
+ export function getOrigin(val: any) {
35
+ return isReactive(val) ? toRaw(val) : val;
36
+ }
37
+
22
38
  /**
23
39
  * 监听props的属性
24
40
  *
@@ -39,12 +55,12 @@ export function usePropsWatch<T = unknown>(
39
55
  watch(
40
56
  () => props[key],
41
57
  (newVal, oldVal) => {
42
- callback(newVal, oldVal);
58
+ callback(getOrigin(newVal), getOrigin(oldVal));
43
59
  },
44
60
  options,
45
61
  );
46
62
  // immediate无效,模拟第一次赋值
47
- callback(props[key], undefined);
63
+ callback(getOrigin(props[key]), undefined);
48
64
  }
49
65
  }
50
66
 
@@ -8,3 +8,8 @@ export { useViewPanelController } from './use-view-panel-controller/use-view-pan
8
8
  export { usePickupViewPanelController } from './use-pickup-view-panel-controller/use-pickup-view-panel-controller';
9
9
  export { useDashboardController } from './use-dashboard-controller/use-dashboard-controller';
10
10
  export { useTreeController } from './use-tree-controller/use-tree-controller';
11
+ export { useDataViewController } from './use-dataview-controller/use-dataview-controller';
12
+ export { useLayoutPanelController } from './use-layout-panel-controller/use-layout-panel-controller';
13
+ export { useViewLayoutPanelController } from './use-view-layout-panel-controller/use-view-layout-panel-controller';
14
+ export { useWizardPanelController } from './use-wizard-panel-controller/use-wizard-panel-controller';
15
+ export { useKanbanController } from './use-kanban-controller/use-kanban-controller';
@@ -22,7 +22,8 @@ export function useControlController<T extends ControlController>(
22
22
  fn: () => T,
23
23
  ): T {
24
24
  const vue = getCurrentInstance()!.proxy!;
25
- const c = reactive(fn()) as T;
25
+ const c = fn();
26
+ c.state = reactive(c.state) as T;
26
27
 
27
28
  // 挂载强制更新方法
28
29
  onBeforeMount(() => {
@@ -0,0 +1,29 @@
1
+ import { DataViewController } from '@ibiz-template/runtime';
2
+ import { IBizContext } from '@ibiz-template/core';
3
+ import { DataViewModel } from '@ibiz-template/model';
4
+ import { useControlController } from '../use-control-controller/use-control-controller';
5
+ import { usePropsWatch } from '../../vue/vue';
6
+
7
+ /**
8
+ * 获取卡片部件控制器
9
+ *
10
+ * @author chitanda
11
+ * @date 2022-08-15 17:08:15
12
+ * @export
13
+ * @param {DataViewModel} model
14
+ * @param {IBizContext} context
15
+ * @param {IParams} [params={}]
16
+ * @return {*} {DataViewController}
17
+ */
18
+ export function useDataViewController(
19
+ model: DataViewModel,
20
+ context: IBizContext,
21
+ params: IParams = {},
22
+ ): DataViewController {
23
+ return useControlController<DataViewController>(() => {
24
+ const c = new DataViewController(model, context, params);
25
+ // 监听prop,并响应式更新到controller
26
+ usePropsWatch('mdCtrlActiveMode', c.setMdCtrlActiveMode.bind(c));
27
+ return c;
28
+ });
29
+ }
@@ -23,7 +23,10 @@ export function useGridController(
23
23
  return useControlController<GridController>(() => {
24
24
  const c = new GridController(model, context, params);
25
25
  // 监听prop,并响应式更新到controller
26
- usePropsWatch('gridRowActiveMode', c.setGridRowActiveMode.bind(c));
26
+ usePropsWatch('mdCtrlActiveMode', c.setMdCtrlActiveMode.bind(c));
27
+ usePropsWatch('isSelectFirstDefault', c.setIsSelectFirstDefault.bind(c));
28
+ usePropsWatch('defaultSelectKeys', c.setDefaultSelectKeys.bind(c));
29
+ usePropsWatch('isExpView', c.setIsExpView.bind(c));
27
30
 
28
31
  return c;
29
32
  });
@@ -0,0 +1,29 @@
1
+ import { KanbanController } from '@ibiz-template/runtime';
2
+ import { IBizContext } from '@ibiz-template/core';
3
+ import { KanbanModel } from '@ibiz-template/model';
4
+ import { useControlController } from '../use-control-controller/use-control-controller';
5
+ import { usePropsWatch } from '../../vue/vue';
6
+
7
+ /**
8
+ * 获取看板部件控制器
9
+ *
10
+ * @author chitanda
11
+ * @date 2022-08-15 17:08:15
12
+ * @export
13
+ * @param {KanbanModel} model
14
+ * @param {IBizContext} context
15
+ * @param {IParams} [params={}]
16
+ * @return {*} {KanbanController}
17
+ */
18
+ export function useKanbanController(
19
+ model: KanbanModel,
20
+ context: IBizContext,
21
+ params: IParams = {},
22
+ ): KanbanController {
23
+ return useControlController<KanbanController>(() => {
24
+ const c = new KanbanController(model, context, params);
25
+ // 监听prop,并响应式更新到controller
26
+ usePropsWatch('mdCtrlActiveMode', c.setMdCtrlActiveMode.bind(c));
27
+ return c;
28
+ });
29
+ }
@@ -0,0 +1,27 @@
1
+ import { LayoutPanelController } from '@ibiz-template/runtime';
2
+ import { IBizContext } from '@ibiz-template/core';
3
+ import { LayoutPanelModel } from '@ibiz-template/model';
4
+ import { useControlController } from '../use-control-controller/use-control-controller';
5
+ import { usePropsWatch } from '../../vue/vue';
6
+
7
+ /**
8
+ * 获取布局面板控制器
9
+ *
10
+ * @export
11
+ * @param {LayoutPanelModel} model
12
+ * @param {IBizContext} context
13
+ * @param {IParams} [params={}]
14
+ * @returns {*} {LayoutPanelController}
15
+ */
16
+ export function useLayoutPanelController(
17
+ model: LayoutPanelModel,
18
+ context: IBizContext,
19
+ params: IParams = {},
20
+ ): LayoutPanelController {
21
+ return useControlController<LayoutPanelController>(() => {
22
+ const c = new LayoutPanelController(model, context, params);
23
+ // 监听prop,并响应式更新到controller
24
+ usePropsWatch('inputData', c.setInputData.bind(c));
25
+ return c;
26
+ });
27
+ }
@@ -2,6 +2,7 @@ import { ListController } from '@ibiz-template/runtime';
2
2
  import { IBizContext } from '@ibiz-template/core';
3
3
  import { ListModel } from '@ibiz-template/model';
4
4
  import { useControlController } from '../use-control-controller/use-control-controller';
5
+ import { usePropsWatch } from '../../vue/vue';
5
6
 
6
7
  /**
7
8
  * 获取列表部件控制器
@@ -21,6 +22,11 @@ export function useListController(
21
22
  ): ListController {
22
23
  return useControlController<ListController>(() => {
23
24
  const c = new ListController(model, context, params);
25
+ // 监听prop,并响应式更新到controller
26
+ usePropsWatch('mdCtrlActiveMode', c.setMdCtrlActiveMode.bind(c));
27
+ usePropsWatch('isSelectFirstDefault', c.setIsSelectFirstDefault.bind(c));
28
+ usePropsWatch('defaultSelectKeys', c.setDefaultSelectKeys.bind(c));
29
+ usePropsWatch('isExpView', c.setIsExpView.bind(c));
24
30
  return c;
25
31
  });
26
32
  }
@@ -2,6 +2,7 @@ import { TreeController } from '@ibiz-template/runtime';
2
2
  import { IBizContext } from '@ibiz-template/core';
3
3
  import { TreeModel } from '@ibiz-template/model';
4
4
  import { useControlController } from '../use-control-controller/use-control-controller';
5
+ import { usePropsWatch } from '../../vue/vue';
5
6
 
6
7
  /**
7
8
  * 获取树部件控制器
@@ -20,6 +21,8 @@ export function useTreeController(
20
21
  ): TreeController {
21
22
  return useControlController<TreeController>(() => {
22
23
  const c = new TreeController(model, context, params);
24
+ usePropsWatch('defaultSelectKeys', c.setDefaultSelectKeys.bind(c));
25
+ usePropsWatch('isSelectFirstDefault', c.setIsSelectFirstDefault.bind(c));
23
26
  return c;
24
27
  });
25
28
  }
@@ -0,0 +1,24 @@
1
+ import { ViewLayoutPanelController } from '@ibiz-template/runtime';
2
+ import { IBizContext } from '@ibiz-template/core';
3
+ import { ViewLayoutPanelModel } from '@ibiz-template/model';
4
+ import { useControlController } from '../use-control-controller/use-control-controller';
5
+
6
+ /**
7
+ * 获取视图布局面板控制器
8
+ *
9
+ * @export
10
+ * @param {ViewLayoutPanelModel} model
11
+ * @param {IBizContext} context
12
+ * @param {IParams} [params={}]
13
+ * @returns {*} {ViewLayoutPanelController}
14
+ */
15
+ export function useViewLayoutPanelController(
16
+ model: ViewLayoutPanelModel,
17
+ context: IBizContext,
18
+ params: IParams = {},
19
+ ): ViewLayoutPanelController {
20
+ return useControlController<ViewLayoutPanelController>(() => {
21
+ const c = new ViewLayoutPanelController(model, context, params);
22
+ return c;
23
+ });
24
+ }
@@ -0,0 +1,26 @@
1
+ import { WizardPanelController } from '@ibiz-template/runtime';
2
+ import { IBizContext } from '@ibiz-template/core';
3
+ import { WizardPanelModel } from '@ibiz-template/model';
4
+ import { useControlController } from '../use-control-controller/use-control-controller';
5
+
6
+ /**
7
+ * 获取向导面板部件控制器
8
+ *
9
+ *
10
+ * @author lxm
11
+ * @date 2023-02-15 07:37:33
12
+ * @export
13
+ * @param {WizardPanelModel} model
14
+ * @param {IBizContext} context
15
+ * @param {IParams} [params={}]
16
+ * @returns {*} {WizardPanelController}
17
+ */
18
+ export function useWizardPanelController(
19
+ model: WizardPanelModel,
20
+ context: IBizContext,
21
+ params: IParams = {},
22
+ ): WizardPanelController {
23
+ return useControlController<WizardPanelController>(() => {
24
+ return new WizardPanelController(model, context, params);
25
+ });
26
+ }
package/src/util/index.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from './route/route';
2
+ export * from './route/route-listener';
@@ -0,0 +1,92 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { isFunction } from 'lodash-es';
3
+ import { watch } from 'vue';
4
+ import { RouteLocationNormalizedLoaded } from 'vue-router';
5
+
6
+ type ChangeCallback = () => void;
7
+ /**
8
+ * 监听路由变更,提供下一次变更执行的一次性回调。
9
+ *
10
+ * @export
11
+ * @class RouteListener
12
+ */
13
+ export class RouteListener {
14
+ /**
15
+ * 回调集合
16
+ *
17
+ * @memberof RouteListener
18
+ */
19
+ private callbacks: Array<ChangeCallback> = [];
20
+
21
+ /**
22
+ * 计时器集合
23
+ *
24
+ * @private
25
+ * @type {any[]}
26
+ * @memberof RouteListener
27
+ */
28
+ private timers: any[] = [];
29
+
30
+ /**
31
+ * 等待路由响应时间
32
+ *
33
+ * @private
34
+ * @type {number}
35
+ * @memberof RouteListener
36
+ */
37
+ private wait: number = 500;
38
+
39
+ constructor(route: RouteLocationNormalizedLoaded, wait?: number) {
40
+ if (wait) {
41
+ this.wait = wait;
42
+ }
43
+ watch(
44
+ () => route.path,
45
+ (newVal, oldVal) => {
46
+ if (newVal !== oldVal) {
47
+ // 执行所有回调
48
+ if (this.callbacks.length) {
49
+ for (let index = 0; index < this.callbacks.length; index++) {
50
+ const fn = this.callbacks[index];
51
+ fn();
52
+ }
53
+ }
54
+ // 清空所有回调
55
+ this.callbacks = [];
56
+
57
+ // 清空所有计时器
58
+ if (this.timers.length) {
59
+ for (let index = 0; index < this.timers.length; index++) {
60
+ const timer = this.timers[index];
61
+ clearTimeout(timer);
62
+ }
63
+ }
64
+
65
+ this.timers = [];
66
+ }
67
+ },
68
+ );
69
+ }
70
+
71
+ /**
72
+ * 下一次路由变更后执行回调,只执行一次
73
+ *
74
+ * @param {ChangeCallback} callback
75
+ * @memberof RouteListener
76
+ */
77
+ nextChange(callback: ChangeCallback) {
78
+ if (isFunction(callback)) {
79
+ // 设定计时器,经过一段时间等不到时,执行回调,并删除回调集合里的回调
80
+ this.timers.push(
81
+ setTimeout(() => {
82
+ callback();
83
+ const index = this.callbacks.findIndex(item => item === callback);
84
+ this.callbacks.splice(index, 1);
85
+ }, this.wait),
86
+ );
87
+
88
+ // 存入回调集合等待被调用
89
+ this.callbacks.push(callback);
90
+ }
91
+ }
92
+ }
@@ -3,6 +3,7 @@ import { IBizContext, RuntimeError } from '@ibiz-template/core';
3
3
  import { IPSApplication, IPSAppView, IPSSubAppRef } from '@ibiz-template/model';
4
4
  import qs from 'qs';
5
5
  import { RouteLocationNormalizedLoaded as Route } from 'vue-router';
6
+ import { calcRouteContext } from '@ibiz-template/runtime';
6
7
  import { IRoutePath, IRoutePathNode, IRouteViewData } from '../../interface';
7
8
 
8
9
  /**
@@ -23,7 +24,7 @@ export function generateRoutePath(
23
24
  context?: IBizContext | undefined,
24
25
  params?: IParams | undefined,
25
26
  ): string {
26
- const routePath = string2routePath(route.fullPath);
27
+ const routePath = route2routePath(route);
27
28
  // 如果上下文存在toRouteLevel时,使用上下文的层级,否则是第二级路由
28
29
  let level = 2;
29
30
  if (context?.toRouteLevel) {
@@ -31,10 +32,15 @@ export function generateRoutePath(
31
32
  // 使用完后删除,避免添加到首页上下文里
32
33
  delete context.toRouteLevel;
33
34
  }
34
- // 删除自身层级和之后的路由,保留之前层级的路由
35
+ // 删除目标层级和之后的路由,保留之前层级的路由
35
36
  routePath.pathNodes.splice(level - 1, routePath.pathNodes.length - level + 1);
36
37
 
37
- // 一级首页路由
38
+ // 修改当前层级路由的附加上下文参数
39
+ if (context?.currentRouteContext) {
40
+ routePath.pathNodes[level - 2].context = context.currentRouteContext;
41
+ }
42
+
43
+ // 重定向视图跳转的一级首页路由
38
44
  if (routePath.pathNodes[0].viewName === 'appredirectview') {
39
45
  if (params?.srfindexname) {
40
46
  routePath.pathNodes[0].viewName = params.srfindexname;
@@ -44,24 +50,18 @@ export function generateRoutePath(
44
50
  }
45
51
  }
46
52
 
47
- // 计算自身视图path路径
53
+ // 计算目标视图path路径
48
54
  routePath.pathNodes.push({ viewName: appView.codeName.toLowerCase() });
49
- const deName = appView.getPSAppDataEntity()?.codeName.toLowerCase();
50
-
51
- // 计算自身的context参数
52
- if (context) {
53
- const routeContext: IData = context.getOwnContext();
55
+ const codeName = appView.getPSAppDataEntity()?.codeName;
54
56
 
55
- // 如果有路由上下文参数的话,添加到path上
56
- if (Object.values(routeContext).length > 0) {
57
- // 有视图实体主键上下文时,
58
- if (deName && routeContext[deName]) {
59
- routePath.pathNodes[level - 1].context = routeContext[deName];
60
- delete routeContext[deName];
61
- }
62
- // 除主键外的参数合并到首页的参数里去
63
- Object.assign(routePath.pathNodes[0].context as IContext, routeContext);
64
- }
57
+ // 计算最新的上下文并更新到index后面
58
+ if (context && codeName) {
59
+ const app = ibiz.hub.getApp(appView.getPSModelService().app);
60
+ const paths = app.resourcePathUtil.calcPaths(codeName);
61
+ const routeContext = calcRouteContext(context, paths);
62
+ routePath.pathNodes[0].context = routeContext;
63
+ } else {
64
+ routePath.pathNodes[0].context = {};
65
65
  }
66
66
 
67
67
  // 存在视图参数时补充视图参数
@@ -151,7 +151,7 @@ export function parseRouteViewData(
151
151
  level: number,
152
152
  ): IRouteViewData {
153
153
  // 解析路由的视图参数
154
- const routePath = string2routePath(route.fullPath);
154
+ const routePath = route2routePath(route);
155
155
 
156
156
  // 获取对应层级的视图名称参数
157
157
  const viewCodeName = routePath.pathNodes[level - 1].viewName;
@@ -172,24 +172,23 @@ export function parseRouteViewData(
172
172
 
173
173
  // 解析上下文参数,整合当前层级之前所有的上下文参数
174
174
  const context: IContext = {};
175
- // 合并应用上下文
175
+ // 合并appData里的应用上下文
176
176
  if (ibiz.appData?.context) {
177
177
  Object.assign(context, ibiz.appData.context);
178
178
  }
179
179
 
180
+ // 合并路由上下文
181
+ // 合并路由应用上下文
182
+ if (routePath.appContext) {
183
+ Object.assign(context, routePath.appContext);
184
+ }
185
+ // 合并视图上下文
180
186
  for (let index = 0; index < level; index++) {
181
187
  const pathNode = routePath.pathNodes[index];
182
188
  if (notNilEmpty(pathNode.context)) {
183
189
  if (index === 0) {
184
190
  // 首页的context是对象直接合并
185
191
  Object.assign(context, pathNode.context);
186
- } else {
187
- // 其他层级,如果存在context则是主键字符串
188
- const view = findView(appModel, pathNode.viewName);
189
- const deName = view!.refM.resource?.toLowerCase();
190
- if (deName) {
191
- context[deName] = pathNode.context;
192
- }
193
192
  }
194
193
  }
195
194
  }
@@ -217,46 +216,45 @@ export function parseRouteViewData(
217
216
  * @param {string} pathStr 以/开头的路径,即router的path
218
217
  * @returns {*} {IRoutePath}
219
218
  */
220
- export function string2routePath(pathStr: string): IRoutePath {
221
- let queryIndex = pathStr.lastIndexOf('?');
222
- queryIndex = queryIndex === -1 ? pathStr.length : queryIndex;
223
- let path = pathStr.substring(0, queryIndex);
224
- if (path.indexOf('/') === 0) path = path.substring(1);
225
- const queryPath = pathStr.substring(queryIndex + 1);
219
+ export function route2routePath(route: Route): IRoutePath {
220
+ // 一共匹配了几级路由
221
+ const level = route.matched.length;
226
222
 
227
223
  // 解析路径节点
228
224
  const pathNodes: IRoutePathNode[] = [];
229
-
230
- const paths = path.split('/');
231
- let viewNum = 0;
232
- paths.forEach((str: string, index: number) => {
233
- // 第一级是首页
234
- if (index === 0) {
235
- pathNodes.push({ viewName: str.toLowerCase(), context: {} });
225
+ for (let index = 1; index <= level; index++) {
226
+ const viewName = route.params[`view${index}`] as string;
227
+ let context: string | undefined | IContext = route.params[
228
+ `params${index}`
229
+ ] as string;
230
+ // context为占位符时置空
231
+ if (!context || context === ibiz.env.routePlaceholder) {
232
+ context = undefined;
236
233
  } else if (index === 1) {
237
- // 第二级是上下文或者二级视图
238
- if (/[^/]+=[^/]+/.test(str)) {
239
- pathNodes[pathNodes.length - 1].context = qs.parse(str, {
240
- delimiter: ';',
241
- });
242
- } else {
243
- pathNodes.push({ viewName: str.toLowerCase() });
244
- viewNum = 1;
245
- }
246
- } else if (index % 2 === viewNum) {
247
- pathNodes.push({ viewName: str.toLowerCase() });
248
- } else {
249
- pathNodes[pathNodes.length - 1].context = str === '_' ? undefined : str;
234
+ // 首页上下文要解析
235
+ context = qs.parse(context, { delimiter: ';' });
250
236
  }
251
- });
237
+ pathNodes.push({ viewName, context });
238
+ }
239
+
240
+ // 解析应用上下文
241
+ let appContext;
242
+ if (
243
+ route.params.appContext &&
244
+ route.params.appContext !== ibiz.env.routePlaceholder
245
+ ) {
246
+ appContext = qs.parse(route.params.appContext as string, {
247
+ delimiter: ';',
248
+ });
249
+ }
252
250
 
253
251
  // 解析视图参数
254
252
  let params;
255
- if (queryPath) {
256
- params = qs.parse(queryPath);
253
+ if (route.query) {
254
+ params = { ...route.query };
257
255
  }
258
256
 
259
- return { pathNodes, params };
257
+ return { appContext, pathNodes, params };
260
258
  }
261
259
 
262
260
  /**
@@ -270,6 +268,14 @@ export function string2routePath(pathStr: string): IRoutePath {
270
268
  */
271
269
  export function routePath2string(routePath: IRoutePath): string {
272
270
  let pathStr = '';
271
+ // 应用上下文
272
+ if (routePath.appContext) {
273
+ pathStr += `/${qs.stringify(routePath.appContext, { delimiter: ';' })}`;
274
+ } else {
275
+ pathStr += `/${ibiz.env.routePlaceholder}`;
276
+ }
277
+
278
+ // 每一层级的视图
273
279
  routePath.pathNodes.forEach((pathNode: IRoutePathNode, index: number) => {
274
280
  pathStr += `/${pathNode.viewName}`;
275
281
  // 首页路由
@@ -280,13 +286,16 @@ export function routePath2string(routePath: IRoutePath): string {
280
286
  ) {
281
287
  // 对象转成a=11;b=222的格式,字符串直接附加在后面
282
288
  pathStr += `/${qs.stringify(pathNode.context, { delimiter: ';' })}`;
289
+ } else {
290
+ pathStr += `/${ibiz.env.routePlaceholder}`;
283
291
  }
284
292
  } else {
285
293
  // 非首页路由
286
- pathStr += `/${pathNode.context || '_'}`;
294
+ pathStr += `/${pathNode.context || ibiz.env.routePlaceholder}`;
287
295
  }
288
296
  });
289
297
 
298
+ // 附加视图参数
290
299
  if (notNilEmpty(routePath.params)) {
291
300
  pathStr += qs.stringify(routePath.params, { addQueryPrefix: true });
292
301
  }