xt-element-ui 2.1.22 → 2.1.61

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 (75) hide show
  1. package/docs/components/base/xt-badge.md +0 -2
  2. package/docs/components/base/xt-bar.md +0 -27
  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 +185 -28
  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 +0 -26
  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 +0 -39
  19. package/docs/components/base/xt-page.md +17 -6
  20. package/docs/components/base/xt-pie.md +0 -25
  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 +3 -4
  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 +270 -0
  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/lib/index.common.js +96183 -115717
  34. package/lib/index.css +1 -1
  35. package/lib/index.umd.js +96183 -115717
  36. package/lib/index.umd.min.js +1 -34
  37. package/package.json +4 -2
  38. package/src/components/xt-badge/style/index.scss +0 -22
  39. package/src/components/xt-button/index.vue +2 -1
  40. package/src/components/xt-button/style/index.scss +2 -2
  41. package/src/components/xt-card/style/index.scss +2 -2
  42. package/src/components/xt-card-item/style/index.scss +5 -40
  43. package/src/components/xt-chart/XtBar.vue +0 -3
  44. package/src/components/xt-date-picker/component/Picker.vue +196 -0
  45. package/src/components/xt-date-picker/component/RangeDate.vue +136 -0
  46. package/src/components/xt-date-picker/index.vue +220 -80
  47. package/src/components/xt-flex-box/index.vue +1 -1
  48. package/src/components/xt-form-schema/index.js +8 -0
  49. package/src/components/xt-form-schema/index.vue +328 -0
  50. package/src/components/xt-grid-item/index.vue +2 -2
  51. package/src/components/xt-input/index.vue +224 -28
  52. package/src/components/xt-input/style/index.scss +10 -0
  53. package/src/components/xt-layout/ExFieldset.vue +4 -4
  54. package/src/components/xt-list/index.js +7 -7
  55. package/src/components/xt-list/index.vue +885 -885
  56. package/src/components/xt-page/index.vue +148 -75
  57. package/src/components/xt-progress/style/index.scss +0 -14
  58. package/src/components/xt-step-price/style/index.scss +0 -4
  59. package/src/components/xt-step-price-item/index.vue +1 -1
  60. package/src/components/xt-table/XtTableCell.vue +2 -2
  61. package/src/components/xt-table/index.vue +17 -10
  62. package/src/components/xt-tabs/style/index.scss +0 -40
  63. package/src/components/xt-text/index.vue +16 -4
  64. package/src/components/xt-text/style/index.scss +0 -15
  65. package/src/components/xt-transfer-tree/index.js +8 -0
  66. package/src/components/xt-transfer-tree/index.vue +494 -0
  67. package/src/components/xt-upload/index.vue +12 -6
  68. package/src/index.js +8 -2
  69. package/src/styles/theme/colors.scss +0 -44
  70. package/src/styles/theme/dark-variables.scss +0 -29
  71. package/src/styles/variables-export.scss +0 -72
  72. package/src/utils/index.js +278 -1
  73. package/src/components/xt-date-picker/SearchDate.vue +0 -45
  74. package/src/components/xt-date-picker/quarter.vue +0 -154
  75. package/src/components/xt-table/index copy.vue +0 -663
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xt-element-ui",
3
- "version": "2.1.22",
3
+ "version": "2.1.61",
4
4
  "description": "基于 Vue 2.7 + ElementUI 的企业级组件库,提供丰富的自定义组件和扩展组件",
5
5
  "main": "lib/index.common.js",
6
6
  "module": "lib/index.esm.js",
@@ -11,13 +11,15 @@
11
11
  "docs:build": "vuepress build docs",
12
12
  "dev": "vue-cli-service serve",
13
13
  "lib": "vue-cli-service build --target lib --name index --dest lib src/index.js",
14
- "prepublishOnly": "npm run lib"
14
+ "prepublishOnly": "npm run lib",
15
+ "postinstall": "patch-package"
15
16
  },
16
17
  "peerDependencies": {
17
18
  "vue": "^2.6.10"
18
19
  },
19
20
  "devDependencies": {
20
21
  "@vue/cli-service": "~4.5.19",
22
+ "patch-package": "^8.0.1",
21
23
  "sass": "^1.56.0",
22
24
  "sass-loader": "^10.5.2",
23
25
  "vuepress": "^1.9.10",
@@ -64,25 +64,3 @@
64
64
  .xt-badge--hidden {
65
65
  display: none;
66
66
  }
67
-
68
- [data-theme='dark'], html.dark {
69
- .xt-badge--primary .xt-badge__badge {
70
- background: $xt-dark-color-primary;
71
- }
72
-
73
- .xt-badge--success .xt-badge__badge {
74
- background: $xt-dark-color-success;
75
- }
76
-
77
- .xt-badge--warning .xt-badge__badge {
78
- background: $xt-dark-color-warning;
79
- }
80
-
81
- .xt-badge--danger .xt-badge__badge {
82
- background: $xt-dark-color-danger;
83
- }
84
-
85
- .xt-badge--info .xt-badge__badge {
86
- background: $xt-dark-color-info;
87
- }
88
- }
@@ -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);
@@ -161,9 +161,6 @@ export default {
161
161
  },
162
162
  min: 0,
163
163
  splitNumber: _self.splitNumber,
164
- max: function(value) {
165
- return Math.ceil(value.max / _self.splitNumber) * _self.splitNumber;
166
- },
167
164
  scale: true,
