@utogether/udp-core 1.0.1-beta.23 → 1.0.1-beta.25

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 (67) hide show
  1. package/dist/{403-CVk0Zv7-.js → 403-CcK3Z1Ut.js} +1 -1
  2. package/dist/{404-ndDOUJxF.js → 404-Bo_CvpAq.js} +1 -1
  3. package/dist/{500-CBFigQjv.js → 500-D_PHJmAt.js} +1 -1
  4. package/dist/{AuthorityInfo-BDf4I8In.js → AuthorityInfo-BNyWnjft.js} +1 -1
  5. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-cEIXuHBK.js → AuthorityInfo.vue_vue_type_style_index_0_lang-KAsR77o2.js} +1 -1
  6. package/dist/{Company-DYDDIDa5.js → Company-CDWGarmp.js} +3 -3
  7. package/dist/{CompanyPanel-DggYD4kC.js → CompanyPanel-CCaP8Akz.js} +1 -1
  8. package/dist/{Department-DqrAvwmT.js → Department-DKtHXR1d.js} +3 -3
  9. package/dist/{DepartmentPanel-BjhhDlhw.js → DepartmentPanel-ClhzUdEf.js} +1 -1
  10. package/dist/{DesignPanel-DAR2pcpF.js → DesignPanel-C07pQw5N.js} +1 -1
  11. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-B8GPGq0h.js → DesignPanel.vue_vue_type_style_index_0_lang-Bs3tVdcr.js} +2 -2
  12. package/dist/{DictView-BcLgE6q2.js → DictView-BoSLIZQg.js} +16 -15
  13. package/dist/{InvOrganization-B61NWug9.js → InvOrganization-DLU5itCw.js} +1 -1
  14. package/dist/{Org-9tL7q4mS.js → Org-CsD3SR_w.js} +1 -1
  15. package/dist/{Preview-Bn4QDJ6s.js → Preview-CX4fXxW0.js} +1 -1
  16. package/dist/{ReportDefine-BMGU8p3z.js → ReportDefine-BwBNr_Oc.js} +1 -1
  17. package/dist/{ReportDesign-DkwxPGCT.js → ReportDesign-Cv2Bwvye.js} +2 -2
  18. package/dist/{ReportQuery-DOFFL8Nn.js → ReportQuery-B2uzUNww.js} +1 -1
  19. package/dist/{ReportQueryFrom-BDDlluNb.js → ReportQueryFrom-DYfXC2UY.js} +1 -1
  20. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-Yqw26YrX.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-BpmudBiL.js} +1 -1
  21. package/dist/{ReportTemplate-DmFqn7ji.js → ReportTemplate-CJo-42IC.js} +1 -1
  22. package/dist/{Role-DGw_eao_.js → Role-bB1Q6Yha.js} +3 -3
  23. package/dist/{RoleAssign-BJ32jpGq.js → RoleAssign-Drw5pVP3.js} +3 -3
  24. package/dist/{RolePanel-DHS9C-hf.js → RolePanel--YCIdOp8.js} +1 -1
  25. package/dist/{RolePanel-B2O0mFtr.js → RolePanel-BDADA7Ki.js} +1 -1
  26. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-CEYM_zn7.js → RolePanel.vue_vue_type_script_setup_true_lang-BqLVxcz-.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-T5FN19eF.js → RolePanel.vue_vue_type_script_setup_true_lang-CEJmE7mg.js} +3 -3
  28. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-CeYU2NrW.js → ScrollPanel.vue_vue_type_style_index_0_lang-C_sqOcvc.js} +1 -1
  29. package/dist/{Staff-3Rejxejf.js → Staff-CM_RZn0q.js} +3 -3
  30. package/dist/{StaffInfo-C94C3Gj7.js → StaffInfo-BQowR-hf.js} +1 -1
  31. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-Bm76KXps.js → StaffInfo.vue_vue_type_script_setup_true_lang-unmZZb3r.js} +1 -1
  32. package/dist/{StaffPanel-ClhiNL5a.js → StaffPanel-BYeVwLCJ.js} +1 -1
  33. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-DjUOMmMr.js → StaffPanel.vue_vue_type_script_setup_true_lang-D5Z7wC3G.js} +2 -2
  34. package/dist/{SysUser-DUXK1KbY.js → SysUser-gQkVBVRy.js} +2 -2
  35. package/dist/{SysUserPanel-3HThXZFZ.js → SysUserPanel--NpQuDi_.js} +1 -1
  36. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-DjbpSAOd.js → SysUserPanel.vue_vue_type_script_setup_true_lang-Dp2-Jj5B.js} +1 -1
  37. package/dist/{SystemMenu-C1CrBLIy.js → SystemMenu-_iRBXuJt.js} +39 -39
  38. package/dist/{UserInfo-C1tgO95t.js → UserInfo-FenstLY2.js} +1 -1
  39. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-CNLWkLRN.js → UserInfo.vue_vue_type_style_index_0_lang-F1VcEy9W.js} +1 -1
  40. package/dist/{childView-CCr-NwqZ.js → childView-C1S10Kzx.js} +1 -1
  41. package/dist/{childView-CeYGykew.js → childView-Cl20RURS.js} +1 -1
  42. package/dist/{childView.vue_vue_type_style_index_0_lang-IhbVX2Xa.js → childView.vue_vue_type_style_index_0_lang-CvXI-jWg.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-D9PsELsS.js → childView.vue_vue_type_style_index_0_lang-PkzzLPiF.js} +1 -1
  44. package/dist/{code-rule-BVjue1Qj.js → code-rule-DcLQh0J2.js} +1 -1
  45. package/dist/core.es.js +1 -1
  46. package/dist/{cron-task-BfVSQIgT.js → cron-task-DSTiWf2H.js} +1 -1
  47. package/dist/{frameView-D_YJavxB.js → frameView-BgULY6HL.js} +1 -1
  48. package/dist/index-CicLR1aC.js +2902 -0
  49. package/dist/{layoutView-DpxwrEJd.js → layoutView-CM8KvOD7.js} +1 -1
  50. package/dist/{login-8muEJPMg.js → login-Cn3mQTZK.js} +1 -1
  51. package/dist/{lov-view-DEp2h_qy.js → lov-view-Cb9MBjDA.js} +2 -2
  52. package/dist/{menuInfo-rPb4Ed8Q.js → menuInfo-DLMBNk6i.js} +1 -1
  53. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-mtPuZDRn.js → menuInfo.vue_vue_type_style_index_0_lang-Ca1mQxmJ.js} +119 -99
  54. package/dist/{pda-app-CSrTwUo7.js → pda-app-BEMzxuBJ.js} +1 -1
  55. package/dist/{resource-B4Fsud2G.js → resource-BhHMd7QC.js} +1 -1
  56. package/dist/{su-welcome-DkwJ8pW8.js → su-welcome-BYm1CMJ2.js} +1 -1
  57. package/dist/{sys-config-CnMkBejC.js → sys-config-B3OKaUem.js} +1 -1
  58. package/dist/udp-core.css +1 -1
  59. package/package.json +1 -1
  60. package/src/main.ts +20 -20
  61. package/src/plugins/i18n/zh.ts +3 -1
  62. package/src/router/utils.ts +2 -2
  63. package/src/style/button.scss +85 -85
  64. package/src/views/system/menu/SystemMenu.vue +185 -183
  65. package/src/views/system/menu/menuInfo.vue +384 -363
  66. package/src/views/udev/dict/DictView.vue +118 -118
  67. package/dist/index-ZaDSQxcf.js +0 -6495
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@utogether/udp-core",
3
3
  "private": false,
