@utogether/udp-core 2.0.0-beta.1 → 2.0.0-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 (182) hide show
  1. package/dist/{403-CTJDBjz7.js → 403-CxOqlq0f.js} +3 -3
  2. package/dist/403-WCboRvzZ-ZAPgYStl.js +65 -0
  3. package/dist/404-2V0Qi-d7-DkNwQggp.js +65 -0
  4. package/dist/{404-BFYkWIkQ.js → 404-xdB6lFeQ.js} +1 -1
  5. package/dist/500-BYfzvixf-CGpEieyQ.js +67 -0
  6. package/dist/{500-DGG3qadg.js → 500-C94bRK2S.js} +2 -2
  7. package/dist/AuthorityInfo-DBovfUjB-DpQwT9Q5.js +4 -0
  8. package/dist/{AuthorityInfo-ozZIo1Te.js → AuthorityInfo-Dy3b_nFN.js} +1 -1
  9. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-DujerENw.js → AuthorityInfo.vue_vue_type_style_index_0_lang-Bh7IbcdY.js} +2 -2
  10. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-D-l_Az3s-Cw7WmFxz.js +100 -0
  11. package/dist/AuthorityPanel-CRlAwbaI-G7pZXKdE.js +4 -0
  12. package/dist/AuthorityPanel.vue_vue_type_style_index_0_lang-DxhZjp1S-CJvk3pW8.js +114 -0
  13. package/dist/Company-B4vsXy2I-CkNCOqjJ.js +25 -0
  14. package/dist/{Company-6VJtwh23.js → Company-gKkfnhLt.js} +3 -3
  15. package/dist/{CompanyPanel-B2P488mq.js → CompanyPanel-BF5Pc35s.js} +7 -7
  16. package/dist/CompanyPanel-Czcx8Gyw-CvndXwB_.js +206 -0
  17. package/dist/DataSet-DT-rGICv-DaUfgbxk.js +147 -0
  18. package/dist/{Department-BnwoLEOC.js → Department-D0I3QVZe.js} +3 -3
  19. package/dist/Department-D0dVUrGC-C6HJcYI1.js +25 -0
  20. package/dist/{DepartmentPanel-CRrrmxtv.js → DepartmentPanel-2LHODgc7.js} +22 -22
  21. package/dist/DepartmentPanel-e91Lxr1j-BS_A-ILd.js +254 -0
  22. package/dist/{DesignPanel-CvbccgX2.js → DesignPanel-CtF3cAAQ.js} +1 -1
  23. package/dist/DesignPanel-DdFl_ohi-uCwFxcl1.js +4 -0
  24. package/dist/DesignPanel.vue_vue_type_style_index_0_lang-BACPrfUI-cC7yL0uY.js +1013 -0
  25. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-Dz2tUszs.js → DesignPanel.vue_vue_type_style_index_0_lang-BCYgwoVt.js} +3 -3
  26. package/dist/DictView-BzQLOf_P-DDicwdmM.js +111 -0
  27. package/dist/{DictView-Ce1LoVHh.js → DictView-H3V5hxg3.js} +1 -1
  28. package/dist/{InvOrganization-BwCFZO1X.js → InvOrganization-BiGLnbqe.js} +2 -2
  29. package/dist/InvOrganization-atbhw0CI-BABbVt9V.js +74 -0
  30. package/dist/Org-BW1YHG-Q-Cow7JWlD.js +39 -0
  31. package/dist/{Org-0hzs6b0R.js → Org-DQTCQHNY.js} +2 -2
  32. package/dist/Preview-DJtVsoq1-CCGidQjJ.js +48 -0
  33. package/dist/{Preview--DnEAhwh.js → Preview-DXaiis29.js} +1 -1
  34. package/dist/{ReportDefine-Cu983bTN.js → ReportDefine-BLh4CiER.js} +1 -1
  35. package/dist/ReportDefine-CNx_ob99-6NQAHK-Q.js +10 -0
  36. package/dist/ReportDesign-FbQ6yTJS-C1pPAUSp.js +165 -0
  37. package/dist/{ReportDesign-QsWXXgvo.js → ReportDesign-Ni1YxrLC.js} +7 -7
  38. package/dist/ReportQuery-C5gz8Lgd-Eu2cQmda.js +75 -0
  39. package/dist/{ReportQuery-BjKIIhPu.js → ReportQuery-C8G88_qF.js} +1 -1
  40. package/dist/ReportQueryFrom-C7scua5v-uHXWq8Gy.js +4 -0
  41. package/dist/{ReportQueryFrom-DIjBO6Fx.js → ReportQueryFrom-CuZKPtB4.js} +1 -1
  42. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-0T62cUMK.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-BAn_siFW.js} +7 -7
  43. package/dist/ReportQueryFrom.vue_vue_type_style_index_0_lang-DCbz67Wa-vK6r2uCl.js +178 -0
  44. package/dist/ReportTemplate-BDANdIWv-D_IGjR1w.js +161 -0
  45. package/dist/{ReportTemplate-2uk9tJcy.js → ReportTemplate-DFnDXWmx.js} +8 -8
  46. package/dist/{Role-_QP8QEaI.js → Role-BQ7hsfPn.js} +3 -3
  47. package/dist/Role-ByB0WbxW-5E8Mb148.js +25 -0
  48. package/dist/RoleAssign-DW6iC_0v-Bis61auk.js +26 -0
  49. package/dist/{RoleAssign-C2gkcmEQ.js → RoleAssign-UPCg2d4G.js} +3 -3
  50. package/dist/RolePanel-BM2MaQPU-CgcsbfaX.js +4 -0
  51. package/dist/{RolePanel-vnl_lXNY.js → RolePanel-C-mQ5XRq.js} +1 -1
  52. package/dist/RolePanel-ClQy8DBL-DARL4O-o.js +4 -0
  53. package/dist/{RolePanel-B8FPNGaA.js → RolePanel-CoSXOCZN.js} +1 -1
  54. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-Bc_Ao_PU-DMmxr2iI.js +132 -0
  55. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-bxHXrBYl.js → RolePanel.vue_vue_type_script_setup_true_lang-Bg-t2UhF.js} +7 -7
  56. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-BuQbYEEI.js → RolePanel.vue_vue_type_script_setup_true_lang-D-o7HYZ8.js} +8 -8
  57. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-fthF1zkp-JsbQJoDy.js +154 -0
  58. package/dist/ScrollPanel.vue_vue_type_style_index_0_lang-ByWIwajm-BsBf2Vs3.js +100 -0
  59. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-C6yZXBqB.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCsoxDfk.js} +1 -1
  60. package/dist/Staff-CuxzvhD9-D0KTcyRh.js +25 -0
  61. package/dist/{Staff-CHWrMIEb.js → Staff-D-CmvG1R.js} +3 -3
  62. package/dist/StaffInfo-CY7gUICu-EZUhUwIp.js +4 -0
  63. package/dist/{StaffInfo-Cpq2eayz.js → StaffInfo-Idhvuc6e.js} +1 -1
  64. package/dist/StaffInfo.vue_vue_type_script_setup_true_lang-Dd8gtQz8-Dlkt-eCn.js +108 -0
  65. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-BVCjF2i1.js → StaffInfo.vue_vue_type_script_setup_true_lang-MUGKjnHU.js} +1 -1
  66. package/dist/{StaffPanel-D2BMXt5p.js → StaffPanel-CDDmAYE5.js} +1 -1
  67. package/dist/StaffPanel-CwqG0_xr-CrvzLJoc.js +4 -0
  68. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-B6jAGo-g.js → StaffPanel.vue_vue_type_script_setup_true_lang-Bdilqbee.js} +42 -42
  69. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-DCdBy8Hu-BXrueqi0.js +143 -0
  70. package/dist/SysUser-9Q2UJWhi-DprWXFlR.js +15 -0
  71. package/dist/{SysUser-om6H1BeC.js → SysUser-a-j5bppr.js} +2 -2
  72. package/dist/{SysUserPanel-CH0HPP7h.js → SysUserPanel-6V232wwB.js} +1 -1
  73. package/dist/SysUserPanel-bJy69O7x-BJtBgFEs.js +4 -0
  74. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-Dpl13ee0.js → SysUserPanel.vue_vue_type_script_setup_true_lang-BOtHuMVy.js} +2 -2
  75. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-DUPFqgz3-BSqRCMen.js +356 -0
  76. package/dist/{SystemMenu-BkG_DKxA.js → SystemMenu-BnVeOSOQ.js} +7 -7
  77. package/dist/SystemMenu-DGOAolc1-CJSLHP8i.js +156 -0
  78. package/dist/UserInfo-CKoOHkAM-DDWp0I_U.js +4 -0
  79. package/dist/{UserInfo-D9croxUe.js → UserInfo-Cax9b2nw.js} +1 -1
  80. package/dist/UserInfo.vue_vue_type_style_index_0_lang-BaT53SSu-DsNaAomO.js +160 -0
  81. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-DLIP8xpN.js → UserInfo.vue_vue_type_style_index_0_lang-D-cw11i9.js} +2 -2
  82. package/dist/await-to-js.es5-Bv3Eu4mi-UCggJjes.js +10 -0
  83. package/dist/await-to-js.es5-Bv3Eu4mi.js +10 -0
  84. package/dist/childView-0YZQ6GBn-CEqg7k5d.js +4 -0
  85. package/dist/{childView-BY_Ip-l1.js → childView-DKG3eZo8.js} +1 -1
  86. package/dist/childView-DKkgi3yo-D47ft-vi.js +4 -0
  87. package/dist/{childView-CHp_TueS.js → childView-siumuBz0.js} +1 -1
  88. package/dist/childView.vue_vue_type_style_index_0_lang-ABMrGInv-ClOdE_sa.js +143 -0
  89. package/dist/{childView.vue_vue_type_style_index_0_lang-BNHbDRjt.js → childView.vue_vue_type_style_index_0_lang-CUfXDS1q.js} +8 -8
  90. package/dist/{childView.vue_vue_type_style_index_0_lang-CbjGf7Z7.js → childView.vue_vue_type_style_index_0_lang-CW3EbAmW.js} +8 -8
  91. package/dist/childView.vue_vue_type_style_index_0_lang-CaW106ve-CClTM8PK.js +180 -0
  92. package/dist/{code-rule-Ce6yWqCq.js → code-rule-Dtoree6F.js} +2 -2
  93. package/dist/code-rule-wQyfgpNL-C4evD4Co.js +148 -0
  94. package/dist/core.es.js +10 -10
  95. package/dist/cron-task-C-kryDtd-C0NuGZCe.js +135 -0
  96. package/dist/{cron-task-DziaH0rI.js → cron-task-GSRgA7S5.js} +2 -2
  97. package/dist/flow-task-B07st2aD-CgQvagSQ.js +10 -0
  98. package/dist/frameView-BOGA3ezf-QoSxzmSQ.js +44 -0
  99. package/dist/{frameView-DNeCVQaY.js → frameView-Cy6wxW0K.js} +1 -1
  100. package/dist/{index-BabfUVv_.js → index-Dc7xWMiC.js} +1057 -1033
  101. package/dist/layout-home-3Dy4onl4.js +228 -0
  102. package/dist/layout-home-CYHksXN_-Basy-3IH.js +228 -0
  103. package/dist/layoutView-BaRvAbIa-xVgfqspc.js +3302 -0
  104. package/dist/{layoutView-12Mlp9A2.js → layoutView-DMjNscJ-.js} +8 -8
  105. package/dist/log-in-Cx1dGik8-BVeEHeZ8.js +117 -0
  106. package/dist/{log-in-1NGaA5OM.js → log-in-VAG6Cvcx.js} +8 -8
  107. package/dist/log-out-COYdxrNC-ftopGZdE.js +130 -0
  108. package/dist/{log-out-B8_atGcQ.js → log-out-DZGaMCjC.js} +4 -4
  109. package/dist/{login-5dydO6GR.js → login-CqVMdNHs.js} +16 -16
  110. package/dist/login-Dg9ofNS8-Bocp1XMA.js +241 -0
  111. package/dist/login-log-DJBGJVV0-AoOyj0jD.js +70 -0
  112. package/dist/lov-view-C0T5prk8-B2DBmn55.js +97 -0
  113. package/dist/{lov-view-DPvGUu3h.js → lov-view-Cc68_28B.js} +7 -7
  114. package/dist/{menuInfo-DVADYfEK.js → menuInfo-BIrIaJlH.js} +1 -1
  115. package/dist/menuInfo-BZJ_q7bz-Drho-_QC.js +4 -0
  116. package/dist/menuInfo.vue_vue_type_style_index_0_lang-BA8xjUo3-BCZ1wipf.js +363 -0
  117. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-DgsifDrm.js → menuInfo.vue_vue_type_style_index_0_lang-DlE4w35X.js} +2 -2
  118. package/dist/{pda-app-BZXs-2BQ.js → pda-app-DnjphrRS.js} +9 -9
  119. package/dist/pda-app-m9hsppHo-B4xyja1o.js +710 -0
  120. package/dist/redirect-BqegffKC-CBCIuqmz.js +15 -0
  121. package/dist/resource-C6KEIXu--B_ddyecm.js +97 -0
  122. package/dist/{resource-BZA9NFKc.js → resource-DISgPDM7.js} +4 -4
  123. package/dist/su-welcome-BjbuSrBZ.js +49424 -0
  124. package/dist/su-welcome-CYYy-dzr-D3RKPoB0.js +42089 -0
  125. package/dist/sys-config-DCjJGtht-DARDjlrt.js +370 -0
  126. package/dist/{sys-config-DQmNjWH4.js → sys-config-Yc9vh1t1.js} +13 -13
  127. package/dist/udp-core.css +1 -1
  128. package/dist/utogether-MlnyYtNS-CGgjFNPS.js +4 -0
  129. package/package.json +5 -2
  130. package/src/App.vue +71 -71
  131. package/src/components/udp/content/index.vue +88 -88
  132. package/src/components/udp/form-upload/form-upload.vue +492 -492
  133. package/src/components/udp/grid/index.vue +524 -524
  134. package/src/components/udp/index.ts +6 -6
  135. package/src/components/udp/ut-stamp-badge/index.vue +271 -271
  136. package/src/components/udp/utils.ts +408 -408
  137. package/src/layout/components/lay-content/index.vue +136 -136
  138. package/src/layout/components/lay-search/components/SearchModal.vue +181 -189
  139. package/src/layout/components/lay-setting/index.vue +503 -503
  140. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -101
  141. package/src/layout/components/lay-tag/index.vue +598 -598
  142. package/src/layout/hooks/useNav.ts +176 -176
  143. package/src/layout/hooks/useTag.ts +227 -227
  144. package/src/layout/layoutView.vue +216 -216
  145. package/src/layout/types.ts +93 -93
  146. package/src/main.ts +111 -112
  147. package/src/plugins/i18n/zh.ts +1 -0
  148. package/src/plugins/vxe-table/index.ts +116 -116
  149. package/src/plugins/vxe-table/render.tsx +968 -968
  150. package/src/router/index.ts +187 -187
  151. package/src/router/modules/home.ts +32 -32
  152. package/src/router/utils.ts +420 -420
  153. package/src/store/modules/epTheme.ts +48 -48
  154. package/src/style/vxetable.scss +364 -356
  155. package/src/utils/dataFormat/index.ts +222 -222
  156. package/src/utils/lifecycle.ts +39 -39
  157. package/src/views/organization/department/DepartmentPanel.vue +303 -303
  158. package/src/views/organization/staff/StaffInfo.vue +127 -127
  159. package/src/views/organization/staff/StaffPanel.vue +3 -3
  160. package/src/views/system/layout/layout-home.vue +45 -7
  161. package/src/views/system/menu/AuthorityPanel.vue +141 -141
  162. package/src/views/system/menu/SystemMenu.vue +194 -194
  163. package/src/views/system/menu/menuInfo.vue +1 -1
  164. package/src/views/system/sysUser/SysUserPanel.vue +363 -363
  165. package/src/views/udev/coderule/code-rule.vue +132 -132
  166. package/src/views/udev/dict/DictView.vue +118 -118
  167. package/src/views/udev/dict/childView.vue +184 -184
  168. package/src/views/udev/lov/childView.vue +174 -174
  169. package/src/views/uhome/components/common-menu.vue +118 -0
  170. package/src/views/uhome/components/dynamic-component.vue +66 -0
  171. package/src/views/uhome/components/home-todo.vue +170 -0
  172. package/src/views/uhome/components/menu-favorite.vue +315 -315
  173. package/src/views/uhome/dynamic-card.vue +18 -19
  174. package/src/views/uhome/su-welcome.vue +46 -116
  175. package/src/views/ulogin/login.vue +336 -336
  176. package/src/views/upms/interface/log-in.vue +100 -100
  177. package/src/views/upms/interface/log-out.vue +104 -104
  178. package/src/views/upms/user/login-log.vue +54 -54
  179. package/types/global.d.ts +232 -232
  180. package/dist/await-to-js.es5-BtRbN2QH.js +0 -10
  181. package/dist/layout-home-Cis1KlEr.js +0 -195
  182. package/dist/su-welcome-BXe6Cdp3.js +0 -580
