@ebiz/designer-components 0.0.60 → 0.0.62

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 (203) hide show
  1. package/README.md +29 -29
  2. package/dist/designer-components.css +1 -1
  3. package/dist/index.mjs +14096 -13554
  4. package/package.json +1 -1
  5. package/src/App.vue +26 -26
  6. package/src/apiService/SIMPLE_DATA_SERVICE.md +284 -284
  7. package/src/apiService/mockDataService.js +115 -115
  8. package/src/apiService/simpleDataService.js +297 -297
  9. package/src/assets/base.css +86 -86
  10. package/src/assets/logo.svg +1 -1
  11. package/src/components/Button.vue +149 -149
  12. package/src/components/DataContainer.vue +40 -40
  13. package/src/components/EbizApproval.vue +332 -332
  14. package/src/components/EbizAutoForm.vue +596 -596
  15. package/src/components/EbizAvatar.vue +115 -115
  16. package/src/components/EbizCheckbox.vue +93 -93
  17. package/src/components/EbizCheckboxGroup.vue +69 -69
  18. package/src/components/EbizDepartmentSelector.vue +144 -144
  19. package/src/components/EbizDescriptions.vue +340 -340
  20. package/src/components/EbizDescriptionsItem.vue +47 -47
  21. package/src/components/EbizDetailBlock.vue +81 -81
  22. package/src/components/EbizDialog.vue +260 -260
  23. package/src/components/EbizDiv.vue +32 -32
  24. package/src/components/EbizDivider.vue +96 -96
  25. package/src/components/EbizEmployeeInfo.vue +138 -138
  26. package/src/components/EbizEmployeeSelector.vue +1096 -1094
  27. package/src/components/EbizFileUpload.vue +238 -238
  28. package/src/components/EbizMap.vue +541 -541
  29. package/src/components/EbizMeetingRoomSelector.vue +665 -0
  30. package/src/components/EbizMobileMeetingRoomSelector.vue +728 -0
  31. package/src/components/EbizOkrTree.vue +99 -99
  32. package/src/components/EbizPageHeader.vue +95 -95
  33. package/src/components/EbizPagination.vue +162 -162
  34. package/src/components/EbizPopconfirm.vue +47 -47
  35. package/src/components/EbizRadio.vue +86 -86
  36. package/src/components/EbizRadioGroup.vue +83 -83
  37. package/src/components/EbizRemoteSelect.vue +232 -232
  38. package/src/components/EbizRouteBreadcrumb.vue +46 -46
  39. package/src/components/EbizSelect.vue +85 -85
  40. package/src/components/EbizSpace.vue +100 -100
  41. package/src/components/EbizStatistic.vue +149 -149
  42. package/src/components/EbizStatsCard.vue +113 -113
  43. package/src/components/EbizSwiper.vue +113 -113
  44. package/src/components/EbizSwiperItem.vue +13 -13
  45. package/src/components/EbizSwitch.vue +85 -85
  46. package/src/components/EbizTabHeader.vue +132 -132
  47. package/src/components/EbizTabPanel.vue +22 -22
  48. package/src/components/EbizTable.vue +469 -469
  49. package/src/components/EbizTableColumn.vue +116 -116
  50. package/src/components/EbizTableSort.vue +179 -179
  51. package/src/components/EbizTabs.vue +142 -142
  52. package/src/components/EbizTdesignButtonDialog.vue +332 -332
  53. package/src/components/EbizTdesignLoading.vue +107 -107
  54. package/src/components/EbizTimePicker.vue +143 -143
  55. package/src/components/EbizTitle.vue +91 -91
  56. package/src/components/EbizTree.vue +152 -152
  57. package/src/components/EbizTreeMergeTable.vue +1414 -1414
  58. package/src/components/EbizTreeSelector.vue +418 -418
  59. package/src/components/EbizVxeTable.vue +290 -290
  60. package/src/components/Form.vue +28 -28
  61. package/src/components/Home.vue +7 -7
  62. package/src/components/MyComponent.vue +39 -39
  63. package/src/components/Table.vue +45 -45
  64. package/src/components/TdesignAlert.vue +115 -115
  65. package/src/components/TdesignButton.vue +135 -135
  66. package/src/components/TdesignCalendar/index.vue +145 -145
  67. package/src/components/TdesignCard.vue +195 -195
  68. package/src/components/TdesignCol.vue +101 -101
  69. package/src/components/TdesignCollapse.vue +142 -142
  70. package/src/components/TdesignCollapsePanel.vue +79 -79
  71. package/src/components/TdesignDatePicker.vue +124 -124
  72. package/src/components/TdesignDescriptions.vue +74 -74
  73. package/src/components/TdesignDescriptionsItem.vue +50 -50
  74. package/src/components/TdesignDialog.vue +225 -225
  75. package/src/components/TdesignForm.vue +138 -138
  76. package/src/components/TdesignFormItem.vue +105 -105
  77. package/src/components/TdesignGrid.vue +55 -55
  78. package/src/components/TdesignIcon.vue +67 -67
  79. package/src/components/TdesignImage.vue +162 -162
  80. package/src/components/TdesignImageViewer.vue +200 -200
  81. package/src/components/TdesignInput.vue +242 -242
  82. package/src/components/TdesignSelect.vue +444 -444
  83. package/src/components/TdesignTag.vue +117 -117
  84. package/src/components/TdesignTextarea.vue +142 -142
  85. package/src/components/TdesignTimeline.vue +58 -58
  86. package/src/components/TdesignTimelineItem.vue +71 -71
  87. package/src/components/TdesignUpload.vue +392 -388
  88. package/src/components/TdesignWatermark.vue +107 -107
  89. package/src/components/ebiz-form/components/cascader.vue +61 -61
  90. package/src/components/ebiz-form/components/checkbox.vue +37 -37
  91. package/src/components/ebiz-form/components/city.vue +137 -137
  92. package/src/components/ebiz-form/components/date-panel.vue +52 -52
  93. package/src/components/ebiz-form/components/date-range-panel.vue +52 -52
  94. package/src/components/ebiz-form/components/date-range.vue +56 -56
  95. package/src/components/ebiz-form/components/date.vue +52 -52
  96. package/src/components/ebiz-form/components/editor-multi-language.vue +47 -47
  97. package/src/components/ebiz-form/components/editor.vue +78 -78
  98. package/src/components/ebiz-form/components/file-multi-language.vue +52 -52
  99. package/src/components/ebiz-form/components/file.vue +149 -149
  100. package/src/components/ebiz-form/components/images-multi-language.vue +52 -52
  101. package/src/components/ebiz-form/components/images.vue +129 -129
  102. package/src/components/ebiz-form/components/img-multi-language.vue +51 -51
  103. package/src/components/ebiz-form/components/img.vue +129 -129
  104. package/src/components/ebiz-form/components/number.vue +50 -50
  105. package/src/components/ebiz-form/components/radio.vue +28 -28
  106. package/src/components/ebiz-form/components/select.vue +119 -119
  107. package/src/components/ebiz-form/components/switch.vue +23 -23
  108. package/src/components/ebiz-form/components/text-multi-language.vue +47 -47
  109. package/src/components/ebiz-form/components/text.vue +52 -52
  110. package/src/components/ebiz-form/components/textarea-multi-language.vue +48 -48
  111. package/src/components/ebiz-form/components/textarea.vue +29 -29
  112. package/src/components/ebiz-form/components/video-multi-language.vue +51 -51
  113. package/src/components/ebiz-form/components/video.vue +97 -97
  114. package/src/components/ebiz-form/index.vue +157 -157
  115. package/src/components/examples/PopconfirmExample.vue +149 -149
  116. package/src/components/icons/IconCommunity.vue +7 -7
  117. package/src/components/icons/IconDocumentation.vue +7 -7
  118. package/src/components/icons/IconEcosystem.vue +7 -7
  119. package/src/components/icons/IconSupport.vue +7 -7
  120. package/src/components/icons/IconTooling.vue +19 -19
  121. package/src/components/senior/EbizSData/index.vue +262 -262
  122. package/src/components/senior/EbizSDialog/index.vue +713 -713
  123. package/src/components/senior/EbizSForm/README.md +157 -157
  124. package/src/components/senior/EbizSForm/index.vue +668 -668
  125. package/src/components/senior/EbizSForm/item.vue +505 -522
  126. package/src/components/senior/EbizSForm/mItems/DateTimePicker.vue +51 -51
  127. package/src/components/senior/EbizSForm/mItems/Picker.vue +63 -63
  128. package/src/index.js +224 -218
  129. package/src/main.js +55 -55
  130. package/src/router/index.js +386 -374
  131. package/src/utils/formatCode.js +24 -24
  132. package/src/utils/generateImportStatement.js +52 -52
  133. package/src/utils/hasJsx.js +25 -25
  134. package/src/utils/index.js +166 -166
  135. package/src/utils/mergeOptions.js +29 -29
  136. package/src/utils/parseRequiredBlocks.js +18 -18
  137. package/src/utils/upload.ts +126 -126
  138. package/src/utils/vue-sfc-validator.js +155 -155
  139. package/src/views/Button.vue +23 -23
  140. package/src/views/CheckboxDemo.vue +104 -104
  141. package/src/views/DataContainer.vue +19 -19
  142. package/src/views/DialogDemo.vue +125 -125
  143. package/src/views/EbizApprovalDemo.vue +76 -76
  144. package/src/views/EbizAutoFormDemo.vue +129 -129
  145. package/src/views/EbizAvatar.vue +223 -223
  146. package/src/views/EbizDepartmentSelectorDemo.vue +169 -169
  147. package/src/views/EbizDetailBlockDemo.vue +30 -30
  148. package/src/views/EbizEmployeeInfo.vue +249 -249
  149. package/src/views/EbizEmployeeSelector.vue +83 -83
  150. package/src/views/EbizMap.vue +201 -201
  151. package/src/views/EbizMeetingRoomSelectorDemo.vue +294 -0
  152. package/src/views/EbizMobileMeetingRoomSelectorDemo.vue +567 -0
  153. package/src/views/EbizRadioDemo.vue +151 -151
  154. package/src/views/EbizSDataDemo.vue +136 -136
  155. package/src/views/EbizSDialogDemo.vue +301 -301
  156. package/src/views/EbizSForm/index.vue +359 -359
  157. package/src/views/EbizSFormDemo.vue +420 -420
  158. package/src/views/EbizSpace.vue +185 -185
  159. package/src/views/EbizSwiper.vue +157 -157
  160. package/src/views/EbizTdesignButtonDialogExample.vue +437 -437
  161. package/src/views/Form.vue +19 -19
  162. package/src/views/GridDemo.vue +238 -238
  163. package/src/views/Home.vue +148 -146
  164. package/src/views/Mindmap.vue +17 -17
  165. package/src/views/MyComponent.vue +19 -19
  166. package/src/views/OkrTree.vue +19 -19
  167. package/src/views/PageHeaderDemo.vue +104 -104
  168. package/src/views/PaginationDemo.vue +96 -96
  169. package/src/views/PermissionBoxDemo.vue +85 -85
  170. package/src/views/PopconfirmDemo.vue +80 -80
  171. package/src/views/RemoteSelect.vue +350 -350
  172. package/src/views/StatisticDemo.vue +190 -190
  173. package/src/views/SwitchDemo.vue +79 -79
  174. package/src/views/Table.vue +19 -19
  175. package/src/views/TableDemo.vue +334 -334
  176. package/src/views/TableSortDemo.vue +143 -143
  177. package/src/views/TableView.vue +68 -68
  178. package/src/views/TabsDemo.vue +282 -282
  179. package/src/views/TagDemo.vue +101 -101
  180. package/src/views/TdesignAlert.vue +98 -98
  181. package/src/views/TdesignButton.vue +190 -190
  182. package/src/views/TdesignCalendar.vue +94 -94
  183. package/src/views/TdesignCard.vue +296 -296
  184. package/src/views/TdesignCollapse.vue +293 -293
  185. package/src/views/TdesignDatePicker.vue +187 -187
  186. package/src/views/TdesignDescriptions.vue +101 -101
  187. package/src/views/TdesignForm.vue +248 -248
  188. package/src/views/TdesignIcon.vue +203 -203
  189. package/src/views/TdesignImage.vue +215 -215
  190. package/src/views/TdesignImageViewer.vue +198 -198
  191. package/src/views/TdesignInput.vue +252 -252
  192. package/src/views/TdesignSelect.vue +473 -473
  193. package/src/views/TdesignSwiper.vue +157 -157
  194. package/src/views/TextareaDemo.vue +93 -93
  195. package/src/views/TimePickerDemo.vue +146 -146
  196. package/src/views/TimelineDemo.vue +160 -160
  197. package/src/views/Title.vue +19 -19
  198. package/src/views/TreeDemo.vue +254 -254
  199. package/src/views/TreeMergeTableDemo.vue +239 -239
  200. package/src/views/TreeSelectorDemo.vue +245 -245
  201. package/src/views/UploadDemo.vue +121 -121
  202. package/src/views/VxeTableDemo.vue +279 -279
  203. package/src/views/WatermarkDemo.vue +85 -85
