ct-component-plus 0.0.42 → 0.0.43

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 (91) hide show
  1. package/package.json +36 -36
  2. package/packages/components/button/index.js +8 -8
  3. package/packages/components/button/src/button.vue +171 -171
  4. package/packages/components/cascader/index.js +7 -7
  5. package/packages/components/cascader/src/cascader.vue +247 -247
  6. package/packages/components/cascader/src/ct-cascader.vue +260 -260
  7. package/packages/components/cascader/src/index.js +50 -50
  8. package/packages/components/checkbox/index.js +7 -7
  9. package/packages/components/checkbox/src/checkbox.vue +51 -51
  10. package/packages/components/checkbox/src/index.js +12 -12
  11. package/packages/components/date-picker/index.js +8 -8
  12. package/packages/components/date-picker/src/clear-icon.vue +2 -2
  13. package/packages/components/date-picker/src/date-icon.vue +2 -2
  14. package/packages/components/date-picker/src/date-picker.vue +77 -77
  15. package/packages/components/date-picker/src/index.js +33 -33
  16. package/packages/components/dialog/index.js +8 -8
  17. package/packages/components/dialog/src/dialog.vue +103 -103
  18. package/packages/components/empty/index.js +8 -8
  19. package/packages/components/empty/src/empty.vue +97 -97
  20. package/packages/components/index.js +81 -81
  21. package/packages/components/input/index.js +7 -7
  22. package/packages/components/input/src/index.js +13 -13
  23. package/packages/components/input/src/input.vue +106 -106
  24. package/packages/components/input-range/index.js +7 -7
  25. package/packages/components/input-range/src/index.js +29 -29
  26. package/packages/components/input-range/src/input-range.vue +233 -233
  27. package/packages/components/loading/index.js +7 -7
  28. package/packages/components/loading/src/CtLoading.vue +74 -74
  29. package/packages/components/loading/src/beating.vue +71 -71
  30. package/packages/components/loading/src/progress.vue +120 -120
  31. package/packages/components/loading/src/spinner.vue +38 -38
  32. package/packages/components/menu/index.js +7 -7
  33. package/packages/components/menu/src/item.vue +46 -46
  34. package/packages/components/menu/src/link.vue +28 -28
  35. package/packages/components/menu/src/logo.vue +25 -25
  36. package/packages/components/menu/src/menu-item.vue +103 -103
  37. package/packages/components/menu/src/menu.vue +191 -191
  38. package/packages/components/menu/src/utils/index.js +4 -4
  39. package/packages/components/message/icon/ErrorIcon.vue +25 -25
  40. package/packages/components/message/icon/InfoIcon.vue +25 -25
  41. package/packages/components/message/icon/SuccessIcon.vue +25 -25
  42. package/packages/components/message/icon/WarningIcon.vue +25 -25
  43. package/packages/components/message/index.js +8 -8
  44. package/packages/components/message/src/method.js +54 -54
  45. package/packages/components/message-box/index.js +7 -7
  46. package/packages/components/message-box/src/message-box.vue +107 -107
  47. package/packages/components/page/index.js +7 -7
  48. package/packages/components/page/src/modules/DownloadButton.vue +21 -21
  49. package/packages/components/page/src/modules/TableTitle.vue +151 -151
  50. package/packages/components/page/src/page.vue +382 -382
  51. package/packages/components/pagination/index.js +7 -7
  52. package/packages/components/pagination/src/pagination.vue +36 -36
  53. package/packages/components/radio/index.js +7 -7
  54. package/packages/components/radio/src/index.js +12 -12
  55. package/packages/components/radio/src/radio.vue +47 -47
  56. package/packages/components/search-box/index.js +24 -24
  57. package/packages/components/search-box/src/index.js +29 -29
  58. package/packages/components/search-box/src/search-box.vue +250 -251
  59. package/packages/components/search-box/src/slot.vue +4 -4
  60. package/packages/components/select/index.js +7 -7
  61. package/packages/components/select/src/arrow-down.vue +2 -2
  62. package/packages/components/select/src/clear-icon.vue +2 -2
  63. package/packages/components/select/src/empty.vue +13 -13
  64. package/packages/components/select/src/index.js +51 -51
  65. package/packages/components/select/src/select.vue +380 -380
  66. package/packages/components/table/index.js +7 -7
  67. package/packages/components/table/src/TableSort.vue +179 -179
  68. package/packages/components/table/src/index.js +70 -66
  69. package/packages/components/table/src/table.vue +287 -287
  70. package/packages/components/tabs/index.js +7 -7
  71. package/packages/components/tabs/src/tabs.vue +225 -225
  72. package/packages/components/year-select/index.js +7 -7
  73. package/packages/components/year-select/src/index.js +44 -44
  74. package/packages/components/year-select/src/year-select.vue +273 -273
  75. package/packages/echarts/bar/index.js +63 -63
  76. package/packages/echarts/base.js +99 -99
  77. package/packages/echarts/line/index.js +106 -106
  78. package/packages/hooks/index.js +5 -5
  79. package/packages/hooks/use-buried/index.js +46 -46
  80. package/packages/hooks/use-checked-all/index.js +37 -37
  81. package/packages/hooks/use-echarts/index.js +1 -1
  82. package/packages/hooks/use-echarts/use-bar/index.js +72 -72
  83. package/packages/hooks/use-echarts/use-line/index.js +88 -88
  84. package/packages/hooks/use-namespace/index.js +65 -65
  85. package/packages/hooks/use-search-component/index.js +28 -28
  86. package/packages/style/element.less +725 -725
  87. package/packages/style/index.js +2 -2
  88. package/packages/style/init.less +114 -114
  89. package/packages/utils/index.js +1 -1
  90. package/packages/utils/operate.js +77 -77
  91. package/packages/utils/types.js +35 -35