4
- "version": "1.0.1-beta.23",
4
+ "version": "1.0.1-beta.25",
5
5
  "description": "",
6
6
  "type": "module",
7
7
  "main1": "index.ts",
package/src/main.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @Author: levi7754 levi7754@163.com
3
3
  * @Date: 2025-07-25 13:38:20
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-10-19 12:15:08
5
+ * @LastEditTime: 2025-11-14 10:52:54
6
6
  * @FilePath: \udp-front\packages\udp-core\src\main.ts
7
7
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
8
  */
@@ -32,23 +32,23 @@ import './style/index.scss';
32
32
 
33
33
  // import SuTable from './components/SuTable/SuTable.vue';
34
34
 
35
- import {
36
- // UtButton,
37
- // utLov2,
38
- // UGrid,
39
- // UtDivider,
40
- // UtModalForm2
41
- // FormUpload2,
42
- UtForm2,
43
- UtGrid2
44
- // UtContent2,
45
- // UtStampBadge2
46
- // UtModalGrid2
47
- // UtUpload2
48
- // UtIconSelect,
49
- // UtCalendar
50
- // uAttachment
51
- } from './components/udp';
35
+ // import {
36
+ // UtButton,
37
+ // utLov2,
38
+ // UGrid,
39
+ // UtDivider,
40
+ // UtModalForm2
41
+ // FormUpload2,
42
+ // UtForm2,
43
+ // UtGrid2
44
+ // UtContent2,
45
+ // UtStampBadge2
46
+ // UtModalGrid2
47
+ // UtUpload2
48
+ // UtIconSelect,
49
+ // UtCalendar
50
+ // uAttachment
51
+ // } from './components/udp';
52
52
 
