@dt-frames/ui 1.0.9 → 1.0.12

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 (90) hide show
  1. package/es/components/curd/src/components/dialog.d.ts +8 -3
  2. package/es/components/forms/src/components/formIcon.d.ts +1 -1
  3. package/es/components/forms/src/components/formInputUseDialog.d.ts +903 -0
  4. package/es/components/forms/src/types/form.type.d.ts +6 -4
  5. package/es/components/index.d.ts +3 -2
  6. package/es/components/modal/src/types/modal.type.d.ts +5 -2
  7. package/es/components/source/src/hooks/useFetch.d.ts +2 -2
  8. package/es/components/source/src/hooks/useSource.d.ts +8 -8
  9. package/es/components/source/src/types/table.type.d.ts +1 -1
  10. package/es/components/table/src/components/TableActions.d.ts +2 -2
  11. package/es/components/table/src/components/TableHeader.d.ts +2 -2
  12. package/es/components/table/src/components/editable/CellComponent.d.ts +14 -0
  13. package/es/components/table/src/components/editable/EditTableCell.d.ts +88 -0
  14. package/es/components/table/src/components/editable/componentMap.d.ts +4 -0
  15. package/es/components/table/src/components/editable/index.d.ts +9 -0
  16. package/es/components/table/src/components/setting/Download.d.ts +2 -2
  17. package/es/components/table/src/components/setting/Size.d.ts +2 -2
  18. package/es/components/table/src/hooks/useCustomRow.d.ts +19 -0
  19. package/es/components/table/src/index.d.ts +29 -6
  20. package/es/components/table/src/props.d.ts +5 -1
  21. package/es/components/table/src/types/table.type.d.ts +16 -0
  22. package/es/components/tree/index.d.ts +2 -0
  23. package/es/components/tree/src/hooks/useTree.d.ts +14 -0
  24. package/es/components/tree/src/props.d.ts +101 -0
  25. package/es/components/tree/src/type/tree.d.ts +85 -0
  26. package/es/components/tree/src/utils/tree.d.ts +5 -0
  27. package/es/components/upload/index.d.ts +3 -0
  28. package/es/components/upload/src/helper.d.ts +4 -0
  29. package/es/components/upload/src/index.d.ts +2807 -0
  30. package/es/components/upload/src/props.d.ts +40 -0
  31. package/es/components/upload/src/upload.d.ts +1653 -0
  32. package/es/index.js +2113 -270
  33. package/es/style/components/forms/index.less +23 -0
  34. package/es/style/components/table/index.less +8 -2
  35. package/es/style/components/tree/index.less +41 -0
  36. package/es/style/components/upload/index.less +43 -0
  37. package/es/style/theme/header/index.less +1 -1
  38. package/es/theme/sider/components/basic-menu/basic-menu.d.ts +3 -3
  39. package/es/theme/tabs/components/TabContent.d.ts +2 -2
  40. package/package.json +2 -1
  41. package/src/components/curd/src/components/dialog.vue +7 -4
  42. package/src/components/curd/src/hooks/useCurd.tsx +1 -1
  43. package/src/components/forms/index.less +23 -0
  44. package/src/components/forms/src/componentMap.ts +2 -0
  45. package/src/components/forms/src/components/formInputUseDialog.vue +43 -0
  46. package/src/components/forms/src/components/formItem.vue +25 -12
  47. package/src/components/forms/src/hooks/useFormEvents.ts +4 -3
  48. package/src/components/forms/src/hooks/useFormValues.ts +1 -1
  49. package/src/components/forms/src/types/form.type.ts +9 -3
  50. package/src/components/index.ts +9 -3
  51. package/src/components/modal/src/hooks/useModal.ts +12 -4
  52. package/src/components/modal/src/index.vue +2 -2
  53. package/src/components/modal/src/types/modal.type.ts +5 -2
  54. package/src/components/source/src/hooks/useFetch.ts +10 -6
  55. package/src/components/source/src/hooks/useSource.ts +33 -12
  56. package/src/components/source/src/types/table.type.ts +1 -1
  57. package/src/components/table/index.less +8 -2
  58. package/src/components/table/src/components/TableHeader.vue +2 -2
  59. package/src/components/table/src/components/editable/CellComponent.ts +57 -0
  60. package/src/components/table/src/components/editable/EditTableCell.vue +181 -0
  61. package/src/components/table/src/components/editable/componentMap.ts +18 -0
  62. package/src/components/table/src/components/editable/index.ts +58 -0
  63. package/src/components/table/src/hooks/useColumns.ts +15 -8
  64. package/src/components/table/src/hooks/useCustomRow.ts +86 -0
  65. package/src/components/table/src/hooks/useDataSource.ts +0 -13
  66. package/src/components/table/src/hooks/useTableHeader.ts +2 -2
  67. package/src/components/table/src/index.vue +20 -3
  68. package/src/components/table/src/props.ts +4 -1
  69. package/src/components/table/src/types/table.type.ts +28 -1
  70. package/src/components/tree/index.less +41 -0
  71. package/src/components/tree/index.ts +5 -0
  72. package/src/components/tree/src/components/TreeHeader.vue +97 -0
  73. package/src/components/tree/src/hooks/useTree.ts +239 -0
  74. package/src/components/tree/src/index.vue +392 -0
  75. package/src/components/tree/src/props.ts +133 -0
  76. package/src/components/tree/src/type/tree.ts +105 -0
  77. package/src/components/tree/src/utils/tree.ts +73 -0
  78. package/src/components/upload/index.less +43 -0
  79. package/src/components/upload/index.ts +7 -0
  80. package/src/components/upload/src/helper.ts +32 -0
  81. package/src/components/upload/src/index.vue +38 -0
  82. package/src/components/upload/src/props.ts +48 -0
  83. package/src/components/upload/src/upload.vue +166 -0
  84. package/src/theme/header/helper/menu-tree.ts +2 -2
  85. package/src/theme/header/index.less +1 -1
  86. package/src/theme/sider/helper/split-menu.ts +2 -2
  87. package/es/components/dialog/index.d.ts +0 -2
  88. package/es/components/dialog/src/hooks/useDialog.d.ts +0 -3
  89. package/src/components/dialog/index.ts +0 -5
  90. package/src/components/dialog/src/hooks/useDialog.ts +0 -85
