xt-element-ui 2.1.3 → 2.1.5

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xt-element-ui",
3
- "version": "2.1.3",
3
+ "version": "2.1.5",
4
4
  "description": "基于 Vue 2.7 + ElementUI 的企业级组件库,提供丰富的自定义组件和扩展组件",
5
5
  "main": "lib/index.common.js",
6
6
  "module": "lib/index.esm.js",
@@ -2,7 +2,8 @@
2
2
  <el-button
3
3
  class="xt-button"
4
4
  :class="buttonClasses"
5
- v-bind="$attrs"
5
+ v-bind="$attrs"
6
+ :type="type"
6
7
  @click="handleClick"
7
8
  >
8
9
  <slot></slot>
@@ -17,8 +17,8 @@
17
17
  color: var(--xt-color-white, #ffffff);
18
18
  }
19
19
  &-success{
20
- background-color: var(--xt-color-primary, #ffffff);
21
- border-color: var(--xt-color-primary, #ffffff);
20
+ background-color: var(--xt-color-success, #ffffff);
21
+ border-color: var(--xt-color-success, #ffffff);
22
22
  color: var(--xt-color-white, #ffffff);
23
23
  }
24
24
  &-warning{
@@ -4,13 +4,13 @@
4
4
  .xt-card {
5
5
  border-radius: 8px;
6
6
  transition: all 0.3s;
7
- font-size: var(--xt-card-font-size, 14px);
7
+ font-size: var(--xt-font-size-small, 14px);
8
8
  background-color: var(--xt-bg-color, #ffffff);
9
9
  color: var(--xt-text-color-primary, #303133);
10
10
  border-color: var(--xt-border-color, #ebeef5);
11
11
 
12
12
  .el-card__header {
13
- padding: var(--xt-card-header-padding, 16px 20px);
13
+ padding: 16px 20px;
14
14
  border-bottom: 1px solid var(--xt-border-color, #ebeef5);
15
15
  background-color: var(--xt-bg-color, #ffffff);
16
16
  font-weight: 600;
@@ -1,54 +1,19 @@
1
1
  @import '../../../styles/variables.scss';
2
2
 
3
3
  .xt-card-item {
4
- --xt-card-bg-color: var(--xt-card-bg-color, #ffffff);
5
- --xt-card-border-color: var(--xt-card-border-color, #EBEEF5);
6
- --xt-card-text-color: var(--xt-color-text-primary, #303133);
7
-
8
- border-radius: var(--xt-card-border-radius, 4px);
4
+ border: 1px solid var(--xt-border-color, #dcdfe6);
5
+ border-radius: var(--xt-border-radius-small, 4px);
9
6
  box-shadow: var(--xt-card-shadow, 0 2px 12px 0 rgba(0, 0, 0, 0.1));
10
- background-color: var(--xt-card-bg-color);
7
+ background-color: var(--xt-bg-color-block, #ffffff);
11
8
  overflow: hidden;
12
- color: var(--xt-card-text-color);
9
+ color: var(--xt-text-color-primary, #303133);
13
10
  transition: var(--xt-transition-duration, 0.3s);
14
11
  }
15
12
 
16
- .xt-card-item.is-primary {
17
- --xt-card-bg-color: var(--xt-color-primary, #1890ff);
18
- .card__header {
19
- color: var(--xt-color-white, #ffffff);
20
- }
21
- }
22
-
23
-
24
- .xt-card-item.is-success {
25
- --xt-card-bg-color: var(--xt-color-success, #67c039);
26
- .card__header {
27
- color: var(--xt-color-white, #ffffff);
28
- }
29
- }
30
-
31
-
32
-
33
- .xt-card-item.is-danger {
34
- --xt-card-bg-color: var(--xt-color-danger, #f56c6c);
35
- .card__header {
36
- color: var(--xt-color-white, #ffffff);
37
- }
38
- }
39
-
40
-
41
-
42
- .xt-card-item.is-warning {
43
- --xt-card-bg-color: var(--xt-color-warning, #e6a23c);
44
- .card__header {
45
- color: var(--xt-color-white, #ffffff);
46
- }
47
- }
48
13
 
49
14
 
50
15
  .xt-card-item .card__header {
51
- padding: var(--xt-card-header-padding, 18px 20px);
16
+ padding: 18px 20px;
52
17
  box-sizing: border-box;
53
18
  font-weight: 600;
54
19
  font-size: var(--xt-font-size-medium, 16px);
@@ -1,15 +1,29 @@
1
1
  <template>
2
- <div style="display:inline-block">
3
- <XtFlexBox v-if="dateType=='quarter'" type="inline-flex" class="xt-date-picker" :class="{focus: isfocus}" :style="width?{width: `${width}`}:{}">
4
- <Quarter v-model="timeStart" :format="format" placeholder="开始时间" quarter-type="quarter-start" clearable></Quarter>
5
- <span class="separator">{{ separator }}</span>
6
- <Quarter v-model="timeEnd" :format="format" placeholder="结束时间" quarter-type="quarter-end" clearable></Quarter>
7
- </XtFlexBox>
8
- <XtFlexBox v-else type="inline-flex" class="xt-date" :class="{focus: isfocus}" :style="width?{width: `${width}px`}:{}">
9
- <el-date-picker ref="timeStart" key="startSelect" v-model="timeStart" size="small" :disabled="disabled" append-to-body :picker-options="startTimeRange" :format="format" :type="dateType" placeholder="开始时间" clearable @blur="$emit('blur')" @focus="$emit('focus')"></el-date-picker>
10
- <span class="separator">{{ separator }}</span>
11
- <el-date-picker ref="timeEnd" key="endSelect" v-model="timeEnd" size="small" :disabled="disabled" append-to-body :picker-options="endTimeRange" :format="format" :type="dateType" placeholder="结束时间" clearable @blur="$emit('blur')" @focus="$emit('focus')"></el-date-picker>
12
- </XtFlexBox>
2
+ <div class="xt-date-picker-container">
3
+ <div v-if="showDimension" class="xt-date-dimension">
4
+ <el-radio-group v-model="dimension" size="small">
5
+ <el-radio-button label="date">日</el-radio-button>
6
+ <el-radio-button label="month">月</el-radio-button>
7
+ <el-radio-button label="year">年</el-radio-button>
8
+ <el-radio-button label="custom">自定义</el-radio-button>
9
+ </el-radio-group>
10
+ </div>
11
+
12
+ <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>
18
+
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>
26
+ </div>
13
27
  </div>
14
28
  </template>
15
29
  <script>
@@ -17,6 +31,13 @@ const typeFormatEnum = {
17
31
  datetime: "yyyy-MM-dd HH:mm", month: "yyyy-MM", year: "yyyy", date: "yyyy-MM-dd", quarter: "yyyy-Qq", week: "yyyy-WW"
18
32
  };
19
33
 
34
+ const rangeTypeMap = {
35
+ date: 'daterange',
36
+ month: 'monthrange',
37
+ year: 'yearrange',
38
+ custom: 'daterange'
39
+ };
40
+
20
41
  import XtFlexBox from '../xt-flex-box/index.vue'
21
42
  import Quarter from "./quarter.vue";
22
43
  export default {
@@ -43,7 +64,7 @@ export default {
43
64
  type: Boolean,
44
65
  default: false
45
66
  },
46
- immediate: { // 是否直接初始化 参数
67
+ immediate: {
47
68
  type: Boolean,
48
69
  default: true
49
70
  },
@@ -51,6 +72,18 @@ export default {
51
72
  width: {
52
73
  type: [String],
53
74
  default: '100%'
75
+ },
76
+ rangeMode: {
77
+ type: Boolean,
78
+ default: true
79
+ },
80
+ showDimension: {
81
+ type: Boolean,
82
+ default: false
83
+ },
84
+ dimension: {
85
+ type: String,
86
+ default: "date"
54
87
  }
55
88
  },
56
89
  data() {
@@ -60,8 +93,36 @@ export default {
60
93
  },
61
94
  computed: {
62
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
+ }
63
105
  return typeFormatEnum[this.dateType] || "yyyy-MM-dd";
64
106
  },
107
+ rangeDateType() {
108
+ if (this.showDimension) {
109
+ return rangeTypeMap[this.dimension] || 'daterange';
110
+ }
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';
119
+ },
120
+ useRangeMode() {
121
+ if (this.showDimension) {
122
+ return true;
123
+ }
124
+ return this.rangeMode;
125
+ },
65
126
  timeStart: {
66
127
  get() {
67
128
  return this.value && this.value[0];
@@ -69,6 +130,7 @@ export default {
69
130
  set(v) {
70
131
  this.$emit("update:value", [v, this.timeEnd]);
71
132
  this.$emit("change", [v, this.timeEnd]);
133
+ this.$emit("dimension-change", { dimension: this.dimension, value: [v, this.timeEnd] });
72
134
  }
73
135
  },
74
136
  timeEnd: {
@@ -78,32 +140,80 @@ export default {
78
140
  set(v) {
79
141
  this.$emit("update:value", [this.timeStart, v]);
80
142
  this.$emit("change", [this.timeStart, v]);
143
+ this.$emit("dimension-change", { dimension: this.dimension, value: [this.timeStart, v] });
144
+ }
145
+ },
146
+ singleValue: {
147
+ get() {
148
+ return this.value;
149
+ },
150
+ set(v) {
151
+ this.$emit("update:value", v);
152
+ this.$emit("change", v);
153
+ this.$emit("dimension-change", { dimension: this.dimension, value: v });
81
154
  }
82
155
  },
83
156
  startTimeRange() {
84
- if (!this.timeEnd) return {};
85
- const endTime = this.timeEnd.getTime();
86
- return {
87
- disabledDate: (time) => {
88
- return time.getTime() > (endTime);
89
- }
90
- };
157
+ const result = {};
158
+
159
+ if (this.timeEnd) {
160
+ const endTime = this.timeEnd.getTime();
161
+ result.disabledDate = (time) => {
162
+ return time.getTime() > endTime;
163
+ };
164
+ }
165
+
166
+ return result;
91
167
  },
92
168
  endTimeRange() {
93
- if (!this.timeStart) return {};
94
- const startTime = this.timeStart.getTime();
95
- return {
96
- disabledDate: (time) => {
97
- return time.getTime() < (startTime);
98
- }
99
- };
169
+ const result = {};
170
+
171
+ if (this.timeStart) {
172
+ const startTime = this.timeStart.getTime();
173
+ result.disabledDate = (time) => {
174
+ return time.getTime() < startTime;
175
+ };
176
+ }
177
+
178
+ return result;
179
+ }
180
+ },
181
+ watch: {
182
+ dimension(val) {
183
+ this.closePickerPanels();
184
+ this.$emit("dimension-change", { dimension: val, value: this.value });
100
185
  }
101
186
  },
102
187
  methods: {
188
+ 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
+ if (this.$refs.singlePicker) {
196
+ this.$refs.singlePicker.pickerVisible = false;
197
+ }
198
+ }
103
199
  }
104
200
  };
105
201
  </script>
106
202
  <style lang="scss" scoped>
203
+ .xt-date-picker-container {
204
+ display: inline-block;
205
+ width: 100%;
206
+ }
207
+
208
+ .xt-date-dimension {
209
+ margin-bottom: 8px;
210
+ }
211
+
212
+ .xt-date-picker-wrapper {
213
+ display: inline-block;
214
+ width: 100%;
215
+ }
216
+
107
217
  .xt-date-picker{
108
218
  width: 100%;
109
219
  border-radius: 4px;
@@ -128,4 +238,14 @@ export default {
128
238
  display: none;
129
239
  }
130
240
  }
131
- </style>
241
+
242
+ .xt-date {
243
+ width: 100%;
244
+ }
245
+
246
+ .separator {
247
+ padding: 0 8px;
248
+ color: #909399;
249
+ line-height: 32px;
250
+ }
251
+ </style>
@@ -2,10 +2,6 @@
2
2
 
3
3
  .xt-step-price {
4
4
  padding: 12px 16px;
5
- background-color: var(--xt-fill-color-blank, #ffffff);
6
- border: 1px solid var(--xt-border-color-lighter, #ebeef5);
7
- border-radius: var(--xt-border-radius-small, 4px);
8
-
9
5
  &__header {
10
6
  display: flex;
11
7
  align-items: center;
@@ -42,7 +42,7 @@
42
42
 
43
43
  <xt-button
44
44
  v-if="!disabled && removable && itemsLength > 1"
45
- text
45
+ type="text"
46
46
  icon="el-icon-delete"
47
47
  class="xt-step-price-item__delete"
48
48
  @click="onDelete"
@@ -125,6 +125,8 @@ export default {
125
125
  // 排序配置
126
126
  sortGroup: { type: Boolean, default: false },
127
127
  defaultSort: { type: Object, default: null },
128
+ // 过滤配置
129
+ filterMethod: { type: Function, default: null },
128
130
  title: { type: String, default: '' },
129
131
  height: { type: [Number, String], default: null },
130
132
  maxHeight: { type: [Number, String], default: null },
@@ -168,15 +170,22 @@ export default {
168
170
  // 排序后的数据
169
171
  sortedTableData() {
170
172
  if (!this.tableData.length) return []
171
- if (!this.sortProp || !this.sortOrder) return [...this.tableData]
173
+
174
+ let data = [...this.tableData]
175
+
176
+ if (typeof this.filterMethod === 'function') {
177
+ data = data.filter(this.filterMethod)
178
+ }
179
+
180
+ if (!this.sortProp || !this.sortOrder) return data
172
181
 
173
182
  const order = this.sortOrder === 'ascending' ? 1 : -1
174
183
  const sortFn = this.resolveSortMethod(this.sortProp)
175
184
 
176
185
  if (this.sortGroup && this.groupColumns.length) {
177
- return this.groupSort([...this.tableData], sortFn, order)
186
+ return this.groupSort(data, sortFn, order)
178
187
  }
179
- return [...this.tableData].sort((a, b) => sortFn(a, b) * order)
188
+ return data.sort((a, b) => sortFn(a, b) * order)
180
189
  },
181
190
 
182
191
  // 处理小计、总计后的最终数据
@@ -20,11 +20,17 @@
20
20
  :style="customStyle"
21
21
  @mouseenter="handleMouseEnter"
22
22
  >
23
- <slot name="prefix">{{ prefix }}</slot>
23
+ <template v-if="$slots.prefix">
24
+ <slot name="prefix"></slot>
25
+ </template>
26
+ <template v-else-if="prefix">{{ prefix }}</template>
24
27
  <slot>
25
28
  <template v-if="formattedValue !== undefined">{{ formattedValue }}</template>
26
29
  </slot>
27
- <slot name="suffix">{{ suffix }}</slot>
30
+ <template v-if="$slots.suffix">
31
+ <slot name="suffix"></slot>
32
+ </template>
33
+ <template v-else-if="suffix">{{ suffix }}</template>
28
34
  </span>
29
35
  </el-tooltip>
30
36
  <span
@@ -41,11 +47,17 @@
41
47
  ]"
42
48
  :style="customStyle"
43
49
  >
44
- <slot name="prefix">{{ prefix }}</slot>
50
+ <template v-if="$slots.prefix">
51
+ <slot name="prefix"></slot>
52
+ </template>
53
+ <template v-else-if="prefix">{{ prefix }}</template>
45
54
  <slot>
46
55
  <template v-if="formattedValue !== undefined">{{ formattedValue }}</template>
47
56
  </slot>
48
- <slot name="suffix">{{ suffix }}</slot>
57
+ <template v-if="$slots.suffix">
58
+ <slot name="suffix"></slot>
59
+ </template>
60
+ <template v-else-if="suffix">{{ suffix }}</template>
49
61
  </span>
50
62
  </template>
51
63
 
@@ -0,0 +1,8 @@
1
+ import XtTransferTree from './index.vue'
2
+
3
+ XtTransferTree.install = function (Vue) {
4
+ Vue.component(XtTransferTree.name, XtTransferTree)
5
+ }
6
+
7
+ export default XtTransferTree
8
+ export { XtTransferTree }