evui 3.4.21 → 3.4.23

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/dist/evui.common.js +922 -707
  2. package/dist/evui.common.js.map +1 -1
  3. package/dist/evui.umd.js +922 -707
  4. package/dist/evui.umd.js.map +1 -1
  5. package/dist/evui.umd.min.js +1 -1
  6. package/dist/evui.umd.min.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/components/chart/Chart.vue +22 -1
  9. package/src/components/chart/chart.core.js +2 -0
  10. package/src/components/chart/model/model.store.js +14 -8
  11. package/src/components/chart/plugins/plugins.legend.js +6 -0
  12. package/src/components/chartBrush/ChartBrush.vue +22 -1
  13. package/src/components/checkbox/Checkbox.vue +1 -1
  14. package/src/components/grid/Grid.vue +11 -10
  15. package/src/components/grid/{grid.columnSetting.vue → GridColumnSetting.vue} +17 -6
  16. package/src/components/grid/style/grid.scss +5 -7
  17. package/src/components/grid/uses.js +21 -5
  18. package/src/components/select/Select.vue +158 -40
  19. package/src/components/select/uses.js +21 -0
  20. package/src/components/treeGrid/TreeGrid.vue +10 -10
  21. package/src/components/treeGrid/TreeGridNode.vue +5 -5
  22. package/src/components/treeGrid/uses.js +2 -1
  23. /package/src/components/grid/{grid.filterSetting.vue → GridFilterSetting.vue} +0 -0
  24. /package/src/components/grid/{grid.pagination.vue → GridPagination.vue} +0 -0
  25. /package/src/components/grid/{grid.summary.vue → GridSummary.vue} +0 -0
  26. /package/src/components/grid/{grid.toolbar.vue → GridToolbar.vue} +0 -0
  27. /package/src/components/grid/{grid.optionButton.vue → icon/icon-option-button.vue} +0 -0
  28. /package/src/components/grid/{grid.sortButton.vue → icon/icon-sort-button.vue} +0 -0
  29. /package/src/components/treeGrid/{treeGrid.toolbar.vue → TreeGridToolbar.vue} +0 -0
  30. /package/src/components/treeGrid/{tree_icon.png → icon/icon-tree.png} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evui",
3
- "version": "3.4.21",
3
+ "version": "3.4.23",
4
4
  "description": "A EXEM Library project",
5
5
  "author": "exem <dev_client@ex-em.com>",
6
6
  "license": "MIT",
@@ -18,7 +18,17 @@
18
18
  </template>
19
19
 
20
20
  <script>
21
- import { onMounted, onBeforeUnmount, watch, onDeactivated, inject, toRef, computed } from 'vue';
21
+ import {
22
+ onMounted,
23
+ onBeforeUnmount,
24
+ onActivated,
25
+ onDeactivated,
26
+ inject,
27
+ watch,
28
+ ref,
29
+ toRef,
30
+ computed,
31
+ } from 'vue';
22
32
  import { cloneDeep, isEqual, debounce } from 'lodash-es';
23
33
  import EvChart from './chart.core';
24
34
  import EvChartToolbar from './ChartToolbar';
@@ -76,6 +86,7 @@
76
86
  ],
77
87
  setup(props) {
78
88
  let evChart = null;
89
+ const isMounted = ref(false);
79
90
  const injectIsChartGroup = inject('isChartGroup', false);
80
91
  const injectBrushSeries = inject('brushSeries', { list: [], chartIdx: null });
81
92
  const injectGroupSelectedLabel = inject('groupSelectedLabel', null);
@@ -242,6 +253,8 @@
242
253
 
243
254
  await createChart();
244
255
  await drawChart();
256
+
257
+ isMounted.value = true;
245
258
  });
246
259
 
247
260
  onBeforeUnmount(() => {
@@ -252,6 +265,8 @@
252
265
  if (injectEvChartPropsInGroup?.value?.length) {
253
266
  injectEvChartPropsInGroup.value.length = 0;
254
267
  }
268
+
269
+ isMounted.value = false;
255
270
  });
