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.
Files changed (161) hide show
  1. package/cell-selection/cell-selection-engine.d.ts +49 -0
  2. package/cell-selection/cell-selection-engine.d.ts.map +1 -1
  3. package/cell-selection/cell-selection-engine.js +185 -6
  4. package/cell-selection/cell-selection-engine.js.map +1 -1
  5. package/core/grid-api.d.ts +83 -0
  6. package/core/grid-api.d.ts.map +1 -1
  7. package/core/grid-api.js +118 -1
  8. package/core/grid-api.js.map +1 -1
  9. package/core/grid-core.d.ts.map +1 -1
  10. package/core/grid-core.js +14 -4
  11. package/core/grid-core.js.map +1 -1
  12. package/engines/clipboard/clipboard-engine.d.ts +3 -2
  13. package/engines/clipboard/clipboard-engine.d.ts.map +1 -1
  14. package/engines/clipboard/clipboard-engine.js +4 -3
  15. package/engines/clipboard/clipboard-engine.js.map +1 -1
  16. package/engines/filter/filter-engine.d.ts +16 -0
  17. package/engines/filter/filter-engine.d.ts.map +1 -1
  18. package/engines/filter/filter-engine.js +20 -0
  19. package/engines/filter/filter-engine.js.map +1 -1
  20. package/engines/filter/filter-panel.d.ts.map +1 -1
  21. package/engines/filter/filter-panel.js +6 -1
  22. package/engines/filter/filter-panel.js.map +1 -1
  23. package/engines/master-detail/master-detail-engine.d.ts +4 -3
  24. package/engines/master-detail/master-detail-engine.d.ts.map +1 -1
  25. package/engines/master-detail/master-detail-engine.js +14 -5
  26. package/engines/master-detail/master-detail-engine.js.map +1 -1
  27. package/engines/selection/row-selection-engine.d.ts +41 -0
  28. package/engines/selection/row-selection-engine.d.ts.map +1 -1
  29. package/engines/selection/row-selection-engine.js +103 -0
  30. package/engines/selection/row-selection-engine.js.map +1 -1
  31. package/index.d.ts +2 -1
  32. package/index.d.ts.map +1 -1
  33. package/index.js +1 -0
  34. package/index.js.map +1 -1
  35. package/package.json +1 -1
  36. package/photon-ai/builtins/filter.commands.d.ts +15 -0
  37. package/photon-ai/builtins/filter.commands.d.ts.map +1 -1
  38. package/photon-ai/builtins/filter.commands.js +5 -5
  39. package/photon-ai/builtins/filter.commands.js.map +1 -1
  40. package/photon-ai/builtins/selection.commands.d.ts.map +1 -1
  41. package/photon-ai/builtins/selection.commands.js +161 -2
  42. package/photon-ai/builtins/selection.commands.js.map +1 -1
  43. package/photon-ai/provider/command-normalizer.d.ts.map +1 -1
  44. package/photon-ai/provider/command-normalizer.js +5 -1
  45. package/photon-ai/provider/command-normalizer.js.map +1 -1
  46. package/photon-ai/provider/system-prompt.d.ts.map +1 -1
  47. package/photon-ai/provider/system-prompt.js +3 -1
  48. package/photon-ai/provider/system-prompt.js.map +1 -1
  49. package/photon-grid.min.js +349 -498
  50. package/renderer/auto-scroller.d.ts +11 -1
  51. package/renderer/auto-scroller.d.ts.map +1 -1
  52. package/renderer/auto-scroller.js +34 -19
  53. package/renderer/auto-scroller.js.map +1 -1
  54. package/renderer/body-renderer.d.ts +16 -0
  55. package/renderer/body-renderer.d.ts.map +1 -1
  56. package/renderer/body-renderer.js +54 -1
  57. package/renderer/body-renderer.js.map +1 -1
  58. package/renderer/cell-renderer.d.ts +9 -1
  59. package/renderer/cell-renderer.d.ts.map +1 -1
  60. package/renderer/cell-renderer.js +16 -2
  61. package/renderer/cell-renderer.js.map +1 -1
  62. package/renderer/detail-row-renderer.d.ts.map +1 -1
  63. package/renderer/detail-row-renderer.js +1 -1
  64. package/renderer/detail-row-renderer.js.map +1 -1
  65. package/renderer/grid-renderer.d.ts +33 -1
  66. package/renderer/grid-renderer.d.ts.map +1 -1
  67. package/renderer/grid-renderer.js +138 -2
  68. package/renderer/grid-renderer.js.map +1 -1
  69. package/renderer/header-renderer.d.ts +44 -0
  70. package/renderer/header-renderer.d.ts.map +1 -1
  71. package/renderer/header-renderer.js +145 -19
  72. package/renderer/header-renderer.js.map +1 -1
  73. package/renderer/row-animator.d.ts +18 -1
  74. package/renderer/row-animator.d.ts.map +1 -1
  75. package/renderer/row-animator.js +93 -17
  76. package/renderer/row-animator.js.map +1 -1
  77. package/renderer/scroll-controller.d.ts.map +1 -1
  78. package/renderer/scroll-controller.js +31 -13
  79. package/renderer/scroll-controller.js.map +1 -1
  80. package/styles/base/cells.css.d.ts +1 -1
  81. package/styles/base/cells.css.d.ts.map +1 -1
  82. package/styles/base/cells.css.js +13 -13
  83. package/styles/base/column-context-menu.css.d.ts +1 -1
  84. package/styles/base/column-context-menu.css.d.ts.map +1 -1
  85. package/styles/base/column-context-menu.css.js +19 -5
  86. package/styles/base/column-context-menu.css.js.map +1 -1
  87. package/styles/base/column-group-header.css.d.ts +1 -1
  88. package/styles/base/column-group-header.css.d.ts.map +1 -1
  89. package/styles/base/column-group-header.css.js +5 -1
  90. package/styles/base/column-group-header.css.js.map +1 -1
  91. package/styles/base/context-menu.css.d.ts +1 -1
  92. package/styles/base/context-menu.css.d.ts.map +1 -1
  93. package/styles/base/context-menu.css.js +23 -0
  94. package/styles/base/context-menu.css.js.map +1 -1
  95. package/styles/base/filter.css.d.ts +1 -1
  96. package/styles/base/filter.css.d.ts.map +1 -1
  97. package/styles/base/filter.css.js +49 -8
  98. package/styles/base/filter.css.js.map +1 -1
  99. package/styles/base/group-drop-zone.css.d.ts +1 -1
  100. package/styles/base/group-drop-zone.css.d.ts.map +1 -1
  101. package/styles/base/group-drop-zone.css.js +3 -3
  102. package/styles/base/header.css.d.ts +1 -1
  103. package/styles/base/header.css.d.ts.map +1 -1
  104. package/styles/base/header.css.js +8 -1
  105. package/styles/base/header.css.js.map +1 -1
  106. package/styles/base/row-drag.css.d.ts +1 -1
  107. package/styles/base/row-drag.css.d.ts.map +1 -1
  108. package/styles/base/row-drag.css.js +1 -1
  109. package/styles/base/rows.css.d.ts +1 -1
  110. package/styles/base/rows.css.d.ts.map +1 -1
  111. package/styles/base/rows.css.js +23 -16
  112. package/styles/base/rows.css.js.map +1 -1
  113. package/styles/base/scrollbars.css.d.ts +1 -1
  114. package/styles/base/scrollbars.css.d.ts.map +1 -1
  115. package/styles/base/scrollbars.css.js +6 -3
  116. package/styles/base/scrollbars.css.js.map +1 -1
  117. package/styles/base/sparkline.css.d.ts +1 -1
  118. package/styles/base/sparkline.css.d.ts.map +1 -1
  119. package/styles/base/sparkline.css.js +6 -0
  120. package/styles/base/sparkline.css.js.map +1 -1
  121. package/styles/base/tooltip.css.d.ts +1 -1
  122. package/styles/base/tooltip.css.d.ts.map +1 -1
  123. package/styles/base/tooltip.css.js +1 -1
  124. package/styles/base-styles.d.ts.map +1 -1
  125. package/styles/base-styles.js +5 -2
  126. package/styles/base-styles.js.map +1 -1
  127. package/styles/themes/theme-alpine.d.ts +9 -1
  128. package/styles/themes/theme-alpine.d.ts.map +1 -1
  129. package/styles/themes/theme-alpine.js +34 -43
  130. package/styles/themes/theme-alpine.js.map +1 -1
  131. package/styles/themes/theme-balham.d.ts +9 -1
  132. package/styles/themes/theme-balham.d.ts.map +1 -1
  133. package/styles/themes/theme-balham.js +33 -42
  134. package/styles/themes/theme-balham.js.map +1 -1
  135. package/styles/themes/theme-material.d.ts +9 -1
  136. package/styles/themes/theme-material.d.ts.map +1 -1
  137. package/styles/themes/theme-material.js +36 -44
  138. package/styles/themes/theme-material.js.map +1 -1
  139. package/styles/themes/theme-quartz.d.ts +14 -1
  140. package/styles/themes/theme-quartz.d.ts.map +1 -1
  141. package/styles/themes/theme-quartz.js +64 -43
  142. package/styles/themes/theme-quartz.js.map +1 -1
  143. package/theme/theme-manager.d.ts +55 -7
  144. package/theme/theme-manager.d.ts.map +1 -1
  145. package/theme/theme-manager.js +139 -35
  146. package/theme/theme-manager.js.map +1 -1
  147. package/theme/themes/light-theme.js +1 -1
  148. package/types/column.types.d.ts +42 -0
  149. package/types/column.types.d.ts.map +1 -1
  150. package/types/column.types.js +26 -1
  151. package/types/column.types.js.map +1 -1
  152. package/types/grid.types.d.ts +90 -2
  153. package/types/grid.types.d.ts.map +1 -1
  154. package/types/theme.types.d.ts +19 -0
  155. package/types/theme.types.d.ts.map +1 -1
  156. package/types/theme.types.js +7 -1
  157. package/types/theme.types.js.map +1 -1
  158. package/styles/themes/theme-dark.d.ts +0 -2
  159. package/styles/themes/theme-dark.d.ts.map +0 -1
  160. package/styles/themes/theme-dark.js +0 -219
  161. 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":"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"}
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
- leftContainer.appendChild(this.buildFilterRow(leftCols, options, true));
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(createDiv('pg-filter-cell pg-filter-cell--auto-group'), filterRow.firstChild);
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
- rightContainer.appendChild(this.buildFilterRow(rightCols, options, false));
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(createDiv('pg-filter-cell pg-filter-cell--auto-group'));
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 — visible on hover; always visible when a filter is active.
690
- if (col.filterable !== false) {
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
- if (options.showColumnMenu !== false) {
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 !== false) {
766
- const input = document.createElement('input');
767
- input.type = 'text';
768
- input.className = 'pg-filter-input';
769
- input.placeholder = `${col.header}…`;
770
- input.setAttribute('data-col-id', col.colId);
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.eventBus.emit(GridEventType.COLUMN_FILTER_CHANGED, {
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