evui 3.3.10 → 3.3.13

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 +2439 -1032
  2. package/dist/evui.common.js.map +1 -1
  3. package/dist/evui.umd.js +2439 -1032
  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.core.js +65 -24
  9. package/src/components/chart/element/element.heatmap.js +195 -51
  10. package/src/components/chart/element/element.line.js +22 -9
  11. package/src/components/chart/element/element.scatter.js +26 -9
  12. package/src/components/chart/element/element.tip.js +103 -83
  13. package/src/components/chart/helpers/helpers.constant.js +13 -11
  14. package/src/components/chart/model/model.series.js +1 -1
  15. package/src/components/chart/model/model.store.js +19 -74
  16. package/src/components/chart/plugins/plugins.interaction.js +15 -4
  17. package/src/components/chart/plugins/plugins.legend.js +6 -3
  18. package/src/components/chart/plugins/plugins.pie.js +17 -0
  19. package/src/components/chart/plugins/plugins.tooltip.js +205 -32
  20. package/src/components/chart/scale/scale.js +10 -11
  21. package/src/components/chart/scale/scale.step.js +38 -3
  22. package/src/components/chart/scale/scale.time.category.js +35 -3
  23. package/src/components/chart/uses.js +12 -0
  24. package/src/components/grid/Grid.vue +109 -36
  25. package/src/components/grid/grid.summary.vue +235 -0
  26. package/src/components/grid/style/grid.scss +0 -14
  27. package/src/components/grid/uses.js +55 -46
  28. package/src/components/treeGrid/TreeGrid.vue +269 -36
  29. package/src/components/treeGrid/TreeGridNode.vue +8 -9
  30. package/src/components/treeGrid/uses.js +152 -37
@@ -1,10 +1,11 @@
1
1
  import { getCurrentInstance, nextTick } from 'vue';
2
- import { isEqual, uniqBy } from 'lodash-es';
2
+ import { uniqBy } from 'lodash-es';
3
3
  import { numberWithComma } from '@/common/utils';
4
4
 
5
5
  const ROW_INDEX = 0;
6
6
  const ROW_CHECK_INDEX = 1;
7
7
  const ROW_DATA_INDEX = 2;
8
+ const ROW_SELECT_INDEX = 3;
8
9
 