@@ -1,117 +1,117 @@
1
- <script setup>
2
- import { computed, inject, onMounted, getCurrentInstance } from 'vue';
3
-
4
- const props = defineProps({
5
- // 列唯一标识
6
- colKey: {
7
- type: String,
8
- required: true
9
- },
10
- // 列标题
11
- title: {
12
- type: String,
13
- default: ''
14
- },
15
- // 列宽度
16
- width: {
17
- type: [String, Number],
18
- default: ''
19
- },
20
- // 最小列宽
21
- minWidth: {
22
- type: [String, Number],
23
- default: ''
24
- },
25
- // 水平对齐方式
26
- align: {
27
- type: String,
28
- default: 'left',
29
- validator: (val) => ['left', 'center', 'right'].includes(val)
30
- },
31
- // 固定列位置
32
- fixed: {
33
- type: String,
34
- default: '',
35
- validator: (val) => ['', 'left', 'right'].includes(val)
36
- },
37
- // 列类型
38
- type: {
39
- type: String,
40
- default: '',
41
- validator: (val) => ['', 'multiple', 'single', 'index', 'expand'].includes(val)
42
- },
43
- // 超出省略
44
- ellipsis: {
45
- type: Boolean,
46
- default: false
47
- },
48
- // 标题超出省略
49
- ellipsisTitle: {
50
- type: Boolean,
51
- default: false
52
- },
53
- // 是否支持排序
54
- sorter: {
55
- type: Boolean,
56
- default: false
57
- },
58
- // 过滤配置
59
- filter: {
60
- type: Object,
61
- default: null
62
- },
63
- // 自定义类名
64
- className: {
65
- type: String,
66
- default: ''
67
- },
68
- // 是否禁用
69
- disabled: {
70
- type: Boolean,
71
- default: false
72
- }
73
- });
74
-
75
- // 获取父级表格组件实例
76
- const tableCtx = inject('tableCtx', null);
77
- const instance = getCurrentInstance();
78
-
79
- // 格式化列配置对象
80
- const columnConfig = computed(() => {
81
- return {
82
- colKey: props.colKey,
83
- title: props.title,
84
- width: props.width,
85
- minWidth: props.minWidth,
86
- align: props.align,
87
- fixed: props.fixed || '',
88
- type: props.type || '',
89
- ellipsis: props.ellipsis,
90
- ellipsisTitle: props.ellipsisTitle,
91
- sorter: props.sorter,
92
- filter: props.filter,
93
- className: props.className,
94
- disabled: props.disabled,
95
- cell: instance.slots.default ? props.colKey : undefined,
96
- title: instance.slots.title ? `title-${props.colKey}` : undefined
97
- };
98
- });
99
-
100
- // 在组件挂载时将列配置注册到表格组件
101
- onMounted(() => {
102
- if (tableCtx && typeof tableCtx.registerColumn === 'function') {
103
- tableCtx.registerColumn(columnConfig.value);
104
- } else {
105
- console.warn('EbizTableColumn必须在EbizTable内部使用');
106
- }
107
- });
108
- </script>
109
-
110
- <template>
111
- <template v-if="$slots.default">
112
- <slot></slot>
113
- </template>
114
- <template v-if="$slots.title">
115
- <slot name="title"></slot>
116
- </template>
1
+ <script setup>
2
+ import { computed, inject, onMounted, getCurrentInstance } from 'vue';
3
+
4
+ const props = defineProps({
5
+ // 列唯一标识
6
+ colKey: {
7
+ type: String,
8
+ required: true
9
+ },
10
+ // 列标题
11
+ title: {
12
+ type: String,
13
+ default: ''
14
+ },
15
+ // 列宽度
16
+ width: {
17
+ type: [String, Number],
18
+ default: ''
19
+ },
20
+ // 最小列宽
21
+ minWidth: {
22
+ type: [String, Number],
23
+ default: ''
24
+ },
25
+ // 水平对齐方式
26
+ align: {
27
+ type: String,
28
+ default: 'left',
29
+ validator: (val) => ['left', 'center', 'right'].includes(val)
30
+ },
31
+ // 固定列位置
32
+ fixed: {
33
+ type: String,
34
+ default: '',
35
+ validator: (val) => ['', 'left', 'right'].includes(val)
36
+ },
37
+ // 列类型
38
+ type: {
39
+ type: String,
40
+ default: '',
41
+ validator: (val) => ['', 'multiple', 'single', 'index', 'expand'].includes(val)
42
+ },
43
+ // 超出省略
44
+ ellipsis: {
45
+ type: Boolean,
46
+ default: false
47
+ },
48
+ // 标题超出省略
49
+ ellipsisTitle: {
50
+ type: Boolean,
51
+ default: false
52
+ },
53
+ // 是否支持排序
54
+ sorter: {
55
+ type: Boolean,
56
+ default: false
57
+ },
58
+ // 过滤配置
59
+ filter: {
60
+ type: Object,
61
+ default: null
62
+ },
63
+ // 自定义类名
64
+ className: {
65
+ type: String,
66
+ default: ''
67
+ },
68
+ // 是否禁用
69
+ disabled: {
70
+ type: Boolean,
71
+ default: false
72
+ }
73
+ });
74
+
75
+ // 获取父级表格组件实例
76
+ const tableCtx = inject('tableCtx', null);
77
+ const instance = getCurrentInstance();
78
+
79
+ // 格式化列配置对象
80
+ const columnConfig = computed(() => {
81
+ return {
82
+ colKey: props.colKey,
83
+ title: props.title,
84
+ width: props.width,
85
+ minWidth: props.minWidth,
86
+ align: props.align,
87
+ fixed: props.fixed || '',
88
+ type: props.type || '',
89
+ ellipsis: props.ellipsis,
90
+ ellipsisTitle: props.ellipsisTitle,
91
+ sorter: props.sorter,
92
+ filter: props.filter,
93
+ className: props.className,
94
+ disabled: props.disabled,
95
+ cell: instance.slots.default ? props.colKey : undefined,
96
+ title: instance.slots.title ? `title-${props.colKey}` : undefined
97
+ };
98
+ });
99
+
100
+ // 在组件挂载时将列配置注册到表格组件
101
+ onMounted(() => {
102
+ if (tableCtx && typeof tableCtx.registerColumn === 'function') {
103
+ tableCtx.registerColumn(columnConfig.value);
104
+ } else {
105
+ console.warn('EbizTableColumn必须在EbizTable内部使用');
106
+ }
107
+ });
108
+ </script>
109
+
110
+ <template>
111
+ <template v-if="$slots.default">
112
+ <slot></slot>
113
+ </template>
114
+ <template v-if="$slots.title">
115
+ <slot name="title"></slot>
116
+ </template>
117
117
  </template>
