xt-element-ui 2.1.5 → 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.
Files changed (30) hide show
  1. package/docs/components/base/xt-date-picker.md +127 -37
  2. package/docs/components/base/xt-form-schema.md +358 -0
  3. package/docs/components/base/xt-grid-box.md +4 -4
  4. package/docs/components/base/xt-input.md +204 -42
  5. package/docs/components/base/xt-list.md +458 -458
  6. package/docs/components/base/xt-text.md +1 -0
  7. package/docs/components/utils/config.md +285 -0
  8. package/docs/components/utils/format.md +445 -0
  9. package/lib/index.common.js +2303 -8625
  10. package/lib/index.css +1 -1
  11. package/lib/index.umd.js +2303 -8625
  12. package/lib/index.umd.min.js +1 -1
  13. package/package.json +4 -2
  14. package/src/components/xt-date-picker/component/Picker.vue +196 -0
  15. package/src/components/xt-date-picker/component/RangeDate.vue +136 -0
  16. package/src/components/xt-date-picker/index.vue +164 -144
  17. package/src/components/xt-flex-box/index.vue +1 -1
  18. package/src/components/xt-form-schema/index.js +8 -0
  19. package/src/components/xt-form-schema/index.vue +328 -0
  20. package/src/components/xt-grid-item/index.vue +2 -2
  21. package/src/components/xt-input/index.vue +224 -28
  22. package/src/components/xt-input/style/index.scss +10 -0
  23. package/src/components/xt-list/index.js +7 -7
  24. package/src/components/xt-list/index.vue +885 -885
  25. package/src/components/xt-transfer-tree/index.js +7 -7
  26. package/src/components/xt-transfer-tree/index.vue +493 -493
  27. package/src/index.js +5 -2
  28. package/src/components/xt-date-picker/SearchDate.vue +0 -45
  29. package/src/components/xt-date-picker/quarter.vue +0 -154
  30. 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.5",
3
+ "version": "2.1.6",
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",
@@ -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>