@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.
- package/dist/system/index.system.js +1 -1
- package/out/interface/util/route/route.d.ts +7 -0
- package/out/interface/util/route/route.d.ts.map +1 -1
- package/out/props/editor/index.d.ts +5 -0
- package/out/props/editor/index.d.ts.map +1 -1
- package/out/props/editor/index.js +5 -0
- package/out/props/editor/rate.d.ts +53 -0
- package/out/props/editor/rate.d.ts.map +1 -0
- package/out/props/editor/rate.js +21 -0
- package/out/props/editor/raw.d.ts +53 -0
- package/out/props/editor/raw.d.ts.map +1 -0
- package/out/props/editor/raw.js +21 -0
- package/out/props/editor/slider.d.ts +53 -0
- package/out/props/editor/slider.d.ts.map +1 -0
- package/out/props/editor/slider.js +21 -0
- package/out/props/editor/stepper.d.ts +53 -0
- package/out/props/editor/stepper.d.ts.map +1 -0
- package/out/props/editor/stepper.js +21 -0
- package/out/props/editor/switch.d.ts +53 -0
- package/out/props/editor/switch.d.ts.map +1 -0
- package/out/props/editor/switch.js +21 -0
- package/out/use/route/route.d.ts +13 -0
- package/out/use/route/route.d.ts.map +1 -1
- package/out/use/route/route.js +27 -0
- package/out/use/view/index.d.ts +7 -0
- package/out/use/view/index.d.ts.map +1 -1
- package/out/use/view/index.js +7 -0
- package/out/use/view/use-dashboard-view/use-dashboard-view.d.ts +12 -0
- package/out/use/view/use-dashboard-view/use-dashboard-view.d.ts.map +1 -0
- package/out/use/view/use-dashboard-view/use-dashboard-view.js +16 -0
- package/out/use/view/use-dataview-view/use-dataview-view.d.ts +12 -0
- package/out/use/view/use-dataview-view/use-dataview-view.d.ts.map +1 -0
- package/out/use/view/use-dataview-view/use-dataview-view.js +16 -0
- package/out/use/view/use-grid-exp-view/use-grid-exp-view.d.ts +10 -0
- package/out/use/view/use-grid-exp-view/use-grid-exp-view.d.ts.map +1 -0
- package/out/use/view/use-grid-exp-view/use-grid-exp-view.js +14 -0
- package/out/use/view/use-kanban-view/use-kanban-view.d.ts +12 -0
- package/out/use/view/use-kanban-view/use-kanban-view.d.ts.map +1 -0
- package/out/use/view/use-kanban-view/use-kanban-view.js +16 -0
- package/out/use/view/use-list-exp-view/use-list-exp-view.d.ts +10 -0
- package/out/use/view/use-list-exp-view/use-list-exp-view.d.ts.map +1 -0
- package/out/use/view/use-list-exp-view/use-list-exp-view.js +14 -0
- package/out/use/view/use-list-view/use-list-view.d.ts +10 -0
- package/out/use/view/use-list-view/use-list-view.d.ts.map +1 -0
- package/out/use/view/use-list-view/use-list-view.js +14 -0
- package/out/use/view/use-view-controller/use-view-controller.d.ts.map +1 -1
- package/out/use/view/use-view-controller/use-view-controller.js +3 -1
- package/out/use/view/use-wizard-view/use-wizard-view.d.ts +12 -0
- package/out/use/view/use-wizard-view/use-wizard-view.d.ts.map +1 -0
- package/out/use/view/use-wizard-view/use-wizard-view.js +16 -0
- package/out/use/vue/vue.d.ts +10 -0
- package/out/use/vue/vue.d.ts.map +1 -1
- package/out/use/vue/vue.js +16 -3
- package/out/use/widget/index.d.ts +5 -0
- package/out/use/widget/index.d.ts.map +1 -1
- package/out/use/widget/index.js +5 -0
- package/out/use/widget/use-control-controller/use-control-controller.d.ts.map +1 -1
- package/out/use/widget/use-control-controller/use-control-controller.js +2 -1
- package/out/use/widget/use-dataview-controller/use-dataview-controller.d.ts +16 -0
- package/out/use/widget/use-dataview-controller/use-dataview-controller.d.ts.map +1 -0
- package/out/use/widget/use-dataview-controller/use-dataview-controller.js +22 -0
- package/out/use/widget/use-grid-controller/use-grid-controller.d.ts.map +1 -1
- package/out/use/widget/use-grid-controller/use-grid-controller.js +4 -1
- package/out/use/widget/use-kanban-controller/use-kanban-controller.d.ts +16 -0
- package/out/use/widget/use-kanban-controller/use-kanban-controller.d.ts.map +1 -0
- package/out/use/widget/use-kanban-controller/use-kanban-controller.js +22 -0
- package/out/use/widget/use-layout-panel-controller/use-layout-panel-controller.d.ts +14 -0
- package/out/use/widget/use-layout-panel-controller/use-layout-panel-controller.d.ts.map +1 -0
- package/out/use/widget/use-layout-panel-controller/use-layout-panel-controller.js +20 -0
- package/out/use/widget/use-list-controller/use-list-controller.d.ts.map +1 -1
- package/out/use/widget/use-list-controller/use-list-controller.js +6 -0
- package/out/use/widget/use-tree-controller/use-tree-controller.d.ts.map +1 -1
- package/out/use/widget/use-tree-controller/use-tree-controller.js +3 -0
- package/out/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.d.ts +14 -0
- package/out/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.d.ts.map +1 -0
- package/out/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.js +17 -0
- package/out/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.d.ts +17 -0
- package/out/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.d.ts.map +1 -0
- package/out/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.js +19 -0
- package/out/util/index.d.ts +1 -0
- package/out/util/index.d.ts.map +1 -1
- package/out/util/index.js +1 -0
- package/out/util/route/route-listener.d.ts +42 -0
- package/out/util/route/route-listener.d.ts.map +1 -0
- package/out/util/route/route-listener.js +77 -0
- package/out/util/route/route.d.ts +1 -1
- package/out/util/route/route.d.ts.map +1 -1
- package/out/util/route/route.js +65 -63
- package/package.json +5 -5
- package/src/interface/util/route/route.ts +8 -0
- package/src/props/editor/index.ts +5 -0
- package/src/props/editor/rate.ts +24 -0
- package/src/props/editor/raw.ts +24 -0
- package/src/props/editor/slider.ts +24 -0
- package/src/props/editor/stepper.ts +24 -0
- package/src/props/editor/switch.ts +24 -0
- package/src/use/route/route.ts +33 -1
- package/src/use/view/index.ts +7 -0
- package/src/use/view/use-dashboard-view/use-dashboard-view.ts +21 -0
- package/src/use/view/use-dataview-view/use-dataview-view.ts +21 -0
- package/src/use/view/use-grid-exp-view/use-grid-exp-view.ts +17 -0
- package/src/use/view/use-kanban-view/use-kanban-view.ts +19 -0
- package/src/use/view/use-list-exp-view/use-list-exp-view.ts +17 -0
- package/src/use/view/use-list-view/use-list-view.ts +17 -0
- package/src/use/view/use-view-controller/use-view-controller.ts +3 -1
- package/src/use/view/use-wizard-view/use-wizard-view.ts +19 -0
- package/src/use/vue/vue.ts +18 -2
- package/src/use/widget/index.ts +5 -0
- package/src/use/widget/use-control-controller/use-control-controller.ts +2 -1
- package/src/use/widget/use-dataview-controller/use-dataview-controller.ts +29 -0
- package/src/use/widget/use-grid-controller/use-grid-controller.ts +4 -1
- package/src/use/widget/use-kanban-controller/use-kanban-controller.ts +29 -0
- package/src/use/widget/use-layout-panel-controller/use-layout-panel-controller.ts +27 -0
- package/src/use/widget/use-list-controller/use-list-controller.ts +6 -0
- package/src/use/widget/use-tree-controller/use-tree-controller.ts +3 -0
- package/src/use/widget/use-view-layout-panel-controller/use-view-layout-panel-controller.ts +24 -0
- package/src/use/widget/use-wizard-panel-controller/use-wizard-panel-controller.ts +26 -0
- package/src/util/index.ts +1 -0
- package/src/util/route/route-listener.ts +92 -0
- 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 =
|
|
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
|
+
}
|
package/src/use/vue/vue.ts
CHANGED
|
@@ -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
|
|
package/src/use/widget/index.ts
CHANGED
|
@@ -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 =
|
|
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('
|
|
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
|
@@ -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
|
+
}
|
package/src/util/route/route.ts
CHANGED
|
@@ -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 =
|
|
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
|
-
//
|
|
53
|
+
// 计算目标视图path路径
|
|
48
54
|
routePath.pathNodes.push({ viewName: appView.codeName.toLowerCase() });
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
// 计算自身的context参数
|
|
52
|
-
if (context) {
|
|
53
|
-
const routeContext: IData = context.getOwnContext();
|
|
55
|
+
const codeName = appView.getPSAppDataEntity()?.codeName;
|
|
54
56
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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 =
|
|
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
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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
|
-
|
|
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 (
|
|
256
|
-
params =
|
|
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
|
}
|