53
53
  const app = createApp(App);
54
54
 
@@ -93,8 +93,8 @@ const init = ({ router, config, lang, views, env, tableConfig }) => {
93
93
  // app.component('uAttachment', uAttachment).component('UGrid', UGrid);
94
94
  // .component('UtDivider', UtDivider)
95
95
  // app.component('UtModalForm2', UtModalForm2);
96
- app.component('UtGrid2', UtGrid2);
97
- app.component('UtForm2', UtForm2);
96
+ // app.component('UtGrid2', UtGrid2);
97
+ // app.component('UtForm2', UtForm2);
98
98
  // app.component('UtModalGrid2', UtModalGrid2);
99
99
  // .component('UtIconSelect', UtIconSelect)
100
100
  // app.component('FormUpload2', FormUpload2);
@@ -109,7 +109,9 @@ export default {
109
109
  organizationName: '组织名称',
110
110
  organizationCode: '组织编码',
111
111
  appupper: '已上架',
112
- applower: '已下架'
112
+ applower: '已下架',
113
+ isApprovalPage: '审批页面',
114
+ showLink: '菜单可见'
113
115
  },
114
116
  btn: {
115
117
  passwordReset: '密码重置',
@@ -2,7 +2,7 @@
2
2
  * @Author: levi7754 levi7754@163.com
3
3
  * @Date: 2024-08-01 21:42:39
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-11-10 09:22:45
5
+ * @LastEditTime: 2025-11-13 18:18:46
6
6
  * @FilePath: \udp-front\packages\udp-core\src\router\utils.ts
7
7
  * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
8
  */
@@ -298,7 +298,7 @@ const addAsyncRoutes = (arrRoutes: Array<any>) => {
298
298
  }
299
299
  const { icon, permissionCode, extraIcon, frameSrc } = v;
300
300
  // 流程菜单保存
301
- v.isFlowMenu && processMenus.push(v);
301
+ v.isApprovalPage === 'Y' && processMenus.push(v);
302
302
 
303
303
  v.meta = {
304
304
  keepAlive: true,
@@ -1,85 +1,85 @@
1
- .vxe-button.size--mini.type--button {
2
- height: 25px;
3
- }
4
-
5
- .vxe-button.size--small.type--button {
6
- height: 25px;
7
- }
8
-
9
- .vxe-button.type--button.theme--u-cyan,
10
- .vxe-button.type--button.theme--u-cyan:hover {
11
- color: #fff;
12
- }
13
-
14
- .vxe-button.type--button.theme--u-cyan {
15
- background-color: #1cbbb4;
16
- }
17
-
18
- .vxe-button.type--button.theme--u-cyan:active {
19
- background-color: #39b54a;
20
- }
21
-
22
- // 禁用状态
23
- .vxe-button.type--button.theme--u-cyan.is--disabled {
24
- background-color: #69e4de;
25
- border-color: #69e4de;
26
- }
27
-
28
- .vxe-button.type--button.theme--u-color-shallow,
29
- .vxe-button.type--button.theme--u-color-shallow:hover {
30
- color: #fff;
31
- }
32
-
33
- .vxe-button.type--button.theme--u-color-shallow {
34
- background-color: #fbbd08;
35
- }
36
-
37
- .vxe-button.type--button.theme--u-color-shallow:active {
38
- background-color: #fff;
39
- }
40
-
41
- .layout-theme-default .vxe-button.type--button.theme--u-cyan:not(.is--disabled):hover {
42
- background-color: #40e0d0;
43
- border-color: #40e0d0;
44
- }
45
-
46
- .vxe-button.type--button:not(.is--disabled):hover {
47
- color: inherit;
48
-
49
- .vxe-button--icon,
50
- .vxe-button--item {
51
- color: inherit;
52
- }
53
- }
54
-
55
- .vxe-button[name='favorite'].type--button:not(.is--disabled):hover {
56
- .vxe-button--item {
57
- color: var(--udp-theme-vxeColor);
58
- }
59
- }
60
-
61
- .u-color-royalBlue {
62
- color: #4169e1;
63
- }
64
-
65
- .u-color-turquoise {
66
- color: #40e0d0;
67
- }
68
-
69
- .el-dropdown {
70
- .el-dropdown__caret-button {
71
- margin-left: 0;
72
- border-top-left-radius: 0;
73
- border-bottom-left-radius: 0;
74
- }
75
-
76
- .el-button-group + .el-button {
77
- border-top-right-radius: 0 !important;
78
- border-bottom-right-radius: 0 !important;
79
- }
80
-
81
- .el-button:first-child {
82
- border-top-right-radius: 0 !important;
83
- border-bottom-right-radius: 0 !important;
84
- }
85
- }
1
+ .vxe-button.size--mini.type--button {
2
+ height: 25px;
3
+ }
4
+
5
+ .vxe-button.size--small.type--button {
6
+ height: 25px;
7
+ }
8
+
9
+ .vxe-button.type--button.theme--u-cyan,
10
+ .vxe-button.type--button.theme--u-cyan:hover {
11
+ color: #fff !important;
12
+ }
13
+
14
+ .vxe-button.type--button.theme--u-cyan {
15
+ background-color: #1cbbb4;
16
+ }
17
+
18
+ .vxe-button.type--button.theme--u-cyan:active {
19
+ background-color: #39b54a;
20
+ }
21
+
22
+ // 禁用状态
23
+ .vxe-button.type--button.theme--u-cyan.is--disabled {
24
+ background-color: #69e4de;
25
+ border-color: #69e4de;
26
+ }
27
+
28
+ .vxe-button.type--button.theme--u-color-shallow,
29
+ .vxe-button.type--button.theme--u-color-shallow:hover {
30
+ color: #fff;
31
+ }
32
+
33
+ .vxe-button.type--button.theme--u-color-shallow {
34
+ background-color: #fbbd08;
35
+ }
36
+
37
+ .vxe-button.type--button.theme--u-color-shallow:active {
38
+ background-color: #fff;
39
+ }
40
+
41
+ .layout-theme-default .vxe-button.type--button.theme--u-cyan:not(.is--disabled):hover {
42
+ background-color: #40e0d0;
43
+ border-color: #40e0d0;
44
+ }
45
+
46
+ .vxe-button.type--button:not(.is--disabled):hover {
47
+ color: inherit;
48
+
49
+ .vxe-button--icon,
50
+ .vxe-button--item {
51
+ color: inherit;
52
+ }
53
+ }
54
+
55
+ .vxe-button[name='favorite'].type--button:not(.is--disabled):hover {
56
+ .vxe-button--item {
57
+ color: var(--udp-theme-vxeColor);
58
+ }
59
+ }
60
+
61
+ .u-color-royalBlue {
62
+ color: #4169e1;
63
+ }
64
+
65
+ .u-color-turquoise {
66
+ color: #40e0d0;
67
+ }
68
+
69
+ .el-dropdown {
70
+ .el-dropdown__caret-button {
71
+ margin-left: 0;
72
+ border-top-left-radius: 0;
73
+ border-bottom-left-radius: 0;
74
+ }
75
+
76
+ .el-button-group + .el-button {
77
+ border-top-right-radius: 0 !important;
78
+ border-bottom-right-radius: 0 !important;
79
+ }
80
+
81
+ .el-button:first-child {
82
+ border-top-right-radius: 0 !important;
83
+ border-bottom-right-radius: 0 !important;
84
+ }
85
+ }
@@ -1,183 +1,185 @@
1
- <template>
2
- <div class="page-content">
3
- <ut-grid
4
- ref="xgrid"
5
- :tree-config="{
6
- childrenField: 'children',
7
- lazy: true,
8
- hasChild: 'hasChildren',
9
- loadMethod: loadChildrenMethod,
10
- iconOpen: 'ri-checkbox-indeterminate-line ri-lg',
11
- iconClose: 'ri-add-box-line ri-lg'
12
- }"
13
- :columns="columns"
14
- :url="url"
15
- :stripe="false"
16
- mode="form"
17
- @toolbarButtonClick="handleToolClick"
18
- />
19
- <MenuInfo :show="data.showDrawer" :record="data.record" :data-status="data.dataStatus" @close="onClose" />
20
- <AuthorityPanel :show="data.showAuthority" :record="data.record" @close="onClose" />
21
- </div>
22
- </template>
23
-
24
- <script lang="tsx">
25
- export default { name: 'SystemMenu' };
26
- </script>
27
- <script setup lang="tsx">
28
- import { useI18n } from 'vue-i18n';
29
- import { ref, reactive } from 'vue';
30
- import MenuInfo from './menuInfo.vue';
31
- import AuthorityPanel from './AuthorityPanel.vue';
32
- import { clone } from 'xe-utils';
33
- import to from 'await-to-js';
34
- import { VxeUI } from 'vxe-pc-ui';
35
- import { useRender } from '@utogether/utils';
36
- import { getServiceApi } from '../../../api';
37
-
38
- const data = reactive<IRecord>({
39
- record: {},
40
- dataList: [],
41
- submitLoading: false,
42
- showDrawer: false,
43
- dataStatus: '',
44
- total: 0,
45
- listQuery: {
46
- pageSize: 10,
47
- pageNum: 1
48
- }
49
- });
50
-
51
- const { t } = useI18n();
52
-
53
- const renderHook = useRender();
54
-
55
- const serviceApi = getServiceApi();
56
-
57
- const xgrid = ref(null);
58
-
59
- const url = '/uums/menu';
60
-
61
- let row;
62
-
63
- // const buttons = [{ code: 'add', status: 'u-cyan', icon: 'plus', auth: 'add' }];
64
-
65
- const columns = [
66
- { type: 'checkbox', width: 50, align: 'center' },
67
- { field: 'menuName', width: 180, treeNode: true },
68
- { field: 'menuNameEn', width: 140 },
69
- { field: 'sort', width: 70 },
70
- { field: 'menuCode', width: 140 },
71
- { field: 'permissionCode', minWidth: 180 },
72
- {
73
- field: 'menuCategory',
74
- title: 'message.menuType',
75
- formatter: ['formatDict', 'SU.MENU.TYPE'],
76
- width: 100
77
- },
78
- { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleUpdate) },
79
- {
80
- field: 'operate',
81
- width: 140,
82
- fixed: 'right',
83
- slots: {
84
- default: ({ row }) => {
85
- const type = row.menuType;
86
- const addCmp = <ut-button status="u-cyan" icon="ri-add-fill" content="add" onTap={() => handleAdd(row)} />;
87
- const authCmp = <ut-button icon="ri-lock-fill" content="auth" onTap={() => handleAuthorityPanel(row)} />;
88
- return [
89
- <>
90
- {!type ? (
91
- <>
92
- <ut-button status="success" icon="ri-edit-box-line" content="edit" onTap={() => handleEdit(row)} />
93
- {['0', '5'].includes(row.menuCategory) ? addCmp : authCmp}
94
- </>
95
- ) : null}
96
- </>
97
- ];
98
- }
99
- }
100
- }
101
- ];
102
-
103
- // const resetListQuery = () => {
104
- // data.listQuery.pageSize = 99;
105
- // data.listQuery.pageNum = 1;
106
- // getDataList();
107
- // };
108
-
109
- // const getDataList = async () => {
110
- // const res = (await serviceApi('sys/listMenus', data.listQuery)) as IResponseData;
111
- // data.dataList = res.list;
112
- // data.total = res.total;
113
- // };
114
-
115
- const handleToolClick = ({ code }) => {
116
- code === 'add' && handleAdd();
117
- code === 'del' && handleDel();
118
- };
119
-
120
- // 异步加载子节点
121
- const loadChildrenMethod = async ({ row }: any) => {
122
- const data = (await serviceApi.get(url, { parentId: row.id })) as IResponseData;
123
- return new Promise(resolve => {
124
- resolve(data.list);
125
- });
126
- };
127
-
128
- // 新增子类型
129
- // menuType:保持原有不懂, 0:菜单 1,数据权限
130
- // 新增menuCategory: 0、根目录 1、菜单 2、内部链接3、外部链接
131
- const handleAdd = (record?: IRecord) => {
132
- data.showDrawer = true;
133
- data.dataStatus = 'add';
134
- data.record.dispalyCode = record?.permissionCode; // 前缀
135
- data.record.permissionCode = record?.permissionCode;
136
- // data.record.menuType = !record || !record.parentId ? '0' : '1';
137
- data.record.menuType = '0';
138
- data.record.menuCategory = !record ? '0' : '';
139
- data.record.parentId = record?.id;
140
- data.record.hasChildren = record?.hasChildren;
141
- data.record.children = data.record.children || [];
142
- console.log(data.record);
143
- row = record;
144
- };
145
-
146
- // 编辑
147
- const handleEdit = (record: IRecord) => {
148
- data.showDrawer = true;
149
- data.dataStatus = 'update';
150
- data.record = clone(record, true);
151
- data.record.menuType = data.record.menuType.toString();
152
- data.record.dispalyCode = record.permissionCode;
153
- };
154
-
155
- // 启用/禁用
156
- async function handleUpdate({ row }) {
157
- await serviceApi.put(url, [row]);
158
- xgrid.value.refreshData();
159
- }
160
- // 删除
161
- const handleDel = async () => {
162
- const type = await VxeUI.modal.confirm(t('message.delRecord'));
163
- const records = xgrid.value.getInstance().getCheckboxRecords();
164
- if (type === 'confirm') {
165
- const [err] = await to(serviceApi.delete(url, records));
166
- }
167
- };
168
-
169
- const handleAuthorityPanel = record => {
170
- data.showAuthority = true;
171
- data.dataStatus = 'update';
172
- data.record = clone(record, true);
173
- data.record.menuType = data.record.menuType.toString();
174
- data.record.dispalyCode = record.permissionCode;
175
- };
176
-
177
- const onClose = (type?, record?) => {
178
- type === 'submit' && (row || record) && xgrid.value.getInstance().reloadTreeExpand(row || record);
179
- data.record = {};
180
- data.showDrawer = false;
181
- data.showAuthority = false;
182
- };
183
- </script>
1
+ <template>
2
+ <div class="page-content">
3
+ <ut-grid
4
+ ref="xgrid"
5
+ :tree-config="{
6
+ childrenField: 'children',
7
+ lazy: true,
8
+ hasChild: 'hasChildren',
9
+ loadMethod: loadChildrenMethod,
10
+ iconOpen: 'ri-checkbox-indeterminate-line ri-lg',
11
+ iconClose: 'ri-add-box-line ri-lg'
12
+ }"
13
+ :columns="columns"
14
+ :url="url"
15
+ :stripe="false"
16
+ mode="form"
17
+ @toolbarButtonClick="handleToolClick"
18
+ />
19
+ <MenuInfo :show="data.showDrawer" :record="data.record" :data-status="data.dataStatus" @close="onClose" />
20
+ <AuthorityPanel :show="data.showAuthority" :record="data.record" @close="onClose" />
21
+ </div>
22
+ </template>
23
+
24
+ <script lang="tsx">
25
+ export default { name: 'SystemMenu' };
26
+ </script>
27
+ <script setup lang="tsx">
28
+ import { useI18n } from 'vue-i18n';
29
+ import { ref, reactive } from 'vue';
30
+ import MenuInfo from './menuInfo.vue';
31
+ import AuthorityPanel from './AuthorityPanel.vue';
32
+ import { clone } from 'xe-utils';
33
+ import to from 'await-to-js';
34
+ import { VxeUI } from 'vxe-pc-ui';
35
+ import { useRender } from '@utogether/utils';
36
+ import { getServiceApi } from '../../../api';
37
+
38
+ const data = reactive<IRecord>({
39
+ record: {},
40
+ dataList: [],
41
+ submitLoading: false,
42
+ showDrawer: false,
43
+ dataStatus: '',
44
+ total: 0,
45
+ listQuery: {
46
+ pageSize: 10,
47
+ pageNum: 1
48
+ }
49
+ });
50
+
51
+ const { t } = useI18n();
52
+
53
+ const renderHook = useRender();
54
+
55
+ const serviceApi = getServiceApi();
56
+
57
+ const xgrid = ref(null);
58
+
59
+ const url = '/uums/menu';
60
+
61
+ let row;
62
+
63
+ // const buttons = [{ code: 'add', status: 'u-cyan', icon: 'plus', auth: 'add' }];
64
+
65
+ const columns = [
66
+ { type: 'checkbox', width: 50, align: 'center' },
67
+ { field: 'menuName', width: 180, treeNode: true },
68
+ { field: 'menuNameEn', width: 140 },
69
+ { field: 'sort', width: 70 },
70
+ { field: 'menuCode', width: 140 },
71
+ { field: 'permissionCode', minWidth: 180 },
72
+ {
73
+ field: 'menuCategory',
74
+ title: 'message.menuType',
75
+ formatter: ['formatDict', 'SU.MENU.TYPE'],
76
+ width: 100
77
+ },
78
+ { field: 'enabled', width: 80, cellRender: renderHook.renderEnabled(handleUpdate) },
79
+ {
80
+ field: 'operate',
81
+ width: 140,
82
+ fixed: 'right',
83
+ slots: {
84
+ default: ({ row }) => {
85
+ const type = row.menuType;
86
+ const addCmp = <ut-button status="u-cyan" icon="ri-add-fill" content="add" onTap={() => handleAdd(row)} />;
87
+ const authCmp = <ut-button icon="ri-lock-fill" content="auth" onTap={() => handleAuthorityPanel(row)} />;
88
+ return [
89
+ <>
90
+ {!type ? (
91
+ <>
92
+ <ut-button status="success" icon="ri-edit-box-line" content="edit" onTap={() => handleEdit(row)} />
93
+ {['0', '5'].includes(row.menuCategory) ? addCmp : authCmp}
94
+ </>
95
+ ) : null}
96
+ </>
97
+ ];
98
+ }
99
+ }
100
+ }
101
+ ];
102
+
103
+ // const resetListQuery = () => {
104
+ // data.listQuery.pageSize = 99;
105
+ // data.listQuery.pageNum = 1;
106
+ // getDataList();
107
+ // };
108
+
109
+ // const getDataList = async () => {
110
+ // const res = (await serviceApi('sys/listMenus', data.listQuery)) as IResponseData;
111
+ // data.dataList = res.list;
112
+ // data.total = res.total;
113
+ // };
114
+
115
+ const handleToolClick = ({ code }) => {
116
+ code === 'add' && handleAdd();
117
+ code === 'del' && handleDel();
118
+ };
119
+
120
+ // 异步加载子节点
121
+ const loadChildrenMethod = async ({ row }: any) => {
122
+ const data = (await serviceApi.get(url, { parentId: row.id })) as IResponseData;
123
+ return new Promise(resolve => {
124
+ resolve(data.list);
125
+ });
126
+ };
127
+
128
+ // 新增子类型
129
+ // menuType:保持原有不懂, 0:菜单 1,数据权限
130
+ // 新增menuCategory: 0、根目录 1、菜单 2、内部链接3、外部链接
131
+ const handleAdd = (record?: IRecord) => {
132
+ data.showDrawer = true;
133
+ data.dataStatus = 'add';
134
+ data.record.dispalyCode = record?.permissionCode; // 前缀
135
+ data.record.permissionCode = record?.permissionCode;
136
+ // data.record.menuType = !record || !record.parentId ? '0' : '1';
137
+ data.record.menuType = '0';
138
+ data.record.showLink = 'Y';
139
+ data.record.isApprovalPage = 'N';
140
+ data.record.menuCategory = !record ? '0' : '';
141
+ data.record.parentId = record?.id;
142
+ data.record.hasChildren = record?.hasChildren;
143
+ data.record.children = data.record.children || [];
144
+ console.log(data.record);
145
+ row = record;
146
+ };
147
+
148
+ // 编辑
149
+ const handleEdit = (record: IRecord) => {
150
+ data.showDrawer = true;
151
+ data.dataStatus = 'update';
152
+ data.record = clone(record, true);
153
+ data.record.menuType = data.record.menuType.toString();
154
+ data.record.dispalyCode = record.permissionCode;
155
+ };
156
+
157
+ // 启用/禁用
158
+ async function handleUpdate({ row }) {
159
+ await serviceApi.put(url, [row]);
160
+ xgrid.value.refreshData();
161
+ }
162
+ // 删除
163
+ const handleDel = async () => {
164
+ const type = await VxeUI.modal.confirm(t('message.delRecord'));
165
+ const records = xgrid.value.getInstance().getCheckboxRecords();
166
+ if (type === 'confirm') {
167
+ const [err] = await to(serviceApi.delete(url, records));
168
+ }
169
+ };
170
+
171
+ const handleAuthorityPanel = record => {
172
+ data.showAuthority = true;
173
+ data.dataStatus = 'update';
174
+ data.record = clone(record, true);
175
+ data.record.menuType = data.record.menuType.toString();
176
+ data.record.dispalyCode = record.permissionCode;
177
+ };
178
+
179
+ const onClose = (type?, record?) => {
180
+ type === 'submit' && (row || record) && xgrid.value.getInstance().reloadTreeExpand(row || record);
181
+ data.record = {};
182
+ data.showDrawer = false;
183
+ data.showAuthority = false;
184
+ };
185
+ </script>