@utogether/udp-core 1.0.1-beta.9 → 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 (168) hide show
  1. package/build/plugins.ts +37 -39
  2. package/dist/{403-BOzKHdlm.js → 403-B1rIjAAu.js} +6 -6
  3. package/dist/{404-uwgt4Nll.js → 404-mBqc2y4t.js} +4 -4
  4. package/dist/{500-4HBf6V9m.js → 500-BoI45Zdh.js} +2 -2
  5. package/dist/{AuthorityInfo-DvbIh1vT.js → AuthorityInfo-B08NBIIn.js} +1 -1
  6. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-BlCPvwXU.js → AuthorityInfo.vue_vue_type_style_index_0_lang-BLP1SaiH.js} +3 -3
  7. package/dist/{Company-D7Q9BFmr.js → Company-JGGyWEWH.js} +3 -3
  8. package/dist/{CompanyPanel-C0-PJlrt.js → CompanyPanel-BQ_cCmDx.js} +7 -7
  9. package/dist/{Department-h2hlXACv.js → Department-z2iO6hwM.js} +10 -10
  10. package/dist/{DepartmentPanel-B6hDEQpG.js → DepartmentPanel-BtQe7zwU.js} +108 -78
  11. package/dist/{DesignPanel-cS58-1v9.js → DesignPanel-7mhtVWas.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-LdvLC8VU.js → DesignPanel.vue_vue_type_style_index_0_lang-4EsHemj_.js} +6 -6
  13. package/dist/{DictView-T3TmpBa8.js → DictView-CjchV2Yk.js} +15 -16
  14. package/dist/InvOrganization-Pn1O_XP0.js +74 -0
  15. package/dist/{Org-CnCBDGKF.js → Org-BqytV_vi.js} +1 -1
  16. package/dist/{Preview-BaktKXB1.js → Preview-CLpUUMay.js} +2 -2
  17. package/dist/{ReportDefine-5Rb0PO9A.js → ReportDefine-Cz1KtEUF.js} +1 -1
  18. package/dist/{ReportDesign-DYdkVREA.js → ReportDesign-BaORYud4.js} +13 -13
  19. package/dist/{ReportQuery-BwhzIXMt.js → ReportQuery-CPCPXiXz.js} +1 -1
  20. package/dist/{ReportQueryFrom-PHtWwlOe.js → ReportQueryFrom-C_AcrfkJ.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-BE5yZNPM.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-Bm67ejay.js} +1 -1
  22. package/dist/{ReportTemplate-DaadVXIi.js → ReportTemplate-CFiNMz79.js} +11 -11
  23. package/dist/{Role-Dtg3nAmG.js → Role-B-XDoJd5.js} +3 -3
  24. package/dist/{RoleAssign-DEGtLssH.js → RoleAssign-BolW8YVs.js} +8 -8
  25. package/dist/{RolePanel-DpUzfE_o.js → RolePanel-2kfs5tw9.js} +1 -1
  26. package/dist/{RolePanel-CT7BTPmy.js → RolePanel-HilSuYns.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Xyo0YEI0.js → RolePanel.vue_vue_type_script_setup_true_lang-CE4gApUY.js} +7 -7
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Dg2A6DJu.js → RolePanel.vue_vue_type_script_setup_true_lang-DPzgfAyV.js} +13 -13
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-CyutzDZS.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCTH4RkH.js} +4 -4
  30. package/dist/{Staff-_NlAGkrh.js → Staff-BTk3whFC.js} +3 -3
  31. package/dist/{StaffInfo-DVgUvVgd.js → StaffInfo-d3AuSzlA.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-C8hmlFgX.js → StaffInfo.vue_vue_type_script_setup_true_lang-eOL4VlfE.js} +5 -5
  33. package/dist/{StaffPanel-DKNZE3IE.js → StaffPanel-DV-D4jjz.js} +1 -1
  34. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-4sFq3CEo.js +135 -0
  35. package/dist/{SysUser-kQUf7XKz.js → SysUser-BnjYytws.js} +2 -2
  36. package/dist/{SysUserPanel-C191uX3U.js → SysUserPanel-CBoyD-Qi.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-PrTlTZR-.js +341 -0
  38. package/dist/{SystemMenu-DwuSvHnj.js → SystemMenu-kYB_ZaUt.js} +36 -36
  39. package/dist/{UserInfo-DIsInFld.js → UserInfo-4dx97VBL.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-CnvGdbej.js → UserInfo.vue_vue_type_style_index_0_lang-BpbC_ZDm.js} +10 -10
  41. package/dist/{childView-3Bs2UBEw.js → childView-CHPNfTEb.js} +1 -1
  42. package/dist/{childView-BawyULD7.js → childView-CKA_JgVZ.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-YpWF-p2F.js → childView.vue_vue_type_style_index_0_lang-Bym2fQRd.js} +7 -7
  44. package/dist/childView.vue_vue_type_style_index_0_lang-W7bCtXeu.js +177 -0
  45. package/dist/{code-rule-DVaYcn8S.js → code-rule-CbxuZg0-.js} +40 -38
  46. package/dist/core.es.js +18 -12
  47. package/dist/{cron-task-xuzP-BpE.js → cron-task-nTOpqQYf.js} +7 -7
  48. package/dist/flow-task-B07st2aD.js +10 -0
  49. package/dist/{frameView-Cudt06qS.js → frameView-Z1tPUyCh.js} +1 -1
  50. package/dist/index-C3q8HoJM.js +4650 -0
  51. package/dist/{layoutView-BlFTV2jX.js → layoutView--MGA9zUB.js} +1766 -1760
  52. package/dist/{log-in-e7D5Ss1P.js → log-in-CSYJDA6m.js} +36 -29
  53. package/dist/log-out-DiwGCg7p.js +130 -0
  54. package/dist/login-C6Y0ajDp.js +251 -0
  55. package/dist/{login-log-kqKzKTto.js → login-log-C0V-_l3F.js} +5 -3
  56. package/dist/{lov-view-B2HaxyMs.js → lov-view-Cmv7wZZ9.js} +6 -6
  57. package/dist/{menuInfo-BxCTJ1VW.js → menuInfo-UeutJpOa.js} +1 -1
  58. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-CLOPNeUW.js → menuInfo.vue_vue_type_style_index_0_lang-CWX4Mu67.js} +118 -98
  59. package/dist/{pda-app-DPsAFNiw.js → pda-app-B6w99SJo.js} +10 -10
  60. package/dist/{resource-Dibb7t8u.js → resource-BybJvUv0.js} +4 -4
  61. package/dist/{su-welcome-DejR0KkM.js → su-welcome-C1bmxHoY.js} +119 -121
  62. package/dist/sys-config-BnmIDnCj.js +370 -0
  63. package/dist/udp-core.css +1 -9
  64. package/dist/utogether-MlnyYtNS.js +4 -0
  65. package/index.ts +49 -40
  66. package/package.json +18 -18
  67. package/src/App.vue +65 -65
  68. package/src/api/http.ts +1 -4
  69. package/src/api/index.ts +4 -2
  70. package/src/api/user.ts +2 -2
  71. package/src/components/SuCharts/src/UserInfo.vue +78 -78
  72. package/src/components/SuScrollTree/ScrollPanel.vue +1 -6
  73. package/src/components/udp/content/index.vue +88 -0
  74. package/src/components/udp/{form.vue → form/form.vue} +13 -16
  75. package/src/components/udp/{grid.vue → grid/index.vue} +56 -27
  76. package/src/components/udp/index.ts +4 -9
  77. package/src/components/udp/ut-stamp-badge/index.vue +271 -0
  78. package/src/components/udp/utils.ts +66 -105
  79. package/src/layout/components/lay-navbar/index.vue +8 -6
  80. package/src/layout/components/lay-panel/index.vue +150 -150
  81. package/src/layout/components/lay-search/index.vue +25 -25
  82. package/src/layout/components/lay-select-org/index.vue +4 -9
  83. package/src/layout/components/lay-setting/index.vue +503 -510
  84. package/src/layout/components/lay-sidebar/horizontal.vue +8 -6
  85. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  86. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -98
  87. package/src/layout/components/lay-tag/index.vue +24 -51
  88. package/src/layout/hooks/useDataThemeChange.ts +1 -1
  89. package/src/layout/hooks/useNav.ts +176 -173
  90. package/src/layout/hooks/useTag.ts +227 -233
  91. package/src/layout/types.ts +93 -92
  92. package/src/main.ts +115 -119
  93. package/src/plugins/i18n/en.ts +302 -302
  94. package/src/plugins/i18n/module/u-workflow.ts +1 -1
  95. package/src/plugins/i18n/zh.ts +21 -6
  96. package/src/plugins/vxe-table/index.ts +116 -53
  97. package/src/plugins/vxe-table/render.tsx +945 -956
  98. package/src/router/index.ts +17 -17
  99. package/src/router/modules/flow.ts +35 -0
  100. package/src/router/modules/home.ts +32 -32
  101. package/src/router/modules/remaining.ts +58 -58
  102. package/src/router/utils.ts +420 -377
  103. package/src/store/modules/app.ts +2 -4
  104. package/src/store/modules/epTheme.ts +48 -49
  105. package/src/store/modules/multiTags.ts +15 -14
  106. package/src/store/modules/permission.ts +25 -15
  107. package/src/store/modules/system.ts +1 -3
  108. package/src/style/button.scss +85 -85
  109. package/src/style/login.css +1 -1
  110. package/src/style/vxetable.scss +61 -2
  111. package/src/utils/dataFormat/index.ts +223 -223
  112. package/src/utils/index.ts +3 -1
  113. package/src/utils/lifecycle.ts +39 -20
  114. package/src/utils/propTypes.ts +1 -6
  115. package/src/utils/storage/index.ts +2 -2
  116. package/src/utils/udp/http/index.ts +24 -11
  117. package/src/utils/udp/http/types.d.ts +3 -10
  118. package/src/views/login/login-view.vue +4 -18
  119. package/src/views/organization/company/CompanyPanel.vue +259 -259
  120. package/src/views/organization/department/Department.vue +58 -58
  121. package/src/views/organization/department/DepartmentPanel.vue +303 -283
  122. package/src/views/organization/inv-org/InvOrganization.vue +22 -7
  123. package/src/views/organization/staff/StaffInfo.vue +127 -133
  124. package/src/views/organization/staff/StaffPanel.vue +162 -145
  125. package/src/views/system/cron/cron-task.vue +2 -12
  126. package/src/views/system/menu/SystemMenu.vue +185 -183
  127. package/src/views/system/menu/menuInfo.vue +384 -363
  128. package/src/views/system/role/UserInfo.vue +195 -195
  129. package/src/views/system/role-assign/RoleAssign.vue +57 -57
  130. package/src/views/system/role-assign/RolePanel.vue +139 -139
  131. package/src/views/system/sys/sys-config.vue +69 -20
  132. package/src/views/system/sysUser/SysUserPanel.vue +97 -28
  133. package/src/views/uapp/pda/pda-app.vue +208 -208
  134. package/src/views/udev/coderule/code-rule.vue +132 -121
  135. package/src/views/udev/dict/DictView.vue +2 -2
  136. package/src/views/udev/dict/childView.vue +183 -222
  137. package/src/views/udev/lov/childView.vue +1 -7
  138. package/src/views/udev/lov/lov-view.vue +91 -91
  139. package/src/views/uhome/components/menu-favorite.vue +314 -331
  140. package/src/views/uhome/su-welcome.vue +319 -339
  141. package/src/views/ulogin/login.vue +325 -321
  142. package/src/views/upms/interface/log-in.vue +100 -106
  143. package/src/views/upms/interface/log-out.vue +104 -107
  144. package/src/views/upms/user/login-log.vue +54 -60
  145. package/src/views/urpt/design/DesignPanel.vue +507 -507
  146. package/src/views/urpt/design/Preview.vue +1 -0
  147. package/src/views/urpt/design/ReportDesign.vue +2 -4
  148. package/src/views/utask/flow-task.vue +18 -0
  149. package/types/global.d.ts +231 -236
  150. package/dist/InvOrganization-BVuOhzbt.js +0 -66
  151. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-BOOO6Cek.js +0 -111
  152. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-SwNbAEvW.js +0 -294
  153. package/dist/childView.vue_vue_type_style_index_0_lang-DWIFCX3X.js +0 -187
  154. package/dist/index-CKnq5xIa.js +0 -2623
  155. package/dist/log-out--RRncZhN.js +0 -120
  156. package/dist/login-CpKykfdf.js +0 -253
  157. package/dist/sys-config-DiySRWns.js +0 -277
  158. package/dist/utogether-Dct_14Zk.js +0 -182
  159. package/src/components/udp/count-down.vue +0 -536
  160. package/src/components/udp/flip-down/FlipCard/flip-card.vue +0 -251
  161. package/src/components/udp/flip-down/FlipCard/interfaces.ts +0 -4
  162. package/src/components/udp/flip-down/FlipClock/flip-clock.vue +0 -113
  163. package/src/components/udp/form-upload.vue +0 -482
  164. package/src/components/udp/lov.vue +0 -388
  165. package/src/components/udp/modal-form.vue +0 -189
  166. package/src/components/udp/modal-grid.vue +0 -288
  167. package/src/components/udp/upload.vue +0 -423
  168. package/src/utils/udp/useRender.ts +0 -431
