@ebiz/designer-components 0.0.18-tj.1 → 0.0.19-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/designer-components.css +1 -1
- package/dist/index.mjs +66100 -52710
- package/package.json +1 -1
- package/src/apiService/mockDataService.js +116 -0
- package/src/apiService/simpleDataService.js +186 -80
- package/src/components/Button.vue +72 -22
- package/src/components/EbizAvatar.vue +116 -0
- package/src/components/EbizCheckbox.vue +94 -0
- package/src/components/EbizCheckboxGroup.vue +70 -0
- package/src/components/EbizDetailBlock.vue +82 -0
- package/src/components/EbizDialog.vue +249 -0
- package/src/components/EbizEmployeeInfo.vue +139 -0
- package/src/components/EbizPageHeader.vue +96 -0
- package/src/components/EbizPagination.vue +163 -0
- package/src/components/EbizRadio.vue +87 -0
- package/src/components/EbizRadioGroup.vue +84 -0
- package/src/components/EbizRemoteSelect.vue +107 -41
- package/src/components/EbizStatistic.vue +150 -0
- package/src/components/EbizSwiper.vue +3 -3
- package/src/components/EbizSwitch.vue +86 -0
- package/src/components/EbizTabHeader.vue +6 -10
- package/src/components/EbizTabPanel.vue +23 -0
- package/src/components/EbizTable.vue +466 -0
- package/src/components/EbizTableColumn.vue +117 -0
- package/src/components/EbizTableSort.vue +181 -0
- package/src/components/EbizTabs.vue +143 -0
- package/src/components/EbizTimePicker.vue +144 -0
- package/src/components/EbizTitle.vue +36 -37
- package/src/components/EbizTree.vue +153 -0
- package/src/components/EbizTreeSelector.vue +418 -0
- package/src/components/TdesignAlert.vue +116 -0
- package/src/components/TdesignCalendar/index.vue +6 -3
- package/src/components/TdesignCol.vue +102 -0
- package/src/components/TdesignDialog.vue +226 -0
- package/src/components/TdesignGrid.vue +56 -0
- package/src/components/TdesignInput.vue +23 -23
- package/src/components/TdesignTextarea.vue +143 -0
- package/src/components/TdesignTimeline.vue +58 -0
- package/src/components/TdesignTimelineItem.vue +72 -0
- package/src/components/TdesignUpload.vue +757 -0
- package/src/components/TdesignWatermark.vue +108 -0
- package/src/index.js +85 -0
- package/src/main.js +2 -2
- package/src/router/index.js +160 -5
- package/src/views/Button.vue +7 -3
- package/src/views/CheckboxDemo.vue +105 -0
- package/src/views/DialogDemo.vue +126 -0
- package/src/views/EbizAvatar.vue +224 -0
- package/src/views/EbizDetailBlockDemo.vue +31 -0
- package/src/views/EbizEmployeeInfo.vue +250 -0
- package/src/views/EbizRadioDemo.vue +152 -0
- package/src/views/GridDemo.vue +239 -0
- package/src/views/Home.vue +49 -2
- package/src/views/PageHeaderDemo.vue +105 -0
- package/src/views/PaginationDemo.vue +97 -0
- package/src/views/RemoteSelect.vue +336 -5
- package/src/views/StatisticDemo.vue +191 -0
- package/src/views/SwitchDemo.vue +80 -0
- package/src/views/TableDemo.vue +335 -0
- package/src/views/TableSortDemo.vue +144 -0
- package/src/views/TableView.vue +69 -0
- package/src/views/TabsDemo.vue +283 -0
- package/src/views/TdesignAlert.vue +99 -0
- package/src/views/TextareaDemo.vue +94 -0
- package/src/views/TimePickerDemo.vue +147 -0
- package/src/views/TimelineDemo.vue +161 -0
- package/src/views/TreeDemo.vue +255 -0
- package/src/views/TreeSelectorDemo.vue +246 -0
- package/src/views/UploadDemo.vue +122 -0
- package/src/views/WatermarkDemo.vue +86 -0
@@ -0,0 +1,226 @@
|
|
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
|
+
// 监听visible属性变化
|
150
|
+
watch(() => props.visible, (newValue) => {
|
151
|
+
isVisible.value = newValue;
|
152
|
+
});
|
153
|
+
|
154
|
+
// 定义事件
|
155
|
+
const emit = defineEmits([
|
156
|
+
'cancel',
|
157
|
+
'close',
|
158
|
+
'close-btn-click',
|
159
|
+
'confirm',
|
160
|
+
'esc-keydown',
|
161
|
+
'overlay-click',
|
162
|
+
'opened',
|
163
|
+
'closed',
|
164
|
+
'update:visible'
|
165
|
+
]);
|
166
|
+
|
167
|
+
// 取消按钮点击事件
|
168
|
+
const handleCancel = (e) => {
|
169
|
+
emit('cancel', { e });
|
170
|
+
emit('close', { trigger: 'cancel', e });
|
171
|
+
emit('update:visible', false);
|
172
|
+
};
|
173
|
+
|
174
|
+
// 关闭事件
|
175
|
+
const handleClose = (context) => {
|
176
|
+
emit('close', context);
|
177
|
+
emit('update:visible', false);
|
178
|
+
};
|
179
|
+
|
180
|
+
// 关闭按钮点击事件
|
181
|
+
const handleCloseBtnClick = (e) => {
|
182
|
+
emit('close-btn-click', { e });
|
183
|
+
emit('close', { trigger: 'close-btn', e });
|
184
|
+
emit('update:visible', false);
|
185
|
+
};
|
186
|
+
|
187
|
+
// 确认按钮点击事件
|
188
|
+
const handleConfirm = (e) => {
|
189
|
+
emit('confirm', { e });
|
190
|
+
emit('update:visible', false);
|
191
|
+
};
|
192
|
+
|
193
|
+
// ESC 按键按下事件
|
194
|
+
const handleEscKeydown = (e) => {
|
195
|
+
emit('esc-keydown', { e });
|
196
|
+
emit('close', { trigger: 'esc', e });
|
197
|
+
emit('update:visible', false);
|
198
|
+
};
|
199
|
+
|
200
|
+
// 遮罩层点击事件
|
201
|
+
const handleOverlayClick = (e) => {
|
202
|
+
emit('overlay-click', { e });
|
203
|
+
emit('close', { trigger: 'overlay', e });
|
204
|
+
emit('update:visible', false);
|
205
|
+
};
|
206
|
+
|
207
|
+
// 对话框打开完成事件
|
208
|
+
const handleOpened = () => {
|
209
|
+
emit('opened');
|
210
|
+
};
|
211
|
+
|
212
|
+
// 对话框关闭完成事件
|
213
|
+
const handleClosed = () => {
|
214
|
+
emit('closed');
|
215
|
+
};
|
216
|
+
|
217
|
+
// 更新可见状态
|
218
|
+
const handleUpdateVisible = (visible) => {
|
219
|
+
isVisible.value = visible;
|
220
|
+
emit('update:visible', visible);
|
221
|
+
};
|
222
|
+
</script>
|
223
|
+
|
224
|
+
<style lang="less" scoped>
|
225
|
+
/* 自定义样式 */
|
226
|
+
</style>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
<template>
|
2
|
+
<t-row
|
3
|
+
:align="align"
|
4
|
+
:justify="justify"
|
5
|
+
:gutter="gutter"
|
6
|
+
:tag="tag"
|
7
|
+
:gap="gap"
|
8
|
+
>
|
9
|
+
<slot></slot>
|
10
|
+
</t-row>
|
11
|
+
</template>
|
12
|
+
|
13
|
+
<script>
|
14
|
+
export default {
|
15
|
+
name: "EbizGrid"
|
16
|
+
}
|
17
|
+
</script>
|
18
|
+
|
19
|
+
<script setup>
|
20
|
+
import { defineProps, defineEmits } from 'vue';
|
21
|
+
import { Row as TRow } from 'tdesign-vue-next';
|
22
|
+
|
23
|
+
defineProps({
|
24
|
+
// 垂直对齐方式
|
25
|
+
align: {
|
26
|
+
type: String,
|
27
|
+
default: undefined,
|
28
|
+
validator: (val) => ['start', 'end', 'center', 'stretch', 'baseline'].includes(val)
|
29
|
+
},
|
30
|
+
// 水平排列方式
|
31
|
+
justify: {
|
32
|
+
type: String,
|
33
|
+
default: undefined,
|
34
|
+
validator: (val) => ['start', 'end', 'center', 'space-around', 'space-between'].includes(val)
|
35
|
+
},
|
36
|
+
// 栅格间隔,示例:16、[16, 16]
|
37
|
+
gutter: {
|
38
|
+
type: [Number, Array, Object],
|
39
|
+
default: 0
|
40
|
+
},
|
41
|
+
// 自定义元素标签
|
42
|
+
tag: {
|
43
|
+
type: String,
|
44
|
+
default: 'div'
|
45
|
+
},
|
46
|
+
// 间隔,示例:'0'、'xs' 或 { xs: '4px', sm: '6px', md: '12px' }
|
47
|
+
gap: {
|
48
|
+
type: [String, Number, Object, Array],
|
49
|
+
default: undefined
|
50
|
+
}
|
51
|
+
});
|
52
|
+
</script>
|
53
|
+
|
54
|
+
<style lang="less" scoped>
|
55
|
+
/* 自定义样式 */
|
56
|
+
</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,143 @@
|
|
1
|
+
<template>
|
2
|
+
<t-textarea
|
3
|
+
:value="modelValue"
|
4
|
+
:disabled="disabled"
|
5
|
+
:readonly="readonly"
|
6
|
+
:placeholder="placeholder"
|
7
|
+
:autofocus="autofocus"
|
8
|
+
:autosize="autosize"
|
9
|
+
:max-character="maxCharacter"
|
10
|
+
:max-length="maxLength"
|
11
|
+
:max-rows="maxRows"
|
12
|
+
:status="status"
|
13
|
+
:tips="tips"
|
14
|
+
:default-value="defaultValue"
|
15
|
+
@blur="handleBlur"
|
16
|
+
@change="handleChange"
|
17
|
+
@focus="handleFocus"
|
18
|
+
@keydown="handleKeydown"
|
19
|
+
@keypress="handleKeypress"
|
20
|
+
@keyup="handleKeyup"
|
21
|
+
@validate="handleValidate"
|
22
|
+
>
|
23
|
+
<!-- 默认插槽 -->
|
24
|
+
<slot></slot>
|
25
|
+
</t-textarea>
|
26
|
+
</template>
|
27
|
+
|
28
|
+
<script>
|
29
|
+
export default {
|
30
|
+
name: "EbizTextarea"
|
31
|
+
}
|
32
|
+
</script>
|
33
|
+
|
34
|
+
<script setup>
|
35
|
+
import { defineProps, defineEmits } from 'vue';
|
36
|
+
import { Textarea as TTextarea } from 'tdesign-vue-next';
|
37
|
+
|
38
|
+
const props = defineProps({
|
39
|
+
// 文本框值(v-model)
|
40
|
+
modelValue: {
|
41
|
+
type: [String, Number],
|
42
|
+
default: ''
|
43
|
+
},
|
44
|
+
// 文本框默认值
|
45
|
+
defaultValue: {
|
46
|
+
type: [String, Number],
|
47
|
+
default: ''
|
48
|
+
},
|
49
|
+
// 是否禁用文本框
|
50
|
+
disabled: {
|
51
|
+
type: Boolean,
|
52
|
+
default: false
|
53
|
+
},
|
54
|
+
// 是否只读
|
55
|
+
readonly: {
|
56
|
+
type: Boolean,
|
57
|
+
default: false
|
58
|
+
},
|
59
|
+
// 文本框占位符
|
60
|
+
placeholder: {
|
61
|
+
type: String,
|
62
|
+
default: ''
|
63
|
+
},
|
64
|
+
// 是否自动聚焦
|
65
|
+
autofocus: {
|
66
|
+
type: Boolean,
|
67
|
+
default: false
|
68
|
+
},
|
69
|
+
// 是否自动调整高度
|
70
|
+
autosize: {
|
71
|
+
type: [Boolean, Object],
|
72
|
+
default: false
|
73
|
+
},
|
74
|
+
// 用于控制组件是否显示最大字符数,值为 true 会显示组件字符数最大值
|
75
|
+
maxCharacter: {
|
76
|
+
type: [Number, Boolean],
|
77
|
+
default: false
|
78
|
+
},
|
79
|
+
// 用于控制输入框最大可输入的字符个数
|
80
|
+
maxLength: {
|
81
|
+
type: Number,
|
82
|
+
default: undefined
|
83
|
+
},
|
84
|
+
// 最大行数,当超出最大行数时,会自动出现滚动条
|
85
|
+
maxRows: {
|
86
|
+
type: Number,
|
87
|
+
default: undefined
|
88
|
+
},
|
89
|
+
// 文本框状态
|
90
|
+
status: {
|
91
|
+
type: String,
|
92
|
+
default: 'default',
|
93
|
+
validator: (val) => ['default', 'success', 'warning', 'error'].includes(val)
|
94
|
+
},
|
95
|
+
// 输入框下方提示文本
|
96
|
+
tips: {
|
97
|
+
type: [String, Function],
|
98
|
+
default: ''
|
99
|
+
}
|
100
|
+
});
|
101
|
+
|
102
|
+
const emit = defineEmits(['update:modelValue', 'blur', 'change', 'focus', 'keydown', 'keypress', 'keyup', 'validate']);
|
103
|
+
|
104
|
+
// 失去焦点事件
|
105
|
+
const handleBlur = (value, context) => {
|
106
|
+
emit('blur', value, context);
|
107
|
+
};
|
108
|
+
|
109
|
+
// 输入内容变化事件
|
110
|
+
const handleChange = (value, context) => {
|
111
|
+
emit('update:modelValue', value);
|
112
|
+
emit('change', value, context);
|
113
|
+
};
|
114
|
+
|
115
|
+
// 获得焦点事件
|
116
|
+
const handleFocus = (value, context) => {
|
117
|
+
emit('focus', value, context);
|
118
|
+
};
|
119
|
+
|
120
|
+
// 键盘按下事件
|
121
|
+
const handleKeydown = (value, context) => {
|
122
|
+
emit('keydown', value, context);
|
123
|
+
};
|
124
|
+
|
125
|
+
// 按下字符键事件
|
126
|
+
const handleKeypress = (value, context) => {
|
127
|
+
emit('keypress', value, context);
|
128
|
+
};
|
129
|
+
|
130
|
+
// 释放键盘事件
|
131
|
+
const handleKeyup = (value, context) => {
|
132
|
+
emit('keyup', value, context);
|
133
|
+
};
|
134
|
+
|
135
|
+
// 字数超出限制事件
|
136
|
+
const handleValidate = (context) => {
|
137
|
+
emit('validate', context);
|
138
|
+
};
|
139
|
+
</script>
|
140
|
+
|
141
|
+
<style lang="less" scoped>
|
142
|
+
/* 自定义样式 */
|
143
|
+
</style>
|
@@ -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>
|
@@ -0,0 +1,72 @@
|
|
1
|
+
<template>
|
2
|
+
<t-timeline-item
|
3
|
+
:content="content"
|
4
|
+
:dot="dot"
|
5
|
+
:dotColor="dotColor"
|
6
|
+
:label="label"
|
7
|
+
:labelAlign="labelAlign"
|
8
|
+
:loading="loading"
|
9
|
+
>
|
10
|
+
<!-- 时间轴点内容插槽 -->
|
11
|
+
<template v-if="$slots.dot" #dot>
|
12
|
+
<slot name="dot"></slot>
|
13
|
+
</template>
|
14
|
+
|
15
|
+
<!-- 标签内容插槽 -->
|
16
|
+
<template v-if="$slots.label" #label>
|
17
|
+
<slot name="label"></slot>
|
18
|
+
</template>
|
19
|
+
|
20
|
+
<!-- 默认插槽 -->
|
21
|
+
<slot>{{ content }}</slot>
|
22
|
+
</t-timeline-item>
|
23
|
+
</template>
|
24
|
+
|
25
|
+
<script>
|
26
|
+
export default {
|
27
|
+
name: "EbizTimelineItem"
|
28
|
+
}
|
29
|
+
</script>
|
30
|
+
|
31
|
+
<script setup>
|
32
|
+
import { defineProps } from 'vue';
|
33
|
+
import { TimelineItem as TTimelineItem } from 'tdesign-vue-next';
|
34
|
+
|
35
|
+
defineProps({
|
36
|
+
// 内容
|
37
|
+
content: {
|
38
|
+
type: String,
|
39
|
+
default: ''
|
40
|
+
},
|
41
|
+
// 时间轴点内容,可以是组件
|
42
|
+
dot: {
|
43
|
+
type: [String, Function],
|
44
|
+
default: ''
|
45
|
+
},
|
46
|
+
// 时间轴点颜色,内置 primary/warning/error/default 四种色值
|
47
|
+
dotColor: {
|
48
|
+
type: String,
|
49
|
+
default: ''
|
50
|
+
},
|
51
|
+
// 标签文本内容
|
52
|
+
label: {
|
53
|
+
type: String,
|
54
|
+
default: ''
|
55
|
+
},
|
56
|
+
// 标签位置,优先级高于 Timeline 中的 labelAlign
|
57
|
+
labelAlign: {
|
58
|
+
type: String,
|
59
|
+
default: '',
|
60
|
+
validator: (val) => ['left', 'right', 'top', 'bottom', 'auto', ''].includes(val)
|
61
|
+
},
|
62
|
+
// 是否处于加载状态
|
63
|
+
loading: {
|
64
|
+
type: Boolean,
|
65
|
+
default: false
|
66
|
+
}
|
67
|
+
});
|
68
|
+
</script>
|
69
|
+
|
70
|
+
<style lang="less" scoped>
|
71
|
+
/* 自定义样式 */
|
72
|
+
</style>
|