@dt-frames/ui 2.0.1 → 2.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 (220) hide show
  1. package/es/assets/data/icons/actions.d.ts +1 -0
  2. package/es/assets/data/icons/actions.ts +423 -0
  3. package/es/assets/data/icons/code.d.ts +1 -0
  4. package/es/assets/data/icons/code.ts +10 -0
  5. package/es/assets/data/icons/commuticate.d.ts +1 -0
  6. package/es/assets/data/icons/commuticate.ts +182 -0
  7. package/es/assets/data/icons/currency.d.ts +1 -0
  8. package/es/assets/data/icons/currency.ts +44 -0
  9. package/es/assets/data/icons/devices.d.ts +1 -0
  10. package/es/assets/data/icons/devices.ts +126 -0
  11. package/es/assets/data/icons/edit.d.ts +1 -0
  12. package/es/assets/data/icons/edit.ts +163 -0
  13. package/es/assets/data/icons/file.d.ts +1 -0
  14. package/es/assets/data/icons/file.ts +99 -0
  15. package/es/assets/data/icons/math.d.ts +1 -0
  16. package/es/assets/data/icons/math.ts +53 -0
  17. package/es/assets/data/icons/message.d.ts +1 -0
  18. package/es/assets/data/icons/message.ts +68 -0
  19. package/es/assets/data/icons/navigate.d.ts +1 -0
  20. package/es/assets/data/icons/navigate.ts +181 -0
  21. package/es/assets/data/icons/other.d.ts +1 -0
  22. package/es/assets/data/icons/other.ts +324 -0
  23. package/es/assets/data/index.d.ts +4 -0
  24. package/es/assets/data/index.ts +58 -0
  25. package/es/assets/icons/iconfont.css +7266 -0
  26. package/es/assets/icons/iconfont.eot +0 -0
  27. package/es/assets/icons/iconfont.svg +5445 -0
  28. package/es/assets/icons/iconfont.ttf +0 -0
  29. package/es/assets/icons/iconfont.woff +0 -0
  30. package/es/assets/icons/iconfont.woff2 +0 -0
  31. package/es/assets/imgs/header/avatar.png +0 -0
  32. package/es/assets/imgs/logo/logo.png +0 -0
  33. package/es/assets/imgs/table/empty.png +0 -0
  34. package/es/assets/locales/en.d.ts +101 -0
  35. package/es/assets/locales/en.ts +101 -0
  36. package/es/assets/locales/index.d.ts +2 -0
  37. package/es/assets/locales/index.ts +5 -0
  38. package/es/assets/locales/zh.d.ts +103 -0
  39. package/es/assets/locales/zh.ts +103 -0
  40. package/es/components/container/index.d.ts +93 -0
  41. package/es/components/container/index.js +288 -0
  42. package/es/components/container/index.less +64 -0
  43. package/es/components/container/src/components/bar.d.ts +14 -0
  44. package/es/components/container/src/components/scroll-bar.d.ts +70 -0
  45. package/es/components/container/src/hooks/scroll.d.ts +10 -0
  46. package/es/components/container/src/scroll-container.d.ts +76 -0
  47. package/es/components/container/src/slot-container.d.ts +18 -0
  48. package/es/components/container/src/types/scroll.type.d.ts +22 -0
  49. package/es/components/container/src/utils/scroll.d.ts +5 -0
  50. package/es/components/curd/index.d.ts +2 -0
  51. package/es/components/curd/index.js +3098 -0
  52. package/es/components/curd/src/components/Curd.d.ts +1451 -0
  53. package/es/components/curd/src/hooks/useCurd.d.ts +112 -0
  54. package/es/components/curd/src/props.d.ts +188 -0
  55. package/es/components/curd/src/types/curd.type.d.ts +19 -0
  56. package/es/components/drawer/index.d.ts +8041 -0
  57. package/es/components/drawer/index.js +837 -0
  58. package/es/components/drawer/index.less +10 -0
  59. package/es/components/drawer/src/components/DrawerFooter.d.ts +139 -0
  60. package/es/components/drawer/src/components/DrawerHeader.d.ts +13 -0
  61. package/es/components/drawer/src/hooks/useDrawer.d.ts +3 -0
  62. package/es/components/drawer/src/index.d.ts +8043 -0
  63. package/es/components/drawer/src/props.d.ts +64 -0
  64. package/es/components/drawer/src/types/index.type.d.ts +48 -0
  65. package/es/components/form/index.d.ts +3367 -0
  66. package/es/components/form/index.js +1895 -0
  67. package/es/components/form/index.less +141 -0
  68. package/es/components/form/src/components/FormButtons.d.ts +88 -0
  69. package/es/components/form/src/components/FormItem.d.ts +313 -0
  70. package/es/components/form/src/components/componentMap.d.ts +4 -0
  71. package/es/components/form/src/components/formIcon.d.ts +1231 -0
  72. package/es/components/form/src/components/formInputUseDialog.d.ts +911 -0
  73. package/es/components/form/src/components/index.d.ts +4 -0
  74. package/es/components/form/src/components/radioButton.d.ts +34 -0
  75. package/es/components/form/src/enums/index.d.ts +7 -0
  76. package/es/components/form/src/hooks/helper.d.ts +14 -0
  77. package/es/components/form/src/hooks/useForm.d.ts +6 -0
  78. package/es/components/form/src/hooks/useFormActions.d.ts +12 -0
  79. package/es/components/form/src/hooks/useFormEvent.d.ts +25 -0
  80. package/es/components/form/src/hooks/useFormValue.d.ts +3 -0
  81. package/es/components/form/src/hooks/useFormValues.d.ts +11 -0
  82. package/es/components/form/src/hooks/useLabelWidth.d.ts +22 -0
  83. package/es/components/form/src/index.d.ts +3113 -0
  84. package/es/components/form/src/props.d.ts +133 -0
  85. package/es/components/form/src/types/actions.type.d.ts +15 -0
  86. package/es/components/form/src/types/form.type.d.ts +70 -0
  87. package/es/components/icons/index.d.ts +3 -0
  88. package/es/components/icons/index.js +1969 -0
  89. package/es/components/icons/index.less +42 -0
  90. package/es/components/icons/src/pick-icon.d.ts +455 -0
  91. package/es/components/icons/src/svg-icon.d.ts +44 -0
  92. package/es/components/modal/index.d.ts +3 -0
  93. package/es/components/modal/index.js +1192 -0
  94. package/es/components/modal/index.less +54 -0
  95. package/es/components/modal/src/components/CloseIcon.d.ts +40 -0
  96. package/es/components/modal/src/components/Modal.d.ts +215 -0
  97. package/es/components/modal/src/components/ModalFooter.d.ts +139 -0
  98. package/es/components/modal/src/components/ModalWrap.d.ts +153 -0
  99. package/es/components/modal/src/hooks/useDrag.d.ts +7 -0
  100. package/es/components/modal/src/hooks/useFullScreen.d.ts +6 -0
  101. package/es/components/modal/src/hooks/useModal.d.ts +5 -0
  102. package/es/components/modal/src/index.d.ts +881 -0
  103. package/es/components/modal/src/props.d.ts +100 -0
  104. package/es/components/modal/src/types/modal.type.d.ts +17 -0
  105. package/es/components/source/hooks/useDownload.d.ts +8 -0
  106. package/es/components/source/hooks/useSource.d.ts +40 -0
  107. package/es/components/source/index.d.ts +2 -0
  108. package/es/components/source/index.js +331 -0
  109. package/es/components/source/types/source.type.d.ts +37 -0
  110. package/es/components/source/utils/index.d.ts +8 -0
  111. package/es/components/table/index.d.ts +3 -0
  112. package/es/components/table/index.js +4414 -0
  113. package/es/components/table/index.less +183 -0
  114. package/es/components/table/src/components/TableAction.d.ts +70 -0
  115. package/es/components/table/src/components/TableHeader.d.ts +1243 -0
  116. package/es/components/table/src/components/TableRender.d.ts +13 -0
  117. package/es/components/table/src/components/editTable/CellComponent.d.ts +22 -0
  118. package/es/components/table/src/components/editTable/EditTableCell.d.ts +93 -0
  119. package/es/components/table/src/components/editTable/componentMap.d.ts +4 -0
  120. package/es/components/table/src/components/editTable/index.d.ts +9 -0
  121. package/es/components/table/src/components/editTable/props.d.ts +27 -0
  122. package/es/components/table/src/components/tableSetting/Column.d.ts +69 -0
  123. package/es/components/table/src/components/tableSetting/Download.d.ts +1029 -0
  124. package/es/components/table/src/components/tableSetting/DownloadCtrl.d.ts +995 -0
  125. package/es/components/table/src/components/tableSetting/Fullscreen.d.ts +22 -0
  126. package/es/components/table/src/components/tableSetting/index.d.ts +1137 -0
  127. package/es/components/table/src/hooks/useColumns.d.ts +14 -0
  128. package/es/components/table/src/hooks/useCustomRow.d.ts +20 -0
  129. package/es/components/table/src/hooks/useDataSource.d.ts +16 -0
  130. package/es/components/table/src/hooks/useHeader.d.ts +8 -0
  131. package/es/components/table/src/hooks/useHeaderCode.d.ts +3 -0
  132. package/es/components/table/src/hooks/useLoading.d.ts +6 -0
  133. package/es/components/table/src/hooks/usePagination.d.ts +122 -0
  134. package/es/components/table/src/hooks/useRow.d.ts +5 -0
  135. package/es/components/table/src/hooks/useRowSelection.d.ts +12 -0
  136. package/es/components/table/src/hooks/useTable.d.ts +9 -0
  137. package/es/components/table/src/hooks/useTableInstance.d.ts +16 -0
  138. package/es/components/table/src/hooks/useTableScroll.d.ts +13 -0
  139. package/es/components/table/src/index.d.ts +990 -0
  140. package/es/components/table/src/props.d.ts +244 -0
  141. package/es/components/table/src/types/actions.type.d.ts +22 -0
  142. package/es/components/table/src/types/header.type.d.ts +23 -0
  143. package/es/components/table/src/types/table.type.d.ts +92 -0
  144. package/es/directives/icon.d.ts +2 -0
  145. package/es/directives/index.d.ts +7 -0
  146. package/es/directives/index.js +2015 -0
  147. package/es/directives/permission.d.ts +2 -0
  148. package/es/global.d.ts +7 -0
  149. package/es/index.d.ts +1 -0
  150. package/es/index.js +3242 -0
  151. package/es/theme/index.d.ts +10 -0
  152. package/es/theme/index.js +3242 -0
  153. package/es/theme/index.less +603 -0
  154. package/es/theme/src/components/content/index.d.ts +27 -0
  155. package/es/theme/src/components/feature/back-top.d.ts +5 -0
  156. package/es/theme/src/components/feature/index.d.ts +7 -0
  157. package/es/theme/src/components/footer/index.d.ts +31 -0
  158. package/es/theme/src/components/header/components/bread-crumb.d.ts +6 -0
  159. package/es/theme/src/components/header/components/fullscreen.d.ts +5 -0
  160. package/es/theme/src/components/header/components/index.d.ts +11 -0
  161. package/es/theme/src/components/header/components/lang-picker.d.ts +23 -0
  162. package/es/theme/src/components/header/components/logo.d.ts +36 -0
  163. package/es/theme/src/components/header/components/menu-filter.d.ts +22 -0
  164. package/es/theme/src/components/header/components/notify.d.ts +23 -0
  165. package/es/theme/src/components/header/components/setting-theme.d.ts +222 -0
  166. package/es/theme/src/components/header/components/size.d.ts +282 -0
  167. package/es/theme/src/components/header/components/theme-drawer/feature.d.ts +138 -0
  168. package/es/theme/src/components/header/components/theme-drawer/index.d.ts +3 -0
  169. package/es/theme/src/components/header/components/theme-drawer/menu-type.d.ts +16 -0
  170. package/es/theme/src/components/header/components/theme-drawer/select.d.ts +58 -0
  171. package/es/theme/src/components/header/components/theme-drawer/switch.d.ts +49 -0
  172. package/es/theme/src/components/header/components/trigger.d.ts +10 -0
  173. package/es/theme/src/components/header/components/user-info.d.ts +36 -0
  174. package/es/theme/src/components/header/helper/change-theme.d.ts +13 -0
  175. package/es/theme/src/components/header/helper/menu-tree.d.ts +3 -0
  176. package/es/theme/src/components/header/index.d.ts +698 -0
  177. package/es/theme/src/components/header/multiple-header.d.ts +787 -0
  178. package/es/theme/src/components/sider/components/basic-menu/basic-menu-item.d.ts +62 -0
  179. package/es/theme/src/components/sider/components/basic-menu/basic-menu.d.ts +207 -0
  180. package/es/theme/src/components/sider/components/basic-menu/basic-sub-menu-item.d.ts +127 -0
  181. package/es/theme/src/components/sider/components/basic-menu/menu-item-content.d.ts +26 -0
  182. package/es/theme/src/components/sider/components/drag-bar.d.ts +14 -0
  183. package/es/theme/src/components/sider/components/layout-menu.d.ts +22 -0
  184. package/es/theme/src/components/sider/components/props.d.ts +69 -0
  185. package/es/theme/src/components/sider/components/sider-trigger.d.ts +18 -0
  186. package/es/theme/src/components/sider/helper/sider.d.ts +12 -0
  187. package/es/theme/src/components/sider/helper/split-menu.d.ts +10 -0
  188. package/es/theme/src/components/sider/index.d.ts +70 -0
  189. package/es/theme/src/components/tabs/components/TabContent.d.ts +6 -0
  190. package/es/theme/src/components/tabs/components/TabRedo.d.ts +21 -0
  191. package/es/theme/src/components/tabs/components/index.d.ts +3 -0
  192. package/es/theme/src/components/tabs/hooks/useMultifyTabs.d.ts +7 -0
  193. package/es/theme/src/components/tabs/hooks/useTabDropdown.d.ts +6 -0
  194. package/es/theme/src/components/tabs/index.d.ts +63 -0
  195. package/es/theme/src/components/tabs/types/tabs.type.d.ts +7 -0
  196. package/es/theme/src/enums/index.d.ts +1 -0
  197. package/es/theme/src/enums/theme.enum.d.ts +33 -0
  198. package/es/theme/src/hooks/index.d.ts +6 -0
  199. package/es/theme/src/hooks/useDragLine.d.ts +2 -0
  200. package/es/theme/src/hooks/useHeader.d.ts +25 -0
  201. package/es/theme/src/hooks/useMenu.d.ts +27 -0
  202. package/es/theme/src/hooks/useMultifyTab.d.ts +7 -0
  203. package/es/theme/src/hooks/useOpenKeys.d.ts +7 -0
  204. package/es/theme/src/hooks/useTheme.d.ts +9 -0
  205. package/es/theme/src/index.d.ts +1644 -0
  206. package/es/theme/src/setting/theme.setting.d.ts +2 -0
  207. package/es/theme/src/stores/index.d.ts +3 -0
  208. package/es/theme/src/stores/routeReuse.store.d.ts +23 -0
  209. package/es/theme/src/stores/theme.store.d.ts +15 -0
  210. package/es/theme/src/types/index.d.ts +3 -0
  211. package/es/theme/src/types/menu.type.d.ts +15 -0
  212. package/es/theme/src/types/theme.type.d.ts +60 -0
  213. package/es/utils/withInstall.d.ts +4 -0
  214. package/index.d.ts +10 -0
  215. package/index.js +34 -0
  216. package/package.json +1 -5
  217. package/tailwind.config.cjs +11 -0
  218. package/tsconfig.json +41 -0
  219. package/tsconfig.node.json +9 -0
  220. package/vite.config.ts +78 -0