@@ -0,0 +1,43 @@
1
+ .dt-upload-wrap{
2
+ height: 350px;
3
+ padding: 10px 20px;
4
+ display: flex;
5
+ flex-direction: column;
6
+
7
+ .ant-table-wrapper{
8
+ flex: 1;
9
+ .ant-table-body{
10
+ border-bottom: 1px solid #e7e7e7;
11
+ }
12
+ }
13
+ }
14
+
15
+ .file-header{
16
+ display: flex;
17
+ flex-direction: row;
18
+ justify-content: space-between;
19
+ &>div{
20
+ display: flex;
21
+ flex-direction: row;
22
+ button{
23
+ margin-right: 10px;
24
+ }
25
+ }
26
+ }
27
+
28
+ .file-type-tips{
29
+ line-height: 24px;
30
+ padding: 5px 10px;
31
+ font-size: 12px;
32
+ display: flex;
33
+ margin: 10px 0;
34
+ border: 1px dashed @primary-color;
35
+ cursor: inherit;
36
+ span i{
37
+ color: @primary-color;
38
+ margin-right: 7px;
39
+ }
40
+ i{
41
+ color: #666;
42
+ }
43
+ }
@@ -0,0 +1,7 @@
1
+ import DtUploadModal from './src/index.vue'
2
+ import DtUpload from './src/upload.vue'
3
+
4
+ export {
5
+ DtUploadModal,
6
+ DtUpload
7
+ }
@@ -0,0 +1,32 @@
1
+ import { computed, Ref, unref } from "vue"
2
+
3
+ export function useHelpers(
4
+ acceptRef: Ref<string[]>,
5
+ helpTextRef: Ref<string>,
6
+ maxNumberRef: Ref<number>,
7
+ maxSizeRef: Ref<number>
8
+ ) {
9
+ // 文件类型
10
+ const getAccept = computed(() => {
11
+ const accept = unref(acceptRef);
12
+ if (accept && accept.length > 0) {
13
+ return accept;
14
+ }
15
+ return [];
16
+ })
17
+
18
+ const getStringAccept = computed(() => {
19
+ return unref(getAccept)
20
+ .map((item) => {
21
+ if (item.indexOf('/') > 0 || item.startsWith('.')) {
22
+ return item
23
+ }
24
+ return `.${item}`
25
+ })
26
+ .join(',')
27
+ })
28
+
29
+ return {
30
+ getStringAccept
31
+ }
32
+ }
@@ -0,0 +1,38 @@
1
+ <template>
2
+ <DtModal
3
+ @save="handleSave()"
4
+ @register="register"
5
+ >
6
+ <div class="dt-upload-wrap">
7
+ <DtUpload ref="uploadRef" :defaultFiles="defaultFiles">
8
+ 111
9
+ </DtUpload>
10
+ </div>
11
+ </DtModal>
12
+ </template>
13
+
14
+ <script lang="ts" setup>
15
+ import { ref } from 'vue'
16
+ import { DtModal, useModal } from '../../modal'
17
+ import DtUpload from './upload.vue'
18
+
19
+ const uploadRef = ref(null)
20
+ const emites = defineEmits(['register'])
21
+
22
+ // 注册弹框
23
+ const [register] = useModal({
24
+ width: '700px',
25
+ title: '文件上传',
26
+ maskClosable: false,
27
+ })
28
+
29
+ const defaultFiles = [
30
+ { fileName: '叮咚发票667.09.pdf', fileId: '1' }
31
+ ]
32
+
33
+ // 保存
34
+ function handleSave() {
35
+ console.log(uploadRef.value.allFilesRef)
36
+ alert("s-s-s-")
37
+ }
38
+ </script>
@@ -0,0 +1,48 @@
1
+ import { Fn } from "@vueuse/core"
2
+ import { PropType } from "vue"
3
+
4
+ export type FileType = {
5
+ fileName: String
6
+ [key: string]: any
7
+ }
8
+
9
+ export const basicUploadProps = {
10
+ // 是否显示模板下载
11
+ showTemplateDownload: {
12
+ type: Boolean,
13
+ default: false,
14
+ },
15
+ // 模板下载
16
+ templateDownload: {
17
+ type: Function as PropType<Fn>,
18
+ default: () => {}
19
+ },
20
+ helpText: {
21
+ type: String as PropType<string>,
22
+ default: '',
23
+ },
24
+ // 是否支持批量上传
25
+ multiple: {
26
+ type: Boolean as PropType<boolean>,
27
+ default: true,
28
+ },
29
+ // 文件支持的类型
30
+ accept: {
31
+ type: Array as PropType<string[]>,
32
+ default: () => [],
33
+ },
34
+ // 文件最大多少MB
35
+ maxSize: {
36
+ type: Number as PropType<number>,
37
+ default: 2,
38
+ },
39
+ // 最大数量的文件,Infinity不限制
40
+ maxNumber: {
41
+ type: Number as PropType<number>,
42
+ default: Infinity,
43
+ },
44
+ defaultFiles: {
45
+ type: Array as PropType<FileType[]>,
46
+ default: []
47
+ }
48
+ }
@@ -0,0 +1,166 @@
1
+ <template>
2
+ <div class="file-header">
3
+ <div>
4
+ <Upload
5
+ :accept="getStringAccept"
6
+ :multiple="multiple"
7
+ :before-upload="beforeUpload"
8
+ :show-upload-list="false"
9
+ >
10
+ <Button type="primary">
11
+ <span v-icon="'ic:baseline-file-upload'"></span>
12
+ 文件上传
13
+ </Button>
14
+ </Upload>
15
+ <Button type="primary" v-if="showTemplateDownload" @click="templateDownload">
16
+ <span v-icon="'ic:baseline-file-download'"></span>
17
+ 模板下载
18
+ </Button>
19
+ </div>
20
+ <slot></slot>
21
+ </div>
22
+
23
+ <div class="file-type-tips ant-alert-info">
24
+ <span v-icon="'ant-design:info-circle-outlined'"></span>
25
+ <i>请上传pptx、doc、jpg、jpeg、png、bmp、gif、xls、xlsx、txt、rar、zip、7z、tar、gz格式文件</i>
26
+ </div>
27
+
28
+ <DtTable @register="registerTable"></DtTable>
29
+
30
+ <Image
31
+ :width="200"
32
+ :style="{ display: 'none' }"
33
+ :preview="{
34
+ visible: imgVisable,
35
+ onVisibleChange: setImgVisible,
36
+ }"
37
+ src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
38
+ ></Image>
39
+
40
+ </template>
41
+
42
+ <script lang="ts" setup>
43
+ import { h, ref, toRefs, watchEffect } from 'vue'
44
+ import { Button, Upload, Image } from 'ant-design-vue'
45
+ import { DtTable, useTable } from '../../table'
46
+ import { basicUploadProps } from './props'
47
+ import { useHelpers } from './helper'
48
+ import { useMessage } from '@dt-frames/core'
49
+ import * as SparkMD5 from 'spark-md5'
50
+
51
+
52
+ const { message } = useMessage()
53
+
54
+ const filesRef = ref([])
55
+ const historyFilesRef = ref([])
56
+ const allFilesRef = ref([])
57
+
58
+ // 控制图片预览显示隐藏
59
+ const imgVisable = ref( false )
60
+ const setImgVisible = (value) => imgVisable.value = value
61
+
62
+ const props = defineProps( basicUploadProps )
63
+
64
+ const { accept, helpText, maxNumber, maxSize } = toRefs(props)
65
+ const { getStringAccept } = useHelpers( accept, helpText, maxNumber, maxSize )
66
+
67
+
68
+ const [registerTable, { }] = useTable({
69
+ tableSetting: false,
70
+ pagination: false,
71
+ dataSource: allFilesRef,
72
+ columns: [
73
+ { title: '文件名称', dataIndex: 'fileName' },
74
+ { title: '上传状态', dataIndex: 'fileStatue', render(row) {
75
+ return h('span', {
76
+ style: `color: ${ row.status === 0 ? 'orange' : 'green' }`,
77
+ }, row.fileStatue)
78
+ } },
79
+ ],
80
+ operations: {
81
+ expand: true,
82
+ btns: [
83
+ { title: '预览', icon: 'ic:baseline-remove-red-eye',
84
+ ifShow(row) {
85
+ const supportFileTypes = ['pdf', 'jpg', 'jpeg', 'png', 'bmp', 'gif']
86
+ return supportFileTypes.includes( row.fileName.split('.').pop() )
87
+ },
88
+ action: () => {
89
+ setImgVisible(true)
90
+ }
91
+ },
92
+ { title: '编辑', icon: 'mdi:text-box-edit-outline' },
93
+ { title: '删除', icon: 'mdi:delete-outline' }
94
+ ]
95
+ }
96
+ })
97
+
98
+
99
+ watchEffect(() => {
100
+ historyFilesRef.value = props.defaultFiles.map(file => {
101
+ return {
102
+ ...file,
103
+ fileName: file.fileName,
104
+ status: 0,
105
+ fileStatue: '历史上传'
106
+ }
107
+ })
108
+
109
+ allFilesRef.value = [...historyFilesRef.value, ...filesRef.value]
110
+ })
111
+
112
+
113
+ function beforeUpload(file: File) {
114
+ const { maxSize } = props
115
+
116
+ if( maxSize && file.size / 1024 / 1024 >= maxSize ) {
117
+ message.error(`只能上传不超过${ maxSize }MB的文件!`)
118
+ return false
119
+ }
120
+
121
+ addFile( file )
122
+
123
+ return false
124
+ }
125
+
126
+ // 添加文件
127
+ function addFile(file: File) {
128
+ let blobSlice = File.prototype.slice || (File.prototype as any).mozSlice || (File.prototype as any).webkitSlice
129
+ let chunkSize = 2097152,
130
+ chunks = Math.ceil(file.size / chunkSize),
131
+ currentChunk = 0,
132
+ spark = new SparkMD5.ArrayBuffer(),
133
+ fileReader = new FileReader()
134
+
135
+ fileReader.onload = function (e) {
136
+ spark.append(e.target['result']);
137
+ currentChunk++;
138
+
139
+ if (currentChunk < chunks) {
140
+ loadNext();
141
+ } else {
142
+ filesRef.value.push({
143
+ fileName: file.name,
144
+ fileId: spark.end(),
145
+ file,
146
+ status: 1,
147
+ fileStatue: '待上传'
148
+ })
149
+ }
150
+ }
151
+
152
+ function loadNext() {
153
+ var start = currentChunk * chunkSize,
154
+ end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize
155
+
156
+ fileReader.readAsArrayBuffer(blobSlice.call(file, start, end))
157
+ }
158
+
159
+ loadNext()
160
+ }
161
+
162
+
163
+ defineExpose({
164
+ allFilesRef
165
+ })
166
+ </script>
@@ -13,7 +13,7 @@ function deleteChildrenProp( menu: any ) {
13
13
 
14
14
  // 获取当前路由的面包屑
15
15
  export function getBreadCrumb(path: string, menus?: Menus[]) {
16
- const _menus = menus || DtCache.getLocal(CacheKey.MENUS) || []
16
+ const _menus = menus || DtCache.getLocal(CacheKey.MENUS)?.children || []
17
17
 
18
18
  let routes: Menus[] = []
19
19
 
@@ -58,7 +58,7 @@ export function getFilterMenu( filter: string = '', flag: boolean = false) {
58
58
  } )
59
59
  }
