xt-element-ui 2.1.5 → 2.1.7

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.
Files changed (72) hide show
  1. package/docs/components/base/xt-badge.md +0 -2
  2. package/docs/components/base/xt-bar.md +5 -32
  3. package/docs/components/base/xt-button.md +0 -2
  4. package/docs/components/base/xt-card-item.md +0 -2
  5. package/docs/components/base/xt-card.md +17 -19
  6. package/docs/components/base/xt-chart.md +5 -31
  7. package/docs/components/base/xt-config-provider.md +0 -2
  8. package/docs/components/base/xt-date-picker.md +268 -180
  9. package/docs/components/base/xt-flex-box.md +25 -25
  10. package/docs/components/base/xt-form-schema.md +356 -0
  11. package/docs/components/base/xt-grid-box.md +4 -6
  12. package/docs/components/base/xt-icon.md +0 -2
  13. package/docs/components/base/xt-input.md +204 -44
  14. package/docs/components/base/xt-line.md +4 -30
  15. package/docs/components/base/xt-list.md +456 -458
  16. package/docs/components/base/xt-map-provider.md +0 -2
  17. package/docs/components/base/xt-map.md +0 -2
  18. package/docs/components/base/xt-multi.md +5 -44
  19. package/docs/components/base/xt-page.md +17 -6
  20. package/docs/components/base/xt-pie.md +5 -30
  21. package/docs/components/base/xt-progress.md +0 -2
  22. package/docs/components/base/xt-scroll-arrow.md +0 -2
  23. package/docs/components/base/xt-select-tree.md +0 -2
  24. package/docs/components/base/xt-step-price.md +0 -2
  25. package/docs/components/base/xt-table.md +2 -2
  26. package/docs/components/base/xt-tabs.md +0 -2
  27. package/docs/components/base/xt-text.md +1 -2
  28. package/docs/components/base/xt-time.md +0 -2
  29. package/docs/components/base/xt-transfer-tree.md +0 -2
  30. package/docs/components/base/xt-upload.md +11 -8
  31. package/docs/components/utils/config.md +285 -0
  32. package/docs/components/utils/format.md +445 -0
  33. package/package.json +5 -2
  34. package/src/components/xt-badge/style/index.scss +0 -22
  35. package/src/components/xt-chart/XtBar.vue +0 -3
  36. package/src/components/xt-date-picker/component/Picker.vue +196 -0
  37. package/src/components/xt-date-picker/component/RangeDate.vue +136 -0
  38. package/src/components/xt-date-picker/index.vue +164 -144
  39. package/src/components/xt-flex-box/index.vue +1 -1
  40. package/src/components/xt-form-schema/index.js +8 -0
  41. package/src/components/xt-form-schema/index.vue +328 -0
  42. package/src/components/xt-grid-item/index.vue +2 -2
  43. package/src/components/xt-input/index.vue +224 -28
  44. package/src/components/xt-input/style/index.scss +10 -0
  45. package/src/components/xt-layout/ExFieldset.vue +4 -4
  46. package/src/components/xt-list/index.js +7 -7
  47. package/src/components/xt-list/index.vue +885 -885
  48. package/src/components/xt-page/index.vue +148 -75
  49. package/src/components/xt-progress/style/index.scss +0 -14
  50. package/src/components/xt-tab-pane/index.js +10 -0
  51. package/src/components/{xt-tabs/TabPane.vue → xt-tab-pane/index.vue} +14 -1
  52. package/src/components/xt-table/XtTableCell.vue +2 -2
  53. package/src/components/xt-table/index.vue +5 -7
  54. package/src/components/xt-tabs/index.js +1 -3
  55. package/src/components/xt-tabs/index.vue +303 -44
  56. package/src/components/xt-tabs/style/index.scss +0 -40
  57. package/src/components/xt-text/style/index.scss +0 -15
  58. package/src/components/xt-transfer-tree/index.js +7 -7
  59. package/src/components/xt-transfer-tree/index.vue +493 -493
  60. package/src/components/xt-upload/index.vue +12 -6
  61. package/src/enhance/index.scss +13 -0
  62. package/src/index.js +7 -2
  63. package/src/styles/theme/colors.scss +0 -44
  64. package/src/styles/theme/dark-variables.scss +0 -29
  65. package/lib/demo.html +0 -10
  66. package/lib/index.common.js +0 -126851
  67. package/lib/index.css +0 -1
  68. package/lib/index.umd.js +0 -126861
  69. package/lib/index.umd.min.js +0 -1
  70. package/src/components/xt-date-picker/SearchDate.vue +0 -45
  71. package/src/components/xt-date-picker/quarter.vue +0 -154
  72. package/src/components/xt-table/index copy.vue +0 -663