@@ -0,0 +1,4414 @@
1
+ import { DtCache, CacheKey, deepMerge, Pages, useGo, useRedo, Language, useAppStore, useSlots as useSlots$1, error, http, useApp, getDynamicProps, isBoolean, isFunction, getPopupContainer, useI18n, isNumber, isArray, isObject, isString, isNull, dispatchResize, useTimeoutFn, off, on, windowResizeFn, useMessage, isNullAndUnDef, getDictValueByCode, formatNumber, isVnode } from "@dt-frames/core";
2
+ import { toRaw as toRaw$1, unref as unref$1, computed as computed$1, defineComponent as defineComponent$1, resolveDirective, openBlock, createElementBlock, Fragment, renderList, withDirectives, createVNode, withCtx, createTextVNode, toDisplayString, createElementVNode, normalizeClass, normalizeStyle, createCommentVNode, createBlock, provide as provide$1, inject, mergeProps, ref as ref$1, watch as watch$1, getCurrentInstance as getCurrentInstance$1, reactive as reactive$1, readonly, watchEffect as watchEffect$1, nextTick as nextTick$1, isRef, useAttrs as useAttrs$1, normalizeProps, guardReactiveProps, isVNode, onUnmounted as onUnmounted$1, h as h$1, resolveDynamicComponent, renderSlot, createSlots } from "vue";
3
+ import { defineStore } from "pinia";
4
+ import { Tooltip, MenuItem, Menu, Dropdown, RadioButton, RadioGroup, Button, FormItem as FormItem$1, Col as Col$1, Spin, Checkbox as Checkbox$1, Divider as Divider$1, Row, CheckboxGroup, Popover as Popover$1, Table } from "ant-design-vue/es";
5
+ import { omit, cloneDeep, isEqual, upperFirst } from "lodash-es";
6
+ import { useDebounceFn, useFullscreen, isFunction as isFunction$1 } from "@vueuse/core";
7
+ import { Input, InputNumber, Select, TreeSelect, Switch, Checkbox, DatePicker, TimePicker, Popover, Radio, AutoComplete, Cascader, Slider, Rate, Divider, Col, Tooltip as Tooltip$1, Form, FormItem, Modal as Modal$1 } from "ant-design-vue";
8
+ import "ant-design-vue/es/form/style";
9
+ import "ant-design-vue/es/button/style";
10
+ import "ant-design-vue/es/checkbox/style";
11
+ import "ant-design-vue/es/popover/style";
12
+ import Sortablejs from "sortablejs";
13
+ import dayjs from "dayjs";
14
+ var Theme = /* @__PURE__ */ ((Theme2) => {
15
+ Theme2["DARK"] = "dark";
16
+ Theme2["LIGHT"] = "light";
17
+ return Theme2;
18
+ })(Theme || {});
19
+ var MenuType = /* @__PURE__ */ ((MenuType2) => {
20
+ MenuType2["SIDE"] = "sidebar";
21
+ MenuType2["TOP_MENU"] = "top-menu";
22
+ MenuType2["MIX"] = "mix";
23
+ return MenuType2;
24
+ })(MenuType || {});
25
+ var MenuMode = /* @__PURE__ */ ((MenuMode2) => {
26
+ MenuMode2["INLINE"] = "inline";
27
+ MenuMode2["HORIZONTAL"] = "horizontal";
28
+ MenuMode2["VERTICAL"] = "vertical";
29
+ return MenuMode2;
30
+ })(MenuMode || {});
31
+ var ContentMode = /* @__PURE__ */ ((ContentMode2) => {
32
+ ContentMode2["FULL"] = "full";
33
+ ContentMode2["FIXED"] = "fixed";
34
+ return ContentMode2;
35
+ })(ContentMode || {});
36
+ var UiSize = /* @__PURE__ */ ((UiSize2) => {
37
+ UiSize2["LARGE"] = "large";
38
+ UiSize2["MIDDLE"] = "middle";
39
+ UiSize2["SMALL"] = "small";
40
+ return UiSize2;
41
+ })(UiSize || {});
42
+ const defaultThemeConf = {
43
+ content: {
44
+ contentMode: ContentMode.FULL
45
+ },
46
+ headOptions: {
47
+ fixed: true,
48
+ theme: Theme.LIGHT,
49
+ showLogo: true,
50
+ showBackToTop: true,
51
+ useLockPage: true,
52
+ size: UiSize.SMALL,
53
+ showSize: true,
54
+ showBreadCrumb: true,
55
+ showFullScreen: true,
56
+ showSearch: true,
57
+ showNotice: true,
58
+ showLocaleSwitch: true,
59
+ showSettingTheme: true,
60
+ showLoginOut: true
61
+ },
62
+ menuOptions: {
63
+ fixed: true,
64
+ theme: Theme.DARK,
65
+ collapsed: false,
66
+ collapsedShowTitle: false,
67
+ canDrag: true,
68
+ show: true,
69
+ hidden: false,
70
+ split: false,
71
+ menuWidth: 240,
72
+ trigger: true,
73
+ type: MenuType.SIDE,
74
+ mode: MenuMode.INLINE
75
+ },
76
+ footerOptions: {
77
+ show: false,
78
+ height: 48,
79
+ title: "Copyright(C) 2021 by www.ithinkdt.com. All rights reserved.",
80
+ subTitle: "Privacy Statement"
81
+ },
82
+ routeReuse: {
83
+ show: true,
84
+ cache: true,
85
+ canDrag: true,
86
+ showQuick: true,
87
+ showRedo: true,
88
+ showFold: true
89
+ }
90
+ };
91
+ const useThemeStore = defineStore({
92
+ id: "dt-theme",
93
+ state: () => ({
94
+ themeConf: DtCache.getLocal(CacheKey.THEME) ?? defaultThemeConf,
95
+ pageLoading: false
96
+ }),
97
+ getters: {
98
+ getThemeConf() {
99
+ return this.themeConf;
100
+ },
101
+ getHeaderConf() {
102
+ return this.themeConf.headOptions;
103
+ },
104
+ getMenuConf() {
105
+ return this.themeConf.menuOptions;
106
+ },
107
+ getFooterConf() {
108
+ return this.themeConf.footerOptions;
109
+ },
110
+ getRouteReuseConf() {
111
+ return this.themeConf.routeReuse;
112
+ },
113
+ getPageLoading() {
114
+ return this.pageLoading;
115
+ }
116
+ },
117
+ actions: {
118
+ setThemeConf(options = {}) {
119
+ let newThemeConf = deepMerge(this.themeConf, options);
120
+ this.themeConf = deepMerge(defaultThemeConf, newThemeConf);
121
+ DtCache.setLocal(CacheKey.THEME, this.themeConf);
122
+ }
123
+ }
124
+ });
125
+ defineStore({
126
+ id: "route-reuse",
127
+ state: () => ({
128
+ cacheTabList: /* @__PURE__ */ new Set(),
129
+ tabList: DtCache.getLocal(CacheKey.THEME)?.routeReuse?.cache ? DtCache.getLocal(CacheKey.ROUTE_REUSE) || [] : [],
130
+ lastDragEndIndex: 0
131
+ }),
132
+ getters: {
133
+ getTabList() {
134
+ return this.tabList;
135
+ },
136
+ getCachedTabList() {
137
+ return Array.from(this.cacheTabList);
138
+ },
139
+ getLastDragEndIndex() {
140
+ return this.lastDragEndIndex;
141
+ }
142
+ },
143
+ actions: {
144
+ async addTab(route) {
145
+ const { path, name, fullPath, params, query, meta } = route;
146
+ if (path === Pages.NOT_FOUND || path === Pages.LOGIN || path === Pages.BASE_PAGE) {
147
+ return;
148
+ }
149
+ let updateIndex = -1;
150
+ const tabHasExits = this.tabList.some((tab, index2) => {
151
+ updateIndex = index2;
152
+ return (tab.fullPath || tab.path) === (fullPath || path);
153
+ });
154
+ if (tabHasExits) {
155
+ const curTab = toRaw$1(this.tabList)[updateIndex];
156
+ curTab.params = params || curTab.params;
157
+ curTab.query = query || curTab.query;
158
+ curTab.fullPath = fullPath || curTab.fullPath;
159
+ this.tabList.splice(updateIndex, 1, curTab);
160
+ } else {
161
+ this.tabList.push(JSON.parse(JSON.stringify(route)));
162
+ }
163
+ this.updateCacheTab();
164
+ },
165
+ closeTab(path, router) {
166
+ const go = useGo(router);
167
+ const index2 = this.tabList.findIndex((item) => item.path === path);
168
+ let page;
169
+ if (index2 === 0) {
170
+ if (this.tabList.length !== 1) {
171
+ page = this.tabList[index2 + 1];
172
+ }
173
+ } else {
174
+ page = this.tabList[index2 - 1];
175
+ }
176
+ this.bulkCloseTabs([path]);
177
+ this.updateCacheTab();
178
+ path === router.currentRoute.value.path && go(page.path);
179
+ },
180
+ closeAllTab(currentRoute, router) {
181
+ const go = useGo(router);
182
+ let filterTabList = this.tabList.filter((item) => item?.meta?.affix ?? false);
183
+ const route = filterTabList.length > 0 ? filterTabList[filterTabList.length - 1] : unref$1(currentRoute);
184
+ this.tabList = [route];
185
+ this.updateCacheTab();
186
+ go(route.path);
187
+ },
188
+ closeLeftTabs(path) {
189
+ const index2 = this.tabList.findIndex((item) => item.path === path);
190
+ if (index2 > 0) {
191
+ const leftTabs = this.tabList.slice(0, index2);
192
+ const pathList = [];
193
+ for (const item of leftTabs) {
194
+ const affix = item?.meta?.affix ?? false;
195
+ if (!affix) {
196
+ pathList.push(item.fullPath);
197
+ }
198
+ }
199
+ this.bulkCloseTabs(pathList);
200
+ }
201
+ this.updateCacheTab();
202
+ },
203
+ closeRightTabs(path) {
204
+ const index2 = this.tabList.findIndex((item) => item.path === path);
205
+ if (index2 >= 0 && index2 < this.tabList.length - 1) {
206
+ const rightTabs = this.tabList.slice(index2 + 1, this.tabList.length);
207
+ const pathList = [];
208
+ for (const item of rightTabs) {
209
+ const affix = item?.meta?.affix ?? false;
210
+ if (!affix) {
211
+ pathList.push(item.fullPath);
212
+ }
213
+ }
214
+ this.bulkCloseTabs(pathList);
215
+ }
216
+ this.updateCacheTab();
217
+ },
218
+ closeOtherTabs(path) {
219
+ const pathList = [];
220
+ for (let item of this.tabList) {
221
+ const affix = item?.meta?.affix ?? false;
222
+ if (item.path !== path && !affix) {
223
+ pathList.push(item.path);
224
+ }
225
+ }
226
+ this.bulkCloseTabs(pathList);
227
+ this.updateCacheTab();
228
+ },
229
+ bulkCloseTabs(pathList) {
230
+ this.tabList = this.tabList.filter((item) => !pathList.includes(item.fullPath));
231
+ },
232
+ updateCacheTab() {
233
+ const cacheTab = DtCache.getLocal(CacheKey.THEME)?.routeReuse?.cache;
234
+ cacheTab && DtCache.setLocal(CacheKey.ROUTE_REUSE, this.tabList);
235
+ const cacheMap = /* @__PURE__ */ new Set();
236
+ for (const tab of this.tabList) {
237
+ if (tab.meta?.hideTab) {
238
+ continue;
239
+ }
240
+ const name = tab.name;
241
+ cacheMap.add(name);
242
+ }
243
+ this.cacheTabList = cacheMap;
244
+ },
245
+ async refreshPage(router) {
246
+ const findTab = this.getCachedTabList.find((item) => item === unref$1(router.currentRoute).name);
247
+ if (findTab) {
248
+ this.cacheTabList.delete(findTab.toString());
249
+ }
250
+ const redo = useRedo(router);
251
+ await redo();
252
+ },
253
+ sortTabs(oldIndex, newIndex) {
254
+ const currentTab = this.tabList[oldIndex];
255
+ this.tabList.splice(oldIndex, 1);
256
+ this.tabList.splice(newIndex, 0, currentTab);
257
+ this.lastDragEndIndex = this.lastDragEndIndex + 1;
258
+ }
259
+ }
260
+ });
261
+ function useMenu() {
262
+ const { getMenuConf, setThemeConf } = useThemeStore();
263
+ const getCollapsedShowTitle = computed$1(() => getMenuConf.collapsedShowTitle);
264
+ const getIsSidebarType = computed$1(() => getMenuConf.type === MenuType.SIDE);
265
+ const getMenuFixed = computed$1(() => getMenuConf.fixed);
266
+ const getShowMenu = computed$1(() => getMenuConf.show);
267
+ const getShowSidebar = computed$1(() => {
268
+ return unref$1(getSplit) || unref$1(getShowMenu) && unref$1(getMenuMode) !== MenuMode.HORIZONTAL;
269
+ });
270
+ const getMenuHidden = computed$1(() => getMenuConf.hidden);
271
+ const getMenuTheme = computed$1(() => getMenuConf.theme);
272
+ const getTrigger = computed$1(() => getMenuConf.trigger);
273
+ const getCanDrag = computed$1(() => getMenuConf.canDrag);
274
+ const getIsMixMode = computed$1(() => {
275
+ return unref$1(getMenuMode) === MenuMode.INLINE && unref$1(getMenuType) === MenuType.MIX;
276
+ });
277
+ const getMenuWidth = computed$1(() => unref$1(getIsMixMode) ? Number(getMenuConf.menuWidth) - 40 : getMenuConf.menuWidth);
278
+ const getLogoWidth = computed$1(() => getMenuConf.menuWidth);
279
+ const getMenuType = computed$1(() => getMenuConf.type);
280
+ const getIsTopMenu = computed$1(() => unref$1(getMenuType) === MenuType.TOP_MENU);
281
+ const getMenuMode = computed$1(() => getMenuConf.mode);
282
+ const getSplit = computed$1(() => getMenuConf.split);
283
+ const getCollapsed = computed$1(() => getMenuConf.collapsed);
284
+ const getIsHorizontal = computed$1(() => unref$1(getMenuMode) === MenuMode.HORIZONTAL);
285
+ const setThemeStore = (conf = {}) => setThemeConf(conf);
286
+ const toggleCollapsed = () => setThemeStore({
287
+ menuOptions: {
288
+ collapsed: !unref$1(getCollapsed)
289
+ }
290
+ });
291
+ const getMiniWidthNumber = computed$1(() => getMenuConf.collapsedShowTitle ? 80 : 48);
292
+ const getRealWidth = computed$1(() => {
293
+ return unref$1(getCollapsed) ? unref$1(getMiniWidthNumber) : unref$1(getMenuWidth);
294
+ });
295
+ const getCalcContentWidth = computed$1(() => {
296
+ const width = unref$1(getIsTopMenu) || !unref$1(getShowMenu) || unref$1(getSplit) && unref$1(getMenuHidden) ? 0 : unref$1(getRealWidth);
297
+ return `calc(100% - ${unref$1(width)}px)`;
298
+ });
299
+ return {
300
+ getCollapsedShowTitle,
301
+ getIsSidebarType,
302
+ getMenuFixed,
303
+ getShowMenu,
304
+ getShowSidebar,
305
+ getMenuHidden,
306
+ getMenuTheme,
307
+ getTrigger,
308
+ getMenuWidth,
309
+ getLogoWidth,
310
+ getMenuType,
311
+ getIsTopMenu,
312
+ getMenuMode,
313
+ getSplit,
314
+ getCollapsed,
315
+ getIsHorizontal,
316
+ getMiniWidthNumber,
317
+ getRealWidth,
318
+ getCalcContentWidth,
319
+ getIsMixMode,
320
+ getCanDrag,
321
+ toggleCollapsed,
322
+ setThemeStore
323
+ };
324
+ }
325
+ function useMultipleTab() {
326
+ const { getRouteReuseConf } = useThemeStore();
327
+ const getShowMultipleTab = computed(() => getRouteReuseConf.show);
328
+ const getShowQuick = computed(() => getRouteReuseConf.showQuick);
329
+ const getShowRedo = computed(() => getRouteReuseConf.showRedo);
330
+ const getCanCache = computed(() => getRouteReuseConf.cache);
331
+ const getCanDrag = computed(() => getRouteReuseConf.canDrag);
332
+ return {
333
+ getShowMultipleTab,
334
+ getShowQuick,
335
+ getShowRedo,
336
+ getCanCache,
337
+ getCanDrag
338
+ };
339
+ }
340
+ function useHeader() {
341
+ const HEADER_HEIGHT = 48;
342
+ const TABS_HEIGHT = 33;
343
+ const { getHeaderConf = {} } = useThemeStore();
344
+ const {
345
+ getIsSidebarType,
346
+ getMenuType,
347
+ getShowMenu,
348
+ getMenuHidden,
349
+ getTrigger,
350
+ getMenuMode,
351
+ getSplit,
352
+ getIsTopMenu,
353
+ getIsMixMode
354
+ } = useMenu();
355
+ const { getShowMultipleTab } = useMultipleTab();
356
+ const getHeaderTheme = computed$1(() => getHeaderConf.theme);
357
+ const getFixed = computed$1(() => getHeaderConf.fixed);
358
+ const getShowHeaderLogo = computed$1(() => unref$1(getShowLogo) && !unref$1(getIsSidebarType));
359
+ const getShowSearch = computed$1(() => getHeaderConf.showSearch);
360
+ const getShowHeaderTrigger = computed$1(() => {
361
+ if (unref$1(getMenuType) === MenuType.TOP_MENU || !unref$1(getShowMenu) || unref$1(getMenuHidden)) {
362
+ return false;
363
+ }
364
+ return unref$1(getTrigger);
365
+ });
366
+ const getShowBreadCrumb = computed$1(() => getHeaderConf.showBreadCrumb);
367
+ const getShowBread = computed$1(
368
+ () => unref$1(getMenuMode) !== MenuMode.HORIZONTAL && !unref$1(getSplit) && unref$1(getShowBreadCrumb)
369
+ );
370
+ const getShowTopMenu = computed$1(() => unref$1(getMenuMode) === MenuMode.HORIZONTAL || unref$1(getSplit));
371
+ const getShowNotice = computed$1(() => getHeaderConf.showNotice);
372
+ const getShowFullScreen = computed$1(() => getHeaderConf.showFullScreen);
373
+ const getShowLocale = computed$1(() => getHeaderConf.showLocaleSwitch);
374
+ const getShowSettingTheme = computed$1(() => getHeaderConf.showSettingTheme);
375
+ const getShowFullHeaderRef = computed$1(() => {
376
+ return !unref$1(getIsSidebarType) && !unref$1(getIsTopMenu);
377
+ });
378
+ const getHeaderHeight = computed$1(() => {
379
+ let height = 0;
380
+ height += HEADER_HEIGHT;
381
+ if (unref$1(getShowMultipleTab) && !unref$1(getSplit)) {
382
+ height += TABS_HEIGHT;
383
+ }
384
+ return height;
385
+ });
386
+ const getTabsHeight = computed$1(() => TABS_HEIGHT);
387
+ const getShowInsetHeaderRef = computed$1(() => {
388
+ return unref$1(getIsSidebarType) || unref$1(getIsTopMenu);
389
+ });
390
+ const getShowBackToTop = computed$1(() => getHeaderConf.showBackToTop);
391
+ const getIsZH = computed$1(() => {
392
+ let local = DtCache.getLocal(CacheKey.LOCALE);
393
+ if (!local)
394
+ return true;
395
+ return local === Language.ZH;
396
+ });
397
+ const getUiSize = computed$1(() => getHeaderConf?.size ?? UiSize.SMALL);
398
+ const getShowUiSize = computed$1(() => getHeaderConf?.showSize);
399
+ const getShowLogo = computed$1(() => getHeaderConf.showLogo);
400
+ const getShowLoginOut = computed$1(() => getHeaderConf.showLoginOut);
401
+ const loginOutClick = getHeaderConf.logoutClick;
402
+ return {
403
+ getHeaderTheme,
404
+ getFixed,
405
+ getShowSearch,
406
+ getShowHeaderLogo,
407
+ getShowHeaderTrigger,
408
+ getShowBread,
409
+ getShowTopMenu,
410
+ getShowFullScreen,
411
+ getShowLocale,
412
+ getShowSettingTheme,
413
+ getShowNotice,
414
+ getShowFullHeaderRef,
415
+ getHeaderHeight,
416
+ getTabsHeight,
417
+ getShowInsetHeaderRef,
418
+ getShowBackToTop,
419
+ getIsZH,
420
+ getUiSize,
421
+ getShowLogo,
422
+ getShowLoginOut,
423
+ getShowUiSize,
424
+ loginOutClick
425
+ };
426
+ }
427
+ const codeMap = /* @__PURE__ */ new Map();
428
+ function useHeaderCode(code, changeColumns) {
429
+ const { appConf } = useAppStore();
430
+ const { getIsZH } = useHeader();
431
+ useSlots$1();
432
+ useSlots();
433
+ if (!appConf.pages.queryColumnApi) {
434
+ error("\u8BF7\u5728init.config.ts\u4E2D\u914D\u7F6EqueryColumnApi\uFF01");
435
+ return;
436
+ }
437
+ const getAlign = (key) => key === 0 ? "center" : key === 2 ? "right" : "left";
438
+ const renderCell = (type, slot, ctx) => {
439
+ switch (type) {
440
+ case 0:
441
+ return { date: ctx };
442
+ case 1:
443
+ return { dict: ctx };
444
+ case 5:
445
+ return { percent: ctx };
446
+ case 7:
447
+ if (!appConf.structure[ctx]) {
448
+ error(`\u672A\u627E\u5230structure: ${ctx} !`);
449
+ return {};
450
+ }
451
+ return { dict: { ...appConf.structure[ctx], struCode: ctx } };
452
+ case 11:
453
+ return { number: ctx };
454
+ }
455
+ };
456
+ function getColumns() {
457
+ if (codeMap.get(code)) {
458
+ changeColumns(codeMap.get(code));
459
+ return;
460
+ }
461
+ http.post(
462
+ appConf.pages.queryColumnApi,
463
+ { tableCode: code }
464
+ ).then((rsp) => {
465
+ handleData(rsp);
466
+ });
467
+ }
468
+ function handleData(data) {
469
+ let rows = [];
470
+ data.forEach((it) => {
471
+ let obj = {
472
+ title: unref$1(getIsZH) ? it.cloumnName : it.cloumnEngName,
473
+ dataIndex: it.cloumnCode,
474
+ sorter: it.ifOrder,
475
+ align: getAlign(it.textAlign),
476
+ show: Boolean(it.ifDisplay),
477
+ defaultHidden: !Boolean(it.ifDisplay)
478
+ };
479
+ if (it.cloumnType !== void 0)
480
+ obj.render = renderCell(it.cloumnType, it.slot, it.dictCode);
481
+ if (it.width)
482
+ obj.width = Number(it.width);
483
+ rows.push(obj);
484
+ });
485
+ codeMap.set(code, rows);
486
+ changeColumns(rows);
487
+ }
488
+ getColumns();
489
+ }
490
+ function useTable(props2) {
491
+ const tableRef = ref(null);
492
+ const loadedRef = ref(false);
493
+ let stopWatch;
494
+ function registerTable(instance) {
495
+ const { isProd } = useApp();
496
+ if (unref(loadedRef) && unref(isProd) && instance === unref(tableRef))
497
+ return;
498
+ if (props2?.columnCode) {
499
+ useHeaderCode(
500
+ props2.columnCode,
501
+ (columns) => {
502
+ props2.columns = columns;
503
+ instance.setProps(getDynamicProps(props2));
504
+ }
505
+ );
506
+ }
507
+ tableRef.value = instance;
508
+ loadedRef.value = true;
509
+ stopWatch?.();
510
+ stopWatch = watch(
511
+ () => props2,
512
+ () => {
513
+ props2 && instance.setProps(getDynamicProps(props2));
514
+ },
515
+ {
516
+ immediate: true,
517
+ deep: true
518
+ }
519
+ );
520
+ onUnmounted(() => {
521
+ tableRef.value = null;
522
+ loadedRef.value = null;
523
+ });
524
+ }
525
+ function getTableInstance2() {
526
+ const table = unref(tableRef);
527
+ if (!table) {
528
+ error("\u6CA1\u6709table\u8868\u5355\u5B9E\u4F8B");
529
+ }
530
+ return table;
531
+ }
532
+ const methods = {
533
+ setProps: (props22) => getTableInstance2().setProps(props22),
534
+ setLoading: (loading) => getTableInstance2().setLoading(loading),
535
+ clearSelectedRowKeys: () => getTableInstance2().clearSelectedRowKeys(),
536
+ getSelectRows: () => getTableInstance2().getSelectRows(),
537
+ getSelectedRowKeys: () => getTableInstance2().getSelectedRowKeys(),
538
+ setSelectedRowKeys: (keys) => getTableInstance2().setSelectedRowKeys(keys),
539
+ getRowSelection: () => toRaw(getTableInstance2().getRowSelection()),
540
+ getColumns: (opt) => toRaw(getTableInstance2().getColumns(opt)),
541
+ setColumns: (columns) => getTableInstance2().setColumns(columns),
542
+ setColumnsByDataIndex: (dataIndex, value) => {
543
+ return getTableInstance2().setColumnsByDataIndex(dataIndex, value);
544
+ },
545
+ getCacheColumns: () => toRaw(getTableInstance2().getCacheColumns()),
546
+ findTableDataRecord: (rowKey) => getTableInstance2().findTableDataRecord(rowKey),
547
+ updateTableDataRecord: (rowKey, record) => getTableInstance2().updateTableDataRecord(rowKey, record),
548
+ getPagination: () => getTableInstance2().getPagination()
549
+ };
550
+ return [registerTable, methods];
551
+ }
552
+ const _default = "";
553
+ const index$e = "";
554
+ const index$d = "";
555
+ const index$c = "";
556
+ const index$b = "";
557
+ const index$a = "";
558
+ const index$9 = "";
559
+ const index$8 = "";
560
+ const index$7 = "";
561
+ const index$6 = "";
562
+ const index$5 = "";
563
+ const index$4 = "";
564
+ const index$3 = "";
565
+ const _imports_0 = "data:image/png;base64,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";
566
+ const index$2 = "";
567
+ const _hoisted_1$b = {
568
+ key: 0,
569
+ class: "dt-table-action-btn"
570
+ };
571
+ const _hoisted_2$3 = ["onClick"];
572
+ const _hoisted_3$3 = /* @__PURE__ */ createElementVNode("i", { class: "i ic:baseline-settings dt-table-action-dropdown cursor-pointer" }, null, -1);
573
+ const _hoisted_4$3 = { class: "text-13 opacity-80" };
574
+ const _sfc_main$j = /* @__PURE__ */ defineComponent$1({
575
+ __name: "TableAction",
576
+ props: {
577
+ fixed: {
578
+ type: String,
579
+ default: "right"
580
+ },
581
+ expand: {
582
+ type: Boolean,
583
+ default: false
584
+ },
585
+ width: {
586
+ type: String,
587
+ default: "70px"
588
+ },
589
+ btns: {
590
+ type: Array,
591
+ default: []
592
+ },
593
+ flag: {
594
+ type: String
595
+ },
596
+ record: {
597
+ default: {}
598
+ },
599
+ index: {
600
+ type: Number
601
+ }
602
+ },
603
+ setup(__props) {
604
+ const props2 = __props;
605
+ const actionBtns = ref([]);
606
+ function handleAction(it) {
607
+ if (isFunction(it.onClick)) {
608
+ it.onClick({
609
+ row: props2.record,
610
+ index: props2.index
611
+ });
612
+ }
613
+ }
614
+ const attrs = useAttrs();
615
+ function getPopupContainer$1() {
616
+ return isFunction(attrs.getPopupContainer) ? attrs.getPopupContainer() : getPopupContainer();
617
+ }
618
+ watch(
619
+ () => props2.btns,
620
+ (btns) => {
621
+ actionBtns.value = [...btns].map((it) => {
622
+ return {
623
+ ...it,
624
+ ifShow: isBoolean(it.show) ? it.show : isFunction(it.show) ? it.show(props2.record) : true
625
+ };
626
+ });
627
+ },
628
+ {
629
+ immediate: true
630
+ }
631
+ );
632
+ return (_ctx, _cache) => {
633
+ const _component_ATooltip = Tooltip;
634
+ const _component_AMenuItem = MenuItem;
635
+ const _component_AMenu = Menu;
636
+ const _component_ADropdown = Dropdown;
637
+ const _directive_auth = resolveDirective("auth");
638
+ return props2.expand ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(unref$1(actionBtns), (item) => {
639
+ return openBlock(), createElementBlock(Fragment, null, [
640
+ item.ifShow ? withDirectives((openBlock(), createElementBlock("span", _hoisted_1$b, [
641
+ createVNode(_component_ATooltip, { placement: "bottom" }, {
642
+ title: withCtx(() => [
643
+ createTextVNode(toDisplayString(item.name), 1)
644
+ ]),
645
+ default: withCtx(() => [
646
+ createElementVNode("i", {
647
+ class: normalizeClass(["i cursor-pointer", item.icon]),
648
+ style: normalizeStyle({
649
+ color: item.color
650
+ }),
651
+ onClick: ($event) => handleAction(item)
652
+ }, null, 14, _hoisted_2$3)
653
+ ]),
654
+ _: 2
655
+ }, 1024)
656
+ ])), [
657
+ [_directive_auth, item.auth]
658
+ ]) : createCommentVNode("", true)
659
+ ], 64);
660
+ }), 256)) : (openBlock(), createBlock(_component_ADropdown, {
661
+ key: 1,
662
+ getPopupContainer: getPopupContainer$1,
663
+ trigger: ["click"]
664
+ }, {
665
+ overlay: withCtx(() => [
666
+ createVNode(_component_AMenu, { class: "dt-action-select flex flex-col" }, {
667
+ default: withCtx(() => [
668
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref$1(actionBtns), (item) => {
669
+ return withDirectives((openBlock(), createElementBlock("span", null, [
670
+ item.ifShow ? (openBlock(), createBlock(_component_AMenuItem, {
671
+ key: 0,
672
+ onClick: ($event) => handleAction(item)
673
+ }, {
674
+ default: withCtx(() => [
675
+ createElementVNode("i", {
676
+ class: normalizeClass(["i text-base opacity-80 pr-2", item.icon]),
677
+ style: normalizeStyle({
678
+ color: item.color
679
+ })
680
+ }, null, 6),
681
+ createElementVNode("span", _hoisted_4$3, toDisplayString(item.name), 1)
682
+ ]),
683
+ _: 2
684
+ }, 1032, ["onClick"])) : createCommentVNode("", true)
685
+ ])), [
686
+ [_directive_auth, item.auth]
687
+ ]);
688
+ }), 256))
689
+ ]),
690
+ _: 1
691
+ })
692
+ ]),
693
+ default: withCtx(() => [
694
+ _hoisted_3$3
695
+ ]),
696
+ _: 1
697
+ }));
698
+ };
699
+ }
700
+ });
701
+ const tableKey = Symbol("dt-page");
702
+ function createTableInstance(instance) {
703
+ provide$1(tableKey, instance);
704
+ }
705
+ function getTableInstance() {
706
+ return inject(tableKey);
707
+ }
708
+ const componentMap$1 = /* @__PURE__ */ new Map();
709
+ componentMap$1.set("Input", Input);
710
+ componentMap$1.set("InputNumber", InputNumber);
711
+ componentMap$1.set("Select", Select);
712
+ componentMap$1.set("TreeSelect", TreeSelect);
713
+ componentMap$1.set("Switch", Switch);
714
+ componentMap$1.set("Checkbox", Checkbox);
715
+ componentMap$1.set("DatePicker", DatePicker);
716
+ componentMap$1.set("TimePicker", TimePicker);
717
+ const CellComponent = ({
718
+ component = "Input",
719
+ rule = true,
720
+ ruleMessage,
721
+ popoverVisible,
722
+ getPopupContainer: getPopupContainer2
723
+ }, { attrs }) => {
724
+ const Comp = componentMap$1.get(component);
725
+ const DefaultComp = h(Comp, attrs);
726
+ if (!rule)
727
+ return DefaultComp;
728
+ return h(
729
+ Popover,
730
+ {
731
+ overlayClassName: "edit-cell-rule-popover",
732
+ visible: !!popoverVisible,
733
+ ...getPopupContainer2 ? { getPopupContainer: getPopupContainer2 } : {}
734
+ },
735
+ {
736
+ default: () => DefaultComp,
737
+ content: () => ruleMessage
738
+ }
739
+ );
740
+ };
741
+ const basicProps$1 = {
742
+ value: {
743
+ type: [String, Number, Boolean, Object],
744
+ default: ""
745
+ },
746
+ record: {
747
+ type: Object
748
+ },
749
+ column: {
750
+ type: Object,
751
+ default: () => ({})
752
+ },
753
+ index: Number
754
+ };
755
+ const _hoisted_1$a = { class: "editable-cell" };
756
+ const _sfc_main$i = /* @__PURE__ */ defineComponent$1({
757
+ __name: "EditTableCell",
758
+ props: basicProps$1,
759
+ setup(__props) {
760
+ const props2 = __props;
761
+ const { getUiSize } = useHeader();
762
+ const { t } = useI18n("UI");
763
+ const { editRule, align = "left" } = props2.column;
764
+ const table = getTableInstance();
765
+ const ruleMessage = ref("");
766
+ const ruleVisible = ref(false);
767
+ const optionsRef = ref([]);
768
+ const currentValueRef = ref(props2.value);
769
+ const getComponent = computed(() => props2.column?.editComponent || "Input");
770
+ const getRuleVisible = computed(() => {
771
+ return unref(ruleMessage) && unref(ruleVisible);
772
+ });
773
+ const getWrapperClass = computed(() => {
774
+ return `edit-cell-align-${align}`;
775
+ });
776
+ const getIsCheckComp = computed(() => {
777
+ const component = unref(getComponent);
778
+ return ["Checkbox", "Switch"].includes(component);
779
+ });
780
+ const createPlaceholderMessage = (component) => {
781
+ if (component.includes("Input")) {
782
+ return t("PLEASE_INPUT");
783
+ }
784
+ return t("PLEASE_SELECT");
785
+ };
786
+ const setTableValue = () => {
787
+ props2.record[props2.column.dataIndex] = unref(currentValueRef);
788
+ };
789
+ const getComponentProps = computed(() => {
790
+ const isCheckValue = unref(getIsCheckComp);
791
+ const valueField = isCheckValue ? "checked" : "value";
792
+ const val = unref(currentValueRef);
793
+ const value = isCheckValue ? isNumber(val) && isBoolean(val) ? val : !!val : val;
794
+ let compProps = props2.column?.editComponentProps ?? {};
795
+ const { record, column, index: index2 } = props2;
796
+ if (isFunction(compProps)) {
797
+ compProps = compProps({ text: val, record, column, index: index2 }) ?? {};
798
+ }
799
+ if (unref(getComponent) === "InputNumber") {
800
+ compProps = {
801
+ formatter: (value2) => `${value2}`.replace(/[1-9]\d{0,2}(?=(\d{3})+$)/g, "$&,"),
802
+ parser: (value2) => value2.replace(/\$\s?|(,*)/g, ""),
803
+ ...compProps
804
+ };
805
+ }
806
+ return {
807
+ size: "small",
808
+ dropdownClassName: unref(getUiSize),
809
+ getPopupContainer: () => document.body,
810
+ placeholder: createPlaceholderMessage(unref(getComponent)),
811
+ ...omit(compProps, "onChange"),
812
+ [valueField]: value
813
+ };
814
+ });
815
+ async function handleChange(e) {
816
+ const component = unref(getComponent);
817
+ if (component === "Checkbox") {
818
+ currentValueRef.value = e.target.checked;
819
+ } else if (e?.target && Reflect.has(e.target, "value")) {
820
+ currentValueRef.value = e.target.value;
821
+ } else {
822
+ currentValueRef.value = e;
823
+ }
824
+ const onChange = unref(getComponentProps)?.onChange;
825
+ if (onChange && isFunction(onChange))
826
+ onChange(...arguments);
827
+ setTableValue();
828
+ table.emits?.("edit-change", {
829
+ column: props2.column,
830
+ value: unref(currentValueRef),
831
+ record: toRaw(props2.record),
832
+ index: props2.index
833
+ });
834
+ handleSubmitRule();
835
+ }
836
+ async function handleSubmitRule() {
837
+ const { column, record } = props2;
838
+ const { editRule: editRule2 } = column;
839
+ const currentValue = unref(currentValueRef);
840
+ if (editRule2) {
841
+ if (isBoolean(editRule2) && !currentValue && !isNumber(currentValue)) {
842
+ ruleVisible.value = true;
843
+ const component = unref(getComponent);
844
+ ruleMessage.value = createPlaceholderMessage(component);
845
+ return false;
846
+ }
847
+ if (isFunction(editRule2)) {
848
+ const res = await editRule2(currentValue, record);
849
+ if (!!res) {
850
+ ruleMessage.value = res;
851
+ ruleVisible.value = true;
852
+ return false;
853
+ }
854
+ }
855
+ }
856
+ ruleMessage.value = "";
857
+ return true;
858
+ }
859
+ function handleOptionsChange(options) {
860
+ optionsRef.value = options;
861
+ }
862
+ return (_ctx, _cache) => {
863
+ return openBlock(), createElementBlock("div", _hoisted_1$a, [
864
+ createVNode(unref$1(CellComponent), mergeProps({ ref: "elRef" }, unref$1(getComponentProps), {
865
+ component: _ctx.column?.editComponent,
866
+ popoverVisible: unref$1(getRuleVisible),
867
+ rule: unref$1(editRule),
868
+ ruleMessage: unref$1(ruleMessage),
869
+ class: unref$1(getWrapperClass),
870
+ onChange: handleChange,
871
+ onOptionsChange: handleOptionsChange
872
+ }), null, 16, ["component", "popoverVisible", "rule", "ruleMessage", "class"])
873
+ ]);
874
+ };
875
+ }
876
+ });
877
+ function renderEditCell(column) {
878
+ return ({ text: value, record, index: index2 }) => {
879
+ record.onValid = async () => {
880
+ if (isArray(record?.validCbs)) {
881
+ const validFns = (record?.validCbs || []).map((fn) => fn());
882
+ const res = await Promise.all(validFns);
883
+ return res.every((item) => !!item);
884
+ }
885
+ return false;
886
+ };
887
+ record.onEdit = async (edit, submit = false) => {
888
+ if (!submit) {
889
+ record.editable = edit;
890
+ }
891
+ if (!edit && submit) {
892
+ if (!await record.onValid())
893
+ return false;
894
+ const res = await record.onSubmitEdit?.();
895
+ if (res) {
896
+ record.editable = false;
897
+ return true;
898
+ }
899
+ return false;
900
+ }
901
+ if (!edit && !submit) {
902
+ record.onCancelEdit?.();
903
+ }
904
+ return true;
905
+ };
906
+ return h(_sfc_main$i, {
907
+ value,
908
+ record,
909
+ column,
910
+ index: index2
911
+ });
912
+ };
913
+ }
914
+ const INDEX_FLAG = "INDEX";
915
+ const ACTION_COLUMN = "ACTION";
916
+ function handleItem(item, ellipsis) {
917
+ const { appConf } = useAppStore();
918
+ const { align } = appConf.ui.table;
919
+ const { key, dataIndex, children } = item;
920
+ item.align = item.align || align;
921
+ if (ellipsis) {
922
+ if (!key)
923
+ item.key = dataIndex && dataIndex.toString();
924
+ if (!isBoolean(item.ellipsis)) {
925
+ item = Object.assign(item, {
926
+ ellipsis
927
+ });
928
+ }
929
+ }
930
+ if (children && children.length) {
931
+ handleChildren(children, !!ellipsis);
932
+ }
933
+ }
934
+ function handleChildren(children, ellipsis) {
935
+ if (!children)
936
+ return;
937
+ children.forEach((item) => {
938
+ const { children: children2 } = item;
939
+ handleItem(item, ellipsis);
940
+ handleChildren(children2, ellipsis);
941
+ });
942
+ }
943
+ function handleIndexColumn(propsRef, getPaginationRef, columns) {
944
+ const { getIsZH } = useHeader();
945
+ const { t } = useI18n("UI");
946
+ const { showIndexColumn, indexColumnProps, isTreeTable } = unref$1(propsRef);
947
+ let pushIndexColumns = false;
948
+ if (unref$1(isTreeTable)) {
949
+ return;
950
+ }
951
+ columns.forEach(() => {
952
+ const indIndex = columns.findIndex((column) => column.flag === INDEX_FLAG);
953
+ if (showIndexColumn) {
954
+ pushIndexColumns = indIndex === -1;
955
+ } else if (!showIndexColumn && indIndex !== -1) {
956
+ columns.splice(indIndex, 1);
957
+ }
958
+ });
959
+ if (!pushIndexColumns)
960
+ return;
961
+ const isFixedLeft = columns.some((item) => item.fixed === "left");
962
+ columns.unshift({
963
+ flag: INDEX_FLAG,
964
+ width: unref$1(getIsZH) ? 50 : 70,
965
+ title: t("NUMBER"),
966
+ align: "center",
967
+ customRender: ({ index: index2 }) => {
968
+ const getPagination = unref$1(getPaginationRef);
969
+ const { appConf } = useAppStore();
970
+ const { defaultPageSize } = appConf.ui.table;
971
+ if (isBoolean(getPagination)) {
972
+ return `${index2 + 1}`;
973
+ }
974
+ const { current = 1, pageSize = defaultPageSize } = getPagination;
975
+ return ((current < 1 ? 1 : current) - 1) * pageSize + index2 + 1;
976
+ },
977
+ ...isFixedLeft ? {
978
+ fixed: "left"
979
+ } : {},
980
+ ...indexColumnProps
981
+ });
982
+ }
983
+ function handleActionColumn(propsRef, columns) {
984
+ const { getIsZH } = useHeader();
985
+ const { t } = useI18n("UI");
986
+ const { operations = [
987
+ { name: t("EDIT"), icon: "mdi:text-box-edit-outline", onClick: unref$1(propsRef).onUpdate },
988
+ { name: t("DELETE"), icon: "mdi:delete-outline", onClick: unref$1(propsRef).onDelete }
989
+ ] } = unref$1(propsRef);
990
+ if (!operations || isObject(operations) && !operations?.btns || isArray(operations) && !operations)
991
+ return;
992
+ const hasIndex = columns.findIndex((column) => column.flag === ACTION_COLUMN);
993
+ if (hasIndex === -1) {
994
+ let column = isObject(operations) ? operations : isArray(operations) ? { btns: operations } : {};
995
+ let expand = column.expand ? column.expand : false;
996
+ let columnObj = {
997
+ fixed: "right",
998
+ title: t("ACTIONS"),
999
+ align: "center",
1000
+ expand,
1001
+ width: `${expand ? column.btns.length * 30 + 40 : unref$1(getIsZH) ? 70 : 90}px`,
1002
+ ...column,
1003
+ flag: ACTION_COLUMN
1004
+ };
1005
+ columns.push({
1006
+ ...columnObj,
1007
+ customRender: ({ record, index: index2 }) => {
1008
+ return h(
1009
+ _sfc_main$j,
1010
+ omit({
1011
+ ...columnObj,
1012
+ record,
1013
+ index: index2
1014
+ }, "align")
1015
+ );
1016
+ }
1017
+ });
1018
+ }
1019
+ }
1020
+ function sortFixedColumn(columns) {
1021
+ const fixedLeftColumn = [];
1022
+ const fixedRightColumn = [];
1023
+ const defaultColumn = [];
1024
+ for (let column of columns) {
1025
+ if (column.defaultHidden)
1026
+ continue;
1027
+ if (column.fixed === "left") {
1028
+ fixedLeftColumn.push(column);
1029
+ continue;
1030
+ }
1031
+ if (column.fixed === "right") {
1032
+ fixedRightColumn.push(column);
1033
+ continue;
1034
+ }
1035
+ defaultColumn.push(column);
1036
+ }
1037
+ return [
1038
+ ...fixedLeftColumn,
1039
+ ...defaultColumn,
1040
+ ...fixedRightColumn
1041
+ ];
1042
+ }
1043
+ function useColumns(propsRef, getPaginationRef, tableElRef) {
1044
+ const columnsRef = ref(unref$1(propsRef).columns);
1045
+ let cacheColumns = unref$1(propsRef).columns;
1046
+ const getColumnsRef = computed(() => {
1047
+ const columns = cloneDeep(unref$1(columnsRef));
1048
+ const { ellipsis } = unref$1(propsRef);
1049
+ columns.forEach((it, index2) => {
1050
+ it.class = it.class ?? "";
1051
+ if (!it.class.split(" ").includes("__column")) {
1052
+ it.class = `${it.class} __column`;
1053
+ }
1054
+ const { customRender, render } = it;
1055
+ if (it.sorter) {
1056
+ it.sorter = {
1057
+ multiple: Number(it.sorter)
1058
+ };
1059
+ }
1060
+ handleItem(
1061
+ it,
1062
+ Reflect.has(it, "ellipsis") ? !!it.ellipsis : !!ellipsis && !render && !customRender
1063
+ );
1064
+ });
1065
+ handleIndexColumn(propsRef, getPaginationRef, columns);
1066
+ handleActionColumn(propsRef, columns);
1067
+ return columns;
1068
+ });
1069
+ const getViewColumns = computed(() => {
1070
+ const viewColumns = sortFixedColumn(unref$1(getColumnsRef));
1071
+ const columns = cloneDeep(viewColumns);
1072
+ return columns.filter((column) => isIfShow(column)).map((column) => {
1073
+ if (column.edit) {
1074
+ column.customRender = renderEditCell(column);
1075
+ }
1076
+ return column;
1077
+ });
1078
+ });
1079
+ function isIfShow(column) {
1080
+ const ifShow = column.show;
1081
+ return isBoolean(ifShow) ? ifShow : isFunction(ifShow) ? ifShow(column) : true;
1082
+ }
1083
+ const resizeFn = useDebounceFn(addResize, 100);
1084
+ function addResize() {
1085
+ const { resizable, minWidth = 50, maxWidth = 700 } = unref$1(propsRef);
1086
+ let els = unref$1(tableElRef)?.$el.querySelectorAll(".__column"), allWidth = 0, columnAllWidth = 0, noWidthNum = 0, avgWidth = 0;
1087
+ for (let i = 0; i < els?.length; i++) {
1088
+ allWidth += els[i].offsetWidth ?? 0;
1089
+ }
1090
+ columnsRef.value.forEach((it) => {
1091
+ if (isIfShow(it)) {
1092
+ if (it.width) {
1093
+ columnAllWidth += parseInt(`${it.width}`);
1094
+ } else {
1095
+ noWidthNum++;
1096
+ }
1097
+ }
1098
+ });
1099
+ avgWidth = (allWidth - columnAllWidth) / noWidthNum;
1100
+ columnsRef.value.forEach((it) => {
1101
+ it.width = it.width || avgWidth - 1;
1102
+ if (Reflect.has(it, "resizable") ? !!it.resizable : resizable) {
1103
+ it.resizable = true;
1104
+ it.minWidth = it.minWidth || minWidth;
1105
+ it.maxWidth = it.maxWidth || maxWidth;
1106
+ }
1107
+ });
1108
+ }
1109
+ function getColumns(opt) {
1110
+ const { ignoreIndex, ignoreAction, sort } = opt || {};
1111
+ let columns = toRaw(unref$1(getColumnsRef));
1112
+ if (ignoreIndex) {
1113
+ columns = columns.filter((it) => it.flag !== INDEX_FLAG);
1114
+ }
1115
+ if (ignoreAction) {
1116
+ columns = columns.filter((it) => it.flag !== ACTION_COLUMN);
1117
+ }
1118
+ if (sort) {
1119
+ columns = sortFixedColumn(columns);
1120
+ }
1121
+ return columns;
1122
+ }
1123
+ function setColumns(columnList = []) {
1124
+ const columns = cloneDeep(columnList);
1125
+ if (!isArray(columns) || !columns.length) {
1126
+ columnsRef.value = [];
1127
+ return;
1128
+ }
1129
+ const cacheKeys = cacheColumns.map((item) => item.dataIndex);
1130
+ if (!isString(columns[0])) {
1131
+ columnsRef.value = columns;
1132
+ } else {
1133
+ const columnKeys = columns;
1134
+ const newColumns = [];
1135
+ cacheColumns.forEach((it) => {
1136
+ newColumns.push({
1137
+ ...it,
1138
+ show: true,
1139
+ defaultHidden: !columnKeys.includes(it.dataIndex || it.key)
1140
+ });
1141
+ });
1142
+ if (!isEqual(cacheKeys, columns)) {
1143
+ newColumns.sort((prev, next) => {
1144
+ return columnKeys.indexOf(prev.dataIndex) - columnKeys.indexOf(next.dataIndex);
1145
+ });
1146
+ }
1147
+ columnsRef.value = newColumns;
1148
+ cacheColumns = [...newColumns];
1149
+ }
1150
+ }
1151
+ function setColumnsByDataIndex(dataIndex, value) {
1152
+ if (!dataIndex || !value)
1153
+ return;
1154
+ cacheColumns.forEach((item) => {
1155
+ if (item.dataIndex === dataIndex) {
1156
+ Object.assign(item, value);
1157
+ return;
1158
+ }
1159
+ });
1160
+ columnsRef.value = [...cacheColumns];
1161
+ }
1162
+ function getCacheColumns() {
1163
+ return cacheColumns;
1164
+ }
1165
+ watch(
1166
+ () => unref$1(propsRef).columns,
1167
+ (columns) => {
1168
+ columnsRef.value = columns;
1169
+ cacheColumns = columns.filter((it) => !it.flag) ?? [];
1170
+ nextTick(() => resizeFn());
1171
+ }
1172
+ );
1173
+ return {
1174
+ getViewColumns,
1175
+ getColumnsRef,
1176
+ getColumns,
1177
+ setColumns,
1178
+ setColumnsByDataIndex,
1179
+ getCacheColumns
1180
+ };
1181
+ }
1182
+ function useCustomRow(propsRef, { setSelectedRowKeys, getSelectedRowKeys, clearSelectedRowKeys, emits }) {
1183
+ const customRow = (record, index2) => {
1184
+ return {
1185
+ onClick: (e) => {
1186
+ e?.stopPropagation();
1187
+ function handleClick() {
1188
+ const { rowSelection, rowKey, clickToSelectRow } = unref$1(propsRef);
1189
+ if (!rowSelection || !clickToSelectRow)
1190
+ return;
1191
+ const keys = getSelectedRowKeys();
1192
+ const key = record[rowKey];
1193
+ if (!key)
1194
+ return;
1195
+ const isCheckbox = rowSelection.type === "checkbox";
1196
+ const isRadio = rowSelection.type === "radio";
1197
+ if (clickToSelectRow) {
1198
+ if (isCheckbox) {
1199
+ if (keys.includes(key)) {
1200
+ setSelectedRowKeys(keys.filter((it) => it !== key));
1201
+ } else {
1202
+ setSelectedRowKeys([...keys, key]);
1203
+ }
1204
+ }
1205
+ if (isRadio)
1206
+ setSelectedRowKeys([key]);
1207
+ return;
1208
+ }
1209
+ if (isCheckbox) {
1210
+ const tr = e.composedPath?.().find((dom) => dom.tagName === "TR");
1211
+ if (!tr)
1212
+ return;
1213
+ const checkBox = tr.querySelector("input[type=checkbox]");
1214
+ if (!checkBox || checkBox.hasAttribute("disabled"))
1215
+ return;
1216
+ if (!keys.includes(key)) {
1217
+ setSelectedRowKeys([...keys, key]);
1218
+ return;
1219
+ }
1220
+ const keyIndex = keys.findIndex((item) => item === key);
1221
+ keys.splice(keyIndex, 1);
1222
+ setSelectedRowKeys(keys);
1223
+ return;
1224
+ }
1225
+ if (isRadio) {
1226
+ if (!keys.includes(key)) {
1227
+ if (keys.length) {
1228
+ clearSelectedRowKeys();
1229
+ }
1230
+ setSelectedRowKeys([key]);
1231
+ return;
1232
+ }
1233
+ clearSelectedRowKeys();
1234
+ }
1235
+ }
1236
+ handleClick();
1237
+ emits("row-click", record, index2, e);
1238
+ },
1239
+ onDblclick: (event) => {
1240
+ emits("row-dbClick", record, index2, event);
1241
+ },
1242
+ onContextmenu: (event) => {
1243
+ emits("row-contextmenu", record, index2, event);
1244
+ },
1245
+ onMouseenter: (event) => {
1246
+ emits("row-mouseenter", record, index2, event);
1247
+ },
1248
+ onMouseleave: (event) => {
1249
+ emits("row-mouseleave", record, index2, event);
1250
+ }
1251
+ };
1252
+ };
1253
+ return {
1254
+ customRow
1255
+ };
1256
+ }
1257
+ function useDataSource(propsRef, {
1258
+ getPaginationInfo,
1259
+ setPagination,
1260
+ clearSelectedRowKeys
1261
+ }) {
1262
+ const dataSourceRef = ref$1([]);
1263
+ watch$1(
1264
+ () => unref$1(propsRef).dataSource,
1265
+ (dataSource) => {
1266
+ dataSource && (dataSourceRef.value = dataSource);
1267
+ },
1268
+ {
1269
+ immediate: true
1270
+ }
1271
+ );
1272
+ const getDataSourceRef = computed$1(() => {
1273
+ return unref$1(dataSourceRef);
1274
+ });
1275
+ function handleTableChange(pagination, filters, sorter) {
1276
+ const { sortFn, filterFn, onTableChange: onTableChange2, clearSelectOnPageChange } = unref$1(propsRef);
1277
+ const { appConf: appConf2 } = useAppStore();
1278
+ const { current = 1, pageSize = appConf2.ui.table.defaultPageSize } = pagination;
1279
+ if (clearSelectOnPageChange) {
1280
+ clearSelectedRowKeys();
1281
+ }
1282
+ setPagination(pagination);
1283
+ const params = {};
1284
+ if (sorter && isFunction(sortFn)) {
1285
+ params.sortInfo = sortFn(sorter);
1286
+ }
1287
+ if (filters && isFunction(filterFn)) {
1288
+ params.filterInfo = filterFn(filters);
1289
+ }
1290
+ return onTableChange2({
1291
+ pagination: {
1292
+ current,
1293
+ pageSize
1294
+ },
1295
+ sort: sorter,
1296
+ filter: toRaw$1(unref$1(params.filterInfo)),
1297
+ showBtnLoading: false
1298
+ });
1299
+ }
1300
+ const { defSort, onTableChange } = unref$1(propsRef);
1301
+ const { appConf } = useAppStore();
1302
+ onTableChange({
1303
+ pagination: {
1304
+ current: 1,
1305
+ pageSize: appConf.ui.table.defaultPageSize
1306
+ },
1307
+ sort: defSort,
1308
+ filter: null,
1309
+ showBtnLoading: false
1310
+ }, false);
1311
+ function updateTableDataRecord(rowKey, record) {
1312
+ const row = findTableDataRecord(rowKey);
1313
+ if (row) {
1314
+ for (const field in record) {
1315
+ row[field] = record[field];
1316
+ }
1317
+ return row;
1318
+ }
1319
+ }
1320
+ function findTableDataRecord(rowKey) {
1321
+ if (!dataSourceRef.value || dataSourceRef.value.length == 0 || !rowKey)
1322
+ return;
1323
+ const { childrenColumnName = "children" } = unref$1(propsRef);
1324
+ const findRow = (array) => {
1325
+ let ret;
1326
+ array.some(function iter(r) {
1327
+ if (Reflect.has(r, unref$1(propsRef).rowKey) && r[unref$1(propsRef).rowKey] === rowKey) {
1328
+ ret = r;
1329
+ return true;
1330
+ }
1331
+ return r[childrenColumnName] && r[childrenColumnName].some(iter);
1332
+ });
1333
+ return ret;
1334
+ };
1335
+ return findRow(dataSourceRef.value);
1336
+ }
1337
+ return {
1338
+ getDataSourceRef,
1339
+ handleTableChange,
1340
+ updateTableDataRecord,
1341
+ findTableDataRecord
1342
+ };
1343
+ }
1344
+ function useLabelWidth(schemaItemRef, propsRef) {
1345
+ const { getIsZH } = useHeader();
1346
+ const { appConf } = useAppStore();
1347
+ return computed(() => {
1348
+ const { labelWidth, enLabelWidth, labelCol = {}, wrapperCol = {} } = unref(schemaItemRef);
1349
+ const {
1350
+ labelWidth: gLabelWidth,
1351
+ enLabelWidth: gEnLabelWidth,
1352
+ labelCol: glabelCol = {},
1353
+ wrapperCol: gwrapperCol = {},
1354
+ layout = appConf.ui.form.layout
1355
+ } = unref(propsRef);
1356
+ let width = (unref(getIsZH) ? labelWidth ?? gLabelWidth : enLabelWidth ?? gEnLabelWidth) ?? labelWidth ?? gLabelWidth ?? 0;
1357
+ const labelcol = { ...glabelCol, ...labelCol };
1358
+ const wrapcol = { ...gwrapperCol, ...wrapperCol };
1359
+ width = isNumber(width) ? `${width}px` : width;
1360
+ return {
1361
+ labelCol: {
1362
+ style: { width },
1363
+ ...labelcol
1364
+ },
1365
+ wrapperCol: {
1366
+ style: { width: layout === "vertical" ? "100%" : `calc(100% - ${width})` },
1367
+ ...wrapcol
1368
+ }
1369
+ };
1370
+ });
1371
+ }
1372
+ const SINGLE_DATA_TYPE = ["DatePicker", "MonthPicker", "WeekPicker", "TimePicker"];
1373
+ function createPlaceholder(component) {
1374
+ const { t } = useI18n("UI");
1375
+ if (component.includes("Input") || component.includes("Complete")) {
1376
+ return t("PLEASE_INPUT");
1377
+ }
1378
+ if (component.includes("Picker") || component.includes("Select") || component.includes("Cascader") || component.includes("Checkbox") || component.includes("Radio") || component.includes("Switch")) {
1379
+ return t("PLEASE_SELECT");
1380
+ }
1381
+ if (component.includes("Icon")) {
1382
+ return t("PLEASE_SET_ICON");
1383
+ }
1384
+ return "";
1385
+ }
1386
+ function setComponentRuleType(rule, component, valueFormat) {
1387
+ if (SINGLE_DATA_TYPE.includes(component)) {
1388
+ rule.type = valueFormat ? "string" : "object";
1389
+ } else if (["RangePicker", "Upload", "CheckboxGroup", "TimePicker"].includes(component)) {
1390
+ rule.type = "array";
1391
+ } else if (["InputNumber"].includes(component)) {
1392
+ rule.type = "number";
1393
+ }
1394
+ }
1395
+ function useFormValue(props2, key = "value", changeEvent = "change", emitData) {
1396
+ const instance = getCurrentInstance$1();
1397
+ const emit = instance?.emit;
1398
+ const innerState = reactive$1({
1399
+ value: props2[key]
1400
+ });
1401
+ const defaultState = readonly(innerState);
1402
+ const setState = (val) => {
1403
+ innerState.value = val;
1404
+ nextTick$1(() => {
1405
+ emit?.(changeEvent, val, ...toRaw$1(unref$1(emitData)) || []);
1406
+ });
1407
+ };
1408
+ watchEffect$1(() => {
1409
+ innerState.value = props2[key];
1410
+ });
1411
+ const state = computed$1({
1412
+ get() {
1413
+ return innerState.value;
1414
+ },
1415
+ set(value) {
1416
+ if (isEqual(value, defaultState.value))
1417
+ return;
1418
+ innerState.value = value;
1419
+ nextTick$1(() => {
1420
+ emit?.(changeEvent, value, ...toRaw$1(unref$1(emitData)) || []);
1421
+ });
1422
+ }
1423
+ });
1424
+ return [state, setState, defaultState];
1425
+ }
1426
+ const _sfc_main$h = /* @__PURE__ */ defineComponent$1({
1427
+ __name: "radioButton",
1428
+ props: {
1429
+ value: {
1430
+ type: [String, Number, Boolean]
1431
+ },
1432
+ options: {
1433
+ type: Array,
1434
+ default: () => []
1435
+ }
1436
+ },
1437
+ setup(__props) {
1438
+ const props2 = __props;
1439
+ const attrs = useAttrs();
1440
+ const [state] = useFormValue(props2);
1441
+ const getOptions = computed$1(() => {
1442
+ const { options } = props2;
1443
+ if (!options || options?.length === 0)
1444
+ return [];
1445
+ const isStringArr = options.some((item) => isString(item));
1446
+ if (!isStringArr)
1447
+ return options;
1448
+ return options.map((item) => ({ label: item, value: item }));
1449
+ });
1450
+ return (_ctx, _cache) => {
1451
+ const _component_ARadioButton = RadioButton;
1452
+ const _component_ARadioGroup = RadioGroup;
1453
+ return openBlock(), createBlock(_component_ARadioGroup, mergeProps(unref$1(attrs), {
1454
+ value: unref$1(state),
1455
+ "onUpdate:value": _cache[0] || (_cache[0] = ($event) => isRef(state) ? state.value = $event : null),
1456
+ "button-style": "solid"
1457
+ }), {
1458
+ default: withCtx(() => [
1459
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref$1(getOptions), (item) => {
1460
+ return openBlock(), createBlock(_component_ARadioButton, {
1461
+ key: `${item.value}`,
1462
+ value: item.value,
1463
+ disabled: item.disabled
1464
+ }, {
1465
+ default: withCtx(() => [
1466
+ createTextVNode(toDisplayString(item.label), 1)
1467
+ ]),
1468
+ _: 2
1469
+ }, 1032, ["value", "disabled"]);
1470
+ }), 128))
1471
+ ]),
1472
+ _: 1
1473
+ }, 16, ["value"]);
1474
+ };
1475
+ }
1476
+ });
1477
+ const _hoisted_1$9 = { class: "input-with-dialog" };
1478
+ const _sfc_main$g = /* @__PURE__ */ defineComponent$1({
1479
+ __name: "formInputUseDialog",
1480
+ setup(__props) {
1481
+ const { t } = useI18n("UI");
1482
+ const attrs = useAttrs$1();
1483
+ const bindProps = computed$1(() => {
1484
+ return {
1485
+ ...omit(attrs, [
1486
+ "formValues"
1487
+ ]),
1488
+ disabled: true
1489
+ };
1490
+ });
1491
+ function onClickInput() {
1492
+ const { model, schema = {} } = attrs.formValues;
1493
+ if (!schema.openDialog || !isFunction(schema.openDialog)) {
1494
+ error(t("MUSE_FUNCTION"));
1495
+ return;
1496
+ }
1497
+ schema.openDialog(model);
1498
+ }
1499
+ function clearProps() {
1500
+ const { model, schema = {} } = attrs.formValues;
1501
+ [...schema.linkProps, schema.name].forEach((it) => model[it] = null);
1502
+ }
1503
+ return (_ctx, _cache) => {
1504
+ return openBlock(), createElementBlock("div", _hoisted_1$9, [
1505
+ createElementVNode("div", { onClick: onClickInput }, [
1506
+ createVNode(unref$1(Input), normalizeProps(guardReactiveProps(unref$1(bindProps))), null, 16)
1507
+ ]),
1508
+ unref$1(attrs).formValues?.schema?.linkProps?.length ? (openBlock(), createElementBlock("i", {
1509
+ key: 0,
1510
+ class: "i mdi:close-circle",
1511
+ onClick: clearProps
1512
+ })) : createCommentVNode("", true)
1513
+ ]);
1514
+ };
1515
+ }
1516
+ });
1517
+ const components = {
1518
+ Input,
1519
+ InputWithDialog: _sfc_main$g,
1520
+ InputTextArea: Input.TextArea,
1521
+ InputSearch: Input.Search,
1522
+ InputGroup: Input.Group,
1523
+ InputPassword: Input.Password,
1524
+ Select,
1525
+ TreeSelect,
1526
+ Radio,
1527
+ RadioGroup: Radio.Group,
1528
+ RadioButtonGroup: _sfc_main$h,
1529
+ Checkbox,
1530
+ CheckboxGroup: Checkbox.Group,
1531
+ AutoComplete,
1532
+ Cascader,
1533
+ DatePicker,
1534
+ MonthPicker: DatePicker.MonthPicker,
1535
+ WeekPicker: DatePicker.WeekPicker,
1536
+ RangePicker: DatePicker.RangePicker,
1537
+ InputNumber,
1538
+ Switch,
1539
+ TimePicker,
1540
+ Slider,
1541
+ Rate,
1542
+ Divider
1543
+ };
1544
+ const componentMap = /* @__PURE__ */ new Map();
1545
+ for (let item in components) {
1546
+ componentMap.set(item, components[item]);
1547
+ }
1548
+ function _isSlot$1(s) {
1549
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
1550
+ }
1551
+ defineComponent({
1552
+ name: "FormItem",
1553
+ inheritAttrs: false,
1554
+ props: {
1555
+ schema: {
1556
+ type: Object,
1557
+ default: () => ({})
1558
+ },
1559
+ formProps: {
1560
+ type: Object,
1561
+ default: () => ({})
1562
+ },
1563
+ defaultValues: {
1564
+ type: Object,
1565
+ default: () => ({})
1566
+ },
1567
+ formModel: {
1568
+ type: Object,
1569
+ default: () => ({})
1570
+ },
1571
+ setFormModel: {
1572
+ type: Function
1573
+ },
1574
+ formActionType: {
1575
+ type: Object
1576
+ }
1577
+ },
1578
+ setup(props2, {
1579
+ emit,
1580
+ slots
1581
+ }) {
1582
+ const {
1583
+ getSlot
1584
+ } = useSlots$1();
1585
+ const {
1586
+ t
1587
+ } = useI18n("UI");
1588
+ const {
1589
+ getUiSize
1590
+ } = useHeader();
1591
+ const {
1592
+ appConf
1593
+ } = useAppStore();
1594
+ const {
1595
+ schema,
1596
+ formProps
1597
+ } = toRefs(props2);
1598
+ const getValues = computed(() => {
1599
+ const {
1600
+ defaultValues,
1601
+ formModel,
1602
+ schema: schema2
1603
+ } = props2;
1604
+ let name = schema2.name;
1605
+ return {
1606
+ name: isArray(name) ? name.join("-") : name,
1607
+ model: formModel,
1608
+ schema: schema2,
1609
+ values: {
1610
+ ...defaultValues,
1611
+ ...formModel
1612
+ }
1613
+ };
1614
+ });
1615
+ const getShow = computed(() => {
1616
+ const {
1617
+ show = true,
1618
+ isAdvanced = true
1619
+ } = props2.schema;
1620
+ if (!isAdvanced) {
1621
+ return false;
1622
+ }
1623
+ if (isFunction(show)) {
1624
+ return show(unref(getValues).model);
1625
+ }
1626
+ return show;
1627
+ });
1628
+ const getComponentProps = computed(() => {
1629
+ const {
1630
+ schema: schema2
1631
+ } = props2;
1632
+ let {
1633
+ props: cProps = {}
1634
+ } = schema2;
1635
+ if (isFunction(cProps)) {
1636
+ cProps = cProps(unref(getValues).model) ?? {};
1637
+ }
1638
+ if (schema2.component === "Divider") {
1639
+ cProps = Object.assign({
1640
+ type: "horizontal"
1641
+ }, cProps, {
1642
+ orientation: "left"
1643
+ });
1644
+ }
1645
+ return cProps;
1646
+ });
1647
+ function renderItem() {
1648
+ const {
1649
+ component,
1650
+ slot,
1651
+ render,
1652
+ name,
1653
+ colon = appConf.ui.form.colon,
1654
+ suffix,
1655
+ prefix
1656
+ } = props2.schema;
1657
+ const {
1658
+ labelCol,
1659
+ wrapperCol
1660
+ } = unref(useLabelWidth(schema, formProps));
1661
+ const getContent = () => {
1662
+ const value = unref(getValues);
1663
+ let _con = slot ? getSlot(slots, slot, value.model) : render ? render(value.model) : renderFormItem();
1664
+ return component === "InputGroup" || component === "Icon" ? createVNode(FormItem, {
1665
+ "class": "m-0"
1666
+ }, _isSlot$1(_con) ? _con : {
1667
+ default: () => [_con]
1668
+ }) : _con;
1669
+ };
1670
+ const getSuffix = () => {
1671
+ return isFunction(suffix) ? suffix(unref(getValues).model) : suffix;
1672
+ };
1673
+ const getPrefix = () => {
1674
+ return isFunction(prefix) ? prefix(unref(getValues).model) : prefix;
1675
+ };
1676
+ return createVNode(Form.Item, {
1677
+ "name": isArray(name) ? name.join("-") : name,
1678
+ "colon": colon,
1679
+ "class": [unref(getUiSize), {
1680
+ "suffix-item": !!suffix
1681
+ }],
1682
+ "label": renderLabel(),
1683
+ "rules": handleRules(),
1684
+ "labelCol": labelCol,
1685
+ "wrapperCol": wrapperCol
1686
+ }, {
1687
+ default: () => [createVNode("div", {
1688
+ "style": "display:flex"
1689
+ }, [!!prefix && createVNode("span", {
1690
+ "class": "prefix px-2"
1691
+ }, [getPrefix()]), createVNode("div", {
1692
+ "style": "flex:1; width: 100%;"
1693
+ }, [getContent()]), !!suffix && createVNode("span", {
1694
+ "class": "suffix px-2"
1695
+ }, [getSuffix()])])]
1696
+ });
1697
+ }
1698
+ function renderLabel() {
1699
+ const {
1700
+ label,
1701
+ toolTip,
1702
+ subLabel,
1703
+ toolTipProps = {}
1704
+ } = props2.schema;
1705
+ const renderLabel2 = subLabel ? createVNode("span", null, [createTextVNode(" "), label, createTextVNode(" "), createVNode("span", {
1706
+ "class": "text-secondary opacity-50"
1707
+ }, [createTextVNode("("), subLabel, createTextVNode(")")])]) : label;
1708
+ const _toolTip = isFunction(toolTip) ? toolTip(unref(getValues).model) : toolTip;
1709
+ const _toolTipProps = {
1710
+ title: renderLabel2,
1711
+ autoAdjustOverflow: true,
1712
+ placement: "top",
1713
+ ...toolTipProps
1714
+ };
1715
+ return _toolTip ? createVNode("span", null, [createVNode(Tooltip$1, _toolTipProps, _isSlot$1(renderLabel2) ? renderLabel2 : {
1716
+ default: () => [renderLabel2]
1717
+ })]) : renderLabel2;
1718
+ }
1719
+ function renderFormItem() {
1720
+ const {
1721
+ schema: schema2,
1722
+ formModel,
1723
+ formActionType
1724
+ } = props2;
1725
+ const {
1726
+ component,
1727
+ name,
1728
+ changeEvent = "change",
1729
+ valueField,
1730
+ renderComponent,
1731
+ props: sProps
1732
+ } = props2.schema;
1733
+ const isCheck = component && ["Switch", "Checkbox"].includes(component);
1734
+ const eventKey = `on${upperFirst(changeEvent)}`;
1735
+ const _sProps = isFunction(sProps) ? sProps(formModel) : sProps;
1736
+ const on2 = {
1737
+ [eventKey]: (...args) => {
1738
+ const [e] = args;
1739
+ const target = e ? e.target : null;
1740
+ const value = target ? isCheck ? target.checked : target.value : e;
1741
+ if (isString(name)) {
1742
+ props2.setFormModel(name, value);
1743
+ } else if (isArray(name)) {
1744
+ name.map((key) => props2.setFormModel(key, value));
1745
+ }
1746
+ if (_sProps && _sProps[eventKey])
1747
+ _sProps[eventKey](...args, formModel);
1748
+ }
1749
+ };
1750
+ for (let it in _sProps) {
1751
+ if (it.startsWith("on") && it !== eventKey) {
1752
+ on2[it] = (...args) => {
1753
+ _sProps[it](...args, formModel);
1754
+ };
1755
+ }
1756
+ }
1757
+ const getDisable = computed(() => {
1758
+ const {
1759
+ disabled: gDisabled
1760
+ } = props2.formProps;
1761
+ const {
1762
+ disabled
1763
+ } = props2.schema;
1764
+ const {
1765
+ disabled: itemDisabled = false
1766
+ } = unref(getComponentProps);
1767
+ let _disabled = !!gDisabled || itemDisabled;
1768
+ if (isBoolean(disabled))
1769
+ _disabled = disabled;
1770
+ if (isFunction(disabled))
1771
+ _disabled = disabled(unref(getValues).model);
1772
+ return _disabled;
1773
+ });
1774
+ const itemProps = {
1775
+ allowClear: _sProps?.allowClear ?? appConf.ui.form.allowClear,
1776
+ size: unref(getUiSize) === UiSize.MIDDLE ? "default" : unref(getUiSize),
1777
+ ...unref(getComponentProps),
1778
+ disabled: unref(getDisable)
1779
+ };
1780
+ if (component === "Select") {
1781
+ {
1782
+ itemProps.showSearch = true;
1783
+ itemProps.optionFilterProp = "label";
1784
+ }
1785
+ }
1786
+ if (!itemProps.disabled && component !== "RangePicker") {
1787
+ itemProps.placeholder = unref(getComponentProps)?.placeholder || createPlaceholder(component);
1788
+ }
1789
+ if (["DatePicker", "MonthPicker", "RangePicker"].includes(component)) {
1790
+ itemProps.defaultValue = props2.formModel[name];
1791
+ }
1792
+ itemProps.codeName = name;
1793
+ itemProps.formValues = unref(getValues);
1794
+ if (["Select", "DatePicker", "MonthPicker", "WeekPicker", "RangePicker"].includes(component)) {
1795
+ itemProps.dropdownClassName += ` ${unref(getUiSize)}`;
1796
+ }
1797
+ const bindValue = {
1798
+ [valueField || (isCheck ? "checked" : "value")]: props2.formModel[name]
1799
+ };
1800
+ let compAttr = {
1801
+ ...itemProps,
1802
+ ...bindValue,
1803
+ ...on2
1804
+ };
1805
+ const Comp = componentMap.get(component);
1806
+ if (!renderComponent) {
1807
+ return createVNode(Comp, compAttr, null);
1808
+ }
1809
+ const compSlot = isFunction(renderComponent) ? {
1810
+ ...renderComponent(unref(getValues))
1811
+ } : {
1812
+ default: () => renderComponent
1813
+ };
1814
+ return createVNode(Comp, compAttr, _isSlot$1(compSlot) ? compSlot : {
1815
+ default: () => [compSlot]
1816
+ });
1817
+ }
1818
+ function handleRules() {
1819
+ const {
1820
+ rules: defaultRules = [],
1821
+ component,
1822
+ label,
1823
+ dynamicRules,
1824
+ required
1825
+ } = props2.schema;
1826
+ if (!component)
1827
+ return [];
1828
+ if (isFunction(dynamicRules)) {
1829
+ return dynamicRules(unref(getValues).model);
1830
+ }
1831
+ const defaultMsg = createPlaceholder(component) + label;
1832
+ let rules = cloneDeep(defaultRules);
1833
+ const getRequired = isFunction(required) ? required(unref(getValues).model) : required;
1834
+ function validator(rule, value) {
1835
+ const msg = rule.message || defaultMsg;
1836
+ if (value === void 0 || isNull(value) || Array.isArray(value) && value.length === 0 || typeof value === "string" && value.trim() === "" || typeof value === "object" && Reflect.has(value, "checked") && Reflect.has(value, "halfChecked") && Array.isArray(value.checked) && Array.isArray(value.halfChecked) && value.checked.length === 0 && value.halfChecked.length === 0) {
1837
+ return Promise.reject(msg);
1838
+ }
1839
+ return Promise.resolve();
1840
+ }
1841
+ if (!rules || !rules.length) {
1842
+ let _required = isBoolean(getRequired) ? getRequired : unref(getRequired);
1843
+ rules = _required ? [{
1844
+ required: _required,
1845
+ validator
1846
+ }] : [];
1847
+ }
1848
+ const requiredIndex = rules.findIndex((rule) => Reflect.has(rule, "required") && !Reflect.has(rule, "validator"));
1849
+ if (requiredIndex !== -1) {
1850
+ const rule = rules[requiredIndex];
1851
+ if (!unref(getShow)) {
1852
+ rule.required = false;
1853
+ }
1854
+ if (!Reflect.has(rule, "type")) {
1855
+ rule.type = component === "InputNumber" ? "number" : "string";
1856
+ }
1857
+ rule.message = rule.message || defaultMsg;
1858
+ if (component.includes("Input") || component.includes("Textarea")) {
1859
+ rule.whitespace = true;
1860
+ }
1861
+ const valueFormat = unref(getComponentProps)?.valueFormat;
1862
+ setComponentRuleType(rule, component, valueFormat);
1863
+ }
1864
+ const maxIndex = rules.findIndex((val) => val.max);
1865
+ if (maxIndex !== -1 && !rules[maxIndex].validator) {
1866
+ rules[maxIndex].message = rules[maxIndex].message || `\u6700\u5927\u503C\u4E3A${rules[maxIndex].max}`;
1867
+ }
1868
+ return rules;
1869
+ }
1870
+ return () => {
1871
+ let _slot2;
1872
+ const {
1873
+ colSlot,
1874
+ renderCol,
1875
+ colProps,
1876
+ component,
1877
+ render,
1878
+ slot
1879
+ } = props2.schema;
1880
+ const {
1881
+ colProps: gColProps,
1882
+ mode
1883
+ } = props2.formProps;
1884
+ let _colProps = colProps || gColProps || (mode === "search" ? appConf.ui.form.searchColspan : appConf.ui.form.dialogColspan);
1885
+ const values = unref(getValues);
1886
+ if (!component) {
1887
+ if (!render && !renderCol && !slot) {
1888
+ error(t("NEED_RENDER"));
1889
+ return;
1890
+ }
1891
+ }
1892
+ if (component === "Divider") {
1893
+ let _slot;
1894
+ let cprops = unref(getComponentProps);
1895
+ const span = cprops?.span ?? 24;
1896
+ return createVNode(Col, {
1897
+ "span": span
1898
+ }, {
1899
+ default: () => [createVNode(Divider, cprops, _isSlot$1(_slot = renderLabel()) ? _slot : {
1900
+ default: () => [_slot]
1901
+ })]
1902
+ });
1903
+ }
1904
+ const getContent = () => {
1905
+ return colSlot ? getSlot(slots, colSlot, values) : renderCol ? renderCol(values) : renderItem();
1906
+ };
1907
+ return unref(getShow) && createVNode(Col, _colProps, _isSlot$1(_slot2 = getContent()) ? _slot2 : {
1908
+ default: () => [_slot2]
1909
+ });
1910
+ };
1911
+ }
1912
+ });
1913
+ const index$1 = "";
1914
+ const _hoisted_1$8 = {
1915
+ key: 0,
1916
+ className: "preIcon pr-1"
1917
+ };
1918
+ const _hoisted_2$2 = {
1919
+ key: 0,
1920
+ className: "preIcon pl-1"
1921
+ };
1922
+ const _hoisted_3$2 = { class: "text" };
1923
+ const _hoisted_4$2 = /* @__PURE__ */ createElementVNode("i", { class: "text-2xl i ic:baseline-arrow-drop-down" }, null, -1);
1924
+ const _hoisted_5$1 = [
1925
+ _hoisted_4$2
1926
+ ];
1927
+ const _sfc_main$f = /* @__PURE__ */ defineComponent$1({
1928
+ __name: "FormButtons",
1929
+ props: {
1930
+ mode: {
1931
+ type: String,
1932
+ default: "search"
1933
+ },
1934
+ show: {
1935
+ type: Boolean,
1936
+ default: true
1937
+ },
1938
+ showAdvancedButton: {
1939
+ type: Boolean,
1940
+ default: true
1941
+ },
1942
+ minShowColumn: {
1943
+ type: Number,
1944
+ default: 2
1945
+ },
1946
+ buttonList: {
1947
+ type: [Array],
1948
+ default: []
1949
+ },
1950
+ isAdvanced: {
1951
+ type: Boolean,
1952
+ default: true
1953
+ }
1954
+ },
1955
+ emits: ["handle-method"],
1956
+ setup(__props, { emit: emits }) {
1957
+ const props2 = __props;
1958
+ const { t } = useI18n();
1959
+ const advancedRef = ref(props2.isAdvanced);
1960
+ let key = 0;
1961
+ const showAdvanceRef = computed(() => {
1962
+ return props2.mode === "search" ? props2.showAdvancedButton : false;
1963
+ });
1964
+ const colOpt = computed(() => {
1965
+ let style = {
1966
+ textAlign: "right"
1967
+ };
1968
+ if (props2.mode === "dialog") {
1969
+ Object.assign(style, {
1970
+ display: "inline-block"
1971
+ });
1972
+ }
1973
+ return { style };
1974
+ });
1975
+ const getAdvanceClass = computed(() => {
1976
+ return [
1977
+ "basic-arrow",
1978
+ { "basic-arrow--active": !advancedRef.value }
1979
+ ];
1980
+ });
1981
+ const toggleAdvanced = () => {
1982
+ advancedRef.value = !advancedRef.value;
1983
+ dispatchResize();
1984
+ emits("handle-method", advancedRef.value);
1985
+ };
1986
+ function handleBtnClick(button) {
1987
+ if (button.onClick && isFunction(button.onClick)) {
1988
+ button.onClick();
1989
+ } else {
1990
+ emits("handle-method", button);
1991
+ }
1992
+ }
1993
+ watch(() => props2.isAdvanced, (v) => {
1994
+ if (v) {
1995
+ nextTick(() => toggleAdvanced());
1996
+ }
1997
+ }, {
1998
+ immediate: true
1999
+ });
2000
+ watch(
2001
+ () => props2.buttonList,
2002
+ (v) => key = new Date().getTime(),
2003
+ {
2004
+ immediate: true,
2005
+ deep: true
2006
+ }
2007
+ );
2008
+ return (_ctx, _cache) => {
2009
+ const _component_AButton = Button;
2010
+ const _component_AFormItem = FormItem$1;
2011
+ const _component_ACol = Col$1;
2012
+ const _directive_icon = resolveDirective("icon");
2013
+ const _directive_auth = resolveDirective("auth");
2014
+ return __props.show ? (openBlock(), createBlock(_component_ACol, normalizeProps(mergeProps({ key: 0 }, unref$1(colOpt))), {
2015
+ default: withCtx(() => [
2016
+ createVNode(_component_AFormItem, {
2017
+ class: "dt-form-btns",
2018
+ style: normalizeStyle({
2019
+ "margin-bottom": __props.mode === "search" ? "16px" : "0px"
2020
+ })
2021
+ }, {
2022
+ default: withCtx(() => [
2023
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.buttonList, (button) => {
2024
+ return openBlock(), createElementBlock(Fragment, null, [
2025
+ (button.show === void 0 ? true : button.show) ? withDirectives((openBlock(), createBlock(_component_AButton, {
2026
+ type: button.type,
2027
+ class: normalizeClass(button.class),
2028
+ loading: button.loading,
2029
+ disabled: button.disabled,
2030
+ key: unref$1(key),
2031
+ onClick: ($event) => handleBtnClick(button)
2032
+ }, {
2033
+ icon: withCtx(() => [
2034
+ button.preIcon ? withDirectives((openBlock(), createElementBlock("span", _hoisted_1$8, null, 512)), [
2035
+ [_directive_icon, button.preIcon]
2036
+ ]) : createCommentVNode("", true)
2037
+ ]),
2038
+ default: withCtx(() => [
2039
+ createTextVNode(" " + toDisplayString(unref$1(t)(button.name)) + " ", 1),
2040
+ button.postIcon ? withDirectives((openBlock(), createElementBlock("span", _hoisted_2$2, null, 512)), [
2041
+ [_directive_icon, button.postIcon]
2042
+ ]) : createCommentVNode("", true)
2043
+ ]),
2044
+ _: 2
2045
+ }, 1032, ["type", "class", "loading", "disabled", "onClick"])), [
2046
+ [_directive_auth, button.auth]
2047
+ ]) : createCommentVNode("", true)
2048
+ ], 64);
2049
+ }), 256)),
2050
+ unref$1(showAdvanceRef) ? (openBlock(), createBlock(_component_AButton, {
2051
+ key: 0,
2052
+ type: "link",
2053
+ class: "advanced",
2054
+ onClick: toggleAdvanced
2055
+ }, {
2056
+ default: withCtx(() => [
2057
+ createElementVNode("span", _hoisted_3$2, toDisplayString(unref$1(advancedRef) ? unref$1(t)("UI.ADVANCED") : unref$1(t)("UI.EXPAND")), 1),
2058
+ createElementVNode("span", {
2059
+ class: normalizeClass(unref$1(getAdvanceClass))
2060
+ }, _hoisted_5$1, 2)
2061
+ ]),
2062
+ _: 1
2063
+ })) : createCommentVNode("", true)
2064
+ ]),
2065
+ _: 1
2066
+ }, 8, ["style"])
2067
+ ]),
2068
+ _: 1
2069
+ }, 16)) : createCommentVNode("", true);
2070
+ };
2071
+ }
2072
+ });
2073
+ const _hoisted_1$7 = { key: 0 };
2074
+ const _sfc_main$e = /* @__PURE__ */ defineComponent$1({
2075
+ __name: "Fullscreen",
2076
+ setup(__props) {
2077
+ const { t } = useI18n("UI");
2078
+ const table = getTableInstance();
2079
+ const wrapEl = ref(null);
2080
+ const { toggle, isFullscreen } = useFullscreen(wrapEl);
2081
+ watch(
2082
+ () => table.tableElRef.value,
2083
+ (v) => {
2084
+ const getParent = (el) => {
2085
+ if (!el || !el.parentNode)
2086
+ return null;
2087
+ if (el.parentNode.className?.indexOf("dt-layout-content") !== -1) {
2088
+ wrapEl.value = el.parentNode;
2089
+ } else {
2090
+ getParent(el.parentNode);
2091
+ }
2092
+ };
2093
+ getParent(v.$el);
2094
+ }
2095
+ );
2096
+ return (_ctx, _cache) => {
2097
+ const _component_ATooltip = Tooltip;
2098
+ return openBlock(), createBlock(_component_ATooltip, { placement: "top" }, {
2099
+ title: withCtx(() => [
2100
+ !unref$1(isFullscreen) ? (openBlock(), createElementBlock("span", _hoisted_1$7, toDisplayString(unref$1(t)("FULLSCREEN")), 1)) : createCommentVNode("", true)
2101
+ ]),
2102
+ default: withCtx(() => [
2103
+ createElementVNode("span", {
2104
+ class: "flex",
2105
+ onClick: _cache[0] || (_cache[0] = (...args) => unref$1(toggle) && unref$1(toggle)(...args))
2106
+ }, [
2107
+ createElementVNode("i", {
2108
+ class: normalizeClass(["i w-7 leading-7 text-center cursor-pointer", unref$1(isFullscreen) ? "ic:baseline-fullscreen-exit" : "ic:baseline-fullscreen"])
2109
+ }, null, 2)
2110
+ ])
2111
+ ]),
2112
+ _: 1
2113
+ });
2114
+ };
2115
+ }
2116
+ });
2117
+ const orgDialogProp = reactive({});
2118
+ const cbTransfer = reactive({});
2119
+ const dataTransfer = reactive({});
2120
+ function useModalOut() {
2121
+ const modal = ref(null);
2122
+ const loaded = ref(true);
2123
+ const uid = ref(null);
2124
+ const { isProd } = useApp();
2125
+ function register(modalMethod, uuid) {
2126
+ if (!getCurrentInstance()) {
2127
+ throw new Error("useModal\u53EA\u80FD\u5728setup()\u6216\u8005\u51FD\u6570\u4E2D\u4F7F\u7528");
2128
+ }
2129
+ uid.value = uuid;
2130
+ onUnmounted(() => {
2131
+ if (unref(isProd)) {
2132
+ modal.value = null;
2133
+ loaded.value = false;
2134
+ dataTransfer[unref(uid)] = null;
2135
+ orgDialogProp[unref(uid)] = null;
2136
+ cbTransfer[unref(uid)] = (res) => {
2137
+ };
2138
+ }
2139
+ });
2140
+ if (unref(loaded) && modalMethod === unref(modal))
2141
+ return;
2142
+ modal.value = modalMethod;
2143
+ loaded.value = true;
2144
+ }
2145
+ const getInstance = () => {
2146
+ const instance = unref(modal);
2147
+ if (!instance) {
2148
+ error("useModalOut \u5B9E\u4F8B\u672A\u5B9A\u4E49");
2149
+ }
2150
+ return instance;
2151
+ };
2152
+ const methods = {
2153
+ setModalProps: (props2) => {
2154
+ getInstance()?.setModalProps(props2);
2155
+ },
2156
+ redoModalHeight: () => {
2157
+ getInstance()?.redoModalHeight?.();
2158
+ },
2159
+ openModal: (params, afterClose) => {
2160
+ const id = unref(uid);
2161
+ dataTransfer[id] = isObject(params) ? { ...toRaw(params) } : params;
2162
+ getInstance()?.setModalProps({
2163
+ footer: [],
2164
+ defaultFullscreen: false,
2165
+ ...orgDialogProp[id],
2166
+ visible: true
2167
+ });
2168
+ cbTransfer[id] = (res) => {
2169
+ if (afterClose && isFunction(afterClose)) {
2170
+ afterClose(res);
2171
+ }
2172
+ };
2173
+ },
2174
+ closeModal: () => {
2175
+ getInstance()?.setModalProps({ visible: false });
2176
+ }
2177
+ };
2178
+ return [register, methods];
2179
+ }
2180
+ function useModal(props2, setModalData) {
2181
+ const modalInstanceRef = ref(null);
2182
+ const currentInstance = getCurrentInstance();
2183
+ const uidRef = ref(null);
2184
+ const { isProd } = useApp();
2185
+ const getInstance = () => {
2186
+ const instance = unref(modalInstanceRef);
2187
+ if (!instance) {
2188
+ error("useModal \u5B9E\u4F8B\u672A\u5B9A\u4E49");
2189
+ }
2190
+ return instance;
2191
+ };
2192
+ const register = (modalInstance, uuid) => {
2193
+ if (unref(isProd)) {
2194
+ modalInstanceRef.value = null;
2195
+ }
2196
+ uidRef.value = uuid;
2197
+ modalInstanceRef.value = modalInstance;
2198
+ currentInstance?.emit("register", modalInstance, uuid);
2199
+ orgDialogProp[uuid] = toRaw(props2);
2200
+ modalInstance.setModalProps(props2);
2201
+ };
2202
+ watchEffect(() => {
2203
+ const data = dataTransfer[unref(uidRef)];
2204
+ if (!data)
2205
+ return;
2206
+ if (!setModalData || !isFunction(setModalData))
2207
+ return;
2208
+ nextTick(() => {
2209
+ setModalData(data);
2210
+ });
2211
+ });
2212
+ const methods = {
2213
+ setLoading: (loading = true) => {
2214
+ getInstance()?.setModalProps({ loading });
2215
+ },
2216
+ closeModal: (rsp) => {
2217
+ if (cbTransfer[unref(uidRef)])
2218
+ cbTransfer[unref(uidRef)](rsp);
2219
+ getInstance()?.setModalProps({ visible: false });
2220
+ },
2221
+ setModalProps: (props22) => {
2222
+ getInstance()?.setModalProps(props22);
2223
+ },
2224
+ redoModalHeight: () => {
2225
+ const callRedo = getInstance()?.redoModalHeight;
2226
+ callRedo && callRedo();
2227
+ }
2228
+ };
2229
+ return [register, methods];
2230
+ }
2231
+ const basicProps = {
2232
+ t: {
2233
+ type: String
2234
+ },
2235
+ visible: {
2236
+ type: Boolean
2237
+ },
2238
+ closable: {
2239
+ type: Boolean,
2240
+ default: true
2241
+ },
2242
+ destroyOnClose: {
2243
+ type: Boolean
2244
+ },
2245
+ scrollTop: {
2246
+ type: Boolean,
2247
+ default: true
2248
+ },
2249
+ height: { type: Number },
2250
+ minHeight: { type: Number },
2251
+ width: { type: [String, Number] },
2252
+ draggable: {
2253
+ type: Boolean,
2254
+ default: true
2255
+ },
2256
+ defaultFullscreen: {
2257
+ type: Boolean
2258
+ },
2259
+ canFullscreen: {
2260
+ type: Boolean,
2261
+ default: true
2262
+ },
2263
+ title: {
2264
+ type: String
2265
+ },
2266
+ loading: { type: Boolean, default: false },
2267
+ loadingTip: { type: String, default: "\u52A0\u8F7D\u4E2D..." },
2268
+ useWrapper: {
2269
+ type: Boolean,
2270
+ default: true
2271
+ },
2272
+ wrapClassName: { type: String },
2273
+ zIndex: { type: Number },
2274
+ centered: { type: Boolean },
2275
+ showOkBtn: {
2276
+ type: Boolean,
2277
+ default: true
2278
+ },
2279
+ showCancelBtn: {
2280
+ type: Boolean,
2281
+ default: true
2282
+ },
2283
+ okText: {
2284
+ type: String
2285
+ },
2286
+ cancelText: {
2287
+ type: String
2288
+ },
2289
+ mask: { type: Boolean, default: true },
2290
+ maskClosable: { type: Boolean, default: true },
2291
+ keyboard: { type: Boolean, default: true },
2292
+ maskStyle: Object,
2293
+ footer: {
2294
+ type: Object
2295
+ },
2296
+ bodyStyle: Object,
2297
+ wrapperProps: Object,
2298
+ getContainer: Function,
2299
+ closeFunc: Function,
2300
+ afterClose: Function
2301
+ };
2302
+ function useDragMove(context) {
2303
+ const getStyle = (dom, attr) => {
2304
+ return getComputedStyle(dom)[attr];
2305
+ };
2306
+ const drag = (wrap) => {
2307
+ if (!wrap)
2308
+ return;
2309
+ wrap.setAttribute("data-drag", unref(context.draggable));
2310
+ const dialogHeaderEl = wrap.querySelector(".ant-modal-header");
2311
+ const dragDom = wrap.querySelector(".ant-modal");
2312
+ if (!dialogHeaderEl || !dragDom || !unref(context.draggable))
2313
+ return;
2314
+ dialogHeaderEl.style.cursor = "move";
2315
+ dialogHeaderEl.onmousedown = (e) => {
2316
+ if (!e)
2317
+ return;
2318
+ const disX = e.clientX;
2319
+ const disY = e.clientY;
2320
+ const screenWidth = document.body.clientWidth;
2321
+ const screenHeight = document.documentElement.clientHeight;
2322
+ const dragDomWidth = dragDom.offsetWidth;
2323
+ const dragDomheight = dragDom.offsetHeight;
2324
+ console.log(dragDomWidth, dragDomheight, screenHeight, screenWidth);
2325
+ const minDragDomLeft = dragDom.offsetLeft;
2326
+ const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
2327
+ const minDragDomTop = dragDom.offsetTop;
2328
+ const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
2329
+ const domLeft = getStyle(dragDom, "left");
2330
+ const domTop = getStyle(dragDom, "top");
2331
+ let styL = +domLeft;
2332
+ let styT = +domTop;
2333
+ if (domLeft.includes("%")) {
2334
+ styL = +document.body.clientWidth * (+domLeft.replace(/%/g, "") / 100);
2335
+ styT = +document.body.clientHeight * (+domTop.replace(/%/g, "") / 100);
2336
+ } else {
2337
+ styL = +domLeft.replace(/px/g, "");
2338
+ styT = +domTop.replace(/px/g, "");
2339
+ }
2340
+ document.onmousemove = function(e2) {
2341
+ let left = e2.clientX - disX;
2342
+ let top = e2.clientY - disY;
2343
+ if (-left > minDragDomLeft) {
2344
+ left = -minDragDomLeft;
2345
+ } else if (left > maxDragDomLeft) {
2346
+ left = maxDragDomLeft;
2347
+ }
2348
+ if (-top > minDragDomTop) {
2349
+ top = -minDragDomTop;
2350
+ } else if (top > maxDragDomTop) {
2351
+ top = maxDragDomTop;
2352
+ }
2353
+ dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
2354
+ };
2355
+ document.onmouseup = () => {
2356
+ document.onmousemove = null;
2357
+ document.onmouseup = null;
2358
+ };
2359
+ };
2360
+ };
2361
+ const handleDrag = () => {
2362
+ const dragWraps = document.querySelectorAll(".ant-modal-wrap");
2363
+ for (const wrap of Array.from(dragWraps)) {
2364
+ if (!wrap)
2365
+ continue;
2366
+ const display = getStyle(wrap, "display");
2367
+ const draggable = wrap.getAttribute("data-drag");
2368
+ if (display !== "none") {
2369
+ if (draggable === null || unref(context.destroyOnClose)) {
2370
+ drag(wrap);
2371
+ }
2372
+ }
2373
+ }
2374
+ };
2375
+ watchEffect(() => {
2376
+ if (!unref(context.visible) || !unref(context.draggable)) {
2377
+ return;
2378
+ }
2379
+ useTimeoutFn(() => {
2380
+ handleDrag();
2381
+ }, 30);
2382
+ });
2383
+ }
2384
+ function _isSlot(s) {
2385
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
2386
+ }
2387
+ const Modal = defineComponent({
2388
+ name: "Modal",
2389
+ inheritAttrs: false,
2390
+ props: basicProps,
2391
+ emits: ["cancel"],
2392
+ setup(props2, {
2393
+ slots,
2394
+ emit
2395
+ }) {
2396
+ const {
2397
+ visible,
2398
+ draggable,
2399
+ destroyOnClose
2400
+ } = toRefs(props2);
2401
+ const attrs = useAttrs();
2402
+ useDragMove({
2403
+ visible,
2404
+ destroyOnClose,
2405
+ draggable
2406
+ });
2407
+ const {
2408
+ extendSlots
2409
+ } = useSlots$1();
2410
+ const onCancel = (e) => emit("cancel", e);
2411
+ return () => {
2412
+ let _slot;
2413
+ const propsData = {
2414
+ ...unref(attrs),
2415
+ ...props2,
2416
+ destroyOnClose: true,
2417
+ onCancel
2418
+ };
2419
+ if (!propsData?.visible)
2420
+ return null;
2421
+ return createVNode(Modal$1, propsData, _isSlot(_slot = extendSlots(slots)) ? _slot : {
2422
+ default: () => [_slot]
2423
+ });
2424
+ };
2425
+ }
2426
+ });
2427
+ const _sfc_main$d = /* @__PURE__ */ defineComponent$1({
2428
+ __name: "CloseIcon",
2429
+ props: {
2430
+ canFullscreen: { type: Boolean, default: true },
2431
+ fullScreen: { type: Boolean }
2432
+ },
2433
+ emits: ["cancel", "fullscreen"],
2434
+ setup(__props, { emit }) {
2435
+ const props2 = __props;
2436
+ const { t } = useI18n("UI");
2437
+ const getClass = computed(() => {
2438
+ return [
2439
+ "dt-basic-modal-close",
2440
+ `dt-basic-modal-close--custom`,
2441
+ {
2442
+ [`dt-basic-modal-close--can-full`]: props2.canFullscreen
2443
+ }
2444
+ ];
2445
+ });
2446
+ function handleCancel(e) {
2447
+ emit("cancel", e);
2448
+ }
2449
+ function handleFullScreen(e) {
2450
+ e?.stopPropagation();
2451
+ e?.preventDefault();
2452
+ emit("fullscreen");
2453
+ }
2454
+ return (_ctx, _cache) => {
2455
+ const _component_ATooltip = Tooltip;
2456
+ return openBlock(), createElementBlock("div", {
2457
+ class: normalizeClass(["flex h-14 items-center justify-center", unref$1(getClass)])
2458
+ }, [
2459
+ __props.canFullscreen ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
2460
+ __props.fullScreen ? (openBlock(), createBlock(_component_ATooltip, {
2461
+ key: 0,
2462
+ title: unref$1(t)("EXIT_FULLSCREEN"),
2463
+ placement: "bottom"
2464
+ }, {
2465
+ default: withCtx(() => [
2466
+ createElementVNode("i", {
2467
+ class: "i ic:baseline-fullscreen-exit hover:font-bold inline-block w-10 h-14 pr-4",
2468
+ onClick: handleFullScreen
2469
+ })
2470
+ ]),
2471
+ _: 1
2472
+ }, 8, ["title"])) : (openBlock(), createBlock(_component_ATooltip, {
2473
+ key: 1,
2474
+ title: unref$1(t)("FULLSCREEN"),
2475
+ placement: "bottom"
2476
+ }, {
2477
+ default: withCtx(() => [
2478
+ createElementVNode("i", {
2479
+ class: "i ic:baseline-fullscreen hover:font-bold inline-block h-14 w-10 pr-4",
2480
+ onClick: handleFullScreen
2481
+ })
2482
+ ]),
2483
+ _: 1
2484
+ }, 8, ["title"]))
2485
+ ], 64)) : createCommentVNode("", true),
2486
+ createElementVNode("i", {
2487
+ class: "i mdi:close h-14 w-10 pr-4",
2488
+ onClick: handleCancel
2489
+ })
2490
+ ], 2);
2491
+ };
2492
+ }
2493
+ });
2494
+ const isServer = typeof window === "undefined";
2495
+ const BAR_MAP = {
2496
+ vertical: {
2497
+ offset: "offsetHeight",
2498
+ scroll: "scrollTop",
2499
+ scrollSize: "scrollHeight",
2500
+ size: "height",
2501
+ key: "vertical",
2502
+ axis: "Y",
2503
+ client: "clientY",
2504
+ direction: "top"
2505
+ },
2506
+ horizontal: {
2507
+ offset: "offsetWidth",
2508
+ scroll: "scrollLeft",
2509
+ scrollSize: "scrollWidth",
2510
+ size: "width",
2511
+ key: "horizontal",
2512
+ axis: "X",
2513
+ client: "clientX",
2514
+ direction: "left"
2515
+ }
2516
+ };
2517
+ function renderThumbStyle({ move, size, bar }) {
2518
+ const style = {};
2519
+ const translate = `translate${bar.axis}(${move}%)`;
2520
+ style[bar.size] = size;
2521
+ style.transform = translate;
2522
+ style.msTransform = translate;
2523
+ style.webkitTransform = translate;
2524
+ return style;
2525
+ }
2526
+ function resizeHandler(entries) {
2527
+ for (const entry of entries) {
2528
+ const listeners = entry.target.__resizeListeners__ || [];
2529
+ if (listeners.length) {
2530
+ listeners.forEach((fn) => {
2531
+ fn();
2532
+ });
2533
+ }
2534
+ }
2535
+ }
2536
+ function addResizeListener(element, fn) {
2537
+ if (isServer)
2538
+ return;
2539
+ if (!element.__resizeListeners__) {
2540
+ element.__resizeListeners__ = [];
2541
+ element.__ro__ = new ResizeObserver(resizeHandler);
2542
+ element.__ro__.observe(element);
2543
+ }
2544
+ element.__resizeListeners__.push(fn);
2545
+ }
2546
+ function removeResizeListener(element, fn) {
2547
+ if (!element || !element.__resizeListeners__)
2548
+ return;
2549
+ element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
2550
+ if (!element.__resizeListeners__.length) {
2551
+ element.__ro__.disconnect();
2552
+ }
2553
+ }
2554
+ const Bar = defineComponent$1({
2555
+ name: "Bar",
2556
+ props: {
2557
+ vertical: Boolean,
2558
+ size: String,
2559
+ move: Number
2560
+ },
2561
+ setup(props2) {
2562
+ const instance = getCurrentInstance$1();
2563
+ const thumb = ref$1();
2564
+ const wrap = inject("scroll-bar-wrap", {});
2565
+ const bar = computed$1(() => {
2566
+ return BAR_MAP[props2.vertical ? "vertical" : "horizontal"];
2567
+ });
2568
+ const barStore = ref$1({});
2569
+ const cursorDown = ref$1();
2570
+ const clickThumbHandler = (e) => {
2571
+ if (e.ctrlKey || e.button === 2) {
2572
+ return;
2573
+ }
2574
+ window.getSelection()?.removeAllRanges();
2575
+ startDrag(e);
2576
+ barStore.value[bar.value.axis] = e.currentTarget[bar.value.offset] - (e[bar.value.client] - e.currentTarget.getBoundingClientRect()[bar.value.direction]);
2577
+ };
2578
+ const clickTrackHandler = (e) => {
2579
+ const offset = Math.abs(
2580
+ e.target.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]
2581
+ );
2582
+ const thumbHalf = thumb.value[bar.value.offset] / 2;
2583
+ const thumbPositionPercentage = (offset - thumbHalf) * 100 / instance?.vnode.el?.[bar.value.offset];
2584
+ wrap.value[bar.value.scroll] = thumbPositionPercentage * wrap.value[bar.value.scrollSize] / 100;
2585
+ };
2586
+ const startDrag = (e) => {
2587
+ e.stopImmediatePropagation();
2588
+ cursorDown.value = true;
2589
+ on(document, "mousemove", mouseMoveDocumentHandler);
2590
+ on(document, "mouseup", mouseUpDocumentHandler);
2591
+ document.onselectstart = () => false;
2592
+ };
2593
+ const mouseMoveDocumentHandler = (e) => {
2594
+ if (cursorDown.value === false)
2595
+ return;
2596
+ const prevPage = barStore.value[bar.value.axis];
2597
+ if (!prevPage)
2598
+ return;
2599
+ const offset = (instance?.vnode.el?.getBoundingClientRect()[bar.value.direction] - e[bar.value.client]) * -1;
2600
+ const thumbClickPosition = thumb.value[bar.value.offset] - prevPage;
2601
+ const thumbPositionPercentage = (offset - thumbClickPosition) * 100 / instance?.vnode.el?.[bar.value.offset];
2602
+ wrap.value[bar.value.scroll] = thumbPositionPercentage * wrap.value[bar.value.scrollSize] / 100;
2603
+ };
2604
+ function mouseUpDocumentHandler() {
2605
+ cursorDown.value = false;
2606
+ barStore.value[bar.value.axis] = 0;
2607
+ off(document, "mousemove", mouseMoveDocumentHandler);
2608
+ document.onselectstart = null;
2609
+ }
2610
+ onUnmounted$1(() => {
2611
+ off(document, "mouseup", mouseUpDocumentHandler);
2612
+ });
2613
+ return () => h$1(
2614
+ "div",
2615
+ {
2616
+ class: ["scrollbar__bar", "is-" + bar.value.key],
2617
+ onMousedown: clickTrackHandler
2618
+ },
2619
+ h$1("div", {
2620
+ ref: thumb,
2621
+ class: "scrollbar__thumb",
2622
+ onMousedown: clickThumbHandler,
2623
+ style: renderThumbStyle({
2624
+ size: props2.size,
2625
+ move: props2.move,
2626
+ bar: bar.value
2627
+ })
2628
+ })
2629
+ );
2630
+ }
2631
+ });
2632
+ const _hoisted_1$6 = { class: "scrollbar relative h-full overflow-hidden" };
2633
+ const _sfc_main$c = /* @__PURE__ */ defineComponent$1({
2634
+ __name: "scroll-bar",
2635
+ props: {
2636
+ wrapClass: {
2637
+ type: [String, Array],
2638
+ default: ""
2639
+ },
2640
+ wrapStyle: Array,
2641
+ viewClass: {
2642
+ type: [String, Array],
2643
+ default: ""
2644
+ },
2645
+ viewStyle: {
2646
+ type: [String, Array],
2647
+ default: ""
2648
+ },
2649
+ noresize: Boolean,
2650
+ tag: {
2651
+ type: String,
2652
+ default: "div"
2653
+ }
2654
+ },
2655
+ setup(__props) {
2656
+ const props2 = __props;
2657
+ const sizeWidth = ref("0");
2658
+ const sizeHeight = ref("0");
2659
+ const moveX = ref(0);
2660
+ const moveY = ref(0);
2661
+ const wrap = ref();
2662
+ const resize = ref();
2663
+ provide("scroll-bar-wrap", wrap);
2664
+ const style = computed(() => {
2665
+ let rsStyle = {};
2666
+ if (Array.isArray(props2.wrapStyle)) {
2667
+ props2.wrapStyle.forEach((it) => {
2668
+ if (it)
2669
+ rsStyle = Object.assign({}, rsStyle, it);
2670
+ });
2671
+ }
2672
+ return rsStyle;
2673
+ });
2674
+ const handleScroll = () => {
2675
+ moveY.value = unref(wrap).scrollTop * 100 / unref(wrap).clientHeight;
2676
+ moveX.value = unref(wrap).scrollLeft * 100 / unref(wrap).clientWidth;
2677
+ };
2678
+ const update = () => {
2679
+ if (!unref(wrap))
2680
+ return;
2681
+ const heightPercentage = unref(wrap).clientHeight * 100 / unref(wrap).scrollHeight;
2682
+ const widthPercentage = unref(wrap).clientWidth * 100 / unref(wrap).scrollWidth;
2683
+ sizeHeight.value = heightPercentage < 100 ? heightPercentage + "%" : "";
2684
+ sizeWidth.value = widthPercentage < 100 ? widthPercentage + "%" : "";
2685
+ };
2686
+ onMounted(() => {
2687
+ nextTick(update);
2688
+ if (!props2.noresize) {
2689
+ addResizeListener(unref(resize), update);
2690
+ addResizeListener(unref(wrap), update);
2691
+ addEventListener("resize", update);
2692
+ }
2693
+ });
2694
+ onBeforeUnmount(() => {
2695
+ if (!props2.noresize) {
2696
+ removeResizeListener(unref(resize), update);
2697
+ removeResizeListener(unref(wrap), update);
2698
+ removeEventListener("resize", update);
2699
+ }
2700
+ });
2701
+ return (_ctx, _cache) => {
2702
+ return openBlock(), createElementBlock("div", _hoisted_1$6, [
2703
+ createElementVNode("div", {
2704
+ ref_key: "wrap",
2705
+ ref: wrap,
2706
+ class: normalizeClass([[__props.wrapClass, "scrollbar__wrap--hidden-default"], "h-full overflow-auto"]),
2707
+ style: normalizeStyle(unref$1(style)),
2708
+ onScroll: handleScroll
2709
+ }, [
2710
+ (openBlock(), createBlock(resolveDynamicComponent(__props.tag), {
2711
+ class: normalizeClass(["box-border", __props.viewClass]),
2712
+ ref_key: "resize",
2713
+ ref: resize,
2714
+ style: normalizeStyle(__props.viewStyle)
2715
+ }, {
2716
+ default: withCtx(() => [
2717
+ renderSlot(_ctx.$slots, "default")
2718
+ ]),
2719
+ _: 3
2720
+ }, 8, ["class", "style"]))
2721
+ ], 38),
2722
+ createVNode(unref$1(Bar), {
2723
+ move: unref$1(moveX),
2724
+ size: unref$1(sizeWidth)
2725
+ }, null, 8, ["move", "size"]),
2726
+ createVNode(unref$1(Bar), {
2727
+ vertical: "",
2728
+ move: unref$1(moveY),
2729
+ size: unref$1(sizeHeight)
2730
+ }, null, 8, ["move", "size"])
2731
+ ]);
2732
+ };
2733
+ }
2734
+ });
2735
+ const _sfc_main$b = /* @__PURE__ */ defineComponent$1({
2736
+ __name: "scroll-container",
2737
+ setup(__props) {
2738
+ const scrollbarRef = ref(null);
2739
+ return (_ctx, _cache) => {
2740
+ return openBlock(), createBlock(_sfc_main$c, mergeProps({
2741
+ ref_key: "scrollbarRef",
2742
+ ref: scrollbarRef
2743
+ }, _ctx.$attrs, { class: "w-full h-full" }), {
2744
+ default: withCtx(() => [
2745
+ renderSlot(_ctx.$slots, "default")
2746
+ ]),
2747
+ _: 3
2748
+ }, 16);
2749
+ };
2750
+ }
2751
+ });
2752
+ const _sfc_main$a = defineComponent({
2753
+ name: "slot-container",
2754
+ props: {
2755
+ template: {
2756
+ type: Function
2757
+ },
2758
+ data: {
2759
+ type: Object
2760
+ }
2761
+ },
2762
+ setup(props2) {
2763
+ return () => {
2764
+ return h("div", [props2.template(props2.data)]);
2765
+ };
2766
+ }
2767
+ });
2768
+ const withInstall = (comp) => {
2769
+ comp.install = (app) => {
2770
+ app.component(comp.name, comp);
2771
+ };
2772
+ return comp;
2773
+ };
2774
+ const DtScrollContainer = withInstall(_sfc_main$b);
2775
+ withInstall(_sfc_main$a);
2776
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent$1({
2777
+ __name: "ModalWrap",
2778
+ props: {
2779
+ useWrapper: { type: Boolean, default: true },
2780
+ modalHeaderHeight: { type: Number, default: 55 },
2781
+ modalFooterHeight: { type: Number, default: 58 },
2782
+ minHeight: { type: Number, default: 200 },
2783
+ height: { type: Number },
2784
+ visible: { type: Boolean },
2785
+ fullScreen: { type: Boolean }
2786
+ },
2787
+ emits: ["ext-height", "height-change"],
2788
+ setup(__props, { emit: emits }) {
2789
+ const props2 = __props;
2790
+ const wrapperRef = ref(null);
2791
+ const wrapRef = ref(null);
2792
+ const realHeightRef = ref(0);
2793
+ const minRealHeightRef = ref(0);
2794
+ let realHeight = 0;
2795
+ const wrapStyle = computed(() => {
2796
+ return {
2797
+ minHeight: `${props2.minHeight}px`,
2798
+ [props2.fullScreen ? "height" : "maxHeight"]: `${unref(realHeightRef)}px`
2799
+ };
2800
+ });
2801
+ onMounted(() => {
2802
+ const { modalHeaderHeight, modalFooterHeight } = props2;
2803
+ emits("ext-height", modalHeaderHeight + modalFooterHeight);
2804
+ });
2805
+ async function getModalDom() {
2806
+ const wrapperRefDom = unref(wrapperRef);
2807
+ if (!wrapperRefDom)
2808
+ return;
2809
+ const bodyDom = wrapperRefDom.$el.parentElement;
2810
+ if (!bodyDom)
2811
+ return;
2812
+ bodyDom.style.padding = "0";
2813
+ await nextTick();
2814
+ const modalDom = bodyDom.parentElement && bodyDom.parentElement.parentElement;
2815
+ return modalDom;
2816
+ }
2817
+ async function setModalHeight() {
2818
+ if (!props2.visible)
2819
+ return;
2820
+ try {
2821
+ const modalDom = await getModalDom();
2822
+ if (!modalDom)
2823
+ return;
2824
+ const modalRect = getComputedStyle(modalDom).top;
2825
+ const modalTop = Number.parseInt(modalRect);
2826
+ let maxHeight = window.innerHeight - props2.modalFooterHeight - props2.modalHeaderHeight - 100;
2827
+ if (modalTop < 40) {
2828
+ maxHeight -= 26;
2829
+ }
2830
+ await nextTick();
2831
+ const warpEl = unref(wrapRef);
2832
+ if (!warpEl)
2833
+ return;
2834
+ await nextTick();
2835
+ realHeight = warpEl.scrollHeight;
2836
+ if (props2.fullScreen) {
2837
+ realHeightRef.value = window.innerHeight - props2.modalFooterHeight - props2.modalHeaderHeight;
2838
+ } else {
2839
+ realHeightRef.value = props2.height ? props2.height : realHeight > maxHeight ? maxHeight : realHeight;
2840
+ }
2841
+ emits("height-change", unref(realHeightRef));
2842
+ const _modalDom = await getModalDom();
2843
+ _modalDom.style.top = (window.innerHeight - _modalDom.offsetHeight) / 2 + "px";
2844
+ } catch (error2) {
2845
+ console.log(error2);
2846
+ }
2847
+ }
2848
+ windowResizeFn(setModalHeight.bind(null, false));
2849
+ watchEffect(() => {
2850
+ props2.useWrapper && setModalHeight();
2851
+ });
2852
+ watch(
2853
+ () => props2.fullScreen,
2854
+ (v) => {
2855
+ setModalHeight();
2856
+ if (!v) {
2857
+ realHeightRef.value = minRealHeightRef.value;
2858
+ } else {
2859
+ minRealHeightRef.value = realHeightRef.value;
2860
+ }
2861
+ }
2862
+ );
2863
+ return (_ctx, _cache) => {
2864
+ return openBlock(), createBlock(unref$1(DtScrollContainer), {
2865
+ ref_key: "wrapperRef",
2866
+ ref: wrapperRef
2867
+ }, {
2868
+ default: withCtx(() => [
2869
+ createElementVNode("div", {
2870
+ ref_key: "wrapRef",
2871
+ ref: wrapRef,
2872
+ style: normalizeStyle(unref$1(wrapStyle))
2873
+ }, [
2874
+ renderSlot(_ctx.$slots, "default")
2875
+ ], 4)
2876
+ ]),
2877
+ _: 3
2878
+ }, 512);
2879
+ };
2880
+ }
2881
+ });
2882
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent$1({
2883
+ __name: "ModalFooter",
2884
+ props: {
2885
+ buttons: Object,
2886
+ showSave: { type: Boolean, default: true },
2887
+ showCancel: { type: Boolean, default: true },
2888
+ okText: { type: String },
2889
+ cancelText: { type: String }
2890
+ },
2891
+ emits: [
2892
+ "handleSave",
2893
+ "handleCancel"
2894
+ ],
2895
+ setup(__props, { emit: emits }) {
2896
+ const props2 = __props;
2897
+ const { t } = useI18n("UI");
2898
+ const buttonList = computed$1(() => {
2899
+ if (props2.buttons && props2.buttons.length)
2900
+ return props2.buttons;
2901
+ let buttonActions = [
2902
+ { t: "\u4FDD\u5B58", name: props2.okText || t("SAVE"), preIcon: "mdi:content-save", type: "primary", flag: "OK" },
2903
+ { t: "\u5173\u95ED", name: props2.cancelText || t("CLOSE"), preIcon: "mdi:close", flag: "CANCEL" }
2904
+ ];
2905
+ if (!props2.showSave)
2906
+ buttonActions = buttonActions.filter((btn) => btn.flag !== "OK");
2907
+ if (!props2.showCancel)
2908
+ buttonActions = buttonActions.filter((btn) => btn.flag !== "CANCEL");
2909
+ return buttonActions;
2910
+ });
2911
+ function handleMethod(item) {
2912
+ switch (item.flag) {
2913
+ case "OK":
2914
+ emits("handleSave");
2915
+ break;
2916
+ case "CANCEL":
2917
+ emits("handleCancel");
2918
+ break;
2919
+ }
2920
+ }
2921
+ return (_ctx, _cache) => {
2922
+ return openBlock(), createElementBlock(Fragment, null, [
2923
+ renderSlot(_ctx.$slots, "appendFooter"),
2924
+ createVNode(_sfc_main$f, {
2925
+ mode: "dialog",
2926
+ buttonList: unref$1(buttonList),
2927
+ onHandleMethod: _cache[0] || (_cache[0] = ($event) => handleMethod($event))
2928
+ }, null, 8, ["buttonList"])
2929
+ ], 64);
2930
+ };
2931
+ }
2932
+ });
2933
+ function useFullScreen(wrapClassName) {
2934
+ const fullScreenRef = ref(false);
2935
+ const getWrapClassName = computed(() => {
2936
+ const clsName = unref(wrapClassName) || "";
2937
+ const cls = unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName);
2938
+ return `dt-modal ${cls}`;
2939
+ });
2940
+ function toggleFullScreen(e) {
2941
+ e && e.stopPropagation();
2942
+ fullScreenRef.value = !unref(fullScreenRef);
2943
+ dispatchResize();
2944
+ }
2945
+ return {
2946
+ fullScreenRef,
2947
+ getWrapClassName,
2948
+ toggleFullScreen
2949
+ };
2950
+ }
2951
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent$1({
2952
+ __name: "index",
2953
+ props: basicProps,
2954
+ emits: ["visible-change", "height-change", "cancel", "save", "register", "update:visible"],
2955
+ setup(__props, { emit: emits }) {
2956
+ const props2 = __props;
2957
+ const visibleRef = ref(false);
2958
+ const propsRef = ref();
2959
+ const modalWrapperRef = ref(null);
2960
+ const { getWrapClassName, toggleFullScreen, fullScreenRef } = useFullScreen(computed(() => unref(propsRef)?.wrapClassName));
2961
+ const getMergeProps = computed(() => {
2962
+ return {
2963
+ ...props2,
2964
+ ...unref(propsRef)
2965
+ };
2966
+ });
2967
+ const getBindValue = computed(() => {
2968
+ const bindValue = {
2969
+ ...unref(getMergeProps),
2970
+ ...unref(propsRef),
2971
+ visible: unref(visibleRef),
2972
+ wrapClassName: unref(getWrapClassName)
2973
+ };
2974
+ let omitArr = unref(fullScreenRef) ? ["height", "title"] : ["title"];
2975
+ if (isArray(unref(propsRef)?.footer)) {
2976
+ omitArr.push("footer");
2977
+ }
2978
+ return omit(bindValue, omitArr);
2979
+ });
2980
+ const getWrapperHeight = computed(() => {
2981
+ if (unref(fullScreenRef))
2982
+ return void 0;
2983
+ return unref(getBindValue).height;
2984
+ });
2985
+ const modalFooterHeight = computed(() => {
2986
+ if (isArray(props2.footer)) {
2987
+ return (unref(propsRef)?.footer).length ? 0 : void 0;
2988
+ }
2989
+ return props2?.footer !== void 0 && !props2.footer ? 0 : void 0;
2990
+ });
2991
+ const modalMethods = {
2992
+ setModalProps,
2993
+ redoModalHeight: () => {
2994
+ nextTick(() => {
2995
+ if (unref(modalWrapperRef)) {
2996
+ unref(modalWrapperRef).setModalHeight();
2997
+ }
2998
+ });
2999
+ }
3000
+ };
3001
+ const instance = getCurrentInstance();
3002
+ if (instance) {
3003
+ emits("register", modalMethods, instance.uid);
3004
+ }
3005
+ function handleHeightChange(height) {
3006
+ emits("height-change", height);
3007
+ }
3008
+ function setModalProps(props22) {
3009
+ propsRef.value = deepMerge(unref(propsRef) || {}, props22);
3010
+ if (Reflect.has(props22, "visible")) {
3011
+ visibleRef.value = !!props22.visible;
3012
+ }
3013
+ if (Reflect.has(props22, "defaultFullscreen")) {
3014
+ fullScreenRef.value = !!props22.defaultFullscreen;
3015
+ }
3016
+ }
3017
+ function handleSave() {
3018
+ emits("save");
3019
+ }
3020
+ async function handleCancel(e = null) {
3021
+ if (e) {
3022
+ e?.stopPropagation();
3023
+ if (e.target?.classList?.contains("dt-basic-modal-close--custom"))
3024
+ return;
3025
+ if (props2.closeFunc && isFunction(props2.closeFunc)) {
3026
+ const isClose = await props2.closeFunc();
3027
+ visibleRef.value = !isClose;
3028
+ return;
3029
+ }
3030
+ }
3031
+ const { afterClose } = unref(getBindValue);
3032
+ if (afterClose && isFunction(afterClose)) {
3033
+ afterClose();
3034
+ }
3035
+ visibleRef.value = false;
3036
+ emits("cancel", e);
3037
+ }
3038
+ watch(() => unref(visibleRef), (v) => {
3039
+ emits("visible-change", v);
3040
+ emits("update:visible", v);
3041
+ nextTick(() => {
3042
+ if (props2.scrollTop && v && unref(modalWrapperRef)) {
3043
+ unref(modalWrapperRef).$el.scrollTop = 0;
3044
+ }
3045
+ });
3046
+ }, {
3047
+ immediate: false
3048
+ });
3049
+ return (_ctx, _cache) => {
3050
+ const _component_ASpin = Spin;
3051
+ return openBlock(), createBlock(unref$1(Modal), mergeProps(unref$1(getBindValue), { onCancel: handleCancel }), createSlots({
3052
+ default: withCtx(() => [
3053
+ createVNode(_component_ASpin, {
3054
+ spinning: unref$1(getBindValue).loading,
3055
+ tip: unref$1(getBindValue).loadingTip
3056
+ }, {
3057
+ default: withCtx(() => [
3058
+ createVNode(_sfc_main$9, mergeProps({
3059
+ useWrapper: unref$1(getBindValue).useWrapper,
3060
+ fullScreen: unref$1(fullScreenRef),
3061
+ ref_key: "modalWrapperRef",
3062
+ ref: modalWrapperRef,
3063
+ minHeight: unref$1(getBindValue).minHeight,
3064
+ height: unref$1(getWrapperHeight),
3065
+ visible: unref$1(visibleRef),
3066
+ modalFooterHeight: unref$1(modalFooterHeight)
3067
+ }, unref$1(omit)(unref$1(getBindValue).wrapperProps, "visible", "height", "modalFooterHeight"), { onHeightChange: handleHeightChange }), {
3068
+ default: withCtx(() => [
3069
+ renderSlot(_ctx.$slots, "default")
3070
+ ]),
3071
+ _: 3
3072
+ }, 16, ["useWrapper", "fullScreen", "minHeight", "height", "visible", "modalFooterHeight"])
3073
+ ]),
3074
+ _: 3
3075
+ }, 8, ["spinning", "tip"])
3076
+ ]),
3077
+ _: 2
3078
+ }, [
3079
+ !_ctx.$slots.closeIcon ? {
3080
+ name: "closeIcon",
3081
+ fn: withCtx(() => [
3082
+ createVNode(_sfc_main$d, {
3083
+ canFullscreen: unref$1(getBindValue).canFullscreen,
3084
+ fullScreen: unref$1(fullScreenRef),
3085
+ onCancel: handleCancel,
3086
+ onFullscreen: unref$1(toggleFullScreen)
3087
+ }, null, 8, ["canFullscreen", "fullScreen", "onFullscreen"])
3088
+ ]),
3089
+ key: "0"
3090
+ } : void 0,
3091
+ !_ctx.$slots.title ? {
3092
+ name: "title",
3093
+ fn: withCtx(() => [
3094
+ createTextVNode(toDisplayString(unref$1(getMergeProps).title), 1)
3095
+ ]),
3096
+ key: "1"
3097
+ } : void 0,
3098
+ !_ctx.$slots.footer ? {
3099
+ name: "footer",
3100
+ fn: withCtx(() => [
3101
+ createVNode(_sfc_main$8, {
3102
+ buttons: unref$1(propsRef)?.footer,
3103
+ showSave: unref$1(getBindValue).showOkBtn,
3104
+ showCancel: unref$1(getBindValue).showCancelBtn,
3105
+ okText: unref$1(getBindValue).okText,
3106
+ cancelText: unref$1(getBindValue).cancelText,
3107
+ onHandleSave: handleSave,
3108
+ onHandleCancel: handleCancel
3109
+ }, createSlots({ _: 2 }, [
3110
+ renderList(Object.keys(_ctx.$slots), (item) => {
3111
+ return {
3112
+ name: item,
3113
+ fn: withCtx((data) => [
3114
+ renderSlot(_ctx.$slots, item, normalizeProps(guardReactiveProps(data || {})))
3115
+ ])
3116
+ };
3117
+ })
3118
+ ]), 1032, ["buttons", "showSave", "showCancel", "okText", "cancelText"])
3119
+ ]),
3120
+ key: "2"
3121
+ } : void 0,
3122
+ renderList(Object.keys(unref$1(omit)(_ctx.$slots, "default")), (item) => {
3123
+ return {
3124
+ name: item,
3125
+ fn: withCtx((data) => [
3126
+ renderSlot(_ctx.$slots, item, normalizeProps(guardReactiveProps(data || {})))
3127
+ ])
3128
+ };
3129
+ })
3130
+ ]), 1040);
3131
+ };
3132
+ }
3133
+ });
3134
+ const index = "";
3135
+ const _hoisted_1$5 = { class: "column-select" };
3136
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent$1({
3137
+ __name: "DownloadCtrl",
3138
+ setup(__props) {
3139
+ const { t } = useI18n("UI");
3140
+ const { message } = useMessage();
3141
+ const state = reactive({
3142
+ indeterminate: false,
3143
+ checkAll: false
3144
+ });
3145
+ const modalData = ref([]);
3146
+ const onCheckAllChange = (e) => {
3147
+ modalData.value?.map((it) => it.show = e.target.checked);
3148
+ };
3149
+ const [registerDialog, { closeModal }] = useModal(
3150
+ {
3151
+ width: "60%",
3152
+ title: t("SETTING_EXPORT_COLUMN")
3153
+ },
3154
+ (data) => {
3155
+ modalData.value = data;
3156
+ }
3157
+ );
3158
+ function save() {
3159
+ let columns = unref(modalData)?.filter((it) => it.show);
3160
+ if (!columns.length) {
3161
+ message.error(t("NO_EXPORT_COLUMN"));
3162
+ return;
3163
+ }
3164
+ closeModal(columns);
3165
+ }
3166
+ watch(
3167
+ () => unref(modalData),
3168
+ (v) => {
3169
+ if (isArray(v)) {
3170
+ let showLens = v.filter((it) => it.show).length;
3171
+ Object.assign(state, {
3172
+ checkAll: showLens === v.length,
3173
+ indeterminate: showLens !== v.length && showLens > 0
3174
+ });
3175
+ }
3176
+ },
3177
+ {
3178
+ deep: true
3179
+ }
3180
+ );
3181
+ return (_ctx, _cache) => {
3182
+ const _component_ACheckbox = Checkbox$1;
3183
+ const _component_ADivider = Divider$1;
3184
+ const _component_ACol = Col$1;
3185
+ const _component_ARow = Row;
3186
+ return openBlock(), createBlock(unref$1(_sfc_main$7), {
3187
+ onRegister: unref$1(registerDialog),
3188
+ onSave: save
3189
+ }, {
3190
+ default: withCtx(() => [
3191
+ createElementVNode("div", _hoisted_1$5, [
3192
+ createVNode(_component_ACheckbox, {
3193
+ checked: unref$1(state).checkAll,
3194
+ "onUpdate:checked": _cache[0] || (_cache[0] = ($event) => unref$1(state).checkAll = $event),
3195
+ indeterminate: unref$1(state).indeterminate,
3196
+ onChange: onCheckAllChange
3197
+ }, {
3198
+ default: withCtx(() => [
3199
+ createTextVNode(toDisplayString(unref$1(t)("SELECT_ALL")), 1)
3200
+ ]),
3201
+ _: 1
3202
+ }, 8, ["checked", "indeterminate"]),
3203
+ createVNode(_component_ADivider, { dashed: "" }),
3204
+ createVNode(_component_ARow, null, {
3205
+ default: withCtx(() => [
3206
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref$1(modalData), (it, index2) => {
3207
+ return openBlock(), createBlock(_component_ACol, { span: 8 }, {
3208
+ default: withCtx(() => [
3209
+ createVNode(_component_ACheckbox, {
3210
+ checked: it.show,
3211
+ "onUpdate:checked": ($event) => it.show = $event
3212
+ }, {
3213
+ default: withCtx(() => [
3214
+ createTextVNode(toDisplayString(it.title), 1)
3215
+ ]),
3216
+ _: 2
3217
+ }, 1032, ["checked", "onUpdate:checked"])
3218
+ ]),
3219
+ _: 2
3220
+ }, 1024);
3221
+ }), 256))
3222
+ ]),
3223
+ _: 1
3224
+ })
3225
+ ])
3226
+ ]),
3227
+ _: 1
3228
+ }, 8, ["onRegister"]);
3229
+ };
3230
+ }
3231
+ });
3232
+ const _hoisted_1$4 = /* @__PURE__ */ createElementVNode("i", { class: "i ic:baseline-download w-7 leading-7 text-center cursor-pointer" }, null, -1);
3233
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent$1({
3234
+ __name: "Download",
3235
+ props: {
3236
+ onlyBackDowonload: Boolean,
3237
+ onlyFrontDownload: Boolean
3238
+ },
3239
+ setup(__props) {
3240
+ const table = getTableInstance();
3241
+ const [registerDialog, { openModal }] = useModalOut();
3242
+ const { t } = useI18n("UI");
3243
+ function handleTitleClick({ key }) {
3244
+ const { onDownload, columns: allColumns, dataSource } = unref(table.getBind);
3245
+ const excludesFlag = ["ACTION", "CHECKBOX", "RADIO"];
3246
+ const columns = allColumns.filter((it) => !excludesFlag.includes(it.flag));
3247
+ openModal(columns, (selectColumns) => {
3248
+ onDownload({
3249
+ type: key,
3250
+ columns: selectColumns,
3251
+ rows: key === "select" ? table.getSelectRows() : key === "current" ? dataSource : []
3252
+ });
3253
+ });
3254
+ }
3255
+ return (_ctx, _cache) => {
3256
+ const _component_AMenuItem = MenuItem;
3257
+ const _component_AMenu = Menu;
3258
+ const _component_ADropdown = Dropdown;
3259
+ const _component_ATooltip = Tooltip;
3260
+ return openBlock(), createBlock(_component_ATooltip, { placement: "top" }, {
3261
+ title: withCtx(() => [
3262
+ createElementVNode("span", null, toDisplayString(unref$1(t)("EXPORT")), 1)
3263
+ ]),
3264
+ default: withCtx(() => [
3265
+ createVNode(_component_ADropdown, {
3266
+ placement: "bottom",
3267
+ trigger: ["click"],
3268
+ getPopupContainer: unref$1(getPopupContainer)
3269
+ }, {
3270
+ overlay: withCtx(() => [
3271
+ createVNode(_component_AMenu, { onClick: handleTitleClick }, {
3272
+ default: withCtx(() => [
3273
+ !__props.onlyBackDowonload ? (openBlock(), createBlock(_component_AMenuItem, { key: "current" }, {
3274
+ default: withCtx(() => [
3275
+ createElementVNode("span", null, toDisplayString(unref$1(t)("EXPORT_CURRENT_PAGE")), 1)
3276
+ ]),
3277
+ _: 1
3278
+ })) : createCommentVNode("", true),
3279
+ !__props.onlyBackDowonload ? (openBlock(), createBlock(_component_AMenuItem, { key: "select" }, {
3280
+ default: withCtx(() => [
3281
+ createElementVNode("span", null, toDisplayString(unref$1(t)("EXPORT_SELECT_COLUMN")), 1)
3282
+ ]),
3283
+ _: 1
3284
+ })) : createCommentVNode("", true),
3285
+ !__props.onlyFrontDownload ? (openBlock(), createBlock(_component_AMenuItem, { key: "all" }, {
3286
+ default: withCtx(() => [
3287
+ createElementVNode("span", null, toDisplayString(unref$1(t)("EXPORT_ALL")), 1)
3288
+ ]),
3289
+ _: 1
3290
+ })) : createCommentVNode("", true)
3291
+ ]),
3292
+ _: 1
3293
+ })
3294
+ ]),
3295
+ default: withCtx(() => [
3296
+ _hoisted_1$4
3297
+ ]),
3298
+ _: 1
3299
+ }, 8, ["getPopupContainer"]),
3300
+ createVNode(_sfc_main$6, { onRegister: unref$1(registerDialog) }, null, 8, ["onRegister"])
3301
+ ]),
3302
+ _: 1
3303
+ });
3304
+ };
3305
+ }
3306
+ });
3307
+ const _hoisted_1$3 = /* @__PURE__ */ createElementVNode("i", { class: "i ant-design:drag-outlined drag-icon cursor-pointer" }, null, -1);
3308
+ const _hoisted_2$1 = ["onClick"];
3309
+ const _hoisted_3$1 = ["onClick"];
3310
+ const _hoisted_4$1 = /* @__PURE__ */ createElementVNode("i", { class: "i ant-design:setting-outlined w-7 leading-7 text-center cursor-pointer" }, null, -1);
3311
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent$1({
3312
+ __name: "Column",
3313
+ emits: [
3314
+ "columns-change"
3315
+ ],
3316
+ setup(__props, { emit: emits }) {
3317
+ const { t } = useI18n("UI");
3318
+ const attrs = useAttrs();
3319
+ const prefixCls = "column-setting";
3320
+ const table = getTableInstance();
3321
+ const defaultRowSelection = omit(table.getRowSelection(), "selectedRowKeys");
3322
+ let inited = false;
3323
+ const cachePlainOptions = ref([]);
3324
+ const plainOptions = ref([]);
3325
+ const plainSortOptions = ref([]);
3326
+ const columnListRef = ref(null);
3327
+ const checkIndex = ref(false);
3328
+ const checkSelect = ref(false);
3329
+ const getValues = computed(() => {
3330
+ return unref(table?.getBind);
3331
+ });
3332
+ let sortable;
3333
+ let sortableOrder = [];
3334
+ const state = reactive({
3335
+ checkAll: true,
3336
+ checkedList: [],
3337
+ defaultCheckList: []
3338
+ });
3339
+ const indeterminate = computed(() => {
3340
+ let len = plainOptions.value.length;
3341
+ let checkedLen = state.checkedList.length;
3342
+ unref(checkIndex) && checkedLen--;
3343
+ return checkedLen > 0 && checkedLen < len;
3344
+ });
3345
+ watchEffect(() => {
3346
+ const columns = table.getColumns();
3347
+ if (columns && columns.length) {
3348
+ init();
3349
+ }
3350
+ });
3351
+ watchEffect(() => {
3352
+ const values = unref(getValues);
3353
+ checkIndex.value = !!values.showIndexColumn;
3354
+ checkSelect.value = !!values.rowSelection;
3355
+ });
3356
+ function handleVisibleChange() {
3357
+ if (inited)
3358
+ return;
3359
+ nextTick(() => {
3360
+ const columnListEl = unref(columnListRef);
3361
+ if (!columnListEl)
3362
+ return;
3363
+ const el = columnListEl.$el;
3364
+ if (!el)
3365
+ return;
3366
+ sortable = Sortablejs.create(unref(el), {
3367
+ animation: 500,
3368
+ delay: 400,
3369
+ delayOnTouchOnly: true,
3370
+ handle: ".drag-icon ",
3371
+ onEnd: (evt) => {
3372
+ const { oldIndex, newIndex } = evt;
3373
+ if (isNullAndUnDef(oldIndex) || isNullAndUnDef(newIndex) || oldIndex === newIndex) {
3374
+ return;
3375
+ }
3376
+ const columns = cloneDeep(plainSortOptions.value);
3377
+ if (oldIndex > newIndex) {
3378
+ columns.splice(newIndex, 0, columns[oldIndex]);
3379
+ columns.splice(oldIndex + 1, 1);
3380
+ } else {
3381
+ columns.splice(newIndex + 1, 0, columns[oldIndex]);
3382
+ columns.splice(oldIndex, 1);
3383
+ }
3384
+ plainSortOptions.value = columns;
3385
+ setColumns(
3386
+ columns.map((col) => col.value).filter((value) => state.checkedList.includes(value))
3387
+ );
3388
+ }
3389
+ });
3390
+ sortableOrder = sortable.toArray();
3391
+ inited = true;
3392
+ });
3393
+ }
3394
+ function onCheckAllChange(e) {
3395
+ const checkList = plainOptions.value.map((item) => item.value);
3396
+ if (e.target.checked) {
3397
+ state.checkedList = checkList;
3398
+ setColumns(checkList);
3399
+ } else {
3400
+ state.checkedList = [];
3401
+ setColumns([]);
3402
+ }
3403
+ }
3404
+ function handleIndexCheckChange(e) {
3405
+ table.setProps({
3406
+ showIndexColumn: e.target.checked
3407
+ });
3408
+ }
3409
+ function handleSelectCheckChange(e) {
3410
+ table.setProps({
3411
+ rowSelection: e.target.checked ? defaultRowSelection : null
3412
+ });
3413
+ }
3414
+ function onChange(checkedList) {
3415
+ const len = plainSortOptions.value.length;
3416
+ state.checkAll = checkedList.length === len;
3417
+ const sortList = unref(plainSortOptions).map((item) => item.value);
3418
+ checkedList.sort((prev, next) => {
3419
+ return sortList.indexOf(prev) - sortList.indexOf(next);
3420
+ });
3421
+ setColumns(checkedList);
3422
+ }
3423
+ function reset() {
3424
+ state.checkedList = [...state.defaultCheckList];
3425
+ state.checkAll = true;
3426
+ plainOptions.value = unref(cachePlainOptions);
3427
+ plainSortOptions.value = unref(cachePlainOptions);
3428
+ setColumns(table.getCacheColumns());
3429
+ sortable.sort(sortableOrder);
3430
+ }
3431
+ function getColumns() {
3432
+ return table.getColumns({
3433
+ ignoreIndex: true,
3434
+ ignoreAction: true
3435
+ }).reduce((ret, it) => {
3436
+ ret.push({
3437
+ label: it.title,
3438
+ value: it.dataIndex || it.title,
3439
+ ...it
3440
+ });
3441
+ return ret;
3442
+ }, []);
3443
+ }
3444
+ function handleColumnFixed(item, fixed) {
3445
+ if (!state.checkedList.includes(item.dataIndex))
3446
+ return;
3447
+ const columns = getColumns();
3448
+ const isFixed = item.fixed === fixed ? false : fixed;
3449
+ const index2 = columns.findIndex((col) => col.dataIndex === item.dataIndex);
3450
+ if (index2 !== -1) {
3451
+ columns[index2].fixed = isFixed;
3452
+ }
3453
+ item.fixed = isFixed;
3454
+ if (isFixed && !item.width) {
3455
+ item.width = 100;
3456
+ }
3457
+ table.setColumnsByDataIndex?.(item.dataIndex, { fixed: isFixed });
3458
+ setColumns(columns);
3459
+ }
3460
+ function setColumns(columns) {
3461
+ table.setColumns(columns);
3462
+ const data = unref(plainSortOptions).map((col) => {
3463
+ const visable = columns.findIndex(
3464
+ (c) => c === col.value || typeof c !== "string" && c.dataIndex === col.value
3465
+ ) !== -1;
3466
+ return { dataIndex: col.value, fixed: col.fixed, visable };
3467
+ });
3468
+ emits("columns-change", data);
3469
+ }
3470
+ function init() {
3471
+ const columns = getColumns();
3472
+ const checkList = table.getColumns({ ignoreAction: true }).map((it) => it.defaultHidden ? "" : it.dataIndex || it.title).filter(Boolean);
3473
+ if (!plainOptions.value.length) {
3474
+ plainOptions.value = columns;
3475
+ plainSortOptions.value = columns;
3476
+ cachePlainOptions.value = cloneDeep(columns);
3477
+ state.defaultCheckList = checkList;
3478
+ } else {
3479
+ unref(plainOptions).forEach(
3480
+ (it) => it.fixed === columns.find((col) => col.dataIndex === it.dataIndex)?.fixed
3481
+ );
3482
+ }
3483
+ state.isInit = true;
3484
+ state.checkedList = checkList;
3485
+ }
3486
+ function getPopupContainer$1() {
3487
+ return isFunction$1(attrs.getPopupContainer) ? attrs.getPopupContainer() : getPopupContainer();
3488
+ }
3489
+ return (_ctx, _cache) => {
3490
+ const _component_ACheckbox = Checkbox$1;
3491
+ const _component_AButton = Button;
3492
+ const _component_ATooltip = Tooltip;
3493
+ const _component_ADivider = Divider$1;
3494
+ const _component_ACheckboxGroup = CheckboxGroup;
3495
+ const _component_APopover = Popover$1;
3496
+ return openBlock(), createBlock(_component_ATooltip, { placement: "top" }, {
3497
+ title: withCtx(() => [
3498
+ createElementVNode("span", null, toDisplayString(unref$1(t)("COLUMN_CONTROL")), 1)
3499
+ ]),
3500
+ default: withCtx(() => [
3501
+ createVNode(_component_APopover, {
3502
+ placement: "bottomLeft",
3503
+ trigger: "click",
3504
+ overlayClassName: `${prefixCls}__cloumn-list`,
3505
+ onVisibleChange: handleVisibleChange,
3506
+ getPopupContainer: getPopupContainer$1
3507
+ }, {
3508
+ title: withCtx(() => [
3509
+ createElementVNode("div", {
3510
+ class: normalizeClass(`${prefixCls}__popover-title flex`)
3511
+ }, [
3512
+ createVNode(_component_ACheckbox, {
3513
+ indeterminate: unref$1(indeterminate),
3514
+ checked: unref$1(state).checkAll,
3515
+ "onUpdate:checked": _cache[0] || (_cache[0] = ($event) => unref$1(state).checkAll = $event),
3516
+ onChange: onCheckAllChange
3517
+ }, {
3518
+ default: withCtx(() => [
3519
+ createTextVNode(toDisplayString(unref$1(t)("COLUMN_SHOW")), 1)
3520
+ ]),
3521
+ _: 1
3522
+ }, 8, ["indeterminate", "checked"]),
3523
+ createVNode(_component_ACheckbox, {
3524
+ checked: unref$1(checkIndex),
3525
+ "onUpdate:checked": _cache[1] || (_cache[1] = ($event) => isRef(checkIndex) ? checkIndex.value = $event : null),
3526
+ onChange: handleIndexCheckChange
3527
+ }, {
3528
+ default: withCtx(() => [
3529
+ createTextVNode(toDisplayString(unref$1(t)("INDEX")), 1)
3530
+ ]),
3531
+ _: 1
3532
+ }, 8, ["checked"]),
3533
+ createVNode(_component_ACheckbox, {
3534
+ checked: unref$1(checkSelect),
3535
+ "onUpdate:checked": _cache[2] || (_cache[2] = ($event) => isRef(checkSelect) ? checkSelect.value = $event : null),
3536
+ onChange: handleSelectCheckChange,
3537
+ disabled: !unref$1(defaultRowSelection)
3538
+ }, {
3539
+ default: withCtx(() => [
3540
+ createTextVNode(toDisplayString(unref$1(t)("CHECKBOX")), 1)
3541
+ ]),
3542
+ _: 1
3543
+ }, 8, ["checked", "disabled"]),
3544
+ createVNode(_component_AButton, {
3545
+ type: "link",
3546
+ onClick: reset
3547
+ }, {
3548
+ default: withCtx(() => [
3549
+ createTextVNode(toDisplayString(unref$1(t)("RESET")), 1)
3550
+ ]),
3551
+ _: 1
3552
+ })
3553
+ ], 2)
3554
+ ]),
3555
+ content: withCtx(() => [
3556
+ createVNode(_component_ACheckboxGroup, {
3557
+ value: unref$1(state).checkedList,
3558
+ "onUpdate:value": _cache[3] || (_cache[3] = ($event) => unref$1(state).checkedList = $event),
3559
+ onChange,
3560
+ ref_key: "columnListRef",
3561
+ ref: columnListRef
3562
+ }, {
3563
+ default: withCtx(() => [
3564
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref$1(plainOptions), (item) => {
3565
+ return openBlock(), createElementBlock("div", {
3566
+ key: item.value,
3567
+ class: normalizeClass(`${prefixCls}__check-item flex pt-1 pr-4 pb-2 items-center`)
3568
+ }, [
3569
+ _hoisted_1$3,
3570
+ createVNode(_component_ACheckbox, {
3571
+ value: item.value
3572
+ }, {
3573
+ default: withCtx(() => [
3574
+ createTextVNode(toDisplayString(item.label), 1)
3575
+ ]),
3576
+ _: 2
3577
+ }, 1032, ["value"]),
3578
+ createVNode(_component_ATooltip, {
3579
+ placement: "bottomLeft",
3580
+ mouseLeaveDelay: 0.4,
3581
+ getPopupContainer: getPopupContainer$1
3582
+ }, {
3583
+ title: withCtx(() => [
3584
+ createTextVNode(toDisplayString(unref$1(t)("FIXED_TO_LEFT")), 1)
3585
+ ]),
3586
+ default: withCtx(() => [
3587
+ createElementVNode("span", {
3588
+ class: normalizeClass({
3589
+ disabled: !unref$1(state).checkedList.includes(item.value),
3590
+ active: item.fixed === "left"
3591
+ })
3592
+ }, [
3593
+ createElementVNode("i", {
3594
+ class: normalizeClass(["i mdi:arrow-collapse-left cursor-pointer", `${prefixCls}__fixed-left`]),
3595
+ onClick: ($event) => handleColumnFixed(item, "left")
3596
+ }, null, 10, _hoisted_2$1)
3597
+ ], 2)
3598
+ ]),
3599
+ _: 2
3600
+ }, 1032, ["mouseLeaveDelay"]),
3601
+ createVNode(_component_ADivider, { type: "vertical" }),
3602
+ createVNode(_component_ATooltip, {
3603
+ placement: "bottomLeft",
3604
+ mouseLeaveDelay: 0.4,
3605
+ getPopupContainer: getPopupContainer$1
3606
+ }, {
3607
+ title: withCtx(() => [
3608
+ createTextVNode(toDisplayString(unref$1(t)("FIXED_TO_RIGHT")), 1)
3609
+ ]),
3610
+ default: withCtx(() => [
3611
+ createElementVNode("span", {
3612
+ class: normalizeClass({
3613
+ disabled: !unref$1(state).checkedList.includes(item.value),
3614
+ active: item.fixed === "right"
3615
+ })
3616
+ }, [
3617
+ createElementVNode("i", {
3618
+ class: normalizeClass(["i mdi:arrow-collapse-right cursor-pointer", `${prefixCls}__fixed-right`]),
3619
+ onClick: ($event) => handleColumnFixed(item, "right")
3620
+ }, null, 10, _hoisted_3$1)
3621
+ ], 2)
3622
+ ]),
3623
+ _: 2
3624
+ }, 1032, ["mouseLeaveDelay"])
3625
+ ], 2);
3626
+ }), 128))
3627
+ ]),
3628
+ _: 1
3629
+ }, 8, ["value"])
3630
+ ]),
3631
+ default: withCtx(() => [
3632
+ _hoisted_4$1
3633
+ ]),
3634
+ _: 1
3635
+ }, 8, ["overlayClassName"])
3636
+ ]),
3637
+ _: 1
3638
+ });
3639
+ };
3640
+ }
3641
+ });
3642
+ const _hoisted_1$2 = { class: "flex dt-table-setting" };
3643
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent$1({
3644
+ __name: "index",
3645
+ props: {
3646
+ setting: {
3647
+ type: Object,
3648
+ default: () => ({})
3649
+ }
3650
+ },
3651
+ emits: ["columns-change"],
3652
+ setup(__props, { emit: emits }) {
3653
+ const props2 = __props;
3654
+ const getSetting = computed(() => {
3655
+ return {
3656
+ download: true,
3657
+ setting: true,
3658
+ fullscreen: true,
3659
+ ...props2.setting
3660
+ };
3661
+ });
3662
+ function handleColumnChange(data) {
3663
+ emits("columns-change", data);
3664
+ }
3665
+ return (_ctx, _cache) => {
3666
+ return openBlock(), createElementBlock("div", _hoisted_1$2, [
3667
+ unref$1(getSetting).download ? (openBlock(), createBlock(_sfc_main$5, normalizeProps(mergeProps({ key: 0 }, unref$1(getSetting))), null, 16)) : createCommentVNode("", true),
3668
+ unref$1(getSetting).setting ? (openBlock(), createBlock(_sfc_main$4, {
3669
+ key: 1,
3670
+ onColumnsChange: handleColumnChange
3671
+ })) : createCommentVNode("", true),
3672
+ unref$1(getSetting).fullscreen ? (openBlock(), createBlock(_sfc_main$e, { key: 2 })) : createCommentVNode("", true)
3673
+ ]);
3674
+ };
3675
+ }
3676
+ });
3677
+ const _hoisted_1$1 = { class: "dt-table-header" };
3678
+ const _hoisted_2 = { class: "flex flex-row justify-between" };
3679
+ const _hoisted_3 = { class: "flex flex-row flex-1" };
3680
+ const _hoisted_4 = { key: 0 };
3681
+ const _hoisted_5 = {
3682
+ key: 0,
3683
+ class: "border dt-table-header-top text-12 bg-gray-100 mt-1 py-1 px-3 border-dashed"
3684
+ };
3685
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent$1({
3686
+ __name: "TableHeader",
3687
+ props: {
3688
+ tableSetting: {
3689
+ type: [Object, Boolean]
3690
+ },
3691
+ toolbar: {
3692
+ type: Array,
3693
+ default: []
3694
+ }
3695
+ },
3696
+ setup(__props) {
3697
+ const props2 = __props;
3698
+ const getActionsProps = {
3699
+ mode: null,
3700
+ showAdvancedButton: false,
3701
+ show: true,
3702
+ buttonList: props2.toolbar
3703
+ };
3704
+ return (_ctx, _cache) => {
3705
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
3706
+ createElementVNode("div", _hoisted_2, [
3707
+ createElementVNode("div", _hoisted_3, [
3708
+ unref$1(getActionsProps)?.buttonList.length ? (openBlock(), createBlock(unref$1(_sfc_main$f), normalizeProps(mergeProps({ key: 0 }, unref$1(getActionsProps))), null, 16)) : createCommentVNode("", true),
3709
+ renderSlot(_ctx.$slots, "toolbar")
3710
+ ]),
3711
+ __props.tableSetting ? (openBlock(), createElementBlock("div", _hoisted_4, [
3712
+ createVNode(_sfc_main$3, { setting: __props.tableSetting }, null, 8, ["setting"])
3713
+ ])) : createCommentVNode("", true)
3714
+ ]),
3715
+ _ctx.$slots.headerTop ? (openBlock(), createElementBlock("div", _hoisted_5, [
3716
+ renderSlot(_ctx.$slots, "headerTop")
3717
+ ])) : createCommentVNode("", true)
3718
+ ]);
3719
+ };
3720
+ }
3721
+ });
3722
+ function useTableHeader(propsRef, slots, handlers) {
3723
+ const { t } = useI18n("UI");
3724
+ const getHeaderProps = computed(() => {
3725
+ const TABLE_TOOLS = [
3726
+ { t: "\u65B0\u589E", name: t("ADD"), preIcon: "mdi:plus", type: "primary", onClick: unref(propsRef).onAdd },
3727
+ { t: "\u5220\u9664", name: t("DELETE"), preIcon: "mdi:delete-outline", onClick: unref(propsRef).onDeletes }
3728
+ ];
3729
+ const { tableSetting, toolbar = TABLE_TOOLS } = unref(propsRef);
3730
+ const { getSlot } = useSlots$1();
3731
+ const hideTitle = (!toolbar || !toolbar.filter((it) => it.show ?? true).length) && !slots.toolbar && !slots.headerTop && !tableSetting;
3732
+ return {
3733
+ title: hideTitle ? null : () => h(
3734
+ _sfc_main$2,
3735
+ {
3736
+ tableSetting,
3737
+ toolbar,
3738
+ onColumnsChange: handlers.onColumnsChange
3739
+ },
3740
+ {
3741
+ ...slots.toolbar ? {
3742
+ toolbar: () => getSlot(slots, "toolbar")
3743
+ } : {},
3744
+ ...slots.headerTop ? {
3745
+ headerTop: () => getSlot(slots, "headerTop")
3746
+ } : {}
3747
+ }
3748
+ )
3749
+ };
3750
+ });
3751
+ return {
3752
+ getHeaderProps
3753
+ };
3754
+ }
3755
+ function useLoading(props2) {
3756
+ const getLoading = ref(false);
3757
+ watch(
3758
+ () => unref(props2)?.loading,
3759
+ (v) => getLoading.value = v
3760
+ );
3761
+ function setLoading(loading) {
3762
+ getLoading.value = loading;
3763
+ }
3764
+ return {
3765
+ getLoading,
3766
+ setLoading
3767
+ };
3768
+ }
3769
+ function usePagination(props2) {
3770
+ const { t } = useI18n("UI");
3771
+ const paginationRef = ref();
3772
+ const showPagination = ref(true);
3773
+ const { getUiSize } = useHeader();
3774
+ watch(
3775
+ () => unref(props2).pagination,
3776
+ (pagination) => {
3777
+ if (!isBoolean(pagination) && pagination) {
3778
+ paginationRef.value = {
3779
+ ...unref(paginationRef),
3780
+ ...pagination ?? {}
3781
+ };
3782
+ }
3783
+ }
3784
+ );
3785
+ const getPaginationInfo = computed(() => {
3786
+ const { pagination } = unref(props2);
3787
+ if (!unref(showPagination) || isBoolean(pagination) && !pagination) {
3788
+ return false;
3789
+ }
3790
+ const { appConf } = useAppStore();
3791
+ const { defaultPageSize = pagination.pageSize, pageSizeOptions } = appConf.ui.table;
3792
+ return {
3793
+ current: 1,
3794
+ pageSize: defaultPageSize,
3795
+ defaultPageSize,
3796
+ showTotal: (total, range) => t("TOTAL_PAGE", { total }),
3797
+ showSizeChanger: true,
3798
+ pageSizeOptions,
3799
+ showQuickJumper: true,
3800
+ class: `dt-pagination dt-pagination-${unref(getUiSize)}`,
3801
+ ...isBoolean(pagination) ? {} : pagination,
3802
+ ...unref(paginationRef)
3803
+ };
3804
+ });
3805
+ function setPagination(info) {
3806
+ const paginationInfo = unref(getPaginationInfo);
3807
+ paginationRef.value = {
3808
+ ...!isBoolean(paginationInfo) ? paginationInfo : {},
3809
+ ...info
3810
+ };
3811
+ }
3812
+ function getPagination() {
3813
+ return unref(getPaginationInfo);
3814
+ }
3815
+ function getShowPagination() {
3816
+ return unref(showPagination);
3817
+ }
3818
+ function setShowPagination(flag) {
3819
+ showPagination.value = flag;
3820
+ }
3821
+ return {
3822
+ getPaginationInfo,
3823
+ setPagination,
3824
+ getPagination,
3825
+ getShowPagination,
3826
+ setShowPagination
3827
+ };
3828
+ }
3829
+ const DEFAULT_CONFIG = {
3830
+ id: "id",
3831
+ children: "children",
3832
+ pid: "pid"
3833
+ };
3834
+ function useRowSelection(propsRef, emit) {
3835
+ const selectedRowKeysRef = ref([]);
3836
+ const selectedRowRef = ref([]);
3837
+ const getRowSelectionRef = computed(() => {
3838
+ const { rowSelection, showCheckboxColumn } = unref(propsRef);
3839
+ if (!rowSelection && !showCheckboxColumn)
3840
+ return null;
3841
+ if (isBoolean(showCheckboxColumn)) {
3842
+ if (showCheckboxColumn) {
3843
+ rowSelection.type = "checkbox";
3844
+ } else {
3845
+ return null;
3846
+ }
3847
+ }
3848
+ return {
3849
+ selectedRowKeys: unref(selectedRowKeysRef),
3850
+ onChange: (selectedRowKeys) => setSelectedRowKeys(selectedRowKeys),
3851
+ ...omit(rowSelection, ["onChange"])
3852
+ };
3853
+ });
3854
+ function findeNodeAll(tree, func, config = {}) {
3855
+ const _config = Object.assign({}, DEFAULT_CONFIG, config), result = [], list = [...tree];
3856
+ for (const node of list) {
3857
+ func(node) && result.push(node);
3858
+ node[_config?.children] && list.push(...node[_config?.children]);
3859
+ }
3860
+ return result;
3861
+ }
3862
+ function setSelectedRowKeys(rowKeys) {
3863
+ selectedRowKeysRef.value = rowKeys;
3864
+ const allSelectedRows = findeNodeAll(
3865
+ toRaw(unref(propsRef).dataSource).concat(toRaw(unref(selectedRowRef))),
3866
+ (item) => rowKeys.includes(item[unref(propsRef).rowKey]),
3867
+ {
3868
+ children: propsRef.value.childrenColumnName ?? "children"
3869
+ }
3870
+ );
3871
+ const trueSelectedRows = [];
3872
+ rowKeys.forEach((key) => {
3873
+ const found = allSelectedRows.find((item) => item[unref(propsRef).rowKey] === key);
3874
+ found && trueSelectedRows.push(found);
3875
+ });
3876
+ selectedRowRef.value = trueSelectedRows;
3877
+ }
3878
+ function clearSelectedRowKeys() {
3879
+ selectedRowKeysRef.value = [];
3880
+ selectedRowRef.value = [];
3881
+ }
3882
+ function getRowSelection() {
3883
+ return unref(getRowSelectionRef);
3884
+ }
3885
+ function getSelectedRowKeys() {
3886
+ return unref(selectedRowKeysRef);
3887
+ }
3888
+ function getSelectRows() {
3889
+ return unref(selectedRowRef);
3890
+ }
3891
+ watch(
3892
+ () => unref(propsRef).rowSelection?.selectedRowKeys,
3893
+ (v) => {
3894
+ setSelectedRowKeys(v);
3895
+ }
3896
+ );
3897
+ watch(
3898
+ () => unref(selectedRowKeysRef),
3899
+ () => {
3900
+ nextTick(() => {
3901
+ const { rowSelection } = unref(propsRef);
3902
+ if (rowSelection) {
3903
+ const { onChange } = rowSelection;
3904
+ if (onChange && isFunction(onChange))
3905
+ onChange(getSelectedRowKeys(), getSelectRows());
3906
+ }
3907
+ emit("selection-change", {
3908
+ keys: getSelectedRowKeys(),
3909
+ rows: getSelectRows()
3910
+ });
3911
+ });
3912
+ },
3913
+ { deep: true }
3914
+ );
3915
+ return {
3916
+ getRowSelectionRef,
3917
+ clearSelectedRowKeys,
3918
+ getRowSelection,
3919
+ getSelectedRowKeys,
3920
+ getSelectRows,
3921
+ setSelectedRowKeys
3922
+ };
3923
+ }
3924
+ function useTableScroll(propsRef, tableElRef, columnsRef, rowSelectionRef) {
3925
+ const tableHeightRef = ref(0), filterSource = ref([]);
3926
+ ref(null);
3927
+ let footerEl, bodyEl;
3928
+ const debounceRedoHeight = useDebounceFn(redoHeight, 100);
3929
+ windowResizeFn(calcTableHeight, 280);
3930
+ const getCanResize = computed(() => {
3931
+ const { canResize, scroll } = unref(propsRef);
3932
+ return canResize && !(scroll || {}).y;
3933
+ });
3934
+ watch(
3935
+ () => propsRef.value.dataSource,
3936
+ (v) => {
3937
+ debounceRedoHeight();
3938
+ },
3939
+ {
3940
+ deep: true,
3941
+ flush: "post"
3942
+ }
3943
+ );
3944
+ function redoHeight() {
3945
+ nextTick(() => calcTableHeight());
3946
+ }
3947
+ function setHeight(height) {
3948
+ tableHeightRef.value = height;
3949
+ }
3950
+ async function calcTableHeight() {
3951
+ const { pagination, virtual } = unref(propsRef);
3952
+ const table = unref(tableElRef);
3953
+ const tableEl = table?.$el;
3954
+ const tableData = unref(propsRef).dataSource;
3955
+ if (!tableEl)
3956
+ return;
3957
+ if (!bodyEl) {
3958
+ bodyEl = tableEl.querySelector(".ant-table-body");
3959
+ if (!bodyEl)
3960
+ return;
3961
+ }
3962
+ const hasScrollBarY = bodyEl.scrollHeight > bodyEl.clientHeight;
3963
+ const hasScrollBarX = bodyEl.scrollWidth > bodyEl.clientWidth;
3964
+ if (hasScrollBarY) {
3965
+ tableEl.classList.contains("hide-scrollbar-y") && tableEl.classList.remove("hide-scrollbar-y");
3966
+ } else {
3967
+ !tableEl.classList.contains("hide-scrollbar-y") && tableEl.classList.add("hide-scrollbar-y");
3968
+ }
3969
+ if (hasScrollBarX) {
3970
+ tableEl.classList.contains("hide-scrollbar-x") && tableEl.classList.remove("hide-scrollbar-x");
3971
+ } else {
3972
+ !tableEl.classList.contains("hide-scrollbar-x") && tableEl.classList.add("hide-scrollbar-x");
3973
+ }
3974
+ bodyEl.style.height = "unset";
3975
+ if (!unref(getCanResize) || !unref(tableData) || tableData.length === 0)
3976
+ return;
3977
+ await nextTick();
3978
+ let headerHeight = 0, paginationHeight = 2, footerHeight = 0, titleHeight = tableEl.querySelector(".ant-table-title")?.offsetHeight ?? 0, marginHeight = 15;
3979
+ const headEl = tableEl.querySelector(".ant-table-thead ");
3980
+ if (headEl) {
3981
+ headerHeight = headEl.offsetHeight;
3982
+ }
3983
+ if (!isBoolean(pagination)) {
3984
+ let paginationEl = tableEl.querySelector(".ant-pagination");
3985
+ if (paginationEl) {
3986
+ const offsetHeight = paginationEl.offsetHeight;
3987
+ paginationHeight += offsetHeight || 0;
3988
+ } else {
3989
+ paginationHeight += 50;
3990
+ }
3991
+ if (!footerEl) {
3992
+ footerEl = tableEl.querySelector(".ant-table-footer");
3993
+ } else {
3994
+ const offsetHeight = footerEl.offsetHeight;
3995
+ footerHeight += offsetHeight || 0;
3996
+ }
3997
+ } else {
3998
+ paginationHeight = -8;
3999
+ }
4000
+ const tableHeight = table?.$el?.offsetHeight ?? 0;
4001
+ let height = tableHeight - paginationHeight - footerHeight - headerHeight - titleHeight - marginHeight;
4002
+ height = Math.max(height, 167);
4003
+ setHeight(height);
4004
+ bodyEl.style.height = `${height}px`;
4005
+ filterSource.value = unref(propsRef)?.dataSource;
4006
+ }
4007
+ const getScrollX = computed(() => {
4008
+ let width = 0;
4009
+ if (unref(rowSelectionRef)) {
4010
+ width += 32;
4011
+ }
4012
+ const NORMAL_WIDTH = 120;
4013
+ const columns = unref(columnsRef).filter((item) => !item.defaultHidden);
4014
+ columns.forEach((item) => {
4015
+ width += Number.parseInt(item.width) || NORMAL_WIDTH;
4016
+ });
4017
+ const table = unref(tableElRef);
4018
+ const tableWidth = table?.$el?.offsetWidth ?? 0;
4019
+ return tableWidth > width ? "100%" : width;
4020
+ });
4021
+ const getScrollRef = computed(() => {
4022
+ const tableHeight = unref(tableHeightRef);
4023
+ const { canResize, scroll } = unref(propsRef);
4024
+ return {
4025
+ x: unref(getScrollX),
4026
+ y: tableHeight,
4027
+ scrollToFirstRowOnChange: false,
4028
+ ...scroll
4029
+ };
4030
+ });
4031
+ onMounted(() => {
4032
+ calcTableHeight();
4033
+ nextTick(() => debounceRedoHeight());
4034
+ });
4035
+ return {
4036
+ getScrollRef,
4037
+ filterSource
4038
+ };
4039
+ }
4040
+ function useRows(propsRef) {
4041
+ function getRowClassName(record, index2) {
4042
+ const { striped, rowClassName } = unref(propsRef);
4043
+ const classNames = [];
4044
+ if (striped) {
4045
+ classNames.push(index2 % 2 === 1 ? "table-striped" : "");
4046
+ }
4047
+ if (rowClassName && isFunction(rowClassName)) {
4048
+ classNames.push(rowClassName(record, index2));
4049
+ }
4050
+ return classNames.join(" ");
4051
+ }
4052
+ return {
4053
+ getRowClassName
4054
+ };
4055
+ }
4056
+ const props = {
4057
+ column: Object,
4058
+ record: Object,
4059
+ index: Number
4060
+ };
4061
+ const _sfc_main$1 = defineComponent({
4062
+ name: "TableRender",
4063
+ props,
4064
+ setup(props2, {}) {
4065
+ let renderText = ref(null);
4066
+ watch(() => [props2.record, props2.column], (v) => {
4067
+ if (v) {
4068
+ renderCell();
4069
+ }
4070
+ }, {
4071
+ immediate: true,
4072
+ deep: true
4073
+ });
4074
+ function renderCell() {
4075
+ const {
4076
+ column,
4077
+ record,
4078
+ index: index2
4079
+ } = props2;
4080
+ const {
4081
+ render,
4082
+ dataIndex
4083
+ } = column;
4084
+ const text = record[dataIndex.toString()];
4085
+ if (isObject(render)) {
4086
+ const {
4087
+ dict,
4088
+ date,
4089
+ number,
4090
+ percent,
4091
+ struc
4092
+ } = render;
4093
+ if (struc) {
4094
+ const {
4095
+ appConf
4096
+ } = useAppStore();
4097
+ let apiStruc = appConf.structure[struc];
4098
+ if (!apiStruc) {
4099
+ error(`${struc}\u672A\u5728structure\u4E2D\u914D\u7F6E`);
4100
+ } else {
4101
+ renderText = getDictValueByCode(text, apiStruc);
4102
+ }
4103
+ } else if (dict) {
4104
+ renderText = getDictValueByCode(text, dict);
4105
+ } else if (date) {
4106
+ renderText.value = (text && dayjs(text).format(date || "YYYY-MM-DD")) ?? "";
4107
+ } else if (number) {
4108
+ renderText.value = formatNumber(text, number);
4109
+ } else if (percent) {
4110
+ renderText.value = formatNumber((text || 0) * 100, percent) + "%";
4111
+ } else if (isVnode(render)) {
4112
+ renderText.value = createVNode(Fragment, null, [createTextVNode(" "), render, createTextVNode(" ")]);
4113
+ } else if (render["setup"]) {
4114
+ renderText.value = createVNode(render, {
4115
+ ...record,
4116
+ text
4117
+ });
4118
+ }
4119
+ } else if (isFunction(render)) {
4120
+ let afterRenderData = render(record, index2, text);
4121
+ if (afterRenderData.__v_isRef) {
4122
+ renderText = afterRenderData;
4123
+ } else if (afterRenderData["setup"]) {
4124
+ renderText.value = createVNode(afterRenderData, {
4125
+ ...record,
4126
+ text
4127
+ });
4128
+ } else {
4129
+ renderText.value = isVnode(afterRenderData) ? createVNode(Fragment, null, [afterRenderData]) : afterRenderData;
4130
+ }
4131
+ } else {
4132
+ renderText.value = unref(text);
4133
+ }
4134
+ }
4135
+ return () => createVNode("span", null, [unref(renderText)]);
4136
+ }
4137
+ });
4138
+ const DEFAULT_SORT_FN = (sortInfo) => {
4139
+ const { field, order } = sortInfo;
4140
+ return field && order ? { field, order } : {};
4141
+ };
4142
+ const TableProps = {
4143
+ clickToSelectRow: { type: Boolean, default: false },
4144
+ tableSetting: { type: [Boolean, Object], default: () => ({}) },
4145
+ striped: { type: Boolean, default: true },
4146
+ canColDrag: { type: Boolean, default: true },
4147
+ clearSelectOnPageChange: { type: Boolean, default: false },
4148
+ resizable: { type: Boolean, default: true },
4149
+ minWidth: { type: Number },
4150
+ maxWidth: { type: Number },
4151
+ virtual: { type: Boolean, default: false },
4152
+ sortFn: { type: Function, default: DEFAULT_SORT_FN },
4153
+ defSort: { type: Object, default: null },
4154
+ filterFn: {
4155
+ type: Function,
4156
+ default: (data) => {
4157
+ return data;
4158
+ }
4159
+ },
4160
+ rowKey: {
4161
+ type: String,
4162
+ default: "id"
4163
+ },
4164
+ columnCode: { type: String, default: "" },
4165
+ columns: { type: [Array], default: () => [] },
4166
+ slotsTemplate: { type: Object, default: {} },
4167
+ showIndexColumn: { type: Boolean, default: false },
4168
+ showCheckboxColumn: { type: Boolean, default: true },
4169
+ expandMethodIcon: { type: Boolean, default: false },
4170
+ ellipsis: { type: Boolean, default: true },
4171
+ dataSource: { type: Array, default: null },
4172
+ bordered: { type: Boolean, default: true },
4173
+ canResize: { type: Boolean, default: true },
4174
+ pagination: {
4175
+ type: [Object, Boolean],
4176
+ default: {
4177
+ pageSize: 20,
4178
+ current: 1
4179
+ }
4180
+ },
4181
+ loading: { type: Boolean, default: false },
4182
+ rowClassName: { type: Function },
4183
+ scroll: {
4184
+ type: Object,
4185
+ default: {}
4186
+ },
4187
+ onTableChange: {
4188
+ type: Function,
4189
+ default: () => {
4190
+ }
4191
+ },
4192
+ onDownload: {
4193
+ type: Function,
4194
+ default: (excelData) => {
4195
+ }
4196
+ },
4197
+ rowSelection: {
4198
+ type: Object,
4199
+ default: {
4200
+ type: "checkbox",
4201
+ fixed: true
4202
+ }
4203
+ },
4204
+ customRow: {
4205
+ type: Function,
4206
+ default: () => {
4207
+ }
4208
+ },
4209
+ childrenColumnName: {
4210
+ type: String,
4211
+ default: "children"
4212
+ },
4213
+ indexColumnProps: {
4214
+ type: [Array],
4215
+ default: () => []
4216
+ },
4217
+ isTreeTable: {
4218
+ type: Boolean,
4219
+ default: false
4220
+ },
4221
+ operations: {
4222
+ type: Object
4223
+ },
4224
+ toolbar: {
4225
+ type: Array
4226
+ },
4227
+ registerInstance: {
4228
+ type: Function
4229
+ },
4230
+ onAdd: {
4231
+ type: Function,
4232
+ default: (params) => {
4233
+ }
4234
+ },
4235
+ onUpdate: {
4236
+ type: Function,
4237
+ default: (params) => {
4238
+ }
4239
+ },
4240
+ onDelete: {
4241
+ type: Function,
4242
+ default: (params) => {
4243
+ }
4244
+ },
4245
+ onDeletes: {
4246
+ type: Function,
4247
+ default: (params) => {
4248
+ }
4249
+ }
4250
+ };
4251
+ const _hoisted_1 = /* @__PURE__ */ createElementVNode("img", { src: _imports_0 }, null, -1);
4252
+ const _sfc_main = /* @__PURE__ */ defineComponent$1({
4253
+ __name: "index",
4254
+ props: TableProps,
4255
+ emits: [
4256
+ "register",
4257
+ "selection-change",
4258
+ "columns-change",
4259
+ "row-click",
4260
+ "row-dbClick",
4261
+ "row-contextmenu",
4262
+ "row-mouseenter",
4263
+ "row-mouseleave",
4264
+ "edit-change"
4265
+ ],
4266
+ setup(__props, { emit: emits }) {
4267
+ const props2 = __props;
4268
+ const tableElRef = ref(null);
4269
+ const attrs = useAttrs();
4270
+ const slots = useSlots();
4271
+ const innerPropsRef = ref();
4272
+ const getProps = computed(() => {
4273
+ return { ...props2, ...unref(innerPropsRef) };
4274
+ });
4275
+ const { getRowClassName } = useRows(getProps);
4276
+ const tableCls = computed(() => {
4277
+ return [
4278
+ "dt-table",
4279
+ "box-border",
4280
+ { "dt-table-no-pagation": !unref(getProps).pagination }
4281
+ ];
4282
+ });
4283
+ const { getLoading, setLoading } = useLoading(getProps);
4284
+ const { getPaginationInfo, setPagination, getPagination, getShowPagination, setShowPagination } = usePagination(getProps);
4285
+ const {
4286
+ getViewColumns,
4287
+ getColumnsRef,
4288
+ getColumns,
4289
+ setColumns,
4290
+ setColumnsByDataIndex,
4291
+ getCacheColumns
4292
+ } = useColumns(getProps, getPaginationInfo, tableElRef);
4293
+ const {
4294
+ getRowSelectionRef,
4295
+ clearSelectedRowKeys,
4296
+ getRowSelection,
4297
+ getSelectRows,
4298
+ getSelectedRowKeys,
4299
+ setSelectedRowKeys
4300
+ } = useRowSelection(getProps, emits);
4301
+ const { getScrollRef, filterSource } = useTableScroll(getProps, tableElRef, getColumnsRef, getRowSelectionRef);
4302
+ const handlers = {
4303
+ onColumnsChange: (data) => {
4304
+ emits("columns-change", data);
4305
+ unref(getProps).onColumnsChange?.(data);
4306
+ }
4307
+ };
4308
+ const { getHeaderProps } = useTableHeader(getProps, slots, handlers);
4309
+ const { customRow } = useCustomRow(getProps, { setSelectedRowKeys, getSelectedRowKeys, clearSelectedRowKeys, emits });
4310
+ const { handleTableChange, findTableDataRecord, updateTableDataRecord } = useDataSource(
4311
+ getProps,
4312
+ {
4313
+ getPaginationInfo,
4314
+ setPagination,
4315
+ clearSelectedRowKeys
4316
+ }
4317
+ );
4318
+ const getBind = computed(() => {
4319
+ return {
4320
+ ...attrs,
4321
+ ...unref(getProps),
4322
+ ...unref(getHeaderProps),
4323
+ scroll: unref(getScrollRef),
4324
+ loading: unref(getLoading),
4325
+ dataSource: toRaw(unref(filterSource)),
4326
+ pagination: toRaw(unref(getPaginationInfo)),
4327
+ rowSelection: unref(getRowSelectionRef),
4328
+ rowKey: unref(getProps).rowKey,
4329
+ columns: unref(getViewColumns),
4330
+ tableLayout: "fixed",
4331
+ class: unref(tableCls),
4332
+ customRow,
4333
+ onChange: handleTableChange,
4334
+ onResizeColumn: (w, col) => {
4335
+ col.width = w;
4336
+ setColumnsByDataIndex(col.dataIndex, col);
4337
+ }
4338
+ };
4339
+ });
4340
+ function setProps(props22) {
4341
+ let allProps = {
4342
+ ...unref(innerPropsRef),
4343
+ ...props22
4344
+ };
4345
+ if (isObject(props22.tableSetting)) {
4346
+ let historyTableSetting = unref(innerPropsRef)?.tableSetting;
4347
+ allProps.tableSetting = {
4348
+ ...isBoolean(historyTableSetting) ? {} : historyTableSetting,
4349
+ ...props22.tableSetting
4350
+ };
4351
+ }
4352
+ innerPropsRef.value = allProps;
4353
+ }
4354
+ const tableAction = {
4355
+ setProps,
4356
+ setLoading,
4357
+ clearSelectedRowKeys,
4358
+ getSelectRows,
4359
+ getSelectedRowKeys,
4360
+ setSelectedRowKeys,
4361
+ getRowSelection,
4362
+ getColumns,
4363
+ setColumns,
4364
+ setColumnsByDataIndex,
4365
+ getCacheColumns,
4366
+ findTableDataRecord,
4367
+ updateTableDataRecord,
4368
+ getPagination,
4369
+ emits
4370
+ };
4371
+ createTableInstance({ ...tableAction, tableElRef, getBind, getProps });
4372
+ emits("register", tableAction);
4373
+ if (unref(innerPropsRef)?.registerInstance) {
4374
+ unref(innerPropsRef)?.registerInstance(tableAction);
4375
+ }
4376
+ return (_ctx, _cache) => {
4377
+ const _component_ATable = Table;
4378
+ return openBlock(), createBlock(_component_ATable, mergeProps({
4379
+ ref_key: "tableElRef",
4380
+ ref: tableElRef
4381
+ }, unref$1(getBind), {
4382
+ rowClassName: unref$1(getRowClassName),
4383
+ onChange: unref$1(handleTableChange)
4384
+ }), createSlots({
4385
+ bodyCell: withCtx(({ column, record, index: index2 }) => [
4386
+ _ctx.$slots.bodyCell ? renderSlot(_ctx.$slots, "bodyCell", normalizeProps(mergeProps({ key: 0 }, { column, record, index: index2 }))) : createCommentVNode("", true),
4387
+ column?.render && !_ctx.$slots.bodyCell ? (openBlock(), createBlock(_sfc_main$1, {
4388
+ key: 1,
4389
+ column,
4390
+ record,
4391
+ index: index2
4392
+ }, null, 8, ["column", "record", "index"])) : createCommentVNode("", true)
4393
+ ]),
4394
+ emptyText: withCtx(() => [
4395
+ _hoisted_1
4396
+ ]),
4397
+ _: 2
4398
+ }, [
4399
+ renderList(Object.keys(_ctx.$slots), (item) => {
4400
+ return {
4401
+ name: item,
4402
+ fn: withCtx((data) => [
4403
+ renderSlot(_ctx.$slots, item, normalizeProps(guardReactiveProps(data || {})))
4404
+ ])
4405
+ };
4406
+ })
4407
+ ]), 1040, ["rowClassName", "onChange"]);
4408
+ };
4409
+ }
4410
+ });
4411
+ export {
4412
+ _sfc_main as DtTable,
4413
+ useTable
4414
+ };