@koi-design/uxd-ui 14.0.43 → 14.0.45
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/README.md +194 -0
- package/es/components/Anchor/Anchor.mjs +4 -4
- package/es/components/Anchor/Anchor.mjs.map +1 -1
- package/es/components/Anchor/AnchorLink.mjs +1 -1
- package/es/components/Anchor/AnchorLink.mjs.map +1 -1
- package/es/components/Table/BaseTable.mjs +0 -1
- package/es/components/Table/BaseTable.mjs.map +1 -1
- package/es/components/Table/hooks/useDraggable.mjs +37 -6
- package/es/components/Table/hooks/useDraggable.mjs.map +1 -1
- package/es/components/Table/tableUnits/DraggableIcon.mjs +17 -3
- package/es/components/Table/tableUnits/DraggableIcon.mjs.map +1 -1
- package/es/components/Table/tableUnits/DraggableIcon.vue.d.ts +1 -0
- package/lib/components/Anchor/Anchor.js +4 -4
- package/lib/components/Anchor/Anchor.js.map +1 -1
- package/lib/components/Anchor/AnchorLink.js +1 -1
- package/lib/components/Anchor/AnchorLink.js.map +1 -1
- package/lib/components/Table/BaseTable.js +0 -1
- package/lib/components/Table/BaseTable.js.map +1 -1
- package/lib/components/Table/hooks/useDraggable.js +37 -6
- package/lib/components/Table/hooks/useDraggable.js.map +1 -1
- package/lib/components/Table/tableUnits/DraggableIcon.js +17 -3
- package/lib/components/Table/tableUnits/DraggableIcon.js.map +1 -1
- package/lib/components/Table/tableUnits/DraggableIcon.vue.d.ts +1 -0
- package/package.json +2 -2
- package/styles/components/alert/index.css +1 -1
- package/styles/components/anchor/index.css +1 -1
- package/styles/components/anchor/index.less +55 -54
- package/styles/components/autoComplete/index.css +1 -1
- package/styles/components/avatar/index.css +1 -1
- package/styles/components/backTop/index.css +1 -1
- package/styles/components/backTop/var.less +1 -1
- package/styles/components/button/index.css +1 -1
- package/styles/components/carousel/index.css +1 -1
- package/styles/components/cascader/index.css +1 -1
- package/styles/components/datePicker/index.css +1 -1
- package/styles/components/form/index.css +1 -1
- package/styles/components/icon/index.css +1 -1
- package/styles/components/input/index.css +1 -1
- package/styles/components/inputNumber/index.css +1 -1
- package/styles/components/link/index.css +1 -1
- package/styles/components/mentions/index.css +1 -1
- package/styles/components/modal/index.css +1 -1
- package/styles/components/modal/modal.less +1 -1
- package/styles/components/progress/index.css +1 -1
- package/styles/components/progress/var.less +1 -1
- package/styles/components/result/index.css +1 -1
- package/styles/components/result/var.less +3 -3
- package/styles/components/select/index.css +1 -1
- package/styles/components/spin/index.css +1 -1
- package/styles/components/timePicker/index.css +1 -1
- package/styles/cssVariable.css +1 -1
- package/styles/cssVariable.less +4 -1
- package/styles/index.css +1 -1
- package/types/components/Table/tableUnits/DraggableIcon.vue.d.ts +1 -0
- package/uxd-ui.css +1 -1
- package/uxd-ui.esm.min.mjs +6 -6
- package/uxd-ui.esm.mjs +60 -16
- package/uxd-ui.umd.js +60 -16
- package/uxd-ui.umd.min.js +6 -6
package/README.md
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# UXD-UI
|
|
2
|
+
|
|
3
|
+
[English](./README-en.md) | 简体中文
|
|
4
|
+
|
|
5
|
+
一个基于 Vue 3 的现代化 UI 组件库。
|
|
6
|
+
|
|
7
|
+
## ✨ 特性
|
|
8
|
+
|
|
9
|
+
- 🎨 **现代化设计** - 精心设计的组件外观,提供多种主题色和风格
|
|
10
|
+
- 🚀 **Vue 3 + TypeScript** - 完整的 TypeScript 类型支持
|
|
11
|
+
- 📦 **按需加载** - 支持 Tree Shaking,减小打包体积
|
|
12
|
+
- 🎯 **易于使用** - 简洁直观的 API 设计
|
|
13
|
+
- 🌈 **主题定制** - 灵活的 CSS 变量系统,轻松定制主题
|
|
14
|
+
- 📱 **响应式设计** - 完美适配各种屏幕尺寸
|
|
15
|
+
- 🌍 **国际化** - 内置中英文支持,可扩展至其他语言
|
|
16
|
+
|
|
17
|
+
## 📦 安装
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @koi-design/uxd-ui
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
或使用 yarn / pnpm:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
yarn add @koi-design/uxd-ui
|
|
27
|
+
pnpm add @koi-design/uxd-ui
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 🔨 使用
|
|
31
|
+
|
|
32
|
+
### 完整引入
|
|
33
|
+
|
|
34
|
+
```javascript
|
|
35
|
+
import { createApp } from 'vue';
|
|
36
|
+
import UxdUI from '@koi-design/uxd-ui';
|
|
37
|
+
import '@koi-design/uxd-ui/dist/index.css';
|
|
38
|
+
import App from './App.vue';
|
|
39
|
+
|
|
40
|
+
const app = createApp(App);
|
|
41
|
+
app.use(UxdUI);
|
|
42
|
+
app.mount('#app');
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 按需引入
|
|
46
|
+
|
|
47
|
+
```vue
|
|
48
|
+
<template>
|
|
49
|
+
<UButton type="primary">按钮</UButton>
|
|
50
|
+
<UInput v-model="value" placeholder="请输入" />
|
|
51
|
+
</template>
|
|
52
|
+
|
|
53
|
+
<script setup>
|
|
54
|
+
import { ref } from 'vue';
|
|
55
|
+
import { UButton, UInput } from '@koi-design/uxd-ui';
|
|
56
|
+
import '@koi-design/uxd-ui/dist/index.css';
|
|
57
|
+
|
|
58
|
+
const value = ref('');
|
|
59
|
+
</script>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 📚 文档
|
|
63
|
+
|
|
64
|
+
### 在线文档
|
|
65
|
+
|
|
66
|
+
- [中文文档](https://your-site.com/zh)
|
|
67
|
+
- [English Documentation](https://your-site.com/en)
|
|
68
|
+
|
|
69
|
+
### 本地文档
|
|
70
|
+
|
|
71
|
+
本仓库包含完整的组件文档:
|
|
72
|
+
|
|
73
|
+
- **中文文档**: [component-docs-zh/README.md](./component-docs-zh/README.md)
|
|
74
|
+
- **English Docs**: [component-docs-en/README.md](./component-docs-en/README.md)
|
|
75
|
+
|
|
76
|
+
### 组件列表
|
|
77
|
+
|
|
78
|
+
#### 基础组件
|
|
79
|
+
Button, Icon, Link, Text
|
|
80
|
+
|
|
81
|
+
#### 布局组件
|
|
82
|
+
Grid, Layout, Space, Divider
|
|
83
|
+
|
|
84
|
+
#### 导航组件
|
|
85
|
+
Affix, Anchor, BackTop, Breadcrumb, Dropdown, Menu, PageHeader, Pagination, Steps, Tabs, TabNav
|
|
86
|
+
|
|
87
|
+
#### 数据录入组件
|
|
88
|
+
AutoComplete, Cascader, Checkbox, ColorPicker, DatePicker, Form, Input, InputNumber, Mention, Radio, Rate, Select, Slider, Switch, TimePicker, Transfer, TreeSelect, Upload
|
|
89
|
+
|
|
90
|
+
#### 数据展示组件
|
|
91
|
+
Avatar, Badge, Calendar, Card, Carousel, Collapse, Comment, Empty, Image, InfoView, List, Popover, Scrollbar, Statistic, Table, Tag, Timeline, Tooltip, Tree
|
|
92
|
+
|
|
93
|
+
#### 反馈组件
|
|
94
|
+
Alert, Drawer, LoadingBar, Message, Modal, Notice, Notification, PopConfirm, Progress, Result, Skeleton, Spin
|
|
95
|
+
|
|
96
|
+
#### 其他组件
|
|
97
|
+
ConfigProvider, InfiniteScroll, Mask
|
|
98
|
+
|
|
99
|
+
## 🎨 主题定制
|
|
100
|
+
|
|
101
|
+
UXD-UI 支持通过 CSS 变量进行主题定制:
|
|
102
|
+
|
|
103
|
+
```css
|
|
104
|
+
:root {
|
|
105
|
+
--u-primary-color: #1890ff;
|
|
106
|
+
--u-success-color: #52c41a;
|
|
107
|
+
--u-warning-color: #faad14;
|
|
108
|
+
--u-danger-color: #ff4d4f;
|
|
109
|
+
|
|
110
|
+
--u-font-size-base: 14px;
|
|
111
|
+
--u-border-radius-base: 4px;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## 🌍 国际化
|
|
116
|
+
|
|
117
|
+
```vue
|
|
118
|
+
<template>
|
|
119
|
+
<UConfigProvider :locale="locale">
|
|
120
|
+
<App />
|
|
121
|
+
</UConfigProvider>
|
|
122
|
+
</template>
|
|
123
|
+
|
|
124
|
+
<script setup>
|
|
125
|
+
import { UConfigProvider } from '@koi-design/uxd-ui';
|
|
126
|
+
import zhCN from '@koi-design/uxd-ui/lang/zh-cn';
|
|
127
|
+
import enUS from '@koi-design/uxd-ui/lang/en-us';
|
|
128
|
+
|
|
129
|
+
const locale = zhCN; // 或 enUS
|
|
130
|
+
</script>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## 🔧 开发
|
|
134
|
+
|
|
135
|
+
### 环境要求
|
|
136
|
+
|
|
137
|
+
- Node.js >= 16
|
|
138
|
+
- pnpm >= 8
|
|
139
|
+
|
|
140
|
+
### 本地开发
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# 克隆仓库
|
|
144
|
+
git clone http://git.100credit.cn/fe/public/uxd/uxd-ui.git
|
|
145
|
+
|
|
146
|
+
# 安装依赖
|
|
147
|
+
pnpm install
|
|
148
|
+
|
|
149
|
+
# 启动开发服务器
|
|
150
|
+
pnpm dev
|
|
151
|
+
|
|
152
|
+
# 构建文档
|
|
153
|
+
pnpm docs:build
|
|
154
|
+
|
|
155
|
+
# 构建组件库
|
|
156
|
+
pnpm build
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 生成文档
|
|
160
|
+
|
|
161
|
+
本项目提供了文档生成工具:
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
# 生成中英文文档
|
|
165
|
+
node generate-docs-bilingual.js
|
|
166
|
+
|
|
167
|
+
# 生成中文文档(使用原始脚本)
|
|
168
|
+
node generate-docs-enhanced.js
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## 🤝 贡献
|
|
172
|
+
|
|
173
|
+
我们欢迎所有形式的贡献!
|
|
174
|
+
|
|
175
|
+
在提交 Pull Request 之前,请确保:
|
|
176
|
+
|
|
177
|
+
1. 代码符合项目的编码规范
|
|
178
|
+
2. 添加了必要的测试用例
|
|
179
|
+
3. 更新了相关文档
|
|
180
|
+
4. 所有测试都通过
|
|
181
|
+
|
|
182
|
+
详见 [贡献指南](./CONTRIBUTING.md)
|
|
183
|
+
|
|
184
|
+
## 📄 许可证
|
|
185
|
+
|
|
186
|
+
[MIT License](./LICENSE)
|
|
187
|
+
|
|
188
|
+
## 🙏 致谢
|
|
189
|
+
|
|
190
|
+
感谢所有为这个项目做出贡献的开发者!
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
**Made with ❤️ by UXD-UI Team**
|
|
@@ -213,17 +213,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
213
213
|
}, {
|
|
214
214
|
default: withCtx(() => [
|
|
215
215
|
createElementVNode("div", {
|
|
216
|
-
class: normalizeClass(`${_ctx.containerClass} ${_ctx.prefixCls}
|
|
216
|
+
class: normalizeClass(`${_ctx.containerClass} ${_ctx.prefixCls}`),
|
|
217
217
|
style: normalizeStyle(_ctx.wrapperStyle)
|
|
218
218
|
}, [
|
|
219
219
|
createElementVNode("div", {
|
|
220
|
-
class: normalizeClass(`${_ctx.prefixCls}`)
|
|
220
|
+
class: normalizeClass(`${_ctx.prefixCls}-inner`)
|
|
221
221
|
}, [
|
|
222
222
|
createElementVNode("div", {
|
|
223
|
-
class: normalizeClass(`${_ctx.prefixCls}-ink`)
|
|
223
|
+
class: normalizeClass(`${_ctx.prefixCls}-inner-ink`)
|
|
224
224
|
}, [
|
|
225
225
|
withDirectives(createElementVNode("span", {
|
|
226
|
-
class: normalizeClass(`${_ctx.prefixCls}-ink-ball`),
|
|
226
|
+
class: normalizeClass(`${_ctx.prefixCls}-inner-ink-ball`),
|
|
227
227
|
style: normalizeStyle({ top: `${_ctx.inkTop}px` })
|
|
228
228
|
}, null, 6), [
|
|
229
229
|
[vShow, _ctx.showInk]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Anchor.mjs","sources":["../../../../src/components/Anchor/Anchor.vue"],"sourcesContent":["<template>\n <component :is=\"wrapperComponent\" :container=\"container\" :offset-top=\"offsetTop\" :offset-bottom=\"offsetBottom\" @on-change=\"handleAffixStateChange\">\n <div :class=\"`${containerClass} ${prefixCls}-wrapper`\" :style=\"wrapperStyle\">\n <div :class=\"`${prefixCls}`\">\n <div :class=\"`${prefixCls}-ink`\">\n <span v-show=\"showInk\" :class=\"`${prefixCls}-ink-ball`\" :style=\"{ top: `${inkTop}px` }\" />\n </div>\n <slot />\n </div>\n </div>\n </component>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, nextTick, onBeforeUnmount, onMounted, provide, ref, toRefs, watch } from 'vue';\n\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport { addEventListener, scrollTop } from '../../utils/dom';\nimport type { addEventListenerReturn } from '../../utils/dom';\nimport { anchorProps, anchorEmits } from './Anchor.type';\nimport type { LinkOffset } from './Anchor.type';\n\nexport default defineComponent({\n name: 'UAnchor',\n props: anchorProps,\n emits: anchorEmits,\n setup(props, { emit }) {\n const { scrollOffset } = toRefs(props);\n const { prefixCls } = useGlobalConfig('anchor');\n const isAffixed = ref(false);\n const inkTop = ref(0);\n const currentLink = ref('');\n let currentId = ''; // current show title id => #href -> currentId = href\n let titlesOffsetArr: LinkOffset[] = [];\n const links: string[] = [];\n let wrapperTop = 0;\n let scrollElement: HTMLElement | null = null;\n let hashChangeEvent: addEventListenerReturn | null = null;\n let scrollEvent: addEventListenerReturn | null = null;\n let animating = false;\n\n const wrapperComponent = computed(() => {\n return props.affix ? 'UAffix' : 'div';\n });\n\n const wrapperStyle = computed(() => {\n let offset = '100vh';\n if (props.offsetBottom || props.offsetBottom === 0) {\n offset = `calc(100vh - ${props.offsetBottom}px)`;\n } else if (props.offsetTop || props.offsetTop === 0) {\n offset = `calc(100vh - ${props.offsetTop}px)`;\n }\n return {\n maxHeight: offset,\n ...props.containerStyle\n };\n });\n\n watch(currentLink, (nv, ov) => {\n emit('change', nv, ov);\n });\n\n const handleAffixStateChange = (state: boolean) => {\n isAffixed.value = props.affix && state;\n };\n\n const handleSetInkTop = () => {\n const currentLinkElementA = document.querySelector<HTMLElement>(`a[data-href=\"${currentLink.value}\"]`);\n if (!currentLinkElementA) return;\n const elementATop = currentLinkElementA.offsetTop;\n inkTop.value = elementATop < 0 ? props.offsetTop : elementATop;\n };\n\n const handleScrollTo = () => {\n const anchor = document.getElementById(currentId);\n const currentLinkElementA = document.querySelector(`a[data-href=\"${currentLink.value}\"]`);\n let offset = props.scrollOffset;\n if (currentLinkElementA) {\n offset = parseFloat(currentLinkElementA.getAttribute('data-scroll-offset')?.toString() || '0');\n }\n if (!anchor) return;\n const offsetTop = anchor.offsetTop - wrapperTop - offset;\n animating = true;\n if (scrollElement) {\n scrollTop(scrollElement, offsetTop, props.duration, () => {\n animating = false;\n });\n }\n\n handleSetInkTop();\n };\n\n const updateTitleOffset = () => {\n const offsetArr: LinkOffset[] = [];\n links.forEach((link) => {\n const titleEle = document.getElementById(link.split('#')[1]);\n if (titleEle)\n offsetArr.push({\n link,\n offset: titleEle.offsetTop - (scrollElement?.offsetTop || 0)\n });\n });\n titlesOffsetArr = offsetArr;\n };\n\n const getCurrentScrollAtTitleId = (top: number) => {\n let _scrollTop = top;\n let i = 0;\n const len = titlesOffsetArr.length;\n let titleItem = {\n link: '#',\n offset: 0\n };\n _scrollTop += props.bounds;\n while (i < len) {\n const currentEle = titlesOffsetArr[i];\n const nextEle = titlesOffsetArr[i + 1];\n if (_scrollTop >= currentEle.offset && _scrollTop < ((nextEle && nextEle.offset) || Infinity)) {\n titleItem = titlesOffsetArr[i];\n break;\n }\n i += 1;\n }\n currentLink.value = titleItem.link;\n handleSetInkTop();\n };\n\n const handleScroll = (e: any) => {\n if (animating) return;\n updateTitleOffset();\n\n const _scrollTop = document.documentElement.scrollTop || document.body.scrollTop || e.target.scrollTop;\n getCurrentScrollAtTitleId(_scrollTop);\n };\n\n const handleHashChange = (toHash?: Record<string, any> | string) => {\n const url = typeof toHash === 'object' ? toHash.newURL : toHash || currentLink.value; // window.location.href;\n const sharpMatcherRegx = /#([^#]+)$/;\n const sharpLinkMatch = sharpMatcherRegx.exec(url);\n if (!sharpLinkMatch) return;\n currentLink.value = sharpLinkMatch[0];\n currentId = sharpLinkMatch[1];\n\n nextTick(() => {\n handleScrollTo();\n });\n };\n\n const removeListener = () => {\n hashChangeEvent && hashChangeEvent.remove();\n scrollEvent && scrollEvent.remove();\n };\n\n const setCurrentLink = (link: string) => {\n if (link) {\n handleHashChange(link);\n // handleScrollTo();\n // if (props.showHash && route) {\n // // ctx.$router.push(href.value, () => {});\n // route.push(currentLink.value, () => {});\n // } else if(props.showHash) {\n // window.location.href = currentLink.value;\n // }\n if (props.showHash) {\n const sharpMatcherRegx = /#([^#]+)$/;\n const sharpLinkMatch = sharpMatcherRegx.exec(window.location.hash);\n if (sharpLinkMatch && sharpLinkMatch.length > 0) {\n if (!links.includes(sharpLinkMatch[0] || '')) {\n window.location.hash += currentLink.value;\n } else {\n window.location.hash = window.location.hash.replace(sharpLinkMatch[0], currentLink.value);\n }\n }\n }\n }\n };\n\n const registerLink = (link: string) => {\n if (!links.includes(link)) {\n links.push(link);\n }\n };\n\n const unregisterLink = (link: string) => {\n const index = links.indexOf(link);\n if (index !== -1) {\n links.splice(index, 1);\n }\n };\n\n const init = () => {\n handleHashChange();\n nextTick(() => {\n removeListener();\n wrapperTop = 0;\n if (props.container) {\n scrollElement = typeof props.container === 'string' ? document.querySelector<HTMLElement>(props.container) : props.container();\n\n if (scrollElement instanceof HTMLElement) {\n wrapperTop = scrollElement.offsetTop;\n }\n } else {\n scrollElement = document.documentElement || document.body;\n }\n handleScrollTo();\n handleSetInkTop();\n updateTitleOffset();\n scrollEvent = addEventListener(scrollElement || window, 'scroll', handleScroll);\n hashChangeEvent = addEventListener(window, 'hashchange', (e: Event) => {\n handleHashChange(e as Record<string, any>);\n });\n });\n };\n\n watch(\n () => props.container,\n () => {\n init();\n }\n );\n\n provide('anchorContext', {\n scrollOffset,\n registerLink,\n unregisterLink,\n setCurrentLink,\n currentLink\n });\n\n onMounted(() => {\n nextTick(() => {\n init();\n });\n });\n\n // beforeDestroy\n onBeforeUnmount(() => {\n removeListener();\n });\n\n return {\n prefixCls,\n wrapperComponent,\n handleAffixStateChange,\n wrapperStyle,\n inkTop\n };\n }\n});\n</script>\n"],"names":["_createBlock","_resolveDynamicComponent","_createElementVNode","_normalizeClass","_normalizeStyle","_renderSlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Anchor.mjs","sources":["../../../../src/components/Anchor/Anchor.vue"],"sourcesContent":["<template>\n <component :is=\"wrapperComponent\" :container=\"container\" :offset-top=\"offsetTop\" :offset-bottom=\"offsetBottom\" @on-change=\"handleAffixStateChange\">\n <div :class=\"`${containerClass} ${prefixCls}`\" :style=\"wrapperStyle\">\n <div :class=\"`${prefixCls}-inner`\">\n <div :class=\"`${prefixCls}-inner-ink`\">\n <span v-show=\"showInk\" :class=\"`${prefixCls}-inner-ink-ball`\" :style=\"{ top: `${inkTop}px` }\" />\n </div>\n <slot />\n </div>\n </div>\n </component>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, nextTick, onBeforeUnmount, onMounted, provide, ref, toRefs, watch } from 'vue';\n\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport { addEventListener, scrollTop } from '../../utils/dom';\nimport type { addEventListenerReturn } from '../../utils/dom';\nimport { anchorProps, anchorEmits } from './Anchor.type';\nimport type { LinkOffset } from './Anchor.type';\n\nexport default defineComponent({\n name: 'UAnchor',\n props: anchorProps,\n emits: anchorEmits,\n setup(props, { emit }) {\n const { scrollOffset } = toRefs(props);\n const { prefixCls } = useGlobalConfig('anchor');\n const isAffixed = ref(false);\n const inkTop = ref(0);\n const currentLink = ref('');\n let currentId = ''; // current show title id => #href -> currentId = href\n let titlesOffsetArr: LinkOffset[] = [];\n const links: string[] = [];\n let wrapperTop = 0;\n let scrollElement: HTMLElement | null = null;\n let hashChangeEvent: addEventListenerReturn | null = null;\n let scrollEvent: addEventListenerReturn | null = null;\n let animating = false;\n\n const wrapperComponent = computed(() => {\n return props.affix ? 'UAffix' : 'div';\n });\n\n const wrapperStyle = computed(() => {\n let offset = '100vh';\n if (props.offsetBottom || props.offsetBottom === 0) {\n offset = `calc(100vh - ${props.offsetBottom}px)`;\n } else if (props.offsetTop || props.offsetTop === 0) {\n offset = `calc(100vh - ${props.offsetTop}px)`;\n }\n return {\n maxHeight: offset,\n ...props.containerStyle\n };\n });\n\n watch(currentLink, (nv, ov) => {\n emit('change', nv, ov);\n });\n\n const handleAffixStateChange = (state: boolean) => {\n isAffixed.value = props.affix && state;\n };\n\n const handleSetInkTop = () => {\n const currentLinkElementA = document.querySelector<HTMLElement>(`a[data-href=\"${currentLink.value}\"]`);\n if (!currentLinkElementA) return;\n const elementATop = currentLinkElementA.offsetTop;\n inkTop.value = elementATop < 0 ? props.offsetTop : elementATop;\n };\n\n const handleScrollTo = () => {\n const anchor = document.getElementById(currentId);\n const currentLinkElementA = document.querySelector(`a[data-href=\"${currentLink.value}\"]`);\n let offset = props.scrollOffset;\n if (currentLinkElementA) {\n offset = parseFloat(currentLinkElementA.getAttribute('data-scroll-offset')?.toString() || '0');\n }\n if (!anchor) return;\n const offsetTop = anchor.offsetTop - wrapperTop - offset;\n animating = true;\n if (scrollElement) {\n scrollTop(scrollElement, offsetTop, props.duration, () => {\n animating = false;\n });\n }\n\n handleSetInkTop();\n };\n\n const updateTitleOffset = () => {\n const offsetArr: LinkOffset[] = [];\n links.forEach((link) => {\n const titleEle = document.getElementById(link.split('#')[1]);\n if (titleEle)\n offsetArr.push({\n link,\n offset: titleEle.offsetTop - (scrollElement?.offsetTop || 0)\n });\n });\n titlesOffsetArr = offsetArr;\n };\n\n const getCurrentScrollAtTitleId = (top: number) => {\n let _scrollTop = top;\n let i = 0;\n const len = titlesOffsetArr.length;\n let titleItem = {\n link: '#',\n offset: 0\n };\n _scrollTop += props.bounds;\n while (i < len) {\n const currentEle = titlesOffsetArr[i];\n const nextEle = titlesOffsetArr[i + 1];\n if (_scrollTop >= currentEle.offset && _scrollTop < ((nextEle && nextEle.offset) || Infinity)) {\n titleItem = titlesOffsetArr[i];\n break;\n }\n i += 1;\n }\n currentLink.value = titleItem.link;\n handleSetInkTop();\n };\n\n const handleScroll = (e: any) => {\n if (animating) return;\n updateTitleOffset();\n\n const _scrollTop = document.documentElement.scrollTop || document.body.scrollTop || e.target.scrollTop;\n getCurrentScrollAtTitleId(_scrollTop);\n };\n\n const handleHashChange = (toHash?: Record<string, any> | string) => {\n const url = typeof toHash === 'object' ? toHash.newURL : toHash || currentLink.value; // window.location.href;\n const sharpMatcherRegx = /#([^#]+)$/;\n const sharpLinkMatch = sharpMatcherRegx.exec(url);\n if (!sharpLinkMatch) return;\n currentLink.value = sharpLinkMatch[0];\n currentId = sharpLinkMatch[1];\n\n nextTick(() => {\n handleScrollTo();\n });\n };\n\n const removeListener = () => {\n hashChangeEvent && hashChangeEvent.remove();\n scrollEvent && scrollEvent.remove();\n };\n\n const setCurrentLink = (link: string) => {\n if (link) {\n handleHashChange(link);\n // handleScrollTo();\n // if (props.showHash && route) {\n // // ctx.$router.push(href.value, () => {});\n // route.push(currentLink.value, () => {});\n // } else if(props.showHash) {\n // window.location.href = currentLink.value;\n // }\n if (props.showHash) {\n const sharpMatcherRegx = /#([^#]+)$/;\n const sharpLinkMatch = sharpMatcherRegx.exec(window.location.hash);\n if (sharpLinkMatch && sharpLinkMatch.length > 0) {\n if (!links.includes(sharpLinkMatch[0] || '')) {\n window.location.hash += currentLink.value;\n } else {\n window.location.hash = window.location.hash.replace(sharpLinkMatch[0], currentLink.value);\n }\n }\n }\n }\n };\n\n const registerLink = (link: string) => {\n if (!links.includes(link)) {\n links.push(link);\n }\n };\n\n const unregisterLink = (link: string) => {\n const index = links.indexOf(link);\n if (index !== -1) {\n links.splice(index, 1);\n }\n };\n\n const init = () => {\n handleHashChange();\n nextTick(() => {\n removeListener();\n wrapperTop = 0;\n if (props.container) {\n scrollElement = typeof props.container === 'string' ? document.querySelector<HTMLElement>(props.container) : props.container();\n\n if (scrollElement instanceof HTMLElement) {\n wrapperTop = scrollElement.offsetTop;\n }\n } else {\n scrollElement = document.documentElement || document.body;\n }\n handleScrollTo();\n handleSetInkTop();\n updateTitleOffset();\n scrollEvent = addEventListener(scrollElement || window, 'scroll', handleScroll);\n hashChangeEvent = addEventListener(window, 'hashchange', (e: Event) => {\n handleHashChange(e as Record<string, any>);\n });\n });\n };\n\n watch(\n () => props.container,\n () => {\n init();\n }\n );\n\n provide('anchorContext', {\n scrollOffset,\n registerLink,\n unregisterLink,\n setCurrentLink,\n currentLink\n });\n\n onMounted(() => {\n nextTick(() => {\n init();\n });\n });\n\n // beforeDestroy\n onBeforeUnmount(() => {\n removeListener();\n });\n\n return {\n prefixCls,\n wrapperComponent,\n handleAffixStateChange,\n wrapperStyle,\n inkTop\n };\n }\n});\n</script>\n"],"names":["_createBlock","_resolveDynamicComponent","_createElementVNode","_normalizeClass","_normalizeStyle","_renderSlot"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ const _sfc_main = defineComponent({
|
|
|
8
8
|
props: anchorLinkProps,
|
|
9
9
|
emits: anchorLinkEmits,
|
|
10
10
|
setup(props, { emit }) {
|
|
11
|
-
const { prefixCls } = useGlobalConfig("anchor-link");
|
|
11
|
+
const { prefixCls } = useGlobalConfig("anchor-inner-link");
|
|
12
12
|
const anchorContext = inject("anchorContext", {});
|
|
13
13
|
const defaultScrollOffset = props.scrollOffset || (anchorContext == null ? void 0 : anchorContext.scrollOffset);
|
|
14
14
|
const anchorLinkClasses = computed(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnchorLink.mjs","sources":["../../../../src/components/Anchor/AnchorLink.vue"],"sourcesContent":["<template>\n <div :class=\"[`${prefixCls}`, { [`${prefixCls}-active`]: !!anchorLinkClasses }]\">\n <a\n :class=\"[`${prefixCls}-title`]\"\n :href=\"href\"\n :data-scroll-offset=\"defaultScrollOffset\"\n :data-href=\"href\"\n :title=\"title\"\n @click.prevent=\"goAnchor\"\n >\n {{ title }}\n </a>\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, onBeforeUnmount, onMounted, watch } from 'vue';\n\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport { anchorLinkProps, anchorLinkEmits } from './Anchor.type';\nimport type { AnchorContext } from './Anchor.type';\n\nexport default defineComponent({\n name: 'UAnchorLink',\n props: anchorLinkProps,\n emits: anchorLinkEmits,\n setup(props, { emit }) {\n const { prefixCls } = useGlobalConfig('anchor-link');\n const anchorContext = inject<AnchorContext>('anchorContext', {} as AnchorContext);\n\n const defaultScrollOffset = props.scrollOffset || anchorContext?.scrollOffset;\n\n const anchorLinkClasses = computed(() => {\n return anchorContext?.currentLink.value === props.href ? `${prefixCls}-active` : '';\n });\n\n watch(\n () => props.href,\n (nv, ov) => {\n nextTick(() => {\n anchorContext.unregisterLink(ov);\n anchorContext.registerLink(nv);\n });\n }\n );\n\n const goAnchor = (event: Event) => {\n // const value = event.target.href; // href: \"http://localhost:8090/sample/anchor#Anchor_props\"\n // const title = event.target.title;\n const { hash } = (event as any).target; // #Anchor_props\n anchorContext.setCurrentLink(hash);\n emit('change', props.href, event);\n };\n\n onMounted(() => {\n anchorContext.registerLink(props.href);\n });\n\n onBeforeUnmount(() => {\n anchorContext.unregisterLink(props.href);\n });\n\n return {\n prefixCls,\n anchorLinkClasses,\n defaultScrollOffset,\n goAnchor\n };\n }\n});\n</script>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot"],"mappings":";;;;;AAuBA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,QAAQ;UACf,EAAE,cAAc,gBAAgB,
|
|
1
|
+
{"version":3,"file":"AnchorLink.mjs","sources":["../../../../src/components/Anchor/AnchorLink.vue"],"sourcesContent":["<template>\n <div :class=\"[`${prefixCls}`, { [`${prefixCls}-active`]: !!anchorLinkClasses }]\">\n <a\n :class=\"[`${prefixCls}-title`]\"\n :href=\"href\"\n :data-scroll-offset=\"defaultScrollOffset\"\n :data-href=\"href\"\n :title=\"title\"\n @click.prevent=\"goAnchor\"\n >\n {{ title }}\n </a>\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { computed, defineComponent, inject, nextTick, onBeforeUnmount, onMounted, watch } from 'vue';\n\nimport useGlobalConfig from '../base/hooks/useGlobalConfig';\nimport { anchorLinkProps, anchorLinkEmits } from './Anchor.type';\nimport type { AnchorContext } from './Anchor.type';\n\nexport default defineComponent({\n name: 'UAnchorLink',\n props: anchorLinkProps,\n emits: anchorLinkEmits,\n setup(props, { emit }) {\n const { prefixCls } = useGlobalConfig('anchor-inner-link');\n const anchorContext = inject<AnchorContext>('anchorContext', {} as AnchorContext);\n\n const defaultScrollOffset = props.scrollOffset || anchorContext?.scrollOffset;\n\n const anchorLinkClasses = computed(() => {\n return anchorContext?.currentLink.value === props.href ? `${prefixCls}-active` : '';\n });\n\n watch(\n () => props.href,\n (nv, ov) => {\n nextTick(() => {\n anchorContext.unregisterLink(ov);\n anchorContext.registerLink(nv);\n });\n }\n );\n\n const goAnchor = (event: Event) => {\n // const value = event.target.href; // href: \"http://localhost:8090/sample/anchor#Anchor_props\"\n // const title = event.target.title;\n const { hash } = (event as any).target; // #Anchor_props\n anchorContext.setCurrentLink(hash);\n emit('change', props.href, event);\n };\n\n onMounted(() => {\n anchorContext.registerLink(props.href);\n });\n\n onBeforeUnmount(() => {\n anchorContext.unregisterLink(props.href);\n });\n\n return {\n prefixCls,\n anchorLinkClasses,\n defaultScrollOffset,\n goAnchor\n };\n }\n});\n</script>\n"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot"],"mappings":";;;;;AAuBA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM,OAAO,EAAE,QAAQ;UACf,EAAE,cAAc,gBAAgB,mBAAmB;UACnD,gBAAgB,OAAsB,iBAAiB,EAAmB;UAE1E,sBAAsB,MAAM,iBAAgB,+CAAe;UAE3D,oBAAoB,SAAS,MAAM;cAChC,+CAAe,YAAY,WAAU,MAAM,OAAO,GAAG,qBAAqB;AAAA,KAClF;;MAGC,MAAM,MAAM;AAAA,MACZ,CAAC,IAAI,OAAO;iBACD,MAAM;wBACC,eAAe,EAAE;wBACjB,aAAa,EAAE;AAAA,SAC9B;AAAA;AACH;UAGI,WAAW,CAAC,UAAiB;YAG3B,EAAE,SAAU,MAAc;oBAClB,eAAe,IAAI;WAC5B,UAAU,MAAM,MAAM,KAAK;AAAA;cAGxB,MAAM;oBACA,aAAa,MAAM,IAAI;AAAA,KACtC;oBAEe,MAAM;oBACN,eAAe,MAAM,IAAI;AAAA,KACxC;WAEM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AACF;AAEJ,CAAC;;;sBArECA,mBAYM;IAZA,OAAKC,mBAAM,kBAAS,MAAU,0BAAS,EAAc;;IACzDC,mBASI;MARD,OAAKD,mBAAM,sBAAS;MACpB,MAAM;MACN,sBAAoB;MACpB,aAAW;MACX,OAAO;MACP,SAAK,qDAAU,yCAAQ;uBAErB,UAAK;IAEVE,WAAQ;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseTable.mjs","sources":["../../../../src/components/Table/BaseTable.vue"],"sourcesContent":["<template>\n <table ref=\"tableRef\" :style=\"tableStyle\">\n <ColGroup :columns=\"columns\" :is-head-table=\"!showBody\" />\n <TableHeader v-if=\"showHeader\" :columns=\"computedColumns\" />\n <TableBody v-if=\"showBody\" :columns=\"computedColumns\" />\n </table>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, inject, ref } from 'vue';\nimport type { PropType, CSSProperties } from 'vue';\nimport ColGroup from './tableUnits/ColGroup.vue';\nimport TableHeader from './tableUnits/TableHeader.vue';\nimport TableBody from './tableUnits/TableBody.vue';\n// import useResizeObserver from '../base/hooks/useResizeObserver';\nimport type { InnerColumn, TableContext } from './Table.type';\nimport { getWidth } from './hooks/useTableResize';\n// import { debounce } from '../../utils/tools';\n\nexport default defineComponent({\n name: 'BaseTable',\n components: {\n ColGroup,\n TableHeader,\n TableBody\n },\n props: {\n showHeader: {\n type: Boolean,\n default: false\n },\n showBody: {\n type: Boolean,\n default: false\n },\n columns: {\n type: Array as PropType<InnerColumn[]>,\n default: () => [] as InnerColumn[]\n }\n },\n setup(props) {\n const {\n prefixCls,\n props: { width },\n size: { tableWidth, columnWidths }\n } = inject<TableContext>('tableContext', {} as TableContext);\n const tableRef = ref<HTMLElement | null>(null);\n\n const tableStyle = computed(() => {\n const style = {} as CSSProperties;\n if (width.value) {\n style.width = typeof width.value === 'number' ? `${width.value}px` : width.value;\n } else if (props.columns.some((x) => x.fixed)) {\n // style.width = 'max-content';\n style.minWidth = '100%';\n }\n if (props.columns.some((x) => x.ellipsis) || props.columns.some((x) => x.resizable) || props.columns.some((x) => x.fixed)) {\n style.tableLayout = 'fixed';\n } else {\n style.tableLayout = 'auto';\n }\n\n return style;\n });\n\n const computedColumns = computed(() => {\n let left = 0;\n let right = props.columns\n .filter((x) => x.fixed === 'right')\n .reduce((sum, column) => {\n const w = getWidth(column.width ?? column.minWidth, tableWidth.value);\n return sum + w;\n }, 0);\n return props.columns.map((column) => {\n const rst = {\n ...column,\n className: column.fixed\n ? `${column.className || ''} ${prefixCls.value}-fixed-column ${prefixCls.value}-fixed-column-${column.fixed}`\n : column.className\n };\n if (column.fixed === 'left') {\n rst.left = left;\n const w = getWidth(columnWidths.value[column.key] ?? column.width ?? column.minWidth, tableWidth.value);\n left += w;\n if (column.lastLeft) {\n rst.className = `${rst.className || ''} ${prefixCls.value}-fixed-column-${column.fixed}-last`;\n }\n }\n if (column.fixed === 'right') {\n const w = getWidth(columnWidths.value[column.key] ?? column.width ?? column.minWidth, tableWidth.value);\n right -= w;\n rst.right = right;\n if (column.firstRight) {\n rst.className = `${rst.className || ''} ${prefixCls.value}-fixed-column-${column.fixed}-first`;\n }\n }\n
|
|
1
|
+
{"version":3,"file":"BaseTable.mjs","sources":["../../../../src/components/Table/BaseTable.vue"],"sourcesContent":["<template>\n <table ref=\"tableRef\" :style=\"tableStyle\">\n <ColGroup :columns=\"columns\" :is-head-table=\"!showBody\" />\n <TableHeader v-if=\"showHeader\" :columns=\"computedColumns\" />\n <TableBody v-if=\"showBody\" :columns=\"computedColumns\" />\n </table>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, computed, inject, ref } from 'vue';\nimport type { PropType, CSSProperties } from 'vue';\nimport ColGroup from './tableUnits/ColGroup.vue';\nimport TableHeader from './tableUnits/TableHeader.vue';\nimport TableBody from './tableUnits/TableBody.vue';\n// import useResizeObserver from '../base/hooks/useResizeObserver';\nimport type { InnerColumn, TableContext } from './Table.type';\nimport { getWidth } from './hooks/useTableResize';\n// import { debounce } from '../../utils/tools';\n\nexport default defineComponent({\n name: 'BaseTable',\n components: {\n ColGroup,\n TableHeader,\n TableBody\n },\n props: {\n showHeader: {\n type: Boolean,\n default: false\n },\n showBody: {\n type: Boolean,\n default: false\n },\n columns: {\n type: Array as PropType<InnerColumn[]>,\n default: () => [] as InnerColumn[]\n }\n },\n setup(props) {\n const {\n prefixCls,\n props: { width },\n size: { tableWidth, columnWidths }\n } = inject<TableContext>('tableContext', {} as TableContext);\n const tableRef = ref<HTMLElement | null>(null);\n\n const tableStyle = computed(() => {\n const style = {} as CSSProperties;\n if (width.value) {\n style.width = typeof width.value === 'number' ? `${width.value}px` : width.value;\n } else if (props.columns.some((x) => x.fixed)) {\n // style.width = 'max-content';\n style.minWidth = '100%';\n }\n if (props.columns.some((x) => x.ellipsis) || props.columns.some((x) => x.resizable) || props.columns.some((x) => x.fixed)) {\n style.tableLayout = 'fixed';\n } else {\n style.tableLayout = 'auto';\n }\n\n return style;\n });\n\n const computedColumns = computed(() => {\n let left = 0;\n let right = props.columns\n .filter((x) => x.fixed === 'right')\n .reduce((sum, column) => {\n const w = getWidth(column.width ?? column.minWidth, tableWidth.value);\n return sum + w;\n }, 0);\n return props.columns.map((column) => {\n const rst = {\n ...column,\n className: column.fixed\n ? `${column.className || ''} ${prefixCls.value}-fixed-column ${prefixCls.value}-fixed-column-${column.fixed}`\n : column.className\n };\n if (column.fixed === 'left') {\n rst.left = left;\n const w = getWidth(columnWidths.value[column.key] ?? column.width ?? column.minWidth, tableWidth.value);\n left += w;\n if (column.lastLeft) {\n rst.className = `${rst.className || ''} ${prefixCls.value}-fixed-column-${column.fixed}-last`;\n }\n }\n if (column.fixed === 'right') {\n const w = getWidth(columnWidths.value[column.key] ?? column.width ?? column.minWidth, tableWidth.value);\n right -= w;\n rst.right = right;\n if (column.firstRight) {\n rst.className = `${rst.className || ''} ${prefixCls.value}-fixed-column-${column.fixed}-first`;\n }\n }\n return rst;\n });\n });\n\n // const debouncedHandleResize = debounce(syncFixedTableRowHeight, 150);\n // useResizeObserver(tableRef, debouncedHandleResize);\n\n return {\n tableRef,\n prefixCls,\n tableStyle,\n computedColumns\n };\n }\n});\n</script>\n"],"names":["_createElementBlock","_normalizeStyle","_createVNode","_createBlock"],"mappings":";;;;;;;AAmBA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA;AACF,EACA,OAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA;AACX,IACA,UAAU;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AACX,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,MAAM;AAAC;AAClB;AACF,EACA,MAAM,OAAO;UACL;AAAA,MACJ;AAAA,MACA,OAAO,EAAE;AAAM,MACf,MAAM,EAAE,YAAY;AAAa,QAC/B,OAAqB,gBAAgB,EAAkB;UACrD,WAAW,IAAwB,IAAI;UAEvC,aAAa,SAAS,MAAM;YAC1B,QAAQ;UACV,MAAM,OAAO;cACT,QAAQ,OAAO,MAAM,UAAU,WAAW,GAAG,MAAM,YAAY,MAAM;AAAA,iBAClE,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG;cAEvC,WAAW;AAAA;UAEf,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,QAAQ,KAAK,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG;cACnH,cAAc;AAAA,aACf;cACC,cAAc;AAAA;aAGf;AAAA,KACR;UAEK,kBAAkB,SAAS,MAAM;UACjC,OAAO;UACP,QAAQ,MAAM,QACf,OAAO,CAAC,MAAM,EAAE,UAAU,OAAO,EACjC,OAAO,CAAC,KAAK,WAAW;AA5DjC;cA6DgB,IAAI,UAAS,YAAO,UAAP,YAAgB,OAAO,UAAU,WAAW,KAAK;eAC7D,MAAM;AAAA,SACZ,CAAC;aACC,MAAM,QAAQ,IAAI,CAAC,WAAW;AAhE3C;cAiEc,MAAM;AAAA,UACV,GAAG;AAAA,UACH,WAAW,OAAO,QACd,GAAG,OAAO,aAAa,MAAM,UAAU,sBAAsB,UAAU,sBAAsB,OAAO,UACpG,OAAO;AAAA;YAET,OAAO,UAAU,QAAQ;cACvB,OAAO;gBACL,IAAI,UAAS,wBAAa,MAAM,OAAO,SAA1B,YAAkC,OAAO,UAAzC,YAAkD,OAAO,UAAU,WAAW,KAAK;kBAC9F;cACJ,OAAO,UAAU;gBACf,YAAY,GAAG,IAAI,aAAa,MAAM,UAAU,sBAAsB,OAAO;AAAA;AACnF;YAEE,OAAO,UAAU,SAAS;gBACtB,IAAI,UAAS,wBAAa,MAAM,OAAO,SAA1B,YAAkC,OAAO,UAAzC,YAAkD,OAAO,UAAU,WAAW,KAAK;mBAC7F;cACL,QAAQ;cACR,OAAO,YAAY;gBACjB,YAAY,GAAG,IAAI,aAAa,MAAM,UAAU,sBAAsB,OAAO;AAAA;AACnF;eAEK;AAAA,OACR;AAAA,KACF;WAKM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AACF;AAEJ,CAAC;;;;;sBA7GCA,mBAIQ;IAJD,KAAI;AAAA,IAAY,OAAKC,eAAE,eAAU;AAAA;IACtCC,YAA0D;MAA/C,SAAS;MAAU,iBAAa,CAAG;;IAC3B,gCAAnBC,YAA4D;;MAA5B,SAAS;;IACxB,8BAAjBA,YAAwD;;MAA5B,SAAS;;;;;;;;"}
|
|
@@ -41,12 +41,22 @@ function useDraggable(props, tableRefs) {
|
|
|
41
41
|
}, {
|
|
42
42
|
flush: "post"
|
|
43
43
|
});
|
|
44
|
+
const getClientY = (event) => {
|
|
45
|
+
if ("touches" in event && event.touches.length > 0) {
|
|
46
|
+
return event.touches[0].clientY;
|
|
47
|
+
}
|
|
48
|
+
if ("clientY" in event) {
|
|
49
|
+
return event.clientY;
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
};
|
|
44
53
|
const setRowRefsTranslate = (event) => {
|
|
45
54
|
const currentRowData = rowDataMap.value[sourceRowKey];
|
|
46
55
|
const {
|
|
47
56
|
height: currentHeight
|
|
48
57
|
} = currentRowData.rowRef[0].value.getBoundingClientRect();
|
|
49
|
-
const
|
|
58
|
+
const clientY = getClientY(event);
|
|
59
|
+
const realClientY = clientY + tableRefs.bodyTable.wrapRef.scrollTop;
|
|
50
60
|
const safeTranslateY = Math.max(relativeMinY, Math.min(realClientY - dragStartPosition, relativeMaxY));
|
|
51
61
|
currentRowData.rowRef.forEach((currentItem) => {
|
|
52
62
|
currentItem.value.style.transform = `translateY(${safeTranslateY}px)`;
|
|
@@ -62,7 +72,7 @@ function useDraggable(props, tableRefs) {
|
|
|
62
72
|
height,
|
|
63
73
|
top
|
|
64
74
|
} = rowData.rowRef[0].value.getBoundingClientRect();
|
|
65
|
-
const position = top + Number((height / 2).toFixed(2)) <
|
|
75
|
+
const position = top + Number((height / 2).toFixed(2)) < clientY ? 1 : -1;
|
|
66
76
|
if (!(sort + position)) {
|
|
67
77
|
let translateY = currentHeight;
|
|
68
78
|
let index = Math.min(targetIndex, rowData.index);
|
|
@@ -95,10 +105,11 @@ function useDraggable(props, tableRefs) {
|
|
|
95
105
|
}
|
|
96
106
|
};
|
|
97
107
|
const handleBodyScrollY = (event) => {
|
|
98
|
-
|
|
108
|
+
const clientY = getClientY(event);
|
|
109
|
+
if (bodyTop + bodyHeight > clientY && clientY > bodyTop) {
|
|
99
110
|
clearBodyScrollY();
|
|
100
111
|
} else if (!scrollTimer) {
|
|
101
|
-
const px =
|
|
112
|
+
const px = clientY < bodyTop ? -3 : 3;
|
|
102
113
|
scrollTimer = setInterval(() => {
|
|
103
114
|
tableRefs.bodyTable.setScrollTop(Math.max(0, Math.min(tableRefs.bodyTable.wrapRef.scrollTop + px, tableHeight - bodyHeight)));
|
|
104
115
|
setRowRefsTranslate(event);
|
|
@@ -111,6 +122,13 @@ function useDraggable(props, tableRefs) {
|
|
|
111
122
|
setRowRefsTranslate(event);
|
|
112
123
|
}
|
|
113
124
|
};
|
|
125
|
+
const handleTouchmove = (event) => {
|
|
126
|
+
event.preventDefault();
|
|
127
|
+
handleBodyScrollY(event);
|
|
128
|
+
if (!scrollTimer) {
|
|
129
|
+
setRowRefsTranslate(event);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
114
132
|
const disableWheel = (e) => {
|
|
115
133
|
e.preventDefault();
|
|
116
134
|
};
|
|
@@ -137,11 +155,15 @@ function useDraggable(props, tableRefs) {
|
|
|
137
155
|
window.removeEventListener("mousemove", handleMousemove);
|
|
138
156
|
window.removeEventListener("mouseup", clearDrag);
|
|
139
157
|
window.removeEventListener("mousewheel", disableWheel);
|
|
158
|
+
window.removeEventListener("touchmove", handleTouchmove);
|
|
159
|
+
window.removeEventListener("touchend", clearDrag);
|
|
160
|
+
window.removeEventListener("touchcancel", clearDrag);
|
|
140
161
|
};
|
|
141
162
|
const handleDragStart = (event, param) => {
|
|
142
163
|
const bodyTable = tableRefs.bodyTable.wrapRef;
|
|
143
164
|
sourceRowKey = param.rowKey.toString();
|
|
144
|
-
|
|
165
|
+
const clientY = getClientY(event);
|
|
166
|
+
dragStartPosition = clientY + bodyTable.scrollTop;
|
|
145
167
|
const sortRowData = Object.values(rowDataMap.value).sort((a, b) => a.index - b.index);
|
|
146
168
|
const {
|
|
147
169
|
top
|
|
@@ -158,12 +180,21 @@ function useDraggable(props, tableRefs) {
|
|
|
158
180
|
bodyTop = bodyTopInner;
|
|
159
181
|
bodyHeight = bodyHeightInner;
|
|
160
182
|
tableHeight = tableHeightInner;
|
|
161
|
-
|
|
183
|
+
if ("touches" in event) {
|
|
184
|
+
handleTouchmove(event);
|
|
185
|
+
} else {
|
|
186
|
+
handleMousemove(event);
|
|
187
|
+
}
|
|
162
188
|
window.addEventListener("mousemove", handleMousemove);
|
|
163
189
|
window.addEventListener("mouseup", clearDrag);
|
|
164
190
|
window.addEventListener("mousewheel", disableWheel, {
|
|
165
191
|
passive: false
|
|
166
192
|
});
|
|
193
|
+
window.addEventListener("touchmove", handleTouchmove, {
|
|
194
|
+
passive: false
|
|
195
|
+
});
|
|
196
|
+
window.addEventListener("touchend", clearDrag);
|
|
197
|
+
window.addEventListener("touchcancel", clearDrag);
|
|
167
198
|
event.preventDefault();
|
|
168
199
|
};
|
|
169
200
|
const draggableColumn = computed(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDraggable.mjs","sources":["../../../../../src/components/Table/hooks/useDraggable.tsx"],"sourcesContent":["import { computed, ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport type { ColumnSlotParams, InnerColumn, TableProps, TableRefs } from '../Table.type';\nimport DraggableIcon from '../tableUnits/DraggableIcon.vue';\n\nexport interface RowData {\n rowKey: string | number;\n index: number;\n data: Record<string, any>;\n rowRef: Ref<HTMLElement>[];\n}\n\nexport interface BodyScrollMethod {\n handle: null | ((e: any) => void);\n}\n\nexport default function useDraggable(props: TableProps, tableRefs: TableRefs) {\n let sourceRowKey: string | number = '';\n let targetIndex = 0;\n let dragStartPosition = 0;\n let relativeMinY = 0;\n let relativeMaxY = 0;\n const rowDataMap = ref<Record<string, RowData>>({});\n\n const setRowRefs = (val: RowData) => {\n if (props.draggable) {\n const historyRowData = rowDataMap.value[val.rowKey.toString()];\n if (historyRowData) {\n const { rowRef } = historyRowData;\n historyRowData.index = val.index;\n\n if (rowRef[rowRef.length - 1].value) {\n rowRef.push(...val.rowRef);\n } else {\n rowRef.splice(rowRef.length - 2, 1, val.rowRef[0]);\n }\n } else {\n rowDataMap.value[val.rowKey.toString()] = val;\n }\n }\n };\n const clearRowRefs = () => {\n if (props.draggable) {\n Object.keys(rowDataMap.value).forEach((key) => {\n const rowData = rowDataMap.value[key];\n if (rowData.rowRef.every((item) => !item.value)) {\n delete rowDataMap.value[key];\n }\n });\n }\n };\n watch(\n () => props.data,\n () => {\n clearRowRefs();\n },\n { flush: 'post' }\n );\n\n const setRowRefsTranslate = (event: MouseEvent) => {\n const currentRowData = rowDataMap.value[sourceRowKey];\n const { height: currentHeight } = currentRowData.rowRef[0].value.getBoundingClientRect();\n const realClientY = event.clientY + (tableRefs.bodyTable as any).wrapRef.scrollTop;\n const safeTranslateY = Math.max(relativeMinY, Math.min(realClientY - dragStartPosition, relativeMaxY));\n currentRowData.rowRef.forEach((currentItem) => {\n currentItem.value.style.transform = `translateY(${safeTranslateY}px)`;\n currentItem.value.style.position = 'relative';\n currentItem.value.style.zIndex = '999';\n });\n targetIndex = currentRowData.index;\n Object.keys(rowDataMap.value).forEach((rowKey) => {\n if (rowKey !== sourceRowKey) {\n const rowData = rowDataMap.value[rowKey];\n const sort = rowData.index < currentRowData.index ? 1 : -1;\n\n const { height, top } = rowData.rowRef[0].value.getBoundingClientRect();\n const position = top + Number((height / 2).toFixed(2)) < event.clientY ? 1 : -1;\n\n if (!(sort + position)) {\n let translateY = currentHeight;\n let index = Math.min(targetIndex, rowData.index);\n if (sort === -1) {\n translateY = -currentHeight;\n index = Math.max(targetIndex, rowData.index);\n }\n targetIndex = index;\n rowData.rowRef.forEach((rowRefItem) => {\n rowRefItem.value.style.transform = `translateY(${translateY}px)`;\n rowRefItem.value.style.transition = 'transform 0.3s';\n });\n } else {\n rowData.rowRef.forEach((rowRefItem) => {\n rowRefItem.value.style.transform = 'none';\n rowRefItem.value.style.transition = 'transform 0.3s';\n });\n }\n }\n });\n };\n\n let bodyTop = 0;\n let bodyHeight = 0;\n let tableHeight = 0;\n let scrollTimer: any | null = null;\n const clearBodyScrollY = () => {\n if (scrollTimer) {\n clearInterval(scrollTimer);\n scrollTimer = null;\n }\n };\n const handleBodyScrollY = (event: MouseEvent) => {\n if (bodyTop + bodyHeight > event.clientY && event.clientY > bodyTop) {\n clearBodyScrollY();\n } else if (!scrollTimer) {\n const px = event.clientY < bodyTop ? -3 : 3;\n scrollTimer = setInterval(() => {\n (tableRefs.bodyTable as any).setScrollTop(\n Math.max(0, Math.min((tableRefs.bodyTable as any).wrapRef.scrollTop + px, tableHeight - bodyHeight))\n );\n setRowRefsTranslate(event);\n }, 10);\n }\n };\n const handleMousemove = (event: MouseEvent) => {\n handleBodyScrollY(event);\n\n if (!scrollTimer) {\n setRowRefsTranslate(event);\n }\n };\n\n const disableWheel = (e: Event) => {\n e.preventDefault();\n };\n\n const clearDrag = () => {\n let targetRowKey = sourceRowKey;\n Object.values(rowDataMap.value).forEach((rowData) => {\n if (rowData.index === targetIndex) {\n targetRowKey = rowData.rowKey.toString();\n }\n rowData.rowRef.forEach((rowRefItem) => {\n rowRefItem.value.style.transform = 'none';\n rowRefItem.value.style.transition = 'none';\n rowRefItem.value.style.position = 'unset';\n rowRefItem.value.style.zIndex = 'auto';\n });\n });\n if (targetRowKey !== sourceRowKey) {\n if (props.draggable.onDragDrop) {\n props.draggable.onDragDrop(sourceRowKey, targetRowKey);\n }\n }\n sourceRowKey = '';\n clearBodyScrollY();\n window.removeEventListener('mousemove', handleMousemove);\n window.removeEventListener('mouseup', clearDrag);\n window.removeEventListener('mousewheel', disableWheel);\n };\n const handleDragStart = (event: MouseEvent, param: ColumnSlotParams) => {\n const bodyTable = (tableRefs.bodyTable as any).wrapRef;\n\n sourceRowKey = param.rowKey.toString();\n\n dragStartPosition = event.clientY + bodyTable.scrollTop;\n\n const sortRowData = Object.values(rowDataMap.value).sort((a, b) => a.index - b.index);\n const { top } = rowDataMap.value[sourceRowKey].rowRef[0].value.getBoundingClientRect();\n relativeMinY = sortRowData[0].rowRef[0].value.getBoundingClientRect().top - top;\n relativeMaxY = sortRowData[sortRowData.length - 1].rowRef[0].value.getBoundingClientRect().top - top;\n const { top: bodyTopInner, height: bodyHeightInner } = bodyTable.getBoundingClientRect();\n const { height: tableHeightInner } = bodyTable.children[0].getBoundingClientRect();\n bodyTop = bodyTopInner;\n bodyHeight = bodyHeightInner;\n tableHeight = tableHeightInner;\n\n handleMousemove(event);\n\n window.addEventListener('mousemove', handleMousemove);\n window.addEventListener('mouseup', clearDrag);\n window.addEventListener('mousewheel', disableWheel, { passive: false });\n\n event.preventDefault();\n };\n\n const draggableColumn = computed(() => {\n if (props.draggable) {\n const column: InnerColumn = {\n key: 'draggable-column',\n type: 'draggable',\n width: 50,\n align: 'center',\n render: (param) => {\n return <DraggableIcon onDragStart={(event: MouseEvent) => handleDragStart(event, param)} />;\n }\n // handleDragStart\n };\n if ('fixed' in props.draggable) {\n column.fixed = props.draggable.fixed;\n } else if (props.columns.some((x) => x.fixed === 'left' || x.fixed === true)) {\n column.fixed = 'left';\n }\n return column;\n }\n return null;\n });\n return {\n setRowRefs,\n draggableColumn\n };\n}\n"],"names":["useDraggable","props","tableRefs","sourceRowKey","targetIndex","dragStartPosition","relativeMinY","relativeMaxY","rowDataMap","ref","setRowRefs","val","draggable","historyRowData","value","rowKey","toString","rowRef","index","length","push","splice","clearRowRefs","Object","keys","forEach","key","rowData","every","item","watch","data","flush","setRowRefsTranslate","event","currentRowData","height","currentHeight","getBoundingClientRect","realClientY","clientY","bodyTable","wrapRef","scrollTop","safeTranslateY","Math","max","min","currentItem","style","transform","position","zIndex","sort","top","Number","toFixed","translateY","rowRefItem","transition","bodyTop","bodyHeight","tableHeight","scrollTimer","clearBodyScrollY","clearInterval","handleBodyScrollY","px","setInterval","setScrollTop","handleMousemove","disableWheel","e","preventDefault","clearDrag","targetRowKey","values","onDragDrop","window","removeEventListener","handleDragStart","param","sortRowData","a","b","bodyTopInner","bodyHeightInner","tableHeightInner","children","addEventListener","passive","draggableColumn","computed","column","type","width","align","render","_createVNode","DraggableIcon","fixed","columns","some","x"],"mappings":";;;SAgBwBA,aAAaC,OAAmBC,WAAsB;AAC5E,MAAIC,eAAgC;AACpC,MAAIC,cAAc;AAClB,MAAIC,oBAAoB;AACxB,MAAIC,eAAe;AACnB,MAAIC,eAAe;AACnB,QAAMC,aAAaC,IAA6B,EAAE;AAElD,QAAMC,aAAcC,SAAiB;AACnC,QAAIV,MAAMW,WAAW;AACnB,YAAMC,iBAAiBL,WAAWM,MAAMH,IAAII,OAAOC;AACnD,UAAIH,gBAAgB;AAClB,cAAM;AAAA,UAAEI;AAAAA,YAAWJ;AACnBA,uBAAeK,QAAQP,IAAIO;AAE3B,YAAID,OAAOA,OAAOE,SAAS,GAAGL,OAAO;AACnCG,iBAAOG,KAAK,GAAGT,IAAIM,MAAM;AAAA,eACpB;AACLA,iBAAOI,OAAOJ,OAAOE,SAAS,GAAG,GAAGR,IAAIM,OAAO,EAAE;AAAA;AACnD,aACK;AACLT,mBAAWM,MAAMH,IAAII,OAAOC,cAAcL;AAAAA;AAC5C;AACF;AAEF,QAAMW,eAAeA,MAAM;AACzB,QAAIrB,MAAMW,WAAW;AACnBW,aAAOC,KAAKhB,WAAWM,KAAK,EAAEW,QAASC,SAAQ;AAC7C,cAAMC,UAAUnB,WAAWM,MAAMY;AACjC,YAAIC,QAAQV,OAAOW,MAAOC,UAAS,CAACA,KAAKf,KAAK,GAAG;AAC/C,iBAAON,WAAWM,MAAMY;AAAAA;AAC1B,OACD;AAAA;AACH;AAEFI,QACE,MAAM7B,MAAM8B,MACZ,MAAM;AACJT;AAAa,KAEf;AAAA,IAAEU,OAAO;AAAA,GACX;AAEA,QAAMC,sBAAuBC,WAAsB;AACjD,UAAMC,iBAAiB3B,WAAWM,MAAMX;AACxC,UAAM;AAAA,MAAEiC,QAAQC;AAAAA,QAAkBF,eAAelB,OAAO,GAAGH,MAAMwB;AACjE,UAAMC,cAAcL,MAAMM,UAAWtC,UAAUuC,UAAkBC,QAAQC;AACzE,UAAMC,iBAAiBC,KAAKC,IAAIxC,cAAcuC,KAAKE,IAAIR,cAAclC,mBAAmBE,YAAY,CAAC;AACrG4B,mBAAelB,OAAOQ,QAASuB,iBAAgB;AAC7CA,kBAAYlC,MAAMmC,MAAMC,YAAY,cAAcN;AAClDI,kBAAYlC,MAAMmC,MAAME,WAAW;AACnCH,kBAAYlC,MAAMmC,MAAMG,SAAS;AAAA,KAClC;AACDhD,kBAAc+B,eAAejB;AAC7BK,WAAOC,KAAKhB,WAAWM,KAAK,EAAEW,QAASV,YAAW;AAChD,UAAIA,WAAWZ,cAAc;AAC3B,cAAMwB,UAAUnB,WAAWM,MAAMC;AACjC,cAAMsC,OAAO1B,QAAQT,QAAQiB,eAAejB,QAAQ,IAAI;AAExD,cAAM;AAAA,UAAEkB;AAAAA,UAAQkB;AAAAA,YAAQ3B,QAAQV,OAAO,GAAGH,MAAMwB;AAChD,cAAMa,WAAWG,MAAMC,QAAQnB,SAAS,GAAGoB,QAAQ,CAAC,CAAC,IAAItB,MAAMM,UAAU,IAAI;AAE7E,YAAI,EAAEa,OAAOF,WAAW;AACtB,cAAIM,aAAapB;AACjB,cAAInB,QAAQ2B,KAAKE,IAAI3C,aAAauB,QAAQT,KAAK;AAC/C,cAAImC,SAAS,IAAI;AACfI,yBAAa,CAACpB;AACdnB,oBAAQ2B,KAAKC,IAAI1C,aAAauB,QAAQT,KAAK;AAAA;AAE7Cd,wBAAcc;AACdS,kBAAQV,OAAOQ,QAASiC,gBAAe;AACrCA,uBAAW5C,MAAMmC,MAAMC,YAAY,cAAcO;AACjDC,uBAAW5C,MAAMmC,MAAMU,aAAa;AAAA,WACrC;AAAA,eACI;AACLhC,kBAAQV,OAAOQ,QAASiC,gBAAe;AACrCA,uBAAW5C,MAAMmC,MAAMC,YAAY;AACnCQ,uBAAW5C,MAAMmC,MAAMU,aAAa;AAAA,WACrC;AAAA;AACH;AACF,KACD;AAAA;AAGH,MAAIC,UAAU;AACd,MAAIC,aAAa;AACjB,MAAIC,cAAc;AAClB,MAAIC,cAA0B;AAC9B,QAAMC,mBAAmBA,MAAM;AAC7B,QAAID,aAAa;AACfE,oBAAcF,WAAW;AACzBA,oBAAc;AAAA;AAChB;AAEF,QAAMG,oBAAqBhC,WAAsB;AAC/C,QAAI0B,UAAUC,aAAa3B,MAAMM,WAAWN,MAAMM,UAAUoB,SAAS;AACnEI;AAAiB,eACR,CAACD,aAAa;AACvB,YAAMI,KAAKjC,MAAMM,UAAUoB,UAAU,KAAK;AAC1CG,oBAAcK,YAAY,MAAM;AAC7BlE,kBAAUuC,UAAkB4B,aAC3BxB,KAAKC,IAAI,GAAGD,KAAKE,IAAK7C,UAAUuC,UAAkBC,QAAQC,YAAYwB,IAAIL,cAAcD,UAAU,CAAC,CACrG;AACA5B,4BAAoBC,KAAK;AAAA,SACxB,EAAE;AAAA;AACP;AAEF,QAAMoC,kBAAmBpC,WAAsB;AAC7CgC,sBAAkBhC,KAAK;AAEvB,QAAI,CAAC6B,aAAa;AAChB9B,0BAAoBC,KAAK;AAAA;AAC3B;AAGF,QAAMqC,eAAgBC,OAAa;AACjCA,MAAEC;AAAe;AAGnB,QAAMC,YAAYA,MAAM;AACtB,QAAIC,eAAexE;AACnBoB,WAAOqD,OAAOpE,WAAWM,KAAK,EAAEW,QAASE,aAAY;AACnD,UAAIA,QAAQT,UAAUd,aAAa;AACjCuE,uBAAehD,QAAQZ,OAAOC;AAAS;AAEzCW,cAAQV,OAAOQ,QAASiC,gBAAe;AACrCA,mBAAW5C,MAAMmC,MAAMC,YAAY;AACnCQ,mBAAW5C,MAAMmC,MAAMU,aAAa;AACpCD,mBAAW5C,MAAMmC,MAAME,WAAW;AAClCO,mBAAW5C,MAAMmC,MAAMG,SAAS;AAAA,OACjC;AAAA,KACF;AACD,QAAIuB,iBAAiBxE,cAAc;AACjC,UAAIF,MAAMW,UAAUiE,YAAY;AAC9B5E,cAAMW,UAAUiE,WAAW1E,cAAcwE,YAAY;AAAA;AACvD;AAEFxE,mBAAe;AACf6D;AACAc,WAAOC,oBAAoB,aAAaT,eAAe;AACvDQ,WAAOC,oBAAoB,WAAWL,SAAS;AAC/CI,WAAOC,oBAAoB,cAAcR,YAAY;AAAA;AAEvD,QAAMS,kBAAkBA,CAAC9C,OAAmB+C,UAA4B;AACtE,UAAMxC,YAAavC,UAAUuC,UAAkBC;AAE/CvC,mBAAe8E,MAAMlE,OAAOC;AAE5BX,wBAAoB6B,MAAMM,UAAUC,UAAUE;AAE9C,UAAMuC,cAAc3D,OAAOqD,OAAOpE,WAAWM,KAAK,EAAEuC,KAAK,CAAC8B,GAAGC,MAAMD,EAAEjE,QAAQkE,EAAElE,KAAK;AACpF,UAAM;AAAA,MAAEoC;AAAAA,QAAQ9C,WAAWM,MAAMX,cAAcc,OAAO,GAAGH,MAAMwB;AAC/DhC,mBAAe4E,YAAY,GAAGjE,OAAO,GAAGH,MAAMwB,wBAAwBgB,MAAMA;AAC5E/C,mBAAe2E,YAAYA,YAAY/D,SAAS,GAAGF,OAAO,GAAGH,MAAMwB,wBAAwBgB,MAAMA;AACjG,UAAM;AAAA,MAAEA,KAAK+B;AAAAA,MAAcjD,QAAQkD;AAAAA,QAAoB7C,UAAUH;AACjE,UAAM;AAAA,MAAEF,QAAQmD;AAAAA,QAAqB9C,UAAU+C,SAAS,GAAGlD;AAC3DsB,cAAUyB;AACVxB,iBAAayB;AACbxB,kBAAcyB;AAEdjB,oBAAgBpC,KAAK;AAErB4C,WAAOW,iBAAiB,aAAanB,eAAe;AACpDQ,WAAOW,iBAAiB,WAAWf,SAAS;AAC5CI,WAAOW,iBAAiB,cAAclB,cAAc;AAAA,MAAEmB,SAAS;AAAA,KAAO;AAEtExD,UAAMuC;AAAe;AAGvB,QAAMkB,kBAAkBC,SAAS,MAAM;AACrC,QAAI3F,MAAMW,WAAW;AACnB,YAAMiF,SAAsB;AAAA,QAC1BnE,KAAK;AAAA,QACLoE,MAAM;AAAA,QACNC,OAAO;AAAA,QACPC,OAAO;AAAA,QACPC,QAAShB,WAAU;AACjB,iBAAAiB,YAAAC;YAAA,eAAoCjE,WAAsB8C,gBAAgB9C,OAAO+C,KAAK;AAAA;;AACxF;AAGF,UAAI,WAAWhF,MAAMW,WAAW;AAC9BiF,eAAOO,QAAQnG,MAAMW,UAAUwF;AAAAA,iBACtBnG,MAAMoG,QAAQC,KAAMC,OAAMA,EAAEH,UAAU,UAAUG,EAAEH,UAAU,IAAI,GAAG;AAC5EP,eAAOO,QAAQ;AAAA;AAEjB,aAAOP;AAAAA;AAET,WAAO;AAAA,GACR;AACD,SAAO;AAAA,IACLnF;AAAAA,IACAiF;AAAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"useDraggable.mjs","sources":["../../../../../src/components/Table/hooks/useDraggable.tsx"],"sourcesContent":["import { computed, ref, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport type { ColumnSlotParams, InnerColumn, TableProps, TableRefs } from '../Table.type';\nimport DraggableIcon from '../tableUnits/DraggableIcon.vue';\n\nexport interface RowData {\n rowKey: string | number;\n index: number;\n data: Record<string, any>;\n rowRef: Ref<HTMLElement>[];\n}\n\nexport interface BodyScrollMethod {\n handle: null | ((e: any) => void);\n}\n\nexport default function useDraggable(props: TableProps, tableRefs: TableRefs) {\n let sourceRowKey: string | number = '';\n let targetIndex = 0;\n let dragStartPosition = 0;\n let relativeMinY = 0;\n let relativeMaxY = 0;\n const rowDataMap = ref<Record<string, RowData>>({});\n\n const setRowRefs = (val: RowData) => {\n if (props.draggable) {\n const historyRowData = rowDataMap.value[val.rowKey.toString()];\n if (historyRowData) {\n const { rowRef } = historyRowData;\n historyRowData.index = val.index;\n\n if (rowRef[rowRef.length - 1].value) {\n rowRef.push(...val.rowRef);\n } else {\n rowRef.splice(rowRef.length - 2, 1, val.rowRef[0]);\n }\n } else {\n rowDataMap.value[val.rowKey.toString()] = val;\n }\n }\n };\n const clearRowRefs = () => {\n if (props.draggable) {\n Object.keys(rowDataMap.value).forEach((key) => {\n const rowData = rowDataMap.value[key];\n if (rowData.rowRef.every((item) => !item.value)) {\n delete rowDataMap.value[key];\n }\n });\n }\n };\n watch(\n () => props.data,\n () => {\n clearRowRefs();\n },\n { flush: 'post' }\n );\n\n // Extract clientY from mouse or touch event\n const getClientY = (event: MouseEvent | TouchEvent): number => {\n if ('touches' in event && event.touches.length > 0) {\n // Touch event - get Y coordinate from first touch point\n return event.touches[0].clientY;\n }\n if ('clientY' in event) {\n // Mouse event - use clientY directly\n return event.clientY;\n }\n return 0;\n };\n\n const setRowRefsTranslate = (event: MouseEvent | TouchEvent) => {\n const currentRowData = rowDataMap.value[sourceRowKey];\n const { height: currentHeight } = currentRowData.rowRef[0].value.getBoundingClientRect();\n const clientY = getClientY(event);\n const realClientY = clientY + (tableRefs.bodyTable as any).wrapRef.scrollTop;\n const safeTranslateY = Math.max(relativeMinY, Math.min(realClientY - dragStartPosition, relativeMaxY));\n currentRowData.rowRef.forEach((currentItem) => {\n currentItem.value.style.transform = `translateY(${safeTranslateY}px)`;\n currentItem.value.style.position = 'relative';\n currentItem.value.style.zIndex = '999';\n });\n targetIndex = currentRowData.index;\n Object.keys(rowDataMap.value).forEach((rowKey) => {\n if (rowKey !== sourceRowKey) {\n const rowData = rowDataMap.value[rowKey];\n const sort = rowData.index < currentRowData.index ? 1 : -1;\n\n const { height, top } = rowData.rowRef[0].value.getBoundingClientRect();\n const position = top + Number((height / 2).toFixed(2)) < clientY ? 1 : -1;\n\n if (!(sort + position)) {\n let translateY = currentHeight;\n let index = Math.min(targetIndex, rowData.index);\n if (sort === -1) {\n translateY = -currentHeight;\n index = Math.max(targetIndex, rowData.index);\n }\n targetIndex = index;\n rowData.rowRef.forEach((rowRefItem) => {\n rowRefItem.value.style.transform = `translateY(${translateY}px)`;\n rowRefItem.value.style.transition = 'transform 0.3s';\n });\n } else {\n rowData.rowRef.forEach((rowRefItem) => {\n rowRefItem.value.style.transform = 'none';\n rowRefItem.value.style.transition = 'transform 0.3s';\n });\n }\n }\n });\n };\n\n let bodyTop = 0;\n let bodyHeight = 0;\n let tableHeight = 0;\n let scrollTimer: any | null = null;\n const clearBodyScrollY = () => {\n if (scrollTimer) {\n clearInterval(scrollTimer);\n scrollTimer = null;\n }\n };\n const handleBodyScrollY = (event: MouseEvent | TouchEvent) => {\n const clientY = getClientY(event);\n if (bodyTop + bodyHeight > clientY && clientY > bodyTop) {\n clearBodyScrollY();\n } else if (!scrollTimer) {\n const px = clientY < bodyTop ? -3 : 3;\n scrollTimer = setInterval(() => {\n (tableRefs.bodyTable as any).setScrollTop(\n Math.max(0, Math.min((tableRefs.bodyTable as any).wrapRef.scrollTop + px, tableHeight - bodyHeight))\n );\n setRowRefsTranslate(event);\n }, 10);\n }\n };\n\n // Handle mouse move event\n const handleMousemove = (event: MouseEvent) => {\n handleBodyScrollY(event);\n\n if (!scrollTimer) {\n setRowRefsTranslate(event);\n }\n };\n\n // Handle touch move event for mobile devices\n const handleTouchmove = (event: TouchEvent) => {\n // Prevent default scrolling behavior during drag\n event.preventDefault();\n handleBodyScrollY(event);\n\n if (!scrollTimer) {\n setRowRefsTranslate(event);\n }\n };\n\n const disableWheel = (e: Event) => {\n e.preventDefault();\n };\n\n const clearDrag = () => {\n let targetRowKey = sourceRowKey;\n Object.values(rowDataMap.value).forEach((rowData) => {\n if (rowData.index === targetIndex) {\n targetRowKey = rowData.rowKey.toString();\n }\n rowData.rowRef.forEach((rowRefItem) => {\n rowRefItem.value.style.transform = 'none';\n rowRefItem.value.style.transition = 'none';\n rowRefItem.value.style.position = 'unset';\n rowRefItem.value.style.zIndex = 'auto';\n });\n });\n if (targetRowKey !== sourceRowKey) {\n if (props.draggable.onDragDrop) {\n props.draggable.onDragDrop(sourceRowKey, targetRowKey);\n }\n }\n sourceRowKey = '';\n clearBodyScrollY();\n // Remove mouse event listeners\n window.removeEventListener('mousemove', handleMousemove);\n window.removeEventListener('mouseup', clearDrag);\n window.removeEventListener('mousewheel', disableWheel);\n // Remove touch event listeners\n window.removeEventListener('touchmove', handleTouchmove);\n window.removeEventListener('touchend', clearDrag);\n window.removeEventListener('touchcancel', clearDrag);\n };\n const handleDragStart = (event: MouseEvent | TouchEvent, param: ColumnSlotParams) => {\n const bodyTable = (tableRefs.bodyTable as any).wrapRef;\n\n sourceRowKey = param.rowKey.toString();\n\n // Get clientY from mouse or touch event\n const clientY = getClientY(event);\n dragStartPosition = clientY + bodyTable.scrollTop;\n\n const sortRowData = Object.values(rowDataMap.value).sort((a, b) => a.index - b.index);\n const { top } = rowDataMap.value[sourceRowKey].rowRef[0].value.getBoundingClientRect();\n relativeMinY = sortRowData[0].rowRef[0].value.getBoundingClientRect().top - top;\n relativeMaxY = sortRowData[sortRowData.length - 1].rowRef[0].value.getBoundingClientRect().top - top;\n const { top: bodyTopInner, height: bodyHeightInner } = bodyTable.getBoundingClientRect();\n const { height: tableHeightInner } = bodyTable.children[0].getBoundingClientRect();\n bodyTop = bodyTopInner;\n bodyHeight = bodyHeightInner;\n tableHeight = tableHeightInner;\n\n // Initialize position\n if ('touches' in event) {\n handleTouchmove(event as TouchEvent);\n } else {\n handleMousemove(event as MouseEvent);\n }\n\n // Add mouse event listeners for desktop\n window.addEventListener('mousemove', handleMousemove);\n window.addEventListener('mouseup', clearDrag);\n window.addEventListener('mousewheel', disableWheel, { passive: false });\n\n // Add touch event listeners for mobile\n window.addEventListener('touchmove', handleTouchmove, { passive: false });\n window.addEventListener('touchend', clearDrag);\n window.addEventListener('touchcancel', clearDrag);\n\n event.preventDefault();\n };\n\n const draggableColumn = computed(() => {\n if (props.draggable) {\n const column: InnerColumn = {\n key: 'draggable-column',\n type: 'draggable',\n width: 50,\n align: 'center',\n render: (param) => {\n return <DraggableIcon onDragStart={(event: MouseEvent | TouchEvent) => handleDragStart(event, param)} />;\n }\n // handleDragStart\n };\n if ('fixed' in props.draggable) {\n column.fixed = props.draggable.fixed;\n } else if (props.columns.some((x) => x.fixed === 'left' || x.fixed === true)) {\n column.fixed = 'left';\n }\n return column;\n }\n return null;\n });\n return {\n setRowRefs,\n draggableColumn\n };\n}\n"],"names":["useDraggable","props","tableRefs","sourceRowKey","targetIndex","dragStartPosition","relativeMinY","relativeMaxY","rowDataMap","ref","setRowRefs","val","draggable","historyRowData","value","rowKey","toString","rowRef","index","length","push","splice","clearRowRefs","Object","keys","forEach","key","rowData","every","item","watch","data","flush","getClientY","event","touches","clientY","setRowRefsTranslate","currentRowData","height","currentHeight","getBoundingClientRect","realClientY","bodyTable","wrapRef","scrollTop","safeTranslateY","Math","max","min","currentItem","style","transform","position","zIndex","sort","top","Number","toFixed","translateY","rowRefItem","transition","bodyTop","bodyHeight","tableHeight","scrollTimer","clearBodyScrollY","clearInterval","handleBodyScrollY","px","setInterval","setScrollTop","handleMousemove","handleTouchmove","preventDefault","disableWheel","e","clearDrag","targetRowKey","values","onDragDrop","window","removeEventListener","handleDragStart","param","sortRowData","a","b","bodyTopInner","bodyHeightInner","tableHeightInner","children","addEventListener","passive","draggableColumn","computed","column","type","width","align","render","_createVNode","DraggableIcon","fixed","columns","some","x"],"mappings":";;;SAgBwBA,aAAaC,OAAmBC,WAAsB;AAC5E,MAAIC,eAAgC;AACpC,MAAIC,cAAc;AAClB,MAAIC,oBAAoB;AACxB,MAAIC,eAAe;AACnB,MAAIC,eAAe;AACnB,QAAMC,aAAaC,IAA6B,EAAE;AAElD,QAAMC,aAAcC,SAAiB;AACnC,QAAIV,MAAMW,WAAW;AACnB,YAAMC,iBAAiBL,WAAWM,MAAMH,IAAII,OAAOC;AACnD,UAAIH,gBAAgB;AAClB,cAAM;AAAA,UAAEI;AAAAA,YAAWJ;AACnBA,uBAAeK,QAAQP,IAAIO;AAE3B,YAAID,OAAOA,OAAOE,SAAS,GAAGL,OAAO;AACnCG,iBAAOG,KAAK,GAAGT,IAAIM,MAAM;AAAA,eACpB;AACLA,iBAAOI,OAAOJ,OAAOE,SAAS,GAAG,GAAGR,IAAIM,OAAO,EAAE;AAAA;AACnD,aACK;AACLT,mBAAWM,MAAMH,IAAII,OAAOC,cAAcL;AAAAA;AAC5C;AACF;AAEF,QAAMW,eAAeA,MAAM;AACzB,QAAIrB,MAAMW,WAAW;AACnBW,aAAOC,KAAKhB,WAAWM,KAAK,EAAEW,QAASC,SAAQ;AAC7C,cAAMC,UAAUnB,WAAWM,MAAMY;AACjC,YAAIC,QAAQV,OAAOW,MAAOC,UAAS,CAACA,KAAKf,KAAK,GAAG;AAC/C,iBAAON,WAAWM,MAAMY;AAAAA;AAC1B,OACD;AAAA;AACH;AAEFI,QACE,MAAM7B,MAAM8B,MACZ,MAAM;AACJT;AAAa,KAEf;AAAA,IAAEU,OAAO;AAAA,GACX;AAGA,QAAMC,aAAcC,WAA2C;AAC7D,QAAI,aAAaA,SAASA,MAAMC,QAAQhB,SAAS,GAAG;AAElD,aAAOe,MAAMC,QAAQ,GAAGC;AAAAA;AAE1B,QAAI,aAAaF,OAAO;AAEtB,aAAOA,MAAME;AAAAA;AAEf,WAAO;AAAA;AAGT,QAAMC,sBAAuBH,WAAmC;AAC9D,UAAMI,iBAAiB9B,WAAWM,MAAMX;AACxC,UAAM;AAAA,MAAEoC,QAAQC;AAAAA,QAAkBF,eAAerB,OAAO,GAAGH,MAAM2B;AACjE,UAAML,UAAUH,WAAWC,KAAK;AAChC,UAAMQ,cAAcN,UAAWlC,UAAUyC,UAAkBC,QAAQC;AACnE,UAAMC,iBAAiBC,KAAKC,IAAI1C,cAAcyC,KAAKE,IAAIP,cAAcrC,mBAAmBE,YAAY,CAAC;AACrG+B,mBAAerB,OAAOQ,QAASyB,iBAAgB;AAC7CA,kBAAYpC,MAAMqC,MAAMC,YAAY,cAAcN;AAClDI,kBAAYpC,MAAMqC,MAAME,WAAW;AACnCH,kBAAYpC,MAAMqC,MAAMG,SAAS;AAAA,KAClC;AACDlD,kBAAckC,eAAepB;AAC7BK,WAAOC,KAAKhB,WAAWM,KAAK,EAAEW,QAASV,YAAW;AAChD,UAAIA,WAAWZ,cAAc;AAC3B,cAAMwB,UAAUnB,WAAWM,MAAMC;AACjC,cAAMwC,OAAO5B,QAAQT,QAAQoB,eAAepB,QAAQ,IAAI;AAExD,cAAM;AAAA,UAAEqB;AAAAA,UAAQiB;AAAAA,YAAQ7B,QAAQV,OAAO,GAAGH,MAAM2B;AAChD,cAAMY,WAAWG,MAAMC,QAAQlB,SAAS,GAAGmB,QAAQ,CAAC,CAAC,IAAItB,UAAU,IAAI;AAEvE,YAAI,EAAEmB,OAAOF,WAAW;AACtB,cAAIM,aAAanB;AACjB,cAAItB,QAAQ6B,KAAKE,IAAI7C,aAAauB,QAAQT,KAAK;AAC/C,cAAIqC,SAAS,IAAI;AACfI,yBAAa,CAACnB;AACdtB,oBAAQ6B,KAAKC,IAAI5C,aAAauB,QAAQT,KAAK;AAAA;AAE7Cd,wBAAcc;AACdS,kBAAQV,OAAOQ,QAASmC,gBAAe;AACrCA,uBAAW9C,MAAMqC,MAAMC,YAAY,cAAcO;AACjDC,uBAAW9C,MAAMqC,MAAMU,aAAa;AAAA,WACrC;AAAA,eACI;AACLlC,kBAAQV,OAAOQ,QAASmC,gBAAe;AACrCA,uBAAW9C,MAAMqC,MAAMC,YAAY;AACnCQ,uBAAW9C,MAAMqC,MAAMU,aAAa;AAAA,WACrC;AAAA;AACH;AACF,KACD;AAAA;AAGH,MAAIC,UAAU;AACd,MAAIC,aAAa;AACjB,MAAIC,cAAc;AAClB,MAAIC,cAA0B;AAC9B,QAAMC,mBAAmBA,MAAM;AAC7B,QAAID,aAAa;AACfE,oBAAcF,WAAW;AACzBA,oBAAc;AAAA;AAChB;AAEF,QAAMG,oBAAqBlC,WAAmC;AAC5D,UAAME,UAAUH,WAAWC,KAAK;AAChC,QAAI4B,UAAUC,aAAa3B,WAAWA,UAAU0B,SAAS;AACvDI;AAAiB,eACR,CAACD,aAAa;AACvB,YAAMI,KAAKjC,UAAU0B,UAAU,KAAK;AACpCG,oBAAcK,YAAY,MAAM;AAC7BpE,kBAAUyC,UAAkB4B,aAC3BxB,KAAKC,IAAI,GAAGD,KAAKE,IAAK/C,UAAUyC,UAAkBC,QAAQC,YAAYwB,IAAIL,cAAcD,UAAU,CAAC,CACrG;AACA1B,4BAAoBH,KAAK;AAAA,SACxB,EAAE;AAAA;AACP;AAIF,QAAMsC,kBAAmBtC,WAAsB;AAC7CkC,sBAAkBlC,KAAK;AAEvB,QAAI,CAAC+B,aAAa;AAChB5B,0BAAoBH,KAAK;AAAA;AAC3B;AAIF,QAAMuC,kBAAmBvC,WAAsB;AAE7CA,UAAMwC;AACNN,sBAAkBlC,KAAK;AAEvB,QAAI,CAAC+B,aAAa;AAChB5B,0BAAoBH,KAAK;AAAA;AAC3B;AAGF,QAAMyC,eAAgBC,OAAa;AACjCA,MAAEF;AAAe;AAGnB,QAAMG,YAAYA,MAAM;AACtB,QAAIC,eAAe3E;AACnBoB,WAAOwD,OAAOvE,WAAWM,KAAK,EAAEW,QAASE,aAAY;AACnD,UAAIA,QAAQT,UAAUd,aAAa;AACjC0E,uBAAenD,QAAQZ,OAAOC;AAAS;AAEzCW,cAAQV,OAAOQ,QAASmC,gBAAe;AACrCA,mBAAW9C,MAAMqC,MAAMC,YAAY;AACnCQ,mBAAW9C,MAAMqC,MAAMU,aAAa;AACpCD,mBAAW9C,MAAMqC,MAAME,WAAW;AAClCO,mBAAW9C,MAAMqC,MAAMG,SAAS;AAAA,OACjC;AAAA,KACF;AACD,QAAIwB,iBAAiB3E,cAAc;AACjC,UAAIF,MAAMW,UAAUoE,YAAY;AAC9B/E,cAAMW,UAAUoE,WAAW7E,cAAc2E,YAAY;AAAA;AACvD;AAEF3E,mBAAe;AACf+D;AAEAe,WAAOC,oBAAoB,aAAaV,eAAe;AACvDS,WAAOC,oBAAoB,WAAWL,SAAS;AAC/CI,WAAOC,oBAAoB,cAAcP,YAAY;AAErDM,WAAOC,oBAAoB,aAAaT,eAAe;AACvDQ,WAAOC,oBAAoB,YAAYL,SAAS;AAChDI,WAAOC,oBAAoB,eAAeL,SAAS;AAAA;AAErD,QAAMM,kBAAkBA,CAACjD,OAAgCkD,UAA4B;AACnF,UAAMzC,YAAazC,UAAUyC,UAAkBC;AAE/CzC,mBAAeiF,MAAMrE,OAAOC;AAG5B,UAAMoB,UAAUH,WAAWC,KAAK;AAChC7B,wBAAoB+B,UAAUO,UAAUE;AAExC,UAAMwC,cAAc9D,OAAOwD,OAAOvE,WAAWM,KAAK,EAAEyC,KAAK,CAAC+B,GAAGC,MAAMD,EAAEpE,QAAQqE,EAAErE,KAAK;AACpF,UAAM;AAAA,MAAEsC;AAAAA,QAAQhD,WAAWM,MAAMX,cAAcc,OAAO,GAAGH,MAAM2B;AAC/DnC,mBAAe+E,YAAY,GAAGpE,OAAO,GAAGH,MAAM2B,wBAAwBe,MAAMA;AAC5EjD,mBAAe8E,YAAYA,YAAYlE,SAAS,GAAGF,OAAO,GAAGH,MAAM2B,wBAAwBe,MAAMA;AACjG,UAAM;AAAA,MAAEA,KAAKgC;AAAAA,MAAcjD,QAAQkD;AAAAA,QAAoB9C,UAAUF;AACjE,UAAM;AAAA,MAAEF,QAAQmD;AAAAA,QAAqB/C,UAAUgD,SAAS,GAAGlD;AAC3DqB,cAAU0B;AACVzB,iBAAa0B;AACbzB,kBAAc0B;AAGd,QAAI,aAAaxD,OAAO;AACtBuC,sBAAgBvC,KAAmB;AAAA,WAC9B;AACLsC,sBAAgBtC,KAAmB;AAAA;AAIrC+C,WAAOW,iBAAiB,aAAapB,eAAe;AACpDS,WAAOW,iBAAiB,WAAWf,SAAS;AAC5CI,WAAOW,iBAAiB,cAAcjB,cAAc;AAAA,MAAEkB,SAAS;AAAA,KAAO;AAGtEZ,WAAOW,iBAAiB,aAAanB,iBAAiB;AAAA,MAAEoB,SAAS;AAAA,KAAO;AACxEZ,WAAOW,iBAAiB,YAAYf,SAAS;AAC7CI,WAAOW,iBAAiB,eAAef,SAAS;AAEhD3C,UAAMwC;AAAe;AAGvB,QAAMoB,kBAAkBC,SAAS,MAAM;AACrC,QAAI9F,MAAMW,WAAW;AACnB,YAAMoF,SAAsB;AAAA,QAC1BtE,KAAK;AAAA,QACLuE,MAAM;AAAA,QACNC,OAAO;AAAA,QACPC,OAAO;AAAA,QACPC,QAAShB,WAAU;AACjB,iBAAAiB,YAAAC;YAAA,eAAoCpE,WAAmCiD,gBAAgBjD,OAAOkD,KAAK;AAAA;;AACrG;AAGF,UAAI,WAAWnF,MAAMW,WAAW;AAC9BoF,eAAOO,QAAQtG,MAAMW,UAAU2F;AAAAA,iBACtBtG,MAAMuG,QAAQC,KAAMC,OAAMA,EAAEH,UAAU,UAAUG,EAAEH,UAAU,IAAI,GAAG;AAC5EP,eAAOO,QAAQ;AAAA;AAEjB,aAAOP;AAAAA;AAET,WAAO;AAAA,GACR;AACD,SAAO;AAAA,IACLtF;AAAAA,IACAoF;AAAAA;AAEJ;;;;"}
|
|
@@ -15,9 +15,22 @@ const _sfc_main = defineComponent({
|
|
|
15
15
|
const handleDragStart = (e) => {
|
|
16
16
|
emit("dragStart", e);
|
|
17
17
|
};
|
|
18
|
+
const handleTouchStart = (e) => {
|
|
19
|
+
e.preventDefault();
|
|
20
|
+
const touch = e.touches[0];
|
|
21
|
+
const syntheticEvent = {
|
|
22
|
+
...e,
|
|
23
|
+
clientY: touch.clientY,
|
|
24
|
+
clientX: touch.clientX,
|
|
25
|
+
preventDefault: () => e.preventDefault(),
|
|
26
|
+
stopPropagation: () => e.stopPropagation()
|
|
27
|
+
};
|
|
28
|
+
emit("dragStart", syntheticEvent);
|
|
29
|
+
};
|
|
18
30
|
return {
|
|
19
31
|
prefixCls,
|
|
20
|
-
handleDragStart
|
|
32
|
+
handleDragStart,
|
|
33
|
+
handleTouchStart
|
|
21
34
|
};
|
|
22
35
|
}
|
|
23
36
|
});
|
|
@@ -26,13 +39,14 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
26
39
|
const _component_UIcon = resolveComponent("UIcon");
|
|
27
40
|
return openBlock(), createBlock(_component_UIcon, {
|
|
28
41
|
class: normalizeClass([`${_ctx.prefixCls}-draggable-icon`]),
|
|
29
|
-
onMousedown: _ctx.handleDragStart
|
|
42
|
+
onMousedown: _ctx.handleDragStart,
|
|
43
|
+
onTouchstart: _ctx.handleTouchStart
|
|
30
44
|
}, {
|
|
31
45
|
default: withCtx(() => [
|
|
32
46
|
createVNode(_component_GripVertical)
|
|
33
47
|
]),
|
|
34
48
|
_: 1
|
|
35
|
-
}, 8, ["class", "onMousedown"]);
|
|
49
|
+
}, 8, ["class", "onMousedown", "onTouchstart"]);
|
|
36
50
|
}
|
|
37
51
|
var DraggableIcon = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/Users/admin/Documents/uxd/uxd-ui/src/components/Table/tableUnits/DraggableIcon.vue"]]);
|
|
38
52
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DraggableIcon.mjs","sources":["../../../../../src/components/Table/tableUnits/DraggableIcon.vue"],"sourcesContent":["<template>\n <UIcon :class=\"[`${prefixCls}-draggable-icon`]\" @mousedown=\"handleDragStart\">\n <GripVertical />\n </UIcon>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject } from 'vue';\nimport UIcon from '@uxd-ui/components/Icon';\nimport { GripVertical } from 'lucide-vue-next';\nimport type { TableContext } from '../Table.type';\n\nexport default defineComponent({\n name: 'ExpandIcon',\n components: {\n UIcon,\n GripVertical\n },\n emits: ['dragStart'],\n setup(props, { emit }) {\n const { prefixCls } = inject<TableContext>('tableContext', {} as TableContext);\n\n const handleDragStart = (e: DragEvent) => {\n emit('dragStart', e);\n };\n\n return {\n prefixCls,\n handleDragStart\n };\n }\n});\n</script>\n"],"names":["_createBlock","_normalizeClass","_createVNode"],"mappings":";;;;;AAYA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,IACA;AAAA;AACF,EACA,OAAO,CAAC,WAAW;AAAA,EACnB,MAAM,OAAO,EAAE,QAAQ;UACf,EAAE,cAAc,OAAqB,gBAAgB,EAAkB;
|
|
1
|
+
{"version":3,"file":"DraggableIcon.mjs","sources":["../../../../../src/components/Table/tableUnits/DraggableIcon.vue"],"sourcesContent":["<template>\n <UIcon :class=\"[`${prefixCls}-draggable-icon`]\" @mousedown=\"handleDragStart\" @touchstart=\"handleTouchStart\">\n <GripVertical />\n </UIcon>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, inject } from 'vue';\nimport UIcon from '@uxd-ui/components/Icon';\nimport { GripVertical } from 'lucide-vue-next';\nimport type { TableContext } from '../Table.type';\n\nexport default defineComponent({\n name: 'ExpandIcon',\n components: {\n UIcon,\n GripVertical\n },\n emits: ['dragStart'],\n setup(props, { emit }) {\n const { prefixCls } = inject<TableContext>('tableContext', {} as TableContext);\n\n // Handle mouse drag start\n const handleDragStart = (e: DragEvent) => {\n emit('dragStart', e);\n };\n\n // Handle touch drag start for mobile devices\n const handleTouchStart = (e: TouchEvent) => {\n // Prevent default scrolling behavior\n e.preventDefault();\n // Convert touch event to a compatible format\n // Create a synthetic event object that mimics MouseEvent structure\n const touch = e.touches[0];\n const syntheticEvent = {\n ...e,\n clientY: touch.clientY,\n clientX: touch.clientX,\n preventDefault: () => e.preventDefault(),\n stopPropagation: () => e.stopPropagation()\n } as any;\n emit('dragStart', syntheticEvent);\n };\n\n return {\n prefixCls,\n handleDragStart,\n handleTouchStart\n };\n }\n});\n</script>\n"],"names":["_createBlock","_normalizeClass","_createVNode"],"mappings":";;;;;AAYA,MAAK,YAAa,gBAAa;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,IACV;AAAA,IACA;AAAA;AACF,EACA,OAAO,CAAC,WAAW;AAAA,EACnB,MAAM,OAAO,EAAE,QAAQ;UACf,EAAE,cAAc,OAAqB,gBAAgB,EAAkB;UAGvE,kBAAkB,CAAC,MAAiB;WACnC,aAAa,CAAC;AAAA;UAIf,mBAAmB,CAAC,MAAkB;QAExC;YAGI,QAAQ,EAAE,QAAQ;YAClB,iBAAiB;AAAA,QACrB,GAAG;AAAA,QACH,SAAS,MAAM;AAAA,QACf,SAAS,MAAM;AAAA,QACf,gBAAgB,MAAM,EAAE;AAAe,QACvC,iBAAiB,MAAM,EAAE;AAAgB;WAEtC,aAAa,cAAc;AAAA;WAG3B;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA;AACF;AAEJ,CAAC;;;;sBAjDCA,YAEQ;IAFA,OAAKC,mBAAM,+BAAS;IAAqB,aAAW;IAAkB,cAAY;;qBACxF,MAAgB;AAAA,MAAhBC,YAAgB;;;;;;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
declare const _default: import("vue").DefineComponent<{}, {
|
|
2
2
|
prefixCls: import("vue").ComputedRef<string>;
|
|
3
3
|
handleDragStart: (e: DragEvent) => void;
|
|
4
|
+
handleTouchStart: (e: TouchEvent) => void;
|
|
4
5
|
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "dragStart"[], "dragStart", import("vue").PublicProps, Readonly<{}> & Readonly<{
|
|
5
6
|
onDragStart?: (...args: any[]) => any;
|
|
6
7
|
}>, {}, {}, {
|
|
@@ -217,17 +217,17 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
217
217
|
}, {
|
|
218
218
|
default: vue.withCtx(() => [
|
|
219
219
|
vue.createElementVNode("div", {
|
|
220
|
-
class: vue.normalizeClass(`${_ctx.containerClass} ${_ctx.prefixCls}
|
|
220
|
+
class: vue.normalizeClass(`${_ctx.containerClass} ${_ctx.prefixCls}`),
|
|
221
221
|
style: vue.normalizeStyle(_ctx.wrapperStyle)
|
|
222
222
|
}, [
|
|
223
223
|
vue.createElementVNode("div", {
|
|
224
|
-
class: vue.normalizeClass(`${_ctx.prefixCls}`)
|
|
224
|
+
class: vue.normalizeClass(`${_ctx.prefixCls}-inner`)
|
|
225
225
|
}, [
|
|
226
226
|
vue.createElementVNode("div", {
|
|
227
|
-
class: vue.normalizeClass(`${_ctx.prefixCls}-ink`)
|
|
227
|
+
class: vue.normalizeClass(`${_ctx.prefixCls}-inner-ink`)
|
|
228
228
|
}, [
|
|
229
229
|
vue.withDirectives(vue.createElementVNode("span", {
|
|
230
|
-
class: vue.normalizeClass(`${_ctx.prefixCls}-ink-ball`),
|
|
230
|
+
class: vue.normalizeClass(`${_ctx.prefixCls}-inner-ink-ball`),
|
|
231
231
|
style: vue.normalizeStyle({ top: `${_ctx.inkTop}px` })
|
|
232
232
|
}, null, 6), [
|
|
233
233
|
[vue.vShow, _ctx.showInk]
|