@ai-table/grid 0.0.27 → 0.0.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. package/components/context-menu/context-menu.component.d.ts.map +1 -1
  2. package/core/types/ai-table.d.ts +6 -14
  3. package/core/types/ai-table.d.ts.map +1 -1
  4. package/core/types/core.d.ts +1 -0
  5. package/core/types/core.d.ts.map +1 -1
  6. package/core/utils/common.d.ts.map +1 -1
  7. package/esm2022/components/context-menu/context-menu.component.mjs +3 -10
  8. package/esm2022/core/types/ai-table.mjs +25 -16
  9. package/esm2022/core/types/core.mjs +1 -1
  10. package/esm2022/core/utils/common.mjs +5 -4
  11. package/esm2022/dom-grid.component.mjs +3 -3
  12. package/esm2022/grid.component.mjs +29 -6
  13. package/esm2022/renderer/creations/create-active-cell-border.mjs +6 -3
  14. package/esm2022/renderer/creations/create-cells.mjs +81 -25
  15. package/esm2022/renderer/renderer.component.mjs +7 -3
  16. package/esm2022/services/event.service.mjs +6 -4
  17. package/esm2022/services/match-cell.service.mjs +2 -2
  18. package/esm2022/services/selection.service.mjs +46 -16
  19. package/esm2022/types/grid.mjs +1 -1
  20. package/esm2022/types/index.mjs +2 -1
  21. package/esm2022/types/view.mjs +18 -0
  22. package/esm2022/utils/field/model/date.mjs +64 -0
  23. package/esm2022/utils/field/model/field.mjs +38 -0
  24. package/esm2022/utils/field/model/index.mjs +25 -0
  25. package/esm2022/utils/field/model/link.mjs +33 -0
  26. package/esm2022/utils/field/model/member.mjs +56 -0
  27. package/esm2022/utils/field/model/number.mjs +32 -0
  28. package/esm2022/utils/field/model/progress.mjs +38 -0
  29. package/esm2022/utils/field/model/rate.mjs +26 -0
  30. package/esm2022/utils/field/model/select.mjs +56 -0
  31. package/esm2022/utils/field/model/text.mjs +27 -0
  32. package/esm2022/utils/field/operate.mjs +47 -0
  33. package/esm2022/utils/index.mjs +3 -2
  34. package/fesm2022/ai-table-grid.mjs +556 -102
  35. package/fesm2022/ai-table-grid.mjs.map +1 -1
  36. package/grid.component.d.ts +4 -0
  37. package/grid.component.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/renderer/creations/create-active-cell-border.d.ts.map +1 -1
  40. package/renderer/creations/create-cells.d.ts.map +1 -1
  41. package/renderer/renderer.component.d.ts +5 -3
  42. package/renderer/renderer.component.d.ts.map +1 -1
  43. package/services/event.service.d.ts.map +1 -1
  44. package/services/selection.service.d.ts +3 -2
  45. package/services/selection.service.d.ts.map +1 -1
  46. package/types/grid.d.ts +5 -4
  47. package/types/grid.d.ts.map +1 -1
  48. package/types/index.d.ts +1 -0
  49. package/types/index.d.ts.map +1 -1
  50. package/types/view.d.ts +23 -0
  51. package/types/view.d.ts.map +1 -0
  52. package/utils/field/model/date.d.ts +9 -0
  53. package/utils/field/model/date.d.ts.map +1 -0
  54. package/utils/field/model/field.d.ts +9 -0
  55. package/utils/field/model/field.d.ts.map +1 -0
  56. package/utils/field/{index.d.ts → model/index.d.ts} +1 -1
  57. package/utils/field/model/index.d.ts.map +1 -0
  58. package/utils/field/model/link.d.ts +9 -0
  59. package/utils/field/model/link.d.ts.map +1 -0
  60. package/utils/field/model/member.d.ts +9 -0
  61. package/utils/field/model/member.d.ts.map +1 -0
  62. package/utils/field/model/number.d.ts +8 -0
  63. package/utils/field/model/number.d.ts.map +1 -0
  64. package/utils/field/model/progress.d.ts +9 -0
  65. package/utils/field/model/progress.d.ts.map +1 -0
  66. package/utils/field/model/rate.d.ts +8 -0
  67. package/utils/field/model/rate.d.ts.map +1 -0
  68. package/utils/field/model/select.d.ts +9 -0
  69. package/utils/field/model/select.d.ts.map +1 -0
  70. package/utils/field/model/text.d.ts +8 -0
  71. package/utils/field/model/text.d.ts.map +1 -0
  72. package/utils/field/operate.d.ts +9 -0
  73. package/utils/field/operate.d.ts.map +1 -0
  74. package/utils/index.d.ts +2 -1
  75. package/utils/index.d.ts.map +1 -1
  76. package/esm2022/utils/field/field.mjs +0 -3
  77. package/esm2022/utils/field/index.mjs +0 -22
  78. package/esm2022/utils/field/link.mjs +0 -12
  79. package/esm2022/utils/field/member.mjs +0 -19
  80. package/esm2022/utils/field/progress.mjs +0 -12
  81. package/esm2022/utils/field/select.mjs +0 -16
  82. package/esm2022/utils/field/text.mjs +0 -12
  83. package/utils/field/field.d.ts +0 -5
  84. package/utils/field/field.d.ts.map +0 -1
  85. package/utils/field/index.d.ts.map +0 -1
  86. package/utils/field/link.d.ts +0 -6
  87. package/utils/field/link.d.ts.map +0 -1
  88. package/utils/field/member.d.ts +0 -6
  89. package/utils/field/member.d.ts.map +0 -1
  90. package/utils/field/progress.d.ts +0 -6
  91. package/utils/field/progress.d.ts.map +0 -1
  92. package/utils/field/select.d.ts +0 -6
  93. package/utils/field/select.d.ts.map +0 -1
  94. package/utils/field/text.d.ts +0 -6
  95. package/utils/field/text.d.ts.map +0 -1
@@ -6,7 +6,7 @@ import ObjectID from 'bson-objectid';
6
6
  import { customAlphabet } from 'nanoid';
7
7
  import * as _ from 'lodash';
8
8
  import ___default, { isNumber, includes, values, isString, isNil } from 'lodash';
9
- import { isUndefinedOrNull, isArray, isEmpty as isEmpty$1, isObject } from 'ngx-tethys/util';
9
+ import { isUndefinedOrNull, isArray, isEmpty as isEmpty$1, isObject, TinyDate, helpers } from 'ngx-tethys/util';
10
10
  import * as i1 from '@angular/forms';
11
11
  import { FormsModule } from '@angular/forms';
12
12
  import { ThyDatePicker, ThyDatePickerFormatPipe } from 'ngx-tethys/date-picker';
@@ -42,6 +42,7 @@ import { ThyCheckboxModule } from 'ngx-tethys/checkbox';
42
42
  import { ThyProgress } from 'ngx-tethys/progress';
43
43
  import { ThyDivider } from 'ngx-tethys/divider';
44
44
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
45
+ import { fromUnixTime, subDays } from 'date-fns';
45
46
  import { LRUCache } from 'lru-cache';
46
47
  import Konva from 'konva';
47
48
  import { Shape } from 'konva/lib/Shape';
@@ -98,32 +99,41 @@ const AITable = {
98
99
  return aiTable.records();
99
100
  },
100
101
  getActiveCell(aiTable) {
101
- const selection = aiTable.selection();
102
- let selectedCells = [];
103
- for (let [recordId, fieldIds] of selection.selectedCells.entries()) {
104
- for (let fieldId of Object.keys(fieldIds)) {
105
- if (fieldIds[fieldId]) {
106
- selectedCells.push({
107
- recordId,
108
- fieldId
109
- });
110
- }
111
- }
102
+ return aiTable.selection().activeCell;
103
+ },
104
+ getSelectedRecordIds(aiTable) {
105
+ const selectedRecords = aiTable.selection().selectedRecords;
106
+ const selectedCells = aiTable.selection().selectedCells;
107
+ let selectedRecordIds = [];
108
+ if (selectedRecords.size > 0) {
109
+ selectedRecordIds = [...selectedRecords.keys()];
110
+ }
111
+ else if (selectedCells.size > 0) {
112
+ selectedRecordIds = [...selectedCells].map((item) => item.split(':')[0]);
112
113
  }
113
- return selectedCells ? selectedCells[0] : null;
114
+ else {
115
+ selectedRecordIds = [];
116
+ }
117
+ return selectedRecordIds;
114
118
  },
115
119
  isCellVisible(aiTable, cell) {
116
120
  const visibleRowIndexMap = aiTable.context.visibleRowsIndexMap();
117
121
  const visibleColumnIndexMap = aiTable.context.visibleColumnsMap();
118
- return visibleRowIndexMap.has(cell.recordId) && visibleColumnIndexMap.has(cell.fieldId);
122
+ let isVisible = false;
123
+ if (Array.isArray(cell) && !!cell.length) {
124
+ const [recordId, fieldId] = cell;
125
+ isVisible = visibleRowIndexMap.has(recordId) && visibleColumnIndexMap.has(fieldId);
126
+ }
127
+ return isVisible;
119
128
  },
120
129
  getCellIndex(aiTable, cell) {
121
130
  const visibleRowIndexMap = aiTable.context.visibleRowsIndexMap();
122
131
  const visibleColumnIndexMap = aiTable.context.visibleColumnsMap();
123
132
  if (AITable.isCellVisible(aiTable, cell)) {
133
+ const [recordId, fieldId] = cell;
124
134
  return {
125
- rowIndex: visibleRowIndexMap.get(cell.recordId),
126
- columnIndex: visibleColumnIndexMap.get(cell.fieldId)
135
+ rowIndex: visibleRowIndexMap.get(recordId),
136
+ columnIndex: visibleColumnIndexMap.get(fieldId)
127
137
  };
128
138
  }
129
139
  return null;
@@ -333,6 +343,24 @@ var AITableRowType;
333
343
  AITableRowType["record"] = "record";
334
344
  })(AITableRowType || (AITableRowType = {}));
335
345
 
346
+ var AITableFilterOperation;
347
+ (function (AITableFilterOperation) {
348
+ AITableFilterOperation["eq"] = "eq";
349
+ AITableFilterOperation["gte"] = "gte";
350
+ AITableFilterOperation["lte"] = "lte";
351
+ AITableFilterOperation["gt"] = "gt";
352
+ AITableFilterOperation["lt"] = "lt";
353
+ AITableFilterOperation["in"] = "in";
354
+ AITableFilterOperation["contain"] = "contain";
355
+ AITableFilterOperation["ne"] = "ne";
356
+ AITableFilterOperation["nin"] = "nin";
357
+ AITableFilterOperation["between"] = "between";
358
+ AITableFilterOperation["besides"] = "besides";
359
+ AITableFilterOperation["empty"] = "empty";
360
+ AITableFilterOperation["exists"] = "exists";
361
+ AITableFilterOperation["notContain"] = "not_contain";
362
+ })(AITableFilterOperation || (AITableFilterOperation = {}));
363
+
336
364
  /**
337
365
  * 用于构建 Canvas 基础坐标系,后续的绘制工作以此为基础
338
366
  */