@@ -0,0 +1,136 @@
1
+ <!-- RangeDate.vue 区间业务组件 -->
2
+ <template>
3
+ <div class="range-wrap">
4
+ <Picker
5
+ v-model="startVal"
6
+ :type="type"
7
+ size="small"
8
+ :placeholder="startPlaceholder"
9
+ :disabled="disabled"
10
+ :disabled-date="disabledStart"
11
+ @change="handleChange"
12
+ />
13
+ <span class="split">{{ separator }}</span>
14
+ <Picker
15
+ v-model="endVal"
16
+ :type="type"
17
+ size="small"
18
+ :placeholder="endPlaceholder"
19
+ :disabled="disabled"
20
+ :disabled-date="disabledEnd"
21
+ @change="handleChange"
22
+ />
23
+ </div>
24
+ </template>
25
+ <script>
26
+ import Picker from './Picker.vue'
27
+ export default {
28
+ name: 'RangeDate',
29
+ components: { Picker },
30
+ props: {
31
+ // 父组件v-model绑定数组 [startStr, endStr]
32
+ value: {
33
+ type: Array,
34
+ default: () => [null, null]
35
+ },
36
+ type: {
37
+ type: String,
38
+ default: 'date'
39
+ },
40
+ separator: {
41
+ type: String,
42
+ default: '至'
43
+ },
44
+ disabled: { type: Boolean, default: false }
45
+ },
46
+ data() {
47
+ return {
48
+ startVal: '',
49
+ endVal: ''
50
+ }
51
+ },
52
+ watch: {
53
+ // 外部回填回显
54
+ value: {
55
+ handler(val) {
56
+ const [s, e] = val || []
57
+ this.startVal = s || ''
58
+ this.endVal = e || ''
59
+ },
60
+ immediate: true
61
+ }
62
+ },
63
+ computed: {
64
+ startDate() {
65
+ return this.startVal ? new Date(this.startVal) : null
66
+ },
67
+ endDate() {
68
+ return this.endVal ? new Date(this.endVal) : null
69
+ },
70
+ startPlaceholder() {
71
+ const map = {
72
+ date: '开始日期',
73
+ month: '开始月份',
74
+ year: '开始年份',
75
+ quarter: '开始季度',
76
+ week: '开始周'
77
+ }
78
+ return map[this.type] || '开始日期'
79
+ },
80
+ endPlaceholder() {
81
+ const map = {
82
+ date: '结束日期',
83
+ month: '结束月份',
84
+ year: '结束年份',
85
+ quarter: '结束季度',
86
+ week: '结束周'
87
+ }
88
+ return map[this.type] || '结束日期'
89
+ }
90
+ },
91
+ methods: {
92
+ // 禁用开始:不能晚于已选结束
93
+ disabledStart(time) {
94
+ if (!this.endDate) return false
95
+ return time.getTime() > this.endDate.getTime()
96
+ },
97
+ // 禁用结束:不能早于已选开始
98
+ disabledEnd(time) {
99
+ if (!this.startDate) return false
100
+ return time.getTime() < this.startDate.getTime()
101
+ },
102
+ // 任意日期变更同步抛出数组给父组件
103
+ handleChange() {
104
+ this.$emit('input', [this.startVal, this.endVal])
105
+ }
106
+ }
107
+ }
108
+ </script>
109
+ <style scoped>
110
+ .range-wrap {
111
+ display: flex;
112
+ align-items: center;
113
+ flex-wrap: wrap;
114
+ gap: 8px;
115
+ width: 100%;
116
+ }
117
+ .range-wrap .el-date-editor {
118
+ flex: 1;
119
+ min-width: 130px;
120
+ }
121
+ .split {
122
+ flex-shrink: 0;
123
+ padding: 0 4px;
124
+ }
125
+ /* 手机/窄侧边栏自动竖向排列 */
126
+ @media (max-width: 360px) {
127
+ .range-wrap {
128
+ flex-direction: column;
129
+ align-items: stretch;
130
+ }
131
+ .split {
132
+ text-align: center;
133
+ margin: 4px 0;
134
+ }
135
+ }
136
+ </style>
@@ -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="custom">自定义</el-radio-button>
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
- <XtFlexBox v-if="dateType=='quarter'" type="inline-flex" class="xt-date-picker" :class="{focus: isfocus}" :style="width?{width: `${width}`}:{}">
14
- <Quarter v-model="timeStart" :format="format" placeholder="开始时间" quarter-type="quarter-start" clearable></Quarter>
15
- <span class="separator">{{ separator }}</span>
16
- <Quarter v-model="timeEnd" :format="format" placeholder="结束时间" quarter-type="quarter-end" clearable></Quarter>
17
- </XtFlexBox>
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
- <XtFlexBox v-else-if="useRangeMode" type="inline-flex" class="xt-date" :class="{focus: isfocus}" :style="width?{width: `${width}px`}:{}">
20
- <el-date-picker ref="timeStart" key="startSelect" v-model="timeStart" size="small" :disabled="disabled" append-to-body :picker-options="startTimeRange" :format="format" :type="rangeDateType" placeholder="开始时间" clearable @blur="$emit('blur')" @focus="$emit('focus')"></el-date-picker>
21
- <span class="separator">{{ separator }}</span>
22
- <el-date-picker ref="timeEnd" key="endSelect" v-model="timeEnd" size="small" :disabled="disabled" append-to-body :picker-options="endTimeRange" :format="format" :type="rangeDateType" placeholder="结束时间" clearable @blur="$emit('blur')" @focus="$emit('focus')"></el-date-picker>
23
- </XtFlexBox>
24
-
25
- <el-date-picker v-else ref="singlePicker" v-model="singleValue" size="small" :disabled="disabled" append-to-body :format="format" :type="dateType" :placeholder="placeholder" clearable @blur="$emit('blur')" @focus="$emit('focus')"></el-date-picker>
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
- const typeFormatEnum = {
31
- datetime: "yyyy-MM-dd HH:mm", month: "yyyy-MM", year: "yyyy", date: "yyyy-MM-dd", quarter: "yyyy-Qq", week: "yyyy-WW"
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 rangeTypeMap = {
35
- date: 'daterange',
36
- month: 'monthrange',
37
- year: 'yearrange',
38
- custom: 'daterange'
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: "XtDatePicker",
45
- components: {
46
- XtFlexBox,
47
- Quarter
48
- },
96
+ name: 'XtDatePicker',
97
+ components: { RangeDate, Picker },
98
+ // 标准v-model:父组件 v-model="xxx"
49
99
  model: {
50
- prop: "value",
51
- event: "change"
100
+ prop: 'value',
101
+ event: 'change'
52
102
  },
53
103
  props: {
54
- value: {},
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: "date"
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
- placeholder: {},
129
+ // 外部自定义占位
130
+ placeholder: String,
131
+ // 整体宽度
72
132
  width: {
73
- type: [String],
133
+ type: String,
74
134
  default: '100%'
75
135
  },
136
+ // 是否开启区间模式(无维度切换时生效)
76
137
  rangeMode: {
77
138
  type: Boolean,
78
- default: true
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: "date"
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
- format() {
96
- if (this.showDimension) {
97
- const formatMap = {
98
- date: 'yyyy-MM-dd',
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 rangeTypeMap[this.dimension] || 'daterange';
174
+ return DIMENSION_TO_RANGE_TYPE[this.dimension] || 'date';
110
175
  }
111
- const rangeMap = {
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
- useRangeMode() {
178
+
179
+ // 日期格式化字符串
180
+ format() {
121
181
  if (this.showDimension) {
122
- return true;
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
- timeEnd: {
137
- get() {
138
- return this.value && this.value[1];
139
- },
140
- set(v) {
141
- this.$emit("update:value", [this.timeStart, v]);
142
- this.$emit("change", [this.timeStart, v]);
143
- this.$emit("dimension-change", { dimension: this.dimension, value: [this.timeStart, v] });
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(v) {
151
- this.$emit("update:value", v);
152
- this.$emit("change", v);
153
- this.$emit("dimension-change", { dimension: this.dimension, value: v });
154
- }
155
- },
156
- startTimeRange() {
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
- if (this.timeStart) {
172
- const startTime = this.timeStart.getTime();
173
- result.disabledDate = (time) => {
174
- return time.getTime() < startTime;
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
- dimension(val) {
232
+ // 切换维度,关闭下拉面板并抛出事件
233
+ dimension(newVal) {
183
234
  this.closePickerPanels();
184
- this.$emit("dimension-change", { dimension: val, value: this.value });
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>
@@ -25,7 +25,7 @@ export default {
25
25
  if (this.gap) {
26
26
  result.gap = this.gap
27
27
  } else {
28
- result.gap = 'var(--xt-flex-box-gap, 8px)'
28
+ result.gap = ''
29
29
  }
30
30
  return result
31
31
  }
@@ -0,0 +1,8 @@
1
+ import XtFormSchema from './index.vue'
2
+
3
+ XtFormSchema.install = function (Vue) {
4
+ Vue.component(XtFormSchema.name, XtFormSchema)
5
+ }
6
+
7
+ export default XtFormSchema
8
+ export { XtFormSchema }