xt-element-ui 2.1.3 → 2.1.4

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.4",
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
  // 处理小计、总计后的最终数据
@@ -11,76 +11,4 @@
11
11
  xtColorDanger: #{$xt-color-danger}; // 危险色 - Element UI 标准红色
12
12
  xtColorInfo: #{$xt-color-info}; // 信息色 - Element UI 标准灰色
13
13
 
14
- // 主色调浅色系列
15
- xtColorPrimaryLight3: #{$xt-color-primary-light-3}; // 主色浅色 30%
16
- xtColorPrimaryLight5: #{$xt-color-primary-light-5}; // 主色浅色 50%
17
- xtColorPrimaryLight7: #{$xt-color-primary-light-7}; // 主色浅色 70%
18
- xtColorPrimaryLight8: #{$xt-color-primary-light-8}; // 主色浅色 80%
19
- xtColorPrimaryLight9: #{$xt-color-primary-light-9}; // 主色浅色 90%
20
-
21
- // ===========================
22
- // 文字颜色
23
- // ===========================
24
- xtColorTextPrimary: #{$xt-color-text-primary}; // 主要文字颜色 - 最深
25
- xtColorTextRegular: #{$xt-color-text-regular}; // 常规文字颜色 - 中等
26
- xtColorTextSecondary: #{$xt-color-text-secondary}; // 次要文字颜色 - 较浅
27
- xtColorTextPlaceholder: #{$xt-color-text-placeholder}; // 占位符文字颜色
28
- xtColorTextDisabled: #{$xt-color-text-disabled}; // 禁用状态文字颜色
29
-
30
- // ===========================
31
- // 背景颜色
32
- // ===========================
33
- xtColorBgPrimary: #{$xt-color-bg-primary}; // 主背景色 - 白色
34
- xtColorBgSecondary: #{$xt-color-bg-secondary}; // 次要背景色 - 浅灰
35
- xtColorBgHover: #{$xt-color-bg-hover}; // 悬停背景色
36
- xtColorBgContainer: #{$xt-color-bg-container}; // 容器背景色
37
- xtColorBgOverlay: #{$xt-color-bg-overlay}; // 浮层背景色
38
-
39
- // ===========================
40
- // 边框颜色
41
- // ===========================
42
- xtColorBorder: #{$xt-color-border}; // 边框颜色 - 标准
43
- xtColorBorderLight: #{$xt-color-border-light}; // 边框浅色
44
- xtColorBorderLighter: #{$xt-color-border-lighter}; // 边框更浅色
45
- xtColorBorderExtraLight: #{$xt-color-border-extra-light}; // 边框极浅色
46
-
47
- // ===========================
48
- // 字体大小
49
- // ===========================
50
- xtFontSizeExtraLarge: #{$xt-font-size-extra-large}; // 特大字体
51
- xtFontSizeLarge: #{$xt-font-size-large}; // 大字体
52
- xtFontSizeMedium: #{$xt-font-size-medium}; // 中等字体
53
- xtFontSizeBase: #{$xt-font-size-small}; // 基准字体
54
- xtFontSizeSmall: #{$xt-font-size-mini}; // 小字体
55
- xtFontSizeExtraSmall: #{$xt-font-size-extra-small}; // 特小字体
56
-
57
- // ===========================
58
- // 间距
59
- // ===========================
60
- xtSpacingXs: #{$xt-spacing-xs}; // 最小间距
61
- xtSpacingSm: #{$xt-spacing-sm}; // 小间距
62
- xtSpacingMd: #{$xt-spacing-md}; // 中间距
63
- xtSpacingLg: #{$xt-spacing-lg}; // 大间距
64
- xtSpacingXl: #{$xt-spacing-xl}; // 特大间距
65
-
66
- // ===========================
67
- // 圆角
68
- // ===========================
69
- xtBorderRadiusBase: #{$xt-border-radius-base}; // 基准圆角
70
- xtBorderRadiusSmall: #{$xt-border-radius-small}; // 小圆角
71
- xtBorderRadiusRound: #{$xt-border-radius-round}; // 圆角(胶囊状)
72
- xtBorderRadiusCircle: #{$xt-border-radius-circle}; // 圆形
73
-
74
- // ===========================
75
- // 阴影
76
- // ===========================
77
- xtShadowSm: #{$xt-shadow-sm}; // 小阴影
78
- xtShadowMd: #{$xt-shadow-md}; // 中等阴影
79
- xtShadowLg: #{$xt-shadow-lg}; // 大阴影
80
-
81
- // ===========================
82
- // 过渡动画
83
- // ===========================
84
- xtTransitionDuration: #{$xt-transition-duration}; // 默认过渡时长
85
- xtTransitionDurationFast: #{$xt-transition-duration-fast}; // 快速过渡时长
86
14
  }