@@ -672,9 +700,10 @@ function createAITable(records, fields) {
672
700
  records,
673
701
  fields,
674
702
  selection: signal({
675
- selectedRecords: new Map(),
676
- selectedFields: new Map(),
677
- selectedCells: new Map()
703
+ selectedRecords: new Set(),
704
+ selectedFields: new Set(),
705
+ selectedCells: new Set(),
706
+ activeCell: null
678
707
  }),
679
708
  matchedCells: signal([]),
680
709
  recordsMap: computed(() => {
@@ -1541,37 +1570,34 @@ class AITableGridSelectionService {
1541
1570
  }
1542
1571
  clearSelection() {
1543
1572
  this.aiTable.selection.set({
1544
- selectedRecords: new Map(),
1545
- selectedFields: new Map(),
1546
- selectedCells: new Map()
1573
+ selectedRecords: new Set(),
1574
+ selectedFields: new Set(),
1575
+ selectedCells: new Set(),
1576
+ activeCell: null
1547
1577
  });
1548
1578
  }
1549
- selectCell(recordId, fieldId) {
1550
- const fields = this.aiTable.selection().selectedCells.get(recordId);
1551
- if (fields?.hasOwnProperty(fieldId)) {
1552
- return;
1553
- }
1554
- this.clearSelection();
1555
- this.aiTable.selection().selectedCells.set(recordId, { [fieldId]: true });
1579
+ setActiveCell(activeCell) {
1580
+ this.aiTable.selection().activeCell = activeCell;
1556
1581
  }
1557
1582
  selectField(fieldId) {
1558
1583
  if (this.aiTable.selection().selectedFields.has(fieldId)) {
1559
1584
  return;
1560
1585
  }
1561
1586
  this.clearSelection();
1562
- this.aiTable.selection().selectedFields.set(fieldId, true);
1587
+ this.aiTable.selection().selectedFields.add(fieldId);
1563
1588
  }
1564
1589
  selectRecord(recordId) {
1565
1590
  if (this.aiTable.selection().selectedRecords.has(recordId)) {
1566
1591
  this.aiTable.selection().selectedRecords.delete(recordId);
1567
1592
  }
1568
1593
  else {
1569
- this.aiTable.selection().selectedRecords.set(recordId, true);
1594
+ this.aiTable.selection().selectedRecords.add(recordId);
1570
1595
  }
1571
1596
  this.aiTable.selection.set({
1572
1597
  selectedRecords: this.aiTable.selection().selectedRecords,
1573
- selectedFields: new Map(),
1574
- selectedCells: new Map()
1598
+ selectedFields: new Set(),
1599
+ selectedCells: new Set(),
1600
+ activeCell: null
1575
1601
  });
1576
1602
  }
1577
1603
  toggleSelectAll(checked) {
@@ -1594,7 +1620,7 @@ class AITableGridSelectionService {
1594
1620
  if (cellDom) {
1595
1621
  const fieldId = cellDom.getAttribute('fieldId');
1596
1622
  const recordId = cellDom.getAttribute('recordId');
1597
- fieldId && recordId && this.selectCell(recordId, fieldId);
1623
+ fieldId && recordId && this.selectCells([recordId, fieldId]);
1598
1624
  }
1599
1625
  if (colDom && !fieldAction) {
1600
1626
  const fieldId = colDom.getAttribute('fieldId');
@@ -1604,6 +1630,38 @@ class AITableGridSelectionService {
1604
1630
  this.clearSelection();
1605
1631
  }
1606
1632
  }
1633
+ selectCells(startCell, endCell) {
1634
+ const [startRecordId, startFieldId] = startCell;
1635
+ if (!this.aiTable.context.visibleRowsIndexMap().has(startRecordId) ||
1636
+ !this.aiTable.context.visibleColumnsMap().has(startFieldId)) {
1637
+ return;
1638
+ }
1639
+ const selectedCells = new Set();
1640
+ if (!endCell || !endCell.length) {
1641
+ selectedCells.add(`${startRecordId}:${startFieldId}`);
1642
+ }
1643
+ else {
1644
+ const [endRecordId, endFieldId] = endCell;
1645
+ const startRowIndex = this.aiTable.context.visibleRowsIndexMap().get(startRecordId);
1646
+ const endRowIndex = this.aiTable.context.visibleRowsIndexMap().get(endRecordId);
1647
+ const startColIndex = this.aiTable.context.visibleColumnsMap().get(startFieldId);
1648
+ const endColIndex = this.aiTable.context.visibleColumnsMap().get(endFieldId);
1649
+ const minRowIndex = Math.min(startRowIndex, endRowIndex);
1650
+ const maxRowIndex = Math.max(startRowIndex, endRowIndex);
1651
+ const minColIndex = Math.min(startColIndex, endColIndex);
1652
+ const maxColIndex = Math.max(startColIndex, endColIndex);
1653
+ const rows = this.aiTable.context.linearRows();
1654
+ const fields = AITable.getVisibleFields(this.aiTable);
1655
+ for (let i = minRowIndex; i <= maxRowIndex; i++) {
1656
+ for (let j = minColIndex; j <= maxColIndex; j++) {
1657
+ selectedCells.add(`${rows[i]._id}:${fields[j]._id}`);
1658
+ }
1659
+ }
1660
+ }
1661
+ this.clearSelection();
1662
+ this.setActiveCell(startCell);
1663
+ this.aiTable.selection().selectedCells = selectedCells;
1664
+ }
1607
1665
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableGridSelectionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1608
1666
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableGridSelectionService }); }
1609
1667
  }
@@ -1632,14 +1690,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
1632
1690
  type: Component,
1633
1691
  args: [{ selector: 'ai-table-context-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
1634
1692
  class: 'context-menu'
1635
- }, imports: [
1636
- ThyDropdownMenuComponent,
1637
- ThyDropdownMenuItemDirective,
1638
- ThyDropdownMenuItemNameDirective,
1639
- ThyDropdownMenuItemIconDirective,
1640
- ThyIcon,
1641
- NgClass
1642
- ], template: "@for (menu of menuItems(); track $index) {\n @if ((menu.hidden && !menu.hidden(aiTable(), targetName(), position())) || !menu.hidden) {\n @let disabled = !!(menu.disabled && menu.disabled(aiTable(), targetName(), position()));\n <a\n thyDropdownMenuItem\n href=\"javascript:;\"\n [ngClass]=\"{ 'ai-table-prohibit-clear-selection remove-record': !disabled }\"\n (click)=\"execute(menu)\"\n [thyDisabled]=\"disabled\"\n >\n <thy-icon [thyIconName]=\"menu.icon!\"></thy-icon>\n <span>{{ menu.name }}</span>\n </a>\n }\n}\n" }]
1693
+ }, imports: [ThyDropdownMenuItemDirective, ThyIcon, NgClass], template: "@for (menu of menuItems(); track $index) {\n @if ((menu.hidden && !menu.hidden(aiTable(), targetName(), position())) || !menu.hidden) {\n @let disabled = !!(menu.disabled && menu.disabled(aiTable(), targetName(), position()));\n <a\n thyDropdownMenuItem\n href=\"javascript:;\"\n [ngClass]=\"{ 'ai-table-prohibit-clear-selection remove-record': !disabled }\"\n (click)=\"execute(menu)\"\n [thyDisabled]=\"disabled\"\n >\n <thy-icon [thyIconName]=\"menu.icon!\"></thy-icon>\n <span>{{ menu.name }}</span>\n </a>\n }\n}\n" }]
1643
1694
  }] });
1644
1695
 