9
10
  export const commonFunctions = () => {
10
11
  const { props } = getCurrentInstance();
@@ -32,18 +33,18 @@ export const commonFunctions = () => {
32
33
  /**
33
34
  * 데이터 타입에 따라 변환된 데이터을 반환한다.
34
35
  *
35
- * @param {string} type - 데이터 유형
36
+ * @param {object} column - 컬럼 정보
36
37
  * @param {number|string} value - 데이터
37
38
  * @returns {number|string} 변환된 데이터
38
39
  */
39
- const getConvertValue = (type, value) => {
40
- let convertValue = value;
40
+ const getConvertValue = (column, value) => {
41
+ let convertValue = column.type === 'number' || column.type === 'float' ? Number(value) : value;
41
42
 
42
- if (type === 'number') {
43
+ if (column.type === 'number') {
43
44
  convertValue = numberWithComma(value);
44
45
  convertValue = convertValue === false ? value : convertValue;
45
- } else if (type === 'float') {
46
- convertValue = value.toFixed(3);
46
+ } else if (column.type === 'float') {
47
+ convertValue = convertValue.toFixed(column.decimal ?? 3);
47
48
  }
48
49
 
49
50
  return convertValue;
@@ -96,7 +97,7 @@ export const scrollEvent = (params) => {
96
97
  firstVisibleIndex = 0;
97
98
  }
98
99
 
99
- const lastVisibleIndex = firstVisibleIndex + rowCount;
100
+ const lastVisibleIndex = firstVisibleIndex + rowCount + 1;
100
101
  const firstIndex = Math.max(firstVisibleIndex, 0);
101
102
  const lastIndex = lastVisibleIndex;
102
103
 
@@ -338,7 +339,7 @@ export const resizeEvent = (params) => {
338
339
 
339
340
  export const clickEvent = (params) => {
340
341
  const { emit } = getCurrentInstance();
341
- const selectInfo = params;
342
+ const { selectInfo } = params;
342
343
  const getClickedRowData = (event, row) => {
343
344
  const tagName = event.target.tagName.toLowerCase();
344
345
  let cellInfo = {};
@@ -361,17 +362,41 @@ export const clickEvent = (params) => {
361
362
  * @param {object} event - 이벤트 객체
362
363
  * @param {array} row - row 데이터
363
364
  */
365
+ let timer = null;
364
366
  const onRowClick = (event, row) => {
365
367
  if (event.target && event.target.parentElement
366
368
  && event.target.parentElement.classList.contains('row-checkbox-input')) {
367
369
  return false;
368
370
  }
369
- if (selectInfo.useSelect) {
370
- const rowData = row[ROW_DATA_INDEX];
371
- selectInfo.selectedRow = rowData;
372
- emit('update:selected', rowData);
373
- emit('click-row', getClickedRowData(event, row));
374
- }
371
+ clearTimeout(timer);
372
+ timer = setTimeout(() => {
373
+ if (selectInfo.useSelect) {
374
+ const rowData = row[ROW_DATA_INDEX];
375
+ if (row[ROW_SELECT_INDEX]) {
376
+ row[ROW_SELECT_INDEX] = false;
377
+ if (selectInfo.multiple) {
378
+ if (event.ctrlKey) {
379
+ selectInfo.selectedRow.splice(selectInfo.selectedRow.indexOf(row[ROW_DATA_INDEX]), 1);
380
+ } else {
381
+ selectInfo.selectedRow = [rowData];
382
+ }
383
+ } else {
384
+ selectInfo.selectedRow = [];
385
+ }
386
+ } else {
387
+ row[ROW_SELECT_INDEX] = true;
388
+ if (event.ctrlKey
389
+ && selectInfo.multiple
390
+ && (!selectInfo.limitCount || selectInfo.limitCount > selectInfo.selectedRow.length)) {
391
+ selectInfo.selectedRow.push(rowData);
392
+ } else {
393
+ selectInfo.selectedRow = [rowData];
394
+ }
395
+ }
396
+ emit('update:selected', selectInfo.selectedRow);
397
+ emit('click-row', getClickedRowData(event, row));
398
+ }
399
+ }, 100);
375
400
  return true;
376
401
  };
377
402
  /**
@@ -381,9 +406,7 @@ export const clickEvent = (params) => {
381
406
  * @param {array} row - row 데이터
382
407
  */
383
408
  const onRowDblClick = (event, row) => {
384
- const rowData = row[ROW_DATA_INDEX];
385
- selectInfo.selectedRow = rowData;
386
- emit('update:selected', rowData);
409
+ clearTimeout(timer);
387
410
  emit('dblclick-row', getClickedRowData(event, row));
388
411
  };
389
412
  return { onRowClick, onRowDblClick };
@@ -420,12 +443,9 @@ export const checkEvent = (params) => {
420
443
  if (row[ROW_CHECK_INDEX]) {
421
444
  if (checkInfo.useCheckbox.mode === 'single') {
422
445
  checkInfo.checkedRows = [row[ROW_DATA_INDEX]];
423
- checkInfo.checkedIndex.clear();
424
446
  } else {
425
447
  checkInfo.checkedRows.push(row[ROW_DATA_INDEX]);
426
448
  }
427
- checkInfo.checkedIndex.add(row[ROW_INDEX]);
428
-
429
449
  let store = stores.store;
430
450
  if (pageInfo.isClientPaging) {
431
451
  store = getPagingData();
@@ -437,10 +457,8 @@ export const checkEvent = (params) => {
437
457
  } else {
438
458
  if (checkInfo.useCheckbox.mode === 'single') {
439
459
  checkInfo.checkedRows = [];
440
- checkInfo.checkedIndex.clear();
441
460
  } else {
442
461
  checkInfo.checkedRows.splice(checkInfo.checkedRows.indexOf(row[ROW_DATA_INDEX]), 1);
443
- checkInfo.checkedIndex.delete(row[ROW_INDEX]);
444
462
  }
445
463
  checkInfo.isHeaderChecked = false;
446
464
  }
@@ -464,12 +482,8 @@ export const checkEvent = (params) => {
464
482
  if (!checkInfo.checkedRows.includes(row[ROW_DATA_INDEX])) {
465
483
  checkInfo.checkedRows.push(row[ROW_DATA_INDEX]);
466
484
  }
467
- if (!checkInfo.checkedIndex.has(row[ROW_INDEX])) {
468
- checkInfo.checkedIndex.add(row[ROW_INDEX]);
469
- }
470
485
  } else {
471
486
  checkInfo.checkedRows.splice(checkInfo.checkedRows.indexOf(row[ROW_DATA_INDEX]), 1);
472
- checkInfo.checkedIndex.delete(row[ROW_INDEX]);
473
487
  }
474
488
  row[ROW_CHECK_INDEX] = isHeaderChecked;
475
489
  });
@@ -760,13 +774,13 @@ export const filterEvent = (params) => {
760
774
  for (let ix = 0; ix < stores.orderedColumns.length; ix++) {
761
775
  const column = stores.orderedColumns[ix] || {};
762
776
  let columnValue = row[ROW_DATA_INDEX][ix];
763
- const columnType = column.type || 'string';
777
+ column.type = column.type || 'string';
764
778
  if (columnValue) {
765
779
  if (typeof columnValue === 'object') {
766
780
  columnValue = columnValue[column.field];
767
781
  }
768
782
  if (!column.hide && (column?.searchable === undefined || column?.searchable)) {
769
- columnValue = getConvertValue(columnType, columnValue).toString();
783
+ columnValue = getConvertValue(column, columnValue).toString();
770
784
  isShow = columnValue.toLowerCase().includes(searchWord.toString().toLowerCase());
771
785
  if (isShow) {
772
786
  break;
@@ -888,30 +902,25 @@ export const storeEvent = (params) => {
888
902
  /**
889
903
  * 전달된 데이터를 내부 store 및 속성에 저장한다.
890
904
  *
891
- * @param {array} value - row 데이터
905
+ * @param {array} rows - row 데이터
892
906
  * @param {boolean} isMakeIndex - 인덱스 생성 유무
893
907
  */
894
- const setStore = (value, isMakeIndex = true) => {
895
- const store = [];
896
- let checked;
897
- let selected = false;
908
+ const setStore = (rows, isMakeIndex = true) => {
898
909
  if (isMakeIndex) {
910
+ const store = [];
899
911
  let hasUnChecked = false;
900
- for (let ix = 0; ix < value.length; ix++) {
901
- checked = props.checked.includes(value[ix]);
912
+ rows.forEach((row, idx) => {
913
+ const checked = props.checked.includes(row);
914
+ let selected = false;
915
+ if (selectInfo.useSelect) {
916
+ selected = props.selected.includes(row);
917
+ }
902
918
  if (!checked) {
903
919
  hasUnChecked = true;
904
920
  }
905
- if (!selected && isEqual(selectInfo.selectedRow, value[ix])) {
906
- selectInfo.selectedRow = value[ix];
907
- selected = true;
908
- }
909
- store.push([ix, checked, value[ix]]);
910
- }
911
- if (!selected) {
912
- selectInfo.selectedRow = [];
913
- }
914
- checkInfo.isHeaderChecked = value.length > 0 ? !hasUnChecked : false;
921
+ store.push([idx, checked, row, selected]);
922
+ });
923
+ checkInfo.isHeaderChecked = rows.length > 0 ? !hasUnChecked : false;
915
924
  stores.originStore = store;
916
925
  }
917
926
  if (filterInfo.isFiltering) {