@@ -1,315 +1,315 @@
1
- <template>
2
- <vxe-modal
3
- v-model="showModal"
4
- :loading="loading"
5
- width="75%"
6
- height="80%"
7
- title="常用菜单设置(拖动可改变菜单顺序)"
8
- class-name="u-favorite-modal"
9
- show-footer
10
- @close="onClose"
11
- >
12
- <template #default>
13
- <div class="">
14
- <el-scrollbar heigth="100" class="w-full border-b border-slate-300">
15
- <template #default>
16
- <div class="w-full h-24">
17
- <el-empty v-if="!favoriteMenus.length" :image-size="50" description="" class="p-0" />
18
- <draggable
19
- :list="favoriteMenus"
20
- handle=".drag-item"
21
- animation="300"
22
- item-key="id"
23
- class="flex"
24
- @end="onMoveEnd"
25
- >
26
- <template #item="{ element, index }">
27
- <div class="">
28
- <div
29
- class="h-24 w-24 flex justify-center items-center flex-col relative drag-item ut-menu-top-item"
30
- >
31
- <div
32
- class="rounded-full w-10 h-10 flex items-center justify-center"
33
- :style="{ backgroundColor: getColor(index) }"
34
- >
35
- <iconify-icon-offline
36
- :icon="element.icon || `ri:${icons[index]}-line`"
37
- class="text-2xl text-white"
38
- />
39
- </div>
40
- <span class="w-[90%] text-xs mt-2 text-ellipsis overflow-hidden whitespace-nowrap text-center">
41
- {{ element.menuName }}
42
- </span>
43
- <i
44
- class="ri-indeterminate-circle-line right-3 top-2 text-base hidden ut-menu-del"
45
- @click="onRemoveFavorite(element, index)"
46
- />
47
- </div>
48
- </div>
49
- </template>
50
- </draggable>
51
- </div>
52
- </template>
53
- </el-scrollbar>
54
- <el-scrollbar class="u-favorite-menu--contain">
55
- <template #default>
56
- <div class="p-3 pb-14" style="padding-bottom: 54px">
57
- <div v-for="menu in menuList" :key="menu.id" class="grandparent-node">
58
- <div class="flex items-center">
59
- <div class="w-2 h-4 bg-green-400" />
60
- <div class="ml-1 font-bold text-base">{{ menu.menuName }}</div>
61
- </div>
62
- <div class="pl-3 py-2">
63
- <vxe-checkbox-group v-model="checkboxModel[menu.id]" @change="onChange(menu, $event)">
64
- <vxe-checkbox
65
- v-for="item in handleMenuCategoryGroup(menu).menus"
66
- :key="item.id"
67
- :label="item.id"
68
- :content="item.menuName"
69
- />
70
- </vxe-checkbox-group>
71
- </div>
72
- <div v-for="item in handleMenuCategoryGroup(menu).folder" :key="item.id" class="parent-node pl-3">
73
- <div class="flex items-center">
74
- <div class="w-2 h-4 bg-blue-400" />
75
- <div class="ml-1 font-bold text-sm">{{ item.menuName }}</div>
76
- </div>
77
-
78
- <div class="pl-3 py-2">
79
- <vxe-checkbox-group v-model="checkboxModel[item.id]" @change="onChange(item, $event)">
80
- <vxe-checkbox
81
- v-for="child in handleMenuCategoryGroup(item).menus"
82
- :key="child.id"
83
- :label="child.id"
84
- :content="child.menuName"
85
- />
86
- </vxe-checkbox-group>
87
- </div>
88
- <div v-for="child in handleMenuCategoryGroup(item).folder" :key="child.id" class="child-node pl-3">
89
- <div class="flex items-center">
90
- <div class="w-2 h-4 bg-red-400" />
91
- <div class="ml-1 font-bold text-sm">{{ child.menuName }}</div>
92
- </div>
93
-
94
- <div class="py-2">
95
- <vxe-checkbox-group v-model="checkboxModel[child.id]" @change="onChange(item, $event)">
96
- <vxe-checkbox
97
- v-for="subChild in handleMenuCategoryGroup(child).menus"
98
- :key="subChild.id"
99
- :label="subChild.id"
100
- :content="subChild.menuName"
101
- />
102
- </vxe-checkbox-group>
103
- </div>
104
- </div>
105
- </div>
106
- </div>
107
- </div>
108
- </template>
109
- </el-scrollbar>
110
- </div>
111
- </template>
112
- <template #footer>
113
- <div class="flex justify-end">
114
- <ut-button content="cancel" status="warning" @tap="onClose" />
115
- <ut-button content="confirm" @tap="onConfirm" />
116
- </div>
117
- </template>
118
- </vxe-modal>
119
- </template>
120
- <script setup lang="ts">
121
- import { ref, onMounted, nextTick } from 'vue';
122
- import { clone, max } from 'xe-utils';
123
- import { dbstorage, delay, warnMessage, successMessage } from '@utogether/utils';
124
- import Draggable from 'vuedraggable';
125
- import { getServiceApi } from '../../../api';
126
-
127
- interface IProps {
128
- dataSource: IRecord[];
129
- icons: Array<String>;
130
- userName: string;
131
- }
132
-
133
- const props = withDefaults(defineProps<IProps>(), {
134
- dataSource: () => [],
135
- icons: () => [],
136
- userName: ''
137
- });
138
-
139
- // 用户菜单
140
- const favoriteMenus = ref([]);
141
- const menuList = ref([]);
142
- const showModal = ref(false);
143
- const loading = ref(false);
144
- const checkboxModel = ref<IRecord>({});
145
- // const cacheCheckModel = {}; // 缓存最初选中的数据
146
-
147
- const url = '/upfm/v1/menuFavority';
148
-
149
- const getCacheMenuList = async () => {
150
- menuList.value = await dbstorage.getItem(`U-${props.userName}-ROUTES`);
151
- menuList.value = menuList.value.filter(f => f.menuCode !== 'SysHome');
152
- await delay(64);
153
- setCheckboxedMenu();
154
- };
155
-
156
- /** 上部删除 */
157
- const onRemoveFavorite = (item, idx) => {
158
- favoriteMenus.value.splice(idx, 1);
159
- const index = checkboxModel.value[item.parentId]?.findIndex(f => f === item.menuId);
160
- checkboxModel.value[item.parentId].splice(index, 1);
161
- // index = cacheCheckModel[item.parentId]?.findIndex(f => f.id === item.id);
162
- // cacheCheckModel[item.parentId].splice(index, 1);
163
- };
164
-
165
- /** 菜单分组 */
166
- const handleMenuCategoryGroup = data => {
167
- const folder = [];
168
- const menus = [];
169
- data.children.forEach(e => {
170
- if (['5', '100'].includes(e.menuCategory)) {
171
- folder.push(e);
172
- } else {
173
- menus.push(e);
174
- }
175
- });
176
- return { folder, menus };
177
- };
178
-
179
- /** 设置默认选中 */
180
- const setCheckboxedMenu = () => {
181
- props.dataSource.forEach(data => {
182
- if (checkboxModel.value[data.parentId]) {
183
- checkboxModel.value[data.parentId].push(data.menuId);
184
- // cacheCheckModel[data.parentId].push(data);
185
- } else {
186
- checkboxModel.value[data.parentId] = [data.menuId];
187
- // cacheCheckModel[data.parentId] = [data];
188
- }
189
- });
190
- };
191
- /** checkbox change */
192
- const onChange = (menu, event) => {
193
- if (event.checked) {
194
- // 新增
195
- if (favoriteMenus.value.length === 16) {
196
- nextTick(() => {
197
- checkboxModel.value[menu.id].splice(checkboxModel.value[menu.id].length - 1, 1);
198
- });
199
- return warnMessage('最多只能选择16个常用功能');
200
- }
201
- // const max = getMax();
202
- // if (cacheCheckModel[menu.id]) {
203
- // cacheCheckModel[menu.id].push({ id: event.label, seqNo: max + 10 });
204
- // } else {
205
- // cacheCheckModel[menu.id] = [{ id: event.label, seqNo: max + 10 }];
206
- // }
207
-
208
- const menuItem = menu.children.find(f => f.id === event.label);
209
- if (menuItem) {
210
- menuItem.seqNo = getMax() + 10;
211
- menuItem.menuId = menuItem.id;
212
- favoriteMenus.value.push(menuItem);
213
- }
214
- } else {
215
- // 顶部删除
216
- let idx = favoriteMenus.value.findIndex(f => f.menuId === event.label);
217
- idx !== -1 && favoriteMenus.value.splice(idx, 1);
218
- // checkbox删除
219
- idx = checkboxModel.value[menu.id].findIndex(f => f === event.label);
220
- idx !== -1 && checkboxModel.value[menu.id].splice(idx, 1);
221
- // 缓存删除
222
- // idx = cacheCheckModel[menu.id].findIndex(f => f.id === event.label);
223
- // idx !== -1 && cacheCheckModel[menu.id].splice(idx, 1);
224
- }
225
- };
226
- const onMoveEnd = () => {
227
- favoriteMenus.value.forEach((item, idx) => {
228
- item.seqNo = (idx + 1) * 10;
229
- console.log('seqNo=', item.seqNo);
230
- });
231
- };
232
- /** 获取排序最大值 */
233
- const getMax = () => {
234
- return max(favoriteMenus.value, item => item.seqNo)?.seqNo || 0;
235
- };
236
- const onConfirm = () => {
237
- console.log(favoriteMenus);
238
- const body = favoriteMenus.value.map((m, idx) => {
239
- return {
240
- userName: props.userName,
241
- menuId: m.menuId,
242
- seqNo: 10 * (idx + 1)
243
- };
244
- });
245
- console.log(body);
246
- loading.value = true;
247
- getServiceApi()
248
- .post(url, body)
249
- .then(() => {
250
- successMessage();
251
- onClose();
252
- emit('success');
253
- })
254
- .finally(() => {
255
- loading.value = false;
256
- });
257
- };
258
-
259
- const onClose = () => {
260
- showModal.value = false;
261
- emit('close');
262
- };
263
-
264
- const getColor = idx => {
265
- const colorSet = ['#409eff', '#67c23a', '#13c2c2', '#e85f33', 'orange'];
266
- return colorSet[idx % 5];
267
- };
268
-
269
- const emit = defineEmits<{ (e: 'close'): void; (e: 'success'): void }>();
270
-
271
- onMounted(() => {
272
- favoriteMenus.value = clone(props.dataSource, true);
273
- showModal.value = true;
274
- getCacheMenuList();
275
- });
276
- </script>
277
- <style lang="scss">
278
- .u-favorite-modal {
279
- .vxe-modal--body .vxe-modal--content {
280
- padding: 0;
281
- overflow: hidden !important;
282
- }
283
-
284
- .el-empty {
285
- &__description {
286
- margin-top: 10px;
287
- }
288
- }
289
-
290
- .ut-menu-top-item:hover {
291
- .ut-menu-del {
292
- position: absolute;
293
- display: inline-block;
294
- color: rgb(240 94 94);
295
- cursor: pointer;
296
- }
297
- }
298
-
299
- .u-favorite-menu--contain {
300
- height: calc(100vh - 320px);
301
- }
302
-
303
- .vxe-checkbox,
304
- .vxe-checkbox + .vxe-checkbox {
305
- width: 120px;
306
- padding: 4px 0;
307
- margin-right: 10px;
308
- margin-left: 0;
309
- }
310
-
311
- .vxe-modal--footer {
312
- border-top: 1px solid #e8e8e8;
313
- }
314
- }
315
- </style>
1
+ <template>
2
+ <vxe-modal
3
+ v-model="showModal"
4
+ :loading="loading"
5
+ width="75%"
6
+ height="80%"
7
+ title="常用菜单设置(拖动可改变菜单顺序)"
8
+ class-name="u-favorite-modal"
9
+ show-footer
10
+ @close="onClose"
11
+ >
12
+ <template #default>
13
+ <div class="">
14
+ <el-scrollbar heigth="100" class="w-full border-b border-slate-300">
15
+ <template #default>
16
+ <div class="w-full h-24">
17
+ <el-empty v-if="!favoriteMenus.length" :image-size="50" description="" class="p-0" />
18
+ <draggable
19
+ :list="favoriteMenus"
20
+ handle=".drag-item"
21
+ animation="300"
22
+ item-key="id"
23
+ class="flex"
24
+ @end="onMoveEnd"
25
+ >
26
+ <template #item="{ element, index }">
27
+ <div class="">
28
+ <div
29
+ class="h-24 w-24 flex justify-center items-center flex-col relative drag-item ut-menu-top-item"
30
+ >
31
+ <div
32
+ class="rounded-full w-10 h-10 flex items-center justify-center"
33
+ :style="{ backgroundColor: getColor(index) }"
34
+ >
35
+ <iconify-icon-offline
36
+ :icon="element.icon || `ri:${icons[index]}-line`"
37
+ class="text-2xl text-white"
38
+ />
39
+ </div>
40
+ <span class="w-[90%] text-xs mt-2 text-ellipsis overflow-hidden whitespace-nowrap text-center">
41
+ {{ element.menuName }}
42
+ </span>
43
+ <i
44
+ class="ri-indeterminate-circle-line right-3 top-2 text-base hidden ut-menu-del"
45
+ @click="onRemoveFavorite(element, index)"
46
+ />
47
+ </div>
48
+ </div>
49
+ </template>
50
+ </draggable>
51
+ </div>
52
+ </template>
53
+ </el-scrollbar>
54
+ <el-scrollbar class="u-favorite-menu--contain">
55
+ <template #default>
56
+ <div class="p-3 pb-14" style="padding-bottom: 54px">
57
+ <div v-for="menu in menuList" :key="menu.id" class="grandparent-node">
58
+ <div class="flex items-center">
59
+ <div class="w-2 h-4 bg-green-400" />
60
+ <div class="ml-1 font-bold text-base">{{ menu.menuName }}</div>
61
+ </div>
62
+ <div class="pl-3 py-2">
63
+ <vxe-checkbox-group v-model="checkboxModel[menu.id]" @change="onChange(menu, $event)">
64
+ <vxe-checkbox
65
+ v-for="item in handleMenuCategoryGroup(menu).menus"
66
+ :key="item.id"
67
+ :label="item.id"
68
+ :content="item.menuName"
69
+ />
70
+ </vxe-checkbox-group>
71
+ </div>
72
+ <div v-for="item in handleMenuCategoryGroup(menu).folder" :key="item.id" class="parent-node pl-3">
73
+ <div class="flex items-center">
74
+ <div class="w-2 h-4 bg-blue-400" />
75
+ <div class="ml-1 font-bold text-sm">{{ item.menuName }}</div>
76
+ </div>
77
+
78
+ <div class="pl-3 py-2">
79
+ <vxe-checkbox-group v-model="checkboxModel[item.id]" @change="onChange(item, $event)">
80
+ <vxe-checkbox
81
+ v-for="child in handleMenuCategoryGroup(item).menus"
82
+ :key="child.id"
83
+ :label="child.id"
84
+ :content="child.menuName"
85
+ />
86
+ </vxe-checkbox-group>
87
+ </div>
88
+ <div v-for="child in handleMenuCategoryGroup(item).folder" :key="child.id" class="child-node pl-3">
89
+ <div class="flex items-center">
90
+ <div class="w-2 h-4 bg-red-400" />
91
+ <div class="ml-1 font-bold text-sm">{{ child.menuName }}</div>
92
+ </div>
93
+
94
+ <div class="py-2">
95
+ <vxe-checkbox-group v-model="checkboxModel[child.id]" @change="onChange(item, $event)">
96
+ <vxe-checkbox
97
+ v-for="subChild in handleMenuCategoryGroup(child).menus"
98
+ :key="subChild.id"
99
+ :label="subChild.id"
100
+ :content="subChild.menuName"
101
+ />
102
+ </vxe-checkbox-group>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </template>
109
+ </el-scrollbar>
110
+ </div>
111
+ </template>
112
+ <template #footer>
113
+ <div class="flex justify-end">
114
+ <ut-button content="cancel" status="warning" @tap="onClose" />
115
+ <ut-button content="confirm" @tap="onConfirm" />
116
+ </div>
117
+ </template>
118
+ </vxe-modal>
119
+ </template>
120
+ <script setup lang="ts">
121
+ import { ref, onMounted, nextTick } from 'vue';
122
+ import { clone, max } from 'xe-utils';
123
+ import { dbstorage, delay, warnMessage, successMessage } from '@utogether/utils';
124
+ import Draggable from 'vuedraggable';
125
+ import { getServiceApi } from '../../../api';
126
+
127
+ interface IProps {
128
+ dataSource: IRecord[];
129
+ icons: Array<String>;
130
+ userName: string;
131
+ }
132
+
133
+ const props = withDefaults(defineProps<IProps>(), {
134
+ dataSource: () => [],
135
+ icons: () => [],
136
+ userName: ''
137
+ });
138
+
139
+ // 用户菜单
140
+ const favoriteMenus = ref([]);
141
+ const menuList = ref([]);
142
+ const showModal = ref(false);
143
+ const loading = ref(false);
144
+ const checkboxModel = ref<IRecord>({});
145
+ // const cacheCheckModel = {}; // 缓存最初选中的数据
146
+
147
+ const url = '/upfm/v1/menuFavority';
148
+
149
+ const getCacheMenuList = async () => {
150
+ menuList.value = await dbstorage.getItem(`U-${props.userName}-ROUTES`);
151
+ menuList.value = menuList.value.filter(f => f.menuCode !== 'SysHome');
152
+ await delay(64);
153
+ setCheckboxedMenu();
154
+ };
155
+
156
+ /** 上部删除 */
157
+ const onRemoveFavorite = (item, idx) => {
158
+ favoriteMenus.value.splice(idx, 1);
159
+ const index = checkboxModel.value[item.parentId]?.findIndex(f => f === item.menuId);
160
+ checkboxModel.value[item.parentId].splice(index, 1);
161
+ // index = cacheCheckModel[item.parentId]?.findIndex(f => f.id === item.id);
162
+ // cacheCheckModel[item.parentId].splice(index, 1);
163
+ };
164
+
165
+ /** 菜单分组 */
166
+ const handleMenuCategoryGroup = data => {
167
+ const folder = [];
168
+ const menus = [];
169
+ data.children.forEach(e => {
170
+ if (['5', '100'].includes(e.menuCategory)) {
171
+ folder.push(e);
172
+ } else {
173
+ menus.push(e);
174
+ }
175
+ });
176
+ return { folder, menus };
177
+ };
178
+
179
+ /** 设置默认选中 */
180
+ const setCheckboxedMenu = () => {
181
+ props.dataSource.forEach(data => {
182
+ if (checkboxModel.value[data.parentId]) {
183
+ checkboxModel.value[data.parentId].push(data.menuId);
184
+ // cacheCheckModel[data.parentId].push(data);
185
+ } else {
186
+ checkboxModel.value[data.parentId] = [data.menuId];
187
+ // cacheCheckModel[data.parentId] = [data];
188
+ }
189
+ });
190
+ };
191
+ /** checkbox change */
192
+ const onChange = (menu, event) => {
193
+ if (event.checked) {
194
+ // 新增
195
+ if (favoriteMenus.value.length === 16) {
196
+ nextTick(() => {
197
+ checkboxModel.value[menu.id].splice(checkboxModel.value[menu.id].length - 1, 1);
198
+ });
199
+ return warnMessage('最多只能选择16个常用功能');
200
+ }
201
+ // const max = getMax();
202
+ // if (cacheCheckModel[menu.id]) {
203
+ // cacheCheckModel[menu.id].push({ id: event.label, seqNo: max + 10 });
204
+ // } else {
205
+ // cacheCheckModel[menu.id] = [{ id: event.label, seqNo: max + 10 }];
206
+ // }
207
+
208
+ const menuItem = menu.children.find(f => f.id === event.label);
209
+ if (menuItem) {
210
+ menuItem.seqNo = getMax() + 10;
211
+ menuItem.menuId = menuItem.id;
212
+ favoriteMenus.value.push(menuItem);
213
+ }
214
+ } else {
215
+ // 顶部删除
216
+ let idx = favoriteMenus.value.findIndex(f => f.menuId === event.label);
217
+ idx !== -1 && favoriteMenus.value.splice(idx, 1);
218
+ // checkbox删除
219
+ idx = checkboxModel.value[menu.id].findIndex(f => f === event.label);
220
+ idx !== -1 && checkboxModel.value[menu.id].splice(idx, 1);
221
+ // 缓存删除
222
+ // idx = cacheCheckModel[menu.id].findIndex(f => f.id === event.label);
223
+ // idx !== -1 && cacheCheckModel[menu.id].splice(idx, 1);
224
+ }
225
+ };
226
+ const onMoveEnd = () => {
227
+ favoriteMenus.value.forEach((item, idx) => {
228
+ item.seqNo = (idx + 1) * 10;
229
+ console.log('seqNo=', item.seqNo);
230
+ });
231
+ };
232
+ /** 获取排序最大值 */
233
+ const getMax = () => {
234
+ return max(favoriteMenus.value, item => item.seqNo)?.seqNo || 0;
235
+ };
236
+ const onConfirm = () => {
237
+ console.log(favoriteMenus);
238
+ const body = favoriteMenus.value.map((m, idx) => {
239
+ return {
240
+ userName: props.userName,
241
+ menuId: m.menuId,
242
+ seqNo: 10 * (idx + 1)
243
+ };
244
+ });
245
+ console.log(body);
246
+ loading.value = true;
247
+ getServiceApi()
248
+ .post(url, body)
249
+ .then(() => {
250
+ successMessage();
251
+ onClose();
252
+ emit('success');
253
+ })
254
+ .finally(() => {
255
+ loading.value = false;
256
+ });
257
+ };
258
+
259
+ const onClose = () => {
260
+ showModal.value = false;
261
+ emit('close');
262
+ };
263
+
264
+ const getColor = idx => {
265
+ const colorSet = ['#409eff', '#67c23a', '#13c2c2', '#e85f33', 'orange'];
266
+ return colorSet[idx % 5];
267
+ };
268
+
269
+ const emit = defineEmits<{ (e: 'close'): void; (e: 'success'): void }>();
270
+
271
+ onMounted(() => {
272
+ favoriteMenus.value = clone(props.dataSource, true);
273
+ showModal.value = true;
274
+ getCacheMenuList();
275
+ });
276
+ </script>
277
+ <style lang="scss">
278
+ .u-favorite-modal {
279
+ .vxe-modal--body .vxe-modal--content {
280
+ padding: 0;
281
+ overflow: hidden !important;
282
+ }
283
+
284
+ .el-empty {
285
+ &__description {
286
+ margin-top: 10px;
287
+ }
288
+ }
289
+
290
+ .ut-menu-top-item:hover {
291
+ .ut-menu-del {
292
+ position: absolute;
293
+ display: inline-block;
294
+ color: rgb(240 94 94);
295
+ cursor: pointer;
296
+ }
297
+ }
298
+
299
+ .u-favorite-menu--contain {
300
+ height: calc(100vh - 320px);
301
+ }
302
+
303
+ .vxe-checkbox,
304
+ .vxe-checkbox + .vxe-checkbox {
305
+ width: 120px;
306
+ padding: 4px 0;
307
+ margin-right: 10px;
308
+ margin-left: 0;
309
+ }
310
+
311
+ .vxe-modal--footer {
312
+ border-top: 1px solid #e8e8e8;
313
+ }
314
+ }
315
+ </style>