xt-element-ui 2.1.4 → 2.1.6
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/docs/components/base/xt-date-picker.md +127 -37
- package/docs/components/base/xt-form-schema.md +358 -0
- package/docs/components/base/xt-grid-box.md +4 -4
- package/docs/components/base/xt-input.md +204 -42
- package/docs/components/base/xt-list.md +458 -458
- package/docs/components/base/xt-text.md +1 -0
- package/docs/components/base/xt-transfer-tree.md +272 -0
- package/docs/components/utils/config.md +285 -0
- package/docs/components/utils/format.md +445 -0
- package/lib/index.common.js +93128 -112769
- package/lib/index.css +1 -1
- package/lib/index.umd.js +93128 -112769
- package/lib/index.umd.min.js +1 -34
- package/package.json +4 -2
- package/src/components/xt-date-picker/component/Picker.vue +196 -0
- package/src/components/xt-date-picker/component/RangeDate.vue +136 -0
- package/src/components/xt-date-picker/index.vue +164 -144
- package/src/components/xt-flex-box/index.vue +1 -1
- package/src/components/xt-form-schema/index.js +8 -0
- package/src/components/xt-form-schema/index.vue +328 -0
- package/src/components/xt-grid-item/index.vue +2 -2
- package/src/components/xt-input/index.vue +224 -28
- package/src/components/xt-input/style/index.scss +10 -0
- package/src/components/xt-list/index.js +7 -7
- package/src/components/xt-list/index.vue +885 -885
- package/src/components/xt-text/index.vue +16 -4
- package/src/components/xt-transfer-tree/index.js +8 -0
- package/src/components/xt-transfer-tree/index.vue +494 -0
- package/src/index.js +8 -2
- package/src/utils/index.js +278 -1
- package/src/components/xt-date-picker/SearchDate.vue +0 -45
- package/src/components/xt-date-picker/quarter.vue +0 -154
- package/src/components/xt-table/index copy.vue +0 -663
|
@@ -1,89 +1,153 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="xt-date-picker-container">
|
|
3
|
+
<!-- 维度切换单选:日/月/年/自定义区间 -->
|
|
3
4
|
<div v-if="showDimension" class="xt-date-dimension">
|
|
4
5
|
<el-radio-group v-model="dimension" size="small">
|
|
5
6
|
<el-radio-button label="date">日</el-radio-button>
|
|
6
7
|
<el-radio-button label="month">月</el-radio-button>
|
|
7
8
|
<el-radio-button label="year">年</el-radio-button>
|
|
8
|
-
<el-radio-button label="
|
|
9
|
+
<el-radio-button label="daterange">自定义</el-radio-button>
|
|
9
10
|
</el-radio-group>
|
|
10
11
|
</div>
|
|
11
12
|
|
|
12
13
|
<div class="xt-date-picker-wrapper">
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
<!-- 区间模式 -->
|
|
15
|
+
<RangeDate
|
|
16
|
+
v-if="useRangeMode"
|
|
17
|
+
v-model="rangeValue"
|
|
18
|
+
:type="rangeDateType"
|
|
19
|
+
:separator="separator"
|
|
20
|
+
:disabled="disabled"
|
|
21
|
+
class="xt-date"
|
|
22
|
+
:class="{ focus: isfocus }"
|
|
23
|
+
:style="width ? { width: `${width}px` } : {}"
|
|
24
|
+
@focus="isfocus = true; $emit('focus')"
|
|
25
|
+
@blur="isfocus = false; $emit('blur')"
|
|
26
|
+
/>
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
28
|
+
<!-- 单选模式:日/月/年/周 -->
|
|
29
|
+
<el-date-picker
|
|
30
|
+
v-if="!useRangeMode && realDateType !== 'quarter'"
|
|
31
|
+
ref="singlePicker"
|
|
32
|
+
v-model="singleValue"
|
|
33
|
+
size="small"
|
|
34
|
+
:disabled="disabled"
|
|
35
|
+
append-to-body
|
|
36
|
+
:format="format"
|
|
37
|
+
:type="realDateType"
|
|
38
|
+
:placeholder="innerPlaceholder"
|
|
39
|
+
clearable
|
|
40
|
+
@focus="isfocus = true; $emit('focus')"
|
|
41
|
+
@blur="isfocus = false; $emit('blur')"
|
|
42
|
+
/>
|
|
43
|
+
<!-- 单选模式:季度(使用自定义组件) -->
|
|
44
|
+
<Picker
|
|
45
|
+
v-else-if="!useRangeMode && realDateType === 'quarter'"
|
|
46
|
+
v-model="singleValue"
|
|
47
|
+
type="quarter"
|
|
48
|
+
size="small"
|
|
49
|
+
:disabled="disabled"
|
|
50
|
+
:placeholder="innerPlaceholder"
|
|
51
|
+
@focus="isfocus = true; $emit('focus')"
|
|
52
|
+
@blur="isfocus = false; $emit('blur')"
|
|
53
|
+
/>
|
|
26
54
|
</div>
|
|
27
55
|
</div>
|
|
28
56
|
</template>
|
|
57
|
+
|
|
29
58
|
<script>
|
|
30
|
-
|
|
31
|
-
|
|
59
|
+
// 全局常量统一维护
|
|
60
|
+
// 类型对应格式化规则
|
|
61
|
+
const DATE_FORMAT_MAP = {
|
|
62
|
+
datetime: 'yyyy-MM-dd HH:mm',
|
|
63
|
+
month: 'yyyy-MM',
|
|
64
|
+
year: 'yyyy',
|
|
65
|
+
date: 'yyyy-MM-dd',
|
|
66
|
+
quarter: 'yyyy-Qq',
|
|
67
|
+
week: 'yyyy-WW'
|
|
32
68
|
};
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
date: '
|
|
36
|
-
month: '
|
|
37
|
-
year: '
|
|
38
|
-
|
|
69
|
+
// 维度面板对应的格式化
|
|
70
|
+
const DIMENSION_FORMAT_MAP = {
|
|
71
|
+
date: 'yyyy-MM-dd',
|
|
72
|
+
month: 'yyyy-MM',
|
|
73
|
+
year: 'yyyy',
|
|
74
|
+
daterange: 'yyyy-MM-dd'
|
|
75
|
+
};
|
|
76
|
+
// 维度 -> RangeDate 使用的基础类型
|
|
77
|
+
const DIMENSION_TO_RANGE_TYPE = {
|
|
78
|
+
date: 'date',
|
|
79
|
+
month: 'month',
|
|
80
|
+
year: 'year',
|
|
81
|
+
daterange: 'date'
|
|
39
82
|
};
|
|
83
|
+
// 普通type映射区间组件type
|
|
84
|
+
const NORMAL_TO_RANGE_TYPE = {
|
|
85
|
+
date: 'date',
|
|
86
|
+
month: 'month',
|
|
87
|
+
year: 'year',
|
|
88
|
+
quarter: 'quarter',
|
|
89
|
+
week: 'week'
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
import RangeDate from './component/RangeDate.vue';
|
|
93
|
+
import Picker from './component/Picker.vue';
|
|
40
94
|
|
|
41
|
-
import XtFlexBox from '../xt-flex-box/index.vue'
|
|
42
|
-
import Quarter from "./quarter.vue";
|
|
43
95
|
export default {
|
|
44
|
-
name:
|
|
45
|
-
components: {
|
|
46
|
-
|
|
47
|
-
Quarter
|
|
48
|
-
},
|
|
96
|
+
name: 'XtDatePicker',
|
|
97
|
+
components: { RangeDate, Picker },
|
|
98
|
+
// 标准v-model:父组件 v-model="xxx"
|
|
49
99
|
model: {
|
|
50
|
-
prop:
|
|
51
|
-
event:
|
|
100
|
+
prop: 'value',
|
|
101
|
+
event: 'change'
|
|
52
102
|
},
|
|
53
103
|
props: {
|
|
54
|
-
|
|
104
|
+
// 绑定主值
|
|
105
|
+
value: {
|
|
106
|
+
type: [String, Array, null],
|
|
107
|
+
default: null
|
|
108
|
+
},
|
|
109
|
+
// 基础日期类型 date/month/year/quarter/week/datetime
|
|
55
110
|
dateType: {
|
|
56
111
|
type: String,
|
|
57
|
-
default:
|
|
112
|
+
default: 'date',
|
|
113
|
+
validator: val => Object.keys(DATE_FORMAT_MAP).includes(val)
|
|
58
114
|
},
|
|
115
|
+
// 区间分隔符
|
|
59
116
|
separator: {
|
|
60
117
|
type: String,
|
|
61
|
-
default:
|
|
118
|
+
default: '至'
|
|
62
119
|
},
|
|
63
120
|
disabled: {
|
|
64
121
|
type: Boolean,
|
|
65
122
|
default: false
|
|
66
123
|
},
|
|
124
|
+
// 维度切换后是否立即触发事件
|
|
67
125
|
immediate: {
|
|
68
126
|
type: Boolean,
|
|
69
127
|
default: true
|
|
70
128
|
},
|
|
71
|
-
|
|
129
|
+
// 外部自定义占位
|
|
130
|
+
placeholder: String,
|
|
131
|
+
// 整体宽度
|
|
72
132
|
width: {
|
|
73
|
-
type:
|
|
133
|
+
type: String,
|
|
74
134
|
default: '100%'
|
|
75
135
|
},
|
|
136
|
+
// 是否开启区间模式(无维度切换时生效)
|
|
76
137
|
rangeMode: {
|
|
77
138
|
type: Boolean,
|
|
78
|
-
default:
|
|
139
|
+
default: false
|
|
79
140
|
},
|
|
141
|
+
// 是否展示维度切换单选框
|
|
80
142
|
showDimension: {
|
|
81
143
|
type: Boolean,
|
|
82
144
|
default: false
|
|
83
145
|
},
|
|
146
|
+
// 当前选中维度 date/month/year/daterange
|
|
84
147
|
dimension: {
|
|
85
148
|
type: String,
|
|
86
|
-
default:
|
|
149
|
+
default: 'date',
|
|
150
|
+
validator: val => ['date', 'month', 'year', 'daterange'].includes(val)
|
|
87
151
|
}
|
|
88
152
|
},
|
|
89
153
|
data() {
|
|
@@ -92,106 +156,93 @@ export default {
|
|
|
92
156
|
};
|
|
93
157
|
},
|
|
94
158
|
computed: {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
month: 'yyyy-MM',
|
|
100
|
-
year: 'yyyy',
|
|
101
|
-
custom: 'yyyy-MM-dd'
|
|
102
|
-
};
|
|
103
|
-
return formatMap[this.dimension] || typeFormatEnum[this.dateType];
|
|
104
|
-
}
|
|
105
|
-
return typeFormatEnum[this.dateType] || "yyyy-MM-dd";
|
|
159
|
+
// 真实底层日期类型(区分维度面板场景)
|
|
160
|
+
realDateType() {
|
|
161
|
+
if (this.showDimension) return this.dimension;
|
|
162
|
+
return this.dateType;
|
|
106
163
|
},
|
|
164
|
+
|
|
165
|
+
// 当前是否启用区间组件
|
|
166
|
+
useRangeMode() {
|
|
167
|
+
// 维度为自定义区间 或 全局开启rangeMode且非维度面板
|
|
168
|
+
return this.dimension === 'daterange' || (this.rangeMode);
|
|
169
|
+
},
|
|
170
|
+
|
|
171
|
+
// 区间组件使用的type
|
|
107
172
|
rangeDateType() {
|
|
108
173
|
if (this.showDimension) {
|
|
109
|
-
return
|
|
174
|
+
return DIMENSION_TO_RANGE_TYPE[this.dimension] || 'date';
|
|
110
175
|
}
|
|
111
|
-
|
|
112
|
-
date: 'daterange',
|
|
113
|
-
month: 'monthrange',
|
|
114
|
-
year: 'yearrange',
|
|
115
|
-
quarter: 'quarter',
|
|
116
|
-
week: 'weekrange'
|
|
117
|
-
};
|
|
118
|
-
return rangeMap[this.dateType] || 'daterange';
|
|
176
|
+
return NORMAL_TO_RANGE_TYPE[this.dateType] || 'date';
|
|
119
177
|
},
|
|
120
|
-
|
|
178
|
+
|
|
179
|
+
// 日期格式化字符串
|
|
180
|
+
format() {
|
|
121
181
|
if (this.showDimension) {
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
return this.rangeMode;
|
|
125
|
-
},
|
|
126
|
-
timeStart: {
|
|
127
|
-
get() {
|
|
128
|
-
return this.value && this.value[0];
|
|
129
|
-
},
|
|
130
|
-
set(v) {
|
|
131
|
-
this.$emit("update:value", [v, this.timeEnd]);
|
|
132
|
-
this.$emit("change", [v, this.timeEnd]);
|
|
133
|
-
this.$emit("dimension-change", { dimension: this.dimension, value: [v, this.timeEnd] });
|
|
182
|
+
return DIMENSION_FORMAT_MAP[this.dimension] || DATE_FORMAT_MAP[this.dateType];
|
|
134
183
|
}
|
|
184
|
+
return DATE_FORMAT_MAP[this.dateType] || 'yyyy-MM-dd';
|
|
135
185
|
},
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
186
|
+
|
|
187
|
+
// 内部自动生成占位(外部placeholder优先)
|
|
188
|
+
innerPlaceholder() {
|
|
189
|
+
if (this.placeholder) return this.placeholder;
|
|
190
|
+
const map = {
|
|
191
|
+
date: '请选择日期',
|
|
192
|
+
month: '请选择月份',
|
|
193
|
+
year: '请选择年份',
|
|
194
|
+
quarter: '请选择季度',
|
|
195
|
+
week: '请选择周',
|
|
196
|
+
datetime: '请选择日期时间'
|
|
197
|
+
};
|
|
198
|
+
return map[this.realDateType] || '请选择';
|
|
145
199
|
},
|
|
200
|
+
|
|
201
|
+
// 单选模式双向绑定
|
|
146
202
|
singleValue: {
|
|
147
203
|
get() {
|
|
148
204
|
return this.value;
|
|
149
205
|
},
|
|
150
|
-
set(
|
|
151
|
-
this.$emit(
|
|
152
|
-
this.$emit(
|
|
153
|
-
this.$emit(
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
const result = {};
|
|
158
|
-
|
|
159
|
-
if (this.timeEnd) {
|
|
160
|
-
const endTime = this.timeEnd.getTime();
|
|
161
|
-
result.disabledDate = (time) => {
|
|
162
|
-
return time.getTime() > endTime;
|
|
163
|
-
};
|
|
206
|
+
set(val) {
|
|
207
|
+
this.$emit('update:value', val);
|
|
208
|
+
this.$emit('change', val);
|
|
209
|
+
this.$emit('dimension-change', {
|
|
210
|
+
dimension: this.dimension,
|
|
211
|
+
value: val
|
|
212
|
+
});
|
|
164
213
|
}
|
|
165
|
-
|
|
166
|
-
return result;
|
|
167
214
|
},
|
|
168
|
-
endTimeRange() {
|
|
169
|
-
const result = {};
|
|
170
215
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
216
|
+
// 区间组件双向绑定中转
|
|
217
|
+
rangeValue: {
|
|
218
|
+
get() {
|
|
219
|
+
return this.value;
|
|
220
|
+
},
|
|
221
|
+
set(val) {
|
|
222
|
+
this.$emit('update:value', val);
|
|
223
|
+
this.$emit('change', val);
|
|
224
|
+
this.$emit('dimension-change', {
|
|
225
|
+
dimension: this.dimension,
|
|
226
|
+
value: val
|
|
227
|
+
});
|
|
176
228
|
}
|
|
177
|
-
|
|
178
|
-
return result;
|
|
179
229
|
}
|
|
180
230
|
},
|
|
181
231
|
watch: {
|
|
182
|
-
|
|
232
|
+
// 切换维度,关闭下拉面板并抛出事件
|
|
233
|
+
dimension(newVal) {
|
|
183
234
|
this.closePickerPanels();
|
|
184
|
-
|
|
235
|
+
if (this.immediate) {
|
|
236
|
+
this.$emit('dimension-change', {
|
|
237
|
+
dimension: newVal,
|
|
238
|
+
value: this.value
|
|
239
|
+
});
|
|
240
|
+
}
|
|
185
241
|
}
|
|
186
242
|
},
|
|
187
243
|
methods: {
|
|
244
|
+
// 关闭原生单选日期下拉面板
|
|
188
245
|
closePickerPanels() {
|
|
189
|
-
if (this.$refs.timeStart) {
|
|
190
|
-
this.$refs.timeStart.pickerVisible = false;
|
|
191
|
-
}
|
|
192
|
-
if (this.$refs.timeEnd) {
|
|
193
|
-
this.$refs.timeEnd.pickerVisible = false;
|
|
194
|
-
}
|
|
195
246
|
if (this.$refs.singlePicker) {
|
|
196
247
|
this.$refs.singlePicker.pickerVisible = false;
|
|
197
248
|
}
|
|
@@ -199,6 +250,7 @@ export default {
|
|
|
199
250
|
}
|
|
200
251
|
};
|
|
201
252
|
</script>
|
|
253
|
+
|
|
202
254
|
<style lang="scss" scoped>
|
|
203
255
|
.xt-date-picker-container {
|
|
204
256
|
display: inline-block;
|
|
@@ -211,41 +263,9 @@ export default {
|
|
|
211
263
|
|
|
212
264
|
.xt-date-picker-wrapper {
|
|
213
265
|
display: inline-block;
|
|
214
|
-
width: 100%;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
.xt-date-picker{
|
|
218
|
-
width: 100%;
|
|
219
|
-
border-radius: 4px;
|
|
220
|
-
border: 1px solid #DCDFE6;
|
|
221
|
-
|
|
222
|
-
&.focus{
|
|
223
|
-
border-color: #1890FF;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
::v-deep .el-picker-panel{
|
|
227
|
-
position: absolute;
|
|
228
|
-
z-index: 401;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
::v-deep .el-input__inner{
|
|
232
|
-
border: none;
|
|
233
|
-
padding: 0;
|
|
234
|
-
text-align: center;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
::v-deep .el-input__prefix{
|
|
238
|
-
display: none;
|
|
239
|
-
}
|
|
240
266
|
}
|
|
241
267
|
|
|
242
268
|
.xt-date {
|
|
243
269
|
width: 100%;
|
|
244
270
|
}
|
|
245
|
-
|
|
246
|
-
.separator {
|
|
247
|
-
padding: 0 8px;
|
|
248
|
-
color: #909399;
|
|
249
|
-
line-height: 32px;
|
|
250
|
-
}
|
|
251
271
|
</style>
|