@utogether/udp-core 1.0.4 → 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 (184) hide show
  1. package/dist/{403-DASI6Pwz.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-YhBA92cb.js → 404-xdB6lFeQ.js} +1 -1
  5. package/dist/500-BYfzvixf-CGpEieyQ.js +67 -0
  6. package/dist/{500-ywbFF5MX.js → 500-C94bRK2S.js} +2 -2
  7. package/dist/AuthorityInfo-DBovfUjB-DpQwT9Q5.js +4 -0
  8. package/dist/{AuthorityInfo-tCSX2Fh7.js → AuthorityInfo-Dy3b_nFN.js} +1 -1
  9. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-Cwd6UT2i.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-BeBNiwqc.js → AuthorityPanel-CRlAwbaI.js} +1 -1
  13. package/dist/AuthorityPanel.vue_vue_type_style_index_0_lang-DxhZjp1S-CJvk3pW8.js +114 -0
  14. package/dist/{AuthorityPanel.vue_vue_type_style_index_0_lang-CIYmnP9-.js → AuthorityPanel.vue_vue_type_style_index_0_lang-DxhZjp1S.js} +31 -24
  15. package/dist/Company-B4vsXy2I-CkNCOqjJ.js +25 -0
  16. package/dist/{Company-l23MEzdM.js → Company-gKkfnhLt.js} +3 -3
  17. package/dist/{CompanyPanel-D_s0rh6h.js → CompanyPanel-BF5Pc35s.js} +7 -7
  18. package/dist/CompanyPanel-Czcx8Gyw-CvndXwB_.js +206 -0
  19. package/dist/DataSet-DT-rGICv-DaUfgbxk.js +147 -0
  20. package/dist/{Department-DSEvORLg.js → Department-D0I3QVZe.js} +3 -3
  21. package/dist/Department-D0dVUrGC-C6HJcYI1.js +25 -0
  22. package/dist/{DepartmentPanel-WN8nOgCV.js → DepartmentPanel-2LHODgc7.js} +22 -22
  23. package/dist/DepartmentPanel-e91Lxr1j-BS_A-ILd.js +254 -0
  24. package/dist/{DesignPanel-DirEGh9M.js → DesignPanel-CtF3cAAQ.js} +1 -1
  25. package/dist/DesignPanel-DdFl_ohi-uCwFxcl1.js +4 -0
  26. package/dist/DesignPanel.vue_vue_type_style_index_0_lang-BACPrfUI-cC7yL0uY.js +1013 -0
  27. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-D02hXSrN.js → DesignPanel.vue_vue_type_style_index_0_lang-BCYgwoVt.js} +3 -3
  28. package/dist/DictView-BzQLOf_P-DDicwdmM.js +111 -0
  29. package/dist/{DictView-DiIQdiek.js → DictView-H3V5hxg3.js} +17 -16
  30. package/dist/{InvOrganization-b7v3g9EJ.js → InvOrganization-BiGLnbqe.js} +2 -2
  31. package/dist/InvOrganization-atbhw0CI-BABbVt9V.js +74 -0
  32. package/dist/Org-BW1YHG-Q-Cow7JWlD.js +39 -0
  33. package/dist/{Org-BORfx1PL.js → Org-DQTCQHNY.js} +2 -2
  34. package/dist/Preview-DJtVsoq1-CCGidQjJ.js +48 -0
  35. package/dist/{Preview-DkRn_TSc.js → Preview-DXaiis29.js} +1 -1
  36. package/dist/{ReportDefine-Cd0QeaWA.js → ReportDefine-BLh4CiER.js} +1 -1
  37. package/dist/ReportDefine-CNx_ob99-6NQAHK-Q.js +10 -0
  38. package/dist/ReportDesign-FbQ6yTJS-C1pPAUSp.js +165 -0
  39. package/dist/{ReportDesign-4qNqyeEW.js → ReportDesign-Ni1YxrLC.js} +7 -7
  40. package/dist/ReportQuery-C5gz8Lgd-Eu2cQmda.js +75 -0
  41. package/dist/{ReportQuery-BJfTFpec.js → ReportQuery-C8G88_qF.js} +1 -1
  42. package/dist/ReportQueryFrom-C7scua5v-uHXWq8Gy.js +4 -0
  43. package/dist/{ReportQueryFrom-CB7sExZx.js → ReportQueryFrom-CuZKPtB4.js} +1 -1
  44. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CqO_2Ier.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-BAn_siFW.js} +7 -7
  45. package/dist/ReportQueryFrom.vue_vue_type_style_index_0_lang-DCbz67Wa-vK6r2uCl.js +178 -0
  46. package/dist/ReportTemplate-BDANdIWv-D_IGjR1w.js +161 -0
  47. package/dist/{ReportTemplate-B69muSgT.js → ReportTemplate-DFnDXWmx.js} +8 -8
  48. package/dist/{Role-Bo4YrNDC.js → Role-BQ7hsfPn.js} +3 -3
  49. package/dist/Role-ByB0WbxW-5E8Mb148.js +25 -0
  50. package/dist/RoleAssign-DW6iC_0v-Bis61auk.js +26 -0
  51. package/dist/{RoleAssign-kOMYJ4s3.js → RoleAssign-UPCg2d4G.js} +3 -3
  52. package/dist/RolePanel-BM2MaQPU-CgcsbfaX.js +4 -0
  53. package/dist/{RolePanel-BSJmjyqc.js → RolePanel-C-mQ5XRq.js} +1 -1
  54. package/dist/RolePanel-ClQy8DBL-DARL4O-o.js +4 -0
  55. package/dist/{RolePanel-B1d4e6uk.js → RolePanel-CoSXOCZN.js} +1 -1
  56. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-Bc_Ao_PU-DMmxr2iI.js +132 -0
  57. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-DgQpfjaU.js → RolePanel.vue_vue_type_script_setup_true_lang-Bg-t2UhF.js} +7 -7
  58. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-DCzX-ZP_.js → RolePanel.vue_vue_type_script_setup_true_lang-D-o7HYZ8.js} +8 -8
  59. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-fthF1zkp-JsbQJoDy.js +154 -0
  60. package/dist/ScrollPanel.vue_vue_type_style_index_0_lang-ByWIwajm-BsBf2Vs3.js +100 -0
  61. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-WNOYFxJ1.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCsoxDfk.js} +1 -1
  62. package/dist/Staff-CuxzvhD9-D0KTcyRh.js +25 -0
  63. package/dist/{Staff-BFp3zNNR.js → Staff-D-CmvG1R.js} +3 -3
  64. package/dist/StaffInfo-CY7gUICu-EZUhUwIp.js +4 -0
  65. package/dist/{StaffInfo-DcU9_40C.js → StaffInfo-Idhvuc6e.js} +1 -1
  66. package/dist/StaffInfo.vue_vue_type_script_setup_true_lang-Dd8gtQz8-Dlkt-eCn.js +108 -0
  67. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-CtfN2CAr.js → StaffInfo.vue_vue_type_script_setup_true_lang-MUGKjnHU.js} +1 -1
  68. package/dist/{StaffPanel-7exWkZd9.js → StaffPanel-CDDmAYE5.js} +1 -1
  69. package/dist/StaffPanel-CwqG0_xr-CrvzLJoc.js +4 -0
  70. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-v5xOXKRS.js → StaffPanel.vue_vue_type_script_setup_true_lang-Bdilqbee.js} +42 -42
  71. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-DCdBy8Hu-BXrueqi0.js +143 -0
  72. package/dist/SysUser-9Q2UJWhi-DprWXFlR.js +15 -0
  73. package/dist/{SysUser-B3uB_cp2.js → SysUser-a-j5bppr.js} +2 -2
  74. package/dist/{SysUserPanel-B0CLp5AO.js → SysUserPanel-6V232wwB.js} +1 -1
  75. package/dist/SysUserPanel-bJy69O7x-BJtBgFEs.js +4 -0
  76. package/dist/{SysUserPanel.vue_vue_type_script_setup_true_lang-Cwea_4dY.js → SysUserPanel.vue_vue_type_script_setup_true_lang-BOtHuMVy.js} +126 -111
  77. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-DUPFqgz3-BSqRCMen.js +356 -0
  78. package/dist/{SystemMenu-a59l4hTk.js → SystemMenu-BnVeOSOQ.js} +50 -47
  79. package/dist/SystemMenu-DGOAolc1-CJSLHP8i.js +156 -0
  80. package/dist/UserInfo-CKoOHkAM-DDWp0I_U.js +4 -0
  81. package/dist/{UserInfo-D1IA2oLt.js → UserInfo-Cax9b2nw.js} +1 -1
  82. package/dist/UserInfo.vue_vue_type_style_index_0_lang-BaT53SSu-DsNaAomO.js +160 -0
  83. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-DDVgYRD5.js → UserInfo.vue_vue_type_style_index_0_lang-D-cw11i9.js} +2 -2
  84. package/dist/await-to-js.es5-Bv3Eu4mi-UCggJjes.js +10 -0
  85. package/dist/await-to-js.es5-Bv3Eu4mi.js +10 -0
  86. package/dist/childView-0YZQ6GBn-CEqg7k5d.js +4 -0
  87. package/dist/{childView-6rCeLcsx.js → childView-DKG3eZo8.js} +1 -1
  88. package/dist/childView-DKkgi3yo-D47ft-vi.js +4 -0
  89. package/dist/{childView-JdrkroL5.js → childView-siumuBz0.js} +1 -1
  90. package/dist/childView.vue_vue_type_style_index_0_lang-ABMrGInv-ClOdE_sa.js +143 -0
  91. package/dist/{childView.vue_vue_type_style_index_0_lang-BfcnWnx9.js → childView.vue_vue_type_style_index_0_lang-CUfXDS1q.js} +28 -25
  92. package/dist/{childView.vue_vue_type_style_index_0_lang-B8x99f1B.js → childView.vue_vue_type_style_index_0_lang-CW3EbAmW.js} +8 -8
  93. package/dist/childView.vue_vue_type_style_index_0_lang-CaW106ve-CClTM8PK.js +180 -0
  94. package/dist/{code-rule-2lkPF547.js → code-rule-Dtoree6F.js} +2 -2
  95. package/dist/code-rule-wQyfgpNL-C4evD4Co.js +148 -0
  96. package/dist/core.es.js +10 -10
  97. package/dist/cron-task-C-kryDtd-C0NuGZCe.js +135 -0
  98. package/dist/{cron-task-DV1pGO1m.js → cron-task-GSRgA7S5.js} +2 -2
  99. package/dist/flow-task-B07st2aD-CgQvagSQ.js +10 -0
  100. package/dist/frameView-BOGA3ezf-QoSxzmSQ.js +44 -0
  101. package/dist/{frameView-C0bzSB8c.js → frameView-Cy6wxW0K.js} +1 -1
  102. package/dist/index-Dc7xWMiC.js +7265 -0
  103. package/dist/layout-home-3Dy4onl4.js +228 -0
  104. package/dist/layout-home-CYHksXN_-Basy-3IH.js +228 -0
  105. package/dist/layoutView-BaRvAbIa-xVgfqspc.js +3302 -0
  106. package/dist/{layoutView-CTV-E4Cj.js → layoutView-DMjNscJ-.js} +148 -149
  107. package/dist/log-in-Cx1dGik8-BVeEHeZ8.js +117 -0
  108. package/dist/{log-in-CoBP2x6u.js → log-in-VAG6Cvcx.js} +8 -8
  109. package/dist/log-out-COYdxrNC-ftopGZdE.js +130 -0
  110. package/dist/{log-out-KX8FiRVf.js → log-out-DZGaMCjC.js} +4 -4
  111. package/dist/{login-CtCoGWzD.js → login-CqVMdNHs.js} +126 -136
  112. package/dist/login-Dg9ofNS8-Bocp1XMA.js +241 -0
  113. package/dist/login-log-DJBGJVV0-AoOyj0jD.js +70 -0
  114. package/dist/lov-view-C0T5prk8-B2DBmn55.js +97 -0
  115. package/dist/{lov-view-Bm0JEzzg.js → lov-view-Cc68_28B.js} +7 -7
  116. package/dist/{menuInfo-D2qPoRwz.js → menuInfo-BIrIaJlH.js} +1 -1
  117. package/dist/menuInfo-BZJ_q7bz-Drho-_QC.js +4 -0
  118. package/dist/menuInfo.vue_vue_type_style_index_0_lang-BA8xjUo3-BCZ1wipf.js +363 -0
  119. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-DoQjX9Ly.js → menuInfo.vue_vue_type_style_index_0_lang-DlE4w35X.js} +38 -36
  120. package/dist/{pda-app-SbcIclbH.js → pda-app-DnjphrRS.js} +9 -9
  121. package/dist/pda-app-m9hsppHo-B4xyja1o.js +710 -0
  122. package/dist/redirect-BqegffKC-CBCIuqmz.js +15 -0
  123. package/dist/resource-C6KEIXu--B_ddyecm.js +97 -0
  124. package/dist/{resource-Cdq1UKGI.js → resource-DISgPDM7.js} +4 -4
  125. package/dist/su-welcome-BjbuSrBZ.js +49424 -0
  126. package/dist/su-welcome-CYYy-dzr-D3RKPoB0.js +42089 -0
  127. package/dist/sys-config-DCjJGtht-DARDjlrt.js +370 -0
  128. package/dist/{sys-config-CCOf4xbj.js → sys-config-Yc9vh1t1.js} +13 -13
  129. package/dist/udp-core.css +1 -1
  130. package/dist/utogether-MlnyYtNS-CGgjFNPS.js +4 -0
  131. package/package.json +5 -2
  132. package/src/App.vue +37 -31
  133. package/src/components/udp/content/index.vue +88 -88
  134. package/src/components/udp/form-upload/form-upload.vue +492 -0
  135. package/src/components/udp/grid/index.vue +524 -524
  136. package/src/components/udp/index.ts +6 -5
  137. package/src/components/udp/ut-stamp-badge/index.vue +271 -271
  138. package/src/components/udp/utils.ts +408 -408
  139. package/src/layout/components/lay-content/index.vue +4 -11
  140. package/src/layout/components/lay-search/components/SearchModal.vue +181 -189
  141. package/src/layout/components/lay-setting/index.vue +503 -503
  142. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -101
  143. package/src/layout/components/lay-tag/index.vue +598 -598
  144. package/src/layout/hooks/useNav.ts +176 -176
  145. package/src/layout/hooks/useTag.ts +227 -227
  146. package/src/layout/layoutView.vue +216 -215
  147. package/src/layout/types.ts +93 -93
  148. package/src/main.ts +111 -115
  149. package/src/plugins/i18n/zh.ts +17 -3
  150. package/src/plugins/vxe-table/index.ts +116 -116
  151. package/src/plugins/vxe-table/render.tsx +968 -950
  152. package/src/router/index.ts +187 -187
  153. package/src/router/modules/home.ts +32 -32
  154. package/src/router/utils.ts +420 -420
  155. package/src/store/modules/epTheme.ts +48 -48
  156. package/src/style/vxetable.scss +18 -2
  157. package/src/utils/dataFormat/index.ts +222 -222
  158. package/src/utils/lifecycle.ts +39 -39
  159. package/src/views/organization/department/DepartmentPanel.vue +303 -303
  160. package/src/views/organization/staff/StaffInfo.vue +127 -127
  161. package/src/views/organization/staff/StaffPanel.vue +3 -3
  162. package/src/views/system/layout/layout-home.vue +237 -0
  163. package/src/views/system/menu/AuthorityPanel.vue +10 -9
  164. package/src/views/system/menu/SystemMenu.vue +194 -185
  165. package/src/views/system/menu/menuInfo.vue +384 -384
  166. package/src/views/system/sysUser/SysUserPanel.vue +363 -347
  167. package/src/views/udev/coderule/code-rule.vue +132 -132
  168. package/src/views/udev/dict/DictView.vue +118 -118
  169. package/src/views/udev/dict/childView.vue +184 -183
  170. package/src/views/udev/lov/childView.vue +174 -174
  171. package/src/views/uhome/components/common-menu.vue +118 -0
  172. package/src/views/uhome/components/dynamic-component.vue +66 -0
  173. package/src/views/uhome/components/home-todo.vue +170 -0
  174. package/src/views/uhome/components/menu-favorite.vue +315 -315
  175. package/src/views/uhome/dynamic-card.vue +31 -0
  176. package/src/views/uhome/su-welcome.vue +48 -113
  177. package/src/views/ulogin/login.vue +336 -325
  178. package/src/views/upms/interface/log-in.vue +100 -100
  179. package/src/views/upms/interface/log-out.vue +104 -104
  180. package/src/views/upms/user/login-log.vue +54 -54
  181. package/types/global.d.ts +232 -231
  182. package/dist/await-to-js.es5-BtRbN2QH.js +0 -10
  183. package/dist/index-BbtbEMCH.js +0 -4649
  184. package/dist/su-welcome-BHDsjqqV.js +0 -524
@@ -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>
@@ -0,0 +1,31 @@
1
+ <!--
2
+ * @Author: levi7754 levi7754@163.com
3
+ * @Date: 2025-12-26 13:53:05
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-12-30 09:23:25
6
+ * @FilePath: \udp-front\packages\udp-core\src\views\uhome\dynamic-card.vue
7
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
8
+ -->
9
+ <template>
10
+ <div class="dynamic-card w-full">
11
+ <vxe-row :gutter="[10, 10]" wrap>
12
+ <vxe-col v-for="data in list" :key="data.id" :span="data.span">
13
+ <vxe-card :title="data.title" :height="data.height" shadow>
14
+ <dynamicComponent :data="data" />
15
+ </vxe-card>
16
+ </vxe-col>
17
+ </vxe-row>
18
+ </div>
19
+ </template>
20
+ <script setup lang="tsx">
21
+ import dynamicComponent from './components/dynamic-component.vue';
22
+
23
+ interface IProps {
24
+ list: IRecord;
25
+ }
26
+ withDefaults(defineProps<IProps>(), {
27
+ list: () => {
28
+ return [];
29
+ }
30
+ });
31
+ </script>