@@ -1,180 +1,180 @@
1
- <template>
2
- <div class="ebiz-table-sort">
3
- <t-popup :visible="sortVisible" trigger="click" placement="bottom-right" :overlay-style="{ width: '450px' }"
4
- @visible-change="handleVisibleChange" :destroy-on-close="false">
5
- <template #content>
6
- <t-card :title="popupTitle" size="small" :bordered="false">
7
- <div class="sort-content">
8
- <div class="sort-item" v-for="(item, index) in sortItems" :key="index">
9
- <div class="sort-item-content" style="display: flex; margin-bottom: 12px;">
10
- <t-select v-model="item.type" :placeholder="fieldPlaceholder" :options="fieldOptions" :clearable="false"
11
- :style="{ width: '170px' }" @change="handleSortChange" />
12
- <t-select v-model="item.sort" :placeholder="orderPlaceholder" :options="orderOptions" :clearable="false"
13
- :style="{ width: '170px', marginLeft: '8px' }" @change="handleSortChange" />
14
- <t-button theme="default" variant="text" shape="circle" @click="removeSortItem(index)"
15
- v-if="sortItems.length > 1" :style="{ marginLeft: '8px', flexShrink: 0 }">
16
- <template #icon>
17
- <t-icon name="close" />
18
- </template>
19
- </t-button>
20
- </div>
21
- </div>
22
- <div class="sort-footer">
23
- <t-button theme="default" variant="outline" @click="addSortItem" v-if="sortItems.length < maxSortItems">
24
- <template #icon>
25
- <t-icon name="add" />
26
- </template>
27
- {{ addConditionText }}
28
- </t-button>
29
- </div>
30
- </div>
31
- </t-card>
32
- </template>
33
- <t-button block variant="outline" :title="title">
34
- <template #icon>
35
- <t-icon name="filter"></t-icon>
36
- </template>
37
- <div v-if="buttonText">
38
- {{ buttonText }}
39
- </div>
40
- </t-button>
41
- </t-popup>
42
- </div>
43
- </template>
44
-
45
- <script>
46
- export default {
47
- name: "EbizTableSort"
48
- }
49
- </script>
50
-
51
- <script setup>
52
- import { ref, computed, defineProps, defineEmits, watch } from 'vue';
53
- import { Button as TButton, Popup as TPopup, Card as TCard, Select as TSelect, Icon as TIcon } from 'tdesign-vue-next';
54
-
55
- const props = defineProps({
56
- // v-model绑定值
57
- modelValue: {
58
- type: Array,
59
- default: () => []
60
- },
61
- // 按钮图标
62
- icon: {
63
- type: String,
64
- default: 'sort'
65
- },
66
- // 按钮文本
67
- buttonText: {
68
- type: String,
69
- default: ''
70
- },
71
- // 按钮标题
72
- title: {
73
- type: String,
74
- default: '排序'
75
- },
76
- // 弹出层标题
77
- popupTitle: {
78
- type: String,
79
- default: '排序'
80
- },
81
- // 字段选项
82
- fieldOptions: {
83
- type: Array,
84
- default: () => []
85
- },
86
- // 字段占位符
87
- fieldPlaceholder: {
88
- type: String,
89
- default: '选择字段'
90
- },
91
- // 排序选项
92
- orderOptions: {
93
- type: Array,
94
- default: () => [
95
- { value: 'asc', label: '升序 ↑' },
96
- { value: 'desc', label: '降序 ↓' }
97
- ]
98
- },
99
- // 排序占位符
100
- orderPlaceholder: {
101
- type: String,
102
- default: '选择排序'
103
- },
104
- // 最大排序条件数量
105
- maxSortItems: {
106
- type: Number,
107
- default: 5
108
- },
109
- // 添加条件文本
110
- addConditionText: {
111
- type: String,
112
- default: '添加排序条件'
113
- }
114
- });
115
-
116
- const emit = defineEmits(['update:modelValue', 'sort', 'visible-change']);
117
-
118
- // 排序弹出层显示状态
119
- const sortVisible = ref(false);
120
-
121
- // 排序条件列表
122
- const sortItems = ref([]);
123
-
124
- // 监听modelValue变化
125
- watch(() => props.modelValue, (newVal) => {
126
- if (newVal && newVal.length > 0) {
127
- sortItems.value = JSON.parse(JSON.stringify(newVal));
128
- } else {
129
- // 默认添加一个空的排序条件
130
- sortItems.value = [{ type: '', sort: 'desc' }];
131
- }
132
- }, { immediate: true });
133
-
134
- // 添加排序条件
135
- const addSortItem = () => {
136
- if (sortItems.value.length < props.maxSortItems) {
137
- sortItems.value.push({ type: '', sort: 'desc' });
138
- }
139
- };
140
-
141
- // 移除排序条件
142
- const removeSortItem = (index) => {
143
- sortItems.value.splice(index, 1);
144
- handleSortChange();
145
- };
146
-
147
- // 处理排序变更
148
- const handleSortChange = () => {
149
- // 过滤有效的排序条件(字段和排序方向都不为空)
150
- const validSortItems = sortItems.value.filter(item => item.type && item.sort);
151
- emit('update:modelValue', validSortItems);
152
- emit('sort', validSortItems);
153
- };
154
-
155
- // 弹出层可见性变化
156
- const handleVisibleChange = (visible) => {
157
- sortVisible.value = visible;
158
- emit('visible-change', visible);
159
- };
160
- </script>
161
-
162
- <style lang="less" scoped>
163
- .ebiz-table-sort {
164
- display: inline-block;
165
-
166
- .sort-content {
167
- min-width: 400px;
168
- width: 100%;
169
- }
170
-
171
- .sort-footer {
172
- margin-top: 16px;
173
- }
174
-
175
- .sort-actions {
176
- display: flex;
177
- justify-content: flex-end;
178
- }
179
- }
1
+ <template>
2
+ <div class="ebiz-table-sort">
3
+ <t-popup :visible="sortVisible" trigger="click" placement="bottom-right" :overlay-style="{ width: '450px' }"
4
+ @visible-change="handleVisibleChange" :destroy-on-close="false">
5
+ <template #content>
6
+ <t-card :title="popupTitle" size="small" :bordered="false">
7
+ <div class="sort-content">
8
+ <div class="sort-item" v-for="(item, index) in sortItems" :key="index">
9
+ <div class="sort-item-content" style="display: flex; margin-bottom: 12px;">
10
+ <t-select v-model="item.type" :placeholder="fieldPlaceholder" :options="fieldOptions" :clearable="false"
11
+ :style="{ width: '170px' }" @change="handleSortChange" />
12
+ <t-select v-model="item.sort" :placeholder="orderPlaceholder" :options="orderOptions" :clearable="false"
13
+ :style="{ width: '170px', marginLeft: '8px' }" @change="handleSortChange" />
14
+ <t-button theme="default" variant="text" shape="circle" @click="removeSortItem(index)"
15
+ v-if="sortItems.length > 1" :style="{ marginLeft: '8px', flexShrink: 0 }">
16
+ <template #icon>
17
+ <t-icon name="close" />
18
+ </template>
19
+ </t-button>
20
+ </div>
21
+ </div>
22
+ <div class="sort-footer">
23
+ <t-button theme="default" variant="outline" @click="addSortItem" v-if="sortItems.length < maxSortItems">
24
+ <template #icon>
25
+ <t-icon name="add" />
26
+ </template>
27
+ {{ addConditionText }}
28
+ </t-button>
29
+ </div>
30
+ </div>
31
+ </t-card>
32
+ </template>
33
+ <t-button block variant="outline" :title="title">
34
+ <template #icon>
35
+ <t-icon name="filter"></t-icon>
36
+ </template>
37
+ <div v-if="buttonText">
38
+ {{ buttonText }}
39
+ </div>
40
+ </t-button>
41
+ </t-popup>
42
+ </div>
43
+ </template>
44
+
45
+ <script>
46
+ export default {
47
+ name: "EbizTableSort"
48
+ }
49
+ </script>
50
+
51
+ <script setup>
52
+ import { ref, computed, defineProps, defineEmits, watch } from 'vue';
53
+ import { Button as TButton, Popup as TPopup, Card as TCard, Select as TSelect, Icon as TIcon } from 'tdesign-vue-next';
54
+
55
+ const props = defineProps({
56
+ // v-model绑定值
57
+ modelValue: {
58
+ type: Array,
59
+ default: () => []
60
+ },
61
+ // 按钮图标
62
+ icon: {
63
+ type: String,
64
+ default: 'sort'
65
+ },
66
+ // 按钮文本
67
+ buttonText: {
68
+ type: String,
69
+ default: ''
70
+ },
71
+ // 按钮标题
72
+ title: {
73
+ type: String,
74
+ default: '排序'
75
+ },
76
+ // 弹出层标题
77
+ popupTitle: {
78
+ type: String,
79
+ default: '排序'
80
+ },
81
+ // 字段选项
82
+ fieldOptions: {
83
+ type: Array,
84
+ default: () => []
85
+ },
86
+ // 字段占位符
87
+ fieldPlaceholder: {
88
+ type: String,
89
+ default: '选择字段'
90
+ },
91
+ // 排序选项
92
+ orderOptions: {
93
+ type: Array,
94
+ default: () => [
95
+ { value: 'asc', label: '升序 ↑' },
96
+ { value: 'desc', label: '降序 ↓' }
97
+ ]
98
+ },
99
+ // 排序占位符
100
+ orderPlaceholder: {
101
+ type: String,
102
+ default: '选择排序'
103
+ },
104
+ // 最大排序条件数量
105
+ maxSortItems: {
106
+ type: Number,
107
+ default: 5
108
+ },
109
+ // 添加条件文本
110
+ addConditionText: {
111
+ type: String,
112
+ default: '添加排序条件'
113
+ }
114
+ });
115
+
116
+ const emit = defineEmits(['update:modelValue', 'sort', 'visible-change']);
117
+
118
+ // 排序弹出层显示状态
119
+ const sortVisible = ref(false);
120
+
121
+ // 排序条件列表
122
+ const sortItems = ref([]);
123
+
124
+ // 监听modelValue变化
125
+ watch(() => props.modelValue, (newVal) => {
126
+ if (newVal && newVal.length > 0) {
127
+ sortItems.value = JSON.parse(JSON.stringify(newVal));
128
+ } else {
129
+ // 默认添加一个空的排序条件
130
+ sortItems.value = [{ type: '', sort: 'desc' }];
131
+ }
132
+ }, { immediate: true });
133
+
134
+ // 添加排序条件
135
+ const addSortItem = () => {
136
+ if (sortItems.value.length < props.maxSortItems) {
137
+ sortItems.value.push({ type: '', sort: 'desc' });
138
+ }
139
+ };
140
+
141
+ // 移除排序条件
142
+ const removeSortItem = (index) => {
143
+ sortItems.value.splice(index, 1);
144
+ handleSortChange();
145
+ };
146
+
147
+ // 处理排序变更
148
+ const handleSortChange = () => {
149
+ // 过滤有效的排序条件(字段和排序方向都不为空)
150
+ const validSortItems = sortItems.value.filter(item => item.type && item.sort);
151
+ emit('update:modelValue', validSortItems);
152
+ emit('sort', validSortItems);
153
+ };
154
+
155
+ // 弹出层可见性变化
156
+ const handleVisibleChange = (visible) => {
157
+ sortVisible.value = visible;
158
+ emit('visible-change', visible);
159
+ };
160
+ </script>
161
+
162
+ <style lang="less" scoped>
163
+ .ebiz-table-sort {
164
+ display: inline-block;
165
+
166
+ .sort-content {
167
+ min-width: 400px;
168
+ width: 100%;
169
+ }
170
+
171
+ .sort-footer {
172
+ margin-top: 16px;
173
+ }
174
+
175
+ .sort-actions {
176
+ display: flex;
177
+ justify-content: flex-end;
178
+ }
179
+ }
180
180
  </style>