@utogether/udp-core 1.0.1-beta.2 → 1.0.1-beta.4

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 (98) hide show
  1. package/build/plugins.ts +6 -1
  2. package/dist/{403-BBQoJwTM.js → 403-CT4J-t-o.js} +1 -1
  3. package/dist/{404-BbJPSIWM.js → 404-BAudfnaK.js} +1 -1
  4. package/dist/{500-BtFL9R4M.js → 500-BlOGtpEE.js} +1 -1
  5. package/dist/{AuthorityInfo-DhiwCeLN.js → AuthorityInfo-Bl03tEhF.js} +1 -1
  6. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-Duyweh89.js → AuthorityInfo.vue_vue_type_style_index_0_lang-CUwS2F3R.js} +1 -1
  7. package/dist/{Company-CGqmslx-.js → Company-CIj9XgQn.js} +3 -3
  8. package/dist/{CompanyPanel-hlDsxD-6.js → CompanyPanel-CublK5NN.js} +16 -16
  9. package/dist/{Department-BZyJtacc.js → Department-BolPW-W3.js} +3 -3
  10. package/dist/{DepartmentPanel-D-a_EBFt.js → DepartmentPanel-BttxSHfM.js} +1 -1
  11. package/dist/{DesignPanel-Bl4luWDV.js → DesignPanel-BwCbn92O.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-I8C3iGvz.js → DesignPanel.vue_vue_type_style_index_0_lang-y2AnCTg6.js} +2 -2
  13. package/dist/{DictView-B4a7Hs1X.js → DictView-D85ziNV2.js} +13 -12
  14. package/dist/InvOrganization-CaAk_f7F.js +66 -0
  15. package/dist/{Org-BTGTrAVz.js → Org-CreIihFE.js} +1 -1
  16. package/dist/{Preview-pHD84xqI.js → Preview-DMGbhV6q.js} +1 -1
  17. package/dist/{ReportDefine-DnnCNQWS.js → ReportDefine-DogZwa8T.js} +1 -1
  18. package/dist/{ReportDesign-BnI_Q4pg.js → ReportDesign-CdSsJJeA.js} +2 -2
  19. package/dist/{ReportQuery-Dby2MmtM.js → ReportQuery-DPvKqeUm.js} +1 -1
  20. package/dist/{ReportQueryFrom-Blm1N8P1.js → ReportQueryFrom-UokkfBx_.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CnG_Ybnt.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-BlOoThY7.js} +1 -1
  22. package/dist/{ReportTemplate-D65RXRY_.js → ReportTemplate-DCnmllXW.js} +1 -1
  23. package/dist/{Role-eFZoTpXc.js → Role-sfmwLiNM.js} +3 -3
  24. package/dist/{RoleAssign-D9-Y3UNz.js → RoleAssign-WRk90VO2.js} +3 -3
  25. package/dist/{RolePanel-DlFw6HSf.js → RolePanel-DhP0_5ur.js} +1 -1
  26. package/dist/{RolePanel-CoUOc3sX.js → RolePanel-iWysS02n.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-DKHgNWQP.js → RolePanel.vue_vue_type_script_setup_true_lang-CYXqW-d4.js} +1 -1
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Clwk-MHw.js → RolePanel.vue_vue_type_script_setup_true_lang-_hVY31HC.js} +3 -3
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-M2FQJwPU.js → ScrollPanel.vue_vue_type_style_index_0_lang-BozDFES-.js} +1 -1
  30. package/dist/{Staff-DFBLCsAd.js → Staff-Bha-Ijax.js} +3 -3
  31. package/dist/{StaffInfo-d2CK0oBA.js → StaffInfo-CbfYI8UW.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-4m8wK9tq.js → StaffInfo.vue_vue_type_script_setup_true_lang-Ce-MUVYH.js} +1 -1
  33. package/dist/{StaffPanel-D6aWLKN3.js → StaffPanel-B8094e97.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-C7YT2CVb.js → StaffPanel.vue_vue_type_script_setup_true_lang-_kJIBCtx.js} +2 -2
  35. package/dist/{SysUser-BdZvYxQH.js → SysUser-D1J9vPnb.js} +2 -2
  36. package/dist/{SysUserPanel-BIVa6LLr.js → SysUserPanel-DGDPKKoY.js} +1 -1
  37. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-BsBKpYR7.js → SysUserPanel.vue_vue_type_script_setup_true_lang-D-5-zKn6.js} +1 -1
  38. package/dist/{SystemMenu-C-5VKlHK.js → SystemMenu-Dz8Pllh5.js} +9 -9
  39. package/dist/{UserInfo-DqXCRZts.js → UserInfo-ecAJA2Yg.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-N3TwfpPx.js → UserInfo.vue_vue_type_style_index_0_lang-4_-I_sQN.js} +1 -1
  41. package/dist/{childView-B2lSsqS3.js → childView-4uI_RT2m.js} +1 -1
  42. package/dist/{childView-DRUNqgjI.js → childView-OXXoMFg3.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-oGriyFTv.js → childView.vue_vue_type_style_index_0_lang-DC-yx4Kv.js} +1 -1
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-B9XBDDU_.js → childView.vue_vue_type_style_index_0_lang-e43PUsUO.js} +1 -1
  45. package/dist/{code-rule-DZC9T6cl.js → code-rule-B667R66s.js} +1 -1
  46. package/dist/core.es.js +14 -11
  47. package/dist/{cron-task-BJwPeA5F.js → cron-task-DcmGSr2D.js} +1 -1
  48. package/dist/{frameView-C6wkvok-.js → frameView-BzgaLYjQ.js} +1 -1
  49. package/dist/img/l_img.svg +1 -1
  50. package/dist/img/minicolors.png +0 -0
  51. package/dist/img/v_img.svg +1 -1
  52. package/dist/{index-DZc3qRTx.js → index-CLliRySq.js} +516 -560
  53. package/dist/{layoutView-CeJBpZb_.js → layoutView-BBQB8pDc.js} +109 -108
  54. package/dist/{login-BOxwzwdB.js → login-DIG7pRU7.js} +2 -2
  55. package/dist/{lov-view-DRF-99U4.js → lov-view-CSIPKZSY.js} +2 -2
  56. package/dist/{menuInfo-3Sjvs9nM.js → menuInfo-CPHjl7id.js} +1 -1
  57. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-DrQ560nm.js → menuInfo.vue_vue_type_style_index_0_lang-BXNiinTg.js} +31 -29
  58. package/dist/{pda-app-B9tn7jdv.js → pda-app-BLjbMcdt.js} +1 -1
  59. package/dist/{resource-BqnxbQNe.js → resource-MxqaSJqB.js} +1 -1
  60. package/dist/{su-welcome-VwifUK_O.js → su-welcome-C0flTYCx.js} +1 -1
  61. package/dist/{sys-config-C0-gSBFO.js → sys-config-CXzGs3Nl.js} +1 -1
  62. package/dist/udp-core.css +2 -2
  63. package/dist/{utogether-Di1byIum.js → utogether-CFdIDuAT.js} +1 -1
  64. package/index.ts +40 -36
  65. package/package.json +1 -1
  66. package/src/App.vue +70 -70
  67. package/src/components/udp/grid.vue +505 -0
  68. package/src/components/udp/index.ts +7 -4
  69. package/src/components/udp/lov.vue +410 -0
  70. package/src/components/udp/modal-form.vue +2 -2
  71. package/src/components/udp/modal-grid.vue +297 -0
  72. package/src/components/udp/utils.ts +379 -40
  73. package/src/directives/permission/index.ts +1 -1
  74. package/src/layout/components/lay-navbar/index.vue +1 -1
  75. package/src/layout/components/lay-panel/index.vue +150 -150
  76. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  77. package/src/layout/components/lay-tag/index.vue +625 -625
  78. package/src/layout/layoutView.vue +215 -215
  79. package/src/main.ts +7 -6
  80. package/src/plugins/i18n/en.ts +291 -289
  81. package/src/plugins/i18n/zh.ts +338 -337
  82. package/src/plugins/vxe-table/index.ts +1 -1
  83. package/src/plugins/vxe-table/render.tsx +4 -2
  84. package/src/router/index.ts +187 -183
  85. package/src/router/modules/remaining.ts +58 -83
  86. package/src/style/button.scss +85 -78
  87. package/src/style/tailwind.css +1 -68
  88. package/src/style/vxetable.scss +265 -256
  89. package/src/utils/authority/index.ts +1 -1
  90. package/src/views/organization/company/CompanyPanel.vue +259 -259
  91. package/src/views/organization/inv-org/InvOrganization.vue +2 -3
  92. package/src/views/system/menu/SystemMenu.vue +1 -1
  93. package/src/views/system/menu/menuInfo.vue +376 -373
  94. package/src/views/udev/dict/DictView.vue +106 -106
  95. package/src/views/udev/lov/lov-view.vue +91 -91
  96. package/types/global.d.ts +2 -1
  97. package/vite.config.ts +4 -1
  98. package/dist/InvOrganization-q4T3y8dQ.js +0 -260
