photon-grid-core 2.0.4 → 2.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cell-selection/cell-selection-engine.d.ts +49 -0
- package/cell-selection/cell-selection-engine.d.ts.map +1 -1
- package/cell-selection/cell-selection-engine.js +185 -6
- package/cell-selection/cell-selection-engine.js.map +1 -1
- package/core/grid-api.d.ts +83 -0
- package/core/grid-api.d.ts.map +1 -1
- package/core/grid-api.js +118 -1
- package/core/grid-api.js.map +1 -1
- package/core/grid-core.d.ts.map +1 -1
- package/core/grid-core.js +14 -4
- package/core/grid-core.js.map +1 -1
- package/engines/clipboard/clipboard-engine.d.ts +3 -2
- package/engines/clipboard/clipboard-engine.d.ts.map +1 -1
- package/engines/clipboard/clipboard-engine.js +4 -3
- package/engines/clipboard/clipboard-engine.js.map +1 -1
- package/engines/filter/filter-engine.d.ts +16 -0
- package/engines/filter/filter-engine.d.ts.map +1 -1
- package/engines/filter/filter-engine.js +20 -0
- package/engines/filter/filter-engine.js.map +1 -1
- package/engines/filter/filter-panel.d.ts.map +1 -1
- package/engines/filter/filter-panel.js +6 -1
- package/engines/filter/filter-panel.js.map +1 -1
- package/engines/master-detail/master-detail-engine.d.ts +4 -3
- package/engines/master-detail/master-detail-engine.d.ts.map +1 -1
- package/engines/master-detail/master-detail-engine.js +14 -5
- package/engines/master-detail/master-detail-engine.js.map +1 -1
- package/engines/selection/row-selection-engine.d.ts +41 -0
- package/engines/selection/row-selection-engine.d.ts.map +1 -1
- package/engines/selection/row-selection-engine.js +103 -0
- package/engines/selection/row-selection-engine.js.map +1 -1
- package/index.d.ts +2 -1
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/photon-ai/builtins/filter.commands.d.ts +15 -0
- package/photon-ai/builtins/filter.commands.d.ts.map +1 -1
- package/photon-ai/builtins/filter.commands.js +5 -5
- package/photon-ai/builtins/filter.commands.js.map +1 -1
- package/photon-ai/builtins/selection.commands.d.ts.map +1 -1
- package/photon-ai/builtins/selection.commands.js +161 -2
- package/photon-ai/builtins/selection.commands.js.map +1 -1
- package/photon-ai/provider/command-normalizer.d.ts.map +1 -1
- package/photon-ai/provider/command-normalizer.js +5 -1
- package/photon-ai/provider/command-normalizer.js.map +1 -1
- package/photon-ai/provider/system-prompt.d.ts.map +1 -1
- package/photon-ai/provider/system-prompt.js +3 -1
- package/photon-ai/provider/system-prompt.js.map +1 -1
- package/photon-grid.min.js +349 -498
- package/renderer/auto-scroller.d.ts +11 -1
- package/renderer/auto-scroller.d.ts.map +1 -1
- package/renderer/auto-scroller.js +34 -19
- package/renderer/auto-scroller.js.map +1 -1
- package/renderer/body-renderer.d.ts +16 -0
- package/renderer/body-renderer.d.ts.map +1 -1
- package/renderer/body-renderer.js +54 -1
- package/renderer/body-renderer.js.map +1 -1
- package/renderer/cell-renderer.d.ts +9 -1
- package/renderer/cell-renderer.d.ts.map +1 -1
- package/renderer/cell-renderer.js +16 -2
- package/renderer/cell-renderer.js.map +1 -1
- package/renderer/detail-row-renderer.d.ts.map +1 -1
- package/renderer/detail-row-renderer.js +1 -1
- package/renderer/detail-row-renderer.js.map +1 -1
- package/renderer/grid-renderer.d.ts +33 -1
- package/renderer/grid-renderer.d.ts.map +1 -1
- package/renderer/grid-renderer.js +138 -2
- package/renderer/grid-renderer.js.map +1 -1
- package/renderer/header-renderer.d.ts +44 -0
- package/renderer/header-renderer.d.ts.map +1 -1
- package/renderer/header-renderer.js +145 -19
- package/renderer/header-renderer.js.map +1 -1
- package/renderer/row-animator.d.ts +18 -1
- package/renderer/row-animator.d.ts.map +1 -1
- package/renderer/row-animator.js +93 -17
- package/renderer/row-animator.js.map +1 -1
- package/renderer/scroll-controller.d.ts.map +1 -1
- package/renderer/scroll-controller.js +31 -13
- package/renderer/scroll-controller.js.map +1 -1
- package/styles/base/cells.css.d.ts +1 -1
- package/styles/base/cells.css.d.ts.map +1 -1
- package/styles/base/cells.css.js +13 -13
- package/styles/base/column-context-menu.css.d.ts +1 -1
- package/styles/base/column-context-menu.css.d.ts.map +1 -1
- package/styles/base/column-context-menu.css.js +19 -5
- package/styles/base/column-context-menu.css.js.map +1 -1
- package/styles/base/column-group-header.css.d.ts +1 -1
- package/styles/base/column-group-header.css.d.ts.map +1 -1
- package/styles/base/column-group-header.css.js +5 -1
- package/styles/base/column-group-header.css.js.map +1 -1
- package/styles/base/context-menu.css.d.ts +1 -1
- package/styles/base/context-menu.css.d.ts.map +1 -1
- package/styles/base/context-menu.css.js +23 -0
- package/styles/base/context-menu.css.js.map +1 -1
- package/styles/base/filter.css.d.ts +1 -1
- package/styles/base/filter.css.d.ts.map +1 -1
- package/styles/base/filter.css.js +49 -8
- package/styles/base/filter.css.js.map +1 -1
- package/styles/base/group-drop-zone.css.d.ts +1 -1
- package/styles/base/group-drop-zone.css.d.ts.map +1 -1
- package/styles/base/group-drop-zone.css.js +3 -3
- package/styles/base/header.css.d.ts +1 -1
- package/styles/base/header.css.d.ts.map +1 -1
- package/styles/base/header.css.js +8 -1
- package/styles/base/header.css.js.map +1 -1
- package/styles/base/row-drag.css.d.ts +1 -1
- package/styles/base/row-drag.css.d.ts.map +1 -1
- package/styles/base/row-drag.css.js +1 -1
- package/styles/base/rows.css.d.ts +1 -1
- package/styles/base/rows.css.d.ts.map +1 -1
- package/styles/base/rows.css.js +23 -16
- package/styles/base/rows.css.js.map +1 -1
- package/styles/base/scrollbars.css.d.ts +1 -1
- package/styles/base/scrollbars.css.d.ts.map +1 -1
- package/styles/base/scrollbars.css.js +6 -3
- package/styles/base/scrollbars.css.js.map +1 -1
- package/styles/base/sparkline.css.d.ts +1 -1
- package/styles/base/sparkline.css.d.ts.map +1 -1
- package/styles/base/sparkline.css.js +6 -0
- package/styles/base/sparkline.css.js.map +1 -1
- package/styles/base/tooltip.css.d.ts +1 -1
- package/styles/base/tooltip.css.d.ts.map +1 -1
- package/styles/base/tooltip.css.js +1 -1
- package/styles/base-styles.d.ts.map +1 -1
- package/styles/base-styles.js +5 -2
- package/styles/base-styles.js.map +1 -1
- package/styles/themes/theme-alpine.d.ts +9 -1
- package/styles/themes/theme-alpine.d.ts.map +1 -1
- package/styles/themes/theme-alpine.js +34 -43
- package/styles/themes/theme-alpine.js.map +1 -1
- package/styles/themes/theme-balham.d.ts +9 -1
- package/styles/themes/theme-balham.d.ts.map +1 -1
- package/styles/themes/theme-balham.js +33 -42
- package/styles/themes/theme-balham.js.map +1 -1
- package/styles/themes/theme-material.d.ts +9 -1
- package/styles/themes/theme-material.d.ts.map +1 -1
- package/styles/themes/theme-material.js +36 -44
- package/styles/themes/theme-material.js.map +1 -1
- package/styles/themes/theme-quartz.d.ts +14 -1
- package/styles/themes/theme-quartz.d.ts.map +1 -1
- package/styles/themes/theme-quartz.js +64 -43
- package/styles/themes/theme-quartz.js.map +1 -1
- package/theme/theme-manager.d.ts +55 -7
- package/theme/theme-manager.d.ts.map +1 -1
- package/theme/theme-manager.js +139 -35
- package/theme/theme-manager.js.map +1 -1
- package/theme/themes/light-theme.js +1 -1
- package/types/column.types.d.ts +42 -0
- package/types/column.types.d.ts.map +1 -1
- package/types/column.types.js +26 -1
- package/types/column.types.js.map +1 -1
- package/types/grid.types.d.ts +90 -2
- package/types/grid.types.d.ts.map +1 -1
- package/types/theme.types.d.ts +19 -0
- package/types/theme.types.d.ts.map +1 -1
- package/types/theme.types.js +7 -1
- package/types/theme.types.js.map +1 -1
- package/styles/themes/theme-dark.d.ts +0 -2
- package/styles/themes/theme-dark.d.ts.map +0 -1
- package/styles/themes/theme-dark.js +0 -219
- package/styles/themes/theme-dark.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ColumnDef } from '../types/column.types';
|
|
2
|
+
import { HeaderIconDisplay } from '../types/column.types';
|
|
2
3
|
import type { GridStore } from '../core/grid-store';
|
|
3
4
|
import type { EventBus } from '../event-bus/event-bus';
|
|
4
5
|
import type { IconRenderer } from '../icons/icon-renderer';
|
|
@@ -19,6 +20,10 @@ export interface HeaderRendererOptions {
|
|
|
19
20
|
filterRowHeight?: number;
|
|
20
21
|
hasGroupedColumns?: boolean;
|
|
21
22
|
autoGroupColWidth?: number;
|
|
23
|
+
/** Grid-wide default display mode for the filter funnel icon. @default HeaderIconDisplay.HOVER */
|
|
24
|
+
filterIconDisplay?: HeaderIconDisplay;
|
|
25
|
+
/** Grid-wide default display mode for the column-menu "⋯" icon. @default HeaderIconDisplay.HOVER */
|
|
26
|
+
menuIconDisplay?: HeaderIconDisplay;
|
|
22
27
|
}
|
|
23
28
|
export declare class HeaderRenderer {
|
|
24
29
|
private store;
|
|
@@ -30,7 +35,9 @@ export declare class HeaderRenderer {
|
|
|
30
35
|
private leftHeaderRowEl;
|
|
31
36
|
private centerHeaderRowEl;
|
|
32
37
|
private rightHeaderRowEl;
|
|
38
|
+
private leftFilterRowEl;
|
|
33
39
|
private centerFilterRowEl;
|
|
40
|
+
private rightFilterRowEl;
|
|
34
41
|
private headerCheckbox;
|
|
35
42
|
private columnMenu;
|
|
36
43
|
private groupContextMenu;
|
|
@@ -97,6 +104,12 @@ export declare class HeaderRenderer {
|
|
|
97
104
|
private boundMouseUp;
|
|
98
105
|
/** Callback wired by GridRenderer to open a filter panel for a column. */
|
|
99
106
|
private openFilterPanelFn;
|
|
107
|
+
/**
|
|
108
|
+
* Callback wired by GridRenderer to apply a live, per-column text filter as the
|
|
109
|
+
* user types in an inline filter-row input. Receives the empty string when the
|
|
110
|
+
* input is cleared so the column filter can be removed.
|
|
111
|
+
*/
|
|
112
|
+
private applyInlineFilterFn;
|
|
100
113
|
/** Callback wired by GridRenderer to open the Column Chooser dialog. */
|
|
101
114
|
private openColumnChooserFn;
|
|
102
115
|
/** Callback wired by GridRenderer to re-run the data pipeline (e.g. after an aggregate change). */
|
|
@@ -131,6 +144,15 @@ export declare class HeaderRenderer {
|
|
|
131
144
|
* @param fn - Opens/positions a `FilterPanel` for the given column.
|
|
132
145
|
*/
|
|
133
146
|
setOpenFilterPanelCallback(fn: (colDef: ColumnDef, anchorEl: HTMLElement) => void): void;
|
|
147
|
+
/**
|
|
148
|
+
* Register the callback invoked as the user types in an inline filter-row
|
|
149
|
+
* input, applying a live per-column text filter. Wired by
|
|
150
|
+
* `GridRenderer.buildLayout()`. Only fires for free-text (non set-type) columns
|
|
151
|
+
* — set-type columns (see {@link SET_FILTER_TYPES}) filter through the panel.
|
|
152
|
+
*
|
|
153
|
+
* @param fn - Applies (or clears, on empty term) the column's text filter.
|
|
154
|
+
*/
|
|
155
|
+
setInlineFilterCallback(fn: (colDef: ColumnDef, term: string) => void): void;
|
|
134
156
|
/**
|
|
135
157
|
* Registers the callback that opens the Column Chooser dialog, invoked from
|
|
136
158
|
* the column menu's and group menu's "Column Chooser…" items.
|
|
@@ -222,9 +244,31 @@ export declare class HeaderRenderer {
|
|
|
222
244
|
private capturePanelDragData;
|
|
223
245
|
private buildHeaderRow;
|
|
224
246
|
private buildAutoGroupTh;
|
|
247
|
+
/**
|
|
248
|
+
* Build the leading spacer cell for the filter row that reserves the same
|
|
249
|
+
* horizontal space as the auto-group header column ({@link buildAutoGroupTh}).
|
|
250
|
+
*
|
|
251
|
+
* The width must be applied explicitly — with no width the flex cell collapses
|
|
252
|
+
* to its content, pushing every subsequent filter input out of alignment with
|
|
253
|
+
* its header. Mirrors the header cell's inline sizing so the two rows track the
|
|
254
|
+
* same `autoGroupColWidth`.
|
|
255
|
+
*
|
|
256
|
+
* @param width - The auto-group column width in pixels.
|
|
257
|
+
* @returns A zero-content filter cell sized to the group column.
|
|
258
|
+
*/
|
|
259
|
+
private buildAutoGroupFilterCell;
|
|
225
260
|
private buildCheckboxHeaderCell;
|
|
226
261
|
private buildSerialHeaderCell;
|
|
227
262
|
private buildHeaderCell;
|
|
263
|
+
/**
|
|
264
|
+
* Column data types whose inline filter is a checkbox **set** dropdown rather
|
|
265
|
+
* than a free-text term. Their filter-row input is rendered read-only (with a
|
|
266
|
+
* disabled appearance) and opens the set-filter panel on click; free-text
|
|
267
|
+
* columns instead filter live as the user types.
|
|
268
|
+
*/
|
|
269
|
+
private static readonly SET_FILTER_TYPES;
|
|
270
|
+
/** `true` when a column's inline filter should be a set (checkbox) dropdown. */
|
|
271
|
+
private isSetFilterColumn;
|
|
228
272
|
private buildFilterCell;
|
|
229
273
|
private buildFilterRow;
|
|
230
274
|
private attachColumnDragListeners;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/header-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"header-renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/header-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { HeaderIconDisplay } from '../types/column.types';
|
|
1
2
|
import { GridEventType } from '../types/event.types';
|
|
2
3
|
import { ColumnMenu } from './column-menu';
|
|
3
4
|
import { GroupContextMenu } from './group-context-menu';
|
|
@@ -30,7 +31,9 @@ export class HeaderRenderer {
|
|
|
30
31
|
this.leftHeaderRowEl = null;
|
|
31
32
|
this.centerHeaderRowEl = null;
|
|
32
33
|
this.rightHeaderRowEl = null;
|
|
34
|
+
this.leftFilterRowEl = null;
|
|
33
35
|
this.centerFilterRowEl = null;
|
|
36
|
+
this.rightFilterRowEl = null;
|
|
34
37
|
this.headerCheckbox = null;
|
|
35
38
|
this.groupContextMenu = null;
|
|
36
39
|
this.groupDropZone = null;
|
|
@@ -98,6 +101,12 @@ export class HeaderRenderer {
|
|
|
98
101
|
this.lastDragClientX = 0;
|
|
99
102
|
/** Callback wired by GridRenderer to open a filter panel for a column. */
|
|
100
103
|
this.openFilterPanelFn = null;
|
|
104
|
+
/**
|
|
105
|
+
* Callback wired by GridRenderer to apply a live, per-column text filter as the
|
|
106
|
+
* user types in an inline filter-row input. Receives the empty string when the
|
|
107
|
+
* input is cleared so the column filter can be removed.
|
|
108
|
+
*/
|
|
109
|
+
this.applyInlineFilterFn = null;
|
|
101
110
|
/** Callback wired by GridRenderer to open the Column Chooser dialog. */
|
|
102
111
|
this.openColumnChooserFn = null;
|
|
103
112
|
/** Callback wired by GridRenderer to re-run the data pipeline (e.g. after an aggregate change). */
|
|
@@ -224,6 +233,17 @@ export class HeaderRenderer {
|
|
|
224
233
|
setOpenFilterPanelCallback(fn) {
|
|
225
234
|
this.openFilterPanelFn = fn;
|
|
226
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Register the callback invoked as the user types in an inline filter-row
|
|
238
|
+
* input, applying a live per-column text filter. Wired by
|
|
239
|
+
* `GridRenderer.buildLayout()`. Only fires for free-text (non set-type) columns
|
|
240
|
+
* — set-type columns (see {@link SET_FILTER_TYPES}) filter through the panel.
|
|
241
|
+
*
|
|
242
|
+
* @param fn - Applies (or clears, on empty term) the column's text filter.
|
|
243
|
+
*/
|
|
244
|
+
setInlineFilterCallback(fn) {
|
|
245
|
+
this.applyInlineFilterFn = fn;
|
|
246
|
+
}
|
|
227
247
|
/**
|
|
228
248
|
* Registers the callback that opens the Column Chooser dialog, invoked from
|
|
229
249
|
* the column menu's and group menu's "Column Chooser…" items.
|
|
@@ -355,6 +375,23 @@ export class HeaderRenderer {
|
|
|
355
375
|
}
|
|
356
376
|
}
|
|
357
377
|
}
|
|
378
|
+
// Keep the inline filter-row icons in sync with header state.
|
|
379
|
+
const filterRows = [
|
|
380
|
+
this.leftFilterRowEl,
|
|
381
|
+
this.centerFilterRowEl,
|
|
382
|
+
this.rightFilterRowEl,
|
|
383
|
+
].filter((r) => r !== null);
|
|
384
|
+
for (const row of filterRows) {
|
|
385
|
+
for (const cell of Array.from(row.querySelectorAll('.pg-filter-cell[data-col-id]'))) {
|
|
386
|
+
const colId = cell.getAttribute('data-col-id') ?? '';
|
|
387
|
+
const active = activeColIds.has(colId);
|
|
388
|
+
const icon = cell.querySelector('.pg-filter-cell__icon');
|
|
389
|
+
if (!icon)
|
|
390
|
+
continue;
|
|
391
|
+
icon.classList.toggle('pg-filter-cell__icon--active', active);
|
|
392
|
+
this.iconRenderer.updateIcon(icon, active ? 'filterActive' : 'filter', { size: 14 });
|
|
393
|
+
}
|
|
394
|
+
}
|
|
358
395
|
}
|
|
359
396
|
// ── Private: group-cell option builder ───────────────────────────────────
|
|
360
397
|
/**
|
|
@@ -428,8 +465,10 @@ export class HeaderRenderer {
|
|
|
428
465
|
// ── Leaf header rows ──────────────────────────────────────────────────
|
|
429
466
|
this.leftHeaderRowEl = this.buildHeaderRow(leftCols, options, true);
|
|
430
467
|
leftContainer.appendChild(this.leftHeaderRowEl);
|
|
431
|
-
if (options.showFilterRow)
|
|
432
|
-
|
|
468
|
+
if (options.showFilterRow) {
|
|
469
|
+
this.leftFilterRowEl = this.buildFilterRow(leftCols, options, true);
|
|
470
|
+
leftContainer.appendChild(this.leftFilterRowEl);
|
|
471
|
+
}
|
|
433
472
|
this.centerHeaderRowEl = this.buildHeaderRow(centerCols, options, false);
|
|
434
473
|
if (options.hasGroupedColumns) {
|
|
435
474
|
this.centerHeaderRowEl.insertBefore(this.buildAutoGroupTh(options.autoGroupColWidth ?? 200), this.centerHeaderRowEl.firstChild);
|
|
@@ -439,13 +478,15 @@ export class HeaderRenderer {
|
|
|
439
478
|
const filterRow = this.buildFilterRow(centerCols, options, false);
|
|
440
479
|
this.centerFilterRowEl = filterRow;
|
|
441
480
|
if (options.hasGroupedColumns)
|
|
442
|
-
filterRow.insertBefore(
|
|
481
|
+
filterRow.insertBefore(this.buildAutoGroupFilterCell(options.autoGroupColWidth ?? 200), filterRow.firstChild);
|
|
443
482
|
centerInnerEl.appendChild(filterRow);
|
|
444
483
|
}
|
|
445
484
|
this.rightHeaderRowEl = this.buildHeaderRow(rightCols, options, false);
|
|
446
485
|
rightContainer.appendChild(this.rightHeaderRowEl);
|
|
447
|
-
if (options.showFilterRow)
|
|
448
|
-
|
|
486
|
+
if (options.showFilterRow) {
|
|
487
|
+
this.rightFilterRowEl = this.buildFilterRow(rightCols, options, false);
|
|
488
|
+
rightContainer.appendChild(this.rightFilterRowEl);
|
|
489
|
+
}
|
|
449
490
|
}
|
|
450
491
|
updateSortIndicator(colId, order) {
|
|
451
492
|
const rows = [this.leftHeaderRowEl, this.centerHeaderRowEl, this.rightHeaderRowEl].filter((r) => r !== null);
|
|
@@ -491,7 +532,9 @@ export class HeaderRenderer {
|
|
|
491
532
|
this.leftHeaderRowEl = null;
|
|
492
533
|
this.centerHeaderRowEl = null;
|
|
493
534
|
this.rightHeaderRowEl = null;
|
|
535
|
+
this.leftFilterRowEl = null;
|
|
494
536
|
this.centerFilterRowEl = null;
|
|
537
|
+
this.rightFilterRowEl = null;
|
|
495
538
|
this.headerCheckbox = null;
|
|
496
539
|
this.leftGroupRowEls = [];
|
|
497
540
|
this.centerGroupRowEls = [];
|
|
@@ -551,7 +594,7 @@ export class HeaderRenderer {
|
|
|
551
594
|
return;
|
|
552
595
|
this.centerFilterRowEl.innerHTML = '';
|
|
553
596
|
if (options.hasGroupedColumns)
|
|
554
|
-
this.centerFilterRowEl.appendChild(
|
|
597
|
+
this.centerFilterRowEl.appendChild(this.buildAutoGroupFilterCell(options.autoGroupColWidth ?? 200));
|
|
555
598
|
if (leftSpacerW > 0)
|
|
556
599
|
this.centerFilterRowEl.appendChild(this.makeSpacer('pg-filter-cell pg-filter-cell--h-spacer', leftSpacerW));
|
|
557
600
|
for (const col of visibleCols)
|
|
@@ -612,6 +655,24 @@ export class HeaderRenderer {
|
|
|
612
655
|
th.appendChild(content);
|
|
613
656
|
return th;
|
|
614
657
|
}
|
|
658
|
+
/**
|
|
659
|
+
* Build the leading spacer cell for the filter row that reserves the same
|
|
660
|
+
* horizontal space as the auto-group header column ({@link buildAutoGroupTh}).
|
|
661
|
+
*
|
|
662
|
+
* The width must be applied explicitly — with no width the flex cell collapses
|
|
663
|
+
* to its content, pushing every subsequent filter input out of alignment with
|
|
664
|
+
* its header. Mirrors the header cell's inline sizing so the two rows track the
|
|
665
|
+
* same `autoGroupColWidth`.
|
|
666
|
+
*
|
|
667
|
+
* @param width - The auto-group column width in pixels.
|
|
668
|
+
* @returns A zero-content filter cell sized to the group column.
|
|
669
|
+
*/
|
|
670
|
+
buildAutoGroupFilterCell(width) {
|
|
671
|
+
const cell = createDiv('pg-filter-cell pg-filter-cell--auto-group');
|
|
672
|
+
cell.style.width = `${width}px`;
|
|
673
|
+
cell.style.minWidth = `${width}px`;
|
|
674
|
+
return cell;
|
|
675
|
+
}
|
|
615
676
|
buildCheckboxHeaderCell() {
|
|
616
677
|
const cell = createDiv('pg-th pg-th--checkbox');
|
|
617
678
|
cell.setAttribute('role', 'columnheader');
|
|
@@ -686,12 +747,17 @@ export class HeaderRenderer {
|
|
|
686
747
|
}
|
|
687
748
|
th.appendChild(content);
|
|
688
749
|
}
|
|
689
|
-
// Filter icon —
|
|
690
|
-
|
|
750
|
+
// Filter icon — reveal-on-hover by default; always visible when a filter is
|
|
751
|
+
// active, or when the column/grid opts into `HeaderIconDisplay.ALWAYS`.
|
|
752
|
+
// Skipped entirely when the mode is `HeaderIconDisplay.HIDDEN`.
|
|
753
|
+
const filterMode = col.filterIconDisplay ?? options.filterIconDisplay ?? HeaderIconDisplay.HOVER;
|
|
754
|
+
if (col.filterable !== false && filterMode !== HeaderIconDisplay.HIDDEN) {
|
|
691
755
|
const filterBtn = createDiv('pg-th__filter-btn');
|
|
692
756
|
const filterActive = col.filterActive === true;
|
|
693
757
|
if (filterActive)
|
|
694
758
|
filterBtn.classList.add('pg-th__filter-btn--active');
|
|
759
|
+
if (filterMode === HeaderIconDisplay.ALWAYS)
|
|
760
|
+
filterBtn.classList.add('pg-th__filter-btn--always');
|
|
695
761
|
filterBtn.innerHTML = this.iconRenderer.renderToString(filterActive ? 'filterActive' : 'filter', 14);
|
|
696
762
|
filterBtn.title = 'Filter column';
|
|
697
763
|
filterBtn.setAttribute('tabindex', '0');
|
|
@@ -702,8 +768,13 @@ export class HeaderRenderer {
|
|
|
702
768
|
});
|
|
703
769
|
th.appendChild(filterBtn);
|
|
704
770
|
}
|
|
705
|
-
|
|
771
|
+
// Column-menu "⋯" icon — hidden entirely when the mode is
|
|
772
|
+
// `HeaderIconDisplay.HIDDEN` (the header right-click menu still works).
|
|
773
|
+
const menuMode = col.menuIconDisplay ?? options.menuIconDisplay ?? HeaderIconDisplay.HOVER;
|
|
774
|
+
if (options.showColumnMenu !== false && menuMode !== HeaderIconDisplay.HIDDEN) {
|
|
706
775
|
const menuBtn = createDiv('pg-th__menu-btn');
|
|
776
|
+
if (menuMode === HeaderIconDisplay.ALWAYS)
|
|
777
|
+
menuBtn.classList.add('pg-th__menu-btn--always');
|
|
707
778
|
menuBtn.innerHTML = this.iconRenderer.renderToString('menuHorizontal', 14);
|
|
708
779
|
menuBtn.title = 'Column options';
|
|
709
780
|
menuBtn.setAttribute('tabindex', '0');
|
|
@@ -759,22 +830,66 @@ export class HeaderRenderer {
|
|
|
759
830
|
this.attachColumnDragListeners(th, col, panelColumns, panelRowEl);
|
|
760
831
|
return th;
|
|
761
832
|
}
|
|
833
|
+
/** `true` when a column's inline filter should be a set (checkbox) dropdown. */
|
|
834
|
+
isSetFilterColumn(col) {
|
|
835
|
+
return col.type != null && HeaderRenderer.SET_FILTER_TYPES.has(col.type);
|
|
836
|
+
}
|
|
762
837
|
buildFilterCell(col) {
|
|
763
838
|
const cell = createDiv('pg-filter-cell');
|
|
764
839
|
cell.setAttribute('data-col-id', col.colId);
|
|
765
|
-
if (col.filterable
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
840
|
+
if (col.filterable === false)
|
|
841
|
+
return cell;
|
|
842
|
+
const isSet = this.isSetFilterColumn(col);
|
|
843
|
+
const filterActive = col.filterActive === true;
|
|
844
|
+
// ── Filter input ────────────────────────────────────────────────────────
|
|
845
|
+
const input = document.createElement('input');
|
|
846
|
+
input.type = 'text';
|
|
847
|
+
input.className = 'pg-filter-input';
|
|
848
|
+
// NOTE: the input deliberately carries no `data-col-id` — the per-column
|
|
849
|
+
// width rules emitted by ColumnStyleManager target `[data-col-id]` with a
|
|
850
|
+
// fixed width + `flex-shrink: 0`, which would stop the input from shrinking
|
|
851
|
+
// and push the trailing icon out of narrow cells. Only the cell (below)
|
|
852
|
+
// carries the id, so the input stays free to flex beside the icon.
|
|
853
|
+
// ── Trailing filter icon — anchors the (set / advanced) filter panel ─────
|
|
854
|
+
const iconBtn = createDiv('pg-filter-cell__icon');
|
|
855
|
+
iconBtn.setAttribute('role', 'button');
|
|
856
|
+
iconBtn.setAttribute('tabindex', '0');
|
|
857
|
+
iconBtn.setAttribute('aria-label', `Filter ${col.header}`);
|
|
858
|
+
if (filterActive)
|
|
859
|
+
iconBtn.classList.add('pg-filter-cell__icon--active');
|
|
860
|
+
iconBtn.innerHTML = this.iconRenderer.renderToString(filterActive ? 'filterActive' : 'filter', 14);
|
|
861
|
+
const openPanel = () => this.openFilterPanelFn?.(col, iconBtn);
|
|
862
|
+
iconBtn.addEventListener('click', openPanel);
|
|
863
|
+
iconBtn.addEventListener('keydown', (e) => {
|
|
864
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
865
|
+
e.preventDefault();
|
|
866
|
+
openPanel();
|
|
867
|
+
}
|
|
868
|
+
});
|
|
869
|
+
if (isSet) {
|
|
870
|
+
// Set-type columns (object / array / dropdown) filter via the checkbox
|
|
871
|
+
// panel — the inline input is non-editable and acts as a button that opens
|
|
872
|
+
// the dropdown anchored below the trailing filter icon.
|
|
873
|
+
input.readOnly = true;
|
|
874
|
+
// input.placeholder = 'Select…';
|
|
875
|
+
input.setAttribute('aria-disabled', 'true');
|
|
876
|
+
input.setAttribute('aria-haspopup', 'listbox');
|
|
877
|
+
input.classList.add('pg-filter-input--set');
|
|
878
|
+
cell.classList.add('pg-filter-cell--set');
|
|
879
|
+
input.addEventListener('mousedown', (e) => {
|
|
880
|
+
e.preventDefault(); // keep focus off the read-only field
|
|
881
|
+
openPanel();
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
else {
|
|
885
|
+
// Free-text columns filter live as the user types.
|
|
886
|
+
// input.placeholder = `${col.header}…`;
|
|
771
887
|
input.addEventListener('input', (e) => {
|
|
772
|
-
this.
|
|
773
|
-
colId: col.colId, field: col.field, term: e.target.value,
|
|
774
|
-
});
|
|
888
|
+
this.applyInlineFilterFn?.(col, e.target.value);
|
|
775
889
|
});
|
|
776
|
-
cell.appendChild(input);
|
|
777
890
|
}
|
|
891
|
+
cell.appendChild(input);
|
|
892
|
+
cell.appendChild(iconBtn);
|
|
778
893
|
return cell;
|
|
779
894
|
}
|
|
780
895
|
buildFilterRow(columns, options, isLeft) {
|
|
@@ -1647,4 +1762,15 @@ export class HeaderRenderer {
|
|
|
1647
1762
|
});
|
|
1648
1763
|
}
|
|
1649
1764
|
}
|
|
1765
|
+
/**
|
|
1766
|
+
* Column data types whose inline filter is a checkbox **set** dropdown rather
|
|
1767
|
+
* than a free-text term. Their filter-row input is rendered read-only (with a
|
|
1768
|
+
* disabled appearance) and opens the set-filter panel on click; free-text
|
|
1769
|
+
* columns instead filter live as the user types.
|
|
1770
|
+
*/
|
|
1771
|
+
HeaderRenderer.SET_FILTER_TYPES = new Set([
|
|
1772
|
+
'object',
|
|
1773
|
+
'array',
|
|
1774
|
+
'dropdown',
|
|
1775
|
+
]);
|
|
1650
1776
|
//# sourceMappingURL=header-renderer.js.map
|