xt-element-ui 2.1.21 → 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 +7 -4
  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
@@ -1,109 +1,182 @@
1
1
  <template>
2
- <el-container class="page-container">
3
- <el-container class="page-main">
4
- <el-header v-if="$slots.header && showHeader" ref="header" height="" :class="{'page-header':$slots.aside}">
2
+ <div
3
+ class="xt-page-container"
4
+ :class="containerClass"
5
+ :style="rootCssVars"
6
+ >
7
+ <!-- 主体左右容器 -->
8
+ <el-container class="xt-page-main-wrap">
9
+ <!-- 顶部Header -->
10
+ <el-header
11
+ v-if="$slots.header && showHeader"
12
+ ref="header"
13
+ class="xt-page-header"
14
+ :class="headerClass"
15
+ >
5
16
  <slot name="header" />
6
17
  </el-header>
7
- <el-main ref="main" style="padding: 0;">
8
- <slot :tableHeight="calcHeight - tableBorderHeight" />
18
+
19
+ <!-- 主内容区域 -->
20
+ <el-main ref="main" class="xt-page-main" :class="mainClass">
21
+ <slot :table-height="tableContentHeight" />
9
22
  </el-main>
10
- <el-footer v-if="$slots.footer && showFooter" ref="footer" height="">
23
+
24
+ <!-- 底部Footer -->
25
+ <el-footer
26
+ v-if="$slots.footer && showFooter"
27
+ ref="footer"
28
+ class="xt-page-footer"
29
+ :class="footerClass"
30
+ >
11
31
  <slot name="footer" />
12
32
  </el-footer>
13
33
  </el-container>
14
- <el-aside class="page-aside" v-if="$slots.aside && showAside" :width="asideWidth" ref="aside">
34
+
35
+ <!-- 侧边栏Aside -->
36
+ <el-aside
37
+ v-if="$slots.aside && showAside"
38
+ ref="aside"
39
+ class="xt-page-aside"
40
+ :class="asideClass"
41
+ :width="asideWidth"
42
+ >
15
43
  <slot name="aside" />
16
44
  </el-aside>
45
+
46
+ <!-- 弹窗插槽 -->
17
47
  <slot name="dialog" />
18
- </el-container>
48
+ </div>
19
49
  </template>
50
+
20
51
  <script>