256
271
 
257
272
  onDeactivated(() => {
@@ -275,6 +290,12 @@
275
290
  }
276
291
  }, props.resizeTimeout);
277
292
 
293
+ onActivated(() => {
294
+ if (isMounted.value) {
295
+ onResize();
296
+ }
297
+ });
298
+
278
299
  return {
279
300
  wrapper,
280
301
  wrapperStyle,
@@ -113,6 +113,7 @@ class EvChart {
113
113
  }
114
114
 
115
115
  if (realTimeScatter?.use) {
116
+ this.dataSet = {};
116
117
  this.createRealTimeScatterDataSet(data);
117
118
  } else {
118
119
  this.createDataSet(data, labels);
@@ -723,6 +724,7 @@ class EvChart {
723
724
 
724
725
  this.resetProps();
725
726
 
727
+ this.updateSeries = updateSeries;
726
728
  if (updateSeries) {
727
729
  this.seriesInfo = null;
728
730
  this.seriesList = null;
@@ -71,10 +71,6 @@ const modules = {
71
71
  createRealTimeScatterDataSet(datas) {
72
72
  const keys = Object.keys(datas);
73
73
 
74
- if (!this.isInit) {
75
- this.dataSet = {};
76
- }
77
-
78
74
  const minMaxValues = {
79
75
  maxY: 0,
80
76
  minY: Infinity,
@@ -88,8 +84,8 @@ const modules = {
88
84
  const storeLength = data.length;
89
85
  let lastTime = 0;
90
86
 
91
- if (!this.isInit) {
92
- this.dataSet[key] = {
87
+ if (!this.isInit || this.updateSeries) {
88
+ const defaultValues = {
93
89
  dataGroup: [],
94
90
  startIndex: 0,
95
91
  endIndex: 0,
@@ -97,6 +93,11 @@ const modules = {
97
93
  fromTime: 0,
98
94
  toTime: 0,
99
95
  };
96
+
97
+ this.dataSet[key] = {
98
+ ...defaultValues,
99
+ ...this.dataSet[key],
100
+ };
100
101
  this.dataSet[key].length = this.options.realTimeScatter.range || 300;
101
102
  this.dataSet[key].toTime = Math.floor(Date.now() / 1000) * 1000;
102
103
  this.dataSet[key].fromTime = this.dataSet[key].toTime
@@ -127,13 +128,18 @@ const modules = {
127
128
  - this.dataSet[key].length * 1000;
128
129
  }
129
130
 
130
- if (!this.isInit) {
131
+ if (!this.isInit || this.updateSeries) {
131
132
  for (let i = 0; i < this.dataSet[key].length; i++) {
132
- this.dataSet[key].dataGroup[i] = {
133
+ const defaultValues = {
133
134
  data: [],
134
135
  max: 0,
135
136
  min: Infinity,
136
137
  };
138
+
139
+ this.dataSet[key].dataGroup[i] = {
140
+ ...defaultValues,
141
+ ...this.dataSet[key].dataGroup[i],
142
+ };
137
143
  }
138
144
  } else if (gapCount > 0) {
139
145
  if (gapCount >= this.dataSet[key].length) {
@@ -234,6 +234,9 @@ const modules = {
234
234
  */
235
235
  this.onLegendBoxClick = (e) => {
236
236
  const { legend: opt } = this.options;
237
+ if (opt?.stopClickEvt) {
238
+ return;
239
+ }
237
240
  const { chartIdx } = this.data;
238
241
 
239
242
  const targetDOM = this.getContainerDOM(e);
@@ -369,6 +372,9 @@ const modules = {
369
372
  */
370
373
  this.onLegendBoxClick = (e) => {
371
374
  const opt = this.options.legend;
375
+ if (opt?.stopClickEvt) {
376
+ return;
377
+ }
372
378
  const series = Object.values(this.seriesList)[0];
373
379
 
374
380
  const targetDOM = this.getContainerDOM(e);
@@ -9,7 +9,17 @@
9
9
  </template>
10
10
 
11
11
  <script>
12
- import { inject, watch, computed, onMounted, onBeforeUnmount, onDeactivated, onUpdated } from 'vue';
12
+ import {
13
+ inject,
14
+ watch,
15
+ ref,
16
+ computed,
17
+ onMounted,
18
+ onBeforeUnmount,
19
+ onDeactivated,
20
+ onActivated,
21
+ onUpdated,
22
+ } from 'vue';
13
23
  import { cloneDeep, debounce, isEqual } from 'lodash-es';
14
24
  import EvChart from '../chart/chart.core';
15
25
  import { useModel, useWrapper } from '../chart/uses';
@@ -28,6 +38,7 @@ export default {
28
38
  let evChart = null;
29
39
  let evChartBrush = null;
30
40
 
41
+ const isMounted = ref(false);
31
42
  const injectEvChartClone = inject('evChartClone', { data: [] });
32
43
  const injectEvChartInfo = inject('evChartInfo', { props: { options: [] } });
33
44
  const injectBrushIdx = inject('brushIdx', {
@@ -235,6 +246,8 @@ export default {
235
246
  createChartBrush();
236
247
  drawChartBrush();
237
248
  }
249
+
250
+ isMounted.value = true;
238
251
  });
239
252
 
240
253
  onUpdated(async () => {
@@ -266,6 +279,8 @@ export default {
266
279
  if (evChartBrush) {
267
280
  evChartBrush.destroy();
268
281
  }
282
+
283
+ isMounted.value = false;
269
284
  });
270
285
 
271
286
  onDeactivated(() => {
@@ -291,6 +306,12 @@ export default {
291
306
  }
292
307
  }, 0);
293
308
 
309
+ onActivated(() => {
310
+ if (isMounted.value) {
311
+ onResize();
312
+ }
313
+ });
314
+
294
315
  return {
295
316
  evChartBrushOptions,
296
317
  evChartBrushRef,
@@ -41,7 +41,7 @@ export default {
41
41
  default: false,
42
42
  },
43
43
  label: {
44
- type: [String, Number, Boolean, Symbol],
44
+ type: [String, Number, Boolean, Symbol, Object],
45
45
  default: null,
46
46
  },
47
47
  tooltipTitle: {
@@ -220,7 +220,7 @@
220
220
  >
221
221
  <!-- Header -->
222
222
  <li
223
- v-if="!column.hide"
223
+ v-if="!column.hide && !column.hiddenDisplay"
224
224
  :data-index="index"
225
225
  :class="{
226
226
  column: true,
@@ -387,7 +387,7 @@
387
387
  :key="cellIndex"
388
388
  >
389
389
  <td
390
- v-if="!column.hide"
390
+ v-if="!column.hide && !column.hiddenDisplay"
391
391
  :data-name="column.field"
392
392
  :data-index="column.index"
393
393
  :class="{
@@ -532,13 +532,13 @@ import {
532
532
  } from 'vue';
533
533
  import { clickoutside } from '@/directives/clickoutside';
534
534
  import { cloneDeep } from 'lodash-es';
535
- import Toolbar from './grid.toolbar';
536
- import GridPagination from './grid.pagination';
537
- import GridSummary from './grid.summary';
538
- import ColumnSetting from './grid.columnSetting.vue';
539
- import filterSetting from './grid.filterSetting.vue';
540
- import GridSortButton from './grid.sortButton';
541
- import GridOptionButton from './grid.optionButton.vue';
535
+ import Toolbar from './GridToolbar';
536
+ import GridPagination from './GridPagination';
537
+ import GridSummary from './GridSummary';
538
+ import ColumnSetting from './GridColumnSetting.vue';
539
+ import FilterSetting from './GridFilterSetting.vue';
540
+ import GridSortButton from './icon/icon-sort-button';
541
+ import GridOptionButton from './icon/icon-option-button.vue';
542
542
  import {
543
543
  commonFunctions,
544
544
  scrollEvent,
@@ -564,7 +564,7 @@ export default {
564
564
  GridPagination,
565
565
  GridSummary,
566
566
  ColumnSetting,
567
- filterSetting,
567
+ FilterSetting,
568
568
  GridSortButton,
569
569
  GridOptionButton,
570
570
  },
@@ -606,6 +606,7 @@ export default {
606
606
  'check-row': null,
607
607
  'check-all': null,
608
608
  'page-change': null,
609
+ 'sort-column': null,
609
610
  },
610
611
  setup(props) {
611
612
  // const ROW_INDEX = 0;
@@ -136,14 +136,22 @@ export default {
136
136
 
137
137
  const initValue = () => {
138
138
  const columns = applyColumnList.value.length ? applyColumnList.value : originColumnList.value;
139
- checkColumnGroup.value = columns.map(col => col.label || []);
140
-
139
+ checkColumnGroup.value = columns
140
+ .filter(col => !col.checked)
141
+ .map(col => col.label);
141
142
  initSearchValue();
142
143
  };
143
-
144
144
  const onApplyColumn = () => {
145
145
  applyColumnList.value = originColumnList.value
146
- .filter(col => checkColumnGroup.value.includes(col.label));
146
+ .filter((col) => {
147
+ if (checkColumnGroup.value.includes(col.label)) {
148
+ if (col?.checked) {
149
+ col.checked = false;
150
+ }
151
+ return true;
152
+ }
153
+ return false;
154
+ });
147
155
  const checkedColumns = applyColumnList.value.map(col => col.text);
148
156
 
149
157
  emit('apply-column', checkedColumns);
@@ -157,8 +165,11 @@ export default {
157
165
  .map(col => ({
158
166
  label: col.caption,
159
167
  text: col.field,
168
+ checked: col.hiddenDisplay,
160
169
  }));
161
- checkColumnGroup.value = originColumnList.value?.map(col => col.label) || [];
170
+ checkColumnGroup.value = originColumnList.value
171
+ .filter(col => !col.checked)
172
+ .map(col => col.label);
162
173
  applyColumnList.value.length = 0;
163
174
  };
164
175
 
@@ -204,7 +215,7 @@ export default {
204
215
  watch(() => props.hiddenColumn, (value) => {
205
216
  const filterColumns = applyColumnList.value.length
206
217
  ? applyColumnList.value.filter(col => col.text !== value)
207
- : originColumnList.value.filter(col => col.text !== value);
218
+ : originColumnList.value.filter(col => (col.text !== value && !col.checked));
208
219
 
209
220
  applyColumnList.value = filterColumns;
210
221
  checkColumnGroup.value = filterColumns.map(col => col.label);
@@ -269,6 +269,10 @@
269
269
  max-height: 120px;
270
270
  background: none;
271
271
 
272
+ &--used {
273
+ padding-top: 16px;
274
+ }
275
+
272
276
  &__hidden-items {
273
277
  max-height: 106px;
274
278
  overflow-y: auto;
@@ -344,15 +348,9 @@
344
348
  }
345
349
  &--operator {
346
350
  width: 80px;
347
- height: 26px !important;
348
- .ev-input {
351
+ :deep(.ev-input) {
349
352
  height: 26px !important;
350
353
  }
351
- &:hover {
352
- cursor: initial;
353
- margin: inherit;
354
- border: none;
355
- }
356
354
  }
357
355
  &.non-display {
358
356
  display: none;
@@ -182,7 +182,7 @@ export const resizeEvent = (params) => {
182
182
  const scrollWidth = elWidth - bodyEl.clientWidth;
183
183
 
184
184
  const result = stores.orderedColumns.reduce((acc, cur) => {
185
- if (cur.hide) {
185
+ if (cur.hide || cur.hiddenDisplay) {
186
186
  return acc;
187
187
  }
188
188
  if (cur.width) {
@@ -292,6 +292,7 @@ export const resizeEvent = (params) => {
292
292
  const startMouseLeft = event.clientX;
293
293
  const startColumnLeft = columnRect.left - headerLeft;
294
294
 
295
+ bodyEl.style.overflow = 'auto';
295
296
  resizeLineEl.style.left = `${startLeft}px`;
296
297
 
297
298
  resizeInfo.showResizeLine = true;
@@ -527,6 +528,7 @@ export const checkEvent = (params) => {
527
528
 
528
529
  export const sortEvent = (params) => {
529
530
  const { sortInfo, stores, updatePagingInfo } = params;
531
+ const { emit } = getCurrentInstance();
530
532
  function OrderQueue() {
531
533
  this.orders = ['asc', 'desc', 'init'];
532
534
  this.dequeue = () => this.orders.shift();
@@ -559,6 +561,11 @@ export const sortEvent = (params) => {
559
561
 
560
562
  sortInfo.isSorting = true;
561
563
  updatePagingInfo({ onSort: true });
564
+ emit('sort-column', {
565
+ field: sortInfo.sortField,
566
+ order: sortInfo.sortOrder,
567
+ column: sortInfo.sortColumn,
568
+ });
562
569
  }
563
570
  };
564
571
  /**
@@ -1143,7 +1150,8 @@ export const columnSettingEvent = (params) => {
1143
1150
  const setFilteringColumn = () => {
1144
1151
  columnSettingInfo.visibleColumnIdx = stores.filteredColumns.map(col => col.index);
1145
1152
 
1146
- const originColumnIdx = stores.originColumns.filter(col => !col.hide).map(col => col.index);
1153
+ const originColumnIdx = stores.originColumns.filter(col => (!col.hide || col.hiddenDisplay))
1154
+ .map(col => col.index);
1147
1155
  const visibleColumnIdx = columnSettingInfo.visibleColumnIdx;
1148
1156
 
1149
1157
  columnSettingInfo.isFilteringColumn = (visibleColumnIdx.length !== originColumnIdx.length);
@@ -1155,7 +1163,7 @@ export const columnSettingEvent = (params) => {
1155
1163
  onResize();
1156
1164
  };
1157
1165
  const onApplyColumn = (columnNames) => {
1158
- const columns = stores.orderedColumns.filter(col => !col.hide);
1166
+ const columns = stores.orderedColumns.filter(col => !col.hide && !col.hiddenDisplay);
1159
1167
  const isSameColumn = columnNames.length === columns.length
1160
1168
  && columns.every(col => columnNames.includes(col.field));
1161
1169
 
@@ -1164,12 +1172,20 @@ export const columnSettingEvent = (params) => {
1164
1172
  }
1165
1173
 
1166
1174
  stores.filteredColumns = stores.originColumns
1167
- .filter(col => columnNames.includes(col.field) || !col.caption);
1175
+ .filter((col) => {
1176
+ if (columnNames.includes(col.field) || !col.caption) {
1177
+ if (col?.hiddenDisplay) {
1178
+ col.hiddenDisplay = false;
1179
+ }
1180
+ return true;
1181
+ }
1182
+ return false;
1183
+ });
1168
1184
  columnSettingInfo.hiddenColumn = '';
1169
1185
  setFilteringColumn();
1170
1186
  };
1171
1187
  const setColumnHidden = (val) => {
1172
- const columns = stores.orderedColumns.filter(col => !col.hide);
1188
+ const columns = stores.orderedColumns.filter(col => !col.hide && !col.hiddenDisplay);
1173
1189
 
1174
1190
  if (columns.length === 1) {
1175
1191
  return;
@@ -110,64 +110,163 @@
110
110
  </span>
111
111
  </template>
112
112
  <div class="ev-select-dropbox-wrapper">
113
- <div
114
- v-if="isDropbox"
115
- ref="dropbox"
116
- class="ev-select-dropbox"
117
- :style="dropboxPosition"
118
- >
119
- <input
120
- v-if="filterable"
121
- type="text"
122
- class="ev-input-query"
123
- :placeholder="searchPlaceholder"
124
- :value="filterTextRef"
125
- @input="changeFilterText"
126
- />
127
113
  <div
128
- ref="itemWrapper"
129
- class="ev-select-dropbox-list"
114
+ v-if="isDropbox"
115
+ ref="dropbox"
116
+ class="ev-select-dropbox"
117
+ :style="dropboxPosition"
130
118
  >
131
- <ul
132
- v-if="filteredItems.length"
133
- class="ev-select-dropbox-ul"
134
- >
135
- <li
136
- v-for="(item, idx) in filteredItems"
137
- :key="`${item.value}_${idx}`"
138
- class="ev-select-dropbox-item"
119
+ <input
120
+ v-if="filterable"
121
+ type="text"
122
+ class="ev-input-query"
123
+ :placeholder="searchPlaceholder"
124
+ :value="filterTextRef"
125
+ @input="changeFilterText"
126
+ />
127
+ <template v-if="checkable">
128
+ <div
129
+ v-if="multiple"
130
+ class="ev-select-dropbox-item all-check"
139
131
  :class="{
140
- selected: selectedItemClass(item.value),
141
- disabled: item.disabled
132
+ selected: allCheck
142
133
  }"
143
- :title="item.name"
144
- @click.stop.prevent="[clickItem(item.value), changeDropboxPosition()]"
134
+ @click.self.prevent="[changeAllCheck(false), changeDropboxPosition()]"
145
135
  >
146
- <i
147
- v-if="item.iconClass"
148
- :class="item.iconClass"
136
+ <ev-checkbox
137
+ v-model="allCheck"
138
+ :label="allCheckLabel"
139
+ @change="[changeAllCheck(true), changeDropboxPosition()]"
149
140
  />
150
- {{ item.name }}
151
- </li>
152
- </ul>
153
- <ul v-else>
154
- <li class="ev-select-dropbox-item disabled">
155
- {{ noMatchingText }}
156
- </li>
157
- </ul>
141
+ </div>
142
+ <div
143
+ ref="itemWrapper"
144
+ class="ev-select-dropbox-list"
145
+ >
146
+ <template v-if="multiple">
147
+ <ev-checkbox-group
148
+ v-model="mv"
149
+ >
150
+ <ul
151
+ v-if="filteredItems.length"
152
+ class="ev-select-dropbox-ul"
153
+ >
154
+ <li
155
+ v-for="(item, idx) in filteredItems"
156
+ :key="`${item.value}_${idx}`"
157
+ class="ev-select-dropbox-item"
158
+ :class="{
159
+ selected: selectedItemClass(item.value),
160
+ disabled: item.disabled
161
+ }"
162
+ :title="item.name"
163
+ @click.self.prevent="item.disabled
164
+ ? [] : [clickItem(item.value), changeDropboxPosition()]"
165
+ >
166
+ <ev-checkbox
167
+ :label="item.value"
168
+ :disabled="item.disabled"
169
+ >
170
+ <i
171
+ v-if="item.iconClass"
172
+ :class="item.iconClass"
173
+ />
174
+ {{ item.name }}
175
+ </ev-checkbox>
176
+ </li>
177
+ </ul>
178
+ <ul v-else>
179
+ <li class="ev-select-dropbox-item disabled">
180
+ {{ noMatchingText }}
181
+ </li>
182
+ </ul>
183
+ </ev-checkbox-group>
184
+ </template>
185
+ <template v-else>
186
+ <ul
187
+ v-if="filteredItems.length"
188
+ class="ev-select-dropbox-ul"
189
+ >
190
+ <li
191
+ v-for="(item, idx) in filteredItems"
192
+ :key="`${item.value}_${idx}`"
193
+ class="ev-select-dropbox-item"
194
+ :class="{
195
+ selected: selectedItemClass(item.value),
196
+ disabled: item.disabled
197
+ }"
198
+ :title="item.name"
199
+ @click.stop.prevent="item.disabled
200
+ ? [] : [clickItem(item.value), changeDropboxPosition()]"
201
+ >
202
+ <ev-checkbox
203
+ :model-value="mv === item.value"
204
+ :disabled="item.disabled"
205
+ >
206
+ <i
207
+ v-if="item.iconClass"
208
+ :class="item.iconClass"
209
+ />
210
+ {{ item.name }}
211
+ </ev-checkbox>
212
+ </li>
213
+ </ul>
214
+ </template>
215
+ </div>
216
+ </template>
217
+ <template v-else>
218
+ <div
219
+ ref="itemWrapper"
220
+ class="ev-select-dropbox-list"
221
+ >
222
+ <ul
223
+ v-if="filteredItems.length"
224
+ class="ev-select-dropbox-ul"
225
+ >
226
+ <li
227
+ v-for="(item, idx) in filteredItems"
228
+ :key="`${item.value}_${idx}`"
229
+ class="ev-select-dropbox-item"
230
+ :class="{
231
+ selected: selectedItemClass(item.value),
232
+ disabled: item.disabled
233
+ }"
234
+ :title="item.name"
235
+ @click.stop.prevent="item.disabled
236
+ ? [] : [clickItem(item.value), changeDropboxPosition()]"
237
+ >
238
+ <i
239
+ v-if="item.iconClass"
240
+ :class="item.iconClass"
241
+ />
242
+ {{ item.name }}
243
+ </li>
244
+ </ul>
245
+ <ul v-else>
246
+ <li class="ev-select-dropbox-item disabled">
247
+ {{ noMatchingText }}
248
+ </li>
249
+ </ul>
250
+ </div>
251
+ </template>
158
252
  </div>
159
253
  </div>
160
254
  </div>
161
- </div>
162
255
  </div>
163
256
  </template>
164
257
 
165
258
  <script>
166
259
  import { selectClickoutside as clickoutside } from '@/directives/clickoutside';
260
+ import EvCheckboxGroup from '@/components/checkboxGroup/CheckboxGroup';
261
+ import EvCheckbox from '@/components/checkbox/Checkbox';
167
262
  import { useModel, useDropdown } from './uses';
168
263
 
169
264
  export default {
170
265
  name: 'EvSelect',
266
+ components: {
267
+ EvCheckbox,
268
+ EvCheckboxGroup,
269
+ },
171
270
  directives: {
172
271
  clickoutside,
173
272
  },
@@ -204,6 +303,10 @@ export default {
204
303
  type: Boolean,
205
304
  default: false,
206
305
  },
306
+ checkable: {
307
+ type: Boolean,
308
+ default: false,
309
+ },
207
310
  collapseTags: {
208
311
  type: Boolean,
209
312
  default: false,
@@ -216,6 +319,10 @@ export default {
216
319
  type: String,
217
320
  default: '',
218
321
  },
322
+ allCheckLabel: {
323
+ type: String,
324
+ default: 'Select All',
325
+ },
219
326
  },
220
327
  emits: {
221
328
  'update:modelValue': null,
@@ -247,6 +354,8 @@ export default {
247
354
  changeDropboxPosition,
248
355
  clickItem,
249
356
  selectedItemClass,
357
+ allCheck,
358
+ changeAllCheck,
250
359
  } = useDropdown({ mv, changeMv });
251
360
 
252
361
  return {
@@ -272,6 +381,8 @@ export default {
272
381
  changeDropboxPosition,
273
382
  clickItem,
274
383
  selectedItemClass,
384
+ allCheck,
385
+ changeAllCheck,
275
386
  };
276
387
  },
277
388
  };
@@ -435,6 +546,13 @@ export default {
435
546
  &.disabled {
436
547
  opacity: 1;
437
548
  color: #C0C4CC;
549
+ cursor: not-allowed;
438
550
  }
439
551
  }
552
+
553
+ .all-check {
554
+ height: 35px;
555
+ line-height: 38px;
556
+ border-bottom: 1px solid;
557
+ }
440
558
  </style>