@utogether/udp-core 1.0.1 → 1.0.2

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 (239) hide show
  1. package/build/plugins.ts +13 -2
  2. package/dist/{403-JWjatlxJ.js → 403-B1rIjAAu.js} +7 -6
  3. package/dist/{404-BcdMJfPb.js → 404-mBqc2y4t.js} +14 -13
  4. package/dist/{500-bsa3F_cc.js → 500-BoI45Zdh.js} +10 -9
  5. package/dist/{AuthorityInfo-CqItgNs5.js → AuthorityInfo-B08NBIIn.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-BLP1SaiH.js +100 -0
  7. package/dist/{AuthorityPanel-BaLMwMgW.js → AuthorityPanel-BeBNiwqc.js} +1 -1
  8. package/dist/{AuthorityPanel.vue_vue_type_style_index_0_lang-C_bkqLD9.js → AuthorityPanel.vue_vue_type_style_index_0_lang-CIYmnP9-.js} +6 -6
  9. package/dist/{Company-DVff9IA7.js → Company-JGGyWEWH.js} +3 -3
  10. package/dist/{CompanyPanel-CNrdq4XE.js → CompanyPanel-BQ_cCmDx.js} +16 -16
  11. package/dist/{Department-CqcpfL4i.js → Department-z2iO6hwM.js} +10 -10
  12. package/dist/{DepartmentPanel-Bvti4LGu.js → DepartmentPanel-BtQe7zwU.js} +108 -78
  13. package/dist/{DesignPanel-CjykspE1.js → DesignPanel-7mhtVWas.js} +1 -1
  14. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-BK9EERdd.js → DesignPanel.vue_vue_type_style_index_0_lang-4EsHemj_.js} +24 -26
  15. package/dist/DictView-CjchV2Yk.js +109 -0
  16. package/dist/InvOrganization-Pn1O_XP0.js +74 -0
  17. package/dist/Org-BqytV_vi.js +39 -0
  18. package/dist/{Preview-Cm_7RhYU.js → Preview-CLpUUMay.js} +2 -2
  19. package/dist/{ReportDefine-CJVlQ--7.js → ReportDefine-Cz1KtEUF.js} +1 -1
  20. package/dist/{ReportDesign-B0unlrkt.js → ReportDesign-BaORYud4.js} +46 -46
  21. package/dist/{ReportQuery-BKuMCEvF.js → ReportQuery-CPCPXiXz.js} +5 -5
  22. package/dist/{ReportQueryFrom-DAngMJLU.js → ReportQueryFrom-C_AcrfkJ.js} +1 -1
  23. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CPpwmztJ.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-Bm67ejay.js} +6 -5
  24. package/dist/{ReportTemplate-8YH3L8Pv.js → ReportTemplate-CFiNMz79.js} +26 -26
  25. package/dist/{Role-MxI30-0W.js → Role-B-XDoJd5.js} +6 -6
  26. package/dist/{RoleAssign-BzUY_y_y.js → RoleAssign-BolW8YVs.js} +9 -9
  27. package/dist/{RolePanel-DS_TErTn.js → RolePanel-2kfs5tw9.js} +1 -1
  28. package/dist/{RolePanel-CXdcvsR5.js → RolePanel-HilSuYns.js} +1 -1
  29. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-CE4gApUY.js +132 -0
  30. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Ddl-A7Zh.js → RolePanel.vue_vue_type_script_setup_true_lang-DPzgfAyV.js} +42 -36
  31. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-DnchUgIF.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCTH4RkH.js} +20 -20
  32. package/dist/{Staff-D7tXo_Gn.js → Staff-BTk3whFC.js} +3 -3
  33. package/dist/{StaffInfo-Bk8BY8PO.js → StaffInfo-d3AuSzlA.js} +1 -1
  34. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-DqKwZi5f.js → StaffInfo.vue_vue_type_script_setup_true_lang-eOL4VlfE.js} +13 -13
  35. package/dist/{StaffPanel-VtpGCTIq.js → StaffPanel-DV-D4jjz.js} +1 -1
  36. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-4sFq3CEo.js +135 -0
  37. package/dist/{SysUser-D0Q6OvD7.js → SysUser-BnjYytws.js} +2 -2
  38. package/dist/{SysUserPanel-1_vrsANQ.js → SysUserPanel-CBoyD-Qi.js} +1 -1
  39. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-PrTlTZR-.js +341 -0
  40. package/dist/{SystemMenu-9PG3vESE.js → SystemMenu-kYB_ZaUt.js} +49 -47
  41. package/dist/{UserInfo-qgXUEGwi.js → UserInfo-4dx97VBL.js} +1 -1
  42. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-CN0C5rVk.js → UserInfo.vue_vue_type_style_index_0_lang-BpbC_ZDm.js} +35 -33
  43. package/dist/{childView-C7ZSA5fR.js → childView-CHPNfTEb.js} +1 -1
  44. package/dist/{childView-yV2QLwfA.js → childView-CKA_JgVZ.js} +1 -1
  45. package/dist/{childView.vue_vue_type_style_index_0_lang-DdKxPGdh.js → childView.vue_vue_type_style_index_0_lang-Bym2fQRd.js} +7 -7
  46. package/dist/childView.vue_vue_type_style_index_0_lang-W7bCtXeu.js +177 -0
  47. package/dist/{code-rule-95K1jr-u.js → code-rule-CbxuZg0-.js} +42 -41
  48. package/dist/core.es.js +19 -10
  49. package/dist/{cron-task-DGrQwOHs.js → cron-task-nTOpqQYf.js} +5 -5
  50. package/dist/flow-task-B07st2aD.js +10 -0
  51. package/dist/{frameView-7SmME93D.js → frameView-Z1tPUyCh.js} +15 -14
  52. package/dist/img/l_img.svg +1 -1
  53. package/dist/img/minicolors.png +0 -0
  54. package/dist/img/v_img.svg +1 -1
  55. package/dist/index-C3q8HoJM.js +4650 -0
  56. package/dist/{layoutView-C6WIVWGZ.js → layoutView--MGA9zUB.js} +1776 -1764
  57. package/dist/{log-in-e7D5Ss1P.js → log-in-CSYJDA6m.js} +36 -29
  58. package/dist/log-out-DiwGCg7p.js +130 -0
  59. package/dist/login-C6Y0ajDp.js +251 -0
  60. package/dist/{login-log-CvVnyGi3.js → login-log-C0V-_l3F.js} +6 -4
  61. package/dist/{lov-view-DoF5LqFQ.js → lov-view-Cmv7wZZ9.js} +9 -9
  62. package/dist/{menuInfo-CNzGQwOD.js → menuInfo-UeutJpOa.js} +1 -1
  63. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-51SYxVc_.js → menuInfo.vue_vue_type_style_index_0_lang-CWX4Mu67.js} +144 -121
  64. package/dist/pda-app-B6w99SJo.js +710 -0
  65. package/dist/redirect-BqegffKC.js +15 -0
  66. package/dist/{resource-gVFFMO9l.js → resource-BybJvUv0.js} +17 -17
  67. package/dist/{su-welcome-BN_s_RX_.js → su-welcome-C1bmxHoY.js} +124 -126
  68. package/dist/sys-config-BnmIDnCj.js +370 -0
  69. package/dist/udp-core.css +1 -9
  70. package/dist/utogether-MlnyYtNS.js +4 -0
  71. package/index.ts +19 -6
  72. package/package.json +18 -17
  73. package/src/App.vue +2 -7
  74. package/src/api/http.ts +1 -4
  75. package/src/api/index.ts +5 -3
  76. package/src/api/user.ts +2 -2
  77. package/src/components/SuCharts/src/UserInfo.vue +3 -3
  78. package/src/components/SuScrollTree/ScrollPanel.vue +4 -9
  79. package/src/components/udp/content/index.vue +88 -0
  80. package/src/components/udp/form/form.vue +109 -0
  81. package/src/components/udp/grid/index.vue +524 -0
  82. package/src/components/udp/index.ts +5 -4
  83. package/src/components/udp/ut-stamp-badge/index.vue +271 -0
  84. package/src/components/udp/utils.ts +408 -40
  85. package/src/directives/permission/index.ts +1 -1
  86. package/src/layout/components/lay-navbar/index.vue +9 -7
  87. package/src/layout/components/lay-panel/index.vue +3 -3
  88. package/src/layout/components/lay-search/index.vue +1 -1
  89. package/src/layout/components/lay-select-org/index.vue +4 -9
  90. package/src/layout/components/lay-setting/index.vue +503 -510
  91. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  92. package/src/layout/components/lay-sidebar/horizontal.vue +8 -6
  93. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  94. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -98
  95. package/src/layout/components/lay-tag/index.vue +598 -625
  96. package/src/layout/hooks/useDataThemeChange.ts +1 -1
  97. package/src/layout/hooks/useNav.ts +176 -173
  98. package/src/layout/hooks/useTag.ts +227 -233
  99. package/src/layout/layoutView.vue +215 -215
  100. package/src/layout/types.ts +93 -92
  101. package/src/main.ts +115 -109
  102. package/src/plugins/i18n/en.ts +26 -13
  103. package/src/plugins/i18n/module/u-workflow.ts +1 -1
  104. package/src/plugins/i18n/zh.ts +363 -337
  105. package/src/plugins/vxe-table/index.ts +74 -4
  106. package/src/plugins/vxe-table/render.tsx +186 -58
  107. package/src/router/index.ts +187 -183
  108. package/src/router/modules/flow.ts +35 -0
  109. package/src/router/modules/home.ts +32 -32
  110. package/src/router/modules/remaining.ts +1 -26
  111. package/src/router/utils.ts +420 -377
  112. package/src/store/modules/app.ts +2 -4
  113. package/src/store/modules/epTheme.ts +48 -49
  114. package/src/store/modules/multiTags.ts +15 -14
  115. package/src/store/modules/permission.ts +25 -15
  116. package/src/store/modules/system.ts +1 -3
  117. package/src/style/button.scss +11 -4
  118. package/src/style/login.css +1 -1
  119. package/src/style/tailwind.css +1 -68
  120. package/src/style/vxetable.scss +103 -11
  121. package/src/utils/authority/index.ts +1 -1
  122. package/src/utils/dataFormat/index.ts +223 -223
  123. package/src/utils/index.ts +3 -1
  124. package/src/utils/lifecycle.ts +39 -20
  125. package/src/utils/propTypes.ts +1 -6
  126. package/src/utils/storage/index.ts +2 -2
  127. package/src/utils/{http → udp/http}/index.ts +27 -30
  128. package/src/utils/{http → udp/http}/types.d.ts +2 -6
  129. package/src/views/login/login-view.vue +6 -20
  130. package/src/views/organization/company/CompanyPanel.vue +2 -2
  131. package/src/views/organization/department/Department.vue +58 -58
  132. package/src/views/organization/department/DepartmentPanel.vue +303 -283
  133. package/src/views/organization/inv-org/InvOrganization.vue +23 -9
  134. package/src/views/organization/org/Org.vue +9 -5
  135. package/src/views/organization/staff/StaffInfo.vue +127 -133
  136. package/src/views/organization/staff/StaffPanel.vue +162 -145
  137. package/src/views/system/cron/cron-task.vue +2 -12
  138. package/src/views/system/menu/AuthorityPanel.vue +2 -2
  139. package/src/views/system/menu/SystemMenu.vue +14 -20
  140. package/src/views/system/menu/menuInfo.vue +39 -23
  141. package/src/views/system/role/AuthorityInfo.vue +19 -15
  142. package/src/views/system/role/Role.vue +1 -5
  143. package/src/views/system/role/RolePanel.vue +11 -2
  144. package/src/views/system/role/UserInfo.vue +11 -9
  145. package/src/views/system/role-assign/RoleAssign.vue +2 -2
  146. package/src/views/system/role-assign/RolePanel.vue +12 -9
  147. package/src/views/system/sys/sys-config.vue +70 -21
  148. package/src/views/system/sysUser/SysUserPanel.vue +347 -278
  149. package/src/views/uapp/pda/pda-app.vue +48 -16
  150. package/src/views/udev/coderule/code-rule.vue +132 -121
  151. package/src/views/udev/dict/DictView.vue +118 -106
  152. package/src/views/udev/dict/childView.vue +183 -222
  153. package/src/views/udev/lov/childView.vue +1 -7
  154. package/src/views/ufile/aggregation/File.vue +5 -5
  155. package/src/views/ufile/file/water-mark.vue +14 -14
  156. package/src/views/uhome/components/menu-favorite.vue +314 -331
  157. package/src/views/uhome/su-welcome.vue +319 -339
  158. package/src/views/ulogin/login.vue +325 -316
  159. package/src/views/upms/interface/log-in.vue +100 -106
  160. package/src/views/upms/interface/log-out.vue +104 -107
  161. package/src/views/upms/user/login-log.vue +54 -60
  162. package/src/views/urpt/design/DesignPanel.vue +16 -35
  163. package/src/views/urpt/design/Preview.vue +1 -0
  164. package/src/views/urpt/design/ReportDesign.vue +17 -23
  165. package/src/views/urpt/static-resource/resource.vue +3 -3
  166. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  167. package/src/views/utask/flow-task.vue +18 -0
  168. package/types/global.d.ts +231 -236
  169. package/vite.config.ts +13 -2
  170. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-32L40GY2.js +0 -102
  171. package/dist/DictView-q7kR9K--.js +0 -95
  172. package/dist/InvOrganization-DI45LqZV.js +0 -260
  173. package/dist/Org-CZju_ZiR.js +0 -35
  174. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-DJKu6PXz.js +0 -126
  175. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-C3Ixs12y.js +0 -111
  176. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-C5XEmxsV.js +0 -288
  177. package/dist/childView.vue_vue_type_style_index_0_lang-bkmucBUL.js +0 -187
  178. package/dist/core.umd.js +0 -173
  179. package/dist/index-OswH7SsT.js +0 -9937
  180. package/dist/log-out--RRncZhN.js +0 -120
  181. package/dist/login-BhCMeCLS.js +0 -251
  182. package/dist/pda-app-nn3llDUx.js +0 -2209
  183. package/dist/redirect-CmMplDV4.js +0 -15
  184. package/dist/sys-config-DGutV-VX.js +0 -277
  185. package/dist/utogether-wFDCI28t.js +0 -182
  186. package/src/assets/images/empty.png +0 -0
  187. package/src/assets/images/logo.png +0 -0
  188. package/src/components/ReCountTo/README.md +0 -2
  189. package/src/components/ReCountTo/index.ts +0 -18
  190. package/src/components/ReCountTo/src/normal/index.tsx +0 -165
  191. package/src/components/ReCountTo/src/normal/props.ts +0 -37
  192. package/src/components/ReCountTo/src/rebound/index.tsx +0 -67
  193. package/src/components/ReCountTo/src/rebound/props.ts +0 -14
  194. package/src/components/ReCountTo/src/rebound/rebound.css +0 -77
  195. package/src/components/ReCropper/index.ts +0 -14
  196. package/src/components/ReCropper/src/index.tsx +0 -141
  197. package/src/components/ReFlicker/index.css +0 -39
  198. package/src/components/ReFlicker/index.ts +0 -50
  199. package/src/components/ReFlop/index.ts +0 -14
  200. package/src/components/ReFlop/src/Filpper.tsx +0 -99
  201. package/src/components/ReFlop/src/filpper.css +0 -184
  202. package/src/components/ReFlop/src/index.vue +0 -126
  203. package/src/components/ReFlowChart/index.ts +0 -24
  204. package/src/components/ReFlowChart/src/Control.vue +0 -139
  205. package/src/components/ReFlowChart/src/DataDialog.vue +0 -12
  206. package/src/components/ReFlowChart/src/NodePanel.vue +0 -151
  207. package/src/components/ReFlowChart/src/adpterForTurbo.ts +0 -160
  208. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.css +0 -49
  209. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.eot +0 -0
  210. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.js +0 -61
  211. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.json +0 -58
  212. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.svg +0 -47
  213. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.ttf +0 -0
  214. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff +0 -0
  215. package/src/components/ReFlowChart/src/assets/iconfont/iconfont.woff2 +0 -0
  216. package/src/components/ReFlowChart/src/config.ts +0 -62
  217. package/src/components/ReSplitPane/index.css +0 -49
  218. package/src/components/ReSplitPane/index.tsx +0 -119
  219. package/src/components/ReSplitPane/resizer.css +0 -45
  220. package/src/components/ReSplitPane/resizer.tsx +0 -30
  221. package/src/components/SuCommon/card/components/Card.vue +0 -148
  222. package/src/components/SuCommon/card/components/DialogForm.vue +0 -127
  223. package/src/components/SuCommon/card/index.vue +0 -142
  224. package/src/components/SuCommon/icon-select/index.vue +0 -241
  225. package/src/components/SuCommon/table/index.vue +0 -208
  226. package/src/components/SuCommon/utils/index.ts +0 -103
  227. package/src/components/SuCommon/utils/slot.tsx +0 -50
  228. package/src/components/udp/form-upload.vue +0 -132
  229. package/src/components/udp/modal-form.vue +0 -180
  230. package/src/utils/udp/useRender.ts +0 -420
  231. package/src/views/components/contextmenu/basic.vue +0 -74
  232. package/src/views/components/contextmenu/context-menu.vue +0 -40
  233. package/src/views/components/contextmenu/menuDynamic.vue +0 -99
  234. package/src/views/components/contextmenu/menuGroup.vue +0 -71
  235. package/src/views/components/count-to/index.vue +0 -43
  236. package/src/views/components/cropping/index.vue +0 -59
  237. package/src/views/components/cropping/picture.jpeg +0 -0
  238. package/src/views/components/split-pane/index.vue +0 -82
  239. package/src/views/components/video/index.vue +0 -57
