br-dionysus 1.6.6 → 1.6.7

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 (115) hide show
  1. package/README.md +90 -52
  2. package/attributes.json +1 -1
  3. package/dist/br-dionysus.es.js +4659 -4595
  4. package/dist/br-dionysus.umd.js +8 -8
  5. package/dist/index.css +1 -1
  6. package/dist/packages/MTable/src/MTable.vue.d.ts +21 -0
  7. package/dist/packages/MTable/src/token.d.ts +10 -1
  8. package/docs/assets/README-BIIm2ID5.css +1 -0
  9. package/docs/assets/README-BVC502ud.js +1 -0
  10. package/docs/assets/README-BaVHXTcr.js +1 -0
  11. package/docs/assets/README-BkoXPzeT.js +1 -0
  12. package/docs/assets/README-BpY9wwJ5.js +1 -0
  13. package/docs/assets/README-BxVIiLkB.css +1 -0
  14. package/docs/assets/README-C8q4oePg.css +1 -0
  15. package/docs/assets/README-C9E9QEak.js +1 -0
  16. package/docs/assets/README-CJnIKztR.css +1 -0
  17. package/docs/assets/README-CPi9K5cm.css +1 -0
  18. package/docs/assets/README-CVikrcuu.js +1 -0
  19. package/docs/assets/README-CwxKEz5n.js +1 -0
  20. package/docs/assets/README-D-sCcuuV.js +1 -0
  21. package/docs/assets/README-D1NyMPDh.css +1 -0
  22. package/docs/assets/README-D8dRnWkj.css +1 -0
  23. package/docs/assets/README-DC5fWcO7.css +1 -0
  24. package/docs/assets/README-DFookNbq.js +1 -0
  25. package/docs/assets/README-DJM0QNOa.css +1 -0
  26. package/docs/assets/README-DJsWJjpr.js +2 -0
  27. package/docs/assets/README-DZH0ZBFE.js +1 -0
  28. package/docs/assets/README-DuLXE9ma.css +1 -0
  29. package/docs/assets/README-DxdjMTiZ.js +1 -0
  30. package/docs/assets/README-DxzXrur_.js +1 -0
  31. package/docs/assets/README-ZSEyYWl3.css +1 -0
  32. package/docs/assets/empty-BHv0FmNK.png +0 -0
  33. package/docs/assets/index-B3d27dSP.js +66 -0
  34. package/docs/assets/index-BeGJML3j.css +1 -0
  35. package/docs/index.html +14 -0
  36. package/docs/packages/Hook/usePackageConfig/README.md +35 -0
  37. package/docs/packages/Hook/usePackageConfig/demo.vue +28 -0
  38. package/docs/packages/Hook/usePackageConfig/usePackageConfig.ts +39 -0
  39. package/docs/packages/Hook/useRemainingSpace/README.md +26 -0
  40. package/docs/packages/Hook/useRemainingSpace/useRemainingSpace.ts +148 -0
  41. package/docs/packages/Hook/useTableConfig/README.md +50 -0
  42. package/docs/packages/Hook/useTableConfig/demo.vue +134 -0
  43. package/docs/packages/Hook/useTableConfig/useTableConfig.ts +173 -0
  44. package/docs/packages/Hook/useZIndex/README.md +6 -0
  45. package/docs/packages/Hook/useZIndex/useGlobalZIndex.ts +34 -0
  46. package/docs/packages/MDialog/docs/README.md +26 -0
  47. package/docs/packages/MDialog/docs/demo.vue +72 -0
  48. package/docs/packages/MDialog/index.ts +10 -0
  49. package/docs/packages/MDialog/src/MDialog.vue +150 -0
  50. package/docs/packages/MInline/docs/README.md +26 -0
  51. package/docs/packages/MInline/docs/demo.vue +138 -0
  52. package/docs/packages/MInline/index.ts +10 -0
  53. package/docs/packages/MInline/src/MInline.vue +284 -0
  54. package/docs/packages/MInputNumber/docs/README.md +35 -0
  55. package/docs/packages/MInputNumber/docs/demo.vue +17 -0
  56. package/docs/packages/MInputNumber/index.ts +10 -0
  57. package/docs/packages/MInputNumber/src/MInputNumber.vue +268 -0
  58. package/docs/packages/MSelect/docs/README.md +20 -0
  59. package/docs/packages/MSelect/docs/demo.vue +36 -0
  60. package/docs/packages/MSelect/index.ts +17 -0
  61. package/docs/packages/MSelect/src/MOption.vue +43 -0
  62. package/docs/packages/MSelect/src/MSelect.vue +57 -0
  63. package/docs/packages/MSelect/src/token.ts +8 -0
  64. package/docs/packages/MSelectTable/docs/README.md +88 -0
  65. package/docs/packages/MSelectTable/docs/demo.vue +196 -0
  66. package/docs/packages/MSelectTable/index.ts +10 -0
  67. package/docs/packages/MSelectTable/src/MSelectTable.vue +493 -0
  68. package/docs/packages/MSelectTableV1/docs/README.md +49 -0
  69. package/docs/packages/MSelectTableV1/docs/demo.vue +77 -0
  70. package/docs/packages/MSelectTableV1/index.ts +10 -0
  71. package/docs/packages/MSelectTableV1/src/MSelectTableV1.vue +460 -0
  72. package/docs/packages/MSelectV2/docs/README.md +31 -0
  73. package/docs/packages/MSelectV2/docs/demo.vue +36 -0
  74. package/docs/packages/MSelectV2/index.ts +10 -0
  75. package/docs/packages/MSelectV2/src/MSelectV2.vue +116 -0
  76. package/docs/packages/MTable/docs/README.md +40 -0
  77. package/docs/packages/MTable/docs/demo.vue +93 -0
  78. package/docs/packages/MTable/index.ts +10 -0
  79. package/docs/packages/MTable/src/MTable.vue +228 -0
  80. package/docs/packages/MTable/src/token.ts +9 -0
  81. package/docs/packages/MTableColumn/docs/README.md +22 -0
  82. package/docs/packages/MTableColumn/docs/demo.vue +110 -0
  83. package/docs/packages/MTableColumn/index.ts +10 -0
  84. package/docs/packages/MTableColumn/src/MTableColumn.vue +345 -0
  85. package/docs/packages/MTableColumnSet/docs/README.md +31 -0
  86. package/docs/packages/MTableColumnSet/docs/demo.vue +36 -0
  87. package/docs/packages/MTableColumnSet/index.ts +10 -0
  88. package/docs/packages/MTableColumnSet/src/MTableColumnSet.vue +310 -0
  89. package/docs/packages/README.md +10 -0
  90. package/docs/packages/SkinConfig/docs/README.md +42 -0
  91. package/docs/packages/SkinConfig/docs/demo.vue +680 -0
  92. package/docs/packages/SkinConfig/index.ts +10 -0
  93. package/docs/packages/SkinConfig/src/SkinConfig.vue +478 -0
  94. package/docs/packages/SkinConfig/src/useSkin.ts +230 -0
  95. package/docs/packages/TabPage/docs/README.md +10 -0
  96. package/docs/packages/TabPage/docs/demo.vue +96 -0
  97. package/docs/packages/TabPage/index.ts +10 -0
  98. package/docs/packages/TabPage/src/TabPage.vue +566 -0
  99. package/docs/packages/Tool/moneyFormat/README.md +15 -0
  100. package/docs/packages/Tool/moneyFormat/moneyFormat.ts +69 -0
  101. package/docs/packages/index.ts +61 -0
  102. package/docs/packages/list.json +80 -0
  103. package/docs/packages/typings/class.ts +22 -0
  104. package/docs/packages/typings/enum.ts +9 -0
  105. package/docs/packages/typings/global.d.ts +69 -0
  106. package/docs/packages/typings/interface.ts +6 -0
  107. package/package.json +1 -1
  108. package/packages/MTable/docs/README.md +22 -17
  109. package/packages/MTable/docs/demo.vue +15 -1
  110. package/packages/MTable/src/MTable.vue +54 -6
  111. package/packages/MTable/src/token.ts +11 -2
  112. package/packages/MTableColumn/docs/README.md +8 -8
  113. package/packages/MTableColumn/src/MTableColumn.vue +72 -6
  114. package/tags.json +1 -1
  115. package/web-types.json +1 -1
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" href="/favicon.ico" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>Vite App</title>
8
+ <script type="module" crossorigin src="/assets/index-B3d27dSP.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-BeGJML3j.css">
10
+ </head>
11
+ <body>
12
+ <div id="app"></div>
13
+ </body>
14
+ </html>
@@ -0,0 +1,35 @@
1
+ <script setup>
2
+ import demo from './demo.vue'
3
+ </script>
4
+
5
+ 配置保存与获取 hook
6
+ =================
7
+
8
+ ### 1) 基础用法
9
+
10
+ <Preview comp-name="usePackageConfig" demo-name="demo" is-hook>
11
+ <demo />
12
+ </Preview>
13
+
14
+ ### 2) 所需参数
15
+
16
+ | 名称 | 描述 | 类型 | 可选值 | 默认值 |
17
+ |-----------|----|---------------------------|:---:|:---:|
18
+ | parameter | 参数 | UsePackageConfigParameter | - | {} |
19
+
20
+ #### UsePackageConfigParameter
21
+
22
+ | 名称 | 描述 | 类型 | 必填 | 默认值 |
23
+ |-----------|-----------|-----------------------------------|----|--------------------------------------------------------------------------------------:|
24
+ | setConfig | 触发设置配置的回调 | (key: string, value: any) => void | 否 | (key: string, data: any): void => { localStorage.setItem(key, JSON.stringify(data)) } |
25
+ | getConfig | 触发获取配置的回调 | (key: string) => any | 否 | (key: string): any => JSON.parse(localStorage.getItem(key) \|\| '{}') |
26
+
27
+ ### 2) 返回值
28
+
29
+ | 名称 | 描述 | 类型 |
30
+ |-----|--------|-----------------------------------|
31
+ | set | 触发设置配置 | (key: string, value: any) => void |
32
+ | get | 触发获取配置 | (key: string) => any |
33
+
34
+
35
+
@@ -0,0 +1,28 @@
1
+ <template>
2
+ <div>
3
+ <el-button @click="getConfig">获取config</el-button>
4
+ <el-button @click="setConfig">设置config</el-button>
5
+ </div>
6
+ </template>
7
+
8
+ <script setup lang="ts">
9
+ import usePackageConfig from 'packages/Hook/usePackageConfig/usePackageConfig'
10
+ usePackageConfig({
11
+ getConfig: (key: string = '') => {
12
+ return JSON.parse(localStorage.getItem(key) || '{}')
13
+ },
14
+ setConfig: (key: string = '', data: any) => {
15
+ setTimeout(() => {
16
+ localStorage.setItem(key, JSON.stringify(data))
17
+ }, 1000)
18
+ }
19
+ })
20
+
21
+ const packageConfig = usePackageConfig()
22
+ const getConfig = () => {
23
+ console.log('packageConfig.get()', packageConfig.get('test'))
24
+ }
25
+ const setConfig = () => {}
26
+ </script>
27
+
28
+ <style lang="scss"></style>
@@ -0,0 +1,39 @@
1
+ let setApiAjax = (key: string, data: any): void => { localStorage.setItem(key, JSON.stringify(data)) }
2
+ let getApiAjax = (key: string): any => JSON.parse(localStorage.getItem(key) || '{}')
3
+
4
+ interface UsePackageConfig {
5
+ /** 触发设置配置 */
6
+ set: (key: string, value: any) => void,
7
+ /** 触发获取配置 */
8
+ get: (key: string) => any
9
+ }
10
+
11
+ interface UsePackageConfigParameter {
12
+ /** 触发设置配置的回调 */
13
+ setConfig?: (key: string, value: any) => void,
14
+ /** 触发获取配置的回调 */
15
+ getConfig?: (key: string) => any
16
+ }
17
+
18
+ /**
19
+ * @description 配置保存与获取
20
+ * */
21
+ const usePackageConfig = (parameter: UsePackageConfigParameter = {}): UsePackageConfig => {
22
+ if (parameter.setConfig) setApiAjax = parameter.setConfig
23
+ if (parameter.getConfig) getApiAjax = parameter.getConfig
24
+
25
+ const setConfigEvent = (key: string, value: any): void => {
26
+ setApiAjax(key, value)
27
+ }
28
+
29
+ const getConfigEvent = (key: string): any => {
30
+ return getApiAjax(key)
31
+ }
32
+
33
+ return {
34
+ set: setConfigEvent,
35
+ get: getConfigEvent
36
+ }
37
+ }
38
+
39
+ export default usePackageConfig
@@ -0,0 +1,26 @@
1
+ 计算获取剩余空间 hook
2
+ =================
3
+
4
+ ### 1) 所需参数
5
+
6
+ | 名称 | 描述 | 类型 | 可选值 | 默认值 |
7
+ |--------------|------|--------|:---:|:---:|
8
+ | boxClassName | 父级空间 | string | - | - |
9
+ | className | 排除空间 | string | - | - |
10
+ | redundancy | 冗余值 | number | - | 0 |
11
+
12
+ ### 2) 返回值
13
+
14
+ | 名称 | 描述 | 类型 |
15
+ |--------------|--------------------------------|-------------|
16
+ | height | 计算之后的高度 | ref<number> |
17
+ | tableCovered | 重新进行计算高度 (如弹窗表 抽屉表 等默认无DOM时使用) | function |
18
+ | init | 重新初始化 (如弹窗表 抽屉表 等默认无DOM时使用) | function |
19
+
20
+
21
+
22
+
23
+
24
+
25
+
26
+
@@ -0,0 +1,148 @@
1
+ import { ref, onMounted, nextTick } from 'vue'
2
+ import type { Ref } from 'vue'
3
+
4
+ /**
5
+ * 获取剩余空间
6
+ * @param boxClassName 父级空间
7
+ * @param className 排除空间
8
+ * @param redundancy 冗余值
9
+ * @return height
10
+ * @return tableCovered
11
+ * @return init
12
+ */
13
+ const useRemainingSpace = (boxClassName: string, className: string = '', redundancy: number = 0): {
14
+ height: Ref<number>,
15
+ tableCovered: Function,
16
+ init: Function
17
+ } => {
18
+ const height = ref<number>(0)
19
+
20
+ const getPropDom = (el: HTMLElement): HTMLElement => {
21
+ if (!el?.parentElement) return el
22
+ if (el.parentElement.className.includes(boxClassName)) {
23
+ return el
24
+ } else {
25
+ return getPropDom(el.parentElement as HTMLElement)
26
+ }
27
+ }
28
+
29
+ // 是否有横向滚动条
30
+ const hasHorizontalScrollbar = (element: HTMLElement): boolean => element.scrollWidth > element.clientWidth
31
+
32
+ const tableCovered = () => {
33
+ nextTick(() => {
34
+ const dom: HTMLElement | null = document.querySelector('.' + className) as HTMLElement
35
+ const _className = getPropDom(dom)?.className || ''
36
+ const box: HTMLElement | null = document.querySelector('.' + boxClassName)
37
+
38
+ if (!_className || !box) {
39
+ height.value = 100
40
+ return
41
+ }
42
+
43
+ const getOffsetTop = (el: HTMLElement, count: number = 0, level: number = 1): number => {
44
+ if (el?.className.includes(boxClassName) || !el.parentElement) {
45
+ return count
46
+ } else {
47
+ const isRelative = (window.getComputedStyle(el)?.getPropertyValue('position') || '') === 'relative'
48
+ const _count = isRelative || level === 1 ? el.offsetTop + count : count
49
+ return getOffsetTop(el.parentElement as HTMLElement, _count, level + 1)
50
+ }
51
+ }
52
+
53
+ const boxStyle: CSSStyleDeclaration = window.getComputedStyle(box)
54
+ const boxPosition = boxStyle.position
55
+
56
+ // 是否为相对定位
57
+ const isBoxRelative = boxPosition === 'relative'
58
+ if (!isBoxRelative) box.style.position = 'relative'
59
+ const offsetTop = getOffsetTop(dom)
60
+ // if (!isBoxRelative) box.style.position = boxPosition
61
+
62
+ const paddingBottom = parseInt(boxStyle.getPropertyValue('padding-bottom'), 10)
63
+ // 横向滚动条高度
64
+ const scrollHeight = hasHorizontalScrollbar(box) ? 10 : 0
65
+ // 内部高度
66
+ const boxInsideHeight = box.clientHeight - paddingBottom - scrollHeight
67
+
68
+ // 内容物高度
69
+ let contentHeight = 0
70
+
71
+ let isEndDom = false
72
+ for (let i = 0; i < box.children.length; i++) {
73
+ const item: HTMLElement = box.children[i] as HTMLElement
74
+ if (isEndDom) {
75
+ const itemStyle: CSSStyleDeclaration = window.getComputedStyle(item)
76
+ const marginTop = parseInt(itemStyle.getPropertyValue('margin-top'), 10)
77
+ const marginBottom = parseInt(itemStyle.getPropertyValue('margin-bottom'), 10)
78
+ const position = itemStyle.getPropertyValue('position')
79
+ if (position !== 'absolute' && position !== 'fixed') {
80
+ contentHeight += item.offsetHeight + marginTop + marginBottom
81
+ }
82
+ }
83
+ if (item.className.includes(_className)) {
84
+ isEndDom = true
85
+ }
86
+ }
87
+
88
+ height.value = boxInsideHeight - contentHeight - offsetTop - redundancy
89
+ })
90
+ }
91
+
92
+ // 节流
93
+ const throttle = (func: Function, limit: number = 100) => {
94
+ let inThrottle: boolean = false
95
+ return (...args: any) => {
96
+ if (!inThrottle) {
97
+ inThrottle = true
98
+ setTimeout(() => {
99
+ func.apply(this, args)
100
+ inThrottle = false
101
+ }, limit)
102
+ }
103
+ }
104
+ }
105
+
106
+ const init = () => {
107
+ const targetNode: Element | null = document.querySelector('.' + boxClassName)
108
+ if (!targetNode) return false
109
+ const dom: HTMLElement | null = document.querySelector('.' + className)
110
+ tableCovered()
111
+
112
+ const observer = new MutationObserver(throttle((mutationsList: MutationRecord[]) => {
113
+ if (!dom) return
114
+ // 检查是否全部为dom的子元素
115
+ const checkChildDom: boolean = !mutationsList.filter(item => !dom.contains(item.target)).length
116
+ if (checkChildDom) return false
117
+ tableCovered()
118
+ }))
119
+
120
+ observer.observe(targetNode, {
121
+ attributes: false, // 属性变化
122
+ childList: true, // 子节点增删
123
+ subtree: true // 后代
124
+ })
125
+
126
+ const resizeObserver = new ResizeObserver(entries => {
127
+ if (!dom) return
128
+ tableCovered()
129
+ })
130
+
131
+ resizeObserver.observe(targetNode)
132
+ }
133
+
134
+ onMounted(() => {
135
+ init()
136
+ })
137
+
138
+ return {
139
+ /** 高度 */
140
+ height,
141
+ /** 重新触发计算 */
142
+ tableCovered,
143
+ /** 重新初始化 */
144
+ init
145
+ }
146
+ }
147
+
148
+ export default useRemainingSpace
@@ -0,0 +1,50 @@
1
+ <script setup>
2
+ import demo from './demo.vue'
3
+ </script>
4
+
5
+ 表格组合 hook
6
+ =================
7
+
8
+ ### 1) 基础用法
9
+
10
+ <Preview comp-name="usePackageConfig" demo-name="demo" is-hook>
11
+ <demo />
12
+ </Preview>
13
+
14
+ ### 2) 所需参数
15
+
16
+ | 名称 | 描述 | 类型 | 可选值 | 默认值 |
17
+ |------------|--------|--------------|:---:|:---:|
18
+ | name | 表格唯一标识 | string | - | - |
19
+ | tableTitle | 列配置 | tableTitle[] | - | - |
20
+ | tableData | 表格数据 | ref<any[]> | - | - |
21
+
22
+ ### 3) 返回值
23
+
24
+ | 名称 | 描述 | 类型 |
25
+ |------------------|---------|-----------------------------------------|
26
+ | tableTitle | 处理之后的表头 | TableTitle[] |
27
+ | tableConfig | 表头的配置项 | { [propName: string]: TableConfigItem} |
28
+ | headerDragend | 表格拖拽事件 | function |
29
+ | initColumnFilter | 列的筛选 | function |
30
+ | filtersValue | 过滤条件 | { [key: string]: Array<string,number>} |
31
+
32
+ ### 4) TableTitle
33
+
34
+ | 名称 | 描述 | 类型 | 是否必填 |
35
+ |--------------|---------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|------|
36
+ | label | 显示的标题 | string | 是 |
37
+ | prop | 字段对应列的字段名字也可以使用 property属性 | string | 是 |
38
+ | minWidth | 对应列的最小宽度与 width 的区别是 width 是固定的,min-width 会按比例分配剩余宽度 | number \| string | 否 |
39
+ | className | 列的className | boolean \| string | 否 |
40
+ | sortable | 列是否能够排序 则代表用户希望远程排序,需要监听 Table 的 sort-change 事件 | Boolean | 否 |
41
+ | sortBy | 指定数据按照哪个属性进行排序,仅当 sortable 设置为 true 且没有设置 sort-method 的时候有效。 如果 sort-by 为数组,则先按照第 1 个属性排序,如果第 1 个相等,再按照第 2 个排序,以此类推 | (row: any, index: number) => string \| string \| string[] | 否 |
42
+ | sortOrders | 数据在排序时所使用排序策略的轮转顺序,仅当 sortable 为 true 时有效。 需传入一个数组,随着用户点击表头,该列依次按照数组中元素的顺序进行排序 | ('ascending' \| 'descending' \| null)[] | 否 |
43
+ | filters | 据过滤的选项, 数组格式,数组中的元素需要有 text 和 value 属性。 数组中的每个元素都需要有 text 和 value 属性 | {text:string,number,value:string,number} [] | 否 |
44
+ | filterMethod | 数据过滤使用的方法, 如果是多选的筛选项,对每一条数据会执行多次,任意一次返回 true 就会显示 | Function | 否 |
45
+ | headerAlign | 表头对齐方式, 若不设置该项,则使用表格的对齐方式 | 'left' \| 'center' \| 'right' | 否 |
46
+ | align | 对齐方式 | 'left' \| 'center' \| 'right' | 否 |
47
+ | fixed | 列是否固定在左侧或者右侧。 true 表示固定在左侧 | 'left' \| 'right' \| boolean | 否 |
48
+
49
+
50
+
@@ -0,0 +1,134 @@
1
+ <template>
2
+ <div>
3
+ <el-button @click="page.pageSize = 50">设置50</el-button>
4
+ <el-button @click="page.pageSize = 100">设置100</el-button>
5
+ <el-button @click="getSize">获取pageSize</el-button>
6
+ <p>{{ filtersValue }}</p>
7
+ <div>
8
+ <MTable
9
+ :data="tableData"
10
+ :filtersValue="filtersValue"
11
+ @headerDragend="headerDragend"
12
+ >
13
+ <MTableColumn
14
+ v-for="item in tableTitle"
15
+ :key="item.prop"
16
+ :prop="item.prop"
17
+ :label="item.label"
18
+ :minWidth="item.minWidth"
19
+ :filters="item.filters"
20
+ :headerAlign="item.headerAlign"
21
+ v-model:filtersValue="filtersValue"
22
+ showOverflowTooltip
23
+ >
24
+ <template
25
+ #default="scope"
26
+ v-if="['tag'].includes(item.prop)"
27
+ >
28
+ <el-tag
29
+ v-if="item.prop === 'tag'"
30
+ v-for="item in scope.row.tag"
31
+ type="primary"
32
+ >
33
+ {{ item }}
34
+ </el-tag>
35
+ </template>
36
+ </MTableColumn>
37
+ </MTable>
38
+ </div>
39
+ </div>
40
+ </template>
41
+
42
+ <script setup lang="ts">
43
+ import { ref } from 'vue'
44
+ import moneyFormat from '../../Tool/moneyFormat/moneyFormat'
45
+ import useTableConfig from 'packages/Hook/useTableConfig/useTableConfig'
46
+
47
+ const tableData = ref<any[]>([])
48
+ // const tableData = ref<any[]>([
49
+ // {
50
+ // date: '2016-05-03',
51
+ // name: 'Tom1',
52
+ // // address: 'No. 189, Grove St, Los Angeles',
53
+ // tag: ['Home1', 'Home2']
54
+ // },
55
+ // {
56
+ // date: '2016-05-02',
57
+ // name: 'Tom2',
58
+ // // address: 'No. 189, Grove St, Los Angeles',
59
+ // tag: ['Office']
60
+ // },
61
+ // {
62
+ // date: '2016-05-04',
63
+ // name: 'Tom3',
64
+ // // address: 'No. 189, Grove St, Los Angeles',
65
+ // tag: ['Home']
66
+ // },
67
+ // {
68
+ // date: '2016-05-01',
69
+ // name: 'Tom4',
70
+ // // address: 'No. 189, Grove St, Los Angeles',
71
+ // tag: ['Office']
72
+ // }
73
+ // ])
74
+
75
+ const { tableTitle, headerDragend, filtersValue, page } = useTableConfig(
76
+ 'testTableSize',
77
+ [{
78
+ label: '名称',
79
+ prop: 'name',
80
+ minWidth: '208px'
81
+ }, {
82
+ label: '单据日期',
83
+ prop: 'date',
84
+ minWidth: '110px'
85
+ }, {
86
+ label: '标签',
87
+ prop: 'tag',
88
+ minWidth: '110px'
89
+ }],
90
+ tableData
91
+ )
92
+ setTimeout(() => {
93
+ tableData.value = [
94
+ {
95
+ date: '2016-05-03',
96
+ name: 'Tom1',
97
+ // address: 'No. 189, Grove St, Los Angeles',
98
+ tag: ['Home1', 'Home2']
99
+ },
100
+ {
101
+ date: '2016-05-03',
102
+ name: 'Tom2',
103
+ // address: 'No. 189, Grove St, Los Angeles',
104
+ tag: ['Office']
105
+ },
106
+ {
107
+ date: '2016-05-04',
108
+ name: 'Tom3',
109
+ // address: 'No. 189, Grove St, Los Angeles',
110
+ tag: ['Home']
111
+ },
112
+ {
113
+ date: '2016-05-01',
114
+ name: 'Tom4',
115
+ // address: 'No. 189, Grove St, Los Angeles',
116
+ tag: ['Office']
117
+ }
118
+ ]
119
+ })
120
+ const getSize = () => {
121
+ console.log(moneyFormat(0.05, false, 10, { repairZero: 6 }))
122
+ // console.log(page.value.pageSize)
123
+ }
124
+
125
+ const test = (data: any) => {
126
+ console.log('data', data.name)
127
+ }
128
+ </script>
129
+
130
+ <style scoped lang="scss">
131
+ .u-p {
132
+ color: #c600fd;
133
+ }
134
+ </style>
@@ -0,0 +1,173 @@
1
+ import { ref, watch, computed } from 'vue'
2
+ import type { Ref } from 'vue'
3
+ import { Page } from '../../typings/class'
4
+ import usePackageConfig from './../../../packages/Hook/usePackageConfig/usePackageConfig'
5
+
6
+ const packageConfig = usePackageConfig()
7
+
8
+ /** 表格列配置(单个) */
9
+ export interface TableConfigItem {
10
+ /** 最小列宽 */
11
+ minWidth: number | string,
12
+ /** 是否显示 */
13
+ show: boolean,
14
+ /** 排序 */
15
+ sort: number,
16
+ /** 列名 */
17
+ label: string,
18
+ /** 表头对齐方式, 若不设置该项,则使用表格的对齐方式 */
19
+ headerAlign: 'left' | 'center' | 'right',
20
+ /** 对齐方式 */
21
+ align: 'left' | 'center' | 'right',
22
+ /** 列是否固定在左侧或者右侧。 true 表示固定在左侧 */
23
+ fixed: 'left' | 'right' | boolean,
24
+ }
25
+
26
+ /** 表格配置 */
27
+ export interface TableConfig {
28
+ [propName: string]: TableConfigItem
29
+ }
30
+
31
+ interface Column {
32
+ property: string
33
+ }
34
+
35
+ export interface FilterValue {
36
+ [key: string]: Array<string | number>
37
+ }
38
+
39
+ interface UseTableConfigReturn {
40
+ tableTitle: Ref<TableTitle[]>,
41
+ tableConfig: Ref<TableConfig>,
42
+ headerDragend: (newWidth: number, oldWidth: number, column: any) => void,
43
+ /** 初始化列筛选 */
44
+ initColumnFilter: (tableData: any[]) => void,
45
+ /** 过滤条件 */
46
+ filtersValue: Ref<FilterValue>,
47
+ /** 分页 */
48
+ page: Ref<Page>
49
+ }
50
+
51
+ // interface Config {
52
+ // /** 过滤选项数组拆分模式(待实现) */
53
+ // filterArrSplitMode?: boolean
54
+ // }
55
+
56
+ /**
57
+ * 表格配置
58
+ * @param {string} name 表格唯一标识
59
+ * @param {TableTitle} tableTitle 列配置
60
+ * @param {Ref<any[]>} tableData 表格数据
61
+ // * @param {Config} config 表格数据
62
+ * */
63
+ const useTableConfig = (name: string = '', tableTitle: TableTitle[] = [], tableData: Ref<any[]> | null = null): UseTableConfigReturn => {
64
+ /** 表格列头 */
65
+ const _tableTitle: Ref<TableTitle[]> = ref<TableTitle[]>([])
66
+ const tableConfig: Ref<TableConfig> = ref<TableConfig>(packageConfig.get('tableConfig' + name))
67
+ const pageConfig = packageConfig.get('tablePage' + name)
68
+ const page = ref<Page>(new Page(pageConfig))
69
+ const _tableData = tableData || ref<any[]>([])
70
+ /** 列筛选 */
71
+ const filterMethod = (value: string, row: any, column: Column) => row[column.property] === value
72
+
73
+ /** 过滤条件 */
74
+ const filtersValue = ref<FilterValue>({})
75
+
76
+ tableTitle.forEach((item, index) => {
77
+ if (!tableConfig.value[item.prop]) {
78
+ tableConfig.value[item.prop] = {
79
+ minWidth: '',
80
+ show: true,
81
+ sort: index,
82
+ label: item.label,
83
+ headerAlign: 'left',
84
+ align: 'left',
85
+ fixed: false
86
+ }
87
+ }
88
+ tableConfig.value[item.prop].label = item.label
89
+ })
90
+ const syncTableTitle = () => {
91
+ _tableTitle.value = tableTitle.map(item => {
92
+ return {
93
+ ...item,
94
+ minWidth: tableConfig.value[item.prop]?.minWidth ? tableConfig.value[item.prop]?.minWidth : item.minWidth,
95
+ headerAlign: tableConfig.value[item.prop]?.headerAlign ? tableConfig.value[item.prop]?.headerAlign : item.headerAlign || 'left',
96
+ filterMethod,
97
+ filters: item.filters || _tableTitle.value.find(node => node.prop === item.prop)?.filters || [],
98
+ align: tableConfig.value[item.prop]?.align ? tableConfig.value[item.prop]?.align : item.align,
99
+ fixed: tableConfig.value[item.prop]?.fixed ? tableConfig.value[item.prop]?.fixed : item.fixed
100
+ }
101
+ })
102
+ }
103
+
104
+ syncTableTitle()
105
+
106
+ /** 保存拖拽后的列宽度信息 */
107
+ const headerDragend = (newWidth: number, oldWidth: number, column: any): void => {
108
+ tableConfig.value[column.property].minWidth = newWidth
109
+ }
110
+
111
+ watch(
112
+ () => tableConfig.value,
113
+ () => {
114
+ syncTableTitle()
115
+ packageConfig.set('tableConfig' + name, tableConfig.value)
116
+ },
117
+ { deep: true }
118
+ )
119
+
120
+ watch(
121
+ () => page.value.pageSize,
122
+ (item) => {
123
+ packageConfig.set('tablePage' + name, { pageSize: item })
124
+ },
125
+ { deep: true }
126
+ )
127
+
128
+ /** 初始化列筛选 */
129
+ const initColumnFilter = (tableData: any[]): void => {
130
+ _tableTitle.value = _tableTitle.value.map(item => {
131
+ const data = tableData.map(node => node[item.prop]).map(node => JSON.stringify(node))
132
+ // const isAllArray = !tableData.some(node => !checkType.isArray(node[item.prop]))
133
+ // let array: any[] = tableData.map(node => node[item.prop])
134
+ // if (config.filterArrSplitMode && isAllArray) {
135
+ // array = []
136
+ // data.forEach(node => {
137
+ // array.push(...node)
138
+ // })
139
+ // }
140
+ // array = array.map(node => JSON.stringify(node))
141
+ // 去重
142
+ const filters = [...new Set(data)].filter(node => node !== undefined).map(node => ({
143
+ text: JSON.parse(node),
144
+ value: JSON.parse(node)
145
+ }))
146
+
147
+ return {
148
+ ...item,
149
+ filters,
150
+ filterMethod
151
+ }
152
+ })
153
+ }
154
+
155
+ watch(
156
+ () => _tableData.value,
157
+ () => initColumnFilter(_tableData.value)
158
+ )
159
+
160
+ const tableTitleFilter = computed(() => _tableTitle.value
161
+ .filter(item => tableConfig.value[item.prop].show)
162
+ .sort((a, b) => (tableConfig.value[a.prop]?.sort || 0) - (tableConfig.value[b.prop]?.sort || 0)))
163
+
164
+ return {
165
+ tableTitle: tableTitleFilter,
166
+ tableConfig,
167
+ headerDragend,
168
+ initColumnFilter,
169
+ filtersValue,
170
+ page
171
+ }
172
+ }
173
+ export default useTableConfig
@@ -0,0 +1,6 @@
1
+ 全局层级 hook
2
+ =================
3
+
4
+
5
+
6
+