@ebiz/designer-components 0.0.18-beta.1 → 0.0.18-beta.10
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/package.json +1 -1
- package/src/apiService/mockDataService.js +116 -0
- package/src/apiService/simpleDataService.js +133 -131
- package/src/components/Button.vue +3 -2
- package/src/components/EbizAvatar.vue +116 -0
- package/src/components/EbizEmployeeInfo.vue +139 -0
- package/src/components/EbizRemoteSelect.vue +99 -41
- package/src/components/EbizStatistic.vue +150 -0
- package/src/components/EbizTabHeader.vue +6 -10
- package/src/components/EbizTabPanel.vue +23 -0
- package/src/components/EbizTabs.vue +143 -0
- package/src/components/TdesignAlert.vue +116 -0
- package/src/components/TdesignCalendar/index.vue +6 -3
- package/src/components/TdesignDialog.vue +221 -0
- package/src/components/TdesignInput.vue +23 -23
- package/src/components/TdesignTimeline.vue +58 -0
- package/src/components/TdesignTimelineItem.vue +72 -0
- package/src/components/TdesignUpload.vue +67 -98
- package/src/components/TdesignWatermark.vue +108 -0
- package/src/index.js +79 -45
- package/src/main.js +2 -2
- package/src/router/index.js +48 -0
- package/src/views/DialogDemo.vue +126 -0
- package/src/views/EbizAvatar.vue +224 -0
- package/src/views/EbizEmployeeInfo.vue +250 -0
- package/src/views/Home.vue +9 -1
- package/src/views/RemoteSelect.vue +336 -5
- package/src/views/StatisticDemo.vue +191 -0
- package/src/views/TabsDemo.vue +283 -0
- package/src/views/TdesignAlert.vue +99 -0
- package/src/views/TimelineDemo.vue +161 -0
- package/src/views/WatermarkDemo.vue +86 -0
@@ -0,0 +1,143 @@
|
|
1
|
+
<template>
|
2
|
+
<div class="tdesign-tabs-wrapper">
|
3
|
+
<t-tabs
|
4
|
+
v-model="innerValue"
|
5
|
+
:addable="addable"
|
6
|
+
:disabled="disabled"
|
7
|
+
:placement="placement"
|
8
|
+
:size="size"
|
9
|
+
:theme="theme"
|
10
|
+
:list="list"
|
11
|
+
:dragSort="dragSort"
|
12
|
+
@add="handleAdd"
|
13
|
+
@change="handleChange"
|
14
|
+
@dragSort="handleDragSort"
|
15
|
+
@remove="handleRemove"
|
16
|
+
>
|
17
|
+
<!-- 添加按钮插槽 -->
|
18
|
+
<template v-if="$slots.action" #action>
|
19
|
+
<slot name="action"></slot>
|
20
|
+
</template>
|
21
|
+
|
22
|
+
<!-- 直接输出默认插槽内容,这里应该只包含EbizTabPanel -->
|
23
|
+
<slot></slot>
|
24
|
+
</t-tabs>
|
25
|
+
</div>
|
26
|
+
</template>
|
27
|
+
|
28
|
+
<script>
|
29
|
+
import { Tabs as TTabs } from 'tdesign-vue-next';
|
30
|
+
import { defineComponent, toRefs, computed, watch } from 'vue';
|
31
|
+
|
32
|
+
export default defineComponent({
|
33
|
+
name: 'EbizTabs',
|
34
|
+
components: {
|
35
|
+
't-tabs': TTabs,
|
36
|
+
},
|
37
|
+
props: {
|
38
|
+
// v-model绑定值
|
39
|
+
modelValue: {
|
40
|
+
type: [String, Number],
|
41
|
+
},
|
42
|
+
// 默认值
|
43
|
+
defaultValue: {
|
44
|
+
type: [String, Number],
|
45
|
+
},
|
46
|
+
// 选项卡右侧的操作区域
|
47
|
+
action: {
|
48
|
+
type: [Function, String],
|
49
|
+
default: undefined
|
50
|
+
},
|
51
|
+
// 选项卡是否可增加
|
52
|
+
addable: {
|
53
|
+
type: Boolean,
|
54
|
+
default: false
|
55
|
+
},
|
56
|
+
// 是否禁用选项卡
|
57
|
+
disabled: {
|
58
|
+
type: Boolean,
|
59
|
+
default: false
|
60
|
+
},
|
61
|
+
// 是否开启拖拽调整顺序
|
62
|
+
dragSort: {
|
63
|
+
type: Boolean,
|
64
|
+
default: false
|
65
|
+
},
|
66
|
+
// 选项卡列表
|
67
|
+
list: {
|
68
|
+
type: Array,
|
69
|
+
},
|
70
|
+
// 选项卡位置
|
71
|
+
placement: {
|
72
|
+
type: String,
|
73
|
+
default: 'top',
|
74
|
+
validator: (val) => ['top', 'bottom', 'left', 'right'].includes(val)
|
75
|
+
},
|
76
|
+
// 组件尺寸
|
77
|
+
size: {
|
78
|
+
type: String,
|
79
|
+
default: 'medium',
|
80
|
+
validator: (val) => ['medium', 'large'].includes(val)
|
81
|
+
},
|
82
|
+
// 选项卡风格
|
83
|
+
theme: {
|
84
|
+
type: String,
|
85
|
+
default: 'normal',
|
86
|
+
validator: (val) => ['normal', 'card'].includes(val)
|
87
|
+
}
|
88
|
+
},
|
89
|
+
emits: ['update:modelValue', 'add', 'change', 'dragSort', 'remove'],
|
90
|
+
setup(props, { emit }) {
|
91
|
+
const { modelValue, defaultValue } = toRefs(props);
|
92
|
+
|
93
|
+
// 内部值计算属性,用于双向绑定
|
94
|
+
const innerValue = computed({
|
95
|
+
get: () => modelValue.value !== undefined ? modelValue.value : defaultValue.value,
|
96
|
+
set: (val) => {
|
97
|
+
emit('update:modelValue', val);
|
98
|
+
}
|
99
|
+
});
|
100
|
+
|
101
|
+
// 监听modelValue变化
|
102
|
+
watch(modelValue, (newVal) => {
|
103
|
+
if (newVal !== innerValue.value) {
|
104
|
+
innerValue.value = newVal;
|
105
|
+
}
|
106
|
+
});
|
107
|
+
|
108
|
+
// 添加选项卡事件
|
109
|
+
const handleAdd = (context) => {
|
110
|
+
emit('add', context);
|
111
|
+
};
|
112
|
+
|
113
|
+
// 选项卡切换事件
|
114
|
+
const handleChange = (value, context) => {
|
115
|
+
emit('change', value, context);
|
116
|
+
};
|
117
|
+
|
118
|
+
// 拖拽排序事件
|
119
|
+
const handleDragSort = (context) => {
|
120
|
+
emit('dragSort', context);
|
121
|
+
};
|
122
|
+
|
123
|
+
// 删除选项卡事件
|
124
|
+
const handleRemove = (options) => {
|
125
|
+
emit('remove', options);
|
126
|
+
};
|
127
|
+
|
128
|
+
return {
|
129
|
+
innerValue,
|
130
|
+
handleAdd,
|
131
|
+
handleChange,
|
132
|
+
handleDragSort,
|
133
|
+
handleRemove
|
134
|
+
};
|
135
|
+
}
|
136
|
+
});
|
137
|
+
</script>
|
138
|
+
|
139
|
+
<style lang="less" scoped>
|
140
|
+
.tdesign-tabs-wrapper {
|
141
|
+
width: 100%;
|
142
|
+
}
|
143
|
+
</style>
|
@@ -0,0 +1,116 @@
|
|
1
|
+
<template>
|
2
|
+
<t-alert
|
3
|
+
:theme="theme"
|
4
|
+
:title="title"
|
5
|
+
:message="message"
|
6
|
+
:icon="icon"
|
7
|
+
:close="close"
|
8
|
+
:maxLine="maxLine"
|
9
|
+
:operation="operation"
|
10
|
+
:description="description"
|
11
|
+
:close-btn="closeBtn"
|
12
|
+
:default-open="defaultOpen"
|
13
|
+
@close="handleClose"
|
14
|
+
>
|
15
|
+
<!-- 标题插槽 -->
|
16
|
+
<template v-if="$slots.title" #title>
|
17
|
+
<slot name="title"></slot>
|
18
|
+
</template>
|
19
|
+
|
20
|
+
<!-- 内容插槽 -->
|
21
|
+
<template v-if="$slots.default">
|
22
|
+
<slot></slot>
|
23
|
+
</template>
|
24
|
+
|
25
|
+
<!-- 操作区插槽 -->
|
26
|
+
<template v-if="$slots.operation" #operation>
|
27
|
+
<slot name="operation"></slot>
|
28
|
+
</template>
|
29
|
+
|
30
|
+
<!-- 关闭按钮插槽 -->
|
31
|
+
<template v-if="$slots['close-btn']" #close-btn>
|
32
|
+
<slot name="close-btn"></slot>
|
33
|
+
</template>
|
34
|
+
|
35
|
+
<!-- 图标插槽 -->
|
36
|
+
<template v-if="$slots.icon" #icon>
|
37
|
+
<slot name="icon"></slot>
|
38
|
+
</template>
|
39
|
+
</t-alert>
|
40
|
+
</template>
|
41
|
+
|
42
|
+
<script>
|
43
|
+
export default {
|
44
|
+
name: "EbizAlert"
|
45
|
+
}
|
46
|
+
</script>
|
47
|
+
|
48
|
+
<script setup>
|
49
|
+
import { defineProps, defineEmits } from 'vue';
|
50
|
+
import { Alert as TAlert } from 'tdesign-vue-next';
|
51
|
+
|
52
|
+
const props = defineProps({
|
53
|
+
// 主题
|
54
|
+
theme: {
|
55
|
+
type: String,
|
56
|
+
default: 'info',
|
57
|
+
validator: (val) => ['success', 'info', 'warning', 'error'].includes(val)
|
58
|
+
},
|
59
|
+
// 标题
|
60
|
+
title: {
|
61
|
+
type: String,
|
62
|
+
default: ''
|
63
|
+
},
|
64
|
+
// 内容
|
65
|
+
message: {
|
66
|
+
type: String,
|
67
|
+
default: ''
|
68
|
+
},
|
69
|
+
// 图标
|
70
|
+
icon: {
|
71
|
+
type: [Boolean, Function],
|
72
|
+
default: true
|
73
|
+
},
|
74
|
+
// 关闭按钮
|
75
|
+
close: {
|
76
|
+
type: Boolean,
|
77
|
+
default: false
|
78
|
+
},
|
79
|
+
// 内容显示最大行数
|
80
|
+
maxLine: {
|
81
|
+
type: Number,
|
82
|
+
default: 0
|
83
|
+
},
|
84
|
+
// 操作区内容
|
85
|
+
operation: {
|
86
|
+
type: [String, Function],
|
87
|
+
default: ''
|
88
|
+
},
|
89
|
+
// 描述内容
|
90
|
+
description: {
|
91
|
+
type: String,
|
92
|
+
default: ''
|
93
|
+
},
|
94
|
+
// 关闭按钮内容
|
95
|
+
closeBtn: {
|
96
|
+
type: [String, Function, Boolean],
|
97
|
+
default: undefined
|
98
|
+
},
|
99
|
+
// 默认是否显示打开
|
100
|
+
defaultOpen: {
|
101
|
+
type: Boolean,
|
102
|
+
default: true
|
103
|
+
}
|
104
|
+
});
|
105
|
+
|
106
|
+
const emit = defineEmits(['close']);
|
107
|
+
|
108
|
+
// 关闭事件
|
109
|
+
const handleClose = (e) => {
|
110
|
+
emit('close', e);
|
111
|
+
};
|
112
|
+
</script>
|
113
|
+
|
114
|
+
<style lang="less" scoped>
|
115
|
+
/* 自定义样式 */
|
116
|
+
</style>
|
@@ -14,7 +14,7 @@
|
|
14
14
|
:month-change="monthChange"
|
15
15
|
:render-cell="renderCell"
|
16
16
|
:theme="theme"
|
17
|
-
:value="
|
17
|
+
:value="modelValue"
|
18
18
|
:year="year"
|
19
19
|
@cell-click="handleCellClick"
|
20
20
|
@cell-double-click="handleCellDoubleClick"
|
@@ -111,7 +111,7 @@ export default {
|
|
111
111
|
default: 'full',
|
112
112
|
validator: (val) => ['full', 'card'].includes(val)
|
113
113
|
},
|
114
|
-
|
114
|
+
modelValue: {
|
115
115
|
type: [String, Number, Array, Date],
|
116
116
|
default: null
|
117
117
|
},
|
@@ -120,10 +120,13 @@ export default {
|
|
120
120
|
default: undefined
|
121
121
|
}
|
122
122
|
},
|
123
|
-
emits: ['cell-click', 'cell-double-click', 'cell-right-click', 'month-change'],
|
123
|
+
emits: ['cell-click', 'cell-double-click', 'cell-right-click', 'month-change', 'update:modelValue'],
|
124
124
|
methods: {
|
125
125
|
handleCellClick(options) {
|
126
126
|
this.$emit('cell-click', options)
|
127
|
+
if (options && options.date) {
|
128
|
+
this.$emit('update:modelValue', options.date)
|
129
|
+
}
|
127
130
|
},
|
128
131
|
handleCellDoubleClick(options) {
|
129
132
|
this.$emit('cell-double-click', options)
|
@@ -0,0 +1,221 @@
|
|
1
|
+
<template>
|
2
|
+
<t-dialog v-model:visible="isVisible" :attach="attach" :body="body" :cancel-btn="cancelBtn" :close-btn="closeBtn"
|
3
|
+
:close-on-esc-keydown="closeOnEscKeydown" :close-on-overlay-click="closeOnOverlayClick"
|
4
|
+
:confirm-btn="confirmBtn" :default-visible="defaultVisible" :destroy-on-close="destroyOnClose"
|
5
|
+
:draggable="draggable" :footer="footer" :header="header" :mode="mode" :placement="placement"
|
6
|
+
:show-overlay="showOverlay" :width="width" :z-index="zIndex" @cancel="handleCancel" @close="handleClose"
|
7
|
+
@close-btn-click="handleCloseBtnClick" @confirm="handleConfirm" @esc-keydown="handleEscKeydown"
|
8
|
+
@overlay-click="handleOverlayClick" @opened="handleOpened" @closed="handleClosed"
|
9
|
+
@update:visible="handleUpdateVisible">
|
10
|
+
<!-- 头部插槽 -->
|
11
|
+
<template v-if="$slots.header" #header>
|
12
|
+
<slot name="header"></slot>
|
13
|
+
</template>
|
14
|
+
|
15
|
+
<!-- 内容插槽 -->
|
16
|
+
<template v-if="$slots.body" #body>
|
17
|
+
<slot name="body"></slot>
|
18
|
+
</template>
|
19
|
+
|
20
|
+
<!-- 默认插槽 -->
|
21
|
+
<slot></slot>
|
22
|
+
|
23
|
+
<!-- 页脚插槽 -->
|
24
|
+
<template v-if="$slots.footer" #footer>
|
25
|
+
<slot name="footer"></slot>
|
26
|
+
</template>
|
27
|
+
|
28
|
+
<!-- 取消按钮插槽 -->
|
29
|
+
<template v-if="$slots.cancelBtn" #cancel-btn>
|
30
|
+
<slot name="cancelBtn"></slot>
|
31
|
+
</template>
|
32
|
+
|
33
|
+
<!-- 确认按钮插槽 -->
|
34
|
+
<template v-if="$slots.confirmBtn" #confirm-btn>
|
35
|
+
<slot name="confirmBtn"></slot>
|
36
|
+
</template>
|
37
|
+
</t-dialog>
|
38
|
+
</template>
|
39
|
+
|
40
|
+
<script>
|
41
|
+
export default {
|
42
|
+
name: "EbizDialog"
|
43
|
+
}
|
44
|
+
</script>
|
45
|
+
|
46
|
+
<script setup>
|
47
|
+
import { ref, watch } from 'vue';
|
48
|
+
import { Dialog as TDialog } from 'tdesign-vue-next';
|
49
|
+
|
50
|
+
// 定义属性
|
51
|
+
const props = defineProps({
|
52
|
+
// 对话框挂载的节点
|
53
|
+
attach: {
|
54
|
+
type: [String, Function, Element],
|
55
|
+
default: 'body'
|
56
|
+
},
|
57
|
+
// 对话框内容
|
58
|
+
body: {
|
59
|
+
type: [String, Function],
|
60
|
+
default: ''
|
61
|
+
},
|
62
|
+
// 取消按钮,可自定义。值为 null 则不显示取消按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性
|
63
|
+
cancelBtn: {
|
64
|
+
type: [String, Object, null],
|
65
|
+
default: ''
|
66
|
+
},
|
67
|
+
// 关闭按钮,值为 true 显示默认关闭按钮;值为 false 则不显示关闭按钮;值类型为 string 则直接显示值;值类型为 TNode,则显示自定义按钮
|
68
|
+
closeBtn: {
|
69
|
+
type: [Boolean, String, Function],
|
70
|
+
default: true
|
71
|
+
},
|
72
|
+
// 按下 ESC 时是否触发对话框关闭
|
73
|
+
closeOnEscKeydown: {
|
74
|
+
type: Boolean,
|
75
|
+
default: undefined
|
76
|
+
},
|
77
|
+
// 点击蒙层时是否触发关闭
|
78
|
+
closeOnOverlayClick: {
|
79
|
+
type: Boolean,
|
80
|
+
default: undefined
|
81
|
+
},
|
82
|
+
// 确认按钮,可自定义。值为 null 则不显示确认按钮。值类型为字符串,则表示自定义按钮文本,值类型为 Object 则表示透传 Button 组件属性
|
83
|
+
confirmBtn: {
|
84
|
+
type: [String, Object, null],
|
85
|
+
default: ''
|
86
|
+
},
|
87
|
+
// 对话框默认是否显示
|
88
|
+
defaultVisible: {
|
89
|
+
type: Boolean,
|
90
|
+
default: false
|
91
|
+
},
|
92
|
+
// 是否在关闭弹框的时候销毁子元素
|
93
|
+
destroyOnClose: {
|
94
|
+
type: Boolean,
|
95
|
+
default: false
|
96
|
+
},
|
97
|
+
// 对话框是否可以拖拽
|
98
|
+
draggable: {
|
99
|
+
type: Boolean,
|
100
|
+
default: false
|
101
|
+
},
|
102
|
+
// 底部操作栏,默认会有"确认"和"取消"两个按钮
|
103
|
+
footer: {
|
104
|
+
type: [Boolean, Function],
|
105
|
+
default: true
|
106
|
+
},
|
107
|
+
// 头部内容
|
108
|
+
header: {
|
109
|
+
type: [String, Boolean, Function],
|
110
|
+
default: true
|
111
|
+
},
|
112
|
+
// 对话框类型
|
113
|
+
mode: {
|
114
|
+
type: String,
|
115
|
+
default: 'modal',
|
116
|
+
validator: (val) => ['modal', 'modeless', 'full-screen'].includes(val)
|
117
|
+
},
|
118
|
+
// 对话框位置,类似 CSS 中的 position
|
119
|
+
placement: {
|
120
|
+
type: String,
|
121
|
+
default: 'top',
|
122
|
+
validator: (val) => ['top', 'center'].includes(val)
|
123
|
+
},
|
124
|
+
// 是否显示遮罩层
|
125
|
+
showOverlay: {
|
126
|
+
type: Boolean,
|
127
|
+
default: true
|
128
|
+
},
|
129
|
+
// 控制对话框显示与隐藏
|
130
|
+
visible: {
|
131
|
+
type: Boolean,
|
132
|
+
default: undefined
|
133
|
+
},
|
134
|
+
// 对话框宽度
|
135
|
+
width: {
|
136
|
+
type: [String, Number],
|
137
|
+
default: undefined
|
138
|
+
},
|
139
|
+
// 对话框层级
|
140
|
+
zIndex: {
|
141
|
+
type: Number,
|
142
|
+
default: undefined
|
143
|
+
}
|
144
|
+
});
|
145
|
+
|
146
|
+
// 显示状态
|
147
|
+
const isVisible = ref(props.visible);
|
148
|
+
|
149
|
+
// 定义事件
|
150
|
+
const emit = defineEmits([
|
151
|
+
'cancel',
|
152
|
+
'close',
|
153
|
+
'close-btn-click',
|
154
|
+
'confirm',
|
155
|
+
'esc-keydown',
|
156
|
+
'overlay-click',
|
157
|
+
'opened',
|
158
|
+
'closed',
|
159
|
+
'update:visible'
|
160
|
+
]);
|
161
|
+
|
162
|
+
// 取消按钮点击事件
|
163
|
+
const handleCancel = (e) => {
|
164
|
+
emit('cancel', { e });
|
165
|
+
emit('close', { trigger: 'cancel', e });
|
166
|
+
emit('update:visible', false);
|
167
|
+
};
|
168
|
+
|
169
|
+
// 关闭事件
|
170
|
+
const handleClose = (context) => {
|
171
|
+
emit('close', context);
|
172
|
+
emit('update:visible', false);
|
173
|
+
};
|
174
|
+
|
175
|
+
// 关闭按钮点击事件
|
176
|
+
const handleCloseBtnClick = (e) => {
|
177
|
+
emit('close-btn-click', { e });
|
178
|
+
emit('close', { trigger: 'close-btn', e });
|
179
|
+
emit('update:visible', false);
|
180
|
+
};
|
181
|
+
|
182
|
+
// 确认按钮点击事件
|
183
|
+
const handleConfirm = (e) => {
|
184
|
+
emit('confirm', { e });
|
185
|
+
emit('update:visible', false);
|
186
|
+
};
|
187
|
+
|
188
|
+
// ESC 按键按下事件
|
189
|
+
const handleEscKeydown = (e) => {
|
190
|
+
emit('esc-keydown', { e });
|
191
|
+
emit('close', { trigger: 'esc', e });
|
192
|
+
emit('update:visible', false);
|
193
|
+
};
|
194
|
+
|
195
|
+
// 遮罩层点击事件
|
196
|
+
const handleOverlayClick = (e) => {
|
197
|
+
emit('overlay-click', { e });
|
198
|
+
emit('close', { trigger: 'overlay', e });
|
199
|
+
emit('update:visible', false);
|
200
|
+
};
|
201
|
+
|
202
|
+
// 对话框打开完成事件
|
203
|
+
const handleOpened = () => {
|
204
|
+
emit('opened');
|
205
|
+
};
|
206
|
+
|
207
|
+
// 对话框关闭完成事件
|
208
|
+
const handleClosed = () => {
|
209
|
+
emit('closed');
|
210
|
+
};
|
211
|
+
|
212
|
+
// 更新可见状态
|
213
|
+
const handleUpdateVisible = (visible) => {
|
214
|
+
isVisible.value = visible;
|
215
|
+
emit('update:visible', visible);
|
216
|
+
};
|
217
|
+
</script>
|
218
|
+
|
219
|
+
<style lang="less" scoped>
|
220
|
+
/* 自定义样式 */
|
221
|
+
</style>
|
@@ -181,60 +181,60 @@ const emit = defineEmits([
|
|
181
181
|
]);
|
182
182
|
|
183
183
|
// 处理输入事件
|
184
|
-
const handleInput = (value,
|
185
|
-
emit('
|
186
|
-
emit('input', value, { e });
|
184
|
+
const handleInput = (value, context) => {
|
185
|
+
emit('input', value, context);
|
187
186
|
};
|
188
187
|
|
189
188
|
// 处理变化事件
|
190
|
-
const handleChange = (value,
|
191
|
-
emit('
|
189
|
+
const handleChange = (value, context) => {
|
190
|
+
emit('update:modelValue', value);
|
191
|
+
emit('change', value, context);
|
192
192
|
};
|
193
193
|
|
194
194
|
// 处理失去焦点事件
|
195
|
-
const handleBlur = (value,
|
196
|
-
emit('blur', value,
|
195
|
+
const handleBlur = (value, context) => {
|
196
|
+
emit('blur', value, context);
|
197
197
|
};
|
198
198
|
|
199
199
|
// 处理获取焦点事件
|
200
|
-
const handleFocus = (value,
|
201
|
-
emit('focus', value,
|
200
|
+
const handleFocus = (value, context) => {
|
201
|
+
emit('focus', value, context);
|
202
202
|
};
|
203
203
|
|
204
204
|
// 处理回车事件
|
205
|
-
const handleEnter = (value,
|
206
|
-
emit('enter', value,
|
205
|
+
const handleEnter = (value, context) => {
|
206
|
+
emit('enter', value, context);
|
207
207
|
};
|
208
208
|
|
209
209
|
// 处理清空事件
|
210
|
-
const handleClear = (
|
210
|
+
const handleClear = (context) => {
|
211
211
|
emit('update:modelValue', '');
|
212
|
-
emit('clear',
|
212
|
+
emit('clear', context);
|
213
213
|
};
|
214
214
|
|
215
215
|
// 处理键盘按下事件
|
216
|
-
const handleKeydown = (value,
|
217
|
-
emit('keydown', value,
|
216
|
+
const handleKeydown = (value, context) => {
|
217
|
+
emit('keydown', value, context);
|
218
218
|
};
|
219
219
|
|
220
220
|
// 处理键盘按键事件
|
221
|
-
const handleKeypress = (value,
|
222
|
-
emit('keypress', value,
|
221
|
+
const handleKeypress = (value, context) => {
|
222
|
+
emit('keypress', value, context);
|
223
223
|
};
|
224
224
|
|
225
225
|
// 处理键盘弹起事件
|
226
|
-
const handleKeyup = (value,
|
227
|
-
emit('keyup', value,
|
226
|
+
const handleKeyup = (value, context) => {
|
227
|
+
emit('keyup', value, context);
|
228
228
|
};
|
229
229
|
|
230
230
|
// 处理鼠标进入事件
|
231
|
-
const handleMouseenter = (value,
|
232
|
-
emit('mouseenter', value,
|
231
|
+
const handleMouseenter = (value, context) => {
|
232
|
+
emit('mouseenter', value, context);
|
233
233
|
};
|
234
234
|
|
235
235
|
// 处理鼠标离开事件
|
236
|
-
const handleMouseleave = (value,
|
237
|
-
emit('mouseleave', value,
|
236
|
+
const handleMouseleave = (value, context) => {
|
237
|
+
emit('mouseleave', value, context);
|
238
238
|
};
|
239
239
|
</script>
|
240
240
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
<template>
|
2
|
+
<t-timeline
|
3
|
+
:layout="layout"
|
4
|
+
:labelAlign="labelAlign"
|
5
|
+
:mode="mode"
|
6
|
+
:reverse="reverse"
|
7
|
+
:theme="theme"
|
8
|
+
>
|
9
|
+
<slot></slot>
|
10
|
+
</t-timeline>
|
11
|
+
</template>
|
12
|
+
|
13
|
+
<script>
|
14
|
+
export default {
|
15
|
+
name: "EbizTimeline"
|
16
|
+
}
|
17
|
+
</script>
|
18
|
+
|
19
|
+
<script setup>
|
20
|
+
import { defineProps, defineEmits } from 'vue';
|
21
|
+
import { Timeline as TTimeline } from 'tdesign-vue-next';
|
22
|
+
|
23
|
+
defineProps({
|
24
|
+
// 布局方向
|
25
|
+
layout: {
|
26
|
+
type: String,
|
27
|
+
default: 'vertical',
|
28
|
+
validator: (val) => ['horizontal', 'vertical'].includes(val)
|
29
|
+
},
|
30
|
+
// 标签位置
|
31
|
+
labelAlign: {
|
32
|
+
type: String,
|
33
|
+
default: 'auto',
|
34
|
+
validator: (val) => ['left', 'right', 'top', 'bottom', 'auto'].includes(val)
|
35
|
+
},
|
36
|
+
// 展示类型
|
37
|
+
mode: {
|
38
|
+
type: String,
|
39
|
+
default: 'alternate',
|
40
|
+
validator: (val) => ['alternate', 'same', 'left', 'right'].includes(val)
|
41
|
+
},
|
42
|
+
// 是否倒序排列
|
43
|
+
reverse: {
|
44
|
+
type: Boolean,
|
45
|
+
default: false
|
46
|
+
},
|
47
|
+
// 主题风格
|
48
|
+
theme: {
|
49
|
+
type: String,
|
50
|
+
default: 'default',
|
51
|
+
validator: (val) => ['default', 'dot'].includes(val)
|
52
|
+
}
|
53
|
+
});
|
54
|
+
</script>
|
55
|
+
|
56
|
+
<style lang="less" scoped>
|
57
|
+
/* 自定义样式 */
|
58
|
+
</style>
|