1645
1696
  const GRID_CELL_EDITOR_MAP = {
@@ -1941,7 +1992,7 @@ class AITableGridMatchCellService {
1941
1992
  this.aiTable.records().forEach((record) => {
1942
1993
  this.aiTable.fields().forEach((field) => {
1943
1994
  if (this.isCellMatchKeywords(this.aiTable, field, record._id, keywords, references)) {
1944
- matchedCells.push(`${record._id}-${field._id}`);
1995
+ matchedCells.push(`${record._id}:${field._id}`);
1945
1996
  }
1946
1997
  });
1947
1998
  });
@@ -2480,19 +2531,195 @@ const TextMeasure = (defaults = {}) => {
2480
2531
  };
2481
2532
 
2482
2533
  class Field {
2534
+ // 筛选
2535
+ isMeetFilter(condition, cellValue) {
2536
+ switch (condition.operation) {
2537
+ case AITableFilterOperation.empty:
2538
+ case AITableFilterOperation.exists: {
2539
+ return this.isEmptyOrNot(condition.operation, cellValue);
2540
+ }
2541
+ default: {
2542
+ return true;
2543
+ }
2544
+ }
2545
+ }
2546
+ // 查找
2547
+ cellFullText(transformValue, field, references) {
2548
+ let fullText = [];
2549
+ if (!isEmpty(transformValue)) {
2550
+ fullText.push(String(transformValue));
2551
+ }
2552
+ return fullText;
2553
+ }
2554
+ isEmptyOrNot(operation, cellValue) {
2555
+ switch (operation) {
2556
+ case AITableFilterOperation.empty: {
2557
+ return isEmpty(cellValue);
2558
+ }
2559
+ case AITableFilterOperation.exists: {
2560
+ return !isEmpty(cellValue);
2561
+ }
2562
+ default: {
2563
+ throw new Error('compare operator type error');
2564
+ }
2565
+ }
2566
+ }
2567
+ }
2568
+
2569
+ const zhIntlCollator = typeof Intl !== 'undefined' ? new Intl.Collator('zh-CN') : undefined;
2570
+ function compareNumber(a, b) {
2571
+ if (isEmpty(a) && isEmpty(b)) {
2572
+ return 0;
2573
+ }
2574
+ if (isEmpty(a)) {
2575
+ return -1;
2576
+ }
2577
+ if (isEmpty(b)) {
2578
+ return 1;
2579
+ }
2580
+ return a === b ? 0 : a > b ? 1 : -1;
2581
+ }
2582
+ function compareString(a, b) {
2583
+ if (a === b) {
2584
+ return 0;
2585
+ }
2586
+ if (a == null) {
2587
+ return -1;
2588
+ }
2589
+ if (b == null) {
2590
+ return 1;
2591
+ }
2592
+ // pinyin sort
2593
+ return a === b ? 0 : zhIntlCollator ? zhIntlCollator.compare(a, b) : a.localeCompare(b, 'zh-CN') > 0 ? 1 : -1;
2594
+ }
2595
+ function stringInclude(str, searchStr) {
2596
+ return str.toLowerCase().includes(searchStr.trim().toLowerCase());
2597
+ }
2598
+ /**
2599
+ * 两数组是否有交集
2600
+ */
2601
+ function hasIntersect(array1, array2) {
2602
+ if (!Array.isArray(array1) || !Array.isArray(array2)) {
2603
+ return false;
2604
+ }
2605
+ const set1 = new Set(array1);
2606
+ const set2 = new Set(array2);
2607
+ for (const element of set1) {
2608
+ if (set2.has(element)) {
2609
+ return true;
2610
+ }
2611
+ }
2612
+ return false;
2613
+ }
2614
+
2615
+ class DateField extends Field {
2616
+ isMeetFilter(condition, cellValue) {
2617
+ const [left, right] = this.getTimeRange(condition.value);
2618
+ switch (condition.operation) {
2619
+ case AITableFilterOperation.empty:
2620
+ return isEmpty$1(cellValue.timestamp) || cellValue.timestamp === 0;
2621
+ case AITableFilterOperation.exists:
2622
+ return !isEmpty$1(cellValue.timestamp) && cellValue.timestamp !== 0;
2623
+ case AITableFilterOperation.eq:
2624
+ return left <= cellValue.timestamp && cellValue.timestamp < right;
2625
+ case AITableFilterOperation.gt:
2626
+ return cellValue.timestamp > right;
2627
+ case AITableFilterOperation.lt:
2628
+ return cellValue.timestamp < left;
2629
+ case AITableFilterOperation.between:
2630
+ return left <= cellValue.timestamp && cellValue.timestamp < right;
2631
+ default:
2632
+ return super.isMeetFilter(condition, cellValue);
2633
+ }
2634
+ }
2635
+ compare(cellValue1, cellValue2) {
2636
+ const value1 = cellValueToSortValue$4(cellValue1);
2637
+ const value2 = cellValueToSortValue$4(cellValue2);
2638
+ return compareNumber(value1, value2);
2639
+ }
2640
+ getTimeRange(value) {
2641
+ switch (value) {
2642
+ case 'today':
2643
+ return [new TinyDate(new Date()).startOfDay().getUnixTime(), new TinyDate(new Date()).endOfDay().getUnixTime()];
2644
+ case 'current_week':
2645
+ return [
2646
+ new TinyDate().startOfWeek({ weekStartsOn: 1 }).getUnixTime(),
2647
+ new TinyDate().endOfWeek({ weekStartsOn: 1 }).getUnixTime()
2648
+ ];
2649
+ case 'yesterday':
2650
+ return [
2651
+ new TinyDate(subDays(new Date(), 1)).startOfDay().getUnixTime(),
2652
+ new TinyDate(subDays(new Date(), 1)).endOfDay().getUnixTime()
2653
+ ];
2654
+ case 'current_month':
2655
+ return [new TinyDate().startOfMonth().getUnixTime(), new TinyDate().endOfMonth().getUnixTime()];
2656
+ default:
2657
+ if (isArray(value)) {
2658
+ return [
2659
+ new TinyDate(fromUnixTime(value[0])).startOfDay().getUnixTime(),
2660
+ new TinyDate(fromUnixTime(value[1])).endOfDay().getUnixTime()
2661
+ ];
2662
+ }
2663
+ return [
2664
+ new TinyDate(fromUnixTime(value)).startOfDay().getUnixTime(),
2665
+ new TinyDate(fromUnixTime(value)).endOfDay().getUnixTime()
2666
+ ];
2667
+ }
2668
+ }
2669
+ }
2670
+ function cellValueToSortValue$4(cellValue) {
2671
+ return cellValue?.timestamp;
2483
2672
  }
2484
2673
 
2485
2674
  class LinkField extends Field {
2486
- cellFullText(transformValue, field) {
2487
- let fullText = [];
2675
+ isMeetFilter(condition, cellValue) {
2676
+ const cellTextValue = cellValue?.text;
2677
+ switch (condition.operation) {
2678
+ case AITableFilterOperation.empty:
2679
+ return isEmpty(cellTextValue);
2680
+ case AITableFilterOperation.exists:
2681
+ return !isEmpty(cellTextValue);
2682
+ case AITableFilterOperation.contain:
2683
+ return !isEmpty(cellTextValue) && stringInclude(cellTextValue, condition.value);
2684
+ default:
2685
+ return super.isMeetFilter(condition, cellTextValue);
2686
+ }
2687
+ }
2688
+ compare(cellValue1, cellValue2) {
2689
+ return compareString(cellValueToSortValue$3(cellValue1), cellValueToSortValue$3(cellValue2));
2690
+ }
2691
+ cellFullText(transformValue) {
2692
+ let texts = [];
2488
2693
  if (!isEmpty(transformValue?.text)) {
2489
- fullText.push(transformValue.text);
2694
+ texts.push(transformValue.text);
2490
2695
  }
2491
- return fullText;
2696
+ return texts;
2492
2697
  }
2493
2698
  }
2699
+ function cellValueToSortValue$3(cellValue) {
2700
+ return (cellValue && cellValue.text && cellValue.text.trim()) || null;
2701
+ }
2494
2702
 
2495
2703
  class MemberField extends Field {
2704
+ isMeetFilter(condition, cellValue) {
2705
+ switch (condition.operation) {
2706
+ case AITableFilterOperation.empty:
2707
+ return isEmpty(cellValue);
2708
+ case AITableFilterOperation.exists:
2709
+ return !isEmpty(cellValue);
2710
+ case AITableFilterOperation.in:
2711
+ return Array.isArray(condition.value) && hasIntersect(cellValue, condition.value);
2712
+ case AITableFilterOperation.nin:
2713
+ return Array.isArray(condition.value) && !hasIntersect(cellValue, condition.value);
2714
+ default:
2715
+ return super.isMeetFilter(condition, cellValue);
2716
+ }
2717
+ }
2718
+ compare(cellValue1, cellValue2, field, references) {
2719
+ const value1 = cellValueToSortValue$2(cellValue1, field, references);
2720
+ const value2 = cellValueToSortValue$2(cellValue2, field, references);
2721
+ return compareString(value1, value2);
2722
+ }
2496
2723
  cellFullText(transformValue, field, references) {
2497
2724
  let fullText = [];
2498
2725
  if (transformValue?.length && references) {
@@ -2509,9 +2736,77 @@ class MemberField extends Field {
2509
2736
  return fullText;
2510
2737
  }
2511
2738
  }
2739
+ function cellValueToSortValue$2(cellValue, field, references) {
2740
+ let names = [];
2741
+ if (cellValue?.length && references) {
2742
+ for (let index = 0; index < cellValue.length; index++) {
2743
+ const userInfo = references?.members[cellValue[index]];
2744
+ if (!userInfo) {
2745
+ continue;
2746
+ }
2747
+ if (userInfo.display_name_pinyin) {
2748
+ names.push(userInfo.display_name_pinyin);
2749
+ }
2750
+ }
2751
+ }
2752
+ return names && names.length ? names.join(', ') : null;
2753
+ }
2754
+
2755
+ class NumberField extends Field {
2756
+ isMeetFilter(condition, cellValue) {
2757
+ switch (condition.operation) {
2758
+ case AITableFilterOperation.empty:
2759
+ return isEmpty(cellValue);
2760
+ case AITableFilterOperation.exists:
2761
+ return !isEmpty(cellValue);
2762
+ case AITableFilterOperation.eq:
2763
+ return !Number.isNaN(condition.value) && cellValue != null && cellValue !== '' && condition.value === cellValue;
2764
+ case AITableFilterOperation.gte:
2765
+ return cellValue != null && cellValue !== '' && cellValue >= condition.value;
2766
+ case AITableFilterOperation.lte:
2767
+ return cellValue != null && cellValue !== '' && cellValue <= condition.value;
2768
+ case AITableFilterOperation.gt:
2769
+ return cellValue != null && cellValue !== '' && cellValue > condition.value;
2770
+ case AITableFilterOperation.lt:
2771
+ return cellValue != null && cellValue !== '' && cellValue < condition.value;
2772
+ case AITableFilterOperation.ne:
2773
+ return cellValue == null || cellValue == '' || Number.isNaN(condition.value) || cellValue !== condition.value;
2774
+ default:
2775
+ return super.isMeetFilter(condition, cellValue);
2776
+ }
2777
+ }
2778
+ compare(cellValue1, cellValue2) {
2779
+ return compareNumber(cellValue1, cellValue2);
2780
+ }
2781
+ }
2512
2782
 
2513
2783
  class ProgressField extends Field {
2514
- cellFullText(transformValue, field) {
2784
+ isMeetFilter(condition, cellValue) {
2785
+ switch (condition.operation) {
2786
+ case AITableFilterOperation.empty:
2787
+ return isEmpty(cellValue);
2788
+ case AITableFilterOperation.exists:
2789
+ return !isEmpty(cellValue);
2790
+ case AITableFilterOperation.eq:
2791
+ return !Number.isNaN(condition.value) && cellValue != null && cellValue !== '' && condition.value === cellValue;
2792
+ case AITableFilterOperation.gte:
2793
+ return cellValue != null && cellValue !== '' && cellValue >= condition.value;
2794
+ case AITableFilterOperation.lte:
2795
+ return cellValue != null && cellValue !== '' && cellValue <= condition.value;
2796
+ case AITableFilterOperation.gt:
2797
+ return cellValue != null && cellValue !== '' && cellValue > condition.value;
2798
+ case AITableFilterOperation.lt:
2799
+ return cellValue != null && cellValue !== '' && cellValue < condition.value;
2800
+ case AITableFilterOperation.ne:
2801
+ return cellValue == null || cellValue == '' || Number.isNaN(condition.value) || cellValue !== condition.value;
2802
+ default:
2803
+ return super.isMeetFilter(condition, cellValue);
2804
+ }
2805
+ }
2806
+ compare(cellValue1, cellValue2) {
2807
+ return compareNumber(cellValue1, cellValue2);
2808
+ }
2809
+ cellFullText(transformValue) {
2515
2810
  let fullText = [];
2516
2811
  if (!isEmpty(transformValue)) {
2517
2812
  fullText.push(`${transformValue}%`);
@@ -2520,40 +2815,111 @@ class ProgressField extends Field {
2520
2815
  }
2521
2816
  }
2522
2817
 
2818
+ class RateField extends Field {
2819
+ isMeetFilter(condition, cellValue) {
2820
+ switch (condition.operation) {
2821
+ case AITableFilterOperation.empty:
2822
+ return isEmpty(cellValue);
2823
+ case AITableFilterOperation.exists:
2824
+ return !isEmpty(cellValue);
2825
+ case AITableFilterOperation.in:
2826
+ const isContain = condition.value.some((item) => String(item) === String(cellValue));
2827
+ return !isEmpty(cellValue) && isContain;
2828
+ case AITableFilterOperation.nin:
2829
+ const noContain = condition.value.every((item) => String(item) !== String(cellValue));
2830
+ return isEmpty(cellValue) || noContain;
2831
+ default:
2832
+ return super.isMeetFilter(condition, cellValue);
2833
+ }
2834
+ }
2835
+ compare(cellValue1, cellValue2) {
2836
+ return compareNumber(cellValue1, cellValue2);
2837
+ }
2838
+ }
2839
+
2523
2840
  class SelectField extends Field {
2841
+ isMeetFilter(condition, cellValue) {
2842
+ switch (condition.operation) {
2843
+ case AITableFilterOperation.empty:
2844
+ return isEmpty(cellValue);
2845
+ case AITableFilterOperation.exists:
2846
+ return !isEmpty(cellValue);
2847
+ case AITableFilterOperation.in:
2848
+ return Array.isArray(condition.value) && hasIntersect(cellValue, condition.value);
2849
+ case AITableFilterOperation.nin:
2850
+ return Array.isArray(condition.value) && !hasIntersect(cellValue, condition.value);
2851
+ default:
2852
+ return super.isMeetFilter(condition, cellValue);
2853
+ }
2854
+ }
2855
+ compare(cellValue1, cellValue2, field) {
2856
+ const value1 = cellValueToSortValue$1(cellValue1, field);
2857
+ const value2 = cellValueToSortValue$1(cellValue2, field);
2858
+ return compareString(value1, value2);
2859
+ }
2524
2860
  cellFullText(transformValue, field) {
2525
- let cellText = [];
2861
+ let fullText = [];
2862
+ const optionsMap = helpers.keyBy(field.settings.options || [], '_id');
2526
2863
  if (transformValue && Array.isArray(transformValue) && transformValue.length) {
2527
2864
  transformValue.forEach((optionId) => {
2528
- const item = field.settings?.options?.find((option) => option._id === optionId);
2529
- if (item?.text) {
2530
- cellText.push(item.text);
2865
+ const option = optionsMap[optionId];
2866
+ if (option && option.text) {
2867
+ fullText.push(option.text);
2531
2868
  }
2532
2869
  });
2533
2870
  }
2534
- return cellText;
2871
+ return fullText;
2535
2872
  }
2536
2873
  }
2874
+ function cellValueToSortValue$1(cellValue, field) {
2875
+ if (!cellValue) {
2876
+ return null;
2877
+ }
2878
+ const texts = [];
2879
+ const optionsMap = helpers.keyBy(field.settings.options || [], '_id');
2880
+ if (cellValue && Array.isArray(cellValue) && cellValue.length) {
2881
+ cellValue.forEach((optionId) => {
2882
+ const option = optionsMap[optionId];
2883
+ if (option && option.text) {
2884
+ texts.push(option.text);
2885
+ }
2886
+ });
2887
+ }
2888
+ return texts && texts.length ? texts.join(',') : null;
2889
+ }
2537
2890
 
2538
2891
  class TextField extends Field {
2539
- cellFullText(transformValue, field, references) {
2540
- let fullText = [];
2541
- if (!isEmpty(transformValue)) {
2542
- fullText.push(String(transformValue));
2892
+ isMeetFilter(condition, cellValue) {
2893
+ switch (condition.operation) {
2894
+ case AITableFilterOperation.empty:
2895
+ return isEmpty(cellValue);
2896
+ case AITableFilterOperation.exists:
2897
+ return !isEmpty(cellValue);
2898
+ case AITableFilterOperation.contain:
2899
+ return !isEmpty(cellValue) && stringInclude(cellValue, condition.value);
2900
+ default:
2901
+ return super.isMeetFilter(condition, cellValue);
2543
2902
  }
2544
- return fullText;
2545
2903
  }
2904
+ compare(cellValue1, cellValue2) {
2905
+ const value1 = cellValueToSortValue(cellValue1);
2906
+ const value2 = cellValueToSortValue(cellValue2);
2907
+ return compareString(value1, value2);
2908
+ }
2909
+ }
2910
+ function cellValueToSortValue(cellValue) {
2911
+ return (cellValue && cellValue.trim()) || null;
2546
2912
  }
2547
2913
 
2548
2914
  const ViewOperationMap = {
2549
2915
  [AITableFieldType.text]: new TextField(),
2550
2916
  [AITableFieldType.richText]: new TextField(),
2551
2917
  [AITableFieldType.select]: new SelectField(),
2552
- [AITableFieldType.date]: new TextField(),
2553
- [AITableFieldType.createdAt]: new TextField(),
2554
- [AITableFieldType.updatedAt]: new TextField(),
2555
- [AITableFieldType.number]: new TextField(),
2556
- [AITableFieldType.rate]: new TextField(),
2918
+ [AITableFieldType.date]: new DateField(),
2919
+ [AITableFieldType.createdAt]: new DateField(),
2920
+ [AITableFieldType.updatedAt]: new DateField(),
2921
+ [AITableFieldType.number]: new NumberField(),
2922
+ [AITableFieldType.rate]: new RateField(),
2557
2923
  [AITableFieldType.link]: new LinkField(),
2558
2924
  [AITableFieldType.member]: new MemberField(),
2559
2925
  [AITableFieldType.progress]: new ProgressField(),
@@ -2603,8 +2969,9 @@ class AITableGridEventService {
2603
2969
  });
2604
2970
  }
2605
2971
  getEditorComponent(type) {
2606
- if (this.aiFieldRenderers && this.aiFieldRenderers[type]) {
2607
- return this.aiFieldRenderers[type].editor;
2972
+ const filedRenderSchema = this.aiFieldRenderers && this.aiFieldRenderers[type];
2973
+ if (filedRenderSchema && filedRenderSchema.editor) {
2974
+ return filedRenderSchema.editor;
2608
2975
  }
2609
2976
  return GRID_CELL_EDITOR_MAP[type];
2610
2977
  }
@@ -2644,7 +3011,8 @@ class AITableGridEventService {
2644
3011
  const { container, coordinate, recordId, fieldId, isHoverEdit } = options;
2645
3012
  const { scrollState } = aiTable.context;
2646
3013
  const { rowHeight, columnCount } = coordinate;
2647
- const { rowIndex, columnIndex } = AITable.getCellIndex(aiTable, { recordId, fieldId });
3014
+ const cell = [recordId, fieldId];
3015
+ const { rowIndex, columnIndex } = AITable.getCellIndex(aiTable, cell);
2648
3016
  const originX = coordinate.getColumnOffset(columnIndex);
2649
3017
  const originY = coordinate.getRowOffset(rowIndex);
2650
3018
  const columnWidth = coordinate.getColumnWidth(columnIndex);
@@ -2939,7 +3307,7 @@ class AITableDomGrid extends AITableGridBase {
2939
3307
  });
2940
3308
  }
2941
3309
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableDomGrid, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2942
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableDomGrid, isStandalone: true, selector: "ai-table-dom-grid", host: { classAttribute: "ai-table-grid ai-table-dom-grid" }, providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService], usesInheritance: true, ngImport: i0, template: "<div class=\"grid-header d-flex\">\n <div class=\"grid-column-checkbox grid-cell grid-checkbox\">\n <label thyCheckbox thyLabelText=\"\" [ngModel]=\"isSelectedAll()\" (ngModelChange)=\"toggleSelectAll($event)\"></label>\n </div>\n @for (field of gridData().fields; track field._id) {\n <div\n class=\"grid-cell grid-field\"\n #fieldAction\n [attr.fieldId]=\"field._id\"\n [ngClass]=\"{ highlight: aiTable.selection().selectedFields.has(field._id) }\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n <span class=\"text-truncate\">\n <thy-icon [thyIconName]=\"field.icon!\" class=\"mr-2 text-muted\"></thy-icon>\n <span>{{ field.name }}</span>\n </span>\n <a\n href=\"javascript:;\"\n class=\"grid-field-action\"\n thyAction\n thyIcon=\"more-vertical\"\n (click)=\"openFieldMenu($event, field, fieldAction)\"\n >\n </a>\n </div>\n }\n <div class=\"grid-column-blank cursor-pointer\" #gridColumnBlank (click)=\"addField(gridColumnBlank)\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n<div class=\"grid-body d-flex\">\n @for (record of gridData().records; track record._id; let index = $index) {\n <div class=\"grid-row d-flex\" [ngClass]=\"{ highlight: (record._id | isSelectRecord: aiTable.selection()) }\">\n <div class=\"grid-row-index grid-checkbox\">\n <label\n [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'checked-box' : 'unchecked-box'\"\n thyCheckbox\n thyLabelText=\"\"\n [ngModel]=\"record._id | isSelectRecord: aiTable.selection()\"\n (ngModelChange)=\"selectRecord(record._id)\"\n ></label>\n <span [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'grid-row-no-number' : 'grid-row-number'\">\n {{ index + 1 }}\n </span>\n </div>\n @for (field of gridData().fields; track field._id) {\n <div\n #cell\n class=\"grid-cell\"\n [ngClass]=\"{\n highlight: aiTable.selection().selectedCells.has(record._id) || aiTable.selection().selectedFields.has(field._id),\n selected: aiTable.selection().selectedCells.get(record._id)?.hasOwnProperty(field._id)\n }\"\n [attr.type]=\"[field.type]\"\n [attr.fieldId]=\"[field._id]\"\n [attr.recordId]=\"[record._id]\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n @switch (field.type) {\n @case (AITableFieldType.select) {\n @let fieldValue = record.values[field._id];\n @let settings = field.settings! | selectSetting;\n @let options = settings['options'];\n @let optionStyle = settings['option_style'] || AITableSelectOptionStyle.tag;\n @let isTagStyle = optionStyle === AITableSelectOptionStyle.tag;\n\n @if (!settings['is_multiple'] && fieldValue | selectOption: options; as selectedOption) {\n @if (isTagStyle) {\n <select-option class=\"mb-1 mr-1\" [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n </div>\n }\n } @else {\n @let maxShowCount = 2;\n\n <div class=\"d-flex\">\n @if (fieldValue | selectOptions: options; as selectedOptions) {\n @for (option of selectedOptions; track option!._id; let i = $index) {\n @if (i + 1 <= maxShowCount) {\n @if (isTagStyle) {\n <select-option\n class=\"mb-1 mr-1\"\n [field]=\"field\"\n [displayOption]=\"option!\"\n ></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"option!\"></select-option>\n </div>\n }\n }\n }\n\n @let selectedLength = selectedOptions.length || 0;\n @if (selectedOptions && maxShowCount < selectedLength) {\n @let shape = isTagStyle ? 'pill' : 'rectangle';\n @let isHidden = maxShowCount >= selectedLength;\n\n <thy-tag\n class=\"cursor-pointer\"\n [class.multi-property-value-hidden]=\"isHidden\"\n [thyShape]=\"shape\"\n >\n <span class=\"text-truncate\"> +{{ selectedLength - maxShowCount }} </span>\n </thy-tag>\n }\n }\n </div>\n }\n }\n @case (AITableFieldType.date) {\n {{ record.values[field._id].timestamp | thyDatePickerFormat }}\n }\n @case (AITableFieldType.updatedAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.createdAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.rate) {\n <thy-rate [ngModel]=\"record.values[field._id]\"></thy-rate>\n }\n @case (AITableFieldType.link) {\n <a\n class=\"d-block\"\n target=\"_blank\"\n [href]=\"record.values[field._id]?.url\"\n thyStopPropagation\n thyFlexibleText\n [thyTooltipContent]=\"record.values[field._id]?.text\"\n >\n {{ record.values[field._id]?.text }}\n </a>\n }\n @case (AITableFieldType.progress) {\n <thy-progress\n class=\"w-100\"\n [thyValue]=\"record.values[field._id] || 0\"\n [thySize]=\"record.values[field._id]?.config?.size || 'md'\"\n [thyMax]=\"record.values[field._id]?.config?.max || 100\"\n [thyType]=\"record.values[field._id]?.config?.progressType || 'success'\"\n >\n <span> {{ record.values[field._id] || 0 }}{{ record.values[field._id]?.config?.suffix || '%' }} </span>\n </thy-progress>\n }\n @case (AITableFieldType.member) {\n @let settings = field.settings! | memberSetting;\n\n @if (!settings!['is_multiple']) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n } @else {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n <thy-avatar-list thyAvatarSize=\"xs\">\n @for (item of recordValues; track $index) {\n <thy-avatar [thyName]=\"item.display_name!\" [thySrc]=\"item.avatar!\"></thy-avatar>\n }\n </thy-avatar-list>\n }\n }\n @case (AITableFieldType.createdBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @case (AITableFieldType.updatedBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @default {\n <span class=\"text-truncate\"> {{ record.values[field._id] }}</span>\n }\n }\n <div class=\"autofill-container\"></div>\n </div>\n }\n <div class=\"grid-column-blank\"></div>\n </div>\n }\n <div class=\"grid-row-insert grid-row cursor-pointer\" (click)=\"addRecord()\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n\n<div #activeBorder class=\"active-border\"></div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: SelectOptionPipe, name: "selectOption" }, { kind: "pipe", type: SelectOptionsPipe, name: "selectOptions" }, { kind: "component", type: ThyTag, selector: "thy-tag,[thyTag]", inputs: ["thyTag", "thyShape", "thyColor", "thyTheme", "thySize", "thyHoverable"] }, { kind: "ngmodule", type: ThyPopoverModule }, { kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "component", type: ThyRate, selector: "thy-rate", inputs: ["thyCount", "thyDisabled", "thyAllowHalf", "thyAllowClear", "thyTooltips", "thyIconTemplate"], outputs: ["thyItemHoverChange"] }, { kind: "component", type: ThyProgress, selector: "thy-progress", inputs: ["thyType", "thySize", "thyValue", "thyMax", "thyTips", "thyShape", "thyGapDegree", "thyGapPosition", "thyStrokeWidth"] }, { kind: "pipe", type: ThyDatePickerFormatPipe, name: "thyDatePickerFormat" }, { kind: "component", type: ThyFlexibleText, selector: "thy-flexible-text,[thyFlexibleText]", inputs: ["thyTooltipTrigger", "thyContainerClass", "thyTooltipContent", "thyTooltipPlacement", "thyTooltipOffset"], exportAs: ["thyFlexibleText"] }, { kind: "directive", type: ThyStopPropagationDirective, selector: "[thyStopPropagation]", inputs: ["thyStopPropagation"] }, { kind: "component", type: ThyAction, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "ngmodule", type: ThyCheckboxModule }, { kind: "component", type: i3$1.ThyCheckbox, selector: "thy-checkbox,[thy-checkbox],[thyCheckbox]", inputs: ["thyIndeterminate"] }, { kind: "ngmodule", type: ThyAvatarModule }, { kind: "component", type: i4.ThyAvatar, selector: "thy-avatar", inputs: ["thyShowName", "thySrc", "thyName", "thySize", "thyShowRemove", "thyRemovable", "thyImgClass", "thyDisabled", "thyLoading", "thyFetchPriority"], outputs: ["thyOnRemove", "thyRemove", "thyError"] }, { kind: "component", type: i4.ThyAvatarList, selector: "thy-avatar-list", inputs: ["thyMode", "thyAvatarSize"] }, { kind: "pipe", type: IsSelectRecordPipe, name: "isSelectRecord" }, { kind: "component", type: SelectOptionComponent, selector: "select-option", inputs: ["field", "displayOption"] }, { kind: "pipe", type: UserPipe, name: "user" }, { kind: "pipe", type: SelectSettingPipe, name: "selectSetting" }, { kind: "pipe", type: MemberSettingPipe, name: "memberSetting" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3310
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableDomGrid, isStandalone: true, selector: "ai-table-dom-grid", host: { classAttribute: "ai-table-grid ai-table-dom-grid" }, providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService], usesInheritance: true, ngImport: i0, template: "<div class=\"grid-header d-flex\">\n <div class=\"grid-column-checkbox grid-cell grid-checkbox\">\n <label thyCheckbox thyLabelText=\"\" [ngModel]=\"isSelectedAll()\" (ngModelChange)=\"toggleSelectAll($event)\"></label>\n </div>\n @for (field of gridData().fields; track field._id) {\n <div\n class=\"grid-cell grid-field\"\n #fieldAction\n [attr.fieldId]=\"field._id\"\n [ngClass]=\"{ highlight: aiTable.selection().selectedFields.has(field._id) }\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n <span class=\"text-truncate\">\n <thy-icon [thyIconName]=\"field.icon!\" class=\"mr-2 text-muted\"></thy-icon>\n <span>{{ field.name }}</span>\n </span>\n <a\n href=\"javascript:;\"\n class=\"grid-field-action\"\n thyAction\n thyIcon=\"more-vertical\"\n (click)=\"openFieldMenu($event, field, fieldAction)\"\n >\n </a>\n </div>\n }\n <div class=\"grid-column-blank cursor-pointer\" #gridColumnBlank (click)=\"addField(gridColumnBlank)\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n<div class=\"grid-body d-flex\">\n @for (record of gridData().records; track record._id; let index = $index) {\n <div class=\"grid-row d-flex\" [ngClass]=\"{ highlight: (record._id | isSelectRecord: aiTable.selection()) }\">\n <div class=\"grid-row-index grid-checkbox\">\n <label\n [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'checked-box' : 'unchecked-box'\"\n thyCheckbox\n thyLabelText=\"\"\n [ngModel]=\"record._id | isSelectRecord: aiTable.selection()\"\n (ngModelChange)=\"selectRecord(record._id)\"\n ></label>\n <span [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'grid-row-no-number' : 'grid-row-number'\">\n {{ index + 1 }}\n </span>\n </div>\n @for (field of gridData().fields; track field._id) {\n <!-- [ngClass]=\"{\n highlight: aiTable.selection().selectedCells.has(record._id) || aiTable.selection().selectedFields.has(field._id),\n selected: aiTable.selection().selectedCells.get(record._id)?.hasOwnProperty(field._id)\n }\" -->\n <div\n #cell\n class=\"grid-cell\"\n [attr.type]=\"[field.type]\"\n [attr.fieldId]=\"[field._id]\"\n [attr.recordId]=\"[record._id]\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n @switch (field.type) {\n @case (AITableFieldType.select) {\n @let fieldValue = record.values[field._id];\n @let settings = field.settings! | selectSetting;\n @let options = settings['options'];\n @let optionStyle = settings['option_style'] || AITableSelectOptionStyle.tag;\n @let isTagStyle = optionStyle === AITableSelectOptionStyle.tag;\n\n @if (!settings['is_multiple'] && fieldValue | selectOption: options; as selectedOption) {\n @if (isTagStyle) {\n <select-option class=\"mb-1 mr-1\" [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n </div>\n }\n } @else {\n @let maxShowCount = 2;\n\n <div class=\"d-flex\">\n @if (fieldValue | selectOptions: options; as selectedOptions) {\n @for (option of selectedOptions; track option!._id; let i = $index) {\n @if (i + 1 <= maxShowCount) {\n @if (isTagStyle) {\n <select-option\n class=\"mb-1 mr-1\"\n [field]=\"field\"\n [displayOption]=\"option!\"\n ></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"option!\"></select-option>\n </div>\n }\n }\n }\n\n @let selectedLength = selectedOptions.length || 0;\n @if (selectedOptions && maxShowCount < selectedLength) {\n @let shape = isTagStyle ? 'pill' : 'rectangle';\n @let isHidden = maxShowCount >= selectedLength;\n\n <thy-tag\n class=\"cursor-pointer\"\n [class.multi-property-value-hidden]=\"isHidden\"\n [thyShape]=\"shape\"\n >\n <span class=\"text-truncate\"> +{{ selectedLength - maxShowCount }} </span>\n </thy-tag>\n }\n }\n </div>\n }\n }\n @case (AITableFieldType.date) {\n {{ record.values[field._id].timestamp | thyDatePickerFormat }}\n }\n @case (AITableFieldType.updatedAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.createdAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.rate) {\n <thy-rate [ngModel]=\"record.values[field._id]\"></thy-rate>\n }\n @case (AITableFieldType.link) {\n <a\n class=\"d-block\"\n target=\"_blank\"\n [href]=\"record.values[field._id]?.url\"\n thyStopPropagation\n thyFlexibleText\n [thyTooltipContent]=\"record.values[field._id]?.text\"\n >\n {{ record.values[field._id]?.text }}\n </a>\n }\n @case (AITableFieldType.progress) {\n <thy-progress\n class=\"w-100\"\n [thyValue]=\"record.values[field._id] || 0\"\n [thySize]=\"record.values[field._id]?.config?.size || 'md'\"\n [thyMax]=\"record.values[field._id]?.config?.max || 100\"\n [thyType]=\"record.values[field._id]?.config?.progressType || 'success'\"\n >\n <span> {{ record.values[field._id] || 0 }}{{ record.values[field._id]?.config?.suffix || '%' }} </span>\n </thy-progress>\n }\n @case (AITableFieldType.member) {\n @let settings = field.settings! | memberSetting;\n\n @if (!settings!['is_multiple']) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n } @else {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n <thy-avatar-list thyAvatarSize=\"xs\">\n @for (item of recordValues; track $index) {\n <thy-avatar [thyName]=\"item.display_name!\" [thySrc]=\"item.avatar!\"></thy-avatar>\n }\n </thy-avatar-list>\n }\n }\n @case (AITableFieldType.createdBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @case (AITableFieldType.updatedBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @default {\n <span class=\"text-truncate\"> {{ record.values[field._id] }}</span>\n }\n }\n <div class=\"autofill-container\"></div>\n </div>\n }\n <div class=\"grid-column-blank\"></div>\n </div>\n }\n <div class=\"grid-row-insert grid-row cursor-pointer\" (click)=\"addRecord()\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n\n<div #activeBorder class=\"active-border\"></div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: SelectOptionPipe, name: "selectOption" }, { kind: "pipe", type: SelectOptionsPipe, name: "selectOptions" }, { kind: "component", type: ThyTag, selector: "thy-tag,[thyTag]", inputs: ["thyTag", "thyShape", "thyColor", "thyTheme", "thySize", "thyHoverable"] }, { kind: "ngmodule", type: ThyPopoverModule }, { kind: "component", type: ThyIcon, selector: "thy-icon, [thy-icon]", inputs: ["thyIconType", "thyTwotoneColor", "thyIconName", "thyIconRotate", "thyIconSet", "thyIconLegging", "thyIconLinearGradient"] }, { kind: "component", type: ThyRate, selector: "thy-rate", inputs: ["thyCount", "thyDisabled", "thyAllowHalf", "thyAllowClear", "thyTooltips", "thyIconTemplate"], outputs: ["thyItemHoverChange"] }, { kind: "component", type: ThyProgress, selector: "thy-progress", inputs: ["thyType", "thySize", "thyValue", "thyMax", "thyTips", "thyShape", "thyGapDegree", "thyGapPosition", "thyStrokeWidth"] }, { kind: "pipe", type: ThyDatePickerFormatPipe, name: "thyDatePickerFormat" }, { kind: "component", type: ThyFlexibleText, selector: "thy-flexible-text,[thyFlexibleText]", inputs: ["thyTooltipTrigger", "thyContainerClass", "thyTooltipContent", "thyTooltipPlacement", "thyTooltipOffset"], exportAs: ["thyFlexibleText"] }, { kind: "directive", type: ThyStopPropagationDirective, selector: "[thyStopPropagation]", inputs: ["thyStopPropagation"] }, { kind: "component", type: ThyAction, selector: "thy-action, [thyAction]", inputs: ["thyType", "thyIcon", "thyActionIcon", "thyActive", "thyActionActive", "thyTheme", "thyHoverIcon", "thyDisabled"] }, { kind: "ngmodule", type: ThyCheckboxModule }, { kind: "component", type: i3$1.ThyCheckbox, selector: "thy-checkbox,[thy-checkbox],[thyCheckbox]", inputs: ["thyIndeterminate"] }, { kind: "ngmodule", type: ThyAvatarModule }, { kind: "component", type: i4.ThyAvatar, selector: "thy-avatar", inputs: ["thyShowName", "thySrc", "thyName", "thySize", "thyShowRemove", "thyRemovable", "thyImgClass", "thyDisabled", "thyLoading", "thyFetchPriority"], outputs: ["thyOnRemove", "thyRemove", "thyError"] }, { kind: "component", type: i4.ThyAvatarList, selector: "thy-avatar-list", inputs: ["thyMode", "thyAvatarSize"] }, { kind: "pipe", type: IsSelectRecordPipe, name: "isSelectRecord" }, { kind: "component", type: SelectOptionComponent, selector: "select-option", inputs: ["field", "displayOption"] }, { kind: "pipe", type: UserPipe, name: "user" }, { kind: "pipe", type: SelectSettingPipe, name: "selectSetting" }, { kind: "pipe", type: MemberSettingPipe, name: "memberSetting" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2943
3311
  }
2944
3312
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableDomGrid, decorators: [{
2945
3313
  type: Component,
@@ -2975,7 +3343,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
2975
3343
  UserPipe,
2976
3344
  SelectSettingPipe,
2977
3345
  MemberSettingPipe
2978
- ], providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService], template: "<div class=\"grid-header d-flex\">\n <div class=\"grid-column-checkbox grid-cell grid-checkbox\">\n <label thyCheckbox thyLabelText=\"\" [ngModel]=\"isSelectedAll()\" (ngModelChange)=\"toggleSelectAll($event)\"></label>\n </div>\n @for (field of gridData().fields; track field._id) {\n <div\n class=\"grid-cell grid-field\"\n #fieldAction\n [attr.fieldId]=\"field._id\"\n [ngClass]=\"{ highlight: aiTable.selection().selectedFields.has(field._id) }\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n <span class=\"text-truncate\">\n <thy-icon [thyIconName]=\"field.icon!\" class=\"mr-2 text-muted\"></thy-icon>\n <span>{{ field.name }}</span>\n </span>\n <a\n href=\"javascript:;\"\n class=\"grid-field-action\"\n thyAction\n thyIcon=\"more-vertical\"\n (click)=\"openFieldMenu($event, field, fieldAction)\"\n >\n </a>\n </div>\n }\n <div class=\"grid-column-blank cursor-pointer\" #gridColumnBlank (click)=\"addField(gridColumnBlank)\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n<div class=\"grid-body d-flex\">\n @for (record of gridData().records; track record._id; let index = $index) {\n <div class=\"grid-row d-flex\" [ngClass]=\"{ highlight: (record._id | isSelectRecord: aiTable.selection()) }\">\n <div class=\"grid-row-index grid-checkbox\">\n <label\n [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'checked-box' : 'unchecked-box'\"\n thyCheckbox\n thyLabelText=\"\"\n [ngModel]=\"record._id | isSelectRecord: aiTable.selection()\"\n (ngModelChange)=\"selectRecord(record._id)\"\n ></label>\n <span [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'grid-row-no-number' : 'grid-row-number'\">\n {{ index + 1 }}\n </span>\n </div>\n @for (field of gridData().fields; track field._id) {\n <div\n #cell\n class=\"grid-cell\"\n [ngClass]=\"{\n highlight: aiTable.selection().selectedCells.has(record._id) || aiTable.selection().selectedFields.has(field._id),\n selected: aiTable.selection().selectedCells.get(record._id)?.hasOwnProperty(field._id)\n }\"\n [attr.type]=\"[field.type]\"\n [attr.fieldId]=\"[field._id]\"\n [attr.recordId]=\"[record._id]\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n @switch (field.type) {\n @case (AITableFieldType.select) {\n @let fieldValue = record.values[field._id];\n @let settings = field.settings! | selectSetting;\n @let options = settings['options'];\n @let optionStyle = settings['option_style'] || AITableSelectOptionStyle.tag;\n @let isTagStyle = optionStyle === AITableSelectOptionStyle.tag;\n\n @if (!settings['is_multiple'] && fieldValue | selectOption: options; as selectedOption) {\n @if (isTagStyle) {\n <select-option class=\"mb-1 mr-1\" [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n </div>\n }\n } @else {\n @let maxShowCount = 2;\n\n <div class=\"d-flex\">\n @if (fieldValue | selectOptions: options; as selectedOptions) {\n @for (option of selectedOptions; track option!._id; let i = $index) {\n @if (i + 1 <= maxShowCount) {\n @if (isTagStyle) {\n <select-option\n class=\"mb-1 mr-1\"\n [field]=\"field\"\n [displayOption]=\"option!\"\n ></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"option!\"></select-option>\n </div>\n }\n }\n }\n\n @let selectedLength = selectedOptions.length || 0;\n @if (selectedOptions && maxShowCount < selectedLength) {\n @let shape = isTagStyle ? 'pill' : 'rectangle';\n @let isHidden = maxShowCount >= selectedLength;\n\n <thy-tag\n class=\"cursor-pointer\"\n [class.multi-property-value-hidden]=\"isHidden\"\n [thyShape]=\"shape\"\n >\n <span class=\"text-truncate\"> +{{ selectedLength - maxShowCount }} </span>\n </thy-tag>\n }\n }\n </div>\n }\n }\n @case (AITableFieldType.date) {\n {{ record.values[field._id].timestamp | thyDatePickerFormat }}\n }\n @case (AITableFieldType.updatedAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.createdAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.rate) {\n <thy-rate [ngModel]=\"record.values[field._id]\"></thy-rate>\n }\n @case (AITableFieldType.link) {\n <a\n class=\"d-block\"\n target=\"_blank\"\n [href]=\"record.values[field._id]?.url\"\n thyStopPropagation\n thyFlexibleText\n [thyTooltipContent]=\"record.values[field._id]?.text\"\n >\n {{ record.values[field._id]?.text }}\n </a>\n }\n @case (AITableFieldType.progress) {\n <thy-progress\n class=\"w-100\"\n [thyValue]=\"record.values[field._id] || 0\"\n [thySize]=\"record.values[field._id]?.config?.size || 'md'\"\n [thyMax]=\"record.values[field._id]?.config?.max || 100\"\n [thyType]=\"record.values[field._id]?.config?.progressType || 'success'\"\n >\n <span> {{ record.values[field._id] || 0 }}{{ record.values[field._id]?.config?.suffix || '%' }} </span>\n </thy-progress>\n }\n @case (AITableFieldType.member) {\n @let settings = field.settings! | memberSetting;\n\n @if (!settings!['is_multiple']) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n } @else {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n <thy-avatar-list thyAvatarSize=\"xs\">\n @for (item of recordValues; track $index) {\n <thy-avatar [thyName]=\"item.display_name!\" [thySrc]=\"item.avatar!\"></thy-avatar>\n }\n </thy-avatar-list>\n }\n }\n @case (AITableFieldType.createdBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @case (AITableFieldType.updatedBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @default {\n <span class=\"text-truncate\"> {{ record.values[field._id] }}</span>\n }\n }\n <div class=\"autofill-container\"></div>\n </div>\n }\n <div class=\"grid-column-blank\"></div>\n </div>\n }\n <div class=\"grid-row-insert grid-row cursor-pointer\" (click)=\"addRecord()\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n\n<div #activeBorder class=\"active-border\"></div>\n" }]
3346
+ ], providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService], template: "<div class=\"grid-header d-flex\">\n <div class=\"grid-column-checkbox grid-cell grid-checkbox\">\n <label thyCheckbox thyLabelText=\"\" [ngModel]=\"isSelectedAll()\" (ngModelChange)=\"toggleSelectAll($event)\"></label>\n </div>\n @for (field of gridData().fields; track field._id) {\n <div\n class=\"grid-cell grid-field\"\n #fieldAction\n [attr.fieldId]=\"field._id\"\n [ngClass]=\"{ highlight: aiTable.selection().selectedFields.has(field._id) }\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n <span class=\"text-truncate\">\n <thy-icon [thyIconName]=\"field.icon!\" class=\"mr-2 text-muted\"></thy-icon>\n <span>{{ field.name }}</span>\n </span>\n <a\n href=\"javascript:;\"\n class=\"grid-field-action\"\n thyAction\n thyIcon=\"more-vertical\"\n (click)=\"openFieldMenu($event, field, fieldAction)\"\n >\n </a>\n </div>\n }\n <div class=\"grid-column-blank cursor-pointer\" #gridColumnBlank (click)=\"addField(gridColumnBlank)\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n<div class=\"grid-body d-flex\">\n @for (record of gridData().records; track record._id; let index = $index) {\n <div class=\"grid-row d-flex\" [ngClass]=\"{ highlight: (record._id | isSelectRecord: aiTable.selection()) }\">\n <div class=\"grid-row-index grid-checkbox\">\n <label\n [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'checked-box' : 'unchecked-box'\"\n thyCheckbox\n thyLabelText=\"\"\n [ngModel]=\"record._id | isSelectRecord: aiTable.selection()\"\n (ngModelChange)=\"selectRecord(record._id)\"\n ></label>\n <span [ngClass]=\"(record._id | isSelectRecord: aiTable.selection()) ? 'grid-row-no-number' : 'grid-row-number'\">\n {{ index + 1 }}\n </span>\n </div>\n @for (field of gridData().fields; track field._id) {\n <!-- [ngClass]=\"{\n highlight: aiTable.selection().selectedCells.has(record._id) || aiTable.selection().selectedFields.has(field._id),\n selected: aiTable.selection().selectedCells.get(record._id)?.hasOwnProperty(field._id)\n }\" -->\n <div\n #cell\n class=\"grid-cell\"\n [attr.type]=\"[field.type]\"\n [attr.fieldId]=\"[field._id]\"\n [attr.recordId]=\"[record._id]\"\n [ngStyle]=\"{ width: field.width + 'px' }\"\n >\n @switch (field.type) {\n @case (AITableFieldType.select) {\n @let fieldValue = record.values[field._id];\n @let settings = field.settings! | selectSetting;\n @let options = settings['options'];\n @let optionStyle = settings['option_style'] || AITableSelectOptionStyle.tag;\n @let isTagStyle = optionStyle === AITableSelectOptionStyle.tag;\n\n @if (!settings['is_multiple'] && fieldValue | selectOption: options; as selectedOption) {\n @if (isTagStyle) {\n <select-option class=\"mb-1 mr-1\" [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"selectedOption\"></select-option>\n </div>\n }\n } @else {\n @let maxShowCount = 2;\n\n <div class=\"d-flex\">\n @if (fieldValue | selectOptions: options; as selectedOptions) {\n @for (option of selectedOptions; track option!._id; let i = $index) {\n @if (i + 1 <= maxShowCount) {\n @if (isTagStyle) {\n <select-option\n class=\"mb-1 mr-1\"\n [field]=\"field\"\n [displayOption]=\"option!\"\n ></select-option>\n } @else {\n <div thyTag class=\"mb-1 mr-1\">\n <select-option [field]=\"field\" [displayOption]=\"option!\"></select-option>\n </div>\n }\n }\n }\n\n @let selectedLength = selectedOptions.length || 0;\n @if (selectedOptions && maxShowCount < selectedLength) {\n @let shape = isTagStyle ? 'pill' : 'rectangle';\n @let isHidden = maxShowCount >= selectedLength;\n\n <thy-tag\n class=\"cursor-pointer\"\n [class.multi-property-value-hidden]=\"isHidden\"\n [thyShape]=\"shape\"\n >\n <span class=\"text-truncate\"> +{{ selectedLength - maxShowCount }} </span>\n </thy-tag>\n }\n }\n </div>\n }\n }\n @case (AITableFieldType.date) {\n {{ record.values[field._id].timestamp | thyDatePickerFormat }}\n }\n @case (AITableFieldType.updatedAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.createdAt) {\n <div class=\"d-block user-select-none\">\n <span class=\"text-truncate\">\n {{ record.values[field._id] | thyDatePickerFormat: 'yyyy-MM-dd HH:mm' }}\n </span>\n </div>\n }\n @case (AITableFieldType.rate) {\n <thy-rate [ngModel]=\"record.values[field._id]\"></thy-rate>\n }\n @case (AITableFieldType.link) {\n <a\n class=\"d-block\"\n target=\"_blank\"\n [href]=\"record.values[field._id]?.url\"\n thyStopPropagation\n thyFlexibleText\n [thyTooltipContent]=\"record.values[field._id]?.text\"\n >\n {{ record.values[field._id]?.text }}\n </a>\n }\n @case (AITableFieldType.progress) {\n <thy-progress\n class=\"w-100\"\n [thyValue]=\"record.values[field._id] || 0\"\n [thySize]=\"record.values[field._id]?.config?.size || 'md'\"\n [thyMax]=\"record.values[field._id]?.config?.max || 100\"\n [thyType]=\"record.values[field._id]?.config?.progressType || 'success'\"\n >\n <span> {{ record.values[field._id] || 0 }}{{ record.values[field._id]?.config?.suffix || '%' }} </span>\n </thy-progress>\n }\n @case (AITableFieldType.member) {\n @let settings = field.settings! | memberSetting;\n\n @if (!settings!['is_multiple']) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n } @else {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n <thy-avatar-list thyAvatarSize=\"xs\">\n @for (item of recordValues; track $index) {\n <thy-avatar [thyName]=\"item.display_name!\" [thySrc]=\"item.avatar!\"></thy-avatar>\n }\n </thy-avatar-list>\n }\n }\n @case (AITableFieldType.createdBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @case (AITableFieldType.updatedBy) {\n @let recordValues = record.values[field._id] | user: aiReferences()!;\n\n @if (recordValues && recordValues.length) {\n <thy-avatar\n [thyName]=\"recordValues[0].display_name!\"\n [thySrc]=\"recordValues[0].avatar!\"\n thySize=\"xs\"\n thyShowName=\"true\"\n ></thy-avatar>\n }\n }\n @default {\n <span class=\"text-truncate\"> {{ record.values[field._id] }}</span>\n }\n }\n <div class=\"autofill-container\"></div>\n </div>\n }\n <div class=\"grid-column-blank\"></div>\n </div>\n }\n <div class=\"grid-row-insert grid-row cursor-pointer\" (click)=\"addRecord()\">\n <thy-icon thyIconName=\"plus\"></thy-icon>\n </div>\n</div>\n\n<div #activeBorder class=\"active-border\"></div>\n" }]
2979
3347
  }] });