21
52
  export default {
22
- name: "XtPage",
53
+ name: 'XtPage',
23
54
  props: {
55
+ // 结构显隐控制(布局逻辑类Props,仅保留这类)
24
56
  showHeader: { type: Boolean, default: true },
25
57
  showFooter: { type: Boolean, default: true },
26
58
  showAside: { type: Boolean, default: true },
27
- diffHeight: {
28
- type: Number,
29
- default: 0
30
- },
31
- minHeight: {
32
- type: Number,
33
- default: 200
34
- },
35
- tableBorderHeight: {
36
- type: Number,
37
- default: 1
38
- },
39
- asideWidth: {
40
- type: String
41
- }
59
+ asideWidth: { type: String, default: '240px' },
60
+
61
+ // 表格自适应高度计算专用业务参数
62
+ diffHeight: { type: Number, default: 0 },
63
+ minTableHeight: { type: Number, default: 200 },
64
+ tableBorderHeight: { type: Number, default: 1 },
65
+
66
+ // 自定义扩展Class(重度差异化页面使用)
67
+ containerClass: { type: String, default: '' },
68
+ headerClass: { type: String, default: '' },
69
+ mainClass: { type: String, default: '' },
70
+ asideClass: { type: String, default: '' },
71
+ footerClass: { type: String, default: '' }
42
72
  },
43
73
  data() {
44
74
  return {
45
- tableHeight: 360
75
+ rawMainHeight: 0,
76
+ resizeTimer: null
46
77
  };
47
78
  },
48
79
  computed: {
49
- calcHeight() {
50
- return Math.max(this.tableHeight, this.minHeight);
80
+ // 根节点注入CSS变量,业务页面外层style可直接覆盖
81
+ rootCssVars() {
82
+ return {
83
+ '--xt-page-aside-width': this.asideWidth
84
+ };
85
+ },
86
+ // 传给插槽表格的可用高度
87
+ tableContentHeight() {
88
+ const usable = this.rawMainHeight - this.diffHeight - this.tableBorderHeight;
89
+ return Math.max(usable, this.minTableHeight);
51
90
  }
52
91
  },
53
92
  mounted() {
54
- this.$nextTick(() => {
55
- // 表格高度自适应浏览器大小
56
- this.doLayout();
57
- window.onresize = () => {
58
- this.doLayout();
59
- };
60
- });
93
+ this.$nextTick(() => this.calcMainHeight());
94
+ // 防抖监听窗口缩放
95
+ window.addEventListener('resize', this.handleResize);
96
+ },
97
+ beforeDestroy() {
98
+ // 销毁解绑,防止内存泄漏
99
+ clearTimeout(this.resizeTimer);
100
+ window.removeEventListener('resize', this.handleResize);
61
101
  },
62
102
  methods: {
63
- doLayout() {
64
- // 多减去1 解决高度相等时 出现滚动条问题
65
- if (this.$refs.main) {
66
- this.tableHeight = this.$refs.main.$el.getBoundingClientRect().height - (this.diffHeight) - this.tableBorderHeight;
67
- } else {
68
- }
103
+ // 防抖封装
104
+ handleResize() {
105
+ clearTimeout(this.resizeTimer);
106
+ this.resizeTimer = setTimeout(() => {
107
+ this.calcMainHeight();
108
+ }, 120);
109
+ },
110
+ // 计算main可视高度
111
+ calcMainHeight() {
112
+ if (!this.$refs.main || !this.$refs.main.$el) return;
113
+ const rect = this.$refs.main.$el.getBoundingClientRect();
114
+ this.rawMainHeight = rect.height;
69
115
  }
70
116
  }
71
117
  };
72
118
  </script>
73
- <style scoped lang="scss">
74
- .el-main {
75
- padding: 0;
76
- background: #fff;
77
- .formBox {
78
- background: #f0f0f2;
79
- }
80
- }
81
- .el-footer{
82
- border-top: 1px solid #f0f0f2;
83
- padding: 5px 0;
84
- }
85
- .el-header{
86
- padding: 0;
87
- }
88
- .el-aside {
89
- background-color: #fff;
90
- margin-left: 10px;
91
- height: 100%;
92
- padding: 0;
93
- border: 1px solid #eee;
94
- margin-bottom: 0;
95
- overflow-x: hidden;
96
- }
97
- .page-container{
98
- padding: 20px;
119
+
120
+ <style lang="scss" scoped>
121
+ .xt-page-container {
122
+ // 全局默认样式变量(统一维护,全局:root可覆盖)
123
+ --xt-page-container-padding: 20px;
124
+ --xt-page-container-bg: #f0f0f2;
125
+
126
+ --xt-header-padding: 0;
127
+ --xt-header-bg: #ffffff;
128
+ --xt-header-border: none;
129
+
130
+ --xt-main-padding: 0;
131
+ --xt-main-bg: #ffffff;
132
+
133
+ --xt-footer-padding: 5px 0;
134
+ --xt-footer-border-top: 1px solid #f0f0f2;
135
+
136
+ --xt-aside-margin-left: 10px;
137
+ --xt-aside-bg: #ffffff;
138
+ --xt-aside-border: 1px solid #eeeeee;
139
+ --xt-aside-padding: 0;
140
+ --xt-aside-overflow-x: hidden;
141
+
142
+ display: flex;
99
143
  height: 100%;
100
- background: #f0f0f2;
101
- }
102
- .page-header{
103
- padding: 10px 10px 0;
104
- background: #fff;
105
- }
106
- .page-main{
107
- padding: 0;
144
+ padding: var(--xt-page-container-padding);
145
+ background: var(--xt-page-container-bg);
146
+ gap: var(--xt-page-aside-gap, 0);
147
+
148
+ .xt-page-main-wrap {
149
+ flex: 1;
150
+ display: flex;
151
+ flex-direction: column;
152
+ height: 100%;
153
+ }
154
+
155
+ .xt-page-header {
156
+ padding: var(--xt-header-padding);
157
+ background: var(--xt-header-bg);
158
+ border: var(--xt-header-border);
159
+ }
160
+
161
+ .xt-page-main {
162
+ flex: 1;
163
+ padding: var(--xt-main-padding);
164
+ background: var(--xt-main-bg);
165
+ overflow: auto;
166
+ }
167
+
168
+ .xt-page-footer {
169
+ padding: var(--xt-footer-padding);
170
+ border-top: var(--xt-footer-border-top);
171
+ }
172
+
173
+ .xt-page-aside {
174
+ margin-left: var(--xt-aside-margin-left);
175
+ background: var(--xt-aside-bg);
176
+ border: var(--xt-aside-border);
177
+ padding: var(--xt-aside-padding);
178
+ height: 100%;
179
+ overflow-x: var(--xt-aside-overflow-x);
180
+ }
108
181
  }
109
- </style>
182
+ </style>
@@ -103,17 +103,3 @@
103
103
  opacity: 0;
104
104
  }
105
105
 
106
- [data-theme='dark'], html.dark {
107
- .xt-progress__bar {
108
- background: $xt-dark-color-border;
109
- }
110
-
111
- .xt-progress__bar-text,
112
- .xt-progress__text {
113
- color: $xt-dark-color-text-secondary;
114
- }
115
-
116
- .xt-progress__circle-percent {
117
- color: $xt-dark-color-text-primary;
118
- }
119
- }
@@ -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"
@@ -5,7 +5,7 @@ export default {
5
5
  props: {
6
6
  row: Object,
7
7
  index: Number,
8
- formatter: Function,
8
+ render: Function,
9
9
  column: { type: Object, default: null }
10
10
  },
11
11
  render: (h, ctx) => {
@@ -15,7 +15,7 @@ export default {
15
15
  }
16
16
  if (ctx.props.column) params.column = ctx.props.column
17
17
  const isVnode = (it) => it !== null && it !== undefined && typeof it === 'object' && it.hasOwnProperty('componentOptions')
18
- const renderNode = ctx.props.formatter(h, params)
18
+ const renderNode = ctx.props.render(h, params)
19
19
  if (renderNode === null || renderNode === undefined || renderNode === '') return h('span', '')
20
20
  return isVnode(renderNode) ? renderNode : h('span', String(renderNode))
21
21
  }
@@ -51,12 +51,11 @@
51
51
  >
52
52
  <template v-for="child in col.children">
53
53
  <el-table-column :key="child._key" v-bind="getColumnProps(child)">
54
- <template v-if="child.render" v-slot="scope">{{ child.render(scope) }}</template>
55
- <template v-else-if="child.formatter" v-slot="scope">
54
+ <template v-if="child.render" v-slot="scope">
56
55
  <XtTableCell
57
56
  :row="scope.row"
58
57
  :index="scope.$index"
59
- :formatter="child.formatter"
58
+ :render="child.render"
60
59
  :column="child"
61
60
  />
62
61
  </template>
@@ -72,12 +71,11 @@
72
71
  </template>
73
72
  </el-table-column>
74
73
  <el-table-column v-else :key="col._key" v-bind="getColumnProps(col)">
75
- <template v-if="col.render" v-slot="scope">{{ col.render(scope) }}</template>
76
- <template v-else-if="col.formatter" v-slot="scope">
74
+ <template v-if="col.render" v-slot="scope">
77
75
  <XtTableCell
78
76
  :row="scope.row"
79
77
  :index="scope.$index"
80
- :formatter="col.formatter"
78
+ :render="col.render"
81
79
  :column="col"
82
80
  />
83
81
  </template>
@@ -125,6 +123,8 @@ export default {
125
123
  // 排序配置
126
124
  sortGroup: { type: Boolean, default: false },
127
125
  defaultSort: { type: Object, default: null },
126
+ // 过滤配置
127
+ filterMethod: { type: Function, default: null },
128
128
  title: { type: String, default: '' },
129
129
  height: { type: [Number, String], default: null },
130
130
  maxHeight: { type: [Number, String], default: null },
@@ -168,15 +168,22 @@ export default {
168
168
  // 排序后的数据
169
169
  sortedTableData() {
170
170
  if (!this.tableData.length) return []
171
- if (!this.sortProp || !this.sortOrder) return [...this.tableData]
171
+
172
+ let data = [...this.tableData]
173
+
174
+ if (typeof this.filterMethod === 'function') {
175
+ data = data.filter(this.filterMethod)
176
+ }
177
+
178
+ if (!this.sortProp || !this.sortOrder) return data
172
179
 
173
180
  const order = this.sortOrder === 'ascending' ? 1 : -1
174
181
  const sortFn = this.resolveSortMethod(this.sortProp)
175
182
 
176
183
  if (this.sortGroup && this.groupColumns.length) {
177
- return this.groupSort([...this.tableData], sortFn, order)
184
+ return this.groupSort(data, sortFn, order)
178
185
  }
179
- return [...this.tableData].sort((a, b) => sortFn(a, b) * order)
186
+ return data.sort((a, b) => sortFn(a, b) * order)
180
187
  },
181
188
 
182
189
  // 处理小计、总计后的最终数据
@@ -418,7 +425,7 @@ export default {
418
425
 
419
426
  // ========== 列处理 ==========
420
427
  getColumnProps(col) {
421
- const { _key, children, render, formatter, slot, sortMethod, ...props } = col
428
+ const { _key, children, render, slot, sortMethod, ...props } = col
422
429
  return props
423
430
  },
424
431
 
@@ -155,43 +155,3 @@
155
155
  opacity: 0;
156
156
  transform: translateY(-10px);
157
157
  }
158
-
159
- [data-theme='dark'], html.dark {
160
- .xt-tabs__header {
161
- border-color: $xt-dark-color-border;
162
- }
163
-
164
- .xt-tabs--card .xt-tabs__header {
165
- background: $xt-dark-color-bg-secondary;
166
- }
167
-
168
- .xt-tabs--card .xt-tabs__nav-item--active {
169
- background: $xt-dark-color-bg-primary;
170
- border-color: $xt-dark-color-border;
171
- border-bottom-color: $xt-dark-color-bg-primary;
172
- }
173
-
174
- .xt-tabs--left .xt-tabs__header {
175
- border-color: $xt-dark-color-border;
176
- }
177
-
178
- .xt-tabs--right .xt-tabs__header {
179
- border-color: $xt-dark-color-border;
180
- }
181
-
182
- .xt-tabs__nav-item {
183
- color: $xt-dark-color-text-secondary;
184
- }
185
-
186
- .xt-tabs__nav-item:hover {
187
- color: $xt-dark-color-primary;
188
- }
189
-
190
- .xt-tabs__nav-item--active {
191
- color: $xt-dark-color-primary;
192
- }
193
-
194
- .xt-tabs--card .xt-tabs__content {
195
- border-color: $xt-dark-color-border;
196
- }
197
- }
@@ -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
 
@@ -93,18 +93,3 @@
93
93
  }
94
94
  }
95
95
 
96
- // 暗色主题
97
- [data-theme='dark'], html.dark {
98
- .xt-text--primary {
99
- color: $xt-dark-color-primary;
100
- }
101
- .xt-text--success {
102
- color: $xt-dark-color-success;
103
- }
104
- .xt-text--warning {
105
- color: $xt-dark-color-warning;
106
- }
107
- .xt-text--danger {
108
- color: $xt-dark-color-danger;
109
- }
110
- }
@@ -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 }