@@ -1,373 +1,376 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-11-17 16:44:08
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-07-17 18:47:22
6
- * @Description: file content
7
- -->
8
-
9
- <template>
10
- <div class="ut-menu-wrapper">
11
- <el-drawer
12
- :model-value="show"
13
- :title="$t('message.title.memuInfo')"
14
- :before-close="handleClose"
15
- direction="rtl"
16
- destroy-on-close
17
- size="50%"
18
- >
19
- <vxe-form
20
- ref="xForm"
21
- :data="record"
22
- :rules="rules"
23
- :loading="loading"
24
- title-colon
25
- title-align="right"
26
- title-width="110"
27
- >
28
- <vxe-form-item
29
- v-if="record.menuType === '0'"
30
- :title="$t('message.menuType')"
31
- field="menuCategory"
32
- span="24"
33
- >
34
- <template #default="{ data }">
35
- <vxe-select v-model="data.menuCategory" :disabled="data.menuCategory === '0'">
36
- <!-- v-for="dict in dictData['SU.MENU.TYPE']?.children" -->
37
- <vxe-option
38
- v-for="dict in getLovList('SU.MENU.TYPE')"
39
- :key="dict.dictCode"
40
- :value="dict.dictCode"
41
- :label="dict.dictName"
42
- :disabled="dict.enabled"
43
- />
44
- </vxe-select>
45
- </template>
46
- </vxe-form-item>
47
- <vxe-form-item :title="$t('message.permissionCode')" field="dispalyCode" span="24">
48
- <template #default="{ data }">
49
- <vxe-input
50
- v-model="data.dispalyCode"
51
- clearable
52
- :class="{ 'u-menu-prefix': dataStatus === 'add' }"
53
- :disabled="dataStatus !== 'add'"
54
- >
55
- <template v-if="dataStatus === 'add'" #prefix>
56
- <span>{{ prefixCode }}</span>
57
- </template>
58
- </vxe-input>
59
- </template>
60
- </vxe-form-item>
61
- <vxe-form-item
62
- v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
63
- :title="$t('message.menuCode')"
64
- :item-render="{ name: '$input' }"
65
- field="menuCode"
66
- span="24"
67
- />
68
- <vxe-form-item
69
- :title="$t('message.menuName')"
70
- :item-render="{ name: '$input' }"
71
- field="menuName"
72
- span="24"
73
- />
74
- <vxe-form-item
75
- :title="$t('message.menuNameEn')"
76
- field="menuNameEn"
77
- span="24"
78
- :item-render="{ name: '$input' }"
79
- />
80
- <vxe-form-item
81
- v-if="!(record.menuType * 1)"
82
- :title="$t('message.menuPath')"
83
- :item-render="{ name: '$input' }"
84
- field="menuPath"
85
- span="24"
86
- />
87
- <vxe-form-item
88
- v-if="!(record.menuType * 1)"
89
- :title="$t('message.i18nField')"
90
- :item-render="{ name: '$input' }"
91
- field="i18nField"
92
- span="24"
93
- />
94
- <vxe-form-item
95
- v-if="record.menuCategory === '2'"
96
- :title="$t('message.frameSrc')"
97
- :item-render="{ name: '$input' }"
98
- field="frameSrc"
99
- span="24"
100
- />
101
- <vxe-form-item
102
- v-if="record.menuCategory === '3'"
103
- :title="$t('message.externalURI')"
104
- :item-render="{ name: '$input' }"
105
- field="menuCode"
106
- span="24"
107
- />
108
- <vxe-form-item
109
- v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
110
- :title="$t('message.extraIcon')"
111
- :item-render="{ name: '$input' }"
112
- field="extraIcon"
113
- span="24"
114
- />
115
- <vxe-form-item
116
- v-if="['0', '5'].includes(record.menuCategory)"
117
- :title="$t('message.redirect')"
118
- :item-render="{ name: '$input' }"
119
- field="redirect"
120
- span="24"
121
- />
122
- <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.sort')" span="24">
123
- <template #default="{ data }">
124
- <vxe-input v-model="data.sort" type="number" step="10" clearable />
125
- </template>
126
- </vxe-form-item>
127
- <vxe-form-item
128
- v-if="dataStatus === 'add' && ['2', '1'].includes(record.menuCategory)"
129
- :title="$t('message.btn.auth')"
130
- >
131
- <template #default>
132
- <vxe-checkbox-group v-model="authority">
133
- <vxe-checkbox label="add" :content="$t('message.btn.add')" />
134
- <vxe-checkbox label="del" :content="$t('message.btn.delete')" />
135
- <vxe-checkbox label="edit" :content="$t('message.btn.edit')" />
136
- <vxe-checkbox label="fetch" :content="$t('message.btn.fetch')" />
137
- <vxe-checkbox label="export" :content="$t('message.btn.export')" />
138
- </vxe-checkbox-group>
139
- </template>
140
- </vxe-form-item>
141
- <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.icon')" span="24">
142
- <template #default="{ data }">
143
- <ut-icon-select v-model="data.icon" />
144
- </template>
145
- </vxe-form-item>
146
- </vxe-form>
147
- <el-divider />
148
- <el-row type="flex" justify="end" style="padding-right: 22px">
149
- <ut-button content="cancel" status="warning" @tap="handleClose" />
150
- <ut-button content="confirm" status="primary" @tap="onSubmit" />
151
- </el-row>
152
- </el-drawer>
153
- </div>
154
- </template>
155
- <script setup lang="ts">
156
- import { useI18n } from 'vue-i18n';
157
- import { ref, watch } from 'vue';
158
- import { VxeFormPropTypes } from 'vxe-table';
159
- import to from 'await-to-js';
160
- import { templateRef } from '@vueuse/core';
161
- import { useSystemStoreHook } from '../../../store/modules/system';
162
- import { getServiceApi } from '../../../api';
163
-
164
- interface IProps {
165
- show: boolean;
166
- record: IRecord;
167
- dataStatus?: string;
168
- direction?: string;
169
- }
170
-
171
- const dictData = useSystemStoreHook().getDataDict;
172
-
173
- const props = withDefaults(defineProps<IProps>(), {
174
- show: false,
175
- record: (): IRecord => {
176
- return {};
177
- },
178
- dataStatus: 'detail',
179
- direction: 'rtl'
180
- });
181
-
182
- watch(
183
- () => props.show,
184
- () => {
185
- prefixCode.value = props.show && getPrefixCode();
186
- }
187
- );
188
-
189
- const serviceApi = getServiceApi();
190
-
191
- const { t } = useI18n();
192
- const rules: VxeFormPropTypes.Rules = {
193
- menuCode: [
194
- {
195
- required: true,
196
- message: `${t('message.required')}${t('message.menuCode')}`
197
- }
198
- ],
199
- menuName: [
200
- {
201
- required: true,
202
- message: `${t('message.required')}${t('message.menuName')}`
203
- }
204
- ],
205
- menuPath: [
206
- {
207
- required: true,
208
- message: `${t('message.required')}${t('message.menuPath')}`
209
- }
210
- ],
211
- frameSrc: [
212
- {
213
- required: true,
214
- message: `${t('message.required')}${t('message.externalURI')}`
215
- }
216
- ],
217
- i18nField: [
218
- {
219
- required: true,
220
- message: `${t('message.required')}${t('message.i18nField')}`
221
- }
222
- ],
223
- dispalyCode: [
224
- {
225
- required: true,
226
- message: `${t('message.required')}${t('message.permissionCode')}`
227
- }
228
- ],
229
- menuCategory: [
230
- {
231
- required: true,
232
- message: `${t('message.required')}${t('message.menuType')}`
233
- }
234
- ]
235
- };
236
-
237
- const xForm = templateRef<any>('xForm', null);
238
- const loading = ref(false);
239
- const prefixCode = ref('');
240
- const authority = ref(['fetch']);
241
-
242
- const url = '/uums/menu';
243
-
244
- const emit = defineEmits<{
245
- (e: 'close', type, data?): void;
246
- }>();
247
-
248
- const getPrefixCode = () => {
249
- const { record, dataStatus } = props;
250
- const { id, parentId, hasChildren } = record;
251
- if (dataStatus === 'update') return;
252
- if (!id && !parentId) return 'su';
253
- if (hasChildren || dataStatus === 'add') {
254
- record.dispalyCode = '';
255
- return record.permissionCode;
256
- }
257
- return record.permissionCode;
258
- };
259
-
260
- const onSubmit = () => {
261
- xForm.value.validate(async valid => {
262
- if (!valid) {
263
- loading.value = true;
264
- let resData;
265
- const { record, dataStatus } = props;
266
- if (dataStatus === 'add') {
267
- record.permissionCode = `${prefixCode.value}.${record.dispalyCode}`;
268
- const [err, data]: [Error, any] = await to(serviceApi.post(url, [record]));
269
- if (!err && !['0', '5'].includes(record.menuCategory) && authority.value.length) {
270
- const dataList = authority.value.map((auth, idx) => {
271
- return {
272
- permissionCode: record.permissionCode + '.' + auth,
273
- parentId: data[0].id,
274
- menuName: getAuthName(auth),
275
- menuType: 1,
276
- enabled: '1',
277
- sort: (idx + 1) * 10
278
- };
279
- });
280
- const [err, res] = await to(serviceApi.post(url, dataList));
281
- if (!err) {
282
- // props.record.children.push(...res);
283
- resData = res[0];
284
- }
285
- }
286
- loading.value = false;
287
- } else {
288
- await to(serviceApi.put(url, [record]));
289
- loading.value = false;
290
- }
291
- handleClose('submit', resData);
292
- }
293
- });
294
- };
295
- const getAuthName = code => {
296
- const auth = {
297
- fetch: t('message.btn.fetch'),
298
- add: t('message.btn.add'),
299
- edit: t('message.btn.edit'),
300
- del: t('message.btn.delete'),
301
- export: t('message.btn.export')
302
- };
303
- return auth[code];
304
- };
305
- const getLovList = code => {
306
- return dictData[code]?.children.map(m => {
307
- m.enabled = m.dictCode === '0' && props.record.menuCategory !== '0';
308
- return m;
309
- });
310
- };
311
- // 抽屉关闭
312
- function handleClose(type, data) {
313
- emit('close', type, data);
314
- }
315
- </script>
316
-
317
- <style lang="scss">
318
- .u-menu-prefix.vxe-input {
319
- height: 34px;
320
- }
321
-
322
- .u-menu-prefix.vxe-input .vxe-input--prefix {
323
- top: 1px;
324
- width: 150px;
325
- height: 24px;
326
- text-align: center;
327
- background-color: #f5f7fa;
328
- border-right: 1px solid #dcdfe6;
329
- }
330
-
331
- .u-menu-prefix.vxe-input .vxe-input--inner {
332
- padding-left: 160px;
333
- border: 1px solid #dcdfe6;
334
- }
335
-
336
- .ut-menu-wrapper {
337
- .el-drawer__header {
338
- margin-bottom: 16px;
339
- }
340
-
341
- .el-drawer__body {
342
- margin-bottom: 12px;
343
- overflow: auto;
344
- }
345
-
346
- .el-divider {
347
- margin: 15px 0;
348
- }
349
- }
350
-
351
- .menu-icon {
352
- display: flex;
353
- flex-wrap: wrap;
354
- width: 100%;
355
-
356
- li {
357
- display: flex;
358
- align-items: center;
359
- justify-content: center;
360
- width: 36px;
361
- height: 36px;
362
- margin: 0 2px;
363
- margin-top: 5px;
364
- cursor: pointer;
365
- border: 1px solid #ddd;
366
- }
367
-
368
- .active-icon {
369
- color: #fff;
370
- background-color: #59bfc1;
371
- }
372
- }
373
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-11-17 16:44:08
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-07-28 14:09:34
6
+ * @Description: file content
7
+ -->
8
+
9
+ <template>
10
+ <div class="ut-menu-wrapper">
11
+ <el-drawer
12
+ :model-value="show"
13
+ :title="$t('message.title.memuInfo')"
14
+ :before-close="handleClose"
15
+ direction="rtl"
16
+ destroy-on-close
17
+ size="50%"
18
+ >
19
+ <vxe-form
20
+ ref="xForm"
21
+ :data="record"
22
+ :rules="rules"
23
+ :loading="loading"
24
+ title-colon
25
+ title-align="right"
26
+ title-width="110"
27
+ transfer
28
+ >
29
+ <vxe-form-item
30
+ v-if="record.menuType === '0'"
31
+ :title="$t('message.menuType')"
32
+ field="menuCategory"
33
+ span="24"
34
+ >
35
+ <template #default="{ data }">
36
+ <vxe-select
37
+ v-model="data.menuCategory"
38
+ :disabled="data.menuCategory === '0'"
39
+ :transfer="false"
40
+ >
41
+ <vxe-option
42
+ v-for="dict in getLovList('SU.MENU.TYPE')"
43
+ :key="dict.dictCode"
44
+ :value="dict.dictCode"
45
+ :label="dict.dictName"
46
+ :disabled="dict.enabled"
47
+ />
48
+ </vxe-select>
49
+ </template>
50
+ </vxe-form-item>
51
+ <vxe-form-item :title="$t('message.permissionCode')" field="dispalyCode" span="24">
52
+ <template #default="{ data }">
53
+ <vxe-input
54
+ v-model="data.dispalyCode"
55
+ clearable
56
+ :class="{ 'u-menu-prefix': dataStatus === 'add' }"
57
+ :disabled="dataStatus !== 'add'"
58
+ >
59
+ <template v-if="dataStatus === 'add'" #prefix>
60
+ <span>{{ prefixCode }}</span>
61
+ </template>
62
+ </vxe-input>
63
+ </template>
64
+ </vxe-form-item>
65
+ <vxe-form-item
66
+ v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
67
+ :title="$t('message.menuCode')"
68
+ :item-render="{ name: '$input' }"
69
+ field="menuCode"
70
+ span="24"
71
+ />
72
+ <vxe-form-item
73
+ :title="$t('message.menuName')"
74
+ :item-render="{ name: '$input' }"
75
+ field="menuName"
76
+ span="24"
77
+ />
78
+ <vxe-form-item
79
+ :title="$t('message.menuNameEn')"
80
+ field="menuNameEn"
81
+ span="24"
82
+ :item-render="{ name: '$input' }"
83
+ />
84
+ <vxe-form-item
85
+ v-if="!(record.menuType * 1)"
86
+ :title="$t('message.menuPath')"
87
+ :item-render="{ name: '$input' }"
88
+ field="menuPath"
89
+ span="24"
90
+ />
91
+ <vxe-form-item
92
+ v-if="!(record.menuType * 1)"
93
+ :title="$t('message.i18nField')"
94
+ :item-render="{ name: '$input' }"
95
+ field="i18nField"
96
+ span="24"
97
+ />
98
+ <vxe-form-item
99
+ v-if="record.menuCategory === '2'"
100
+ :title="$t('message.frameSrc')"
101
+ :item-render="{ name: '$input' }"
102
+ field="frameSrc"
103
+ span="24"
104
+ />
105
+ <vxe-form-item
106
+ v-if="record.menuCategory === '3'"
107
+ :title="$t('message.externalURI')"
108
+ :item-render="{ name: '$input' }"
109
+ field="menuCode"
110
+ span="24"
111
+ />
112
+ <vxe-form-item
113
+ v-if="!(record.menuType * 1) && record.menuCategory !== '3'"
114
+ :title="$t('message.extraIcon')"
115
+ :item-render="{ name: '$input' }"
116
+ field="extraIcon"
117
+ span="24"
118
+ />
119
+ <vxe-form-item
120
+ v-if="['0', '5'].includes(record.menuCategory)"
121
+ :title="$t('message.redirect')"
122
+ :item-render="{ name: '$input' }"
123
+ field="redirect"
124
+ span="24"
125
+ />
126
+ <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.sort')" span="24">
127
+ <template #default="{ data }">
128
+ <vxe-input v-model="data.sort" type="number" step="10" clearable />
129
+ </template>
130
+ </vxe-form-item>
131
+ <vxe-form-item
132
+ v-if="dataStatus === 'add' && ['2', '1'].includes(record.menuCategory)"
133
+ :title="$t('message.btn.auth')"
134
+ >
135
+ <template #default>
136
+ <vxe-checkbox-group v-model="authority">
137
+ <vxe-checkbox label="add" :content="$t('message.btn.add')" />
138
+ <vxe-checkbox label="del" :content="$t('message.btn.delete')" />
139
+ <vxe-checkbox label="edit" :content="$t('message.btn.edit')" />
140
+ <vxe-checkbox label="fetch" :content="$t('message.btn.fetch')" />
141
+ <vxe-checkbox label="export" :content="$t('message.btn.export')" />
142
+ </vxe-checkbox-group>
143
+ </template>
144
+ </vxe-form-item>
145
+ <vxe-form-item v-if="!(record.menuType * 1)" :title="$t('message.icon')" span="24">
146
+ <template #default="{ data }">
147
+ <ut-icon-select v-model="data.icon" />
148
+ </template>
149
+ </vxe-form-item>
150
+ </vxe-form>
151
+ <el-divider />
152
+ <el-row type="flex" justify="end" style="padding-right: 22px">
153
+ <ut-button content="cancel" status="warning" @tap="handleClose" />
154
+ <ut-button content="confirm" status="primary" @tap="onSubmit" />
155
+ </el-row>
156
+ </el-drawer>
157
+ </div>
158
+ </template>
159
+ <script setup lang="ts">
160
+ import { useI18n } from 'vue-i18n';
161
+ import { ref, watch } from 'vue';
162
+ import to from 'await-to-js';
163
+ import { templateRef } from '@vueuse/core';
164
+ import { useSystemStoreHook } from '../../../store/modules/system';
165
+ import { getServiceApi } from '../../../api';
166
+
167
+ interface IProps {
168
+ show: boolean;
169
+ record: IRecord;
170
+ dataStatus?: string;
171
+ direction?: string;
172
+ }
173
+
174
+ const dictData = useSystemStoreHook().getDataDict;
175
+
176
+ const props = withDefaults(defineProps<IProps>(), {
177
+ show: false,
178
+ record: (): IRecord => {
179
+ return {};
180
+ },
181
+ dataStatus: 'detail',
182
+ direction: 'rtl'
183
+ });
184
+
185
+ watch(
186
+ () => props.show,
187
+ () => {
188
+ prefixCode.value = props.show && getPrefixCode();
189
+ }
190
+ );
191
+
192
+ const serviceApi = getServiceApi();
193
+
194
+ const { t } = useI18n();
195
+ const rules = {
196
+ menuCode: [
197
+ {
198
+ required: true,
199
+ message: `${t('message.required')}${t('message.menuCode')}`
200
+ }
201
+ ],
202
+ menuName: [
203
+ {
204
+ required: true,
205
+ message: `${t('message.required')}${t('message.menuName')}`
206
+ }
207
+ ],
208
+ menuPath: [
209
+ {
210
+ required: true,
211
+ message: `${t('message.required')}${t('message.menuPath')}`
212
+ }
213
+ ],
214
+ frameSrc: [
215
+ {
216
+ required: true,
217
+ message: `${t('message.required')}${t('message.externalURI')}`
218
+ }
219
+ ],
220
+ i18nField: [
221
+ {
222
+ required: true,
223
+ message: `${t('message.required')}${t('message.i18nField')}`
224
+ }
225
+ ],
226
+ dispalyCode: [
227
+ {
228
+ required: true,
229
+ message: `${t('message.required')}${t('message.permissionCode')}`
230
+ }
231
+ ],
232
+ menuCategory: [
233
+ {
234
+ required: true,
235
+ message: `${t('message.required')}${t('message.menuType')}`
236
+ }
237
+ ]
238
+ };
239
+
240
+ const xForm = templateRef<any>('xForm', null);
241
+ const loading = ref(false);
242
+ const prefixCode = ref('');
243
+ const authority = ref(['fetch']);
244
+
245
+ const url = '/uums/menu';
246
+
247
+ const emit = defineEmits<{
248
+ (e: 'close', type, data?): void;
249
+ }>();
250
+
251
+ const getPrefixCode = () => {
252
+ const { record, dataStatus } = props;
253
+ const { id, parentId, hasChildren } = record;
254
+ if (dataStatus === 'update') return;
255
+ if (!id && !parentId) return 'su';
256
+ if (hasChildren || dataStatus === 'add') {
257
+ record.dispalyCode = '';
258
+ return record.permissionCode;
259
+ }
260
+ return record.permissionCode;
261
+ };
262
+
263
+ const onSubmit = () => {
264
+ xForm.value.validate(async valid => {
265
+ if (!valid) {
266
+ loading.value = true;
267
+ let resData;
268
+ const { record, dataStatus } = props;
269
+ if (dataStatus === 'add') {
270
+ record.permissionCode = `${prefixCode.value}.${record.dispalyCode}`;
271
+ const [err, data]: [Error, any] = await to(serviceApi.post(url, [record]));
272
+ if (!err && !['0', '5'].includes(record.menuCategory) && authority.value.length) {
273
+ const dataList = authority.value.map((auth, idx) => {
274
+ return {
275
+ permissionCode: record.permissionCode + '.' + auth,
276
+ parentId: data[0].id,
277
+ menuName: getAuthName(auth),
278
+ menuType: 1,
279
+ enabled: '1',
280
+ sort: (idx + 1) * 10
281
+ };
282
+ });
283
+ const [err, res] = await to(serviceApi.post(url, dataList));
284
+ if (!err) {
285
+ // props.record.children.push(...res);
286
+ resData = res[0];
287
+ }
288
+ }
289
+ loading.value = false;
290
+ } else {
291
+ record.permissionCode = record.dispalyCode;
292
+ await to(serviceApi.put(url, [record]));
293
+ loading.value = false;
294
+ }
295
+ handleClose('submit', resData);
296
+ }
297
+ });
298
+ };
299
+ const getAuthName = code => {
300
+ const auth = {
301
+ fetch: t('message.btn.fetch'),
302
+ add: t('message.btn.add'),
303
+ edit: t('message.btn.edit'),
304
+ del: t('message.btn.delete'),
305
+ export: t('message.btn.export')
306
+ };
307
+ return auth[code];
308
+ };
309
+ const getLovList = code => {
310
+ return dictData[code]?.children.map(m => {
311
+ m.enabled = m.dictCode === '0' && props.record.menuCategory !== '0';
312
+ return m;
313
+ });
314
+ };
315
+ // 抽屉关闭
316
+ function handleClose(type, data) {
317
+ emit('close', type, data);
318
+ }
319
+ </script>
320
+
321
+ <style lang="scss">
322
+ .u-menu-prefix.vxe-input {
323
+ height: 34px;
324
+ }
325
+
326
+ .u-menu-prefix.vxe-input .vxe-input--prefix {
327
+ top: 1px;
328
+ width: 150px;
329
+ height: 24px;
330
+ text-align: center;
331
+ background-color: #f5f7fa;
332
+ border-right: 1px solid #dcdfe6;
333
+ }
334
+
335
+ .u-menu-prefix.vxe-input .vxe-input--inner {
336
+ border: 1px solid #dcdfe6;
337
+ }
338
+
339
+ .ut-menu-wrapper {
340
+ .el-drawer__header {
341
+ margin-bottom: 16px;
342
+ }
343
+
344
+ .el-drawer__body {
345
+ margin-bottom: 12px;
346
+ overflow: auto;
347
+ }
348
+
349
+ .el-divider {
350
+ margin: 15px 0;
351
+ }
352
+ }
353
+
354
+ .menu-icon {
355
+ display: flex;
356
+ flex-wrap: wrap;
357
+ width: 100%;
358
+
359
+ li {
360
+ display: flex;
361
+ align-items: center;
362
+ justify-content: center;
363
+ width: 36px;
364
+ height: 36px;
365
+ margin: 0 2px;
366
+ margin-top: 5px;
367
+ cursor: pointer;
368
+ border: 1px solid #ddd;
369
+ }
370
+
371
+ .active-icon {
372
+ color: #fff;
373
+ background-color: #59bfc1;
374
+ }
375
+ }
376
+ </style>