@@ -1,26 +1,24 @@
1
1
  /*
2
- * @Author: levi7754 levi7754@163.com
3
- * @Date: 2025-07-14 17:38:38
2
+ * @Author: wei.li
3
+ * @Date: 2022-06-23 17:29:11
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-08-21 10:57:00
6
- * @FilePath: \udp-front\packages\udp-core\src\components\udp\utils.ts
7
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
5
+ * @LastEditTime: 2025-12-02 18:32:18
6
+ * @Description: file content
8
7
  */
9
- import { clone, isString, isEmpty, toDateString, isObject, isFunction, merge } from 'xe-utils';
10
- import { cookies, storageLocal, useRender } from '@utogether/utils';
8
+ // @ts-nocheck
9
+
10
+ import { clone, isString, orderBy, isEmpty, toDateString, isObject, isFunction } from 'xe-utils';
11
+ import { cookies, storageLocal } from '@utogether/utils';
11
12
  /** 系统配置的key */
12
13
  const kSYSCONFIG = 'kSysConfig';
13
14
  const kCOOKIES = 'kCookies_param';
14
15
 
15
16
  const sysConfig = storageLocal.getItem(kSYSCONFIG);
16
17
 
17
- const renderHook = useRender();
18
-
19
18
  /** 工具栏按钮标准化 */