2980
3348
 
2981
3349
  const KO_CONTAINER_TOKEN = new InjectionToken('KO_CONTAINER_TOKEN');
@@ -5390,28 +5758,9 @@ const createCells = (config) => {
5390
5758
  break;
5391
5759
  }
5392
5760
  case AITableRowType.record: {
5393
- let background = colors.white;
5394
5761
  const fieldId = field._id;
5395
- const isCheckedRow = aiTable.selection().selectedRecords.has(row._id);
5396
- const isSelected = aiTable.selection().selectedFields.has(fieldId);
5397
- const isHoverRow = isHover && targetName !== AI_TABLE_FIELD_HEAD;
5398
- const activeCell = AITable.getActiveCell(aiTable);
5399
- const isSiblingActiveCell = recordId === activeCell?.recordId && fieldId !== activeCell?.fieldId;
5400
- const isActiveCell = recordId === activeCell?.recordId;
5401
- let matchedCellsMap = {};
5402
- aiTable.matchedCells().forEach((key) => {
5403
- matchedCellsMap[key] = true;
5404
- });
5405
- const isMatchedCell = matchedCellsMap[`${recordId}-${fieldId}`];
5406
- if (isMatchedCell) {
5407
- background = colors.itemMatchBgColor;
5408
- }
5409
- else if (isCheckedRow || isSelected || isSiblingActiveCell) {
5410
- background = colors.itemActiveBgColor;
5411
- }
5412
- else if (isHoverRow && !isActiveCell) {
5413
- background = colors.gray80;
5414
- }
5762
+ const cell = [recordId, fieldId];
5763
+ let background = getCellBackground(cell, isHover, targetName, aiTable);
5415
5764
  recordRowLayout.init({
5416
5765
  x,
5417
5766
  y,
@@ -5425,8 +5774,8 @@ const createCells = (config) => {
5425
5774
  recordRowLayout.render({
5426
5775
  row,
5427
5776
  style: { fill: background },
5428
- isHoverRow,
5429
- isCheckedRow
5777
+ isHoverRow: isHoverRecord(isHover, targetName),
5778
+ isCheckedRow: isSelectedRecord(recordId, aiTable)
5430
5779
  });
5431
5780
  const { width, offset } = getCellHorizontalPosition({
5432
5781
  columnIndex,
@@ -5449,7 +5798,7 @@ const createCells = (config) => {
5449
5798
  cellValue,
5450
5799
  transformValue,
5451
5800
  references,
5452
- isActive: isSelected,
5801
+ isActive: isSelectedField(fieldId, aiTable),
5453
5802
  style,
5454
5803
  colors
5455
5804
  };
@@ -5471,6 +5820,81 @@ const createCells = (config) => {
5471
5820
  }
5472
5821
  }
5473
5822
  };
5823
+ const getCellBackground = (cell, isHover, targetName, aiTable) => {
5824
+ const colors = AITable.getColors();
5825
+ const [recordId, fieldId] = cell;
5826
+ let background = colors.white;
5827
+ const _isSelectedRecord = isSelectedRecord(recordId, aiTable);
5828
+ const _isSelectedField = isSelectedField(fieldId, aiTable);
5829
+ const _isSiblingActiveCell = isSiblingActiveCell(cell, aiTable);
5830
+ const _isActiveCell = isActiveCell(cell, aiTable);
5831
+ const _isSelectedCell = isSelectedCell(cell, aiTable);
5832
+ const _isMatchedCell = isMatchedCell(cell, aiTable);
5833
+ const _isHoverRecord = isHoverRecord(isHover, targetName);
5834
+ if (_isMatchedCell) {
5835
+ background = colors.itemMatchBgColor;
5836
+ }
5837
+ else if (_isSelectedRecord || _isSelectedField || _isSiblingActiveCell || (_isSelectedCell && !_isActiveCell)) {
5838
+ background = colors.itemActiveBgColor;
5839
+ }
5840
+ else if (_isHoverRecord && !_isActiveCell) {
5841
+ background = colors.gray80;
5842
+ }
5843
+ return background;
5844
+ };
5845
+ const isActiveCell = (cell, aiTable) => {
5846
+ let isActive = false;
5847
+ const activeCell = AITable.getActiveCell(aiTable);
5848
+ if (Array.isArray(activeCell) && !!activeCell.length) {
5849
+ const [activeCellRecordId, activeCellFieldId] = activeCell;
5850
+ const [recordId, fieldId] = cell;
5851
+ if (recordId === activeCellRecordId && fieldId === activeCellFieldId) {
5852
+ isActive = true;
5853
+ }
5854
+ }
5855
+ return isActive;
5856
+ };
5857
+ const isSiblingActiveCell = (cell, aiTable) => {
5858
+ let isSiblingCell = false;
5859
+ const activeCell = AITable.getActiveCell(aiTable);
5860
+ if (Array.isArray(activeCell) && !!activeCell.length) {
5861
+ const [recordId, fieldId] = cell;
5862
+ const [activeCellRecordId, activeCellFieldId] = activeCell;
5863
+ const selectedCells = aiTable.selection().selectedCells;
5864
+ isSiblingCell =
5865
+ selectedCells.size === 1 &&
5866
+ selectedCells.has(`${activeCellRecordId}:${activeCellFieldId}`) &&
5867
+ recordId === activeCellRecordId &&
5868
+ fieldId !== activeCellFieldId;
5869
+ }
5870
+ return isSiblingCell;
5871
+ };
5872
+ const isMatchedCell = (cell, aiTable) => {
5873
+ const [recordId, fieldId] = cell;
5874
+ let matchedCellsMap = {};
5875
+ aiTable.matchedCells().forEach((key) => {
5876
+ matchedCellsMap[key] = true;
5877
+ });
5878
+ const isMatchedCell = matchedCellsMap[`${recordId}:${fieldId}`];
5879
+ return isMatchedCell;
5880
+ };
5881
+ const isSelectedCell = (cell, aiTable) => {
5882
+ const [recordId, fieldId] = cell;
5883
+ const selectedCells = aiTable.selection().selectedCells;
5884
+ const isSelectedCell = selectedCells.has(`${recordId}:${fieldId}`);
5885
+ return isSelectedCell;
5886
+ };
5887
+ const isSelectedField = (fieldId, aiTable) => {
5888
+ const selectedFields = aiTable.selection().selectedFields;
5889
+ return selectedFields.has(fieldId);
5890
+ };
5891
+ const isSelectedRecord = (recordId, aiTable) => {
5892
+ const selectedRecords = aiTable.selection().selectedRecords;
5893
+ return selectedRecords.has(recordId);
5894
+ };
5895
+ const isHoverRecord = (isHover, targetName) => {
5896
+ return isHover && targetName !== AI_TABLE_FIELD_HEAD;
5897
+ };
5474
5898
 
5475
5899
  class AITableCells {
5476
5900
  constructor() {
@@ -6182,8 +6606,11 @@ const createActiveCellBorder = (config) => {
6182
6606
  const totalColumnCount = visibleColumns.length;
6183
6607
  let activeCellBorder = null;
6184
6608
  let frozenActiveCellBorder = null;
6185
- if (activeCell != null) {
6186
- const { fieldId } = activeCell;
6609
+ if (Array.isArray(activeCell) &&
6610
+ !!activeCell.length &&
6611
+ aiTable.context.visibleRowsIndexMap().has(activeCell[0]) &&
6612
+ aiTable.context.visibleColumnsMap().has(activeCell[1])) {
6613
+ const fieldId = activeCell[1];
6187
6614
  const { rowIndex, columnIndex } = AITable.getCellIndex(aiTable, activeCell);
6188
6615
  const checkIsVisible = (rowIndex, columnIndex) => {
6189
6616
  if (columnIndex < frozenColumnCount) {
@@ -6242,6 +6669,7 @@ class AITableRenderer {
6242
6669
  this.config = input.required();
6243
6670
  this.koMousemove = output();
6244
6671
  this.koMousedown = output();
6672
+ this.koMouseup = output();
6245
6673
  this.koContextmenu = output();
6246
6674
  this.koWheel = output();
6247
6675
  this.koClick = output();
@@ -6376,6 +6804,9 @@ class AITableRenderer {
6376
6804
  stageMousedown(e) {
6377
6805
  this.koMousedown.emit(e);
6378
6806
  }
6807
+ stageMouseup(e) {
6808
+ this.koMouseup.emit(e);
6809
+ }
6379
6810
  stageContextmenu(e) {
6380
6811
  this.koContextmenu.emit(e);
6381
6812
  }
@@ -6386,7 +6817,7 @@ class AITableRenderer {
6386
6817
  this.koDblclick.emit(e);
6387
6818
  }
6388
6819
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6389
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableRenderer, isStandalone: true, selector: "ai-table-renderer", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { koMousemove: "koMousemove", koMousedown: "koMousedown", koContextmenu: "koContextmenu", koWheel: "koWheel", koClick: "koClick", koDblclick: "koDblclick" }, ngImport: i0, template: "<ko-stage\n [config]=\"stageConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n>\n <ko-layer>\n <ko-group [config]=\"gridGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n <ai-table-frozen-cells [config]=\"cellsConfig()\"></ai-table-frozen-cells>\n <ai-table-other-rows [config]=\"cellsConfig()\"></ai-table-other-rows>\n <ai-table-hover-row-heads [config]=\"cellsConfig()\"></ai-table-hover-row-heads>\n <ai-table-frozen-placeholder-cells [config]=\"cellsConfig()\"></ai-table-frozen-placeholder-cells>\n </ko-group>\n\n <ko-group>\n <ai-table-frozen-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-frozen-column-heads>\n </ko-group>\n\n <ko-group [config]=\"commonGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-cells [config]=\"cellsConfig()\"></ai-table-cells>\n </ko-group>\n\n <ko-group [config]=\"offsetXConfig()\">\n <ai-table-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-column-heads>\n <ai-table-add-field [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-add-field>\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"attachGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-placeholder-cells [config]=\"cellsConfig()\"></ai-table-placeholder-cells>\n @if (activeCellBorderConfig().activeCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().activeCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"frozenAttachGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n @if (activeCellBorderConfig().frozenActiveCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().frozenActiveCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n </ko-group>\n </ko-layer>\n</ko-stage>\n\n<ng-content></ng-content>\n", dependencies: [{ kind: "component", type: KoContainer, selector: "ko-layer, ko-fastlayer, ko-group" }, { kind: "component", type: KoStage, selector: "ko-stage", inputs: ["config"], outputs: ["koMouseover", "koMousemove", "koMouseout", "koMouseenter", "koMouseleave", "koMousedown", "koMouseup", "koWheel", "koContextmenu", "koClick", "koDblclick", "koTouchstart", "koTouchmove", "koTouchend", "koTap", "koDbltap", "koDragstart", "koDragmove", "koDragend"] }, { kind: "component", type: KoShape, selector: "ko-shape, ko-circle, ko-label, ko-rect, ko-ellipse, ko-wedge, ko-line, ko-sprite, ko-image, ko-text, ko-text-path, ko-star, ko-ring, ko-arc, ko-tag, ko-path, ko-regular-polygon, ko-arrow, ko-transformer", inputs: ["config"], outputs: ["koMouseover", "koMousemove", "koMouseout", "koMouseenter", "koMouseleave", "koMousedown", "koMouseup", "koWheel", "koContextmenu", "koClick", "koDblclick", "koTouchstart", "koTouchmove", "koTouchend", "koTap", "koDbltap", "koDragstart", "koDragmove", "koDragend"] }, { kind: "component", type: AITableColumnHeads, selector: "ai-table-column-heads", inputs: ["config"] }, { kind: "component", type: AITableFrozenColumnHeads, selector: "ai-table-frozen-column-heads", inputs: ["config"] }, { kind: "component", type: AITableCells, selector: "ai-table-cells", inputs: ["config"] }, { kind: "component", type: AITableFrozenCells, selector: "ai-table-frozen-cells", inputs: ["config"] }, { kind: "component", type: AITableFrozenPlaceholderCells, selector: "ai-table-frozen-placeholder-cells", inputs: ["config"] }, { kind: "component", type: AITablePlaceholderCells, selector: "ai-table-placeholder-cells", inputs: ["config"] }, { kind: "component", type: AITableAddField, selector: "ai-table-add-field", inputs: ["config"] }, { kind: "component", type: AITableHoverRowHeads, selector: "ai-table-hover-row-heads", inputs: ["config"] }, { kind: "component", type: AITableOtherRows, selector: "ai-table-other-rows", inputs: ["config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6820
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableRenderer, isStandalone: true, selector: "ai-table-renderer", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { koMousemove: "koMousemove", koMousedown: "koMousedown", koMouseup: "koMouseup", koContextmenu: "koContextmenu", koWheel: "koWheel", koClick: "koClick", koDblclick: "koDblclick" }, ngImport: i0, template: "<ko-stage\n [config]=\"stageConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n>\n <ko-layer>\n <ko-group [config]=\"gridGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n <ai-table-frozen-cells [config]=\"cellsConfig()\"></ai-table-frozen-cells>\n <ai-table-other-rows [config]=\"cellsConfig()\"></ai-table-other-rows>\n <ai-table-hover-row-heads [config]=\"cellsConfig()\"></ai-table-hover-row-heads>\n <ai-table-frozen-placeholder-cells [config]=\"cellsConfig()\"></ai-table-frozen-placeholder-cells>\n </ko-group>\n\n <ko-group>\n <ai-table-frozen-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-frozen-column-heads>\n </ko-group>\n\n <ko-group [config]=\"commonGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-cells [config]=\"cellsConfig()\"></ai-table-cells>\n </ko-group>\n\n <ko-group [config]=\"offsetXConfig()\">\n <ai-table-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-column-heads>\n <ai-table-add-field [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-add-field>\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"attachGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-placeholder-cells [config]=\"cellsConfig()\"></ai-table-placeholder-cells>\n @if (activeCellBorderConfig().activeCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().activeCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"frozenAttachGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n @if (activeCellBorderConfig().frozenActiveCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().frozenActiveCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n </ko-group>\n </ko-layer>\n</ko-stage>\n\n<ng-content></ng-content>\n", dependencies: [{ kind: "component", type: KoContainer, selector: "ko-layer, ko-fastlayer, ko-group" }, { kind: "component", type: KoStage, selector: "ko-stage", inputs: ["config"], outputs: ["koMouseover", "koMousemove", "koMouseout", "koMouseenter", "koMouseleave", "koMousedown", "koMouseup", "koWheel", "koContextmenu", "koClick", "koDblclick", "koTouchstart", "koTouchmove", "koTouchend", "koTap", "koDbltap", "koDragstart", "koDragmove", "koDragend"] }, { kind: "component", type: KoShape, selector: "ko-shape, ko-circle, ko-label, ko-rect, ko-ellipse, ko-wedge, ko-line, ko-sprite, ko-image, ko-text, ko-text-path, ko-star, ko-ring, ko-arc, ko-tag, ko-path, ko-regular-polygon, ko-arrow, ko-transformer", inputs: ["config"], outputs: ["koMouseover", "koMousemove", "koMouseout", "koMouseenter", "koMouseleave", "koMousedown", "koMouseup", "koWheel", "koContextmenu", "koClick", "koDblclick", "koTouchstart", "koTouchmove", "koTouchend", "koTap", "koDbltap", "koDragstart", "koDragmove", "koDragend"] }, { kind: "component", type: AITableColumnHeads, selector: "ai-table-column-heads", inputs: ["config"] }, { kind: "component", type: AITableFrozenColumnHeads, selector: "ai-table-frozen-column-heads", inputs: ["config"] }, { kind: "component", type: AITableCells, selector: "ai-table-cells", inputs: ["config"] }, { kind: "component", type: AITableFrozenCells, selector: "ai-table-frozen-cells", inputs: ["config"] }, { kind: "component", type: AITableFrozenPlaceholderCells, selector: "ai-table-frozen-placeholder-cells", inputs: ["config"] }, { kind: "component", type: AITablePlaceholderCells, selector: "ai-table-placeholder-cells", inputs: ["config"] }, { kind: "component", type: AITableAddField, selector: "ai-table-add-field", inputs: ["config"] }, { kind: "component", type: AITableHoverRowHeads, selector: "ai-table-hover-row-heads", inputs: ["config"] }, { kind: "component", type: AITableOtherRows, selector: "ai-table-other-rows", inputs: ["config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6390
6821
  }
6391
6822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableRenderer, decorators: [{
6392
6823
  type: Component,
@@ -6403,13 +6834,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
6403
6834
  AITableAddField,
6404
6835
  AITableHoverRowHeads,
6405
6836
  AITableOtherRows
6406
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ko-stage\n [config]=\"stageConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n>\n <ko-layer>\n <ko-group [config]=\"gridGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n <ai-table-frozen-cells [config]=\"cellsConfig()\"></ai-table-frozen-cells>\n <ai-table-other-rows [config]=\"cellsConfig()\"></ai-table-other-rows>\n <ai-table-hover-row-heads [config]=\"cellsConfig()\"></ai-table-hover-row-heads>\n <ai-table-frozen-placeholder-cells [config]=\"cellsConfig()\"></ai-table-frozen-placeholder-cells>\n </ko-group>\n\n <ko-group>\n <ai-table-frozen-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-frozen-column-heads>\n </ko-group>\n\n <ko-group [config]=\"commonGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-cells [config]=\"cellsConfig()\"></ai-table-cells>\n </ko-group>\n\n <ko-group [config]=\"offsetXConfig()\">\n <ai-table-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-column-heads>\n <ai-table-add-field [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-add-field>\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"attachGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-placeholder-cells [config]=\"cellsConfig()\"></ai-table-placeholder-cells>\n @if (activeCellBorderConfig().activeCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().activeCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"frozenAttachGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n @if (activeCellBorderConfig().frozenActiveCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().frozenActiveCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n </ko-group>\n </ko-layer>\n</ko-stage>\n\n<ng-content></ng-content>\n" }]
6837
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ko-stage\n [config]=\"stageConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n>\n <ko-layer>\n <ko-group [config]=\"gridGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n <ai-table-frozen-cells [config]=\"cellsConfig()\"></ai-table-frozen-cells>\n <ai-table-other-rows [config]=\"cellsConfig()\"></ai-table-other-rows>\n <ai-table-hover-row-heads [config]=\"cellsConfig()\"></ai-table-hover-row-heads>\n <ai-table-frozen-placeholder-cells [config]=\"cellsConfig()\"></ai-table-frozen-placeholder-cells>\n </ko-group>\n\n <ko-group>\n <ai-table-frozen-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-frozen-column-heads>\n </ko-group>\n\n <ko-group [config]=\"commonGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-cells [config]=\"cellsConfig()\"></ai-table-cells>\n </ko-group>\n\n <ko-group [config]=\"offsetXConfig()\">\n <ai-table-column-heads [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-column-heads>\n <ai-table-add-field [config]=\"columnHeadOrAddFieldConfig()\"></ai-table-add-field>\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"attachGroupConfig()\">\n <ko-group [config]=\"offsetConfig()\">\n <ai-table-placeholder-cells [config]=\"cellsConfig()\"></ai-table-placeholder-cells>\n @if (activeCellBorderConfig().activeCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().activeCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n\n <ko-group [config]=\"frozenAttachGroupConfig()\">\n <ko-group [config]=\"offsetYConfig()\">\n @if (activeCellBorderConfig().frozenActiveCellBorder) {\n <ko-rect [config]=\"activeCellBorderConfig().frozenActiveCellBorder!\"></ko-rect>\n }\n </ko-group>\n </ko-group>\n </ko-group>\n </ko-layer>\n</ko-stage>\n\n<ng-content></ng-content>\n" }]
6407
6838
  }] });
6408
6839
 
6409
6840
  class AITableGrid extends AITableGridBase {
6410
6841
  constructor() {
6411
6842
  super();
6412
6843
  this.viewContainerRef = inject(ViewContainerRef);
6844
+ this.isSelecting = false;
6845
+ this.selectionStart = null;
6413
6846
  this.fieldHeadHeight = AI_TABLE_FIELD_HEAD_HEIGHT;
6414
6847
  this.containerRect = signal({ width: 0, height: 0 });
6415
6848
  this.hasContainerRect = computed(() => {
@@ -6549,6 +6982,16 @@ class AITableGrid extends AITableGridBase {
6549
6982
  handleMouseStyle(curMousePosition.realTargetName, curMousePosition.areaType, this.containerElement());
6550
6983
  context.setPointPosition(curMousePosition);
6551
6984
  this.timer = null;
6985
+ if (this.isSelecting) {
6986
+ const { fieldId, recordId } = getDetailByTargetName(curMousePosition.realTargetName);
6987
+ if (fieldId && recordId) {
6988
+ const startCell = this.selectionStart;
6989
+ const endCell = [recordId, fieldId];
6990
+ if (startCell && !!startCell.length) {
6991
+ this.aiTableGridSelectionService.selectCells(startCell, endCell);
6992
+ }
6993
+ }
6994
+ }
6552
6995
  });
6553
6996
  }
6554
6997
  stageMousedown(e) {
@@ -6558,7 +7001,7 @@ class AITableGrid extends AITableGridBase {
6558
7001
  if (mouseEvent.button === AITableMouseDownType.Right &&
6559
7002
  recordId &&
6560
7003
  fieldId &&
6561
- this.aiTable.selection().selectedRecords.has(recordId)) {
7004
+ (this.aiTable.selection().selectedRecords.has(recordId) || this.aiTable.selection().selectedCells.has(`${recordId}:${fieldId}`))) {
6562
7005
  return;
6563
7006
  }
6564
7007
  switch (targetName) {
@@ -6572,7 +7015,9 @@ class AITableGrid extends AITableGridBase {
6572
7015
  if (!recordId || !fieldId)
6573
7016
  return;
6574
7017
  this.aiTableGridEventService.closeCellEditor();
6575
- this.aiTableGridSelectionService.selectCell(recordId, fieldId);
7018
+ const selectionStart = [recordId, fieldId];
7019
+ this.dragSelectionState(true, selectionStart);
7020
+ this.aiTableGridSelectionService.selectCells(selectionStart);
6576
7021
  return;
6577
7022
  case AI_TABLE_ROW_ADD_BUTTON:
6578
7023
  case AI_TABLE_FIELD_ADD_BUTTON:
@@ -6583,6 +7028,9 @@ class AITableGrid extends AITableGridBase {
6583
7028
  this.aiTableGridSelectionService.clearSelection();
6584
7029
  }
6585
7030
  }
7031
+ stageMouseup(e) {
7032
+ this.dragSelectionState(false, null);
7033
+ }
6586
7034
  stageContextmenu(e) {
6587
7035
  const mouseEvent = e.event.evt;
6588
7036
  mouseEvent.preventDefault();
@@ -6724,11 +7172,17 @@ class AITableGrid extends AITableGridBase {
6724
7172
  fromEvent(document, 'mousedown', { passive: true })
6725
7173
  .pipe(filter((e) => e.target instanceof Element &&
6726
7174
  !this.containerElement().contains(e.target) &&
6727
- !(e.target.closest(AI_TABLE_PROHIBIT_CLEAR_SELECTION_CLASS) && this.aiTable.selection().selectedRecords.size > 0)), takeUntilDestroyed(this.destroyRef))
7175
+ !(e.target.closest(AI_TABLE_PROHIBIT_CLEAR_SELECTION_CLASS) &&
7176
+ AITable.getSelectedRecordIds(this.aiTable).length > 0)), takeUntilDestroyed(this.destroyRef))
6728
7177
  .subscribe(() => {
7178
+ this.dragSelectionState(false, null);
6729
7179
  this.aiTableGridSelectionService.clearSelection();
6730
7180
  });
6731
7181
  }
7182
+ dragSelectionState(isSelecting, selectionStart) {
7183
+ this.isSelecting = isSelecting;
7184
+ this.selectionStart = selectionStart;
7185
+ }
6732
7186
  verticalScroll(e) {
6733
7187
  const { scrollTop } = e.target;
6734
7188
  this.aiTable.context.setScrollState({
@@ -6800,18 +7254,18 @@ class AITableGrid extends AITableGridBase {
6800
7254
  }
6801
7255
  }
6802
7256
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableGrid, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6803
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableGrid, isStandalone: true, selector: "ai-table-grid", host: { classAttribute: "ai-table-grid" }, providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService, AITableGridMatchCellService], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "verticalBarRef", first: true, predicate: ["verticalBar"], descendants: true, isSignal: true }, { propertyName: "horizontalBarRef", first: true, predicate: ["horizontalBar"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n", dependencies: [{ kind: "component", type: AITableRenderer, selector: "ai-table-renderer", inputs: ["config"], outputs: ["koMousemove", "koMousedown", "koContextmenu", "koWheel", "koClick", "koDblclick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7257
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: AITableGrid, isStandalone: true, selector: "ai-table-grid", host: { classAttribute: "ai-table-grid" }, providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService, AITableGridMatchCellService], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "verticalBarRef", first: true, predicate: ["verticalBar"], descendants: true, isSignal: true }, { propertyName: "horizontalBarRef", first: true, predicate: ["horizontalBar"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n", dependencies: [{ kind: "component", type: AITableRenderer, selector: "ai-table-renderer", inputs: ["config"], outputs: ["koMousemove", "koMousedown", "koMouseup", "koContextmenu", "koWheel", "koClick", "koDblclick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
6804
7258
  }
6805
7259
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AITableGrid, decorators: [{
6806
7260
  type: Component,
6807
7261
  args: [{ selector: 'ai-table-grid', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
6808
7262
  class: 'ai-table-grid'
6809
- }, imports: [AITableRenderer], providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService, AITableGridMatchCellService], template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n" }]
7263
+ }, imports: [AITableRenderer], providers: [AITableGridEventService, AITableGridFieldService, AITableGridSelectionService, AITableGridMatchCellService], template: "<div #container class=\"ai-table-grid-view\">\n @if (hasContainerRect()) {\n <ai-table-renderer\n [config]=\"rendererConfig()\"\n (koMousemove)=\"stageMousemove($event)\"\n (koMousedown)=\"stageMousedown($event)\"\n (koMouseup)=\"stageMouseup($event)\"\n (koContextmenu)=\"stageContextmenu($event)\"\n (koClick)=\"stageClick($event)\"\n (koDblclick)=\"stageDblclick($event)\"\n >\n <div #horizontalBar class=\"ai-table-horizontal-scroll-bar-wrapper\" [style.width.px]=\"containerRect().width\">\n <div class=\"ai-table-scroll-bar-inner\" [style.width.px]=\"scrollbarWidth()\"></div>\n </div>\n <div\n #verticalBar\n class=\"ai-table-vertical-scroll-bar-wrapper\"\n [style.height.px]=\"containerRect().height - fieldHeadHeight\"\n [style.top.px]=\"fieldHeadHeight\"\n >\n <div class=\"ai-table-scroll-bar-inner\" [style.height.px]=\"scrollTotalHeight()\"></div>\n </div>\n </ai-table-renderer>\n }\n</div>\n" }]
6810
7264
  }], ctorParameters: () => [] });
6811
7265
 
6812
7266
  /**
6813
7267
  * Generated bundle index. Do not edit.
6814
7268
  */
6815
7269
 
6816
- export { AITable, AITableAreaType, AITableAvatarSize, AITableAvatarType, AITableCheckType, AITableContextMenu, AITableDomGrid, AITableFieldIsMultiplePipe, AITableFieldPropertyEditor, AITableFieldType, AITableGrid, AITableGridEventService, AITableGridFieldService, AITableGridMatchCellService, AITableGridSelectionService, AITableMemberType, AITableMouseDownType, AITableQueries, AITableRenderer, AITableRowColumnType, AITableRowType, AITableSelectOptionStyle, AITableStatType, AI_TABLE_ACTION_COMMON_SIZE, AI_TABLE_BLANK, AI_TABLE_CELL, AI_TABLE_CELL_ACTIVE_BORDER_WIDTH, AI_TABLE_CELL_ADD_ITEM_BUTTON_SIZE, AI_TABLE_CELL_BORDER, AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE, AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE_OFFSET, AI_TABLE_CELL_EMOJI_PADDING, AI_TABLE_CELL_EMOJI_SIZE, AI_TABLE_CELL_MAX_ROW_COUNT, AI_TABLE_CELL_MEMBER_ITEM_HEIGHT, AI_TABLE_CELL_MEMBER_ITEM_PADDING, AI_TABLE_CELL_MEMBER_MAX_HEIGHT, AI_TABLE_CELL_MULTI_DOT_RADIUS, AI_TABLE_CELL_MULTI_ITEM_MARGIN_LEFT, AI_TABLE_CELL_MULTI_ITEM_MARGIN_TOP, AI_TABLE_CELL_MULTI_ITEM_MIN_WIDTH, AI_TABLE_CELL_MULTI_PADDING_LEFT, AI_TABLE_CELL_MULTI_PADDING_TOP, AI_TABLE_CELL_PADDING, AI_TABLE_COMMON_FONT_SIZE, AI_TABLE_DEFAULT_COLUMN_WIDTH, AI_TABLE_DOT_RADIUS, AI_TABLE_FIELD_ADD_BUTTON, AI_TABLE_FIELD_ADD_BUTTON_WIDTH, AI_TABLE_FIELD_HEAD, AI_TABLE_FIELD_HEAD_HEIGHT, AI_TABLE_FIELD_HEAD_ICON_GAP_SIZE, AI_TABLE_FIELD_HEAD_MORE, AI_TABLE_FIELD_HEAD_SELECT_CHECKBOX, AI_TABLE_FIELD_HEAD_TEXT_MIN_WIDTH, AI_TABLE_GRID_FIELD_SERVICE_MAP, AI_TABLE_ICON_COMMON_SIZE, AI_TABLE_MEMBER_AVATAR_SIZE, AI_TABLE_MEMBER_ITEM_AVATAR_MARGIN_RIGHT, AI_TABLE_MEMBER_ITEM_PADDING_RIGHT, AI_TABLE_MIN_TEXT_WIDTH, AI_TABLE_OFFSET, AI_TABLE_OPTION_ITEM_FONT_SIZE, AI_TABLE_OPTION_ITEM_HEIGHT, AI_TABLE_OPTION_ITEM_PADDING, AI_TABLE_OPTION_ITEM_RADIUS, AI_TABLE_PIECE_RADIUS, AI_TABLE_PIECE_WIDTH, AI_TABLE_POPOVER_LEFT_OFFSET, AI_TABLE_PROGRESS_BAR_HEIGHT, AI_TABLE_PROGRESS_BAR_RADIUS, AI_TABLE_PROGRESS_TEXT_Width, AI_TABLE_PROHIBIT_CLEAR_SELECTION_CLASS, AI_TABLE_ROW_ADD_BUTTON, AI_TABLE_ROW_BLANK_HEIGHT, AI_TABLE_ROW_HEAD, AI_TABLE_ROW_HEAD_SIZE, AI_TABLE_ROW_HEAD_WIDTH, AI_TABLE_ROW_HEIGHT, AI_TABLE_ROW_SELECT_CHECKBOX, AI_TABLE_SCROLL_BAR_PADDING, AI_TABLE_TAG_FONT_SIZE, AI_TABLE_TAG_PADDING, AI_TABLE_TEXT_GAP, AbstractEditCellEditor, AddOutlinedPath, Check, Colors, ColumnCalendarFilledPath, ColumnLinkOutlinedPath, ColumnMemberFilledPath, ColumnMultipleFillPath, ColumnNumberFilledPath, ColumnProgressFilledPath, ColumnRatingFilledPath, ColumnSelectFilledPath, ColumnTextFilledPath, Coordinate, DBL_CLICK_EDIT_TYPE, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_FONT_STYLE, DEFAULT_FONT_WEIGHT, DEFAULT_ICON_SHAPE, DEFAULT_ICON_SIZE, DEFAULT_POINT_POSITION, DEFAULT_SCROLL_STATE, DEFAULT_TEXT_ALIGN_CENTER, DEFAULT_TEXT_ALIGN_LEFT, DEFAULT_TEXT_ALIGN_RIGHT, DEFAULT_TEXT_DECORATION, DEFAULT_TEXT_ELLIPSIS, DEFAULT_TEXT_FILL, DEFAULT_TEXT_LINE_HEIGHT, DEFAULT_TEXT_LISTENING, DEFAULT_TEXT_MAX_CACHE, DEFAULT_TEXT_MAX_HEIGHT, DEFAULT_TEXT_SCALE, DEFAULT_TEXT_TRANSFORMS_ENABLED, DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE, DEFAULT_TEXT_VERTICAL_ALIGN_TOP, DEFAULT_TEXT_WRAP, DEFAULT_WRAP_TEXT_MAX_ROW, DateCellEditorComponent, DepartmentOutlinedPath, Direction, FONT_SIZE_SM, FieldOptions, GRID_CELL_EDITOR_MAP, IsSelectRecordPipe, LinkCellEditorComponent, MIN_COLUMN_WIDTH, MOUSEOVER_EDIT_TYPE, MemberSettingPipe, MoreStandOutlinedPath, NumberCellEditorComponent, ProgressEditorComponent, RatingCellEditorComponent, RendererContext, RowHeight, SelectCellEditorComponent, SelectOptionComponent, SelectOptionPipe, SelectOptionsPipe, SelectSettingPipe, StarFill, TextCellEditorComponent, TextMeasure, Unchecked, UserPipe, ViewOperationMap, WebOutlinedPath, buildGridData, buildGridLinearRows, castToString, createAITable, createActiveCellBorder, createCells, createDefaultField, createDefaultFieldName, generateTargetName, getAvatarBgColor, getAvatarShortName, getCellEditorBorderSpace, getCellHorizontalPosition, getColumnIndicesMap, getDefaultFieldValue, getDetailByTargetName, getEditorBoxOffset, getEditorSpace, getFieldOptionByField, getHoverEditorBoxOffset, getHoverEditorSpace, getMousePosition, getPlaceHolderCellsConfigs, getTargetName, getTextWidth, getVisibleRangeInfo, handleMouseStyle, idCreator, idsCreator, imageCache, isArrayField, isEmpty, isMac, isNumberFiled, isSameFieldOption, isSystemField, isWindows, isWindowsOS, isWithinFrozenColumnBoundary, scrollMax, setMouseStyle, shortIdCreator, shortIdsCreator, textDataCache, transformCellValue };
7270
+ export { AITable, AITableAreaType, AITableAvatarSize, AITableAvatarType, AITableCheckType, AITableContextMenu, AITableDomGrid, AITableFieldIsMultiplePipe, AITableFieldPropertyEditor, AITableFieldType, AITableFilterOperation, AITableGrid, AITableGridEventService, AITableGridFieldService, AITableGridMatchCellService, AITableGridSelectionService, AITableMemberType, AITableMouseDownType, AITableQueries, AITableRenderer, AITableRowColumnType, AITableRowType, AITableSelectOptionStyle, AITableStatType, AI_TABLE_ACTION_COMMON_SIZE, AI_TABLE_BLANK, AI_TABLE_CELL, AI_TABLE_CELL_ACTIVE_BORDER_WIDTH, AI_TABLE_CELL_ADD_ITEM_BUTTON_SIZE, AI_TABLE_CELL_BORDER, AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE, AI_TABLE_CELL_DELETE_ITEM_BUTTON_SIZE_OFFSET, AI_TABLE_CELL_EMOJI_PADDING, AI_TABLE_CELL_EMOJI_SIZE, AI_TABLE_CELL_MAX_ROW_COUNT, AI_TABLE_CELL_MEMBER_ITEM_HEIGHT, AI_TABLE_CELL_MEMBER_ITEM_PADDING, AI_TABLE_CELL_MEMBER_MAX_HEIGHT, AI_TABLE_CELL_MULTI_DOT_RADIUS, AI_TABLE_CELL_MULTI_ITEM_MARGIN_LEFT, AI_TABLE_CELL_MULTI_ITEM_MARGIN_TOP, AI_TABLE_CELL_MULTI_ITEM_MIN_WIDTH, AI_TABLE_CELL_MULTI_PADDING_LEFT, AI_TABLE_CELL_MULTI_PADDING_TOP, AI_TABLE_CELL_PADDING, AI_TABLE_COMMON_FONT_SIZE, AI_TABLE_DEFAULT_COLUMN_WIDTH, AI_TABLE_DOT_RADIUS, AI_TABLE_FIELD_ADD_BUTTON, AI_TABLE_FIELD_ADD_BUTTON_WIDTH, AI_TABLE_FIELD_HEAD, AI_TABLE_FIELD_HEAD_HEIGHT, AI_TABLE_FIELD_HEAD_ICON_GAP_SIZE, AI_TABLE_FIELD_HEAD_MORE, AI_TABLE_FIELD_HEAD_SELECT_CHECKBOX, AI_TABLE_FIELD_HEAD_TEXT_MIN_WIDTH, AI_TABLE_GRID_FIELD_SERVICE_MAP, AI_TABLE_ICON_COMMON_SIZE, AI_TABLE_MEMBER_AVATAR_SIZE, AI_TABLE_MEMBER_ITEM_AVATAR_MARGIN_RIGHT, AI_TABLE_MEMBER_ITEM_PADDING_RIGHT, AI_TABLE_MIN_TEXT_WIDTH, AI_TABLE_OFFSET, AI_TABLE_OPTION_ITEM_FONT_SIZE, AI_TABLE_OPTION_ITEM_HEIGHT, AI_TABLE_OPTION_ITEM_PADDING, AI_TABLE_OPTION_ITEM_RADIUS, AI_TABLE_PIECE_RADIUS, AI_TABLE_PIECE_WIDTH, AI_TABLE_POPOVER_LEFT_OFFSET, AI_TABLE_PROGRESS_BAR_HEIGHT, AI_TABLE_PROGRESS_BAR_RADIUS, AI_TABLE_PROGRESS_TEXT_Width, AI_TABLE_PROHIBIT_CLEAR_SELECTION_CLASS, AI_TABLE_ROW_ADD_BUTTON, AI_TABLE_ROW_BLANK_HEIGHT, AI_TABLE_ROW_HEAD, AI_TABLE_ROW_HEAD_SIZE, AI_TABLE_ROW_HEAD_WIDTH, AI_TABLE_ROW_HEIGHT, AI_TABLE_ROW_SELECT_CHECKBOX, AI_TABLE_SCROLL_BAR_PADDING, AI_TABLE_TAG_FONT_SIZE, AI_TABLE_TAG_PADDING, AI_TABLE_TEXT_GAP, AbstractEditCellEditor, AddOutlinedPath, Check, Colors, ColumnCalendarFilledPath, ColumnLinkOutlinedPath, ColumnMemberFilledPath, ColumnMultipleFillPath, ColumnNumberFilledPath, ColumnProgressFilledPath, ColumnRatingFilledPath, ColumnSelectFilledPath, ColumnTextFilledPath, Coordinate, DBL_CLICK_EDIT_TYPE, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, DEFAULT_FONT_STYLE, DEFAULT_FONT_WEIGHT, DEFAULT_ICON_SHAPE, DEFAULT_ICON_SIZE, DEFAULT_POINT_POSITION, DEFAULT_SCROLL_STATE, DEFAULT_TEXT_ALIGN_CENTER, DEFAULT_TEXT_ALIGN_LEFT, DEFAULT_TEXT_ALIGN_RIGHT, DEFAULT_TEXT_DECORATION, DEFAULT_TEXT_ELLIPSIS, DEFAULT_TEXT_FILL, DEFAULT_TEXT_LINE_HEIGHT, DEFAULT_TEXT_LISTENING, DEFAULT_TEXT_MAX_CACHE, DEFAULT_TEXT_MAX_HEIGHT, DEFAULT_TEXT_SCALE, DEFAULT_TEXT_TRANSFORMS_ENABLED, DEFAULT_TEXT_VERTICAL_ALIGN_MIDDLE, DEFAULT_TEXT_VERTICAL_ALIGN_TOP, DEFAULT_TEXT_WRAP, DEFAULT_WRAP_TEXT_MAX_ROW, DateCellEditorComponent, DepartmentOutlinedPath, Direction, FONT_SIZE_SM, FieldOptions, GRID_CELL_EDITOR_MAP, IsSelectRecordPipe, LinkCellEditorComponent, MIN_COLUMN_WIDTH, MOUSEOVER_EDIT_TYPE, MemberSettingPipe, MoreStandOutlinedPath, NumberCellEditorComponent, ProgressEditorComponent, RatingCellEditorComponent, RendererContext, RowHeight, SelectCellEditorComponent, SelectOptionComponent, SelectOptionPipe, SelectOptionsPipe, SelectSettingPipe, StarFill, TextCellEditorComponent, TextMeasure, Unchecked, UserPipe, ViewOperationMap, WebOutlinedPath, buildGridData, buildGridLinearRows, castToString, compareNumber, compareString, createAITable, createActiveCellBorder, createCells, createDefaultField, createDefaultFieldName, generateTargetName, getAvatarBgColor, getAvatarShortName, getCellEditorBorderSpace, getCellHorizontalPosition, getColumnIndicesMap, getDefaultFieldValue, getDetailByTargetName, getEditorBoxOffset, getEditorSpace, getFieldOptionByField, getHoverEditorBoxOffset, getHoverEditorSpace, getMousePosition, getPlaceHolderCellsConfigs, getTargetName, getTextWidth, getVisibleRangeInfo, handleMouseStyle, hasIntersect, idCreator, idsCreator, imageCache, isArrayField, isEmpty, isMac, isNumberFiled, isSameFieldOption, isSystemField, isWindows, isWindowsOS, isWithinFrozenColumnBoundary, scrollMax, setMouseStyle, shortIdCreator, shortIdsCreator, stringInclude, textDataCache, transformCellValue, zhIntlCollator };
6817
7271
  //# sourceMappingURL=ai-table-grid.mjs.map