60
60
 
61
- getTargetMenus( DtCache.getLocal(CacheKey.MENUS) );
61
+ getTargetMenus( DtCache.getLocal(CacheKey.MENUS)?.children );
62
62
 
63
63
  return _menus;
64
64
  }
@@ -417,7 +417,7 @@
417
417
  margin-bottom: 20px;
418
418
 
419
419
  .select-item{
420
- width: 130px;
420
+ width: 130px !important;
421
421
  }
422
422
  }
423
423
 
@@ -67,7 +67,7 @@ export function useSplitMenu( splitType: Ref<MenuSplitTye> ) {
67
67
 
68
68
  async function getMenus() {
69
69
  if (unref(normalType)) {
70
- menusRef.value = DtCache.getLocal(CacheKey.MENUS)
70
+ menusRef.value = DtCache.getLocal(CacheKey.MENUS)?.children
71
71
  return;
72
72
  }
73
73
 
@@ -85,7 +85,7 @@ export function useSplitMenu( splitType: Ref<MenuSplitTye> ) {
85
85
  }
86
86
 
87
87
 
88
- async function getMenus() { return DtCache.getLocal(CacheKey.MENUS) }
88
+ async function getMenus() { return DtCache.getLocal(CacheKey.MENUS)?.children }
89
89
 
90
90
  function getFirstMenuPath(item: Menus) {
91
91
  let isFind = false, path = ''
@@ -1,2 +0,0 @@
1
- import { useDialog } from './src/hooks/useDialog';
2
- export { useDialog };
@@ -1,3 +0,0 @@
1
- export declare function useDialog(): {
2
- createDialog: (component: any, options: any) => Promise<unknown>;
3
- };
@@ -1,5 +0,0 @@
1
- import { useDialog } from './src/hooks/useDialog'
2
-
3
- export {
4
- useDialog
5
- }
@@ -1,85 +0,0 @@
1
- import { ModalProps, Recordable } from "@dt-frames/core"
2
- import { VNode, h, createVNode, render as vueRender, Component } from "vue"
3
-
4
- export function useDialog() {
5
- function createDialog( component: any, options: any ) {
6
- return new Promise( resolve => {
7
- const div = document.createElement('div');
8
- document.body.appendChild(div);
9
-
10
- const wrapper = () => {
11
- return h(component, {
12
- params: {
13
- ...options,
14
- afterClose: ( data: any ) => destroy( data )
15
- }
16
-
17
- })
18
- };
19
-
20
- let dialogInstance = render();
21
-
22
- function render() {
23
- const vm = createVNode(component.children[0]);
24
- vueRender(vm, div);
25
- return vm;
26
- }
27
-
28
- function destroy( data: any ) {
29
- if (dialogInstance && div.parentNode) {
30
- vueRender(null, div);
31
- dialogInstance.component.update();
32
- dialogInstance = null;
33
- div.parentNode.removeChild(div);
34
- }
35
-
36
- resolve( data );
37
- }
38
- } )
39
- }
40
- // function createDialog(component: any, props?: ModalProps) {
41
- // const afterClose = (rsp: Recordable) => { }
42
-
43
- // const div = document.createElement('div')
44
- // document.body.appendChild(div)
45
-
46
- // const wrapper = () => {
47
- // return (
48
- // h(component, {
49
- // params: {
50
- // ...props,
51
- // afterClose: ( data: Recordable ) => destroy( data )
52
- // }
53
- // })
54
- // )
55
- // }
56
-
57
- // let dialogInstance = render()
58
-
59
- // function render(){
60
- // const vm = createVNode(wrapper)
61
- // vueRender(vm, div)
62
- // return vm
63
- // }
64
-
65
- // const destroy = ( data: Recordable ) => {
66
- // if (dialogInstance && div.parentNode) {
67
- // vueRender(null, div)
68
- // dialogInstance.component.update()
69
- // dialogInstance = null
70
- // div.parentNode.removeChild(div)
71
- // }
72
-
73
- // afterClose( data )
74
- // }
75
-
76
-
77
- // return {
78
- // afterClose
79
- // }
80
- // }
81
-
82
- return {
83
- createDialog
84
- }
85
- }