168
165
  axisLabel: {
169
166
  margin: 2,
@@ -0,0 +1,196 @@
1
+ <template>
2
+ <div class="base-date-root">
3
+ <el-date-picker
4
+ v-if="type !== 'quarter'"
5
+ v-model="innerValue"
6
+ v-bind="$attrs"
7
+ v-on="$listeners"
8
+ :type="pickerType"
9
+ :value-format="valueFormat"
10
+ :disabled="disabled"
11
+ :placeholder="placeholder"
12
+ popper-append-to-body
13
+ popper-class="base-date-popper"
14
+ />
15
+
16
+ <el-popover
17
+ v-else
18
+ v-model="quarterPopVisible"
19
+ trigger="manual"
20
+ placement="bottom-start"
21
+ width="240"
22
+ >
23
+ <div class="quarter-panel">
24
+ <div class="quarter-header">
25
+ <el-button icon="el-icon-d-arrow-left" @click="year--"></el-button>
26
+ <span>{{ year }} 年</span>
27
+ <el-button icon="el-icon-d-arrow-right" @click="year++"></el-button>
28
+ </div>
29
+ <div class="quarter-list">
30
+ <div
31
+ v-for="q in 4"
32
+ :key="q"
33
+ class="quarter-item"
34
+ :class="{ active: quarterNum === q }"
35
+ @click="selectQuarter(q)"
36
+ >
37
+ Q{{ q }}
38
+ </div>
39
+ </div>
40
+ </div>
41
+
42
+ <el-input
43
+ slot="reference"
44
+ ref="quarterInput"
45
+ v-model="quarterShowText"
46
+ size="small"
47
+ readonly
48
+ :placeholder="placeholder"
49
+ :disabled="disabled"
50
+ clearable
51
+ @clear="handleClearQuarter"
52
+ >
53
+ <i slot="affix" class="el-icon-date"></i>
54
+ </el-input>
55
+ </el-popover>
56
+ </div>
57
+ </template>
58
+
59
+ <script>
60
+ export default {
61
+ name: 'BaseDatePicker',
62
+ inheritAttrs: false,
63
+ props: {
64
+ value: {
65
+ type: [String, null],
66
+ default: null
67
+ },
68
+ type: {
69
+ type: String,
70
+ default: 'date',
71
+ validator: val => ['date', 'month', 'year', 'quarter', 'week'].includes(val)
72
+ },
73
+ disabled: {
74
+ type: Boolean,
75
+ default: false
76
+ },
77
+ placeholder: String,
78
+ valueFormat: String
79
+ },
80
+ data() {
81
+ return {
82
+ quarterPopVisible: false,
83
+ year: new Date().getFullYear(),
84
+ quarterNum: null
85
+ }
86
+ },
87
+ computed: {
88
+ pickerType() {
89
+ return this.type === 'quarter' ? null : this.type
90
+ },
91
+ placeholder() {
92
+ if (this.$props.placeholder) return this.$props.placeholder
93
+ const map = {
94
+ date: '请选择日期',
95
+ month: '请选择月份',
96
+ year: '请选择年份',
97
+ quarter: '请选择季度',
98
+ week: '请选择周'
99
+ }
100
+ return map[this.type] || '请选择日期'
101
+ },
102
+ valueFormat() {
103
+ if (this.$props.valueFormat) return this.$props.valueFormat
104
+ const map = {
105
+ date: 'yyyy-MM-dd',
106
+ month: 'yyyy-MM',
107
+ year: 'yyyy',
108
+ quarter: 'yyyy-Qq',
109
+ week: 'yyyy-WW'
110
+ }
111
+ return map[this.type] || 'yyyy-MM-dd'
112
+ },
113
+ innerValue: {
114
+ get() { return this.value },
115
+ set(val) { this.$emit('input', val) }
116
+ },
117
+ quarterShowText() {
118
+ if (!this.value) return ''
119
+ return `${this.year}-Q${this.quarterNum}`
120
+ }
121
+ },
122
+ watch: {
123
+ value: {
124
+ handler(val) {
125
+ if (this.type !== 'quarter' || !val) {
126
+ this.quarterNum = null
127
+ return
128
+ }
129
+ const [y, q] = val.split('-Q')
130
+ this.year = Number(y)
131
+ this.quarterNum = Number(q)
132
+ },
133
+ immediate: true
134
+ }
135
+ },
136
+ methods: {
137
+ selectQuarter(q) {
138
+ this.quarterNum = q
139
+ const val = `${this.year}-Q${q}`
140
+ this.$emit('input', val)
141
+ this.quarterPopVisible = false
142
+ },
143
+ handleClearQuarter() {
144
+ this.quarterNum = null
145
+ this.$emit('input', null)
146
+ }
147
+ },
148
+ mounted() {
149
+ if (this.type === 'quarter' && this.$refs.quarterInput) {
150
+ this.$refs.quarterInput.$el.addEventListener('click', () => {
151
+ if (!this.disabled) this.quarterPopVisible = true
152
+ })
153
+ }
154
+ }
155
+ }
156
+ </script>
157
+
158
+ <style scoped>
159
+ .base-date-root {
160
+ }
161
+
162
+ .quarter-panel {
163
+ padding: 10px;
164
+ }
165
+
166
+ .quarter-header {
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: space-between;
170
+ margin-bottom: 10px;
171
+ }
172
+
173
+ .quarter-list {
174
+ display: grid;
175
+ grid-template-columns: repeat(2, 1fr);
176
+ gap: 8px;
177
+ }
178
+
179
+ .quarter-item {
180
+ text-align: center;
181
+ padding: 8px 0;
182
+ border: 1px solid #e4e7ed;
183
+ border-radius: 4px;
184
+ cursor: pointer;
185
+ }
186
+
187
+ .quarter-item.active {
188
+ background: #409eff;
189
+ color: #fff;
190
+ border-color: #409eff;
191
+ }
192
+
193
+ ::v-deep .base-date-popper {
194
+ border-radius: 4px;
195
+ }
196
+ </style>
@@ -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>