@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.
- package/components/context-menu/context-menu.component.d.ts.map +1 -1
- package/core/types/ai-table.d.ts +6 -14
- package/core/types/ai-table.d.ts.map +1 -1
- package/core/types/core.d.ts +1 -0
- package/core/types/core.d.ts.map +1 -1
- package/core/utils/common.d.ts.map +1 -1
- package/esm2022/components/context-menu/context-menu.component.mjs +3 -10
- package/esm2022/core/types/ai-table.mjs +25 -16
- package/esm2022/core/types/core.mjs +1 -1
- package/esm2022/core/utils/common.mjs +5 -4
- package/esm2022/dom-grid.component.mjs +3 -3
- package/esm2022/grid.component.mjs +29 -6
- package/esm2022/renderer/creations/create-active-cell-border.mjs +6 -3
- package/esm2022/renderer/creations/create-cells.mjs +81 -25
- package/esm2022/renderer/renderer.component.mjs +7 -3
- package/esm2022/services/event.service.mjs +6 -4
- package/esm2022/services/match-cell.service.mjs +2 -2
- package/esm2022/services/selection.service.mjs +46 -16
- package/esm2022/types/grid.mjs +1 -1
- package/esm2022/types/index.mjs +2 -1
- package/esm2022/types/view.mjs +18 -0
- package/esm2022/utils/field/model/date.mjs +64 -0
- package/esm2022/utils/field/model/field.mjs +38 -0
- package/esm2022/utils/field/model/index.mjs +25 -0
- package/esm2022/utils/field/model/link.mjs +33 -0
- package/esm2022/utils/field/model/member.mjs +56 -0
- package/esm2022/utils/field/model/number.mjs +32 -0
- package/esm2022/utils/field/model/progress.mjs +38 -0
- package/esm2022/utils/field/model/rate.mjs +26 -0
- package/esm2022/utils/field/model/select.mjs +56 -0
- package/esm2022/utils/field/model/text.mjs +27 -0
- package/esm2022/utils/field/operate.mjs +47 -0
- package/esm2022/utils/index.mjs +3 -2
- package/fesm2022/ai-table-grid.mjs +556 -102
- package/fesm2022/ai-table-grid.mjs.map +1 -1
- package/grid.component.d.ts +4 -0
- package/grid.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/renderer/creations/create-active-cell-border.d.ts.map +1 -1
- package/renderer/creations/create-cells.d.ts.map +1 -1
- package/renderer/renderer.component.d.ts +5 -3
- package/renderer/renderer.component.d.ts.map +1 -1
- package/services/event.service.d.ts.map +1 -1
- package/services/selection.service.d.ts +3 -2
- package/services/selection.service.d.ts.map +1 -1
- package/types/grid.d.ts +5 -4
- package/types/grid.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/view.d.ts +23 -0
- package/types/view.d.ts.map +1 -0
- package/utils/field/model/date.d.ts +9 -0
- package/utils/field/model/date.d.ts.map +1 -0
- package/utils/field/model/field.d.ts +9 -0
- package/utils/field/model/field.d.ts.map +1 -0
- package/utils/field/{index.d.ts → model/index.d.ts} +1 -1
- package/utils/field/model/index.d.ts.map +1 -0
- package/utils/field/model/link.d.ts +9 -0
- package/utils/field/model/link.d.ts.map +1 -0
- package/utils/field/model/member.d.ts +9 -0
- package/utils/field/model/member.d.ts.map +1 -0
- package/utils/field/model/number.d.ts +8 -0
- package/utils/field/model/number.d.ts.map +1 -0
- package/utils/field/model/progress.d.ts +9 -0
- package/utils/field/model/progress.d.ts.map +1 -0
- package/utils/field/model/rate.d.ts +8 -0
- package/utils/field/model/rate.d.ts.map +1 -0
- package/utils/field/model/select.d.ts +9 -0
- package/utils/field/model/select.d.ts.map +1 -0
- package/utils/field/model/text.d.ts +8 -0
- package/utils/field/model/text.d.ts.map +1 -0
- package/utils/field/operate.d.ts +9 -0
- package/utils/field/operate.d.ts.map +1 -0
- package/utils/index.d.ts +2 -1
- package/utils/index.d.ts.map +1 -1
- package/esm2022/utils/field/field.mjs +0 -3
- package/esm2022/utils/field/index.mjs +0 -22
- package/esm2022/utils/field/link.mjs +0 -12
- package/esm2022/utils/field/member.mjs +0 -19
- package/esm2022/utils/field/progress.mjs +0 -12
- package/esm2022/utils/field/select.mjs +0 -16
- package/esm2022/utils/field/text.mjs +0 -12
- package/utils/field/field.d.ts +0 -5
- package/utils/field/field.d.ts.map +0 -1
- package/utils/field/index.d.ts.map +0 -1
- package/utils/field/link.d.ts +0 -6
- package/utils/field/link.d.ts.map +0 -1
- package/utils/field/member.d.ts +0 -6
- package/utils/field/member.d.ts.map +0 -1
- package/utils/field/progress.d.ts +0 -6
- package/utils/field/progress.d.ts.map +0 -1
- package/utils/field/select.d.ts +0 -6
- package/utils/field/select.d.ts.map +0 -1
- package/utils/field/text.d.ts +0 -6
- 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
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
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
|
-
|
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(
|
126
|
-
columnIndex: visibleColumnIndexMap.get(
|
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
|
676
|
-
selectedFields: new
|
677
|
-
selectedCells: new
|
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
|
1545
|
-
selectedFields: new
|
1546
|
-
selectedCells: new
|
1573
|
+
selectedRecords: new Set(),
|
1574
|
+
selectedFields: new Set(),
|
1575
|
+
selectedCells: new Set(),
|
1576
|
+
activeCell: null
|
1547
1577
|
});
|
1548
1578
|
}
|
1549
|
-
|
1550
|
-
|
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.
|
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.
|
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
|
1574
|
-
selectedCells: new
|
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.
|
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}
|
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
|
-
|
2487
|
-
|
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
|
-
|
2694
|
+
texts.push(transformValue.text);
|
2490
2695
|
}
|
2491
|
-
return
|
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
|
-
|
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
|
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
|
2529
|
-
if (
|
2530
|
-
|
2865
|
+
const option = optionsMap[optionId];
|
2866
|
+
if (option && option.text) {
|
2867
|
+
fullText.push(option.text);
|
2531
2868
|
}
|
2532
2869
|
});
|
2533
2870
|
}
|
2534
|
-
return
|
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
|
-
|
2540
|
-
|
2541
|
-
|
2542
|
-
|
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
|
2553
|
-
[AITableFieldType.createdAt]: new
|
2554
|
-
[AITableFieldType.updatedAt]: new
|
2555
|
-
[AITableFieldType.number]: new
|
2556
|
-
[AITableFieldType.rate]: new
|
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
|
-
|
2607
|
-
|
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
|
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
|
5396
|
-
|
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:
|
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
|
6186
|
-
|
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
|
-
|
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) &&
|
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
|