br-dionysus 1.6.7 → 1.6.8
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.
- package/dist/br-dionysus.es.js +1291 -1286
- package/dist/br-dionysus.umd.js +7 -7
- package/dist/index.css +1 -1
- package/package.json +1 -1
- package/packages/MInline/src/MInline.vue +11 -10
- package/web-types.json +1 -1
- package/docs/assets/README-BIIm2ID5.css +0 -1
- package/docs/assets/README-BVC502ud.js +0 -1
- package/docs/assets/README-BaVHXTcr.js +0 -1
- package/docs/assets/README-BkoXPzeT.js +0 -1
- package/docs/assets/README-BpY9wwJ5.js +0 -1
- package/docs/assets/README-BxVIiLkB.css +0 -1
- package/docs/assets/README-C8q4oePg.css +0 -1
- package/docs/assets/README-C9E9QEak.js +0 -1
- package/docs/assets/README-CJnIKztR.css +0 -1
- package/docs/assets/README-CPi9K5cm.css +0 -1
- package/docs/assets/README-CVikrcuu.js +0 -1
- package/docs/assets/README-CwxKEz5n.js +0 -1
- package/docs/assets/README-D-sCcuuV.js +0 -1
- package/docs/assets/README-D1NyMPDh.css +0 -1
- package/docs/assets/README-D8dRnWkj.css +0 -1
- package/docs/assets/README-DC5fWcO7.css +0 -1
- package/docs/assets/README-DFookNbq.js +0 -1
- package/docs/assets/README-DJM0QNOa.css +0 -1
- package/docs/assets/README-DJsWJjpr.js +0 -2
- package/docs/assets/README-DZH0ZBFE.js +0 -1
- package/docs/assets/README-DuLXE9ma.css +0 -1
- package/docs/assets/README-DxdjMTiZ.js +0 -1
- package/docs/assets/README-DxzXrur_.js +0 -1
- package/docs/assets/README-ZSEyYWl3.css +0 -1
- package/docs/assets/empty-BHv0FmNK.png +0 -0
- package/docs/assets/index-B3d27dSP.js +0 -66
- package/docs/assets/index-BeGJML3j.css +0 -1
- package/docs/index.html +0 -14
- package/docs/packages/Hook/usePackageConfig/README.md +0 -35
- package/docs/packages/Hook/usePackageConfig/demo.vue +0 -28
- package/docs/packages/Hook/usePackageConfig/usePackageConfig.ts +0 -39
- package/docs/packages/Hook/useRemainingSpace/README.md +0 -26
- package/docs/packages/Hook/useRemainingSpace/useRemainingSpace.ts +0 -148
- package/docs/packages/Hook/useTableConfig/README.md +0 -50
- package/docs/packages/Hook/useTableConfig/demo.vue +0 -134
- package/docs/packages/Hook/useTableConfig/useTableConfig.ts +0 -173
- package/docs/packages/Hook/useZIndex/README.md +0 -6
- package/docs/packages/Hook/useZIndex/useGlobalZIndex.ts +0 -34
- package/docs/packages/MDialog/docs/README.md +0 -26
- package/docs/packages/MDialog/docs/demo.vue +0 -72
- package/docs/packages/MDialog/index.ts +0 -10
- package/docs/packages/MDialog/src/MDialog.vue +0 -150
- package/docs/packages/MInline/docs/README.md +0 -26
- package/docs/packages/MInline/docs/demo.vue +0 -138
- package/docs/packages/MInline/index.ts +0 -10
- package/docs/packages/MInline/src/MInline.vue +0 -284
- package/docs/packages/MInputNumber/docs/README.md +0 -35
- package/docs/packages/MInputNumber/docs/demo.vue +0 -17
- package/docs/packages/MInputNumber/index.ts +0 -10
- package/docs/packages/MInputNumber/src/MInputNumber.vue +0 -268
- package/docs/packages/MSelect/docs/README.md +0 -20
- package/docs/packages/MSelect/docs/demo.vue +0 -36
- package/docs/packages/MSelect/index.ts +0 -17
- package/docs/packages/MSelect/src/MOption.vue +0 -43
- package/docs/packages/MSelect/src/MSelect.vue +0 -57
- package/docs/packages/MSelect/src/token.ts +0 -8
- package/docs/packages/MSelectTable/docs/README.md +0 -88
- package/docs/packages/MSelectTable/docs/demo.vue +0 -196
- package/docs/packages/MSelectTable/index.ts +0 -10
- package/docs/packages/MSelectTable/src/MSelectTable.vue +0 -493
- package/docs/packages/MSelectTableV1/docs/README.md +0 -49
- package/docs/packages/MSelectTableV1/docs/demo.vue +0 -77
- package/docs/packages/MSelectTableV1/index.ts +0 -10
- package/docs/packages/MSelectTableV1/src/MSelectTableV1.vue +0 -460
- package/docs/packages/MSelectV2/docs/README.md +0 -31
- package/docs/packages/MSelectV2/docs/demo.vue +0 -36
- package/docs/packages/MSelectV2/index.ts +0 -10
- package/docs/packages/MSelectV2/src/MSelectV2.vue +0 -116
- package/docs/packages/MTable/docs/README.md +0 -40
- package/docs/packages/MTable/docs/demo.vue +0 -93
- package/docs/packages/MTable/index.ts +0 -10
- package/docs/packages/MTable/src/MTable.vue +0 -228
- package/docs/packages/MTable/src/token.ts +0 -9
- package/docs/packages/MTableColumn/docs/README.md +0 -22
- package/docs/packages/MTableColumn/docs/demo.vue +0 -110
- package/docs/packages/MTableColumn/index.ts +0 -10
- package/docs/packages/MTableColumn/src/MTableColumn.vue +0 -345
- package/docs/packages/MTableColumnSet/docs/README.md +0 -31
- package/docs/packages/MTableColumnSet/docs/demo.vue +0 -36
- package/docs/packages/MTableColumnSet/index.ts +0 -10
- package/docs/packages/MTableColumnSet/src/MTableColumnSet.vue +0 -310
- package/docs/packages/README.md +0 -10
- package/docs/packages/SkinConfig/docs/README.md +0 -42
- package/docs/packages/SkinConfig/docs/demo.vue +0 -680
- package/docs/packages/SkinConfig/index.ts +0 -10
- package/docs/packages/SkinConfig/src/SkinConfig.vue +0 -478
- package/docs/packages/SkinConfig/src/useSkin.ts +0 -230
- package/docs/packages/TabPage/docs/README.md +0 -10
- package/docs/packages/TabPage/docs/demo.vue +0 -96
- package/docs/packages/TabPage/index.ts +0 -10
- package/docs/packages/TabPage/src/TabPage.vue +0 -566
- package/docs/packages/Tool/moneyFormat/README.md +0 -15
- package/docs/packages/Tool/moneyFormat/moneyFormat.ts +0 -69
- package/docs/packages/index.ts +0 -61
- package/docs/packages/list.json +0 -80
- package/docs/packages/typings/class.ts +0 -22
- package/docs/packages/typings/enum.ts +0 -9
- package/docs/packages/typings/global.d.ts +0 -69
- package/docs/packages/typings/interface.ts +0 -6
package/docs/index.html
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
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>
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,28 +0,0 @@
|
|
|
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>
|
|
@@ -1,39 +0,0 @@
|
|
|
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
|
|
@@ -1,26 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,148 +0,0 @@
|
|
|
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
|
|
@@ -1,50 +0,0 @@
|
|
|
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
|
-
|
|
@@ -1,134 +0,0 @@
|
|
|
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>
|
|
@@ -1,173 +0,0 @@
|
|
|
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
|