@dt-frames/ui 1.0.2 → 1.0.5

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 (233) hide show
  1. package/README.md +1 -15
  2. package/es/assets/imgs/header/avatar.png +0 -0
  3. package/es/assets/style/reset.less +0 -3
  4. package/es/components/curd/src/components/dialog.d.ts +21 -58
  5. package/es/components/curd/src/types/curd.type.d.ts +2 -1
  6. package/es/components/dialog/index.d.ts +2 -0
  7. package/es/components/dialog/src/hooks/useDialog.d.ts +3 -0
  8. package/es/components/forms/index.d.ts +2 -2
  9. package/es/components/forms/src/components/formIcon.d.ts +4 -47
  10. package/es/components/forms/src/index.d.ts +2 -6
  11. package/es/components/iframe/index.d.ts +2 -2
  12. package/es/components/index.d.ts +3 -2
  13. package/es/components/modal/src/components/close-icon.d.ts +0 -43
  14. package/es/components/modal/src/index.d.ts +0 -43
  15. package/es/components/source/src/types/table.type.d.ts +1 -1
  16. package/es/components/table/index.d.ts +1 -1
  17. package/es/components/table/src/components/setting/Column.d.ts +6 -5
  18. package/es/components/table/src/hooks/useColumns.d.ts +1 -1
  19. package/es/components/table/src/hooks/useDataSource.d.ts +1 -3
  20. package/es/components/table/src/hooks/useHeaderCode.d.ts +2 -0
  21. package/es/components/table/src/hooks/useRowSelection.d.ts +2 -3
  22. package/es/components/table/src/index.d.ts +15 -3
  23. package/es/components/table/src/props.d.ts +7 -1
  24. package/es/index.js +284 -271
  25. package/es/style/assets/style/reset.less +0 -3
  26. package/es/style/components/forms/{src/index.less → index.less} +2 -0
  27. package/es/style/components/icons/index.less +1 -0
  28. package/es/style/components/iframe/index.less +3 -0
  29. package/es/style/components/modal/{src/index.less → index.less} +0 -0
  30. package/es/style/components/table/{src/index.less → index.less} +12 -1
  31. package/es/style/theme/header/index.less +8 -4
  32. package/es/style/theme/sider/index.less +25 -25
  33. package/es/style/theme/theme.less +2 -1
  34. package/es/theme/header/components/logo.d.ts +43 -0
  35. package/es/theme/header/components/notify.d.ts +0 -1
  36. package/package.json +50 -40
  37. package/src/assets/data/icons/actions.ts +427 -0
  38. package/src/assets/data/icons/code.ts +10 -0
  39. package/src/assets/data/icons/commuticate.ts +190 -0
  40. package/src/assets/data/icons/currency.ts +46 -0
  41. package/src/assets/data/icons/devices.ts +128 -0
  42. package/src/assets/data/icons/edit.ts +165 -0
  43. package/src/assets/data/icons/file.ts +104 -0
  44. package/src/assets/data/icons/math.ts +53 -0
  45. package/src/assets/data/icons/message.ts +75 -0
  46. package/src/assets/data/icons/navigate.ts +181 -0
  47. package/src/assets/data/icons/other.ts +333 -0
  48. package/src/assets/data/icons.ts +58 -0
  49. package/src/assets/imgs/header/avatar.png +0 -0
  50. package/src/assets/imgs/logo/logo.png +0 -0
  51. package/src/assets/locales/en_US.json +3 -0
  52. package/src/assets/locales/zh_CN.json +3 -0
  53. package/src/assets/style/index.less +10 -0
  54. package/src/assets/style/reset.less +17 -0
  55. package/src/components/container/index.less +85 -0
  56. package/src/components/container/index.ts +8 -0
  57. package/src/components/container/src/bar.ts +107 -0
  58. package/src/components/container/src/lazy-container.vue +9 -0
  59. package/src/components/container/src/scroll-bar.vue +117 -0
  60. package/src/components/container/src/scroll-container.vue +61 -0
  61. package/src/components/curd/index.ts +5 -0
  62. package/src/components/curd/src/components/dialog.vue +71 -0
  63. package/src/components/curd/src/components/props.ts +32 -0
  64. package/src/components/curd/src/hooks/useCurd.tsx +87 -0
  65. package/src/components/curd/src/types/curd.type.ts +31 -0
  66. package/src/components/dialog/index.ts +5 -0
  67. package/src/components/dialog/src/hooks/useDialog.ts +85 -0
  68. package/src/components/excel/index.ts +6 -0
  69. package/src/components/excel/src/export2Excel.ts +44 -0
  70. package/src/components/forms/index.less +84 -0
  71. package/src/components/forms/index.ts +11 -0
  72. package/src/components/forms/src/componentMap.ts +44 -0
  73. package/src/components/forms/src/components/formButton.vue +150 -0
  74. package/src/components/forms/src/components/formIcon.vue +50 -0
  75. package/src/components/forms/src/components/formItem.vue +407 -0
  76. package/src/components/forms/src/components/radioButton.vue +58 -0
  77. package/src/components/forms/src/const/form.const.ts +7 -0
  78. package/src/components/forms/src/hooks/helper.ts +70 -0
  79. package/src/components/forms/src/hooks/useForm.ts +130 -0
  80. package/src/components/forms/src/hooks/useFormActions.ts +63 -0
  81. package/src/components/forms/src/hooks/useFormEvents.ts +247 -0
  82. package/src/components/forms/src/hooks/useFormValue.ts +49 -0
  83. package/src/components/forms/src/hooks/useFormValues.ts +131 -0
  84. package/src/components/forms/src/hooks/useLabelWidth.ts +57 -0
  85. package/src/components/forms/src/index.vue +306 -0
  86. package/src/components/forms/src/prop.ts +80 -0
  87. package/src/components/forms/src/types/form.type.ts +269 -0
  88. package/{es/style/components/icons/src → src/components/icons}/index.less +1 -0
  89. package/src/components/icons/index.ts +7 -0
  90. package/src/components/icons/src/pick-icon.vue +117 -0
  91. package/src/components/icons/src/svg-icon.vue +117 -0
  92. package/src/components/iframe/index.less +3 -0
  93. package/src/components/iframe/index.ts +5 -0
  94. package/src/components/iframe/src/index.less +3 -0
  95. package/src/components/iframe/src/index.vue +38 -0
  96. package/src/components/index.ts +48 -0
  97. package/src/components/modal/index.less +60 -0
  98. package/src/components/modal/index.ts +8 -0
  99. package/src/components/modal/src/components/close-icon.vue +47 -0
  100. package/src/components/modal/src/components/modal-wrap.vue +118 -0
  101. package/src/components/modal/src/components/modal.tsx +30 -0
  102. package/src/components/modal/src/components/modalFooter.vue +38 -0
  103. package/src/components/modal/src/hooks/useDrag.ts +107 -0
  104. package/src/components/modal/src/hooks/useFullScreen.ts +27 -0
  105. package/src/components/modal/src/hooks/useModal.ts +176 -0
  106. package/src/components/modal/src/index.vue +173 -0
  107. package/src/components/modal/src/props.ts +43 -0
  108. package/src/components/modal/src/types/modal.type.ts +27 -0
  109. package/src/components/router/base-router.vue +11 -0
  110. package/src/components/router/index.ts +3 -0
  111. package/src/components/source/index.ts +1 -0
  112. package/src/components/source/src/hooks/useFetch.ts +69 -0
  113. package/src/components/source/src/hooks/usePage.ts +3 -0
  114. package/src/components/source/src/hooks/useSource.ts +179 -0
  115. package/src/components/source/src/index.ts +5 -0
  116. package/src/components/source/src/types/source.type.ts +68 -0
  117. package/src/components/source/src/types/table.type.ts +8 -0
  118. package/src/components/table/index.less +173 -0
  119. package/src/components/table/index.ts +7 -0
  120. package/src/components/table/src/components/TableActions.vue +108 -0
  121. package/src/components/table/src/components/TableHeader.vue +77 -0
  122. package/src/components/table/src/components/TableRender.vue +76 -0
  123. package/src/components/table/src/components/setting/Column.vue +354 -0
  124. package/src/components/table/src/components/setting/Download.vue +55 -0
  125. package/src/components/table/src/components/setting/Fullscreen.vue +43 -0
  126. package/src/components/table/src/components/setting/Size.vue +42 -0
  127. package/src/components/table/src/components/setting/index.vue +64 -0
  128. package/src/components/table/src/const.ts +13 -0
  129. package/src/components/table/src/hooks/useColumns.ts +319 -0
  130. package/{es/assets/app-antd-dark-theme-style.e3b0c442.css → src/components/table/src/hooks/useCustomRow.ts} +0 -0
  131. package/src/components/table/src/hooks/useDataSource.ts +99 -0
  132. package/src/components/table/src/hooks/useHeaderCode.ts +82 -0
  133. package/src/components/table/src/hooks/useLoading.ts +29 -0
  134. package/src/components/table/src/hooks/usePagination.ts +76 -0
  135. package/src/components/table/src/hooks/useRowSelection.ts +145 -0
  136. package/src/components/table/src/hooks/useRows.ts +30 -0
  137. package/src/components/table/src/hooks/useTable.ts +89 -0
  138. package/src/components/table/src/hooks/useTableHeader.ts +48 -0
  139. package/src/components/table/src/hooks/useTableInstance.ts +29 -0
  140. package/src/components/table/src/hooks/useTableScroll.ts +229 -0
  141. package/src/components/table/src/index.vue +197 -0
  142. package/src/components/table/src/props.ts +157 -0
  143. package/src/components/table/src/types/table.type.ts +133 -0
  144. package/src/components/table/src/types/tableHeader.type.ts +27 -0
  145. package/{es/assets/app-theme-style.e3b0c442.css → src/components/type.ts} +0 -0
  146. package/src/directives/icon.ts +36 -0
  147. package/src/directives/index.ts +26 -0
  148. package/src/directives/permission.ts +20 -0
  149. package/src/global.d.ts +8 -0
  150. package/src/index.ts +4 -0
  151. package/src/theme/content/index.vue +37 -0
  152. package/src/theme/feature/back-top.vue +11 -0
  153. package/src/theme/feature/index.vue +7 -0
  154. package/src/theme/footer/index.less +16 -0
  155. package/src/theme/footer/index.vue +24 -0
  156. package/src/theme/header/components/bread-crumb.vue +26 -0
  157. package/src/theme/header/components/fullscreen.vue +12 -0
  158. package/src/theme/header/components/handler.ts +81 -0
  159. package/src/theme/header/components/index.ts +21 -0
  160. package/src/theme/header/components/lang-picker.vue +36 -0
  161. package/src/theme/header/components/logo.vue +35 -0
  162. package/src/theme/header/components/menu-search.vue +62 -0
  163. package/src/theme/header/components/notify.vue +22 -0
  164. package/src/theme/header/components/setting-theme.vue +123 -0
  165. package/src/theme/header/components/theme-drawer/enum.ts +12 -0
  166. package/src/theme/header/components/theme-drawer/feature.vue +75 -0
  167. package/src/theme/header/components/theme-drawer/index.ts +7 -0
  168. package/src/theme/header/components/theme-drawer/menu-type.vue +40 -0
  169. package/src/theme/header/components/theme-drawer/select-item.vue +46 -0
  170. package/src/theme/header/components/theme-drawer/switch-item.vue +39 -0
  171. package/src/theme/header/components/theme-drawer/theme-color.vue +26 -0
  172. package/src/theme/header/components/trigger.vue +14 -0
  173. package/src/theme/header/components/user-info.vue +60 -0
  174. package/src/theme/header/const/index.ts +40 -0
  175. package/src/theme/header/helper/menu-tree.ts +64 -0
  176. package/src/theme/header/index.less +442 -0
  177. package/{es/theme/theme.d.ts → src/theme/header/index.ts} +0 -0
  178. package/src/theme/header/index.vue +96 -0
  179. package/src/theme/header/multiple-header.vue +67 -0
  180. package/src/theme/header/set-theme.less +68 -0
  181. package/src/theme/index.ts +3 -0
  182. package/src/theme/sider/components/basic-menu/basic-menu-item.vue +14 -0
  183. package/src/theme/sider/components/basic-menu/basic-menu.vue +122 -0
  184. package/src/theme/sider/components/basic-menu/basic-sub-menu-item.vue +46 -0
  185. package/src/theme/sider/components/basic-menu/menu-item-content.vue +13 -0
  186. package/src/theme/sider/components/drag-bar.vue +26 -0
  187. package/src/theme/sider/components/layout-menu.vue +132 -0
  188. package/src/theme/sider/components/props.ts +97 -0
  189. package/src/theme/sider/components/sider-trigger.vue +24 -0
  190. package/src/theme/sider/helper/sider.ts +52 -0
  191. package/src/theme/sider/helper/split-menu.ts +146 -0
  192. package/src/theme/sider/hooks/useDragLine.ts +86 -0
  193. package/src/theme/sider/hooks/useOpenKeys.ts +57 -0
  194. package/src/theme/sider/index.less +203 -0
  195. package/src/theme/sider/index.vue +88 -0
  196. package/src/theme/tabs/components/TabContent.vue +36 -0
  197. package/src/theme/tabs/components/TabRedo.vue +18 -0
  198. package/src/theme/tabs/hooks/useMultifyTabs.ts +96 -0
  199. package/src/theme/tabs/hooks/useTabDropdown.ts +89 -0
  200. package/src/theme/tabs/index.less +165 -0
  201. package/src/theme/tabs/index.vue +98 -0
  202. package/src/theme/tabs/types/tabs.type.ts +8 -0
  203. package/src/theme/theme.less +67 -0
  204. package/src/theme/theme.vue +90 -0
  205. package/src/theme/transition.less +99 -0
  206. package/es/assets/data/icon.d.ts +0 -4
  207. package/es/assets/data/icon.ts +0 -69
  208. package/es/assets/data/icon11.ts +0 -69
  209. package/es/assets/style/var.less +0 -42
  210. package/es/components/icons/pick-icon.d.ts +0 -529
  211. package/es/components/icons/svg-icon.d.ts +0 -44
  212. package/es/components/table/src/hooks/useFormat.d.ts +0 -2
  213. package/es/components/table/src/hooks/useVirtualScroll.d.ts +0 -5
  214. package/es/components/table/src/utils/format.d.ts +0 -1
  215. package/es/index.css +0 -1
  216. package/es/style/assets/style/var.less +0 -42
  217. package/es/theme/content/index.d.ts +0 -29
  218. package/es/theme/header/components/menu-search.d.ts +0 -528
  219. package/es/theme/header/components/setting-theme.d.ts +0 -2550
  220. package/es/theme/header/components/user-info.d.ts +0 -452
  221. package/es/theme/header/index.d.ts +0 -4369
  222. package/es/theme/header/multiple-header.d.ts +0 -2001
  223. package/es/theme/styles/hooks/changeTheme.d.ts +0 -1
  224. package/es/theme/styles/hooks/generate.d.ts +0 -13
  225. package/es/theme/styles/index.d.ts +0 -2
  226. package/es/theme/tabs/components/TabRedo.d.ts +0 -49
  227. package/es/theme/tabs/index.d.ts +0 -1399
  228. package/es/theme/theme/initTheme.d.ts +0 -3
  229. package/es/theme/theme/util.d.ts +0 -5
  230. package/es/themes/generate.ts +0 -74
  231. package/es/themes/index.ts +0 -10
  232. package/es/themes/modifyVars.ts +0 -33
  233. package/es/themes/themePlugiin.ts +0 -74