@@ -1,380 +1,380 @@
1
- <template>
2
- <!-- {{ rawAttr }}-- -->
3
- <el-select
4
- ref="selectRef"
5
- :class="[ns.b(), ns.is('multiple', multiple)]"
6
- v-model="valueModel"
7
- collapse-tags
8
- v-bind="rawAttr"
9
- :multiple="multiple"
10
- :filterable="filterable"
11
- :clear-icon="clearIcon"
12
- :suffix-icon="suffixIcon"
13
- :fit-input-width="fitInputWidth"
14
- :select-text="selectText"
15
- :popper-class="ns.e('popper')"
16
- @focus="showSearchPrefix"
17
- @blur="hideSearchPrefix">
18
- <template #prefix>
19
- <div
20
- :class="[ns.e('filterable-icon')]"
21
- v-if="filterable && !valueModel && showSearch">
22
- <ct-icon name="search_line"></ct-icon>
23
- </div>
24
- <slot name="prefix"></slot>
25
- </template>
26
- <div :class="[ns.e('top')]" v-if="multiple">
27
- <div :class="[ns.e('filter')]">
28
- <el-input v-model="keyword" ref="filterInput">
29
- <template #prefix>
30
- <ct-icon name="search_line"></ct-icon>
31
- </template>
32
- </el-input>
33
- </div>
34
- <div :class="[ns.e('select')]">
35
- <span :class="[ns.e('select-title')]">
36
- <span v-if="!keyword">已选{{ selectLength }}项</span>
37
- <span v-else>检索结果</span>
38
- </span>
39
- <el-checkbox
40
- v-model="checkedAll"
41
- v-show="!noFilterOptions"
42
- @change="changeCheckedAll"
43
- >全选</el-checkbox
44
- >
45
- </div>
46
- </div>
47
- <div :class="[ns.e('options')]" v-show="!noFilterOptions">
48
- <slot>
49
- <el-option
50
- v-for="(item, index) in filterOptions"
51
- :key="item.value"
52
- :label="item.label"
53
- :value="item.value"
54
- :disabled="item.disabled">
55
- <slot name="option" :item="item" :index="index">
56
- <span :title="selectTooltip ? item.label : undefined">{{
57
- item.label
58
- }}</span>
59
- </slot>
60
- </el-option>
61
- </slot>
62
- </div>
63
- <Empty :text="emptyText" v-if="multiple && noFilterOptions" />
64
- <template #empty>
65
- <slot name="empty">
66
- <Empty :text="emptyText" />
67
- </slot>
68
- </template>
69
- </el-select>
70
- </template>
71
-
72
- <script setup>
73
- import { onMounted, computed, ref, watch, inject, watchEffect } from "vue";
74
- import { selectEmits, selectProps } from "./index";
75
- import { useNamespace, useBuriedParams, useCheckedAll } from "../../../hooks";
76
- import { isFunction, isArray } from "../../../utils";
77
- import Empty from "./empty.vue";
78
- const baseDao = inject("$ctBaseDao");
79
- const serviceConfig = inject("$ctServiceConfig");
80
- const selectTooltip = inject("$selectTooltip");
81
-
82
- const props = defineProps(selectProps);
83
- const emit = defineEmits(selectEmits);
84
-
85
- // const getBuriedContent = () => {
86
- // const select = selectObj.value;
87
- // if (isArray(select)) {
88
- // return select.map((item) => item.label);
89
- // }
90
- // return select.label;
91
- // };
92
- const ns = useNamespace("select");
93
- const optionsByApi = ref([]);
94
- const showOptions = computed(() => {
95
- return optionsByApi.value.length ? optionsByApi.value : props.options;
96
- });
97
- const valueModel = computed({
98
- get() {
99
- return props.modelValue || (props.multiple ? [] : props.modelValue);
100
- },
101
- set(newValue) {
102
- emit("update:modelValue", newValue);
103
- },
104
- });
105
- const keyword = ref("");
106
- const selectRef = ref(null);
107
- const filterInput = ref(null);
108
-
109
- const selectLength = computed(() => {
110
- return valueModel.value.length;
111
- });
112
- const filterOptions = ref([]);
113
- const noFilterOptions = ref(false);
114
- const selectObj = computed({
115
- get() {
116
- if (!props.multiple)
117
- return showOptions.value.find((item) => item.value === valueModel.value);
118
- return showOptions.value.filter((item) => {
119
- return valueModel.value.includes(item.value);
120
- });
121
- },
122
- set(newValue) {
123
- if (!props.multiple) {
124
- valueModel.value = newValue.value;
125
- } else {
126
- valueModel.value = newValue.map((item) => item.value);
127
- }
128
- },
129
- });
130
- const selectText = computed(() => {
131
- if (!props.multiple) return "";
132
- if (
133
- showOptions.value.length &&
134
- showOptions.value.length === valueModel.value.length
135
- )
136
- return props.selectAllText;
137
- const cnt = props.connectors;
138
- return selectObj.value.map((item) => item.label).join(cnt);
139
- });
140
- const emptyText = computed(() => {
141
- return showOptions.value.length
142
- ? props.noMatchText || "暂无匹配数据"
143
- : props.noDataText || "暂无数据";
144
- });
145
- const getUseLabel = (label) => {
146
- return typeof label === "string" ? label : String(label);
147
- };
148
-
149
- watch(
150
- () => selectText.value,
151
- (newVal) => {
152
- selectRef.value.selectedLabel = newVal;
153
- }
154
- );
155
- watchEffect(async () => {
156
- // 输入框过滤,触发的事件
157
- let arr = showOptions.value.filter((item) => {
158
- return item.label && item.label.includes(keyword.value);
159
- });
160
- const cbs = props.cbs || {};
161
- if (isFunction(cbs.filterCallback)) {
162
- try {
163
- const filterCallbackHandle = await cbs.filterCallback(
164
- keyword.value,
165
- showOptions.value,
166
- valueModel
167
- );
168
- if (filterCallbackHandle === false) return;
169
- arr = filterCallbackHandle || arr;
170
- } catch (error) {}
171
- }
172
- if (arr.length) {
173
- filterOptions.value = arr;
174
- noFilterOptions.value = false;
175
- } else {
176
- filterOptions.value = showOptions.value;
177
- noFilterOptions.value = true;
178
- }
179
- });
180
- const watchServiceHandle = async () => {
181
- // 通过api获取数据,会监听api以及serviceParams的改变(收集到的依赖改变)都会触发重新查询
182
- const cbs = props.cbs || {};
183
- if (props.api && baseDao) {
184
- try {
185
- const method = props.serviceMethod || serviceConfig.defaultMethod;
186
- let params = props.serviceParams || {};
187
- if (isFunction(cbs.beforeSearch)) {
188
- const paramsHandle = await cbs.beforeSearch(params);
189
- if (paramsHandle === false) return;
190
- params = paramsHandle || params;
191
- }
192
- baseDao[method](props.api, params).then((res) => {
193
- const mapObj = props.mapObj || {};
194
- const { list, label = "label", value = "value", self } = mapObj;
195
- let data = [];
196
- if (list) {
197
- data = res[list];
198
- } else {
199
- data = res;
200
- }
201
- data = data.map((item) => {
202
- if (self) {
203
- return { label: getUseLabel(item), value: item };
204
- }
205
- return {
206
- ...item,
207
- label: getUseLabel(item[label]),
208
- value: item[value],
209
- };
210
- });
211
- optionsByApi.value = data;
212
- if (isFunction(cbs.afterSearch)) {
213
- cbs.afterSearch(res, optionsByApi, valueModel);
214
- }
215
- });
216
- } catch (error) {
217
- console.error(error);
218
- }
219
- }
220
- if (isFunction(cbs.defineSearch)) {
221
- try {
222
- const defineSearchHandle = await cbs.defineSearch(
223
- optionsByApi,
224
- valueModel
225
- );
226
- if (defineSearchHandle === false) return;
227
- if (defineSearchHandle) {
228
- optionsByApi.value = defineSearchHandle;
229
- }
230
- } catch (error) {}
231
- }
232
- };
233
- watch(
234
- [
235
- () => props.api,
236
- () => props.serviceParams,
237
- () => props.serviceMethod,
238
- () => props.mapObj,
239
- ],
240
- (newVal, oldVal) => {
241
- watchServiceHandle();
242
- },
243
- {
244
- immediate: true,
245
- }
246
- );
247
- const checkedAll = useCheckedAll(filterOptions, valueModel, {
248
- onCheckedAll: (falg) => {
249
- if (!keyword.value && !falg) {
250
- // 没有搜索,去掉全选就置空
251
- valueModel.value = [];
252
- }
253
- },
254
- }).checkedAll;
255
- const changeCheckedAll = () => {
256
- const selectEmit = selectRef.value.$emit;
257
- if (selectEmit) {
258
- selectEmit("change", valueModel.value);
259
- }
260
- };
261
-
262
- const focusFilter = () => {
263
- if (filterInput.value && filterInput.value.focus) {
264
- filterInput.value.focus();
265
- }
266
- };
267
-
268
- const showSearch = ref(false);
269
- const showSearchPrefix = () => {
270
- showSearch.value = true;
271
- };
272
- const hideSearchPrefix = () => {
273
- showSearch.value = false;
274
- };
275
-
276
- useBuriedParams(props, emit, {
277
- getContent: () => {
278
- const select = selectObj.value || {};
279
- if (isArray(select)) {
280
- return select.map((item) => item.label);
281
- }
282
- return select.label;
283
- },
284
- });
285
-
286
- onMounted(() => {
287
- if (!baseDao) {
288
- console.error("请先配置baseDao");
289
- }
290
- });
291
- defineExpose({
292
- ref: selectRef,
293
- keyword,
294
- filterInput,
295
- focusFilter,
296
- baseDao,
297
- serviceConfig,
298
- noFilterOptions,
299
- selectObj,
300
- checkedAll,
301
- });
302
- </script>
303
- <style lang="less">
304
- .ct-select {
305
- width: 214px;
306
- &__top {
307
- padding: 0 16px;
308
- font-size: var(--ct-font-size);
309
- }
310
- &__options {
311
- max-height: 274px;
312
- overflow-y: auto;
313
- }
314
- &__select {
315
- display: flex;
316
- justify-content: space-between;
317
- align-items: center;
318
- margin-bottom: 10px;
319
- &-title {
320
- color: var(--ct-color-grey-sub);
321
- line-height: 1;
322
- }
323
- .el-checkbox {
324
- height: auto;
325
- }
326
- }
327
- &__filter {
328
- margin-bottom: 16px;
329
- .el-input {
330
- --el-input-height: 28px;
331
- }
332
- }
333
- &__popper {
334
- &.is-multiple {
335
- min-width: 140px;
336
- }
337
- .el-select-dropdown__wrap {
338
- max-height: unset;
339
- }
340
- }
341
- .el-select__tags {
342
- display: none;
343
- }
344
- .el-input__prefix-inner {
345
- & > :last-child {
346
- margin-right: 0;
347
- }
348
- }
349
- &__filterable-icon {
350
- position: absolute;
351
- z-index: 3;
352
- right: var(--ct-component-inner-padding);
353
- top: 50%;
354
- height: calc(var(--ct-component-size) - 2px);
355
- transform: translateY(-50%);
356
- background-color: #fff;
357
- }
358
- &__empty {
359
- display: flex;
360
- justify-content: center;
361
- align-items: center;
362
- padding: 15px 16px;
363
- color: var(--ct-color-grey-sub);
364
- }
365
- &.is-multiple {
366
- &::after {
367
- content: attr(select-text);
368
- position: absolute;
369
- left: var(--ct-component-inner-padding);
370
- right: calc(var(--ct-component-inner-padding) * 2);
371
- top: 50%;
372
- transform: translateY(-50%);
373
- text-overflow: ellipsis;
374
- overflow: hidden;
375
- white-space: nowrap;
376
- cursor: pointer;
377
- }
378
- }
379
- }
380
- </style>
1
+ <template>
2
+ <!-- {{ rawAttr }}-- -->
3
+ <el-select
4
+ ref="selectRef"
5
+ :class="[ns.b(), ns.is('multiple', multiple)]"
6
+ v-model="valueModel"
7
+ collapse-tags
8
+ v-bind="rawAttr"
9
+ :multiple="multiple"
10
+ :filterable="filterable"
11
+ :clear-icon="clearIcon"
12
+ :suffix-icon="suffixIcon"
13
+ :fit-input-width="fitInputWidth"
14
+ :select-text="selectText"
15
+ :popper-class="ns.e('popper')"
16
+ @focus="showSearchPrefix"
17
+ @blur="hideSearchPrefix">
18
+ <template #prefix>
19
+ <div
20
+ :class="[ns.e('filterable-icon')]"
21
+ v-if="filterable && !valueModel && showSearch">
22
+ <ct-icon name="search_line"></ct-icon>
23
+ </div>
24
+ <slot name="prefix"></slot>
25
+ </template>
26
+ <div :class="[ns.e('top')]" v-if="multiple">
27
+ <div :class="[ns.e('filter')]">
28
+ <el-input v-model="keyword" ref="filterInput">
29
+ <template #prefix>
30
+ <ct-icon name="search_line"></ct-icon>
31
+ </template>
32
+ </el-input>
33
+ </div>
34
+ <div :class="[ns.e('select')]">
35
+ <span :class="[ns.e('select-title')]">
36
+ <span v-if="!keyword">已选{{ selectLength }}项</span>
37
+ <span v-else>检索结果</span>
38
+ </span>
39
+ <el-checkbox
40
+ v-model="checkedAll"
41
+ v-show="!noFilterOptions"
42
+ @change="changeCheckedAll"
43
+ >全选</el-checkbox
44
+ >
45
+ </div>
46
+ </div>
47
+ <div :class="[ns.e('options')]" v-show="!noFilterOptions">
48
+ <slot>
49
+ <el-option
50
+ v-for="(item, index) in filterOptions"
51
+ :key="item.value"
52
+ :label="item.label"
53
+ :value="item.value"
54
+ :disabled="item.disabled">
55
+ <slot name="option" :item="item" :index="index">
56
+ <span :title="selectTooltip ? item.label : undefined">{{
57
+ item.label
58
+ }}</span>
59
+ </slot>
60
+ </el-option>
61
+ </slot>
62
+ </div>
63
+ <Empty :text="emptyText" v-if="multiple && noFilterOptions" />
64
+ <template #empty>
65
+ <slot name="empty">
66
+ <Empty :text="emptyText" />
67
+ </slot>
68
+ </template>
69
+ </el-select>
70
+ </template>
71
+
72
+ <script setup>
73
+ import { onMounted, computed, ref, watch, inject, watchEffect } from "vue";
74
+ import { selectEmits, selectProps } from "./index";
75
+ import { useNamespace, useBuriedParams, useCheckedAll } from "../../../hooks";
76
+ import { isFunction, isArray } from "../../../utils";
77
+ import Empty from "./empty.vue";
78
+ const baseDao = inject("$ctBaseDao");
79
+ const serviceConfig = inject("$ctServiceConfig");
80
+ const selectTooltip = inject("$selectTooltip");
81
+
82
+ const props = defineProps(selectProps);
83
+ const emit = defineEmits(selectEmits);
84
+
85
+ // const getBuriedContent = () => {
86
+ // const select = selectObj.value;
87
+ // if (isArray(select)) {
88
+ // return select.map((item) => item.label);
89
+ // }
90
+ // return select.label;
91
+ // };
92
+ const ns = useNamespace("select");
93
+ const optionsByApi = ref([]);
94
+ const showOptions = computed(() => {
95
+ return optionsByApi.value.length ? optionsByApi.value : props.options;
96
+ });
97
+ const valueModel = computed({
98
+ get() {
99
+ return props.modelValue || (props.multiple ? [] : props.modelValue);
100
+ },
101
+ set(newValue) {
102
+ emit("update:modelValue", newValue);
103
+ },
104
+ });
105
+ const keyword = ref("");
106
+ const selectRef = ref(null);
107
+ const filterInput = ref(null);
108
+
109
+ const selectLength = computed(() => {
110
+ return valueModel.value.length;
111
+ });
112
+ const filterOptions = ref([]);
113
+ const noFilterOptions = ref(false);
114
+ const selectObj = computed({
115
+ get() {
116
+ if (!props.multiple)
117
+ return showOptions.value.find((item) => item.value === valueModel.value);
118
+ return showOptions.value.filter((item) => {
119
+ return valueModel.value.includes(item.value);
120
+ });
121
+ },
122
+ set(newValue) {
123
+ if (!props.multiple) {
124
+ valueModel.value = newValue.value;
125
+ } else {
126
+ valueModel.value = newValue.map((item) => item.value);
127
+ }
128
+ },
129
+ });
130
+ const selectText = computed(() => {
131
+ if (!props.multiple) return "";
132
+ if (
133
+ showOptions.value.length &&
134
+ showOptions.value.length === valueModel.value.length
135
+ )
136
+ return props.selectAllText;
137
+ const cnt = props.connectors;
138
+ return selectObj.value.map((item) => item.label).join(cnt);
139
+ });
140
+ const emptyText = computed(() => {
141
+ return showOptions.value.length
142
+ ? props.noMatchText || "暂无匹配数据"
143
+ : props.noDataText || "暂无数据";
144
+ });
145
+ const getUseLabel = (label) => {
146
+ return typeof label === "string" ? label : String(label);
147
+ };
148
+
149
+ watch(
150
+ () => selectText.value,
151
+ (newVal) => {
152
+ selectRef.value.selectedLabel = newVal;
153
+ }
154
+ );
155
+ watchEffect(async () => {
156
+ // 输入框过滤,触发的事件
157
+ let arr = showOptions.value.filter((item) => {
158
+ return item.label && item.label.includes(keyword.value);
159
+ });
160
+ const cbs = props.cbs || {};
161
+ if (isFunction(cbs.filterCallback)) {
162
+ try {
163
+ const filterCallbackHandle = await cbs.filterCallback(
164
+ keyword.value,
165
+ showOptions.value,
166
+ valueModel
167
+ );
168
+ if (filterCallbackHandle === false) return;
169
+ arr = filterCallbackHandle || arr;
170
+ } catch (error) {}
171
+ }
172
+ if (arr.length) {
173
+ filterOptions.value = arr;
174
+ noFilterOptions.value = false;
175
+ } else {
176
+ filterOptions.value = showOptions.value;
177
+ noFilterOptions.value = true;
178
+ }
179
+ });
180
+ const watchServiceHandle = async () => {
181
+ // 通过api获取数据,会监听api以及serviceParams的改变(收集到的依赖改变)都会触发重新查询
182
+ const cbs = props.cbs || {};
183
+ if (props.api && baseDao) {
184
+ try {
185
+ const method = props.serviceMethod || serviceConfig.defaultMethod;
186
+ let params = props.serviceParams || {};
187
+ if (isFunction(cbs.beforeSearch)) {
188
+ const paramsHandle = await cbs.beforeSearch(params);
189
+ if (paramsHandle === false) return;
190
+ params = paramsHandle || params;
191
+ }
192
+ baseDao[method](props.api, params).then((res) => {
193
+ const mapObj = props.mapObj || {};
194
+ const { list, label = "label", value = "value", self } = mapObj;
195
+ let data = [];
196
+ if (list) {
197
+ data = res[list];
198
+ } else {
199
+ data = res;
200
+ }
201
+ data = data.map((item) => {
202
+ if (self) {
203
+ return { label: getUseLabel(item), value: item };
204
+ }
205
+ return {
206
+ ...item,
207
+ label: getUseLabel(item[label]),
208
+ value: item[value],
209
+ };
210
+ });
211
+ optionsByApi.value = data;
212
+ if (isFunction(cbs.afterSearch)) {
213
+ cbs.afterSearch(res, optionsByApi, valueModel);
214
+ }
215
+ });
216
+ } catch (error) {
217
+ console.error(error);
218
+ }
219
+ }
220
+ if (isFunction(cbs.defineSearch)) {
221
+ try {
222
+ const defineSearchHandle = await cbs.defineSearch(
223
+ optionsByApi,
224
+ valueModel
225
+ );
226
+ if (defineSearchHandle === false) return;
227
+ if (defineSearchHandle) {
228
+ optionsByApi.value = defineSearchHandle;
229
+ }
230
+ } catch (error) {}
231
+ }
232
+ };
233
+ watch(
234
+ [
235
+ () => props.api,
236
+ () => props.serviceParams,
237
+ () => props.serviceMethod,
238
+ () => props.mapObj,
239
+ ],
240
+ (newVal, oldVal) => {
241
+ watchServiceHandle();
242
+ },
243
+ {
244
+ immediate: true,
245
+ }
246
+ );
247
+ const checkedAll = useCheckedAll(filterOptions, valueModel, {
248
+ onCheckedAll: (falg) => {
249
+ if (!keyword.value && !falg) {
250
+ // 没有搜索,去掉全选就置空
251
+ valueModel.value = [];
252
+ }
253
+ },
254
+ }).checkedAll;
255
+ const changeCheckedAll = () => {
256
+ const selectEmit = selectRef.value.$emit;
257
+ if (selectEmit) {
258
+ selectEmit("change", valueModel.value);
259
+ }
260
+ };
261
+
262
+ const focusFilter = () => {
263
+ if (filterInput.value && filterInput.value.focus) {
264
+ filterInput.value.focus();
265
+ }
266
+ };
267
+
268
+ const showSearch = ref(false);
269
+ const showSearchPrefix = () => {
270
+ showSearch.value = true;
271
+ };
272
+ const hideSearchPrefix = () => {
273
+ showSearch.value = false;
274
+ };
275
+
276
+ useBuriedParams(props, emit, {
277
+ getContent: () => {
278
+ const select = selectObj.value || {};
279
+ if (isArray(select)) {
280
+ return select.map((item) => item.label);
281
+ }
282
+ return select.label;
283
+ },
284
+ });
285
+
286
+ onMounted(() => {
287
+ if (!baseDao) {
288
+ console.error("请先配置baseDao");
289
+ }
290
+ });
291
+ defineExpose({
292
+ ref: selectRef,
293
+ keyword,
294
+ filterInput,
295
+ focusFilter,
296
+ baseDao,
297
+ serviceConfig,
298
+ noFilterOptions,
299
+ selectObj,
300
+ checkedAll,
301
+ });
302
+ </script>
303
+ <style lang="less">
304
+ .ct-select {
305
+ width: 214px;
306
+ &__top {
307
+ padding: 0 16px;
308
+ font-size: var(--ct-font-size);
309
+ }
310
+ &__options {
311
+ max-height: 274px;
312
+ overflow-y: auto;
313
+ }
314
+ &__select {
315
+ display: flex;
316
+ justify-content: space-between;
317
+ align-items: center;
318
+ margin-bottom: 10px;
319
+ &-title {
320
+ color: var(--ct-color-grey-sub);
321
+ line-height: 1;
322
+ }
323
+ .el-checkbox {
324
+ height: auto;
325
+ }
326
+ }
327
+ &__filter {
328
+ margin-bottom: 16px;
329
+ .el-input {
330
+ --el-input-height: 28px;
331
+ }
332
+ }
333
+ &__popper {
334
+ &.is-multiple {
335
+ min-width: 140px;
336
+ }
337
+ .el-select-dropdown__wrap {
338
+ max-height: unset;
339
+ }
340
+ }
341
+ .el-select__tags {
342
+ display: none;
343
+ }
344
+ .el-input__prefix-inner {
345
+ & > :last-child {
346
+ margin-right: 0;
347
+ }
348
+ }
349
+ &__filterable-icon {
350
+ position: absolute;
351
+ z-index: 3;
352
+ right: var(--ct-component-inner-padding);
353
+ top: 50%;
354
+ height: calc(var(--ct-component-size) - 2px);
355
+ transform: translateY(-50%);
356
+ background-color: #fff;
357
+ }
358
+ &__empty {
359
+ display: flex;
360
+ justify-content: center;
361
+ align-items: center;
362
+ padding: 15px 16px;
363
+ color: var(--ct-color-grey-sub);
364
+ }
365
+ &.is-multiple {
366
+ &::after {
367
+ content: attr(select-text);
368
+ position: absolute;
369
+ left: var(--ct-component-inner-padding);
370
+ right: calc(var(--ct-component-inner-padding) * 2);
371
+ top: 50%;
372
+ transform: translateY(-50%);
373
+ text-overflow: ellipsis;
374
+ overflow: hidden;
375
+ white-space: nowrap;
376
+ cursor: pointer;
377
+ }
378
+ }
379
+ }
380
+ </style>