@@ -1,331 +1,314 @@
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
41
- class="w-[90%] text-xs mt-2 text-ellipsis overflow-hidden whitespace-nowrap text-center"
42
- >
43
- {{ element.menuName }}
44
- </span>
45
- <i
46
- class="ri-indeterminate-circle-line right-3 top-2 text-base hidden ut-menu-del"
47
- @click="onRemoveFavorite(element, index)"
48
- />
49
- </div>
50
- </div>
51
- </template>
52
- </draggable>
53
- </div>
54
- </template>
55
- </el-scrollbar>
56
- <el-scrollbar class="u-favorite-menu--contain">
57
- <template #default>
58
- <div class="p-3">
59
- <div v-for="menu in menuList" :key="menu.id" class="grandparent-node">
60
- <div class="flex items-center">
61
- <div class="w-2 h-4 bg-green-400" />
62
- <div class="ml-1 font-bold text-base">{{ menu.menuName }}</div>
63
- </div>
64
- <div class="pl-3 py-2">
65
- <vxe-checkbox-group v-model="checkboxModel[menu.id]" @change="onChange(menu, $event)">
66
- <vxe-checkbox
67
- v-for="item in handleMenuCategoryGroup(menu).menus"
68
- :key="item.id"
69
- :label="item.id"
70
- :content="item.menuName"
71
- />
72
- </vxe-checkbox-group>
73
- </div>
74
- <div
75
- v-for="item in handleMenuCategoryGroup(menu).folder"
76
- :key="item.id"
77
- class="parent-node pl-3"
78
- >
79
- <div class="flex items-center">
80
- <div class="w-2 h-4 bg-blue-400" />
81
- <div class="ml-1 font-bold text-sm">{{ item.menuName }}</div>
82
- </div>
83
-
84
- <div class="pl-3 py-2">
85
- <vxe-checkbox-group
86
- v-model="checkboxModel[item.id]"
87
- @change="onChange(item, $event)"
88
- >
89
- <vxe-checkbox
90
- v-for="child in handleMenuCategoryGroup(item).menus"
91
- :key="child.id"
92
- :label="child.id"
93
- :content="child.menuName"
94
- />
95
- </vxe-checkbox-group>
96
- </div>
97
- <div
98
- v-for="child in handleMenuCategoryGroup(item).folder"
99
- :key="child.id"
100
- class="child-node pl-3"
101
- >
102
- <div class="flex items-center">
103
- <div class="w-2 h-4 bg-red-400" />
104
- <div class="ml-1 font-bold text-sm">{{ child.menuName }}</div>
105
- </div>
106
-
107
- <div class="py-2">
108
- <vxe-checkbox-group
109
- v-model="checkboxModel[child.id]"
110
- @change="onChange(item, $event)"
111
- >
112
- <vxe-checkbox
113
- v-for="subChild in handleMenuCategoryGroup(child).menus"
114
- :key="subChild.id"
115
- :label="subChild.id"
116
- :content="subChild.menuName"
117
- />
118
- </vxe-checkbox-group>
119
- </div>
120
- </div>
121
- </div>
122
- </div>
123
- </div>
124
- </template>
125
- </el-scrollbar>
126
- </div>
127
- </template>
128
- <template #footer>
129
- <div class="flex justify-end">
130
- <ut-button content="cancel" status="warning" @tap="onClose" />
131
- <ut-button content="confirm" @tap="onConfirm" />
132
- </div>
133
- </template>
134
- </vxe-modal>
135
- </template>
136
- <script setup lang="ts">
137
- import { ref, onMounted, nextTick } from 'vue';
138
- import { clone, max } from 'xe-utils';
139
- import { dbstorage, delay, warnMessage, successMessage } from '@utogether/utils';
140
- import Draggable from 'vuedraggable';
141
- import { getServiceApi } from '../../../api';
142
-
143
- interface IProps {
144
- dataSource: IRecord[];
145
- icons: Array<String>;
146
- userName: string;
147
- }
148
-
149
- const props = withDefaults(defineProps<IProps>(), {
150
- dataSource: () => [],
151
- icons: () => [],
152
- userName: ''
153
- });
154
-
155
- // 用户菜单
156
- const favoriteMenus = ref([]);
157
- const menuList = ref([]);
158
- const showModal = ref(false);
159
- const loading = ref(false);
160
- const checkboxModel = ref<IRecord>({});
161
- // const cacheCheckModel = {}; // 缓存最初选中的数据
162
-
163
- const url = '/upms/v1/menuFavority';
164
-
165
- const getCacheMenuList = async () => {
166
- menuList.value = await dbstorage.getItem(`U-${props.userName}-ROUTES`);
167
- menuList.value = menuList.value.filter(f => f.menuCode !== 'SysHome');
168
- await delay(64);
169
- setCheckboxedMenu();
170
- };
171
-
172
- /** 上部删除 */
173
- const onRemoveFavorite = (item, idx) => {
174
- favoriteMenus.value.splice(idx, 1);
175
- const index = checkboxModel.value[item.parentId]?.findIndex(f => f === item.menuId);
176
- checkboxModel.value[item.parentId].splice(index, 1);
177
- // index = cacheCheckModel[item.parentId]?.findIndex(f => f.id === item.id);
178
- // cacheCheckModel[item.parentId].splice(index, 1);
179
- };
180
-
181
- /** 菜单分组 */
182
- const handleMenuCategoryGroup = data => {
183
- const folder = [];
184
- const menus = [];
185
- data.children.forEach(e => {
186
- if (['5', '100'].includes(e.menuCategory)) {
187
- folder.push(e);
188
- } else {
189
- menus.push(e);
190
- }
191
- });
192
- return { folder, menus };
193
- };
194
-
195
- /** 设置默认选中 */
196
- const setCheckboxedMenu = () => {
197
- props.dataSource.forEach(data => {
198
- if (checkboxModel.value[data.parentId]) {
199
- checkboxModel.value[data.parentId].push(data.menuId);
200
- // cacheCheckModel[data.parentId].push(data);
201
- } else {
202
- checkboxModel.value[data.parentId] = [data.menuId];
203
- // cacheCheckModel[data.parentId] = [data];
204
- }
205
- });
206
- };
207
- /** checkbox change */
208
- const onChange = (menu, event) => {
209
- debugger;
210
- if (event.checked) {
211
- // 新增
212
- if (favoriteMenus.value.length === 16) {
213
- nextTick(() => {
214
- checkboxModel.value[menu.id].splice(checkboxModel.value[menu.id].length - 1, 1);
215
- });
216
- return warnMessage('最多只能选择16个常用功能');
217
- }
218
- // const max = getMax();
219
- // if (cacheCheckModel[menu.id]) {
220
- // cacheCheckModel[menu.id].push({ id: event.label, seqNo: max + 10 });
221
- // } else {
222
- // cacheCheckModel[menu.id] = [{ id: event.label, seqNo: max + 10 }];
223
- // }
224
-
225
- const menuItem = menu.children.find(f => f.id === event.label);
226
- if (menuItem) {
227
- menuItem.seqNo = getMax() + 10;
228
- menuItem.menuId = menuItem.id;
229
- favoriteMenus.value.push(menuItem);
230
- }
231
- } else {
232
- // 顶部删除
233
- let idx = favoriteMenus.value.findIndex(f => f.menuId === event.label);
234
- idx !== -1 && favoriteMenus.value.splice(idx, 1);
235
- // checkbox删除
236
- idx = checkboxModel.value[menu.id].findIndex(f => f === event.label);
237
- idx !== -1 && checkboxModel.value[menu.id].splice(idx, 1);
238
- // 缓存删除
239
- // idx = cacheCheckModel[menu.id].findIndex(f => f.id === event.label);
240
- // idx !== -1 && cacheCheckModel[menu.id].splice(idx, 1);
241
- }
242
- };
243
- const onMoveEnd = () => {
244
- favoriteMenus.value.forEach((item, idx) => {
245
- item.seqNo = (idx + 1) * 10;
246
- });
247
- };
248
- /** 获取排序最大值 */
249
- const getMax = () => {
250
- return max(favoriteMenus.value, item => item.seqNo)?.seqNo || 0;
251
- };
252
- const onConfirm = () => {
253
- console.log(favoriteMenus);
254
- const body = favoriteMenus.value.map(m => {
255
- return {
256
- userName: props.userName,
257
- menuId: m.menuId,
258
- seqNo: m.seqNo
259
- };
260
- });
261
- console.log(body);
262
- loading.value = true;
263
- getServiceApi()
264
- .post(url, body)
265
- .then(() => {
266
- successMessage();
267
- onClose();
268
- emit('success');
269
- })
270
- .finally(() => {
271
- loading.value = false;
272
- });
273
- };
274
-
275
- const onClose = () => {
276
- showModal.value = false;
277
- emit('close');
278
- };
279
-
280
- const getColor = idx => {
281
- const colorSet = ['#409eff', '#67c23a', '#13c2c2', '#e85f33', 'orange'];
282
- return colorSet[idx % 5];
283
- };
284
-
285
- const emit = defineEmits<{ (e: 'close'): void; (e: 'success'): void }>();
286
-
287
- onMounted(() => {
288
- favoriteMenus.value = clone(props.dataSource, true);
289
- showModal.value = true;
290
- getCacheMenuList();
291
- });
292
- </script>
293
- <style lang="scss">
294
- .u-favorite-modal {
295
- .vxe-modal--body .vxe-modal--content {
296
- padding: 0;
297
- overflow: hidden !important;
298
- }
299
-
300
- .el-empty {
301
- &__description {
302
- margin-top: 10px;
303
- }
304
- }
305
-
306
- .ut-menu-top-item:hover {
307
- .ut-menu-del {
308
- position: absolute;
309
- display: inline-block;
310
- color: rgb(240 94 94);
311
- cursor: pointer;
312
- }
313
- }
314
-
315
- .u-favorite-menu--contain {
316
- height: calc(100vh - 320px);
317
- }
318
-
319
- .vxe-checkbox,
320
- .vxe-checkbox + .vxe-checkbox {
321
- width: 120px;
322
- padding: 4px 0;
323
- margin-right: 10px;
324
- margin-left: 0;
325
- }
326
-
327
- .vxe-modal--footer {
328
- border-top: 1px solid #e8e8e8;
329
- }
330
- }
331
- </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
+ });
230
+ };
231
+ /** 获取排序最大值 */
232
+ const getMax = () => {
233
+ return max(favoriteMenus.value, item => item.seqNo)?.seqNo || 0;
234
+ };
235
+ const onConfirm = () => {
236
+ console.log(favoriteMenus);
237
+ const body = favoriteMenus.value.map(m => {
238
+ return {
239
+ userName: props.userName,
240
+ menuId: m.menuId,
241
+ seqNo: m.seqNo
242
+ };
243
+ });
244
+ console.log(body);
245
+ loading.value = true;
246
+ getServiceApi()
247
+ .post(url, body)
248
+ .then(() => {
249
+ successMessage();
250
+ onClose();
251
+ emit('success');
252
+ })
253
+ .finally(() => {
254
+ loading.value = false;
255
+ });
256
+ };
257
+
258
+ const onClose = () => {
259
+ showModal.value = false;
260
+ emit('close');
261
+ };
262
+
263
+ const getColor = idx => {
264
+ const colorSet = ['#409eff', '#67c23a', '#13c2c2', '#e85f33', 'orange'];
265
+ return colorSet[idx % 5];
266
+ };
267
+
268
+ const emit = defineEmits<{ (e: 'close'): void; (e: 'success'): void }>();
269
+
270
+ onMounted(() => {
271
+ favoriteMenus.value = clone(props.dataSource, true);
272
+ showModal.value = true;
273
+ getCacheMenuList();
274
+ });
275
+ </script>
276
+ <style lang="scss">
277
+ .u-favorite-modal {
278
+ .vxe-modal--body .vxe-modal--content {
279
+ padding: 0;
280
+ overflow: hidden !important;
281
+ }
282
+
283
+ .el-empty {
284
+ &__description {
285
+ margin-top: 10px;
286
+ }
287
+ }
288
+
289
+ .ut-menu-top-item:hover {
290
+ .ut-menu-del {
291
+ position: absolute;
292
+ display: inline-block;
293
+ color: rgb(240 94 94);
294
+ cursor: pointer;
295
+ }
296
+ }
297
+
298
+ .u-favorite-menu--contain {
299
+ height: calc(100vh - 320px);
300
+ }
301
+
302
+ .vxe-checkbox,
303
+ .vxe-checkbox + .vxe-checkbox {
304
+ width: 120px;
305
+ padding: 4px 0;
306
+ margin-right: 10px;
307
+ margin-left: 0;
308
+ }
309
+
310
+ .vxe-modal--footer {
311
+ border-top: 1px solid #e8e8e8;
312
+ }
313
+ }
314
+ </style>