20
19
  export const formatButton = (buttons, auth?) => {
21
20
  buttons.forEach(btn => {
22
21
  btn.auth = auth ? auth[btn.code] || btn.auth : btn.auth;
23
- debugger;
24
22
  if (!btn.name) {
25
23
  btn.name = `message.btn.${btn.code}`;
26
24
  } else if (sysConfig?.i18nEnabled === 'Y' && !btn.name.startsWith('message.')) {
@@ -44,7 +42,8 @@ export const queryAll = (props, http, form) => {
44
42
  const params = { pageNum: 1, pageSize: 100000 };
45
43
  const commonParam = getCookieParam();
46
44
  Object.assign(params, form, commonParam, props.defaultParams || {});
47
- const query = formatDateRange(params, props.items);
45
+ let query = formatMultipleParams(params, props.items);
46
+ query = formatDateRange(query, props.items);
48
47
 
49
48
  const { url } = props;
50
49
  if (!url) return null;
@@ -71,7 +70,7 @@ export const queryAll = (props, http, form) => {
71
70
  * @param isDoc doc文档
72
71
  * @returns Promise
73
72
  */
74
- export const query = (props, form, page, http, isDoc) => {
73
+ export const query = (props, form, page, http, code, isDoc) => {
75
74
  if (isDoc) return getDocData();
76
75
  for (const key in form) {
77
76
  if (form[key] && isString(form[key])) {
@@ -81,9 +80,10 @@ export const query = (props, form, page, http, isDoc) => {
81
80
  const params = { pageNum: page.currentPage, pageSize: page.pageSize };
82
81
  const commonParam = getCookieParam();
83
82
  Object.assign(params, commonParam, props.defaultParams || {}, form);
84
- const query = formatDateRange(params, props.items);
83
+
84
+ let query = formatMultipleParams(params, props.items);
85
+ query = formatDateRange(query, props.items);
85
86
  const { url } = props;
86
- console.log(query);
87
87
  if (!url) return null;
88
88
  const requestURL = isString(url) ? url : url.fetch || url.restful;
89
89
  const method = url.fetch ? 'post' : 'get';
@@ -133,28 +133,46 @@ export const save = (http, body, props) => {
133
133
  return allService;
134
134
  };
135
135
 
136
+ /**
137
+ * 多选数据优化
138
+ * @param listQuery
139
+ * @param items
140
+ * @returns
141
+ */
142
+ const formatMultipleParams = (listQuery: any, items) => {
143
+ const multipleItems = items.filter(f => f.itemRender?.props?.multiple || f.multiple);
144
+ if (isEmpty(multipleItems)) return listQuery;
145
+ const query = clone(listQuery, true);
146
+ multipleItems.forEach((element: any) => {
147
+ if (element.itemRender.name === '#select' && element.itemRender.props.multiple) {
148
+ if (query[`_${element.field}`]?.length === 0) {
149
+ // 重置后
150
+ query[`${element.field}`] = null;
151
+ }
152
+ delete listQuery[`_${element.field}`];
153
+ delete query[`_${element.field}`];
154
+ }
155
+ });
156
+ return query;
157
+ };
158
+
136
159
  const startFormatter = 'yyyy-MM-dd 00:00:00';
137
160
  const endFormatter = 'yyyy-MM-dd 23:59:59';
161
+ // 时间范围优化
138
162
  const formatDateRange = (listQuery: any, items) => {
139
- const dateRanges = items.filter(
140
- f => f.itemRender?.name === '#SuDateRange' || f.itemRender?.props?.multiple || f.multiple
141
- );
163
+ const dateRanges = items.filter(f => ['#SuDateRange', 'VxeDateRangePicker'].includes(f.itemRender?.name));
142
164
  if (isEmpty(dateRanges)) return listQuery;
143
165
  const query = clone(listQuery, true);
144
166
  dateRanges.forEach((element: any) => {
145
- if (element.multiple || element.itemRender?.props?.multiple) {
146
- query[element.field] = query[element.field]?.join(',');
147
- } else {
148
- const val = query[element.field];
149
- if (val && element.toField) {
150
- query[element.fromField] = toDateString(val[0], startFormatter);
151
- query[element.toField] = toDateString(val[1], endFormatter);
152
- } else if (val) {
153
- query[`${element.field}From`] = toDateString(val[0], startFormatter);
154
- query[`${element.field}To`] = toDateString(val[1], endFormatter);
155
- }
156
- delete query[element.field];
167
+ const val = query[element.field];
168
+ if (val && element.itemRender.startField) {
169
+ query[element.itemRender.startField] = toDateString(query[element.itemRender.startField], startFormatter);
170
+ query[element.itemRender.endField] = toDateString(query[element.itemRender.endField], endFormatter);
171
+ } else if (val) {
172
+ query[`${element.field}From`] = toDateString(val[0], startFormatter);
173
+ query[`${element.field}To`] = toDateString(val[1], endFormatter);
157
174
  }
175
+ delete query[element.field];
158
176
  });
159
177
  return query;
160
178
  };
@@ -170,19 +188,22 @@ export const inlineButtons = [
170
188
  name: 'add',
171
189
  status: 'u-cyan',
172
190
  icon: 'vxe-icon-add',
173
- auth: 'add'
191
+ auth: 'add',
192
+ sort: 1
174
193
  },
175
194
  {
176
195
  code: 'delete',
177
196
  status: 'danger',
178
197
  icon: 'vxe-icon-delete',
179
- auth: 'del'
198
+ auth: 'del',
199
+ sort: 2
180
200
  },
181
201
  {
182
202
  code: 'save',
183
203
  status: 'primary',
184
204
  icon: 'vxe-icon-save',
185
- auth: 'edit'
205
+ auth: 'edit',
206
+ sort: 3
186
207
  }
187
208
  ];
188
209
  // form 模式按钮
@@ -191,13 +212,15 @@ export const dialogButtons = [
191
212
  code: 'add',
192
213
  status: 'u-cyan',
193
214
  icon: 'vxe-icon-add',
194
- auth: 'add'
215
+ auth: 'add',
216
+ sort: 1
195
217
  },
196
218
  {
197
- code: 'delete',
219
+ code: 'del',
198
220
  status: 'danger',
199
221
  icon: 'vxe-icon-delete',
200
- auth: 'del'
222
+ auth: 'del',
223
+ sort: 2
201
224
  }
202
225
  ];
203
226
 
@@ -228,10 +251,8 @@ export const getExportConfig = attrs => {
228
251
  export const getToolBarConfig = (data, props, attrs, hasAuthority) => {
229
252
  const refreshOptions = {
230
253
  icon: 'ri-refresh-line',
231
- code: 'query',
232
254
  iconLoading: 'vxe-icon-spinner roll vxe-loading--default-icon'
233
255
  };
234
- debugger;
235
256
  // 不可编辑时
236
257
  if (!props.editable) {
237
258
  data.editConfig.editable = props.editable;
@@ -255,13 +276,17 @@ export const getToolBarConfig = (data, props, attrs, hasAuthority) => {
255
276
  // 先设置传入的按钮
256
277
  let buttons = clone(attrs.buttons || [], true);
257
278
 
279
+ buttons.forEach((button, idx) => {
280
+ button.sort = button.sort || idx + 10;
281
+ });
282
+
258
283
  // 获取默认的按钮
259
284
  const toolButtons = attrs.mode !== 'form' ? clone(inlineButtons, true) : clone(dialogButtons, true);
260
285
  // 判断传入的按钮是否有默认按钮的auth,有就不加入按钮组中,相当于重写了默认的按钮
261
286
  // reverse的原因是: 保持现有按钮顺序, 新增,保存,删除
262
287
  toolButtons.reverse().forEach(btn => {
263
288
  !buttons.some(s => s.code === btn.code) && buttons.unshift(btn);
264
- if (attrs.authPrefix && !['print', 'export'].includes(btn.auth)) {
289
+ if (attrs.authPrefix && !['printer', 'export'].includes(btn.auth)) {
265
290
  btn.auth = attrs.authPrefix + btn.auth.slice(0, 1).toLocaleUpperCase() + btn.auth.slice(1).toLocaleLowerCase();
266
291
  }
267
292
  });
@@ -284,11 +309,12 @@ export const getToolBarConfig = (data, props, attrs, hasAuthority) => {
284
309
  exportBtn = { icon: 'ri-download-2-line', code: 'export' };
285
310
  }
286
311
  data.toolbarConfig = {
287
- buttons,
312
+ buttons: orderBy(buttons, 'sort'),
288
313
  enabled: true,
289
314
  refreshOptions,
290
- custom: !!attrs.gridId,
315
+ customOptions: attrs.gridId ? {} : null,
291
316
  exportOptions: exportBtn,
317
+ custom: !!attrs.gridId,
292
318
  export: hasExport,
293
319
  refresh: true,
294
320
  perfect: true
@@ -380,68 +406,3 @@ export const getAttrs = attrs => {
380
406
  });
381
407
  return data;
382
408
  };
383
-
384
- export const formatItems = (items, status, span = 24) => {
385
- if (!items.length) return items;
386
- return items.map(item => {
387
- if (item.children?.length) {
388
- item.children = formatItems(item.children, status, span);
389
- return item;
390
- } else {
391
- item.title = item.title || `message.${item.field}`;
392
- item.span = item.span || span;
393
- if (item.type === 'collapseNode') {
394
- // 折叠项目,title和宽度不需要
395
- item.title = '';
396
- item.titleWidth = 0;
397
- }
398
- let disabled = false;
399
- if (status === 'detail') {
400
- disabled = true;
401
- item.placeholder = null;
402
- } else {
403
- disabled = item.disabled === false ? item.disabled : item.disabled || item.itemRender?.props?.disabled;
404
- }
405
- let itemRender = {
406
- name: 'VxeInput',
407
- props: { disabled, placeholder: disabled ? '' : item.placeholder }
408
- };
409
- if (item.code && !item.itemRender) {
410
- itemRender = renderHook.renderDict(item.code);
411
- }
412
- item.itemRender = item.itemRender || itemRender;
413
- item.itemRender['props'] = Object.assign(item.itemRender.props || {}, {
414
- disabled
415
- });
416
- return item;
417
- }
418
- });
419
- };
420
-
421
- /**
422
- * @description: 标准化必填数据
423
- * @param {*} records 数据列表
424
- * @param {*} t i18n对象
425
- * @return {*} rule数据
426
- */
427
- export const formatRules = (records, t) => {
428
- const rule = {};
429
- records.forEach(item => {
430
- if (item.children?.length) {
431
- const subRuls = formatRules(item.children, t);
432
- merge(rule, subRuls);
433
- } else {
434
- if (item.required) {
435
- const { field, title } = item;
436
- const i18n = title?.startsWith('message.');
437
- rule[field] = [
438
- {
439
- required: true,
440
- message: `${t('message.required')}${title && i18n ? t(title) : title || t(`message.${field}`)}`
441
- }
442
- ];
443
- }
444
- }
445
- });
446
- return rule;
447
- };
@@ -2,7 +2,7 @@
2
2
  * @Author: wei.li
3
3
  * @Date: 2021-11-17 16:02:30
4
4
  * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-04-16 16:20:09
5
+ * @LastEditTime: 2025-08-29 08:57:37
6
6
  * @Description: file content
7
7
  -->
8
8
  <template>
@@ -20,16 +20,14 @@
20
20
 
21
21
  <div v-if="layout === 'vertical'" class="vertical-header-right">
22
22
  <!-- 业务单元选择 -->
23
- <OrgSelect />
23
+ <OrgSelect v-if="sysConfig['orgTaggle'] === 'Y'" />
24
24
  <!-- 菜单搜索 -->
25
25
  <Search />
26
26
  <!-- 通知 -->
27
27
  <!-- <Notice id="header-notice" /> -->
28
28
  <!-- 国际化 -->
29
29
  <el-dropdown id="header-translation" trigge·r="click">
30
- <globalization
31
- class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-hidden"
32
- />
30
+ <globalization class="navbar-bg-hover w-[40px] h-[48px] p-[11px] cursor-pointer outline-hidden" />
33
31
  <template #dropdown>
34
32
  <el-dropdown-menu class="translation">
35
33
  <el-dropdown-item
@@ -98,7 +96,7 @@ export default { name: 'NavBar' };
98
96
  </script>
99
97
  <script setup lang="ts">
100
98
  import { ref } from 'vue';
101
- // import { useRouter } from 'vue-router';
99
+ import { storageLocal } from '@utogether/utils';
102
100
  import Hamburger from '../lay-sidebar/hamBurger.vue';
103
101
  import Breadcrumb from '../lay-sidebar/breadCrumb.vue';
104
102
  // import Notice from './lay-notice/index.vue';
@@ -109,6 +107,7 @@ import OrgSelect from '../lay-select-org/index.vue';
109
107
  import { useTranslationLang } from '../../hooks/useTranslationLang';
110
108
  import globalization from '../../../assets/svg/globalization.svg?component';
111
109
  import avatars from '../../../assets/images/avatars.jpg';
110
+ import { kSYSCONFIG } from '../../../contant';
112
111
 
113
112
  // const router = useRouter();
114
113
  // const route = useRoute();
@@ -131,6 +130,9 @@ const {
131
130
  const { locale, translationCh, translationEn } = useTranslationLang();
132
131
 
133
132
  const record: IRecord = {};
133
+
134
+ const sysConfig = storageLocal.getItem(kSYSCONFIG) || {};
135
+
134
136
  /**
135
137
  * @description: 重置密码
136
138
  */
@@ -1,150 +1,150 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-12-23 17:33:20
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-07-31 10:15:40
6
- * @Description: 个性化设置页面
7
- -->
8
- <script setup lang="ts">
9
- import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
10
- import { useDataThemeChange } from '../../hooks/useDataThemeChange';
11
- import { onClickOutside } from '@vueuse/core';
12
- import { emitter } from '../../../utils/mitt';
13
-
14
- const target = ref(null);
15
- const show = ref<Boolean>(false);
16
-
17
- const iconClass = computed(() => {
18
- return [
19
- 'w-[22px]',
20
- 'h-[22px]',
21
- 'flex',
22
- 'justify-center',
23
- 'items-center',
24
- 'outline-hidden',
25
- 'rounded-[4px]',
26
- 'cursor-pointer',
27
- 'transition-colors',
28
- 'hover:bg-[#0000000f]',
29
- 'dark:hover:bg-[#ffffff1f]',
30
- 'dark:hover:text-[#ffffffd9]'
31
- ];
32
- });
33
-
34
- const { onReset } = useDataThemeChange();
35
- onClickOutside(target, (event: any) => {
36
- if (event.clientX > target.value.offsetLeft) return;
37
- show.value = false;
38
- });
39
-
40
- onMounted(() => {
41
- emitter.on('openPanel', () => {
42
- show.value = true;
43
- });
44
- });
45
-
46
- onBeforeUnmount(() => {
47
- // 解绑`openPanel`公共事件,防止多次触发
48
- emitter.off('openPanel');
49
- });
50
- </script>
51
-
52
- <template>
53
- <div :class="{ show }">
54
- <div class="right-panel-background" />
55
- <div ref="target" class="right-panel bg-bg_color bg-white">
56
- <div
57
- class="project-configuration border-0 border-b-[1px] border-solid border-[var(--pure-border-color)]"
58
- >
59
- <h4 class="dark:text-white">{{ $t('message.tip.projectConfig') }}</h4>
60
- <span
61
- v-tippy="{
62
- content: $t('message.tip.closeConfig'),
63
- placement: 'bottom-start',
64
- zIndex: 41000
65
- }"
66
- :class="iconClass"
67
- >
68
- <IconifyIconOffline
69
- class="dark:text-white"
70
- width="18px"
71
- height="18px"
72
- icon="ri:close-line"
73
- @click="show = !show"
74
- />
75
- </span>
76
- </div>
77
- <el-scrollbar>
78
- <slot />
79
- </el-scrollbar>
80
-
81
- <div
82
- class="flex justify-end p-3 border-0 border-t-[1px] border-solid border-[var(--pure-border-color)]"
83
- >
84
- <el-button
85
- v-tippy="{
86
- content: $t('message.tip.toLogin'),
87
- placement: 'left-start',
88
- zIndex: 41000
89
- }"
90
- type="danger"
91
- text
92
- bg
93
- @click="onReset"
94
- >
95
- {{ $t('message.tip.clearCache') }}
96
- </el-button>
97
- </div>
98
- </div>
99
- </div>
100
- </template>
101
-
102
- <style lang="scss" scoped>
103
- :deep(.el-scrollbar) {
104
- height: calc(100vh - 110px);
105
- }
106
-
107
- .right-panel-background {
108
- position: fixed;
109
- top: 0;
110
- left: 0;
111
- z-index: -1;
112
- background: rgb(0 0 0 / 20%);
113
- opacity: 0;
114
- transition: opacity 0.3s cubic-bezier(0.7, 0.3, 0.1, 1);
115
- }
116
-
117
- .right-panel {
118
- position: fixed;
119
- top: 0;
120
- right: 0;
121
- z-index: 400000;
122
- width: 100%;
123
- max-width: 300px;
124
- box-shadow: 0 0 15px 0 rgb(0 0 0 / 5%);
125
- transform: translate(100%);
126
- transition: all 0.25s cubic-bezier(0.7, 0.3, 0.1, 1);
127
- }
128
-
129
- .show {
130
- transition: all 0.3s cubic-bezier(0.7, 0.3, 0.1, 1);
131
-
132
- .right-panel-background {
133
- z-index: 20000;
134
- width: 100%;
135
- height: 100%;
136
- opacity: 1;
137
- }
138
-
139
- .right-panel {
140
- transform: translate(0);
141
- }
142
- }
143
-
144
- .project-configuration {
145
- display: flex;
146
- align-items: center;
147
- justify-content: space-between;
148
- padding: 14px 20px;
149
- }
150
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-12-23 17:33:20
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-07-31 10:15:40
6
+ * @Description: 个性化设置页面
7
+ -->
8
+ <script setup lang="ts">
9
+ import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
10
+ import { useDataThemeChange } from '../../hooks/useDataThemeChange';
11
+ import { onClickOutside } from '@vueuse/core';
12
+ import { emitter } from '../../../utils/mitt';
13
+
14
+ const target = ref(null);
15
+ const show = ref<Boolean>(false);
16
+
17
+ const iconClass = computed(() => {
18
+ return [
19
+ 'w-[22px]',
20
+ 'h-[22px]',
21
+ 'flex',
22
+ 'justify-center',
23
+ 'items-center',
24
+ 'outline-hidden',
25
+ 'rounded-[4px]',
26
+ 'cursor-pointer',
27
+ 'transition-colors',
28
+ 'hover:bg-[#0000000f]',
29
+ 'dark:hover:bg-[#ffffff1f]',
30
+ 'dark:hover:text-[#ffffffd9]'
31
+ ];
32
+ });
33
+
34
+ const { onReset } = useDataThemeChange();
35
+ onClickOutside(target, (event: any) => {
36
+ if (event.clientX > target.value.offsetLeft) return;
37
+ show.value = false;
38
+ });
39
+
40
+ onMounted(() => {
41
+ emitter.on('openPanel', () => {
42
+ show.value = true;
43
+ });
44
+ });
45
+
46
+ onBeforeUnmount(() => {
47
+ // 解绑`openPanel`公共事件,防止多次触发
48
+ emitter.off('openPanel');
49
+ });
50
+ </script>
51
+
52
+ <template>
53
+ <div :class="{ show }">
54
+ <div class="right-panel-background" />
55
+ <div ref="target" class="right-panel bg-bg_color bg-white">
56
+ <div
57
+ class="project-configuration border-0 border-b-[1px] border-solid border-[var(--pure-border-color)]"
58
+ >
59
+ <h4 class="dark:text-white">{{ $t('message.tip.projectConfig') }}</h4>
60
+ <span
61
+ v-tippy="{
62
+ content: $t('message.tip.closeConfig'),
63
+ placement: 'bottom-start',
64
+ zIndex: 41000
65
+ }"
66
+ :class="iconClass"
67
+ >
68
+ <IconifyIconOffline
69
+ class="dark:text-white"
70
+ width="18px"
71
+ height="18px"
72
+ icon="ri:close-line"
73
+ @click="show = !show"
74
+ />
75
+ </span>
76
+ </div>
77
+ <el-scrollbar>
78
+ <slot />
79
+ </el-scrollbar>
80
+
81
+ <div
82
+ class="flex justify-end p-3 border-0 border-t-[1px] border-solid border-[var(--pure-border-color)]"
83
+ >
84
+ <el-button
85
+ v-tippy="{
86
+ content: $t('message.tip.toLogin'),
87
+ placement: 'left-start',
88
+ zIndex: 41000
89
+ }"
90
+ type="danger"
91
+ text
92
+ bg
93
+ @click="onReset"
94
+ >
95
+ {{ $t('message.tip.clearCache') }}
96
+ </el-button>
97
+ </div>
98
+ </div>
99
+ </div>
100
+ </template>
101
+
102
+ <style lang="scss" scoped>
103
+ :deep(.el-scrollbar) {
104
+ height: calc(100vh - 110px);
105
+ }
106
+
107
+ .right-panel-background {
108
+ position: fixed;
109
+ top: 0;
110
+ left: 0;
111
+ z-index: -1;
112
+ background: rgb(0 0 0 / 20%);
113
+ opacity: 0;
114
+ transition: opacity 0.3s cubic-bezier(0.7, 0.3, 0.1, 1);
115
+ }
116
+
117
+ .right-panel {
118
+ position: fixed;
119
+ top: 0;
120
+ right: 0;
121
+ z-index: 400000;
122
+ width: 100%;
123
+ max-width: 300px;
124
+ box-shadow: 0 0 15px 0 rgb(0 0 0 / 5%);
125
+ transform: translate(100%);
126
+ transition: all 0.25s cubic-bezier(0.7, 0.3, 0.1, 1);
127
+ }
128
+
129
+ .show {
130
+ transition: all 0.3s cubic-bezier(0.7, 0.3, 0.1, 1);
131
+
132
+ .right-panel-background {
133
+ z-index: 20000;
134
+ width: 100%;
135
+ height: 100%;
136
+ opacity: 1;
137
+ }
138
+
139
+ .right-panel {
140
+ transform: translate(0);
141
+ }
142
+ }
143
+
144
+ .project-configuration {
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: space-between;
148
+ padding: 14px 20px;
149
+ }
150
+ </style>