@@ -0,0 +1,107 @@
1
+ import { Ref, unref, watchEffect } from 'vue';
2
+ import { useTimeoutFn } from '@dt-frames/core';
3
+
4
+ export interface UseModalDragMoveContext {
5
+ draggable: Ref<boolean>;
6
+ destroyOnClose: Ref<boolean | undefined> | undefined;
7
+ visible: Ref<boolean>;
8
+ }
9
+
10
+ export function useDragMove(context: UseModalDragMoveContext) {
11
+ const getStyle = (dom: any, attr: any) => {
12
+ return getComputedStyle(dom)[attr];
13
+ };
14
+ const drag = (wrap: any) => {
15
+ if (!wrap) return;
16
+ wrap.setAttribute('data-drag', unref(context.draggable));
17
+ const dialogHeaderEl = wrap.querySelector('.ant-modal-header');
18
+ const dragDom = wrap.querySelector('.ant-modal');
19
+
20
+ if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) return;
21
+
22
+ dialogHeaderEl.style.cursor = 'move';
23
+
24
+ dialogHeaderEl.onmousedown = (e: any) => {
25
+ if (!e) return;
26
+ // 鼠标按下,计算当前元素距离可视区的距离
27
+ const disX = e.clientX;
28
+ const disY = e.clientY;
29
+ const screenWidth = document.body.clientWidth; // body当前宽度
30
+ const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取)
31
+
32
+ const dragDomWidth = dragDom.offsetWidth; // 对话框宽度
33
+ const dragDomheight = dragDom.offsetHeight; // 对话框高度
34
+
35
+ const minDragDomLeft = dragDom.offsetLeft;
36
+
37
+ const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
38
+ const minDragDomTop = dragDom.offsetTop;
39
+ const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
40
+ // 获取到的值带px 正则匹配替换
41
+ const domLeft = getStyle(dragDom, 'left');
42
+ const domTop = getStyle(dragDom, 'top');
43
+ let styL = +domLeft;
44
+ let styT = +domTop;
45
+
46
+ // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
47
+ if (domLeft.includes('%')) {
48
+ styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100);
49
+ styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100);
50
+ } else {
51
+ styL = +domLeft.replace(/px/g, '');
52
+ styT = +domTop.replace(/px/g, '');
53
+ }
54
+
55
+ document.onmousemove = function (e) {
56
+ // 通过事件委托,计算移动的距离
57
+ let left = e.clientX - disX;
58
+ let top = e.clientY - disY;
59
+
60
+ // 边界处理
61
+ if (-left > minDragDomLeft) {
62
+ left = -minDragDomLeft;
63
+ } else if (left > maxDragDomLeft) {
64
+ left = maxDragDomLeft;
65
+ }
66
+
67
+ if (-top > minDragDomTop) {
68
+ top = -minDragDomTop;
69
+ } else if (top > maxDragDomTop) {
70
+ top = maxDragDomTop;
71
+ }
72
+
73
+ // 移动当前元素
74
+ dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
75
+ };
76
+
77
+ document.onmouseup = () => {
78
+ document.onmousemove = null;
79
+ document.onmouseup = null;
80
+ };
81
+ };
82
+ };
83
+
84
+ const handleDrag = () => {
85
+ const dragWraps = document.querySelectorAll('.ant-modal-wrap');
86
+ for (const wrap of Array.from(dragWraps)) {
87
+ if (!wrap) continue;
88
+ const display = getStyle(wrap, 'display');
89
+ const draggable = wrap.getAttribute('data-drag');
90
+ if (display !== 'none') {
91
+ // 拖拽位置
92
+ if (draggable === null || unref(context.destroyOnClose)) {
93
+ drag(wrap);
94
+ }
95
+ }
96
+ }
97
+ };
98
+
99
+ watchEffect(() => {
100
+ if (!unref(context.visible) || !unref(context.draggable)) {
101
+ return;
102
+ }
103
+ useTimeoutFn(() => {
104
+ handleDrag();
105
+ }, 30);
106
+ });
107
+ }
@@ -0,0 +1,27 @@
1
+ import { ref, Ref, unref, computed } from "vue";
2
+
3
+ interface FullScreenOptions{
4
+ wrapClassName: Ref<string | undefined>;
5
+ modalWrapperRef: Ref<any>;
6
+ extHeightRef: Ref<number>;
7
+ }
8
+
9
+ export function useFullScreen(options: FullScreenOptions) {
10
+ const fullScreenRef = ref(false);
11
+
12
+ const getWrapClassName = computed(() => {
13
+ const clsName = unref(options.wrapClassName) || '';
14
+ return unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName);
15
+ });
16
+
17
+ function toggleFullScreen(e: Event) {
18
+ e && e.stopPropagation();
19
+ fullScreenRef.value = !unref(fullScreenRef);
20
+ }
21
+
22
+ return {
23
+ fullScreenRef,
24
+ getWrapClassName,
25
+ toggleFullScreen
26
+ }
27
+ }
@@ -0,0 +1,176 @@
1
+ import { error, isFunction, Nullable } from "@dt-frames/core";
2
+ import { ModalProps } from "@dt-frames/core"
3
+ import { isEqual } from 'lodash-es'
4
+ import { tryOnUnmounted } from '@vueuse/core'
5
+ import { ModalMethods, ReturnInnerMethods, ReturnMethods, UseModalInnerReturnType, UseModalReturnType } from '../types/modal.type';
6
+ import { computed, ExtractPropTypes, getCurrentInstance, nextTick, onUnmounted, reactive, ref, toRaw, unref, watch, watchEffect } from "vue";
7
+
8
+ const dataTransfer = reactive<any>({})
9
+ const visibleData = reactive<{ [key: number]: boolean }>({})
10
+
11
+ export function useModalOut(): UseModalReturnType{
12
+ const modal = ref<Nullable<ModalMethods>>(null)
13
+ const loaded = ref<Nullable<boolean>>(true)
14
+ const uid = ref<string>('')
15
+
16
+ function register(modalMethod: ModalMethods, uuid: string) {
17
+ if( !getCurrentInstance() ) {
18
+ throw new Error('useModal只能在setup()或者函数中使用')
19
+ }
20
+
21
+ uid.value = uuid
22
+
23
+ onUnmounted(() => {
24
+ modal.value = null
25
+ loaded.value = false
26
+ dataTransfer[unref(uid)] = null
27
+ })
28
+
29
+ if( unref(loaded) && modalMethod === unref(modal) ) return
30
+
31
+ modal.value = modalMethod
32
+ loaded.value = true
33
+ modalMethod.emitVisible = (visible: boolean, uid: number) => {
34
+ visibleData[uid] = visible
35
+ }
36
+ }
37
+
38
+ const getInstance = () => {
39
+ const instance = unref( modal )
40
+
41
+ if( !instance ) {
42
+ error('useModalOut 实例未定义')
43
+ }
44
+
45
+ return instance
46
+ }
47
+
48
+ const methods: ReturnMethods = {
49
+ // 设置弹框属性
50
+ setModalProps: ( props: Partial<ModalProps> ) => {
51
+ getInstance()?.setModalProps(props)
52
+ },
53
+
54
+ getVisible: computed(() => {
55
+ return visibleData[~~unref(uid)]
56
+ }),
57
+
58
+ redoModalHeight: () => {
59
+ getInstance()?.redoModalHeight?.()
60
+ },
61
+
62
+ openModal: <T = any>(visable = true, data?: T, openOnSet = true) => {
63
+ getInstance()?.setModalProps({
64
+ visible: visable
65
+ })
66
+
67
+ if( !data ) return
68
+
69
+ const id = unref(uid)
70
+
71
+ if( openOnSet ) {
72
+ dataTransfer[id] = toRaw(data);
73
+ return;
74
+ }
75
+
76
+ const equal = isEqual(toRaw(dataTransfer[id]), toRaw(data))
77
+ if (!equal) {
78
+ dataTransfer[id] = toRaw(data);
79
+ }
80
+ },
81
+
82
+ closeModal: () => {
83
+ getInstance()?.setModalProps({ visible: false })
84
+ }
85
+ }
86
+
87
+ return [register, methods]
88
+ }
89
+
90
+
91
+ export function useModal(props?: Partial<ModalProps>,callbackFn?: Function): UseModalInnerReturnType {
92
+ const modalInstanceRef = ref<Nullable<ModalMethods>>(null)
93
+ const currentInstance = getCurrentInstance()
94
+ const uidRef = ref<string>('')
95
+
96
+ const getInstance = () => {
97
+ const instance = unref(modalInstanceRef)
98
+ if( !instance ) {
99
+ error('useModal 实例未定义')
100
+ }
101
+
102
+ return instance
103
+ }
104
+
105
+ const register = ( modalInstance: ModalMethods, uuid: string) => {
106
+ tryOnUnmounted(() => {
107
+ modalInstanceRef.value = null;
108
+ })
109
+
110
+ uidRef.value = uuid
111
+ modalInstanceRef.value = modalInstance
112
+
113
+ /**
114
+ * 深度监听props的变化,首次监听
115
+ * 动态更改表单实例
116
+ */
117
+ watch(
118
+ () => props,
119
+ () => props && modalInstance.setModalProps(props),
120
+ {
121
+ immediate: true,
122
+ deep: true
123
+ }
124
+ )
125
+
126
+ currentInstance?.emit('register', modalInstance, uuid)
127
+ }
128
+
129
+ watchEffect(() => {
130
+ const data = dataTransfer[unref(uidRef)]
131
+ if (!data) return
132
+ if (!callbackFn || !isFunction(callbackFn)) return
133
+ nextTick(() => {
134
+ callbackFn(data);
135
+ })
136
+ })
137
+
138
+ const methods: ReturnInnerMethods = {
139
+ changeLoading: (loading = true) => {
140
+ getInstance()?.setModalProps({ loading })
141
+ },
142
+ getVisible: computed(() => visibleData[~~unref(uidRef)]),
143
+ closeModal: () => {
144
+ getInstance()?.setModalProps({ visible: false });
145
+ },
146
+ openModal: <T = any>(visable = true, data?: T, openOnSet = true) => {
147
+ getInstance()?.setModalProps({
148
+ visible: visable
149
+ })
150
+
151
+ if( !data ) return
152
+
153
+ const id = unref(uidRef)
154
+
155
+ if( openOnSet ) {
156
+ dataTransfer[id] = toRaw(data);
157
+ return;
158
+ }
159
+
160
+ const equal = isEqual(toRaw(dataTransfer[id]), toRaw(data))
161
+ if (!equal) {
162
+ dataTransfer[id] = toRaw(data);
163
+ }
164
+ },
165
+ setModalProps: (props: Partial<ModalProps>) => {
166
+ getInstance()?.setModalProps(props);
167
+ },
168
+
169
+ redoModalHeight: () => {
170
+ const callRedo = getInstance()?.redoModalHeight;
171
+ callRedo && callRedo();
172
+ },
173
+ }
174
+
175
+ return [register, methods]
176
+ }
@@ -0,0 +1,173 @@
1
+ <template>
2
+ <Modal v-bind="getBindValue" @cancel="handleCancel">
3
+ <template #closeIcon v-if="!$slots.closeIcon">
4
+ <CloseIcon
5
+ :canFullscreen="getBindValue.canFullscreen"
6
+ :fullScreen="fullScreenRef"
7
+ @cancel="handleCancel"
8
+ @fullscreen="toggleFullScreen"
9
+ />
10
+ </template>
11
+
12
+ <template #title v-if="!$slots.title">
13
+ {{ getMergeProps.title }}
14
+ </template>
15
+
16
+ <template #footer v-if="!$slots.footer">
17
+ <!-- 默认的footer内容 -->
18
+ <ModalFooter :showSave="getBindValue.showSave" @handle-save="handleSave" @handle-cancel="handleCancel">
19
+ <template #[item]="data" v-for="item in Object.keys($slots)">
20
+ <slot :name="item" v-bind="data || {}"></slot>
21
+ </template>
22
+ </ModalFooter>
23
+ </template>
24
+
25
+ <ModalWrapper
26
+ :useWrapper="getBindValue.useWrapper"
27
+ :footerOffset="wrapperFooterOffset"
28
+ :fullScreen="fullScreenRef"
29
+ ref="modalWrapperRef"
30
+ :loading="getBindValue.loading"
31
+ :loading-tip="getBindValue.loadingTip"
32
+ :minHeight="getBindValue.minHeight"
33
+ :height="getWrapperHeight"
34
+ :visible="visibleRef"
35
+ :modalFooterHeight="footer !== undefined && !footer ? 0 : undefined"
36
+ v-bind="omit(getBindValue.wrapperProps, 'visible', 'height', 'modalFooterHeight')"
37
+ @ext-height="handleExtHeight"
38
+ @height-change="handleHeightChange"
39
+ >
40
+ <slot></slot>
41
+ </ModalWrapper>
42
+
43
+ <template #[item]="data" v-for="item in Object.keys(omit($slots, 'default'))">
44
+ <slot :name="item" v-bind="data || {}"></slot>
45
+ </template>
46
+ </Modal>
47
+ </template>
48
+
49
+ <script lang="ts" setup>
50
+ import { computed, unref, ref, watch, getCurrentInstance, nextTick } from 'vue';
51
+ import Modal from './components/modal';
52
+ import { omit } from 'lodash-es';
53
+ import { useFullScreen } from './hooks/useFullScreen';
54
+ import { basicProps } from './props';
55
+ import ModalWrapper from './components/modal-wrap.vue';
56
+ import ModalFooter from './components/modalFooter.vue'
57
+
58
+ import CloseIcon from './components/close-icon.vue';
59
+ import { isFunction, deepMerge, ModalProps, ModalMethods } from '@dt-frames/core';
60
+
61
+ const visibleRef = ref(false);
62
+ const propsRef = ref<Partial<ModalProps>>();
63
+ const modalWrapperRef = ref(null);
64
+ const extHeightRef = ref(0);
65
+
66
+ const props = defineProps( basicProps );
67
+ const emits = defineEmits(['visible-change', 'height-change', 'cancel', 'save', 'register', 'update:visible'])
68
+
69
+
70
+ const modalMethods: ModalMethods = {
71
+ setModalProps,
72
+ emitVisible: undefined,
73
+ redoModalHeight: () => {
74
+ nextTick(() => {
75
+ if (unref(modalWrapperRef)) {
76
+ (unref(modalWrapperRef) as any).setModalHeight();
77
+ }
78
+ });
79
+ },
80
+ }
81
+
82
+ const { getWrapClassName, toggleFullScreen, fullScreenRef } = useFullScreen({
83
+ wrapClassName: computed(() => props.wrapClassName),
84
+ extHeightRef,
85
+ modalWrapperRef
86
+ });
87
+
88
+ const getMergeProps = computed(() => {
89
+ return {
90
+ ...props,
91
+ ...(unref(propsRef) as any)
92
+ }
93
+ })
94
+
95
+ const getBindValue = computed(() => {
96
+ const bindValue = {
97
+ ...unref(getMergeProps),
98
+ ...(unref(propsRef) as any),
99
+ visible: unref(visibleRef),
100
+ wrapClassName: unref(getWrapClassName),
101
+ }
102
+
103
+ return omit(bindValue, unref(fullScreenRef) ? ['height', 'title'] : 'title');
104
+ });
105
+
106
+ const getWrapperHeight = computed(() => {
107
+ if (unref(fullScreenRef)) return undefined;
108
+ return unref(getBindValue).height;
109
+ });
110
+
111
+ const instance = getCurrentInstance();
112
+ if (instance) { emits('register', modalMethods, instance.uid); }
113
+
114
+ watch(() => unref(visibleRef), (v) => {
115
+ emits('visible-change', v);
116
+ emits('update:visible', v);
117
+ instance && modalMethods.emitVisible?.(v, instance.uid);
118
+ nextTick(() => {
119
+ if (props.scrollTop && v && unref(modalWrapperRef)) {
120
+ (unref(modalWrapperRef).$el as any).scrollTop = 0;
121
+ }
122
+ });
123
+ },{
124
+ immediate: false,
125
+ })
126
+
127
+ function handleHeightChange(height: string) {
128
+ emits('height-change', height);
129
+ }
130
+
131
+ function handleExtHeight(height: number) {
132
+ extHeightRef.value = height;
133
+ }
134
+
135
+
136
+ function setModalProps(props: Partial<ModalProps>) {
137
+
138
+ propsRef.value = deepMerge(unref(propsRef) || ({} as any), props);
139
+
140
+ if (Reflect.has(props, 'visible')) {
141
+ visibleRef.value = !!props.visible;
142
+ }
143
+ if (Reflect.has(props, 'defaultFullscreen')) {
144
+ fullScreenRef.value = !!props.defaultFullscreen;
145
+ }
146
+ }
147
+
148
+ // 弹框保存
149
+ function handleSave() {
150
+ emits('save')
151
+ handleCancel()
152
+ }
153
+
154
+ // 弹框关闭
155
+ async function handleCancel(e: Event = null) {
156
+ if( e ) {
157
+ e?.stopPropagation();
158
+
159
+ // 过滤自定义关闭按钮的空白区域
160
+ if ((e.target as HTMLElement)?.classList?.contains('dt-basic-modal-close--custom')) return;
161
+
162
+ if (props.closeFunc && isFunction(props.closeFunc)) {
163
+ const isClose: boolean = await props.closeFunc();
164
+ visibleRef.value = !isClose;
165
+ return;
166
+ }
167
+ }
168
+
169
+ visibleRef.value = false;
170
+
171
+ emits('cancel', e)
172
+ }
173
+ </script>
@@ -0,0 +1,43 @@
1
+ import { CSSProperties, PropType, VNodeChild } from "vue";
2
+
3
+ // 支持设置的属性
4
+ const modalProps = {
5
+ visible : { type: Boolean },
6
+ scrollTop : { type: Boolean, default: true },
7
+ height : { type: Number },
8
+ minHeight : { type: Number },
9
+ draggable : { type: Boolean, default: true },
10
+ closeFunc : Function
11
+ };
12
+
13
+ export const basicProps = Object.assign({}, modalProps, {
14
+ defaultFullscreen : { type: Boolean },
15
+ canFullscreen : { type: Boolean, default: true },
16
+ wrapperFooterOffset : { type: Number, default: 0 },
17
+ useWrapper : { type: Boolean, default: true },
18
+ loading : { type: Boolean },
19
+ loadingTip : { type: String },
20
+ closable : { type: Boolean, default: true },
21
+ destroyOnClose : { type: Boolean },
22
+ title : { type: String },
23
+ visible : { type: Boolean },
24
+ width : { type: String as PropType<Number | String> },
25
+ wrapClassName : { type: String },
26
+ zIndex : { type: Number },
27
+ centered : { type: Boolean },
28
+ showSave : { type: Boolean },
29
+
30
+ // 掩膜
31
+ mask : { type: Boolean, default: true },
32
+ maskClosable : { type: Boolean, default: true },
33
+ keyboard : { type: Boolean, default: true },
34
+ maskStyle : Object as PropType<CSSProperties>,
35
+
36
+ footer : Object as PropType<VNodeChild | JSX.Element>,
37
+
38
+ bodyStyle : Object as PropType<CSSProperties>,
39
+
40
+ wrapperProps : Object,
41
+ afterClose : Function,
42
+ getContainer : Function as PropType<() => any>
43
+ })
@@ -0,0 +1,27 @@
1
+ import { ModalProps } from "@dt-frames/core"
2
+ import { ComputedRef } from "vue"
3
+
4
+ export type ModalMethods = {
5
+ setModalProps: ( props: Partial<ModalProps> ) => void
6
+ emitVisible?: ( visable: boolean, uid: number ) => void
7
+ redoModalHeight?: () => void
8
+ }
9
+
10
+ export interface ReturnMethods extends ModalMethods{
11
+ openModal: <T = any>(props?: boolean, data?: T, openOnSet?: boolean) => void
12
+ closeModal: () => void
13
+ getVisible?: ComputedRef<boolean>
14
+ }
15
+
16
+ export interface ReturnInnerMethods extends ModalMethods {
17
+ openModal: <T = any>(props?: boolean, data?: T, openOnSet?: boolean) => void
18
+ closeModal: () => void
19
+ changeLoading: (loading: boolean) => void
20
+ getVisible?: ComputedRef<boolean>
21
+ redoModalHeight: () => void
22
+ }
23
+
24
+ export type RegisterFn = (modalMethods: ModalMethods, uuid?: string) => void
25
+
26
+ export type UseModalReturnType = [RegisterFn, ReturnMethods]
27
+ export type UseModalInnerReturnType = [RegisterFn, ReturnInnerMethods];
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <router-view></router-view>
3
+ </template>
4
+
5
+ <script lang="ts">
6
+ import { defineComponent } from 'vue'
7
+
8
+ export default defineComponent({
9
+ name: 'dt-base-router'
10
+ })
11
+ </script>
@@ -0,0 +1,3 @@
1
+ import DtBaseRouter from './base-router.vue'
2
+
3
+ export { DtBaseRouter }
@@ -0,0 +1 @@
1
+ export * from './src/index'
@@ -0,0 +1,69 @@
1
+ import { ApiType } from "../types/source.type";
2
+ import { message } from 'ant-design-vue'
3
+ import { http, isBoolean, isFunction, isString, JsonResult, Recordable } from "@dt-frames/core";
4
+
5
+ export function useFetch(api: string | ApiType, baseUrl: string = '') {
6
+
7
+ const getApiObj= () => {
8
+ if( isString(api) ) {
9
+ return { api }
10
+ }
11
+
12
+ return { ...api }
13
+ }
14
+
15
+ /**
16
+ * 是否可以向服务器发送请求
17
+ * 如果beforeFetch返回的是false, 则停止请求
18
+ * */
19
+ const getParams = (params: Recordable = { }) => {
20
+ const { model, beforeFetch } = getApiObj()
21
+
22
+ if( !api ) {
23
+ message.error('请求的url不能为空')
24
+ return false
25
+ }
26
+
27
+ return beforeFetch && isFunction( beforeFetch )
28
+ ? beforeFetch( Object.assign({}, model, params) )
29
+ : params
30
+ }
31
+
32
+
33
+
34
+ /**
35
+ * 发送请求
36
+ * handleParams 记录返回的值
37
+ */
38
+ function fetch(params: Recordable = { }) {
39
+ const handleParams = getParams( params )
40
+
41
+ if( isBoolean( handleParams ) && handleParams === false)
42
+ return Promise.resolve()
43
+
44
+ const { api: _api, type = 'post', header = { }, afterFetch } = getApiObj()
45
+
46
+ return new Promise(( resolve, reject ) => {
47
+ http[type]( `${ baseUrl }${_api}`, handleParams, {
48
+ ...header,
49
+ ...{ onlyData: false }
50
+ }).then(
51
+ (data: JsonResult) => {
52
+ if( afterFetch && isFunction(afterFetch) ) {
53
+ data = afterFetch( data )
54
+ }
55
+
56
+ resolve( data?.data )
57
+ },
58
+ (error) => {
59
+ reject( error )
60
+ }
61
+ )
62
+ })
63
+ }
64
+
65
+ return {
66
+ fetch
67
+ }
68
+
69
+ }
@@ -0,0 +1,3 @@
1
+ export function usePage() {
2
+
3
+ }