@reforgium/data-grid 2.3.2 → 2.3.4

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/README.md CHANGED
@@ -593,82 +593,84 @@ import { DataGridColumnManager } from '@reforgium/data-grid/column-manager';
593
593
  <re-data-grid [columns]="managedColumns()" ... />
594
594
  ```
595
595
 
596
- Custom trigger via content projection:
597
-
598
- ```html
599
-
600
- <re-data-grid-column-manager
601
- triggerLabel="Columns"
602
- [columns]="managedColumns()"
603
- (columnsChange)="managedColumns.set($event)"
604
- >
605
- <ng-template reDataGridColumnManagerTrigger>Manage columns</ng-template>
606
- </re-data-grid-column-manager>
607
- ```
608
-
609
- Custom column title template (controls stay built-in):
610
-
611
- ```html
612
- <re-data-grid-column-manager
613
- [columns]="managedColumns()"
614
- (columnsChange)="managedColumns.set($event)"
615
- >
616
- <ng-template reDataGridColumnManagerColumnTitle let-title let-column="column">
617
- <span class="font-medium">{{ title }}</span>
618
- </ng-template>
619
- </re-data-grid-column-manager>
620
- ```
621
-
622
- `reDataGridColumnManagerColumnTitle` context:
623
-
624
- - `$implicit` / `title` - resolved column title (`header || key`)
625
- - `column` - current `GridColumn<T>`
626
-
627
- Standalone imports for custom trigger/title markers:
628
-
629
- ```ts
630
- import {
631
- DataGridColumnManager,
632
- DataGridColumnManagerColumnTitleDirective,
633
- DataGridColumnManagerTriggerDirective,
634
- } from '@reforgium/data-grid/column-manager';
635
- ```
636
-
637
- ```ts
638
- @Component({
639
- imports: [
640
- DataGridColumnManager,
641
- DataGridColumnManagerTriggerDirective,
642
- DataGridColumnManagerColumnTitleDirective,
643
- ],
644
- })
645
- export class ExampleComponent {}
646
- ```
647
-
648
- Example with both trigger and column title customizations:
649
-
650
- ```html
651
- <re-data-grid-column-manager [columns]="managedColumns()" (columnsChange)="managedColumns.set($event)">
652
- <ng-template reDataGridColumnManagerTrigger>Manage columns</ng-template>
653
- <ng-template reDataGridColumnManagerColumnTitle let-title>
654
- <span>{{ title }}</span>
655
- </ng-template>
656
- </re-data-grid-column-manager>
657
- ```
658
-
659
- Inputs:
660
-
661
- - `columns: GridColumn<T>[]`
662
- - `triggerLabel?: string`
663
- - `controlsVisible?: boolean` - hides search and "show all / hide optional" panel
664
- - `searchable?: boolean`
665
- - `allowReorder?: boolean`
666
- - `allowPin?: boolean`
667
- - `allowVisibility?: boolean`
668
-
669
- Outputs:
670
-
671
- - `columnsChange: GridColumn<T>[]`
596
+ Custom trigger via content projection:
597
+
598
+ ```html
599
+
600
+ <re-data-grid-column-manager
601
+ triggerLabel="Columns"
602
+ [columns]="managedColumns()"
603
+ (columnsChange)="managedColumns.set($event)"
604
+ >
605
+ <ng-template reDataGridColumnManagerTrigger>Manage columns</ng-template>
606
+ </re-data-grid-column-manager>
607
+ ```
608
+
609
+ Custom column title template (controls stay built-in):
610
+
611
+ ```html
612
+ <re-data-grid-column-manager
613
+ [columns]="managedColumns()"
614
+ (columnsChange)="managedColumns.set($event)"
615
+ >
616
+ <ng-template reDataGridColumnManagerColumnTitle let-title let-column="column">
617
+ <span class="font-medium">{{ title }}</span>
618
+ </ng-template>
619
+ </re-data-grid-column-manager>
620
+ ```
621
+
622
+ `reDataGridColumnManagerColumnTitle` context:
623
+
624
+ - `$implicit` / `title` - resolved column title (`header || key`)
625
+ - `column` - current `GridColumn<T>`
626
+
627
+ Standalone imports for custom trigger/title markers:
628
+
629
+ ```ts
630
+ import {
631
+ DataGridColumnManager,
632
+ DataGridColumnManagerColumnTitleDirective,
633
+ DataGridColumnManagerTriggerDirective,
634
+ } from '@reforgium/data-grid/column-manager';
635
+ ```
636
+
637
+ ```ts
638
+ @Component({
639
+ imports: [
640
+ DataGridColumnManager,
641
+ DataGridColumnManagerTriggerDirective,
642
+ DataGridColumnManagerColumnTitleDirective,
643
+ ],
644
+ })
645
+ export class ExampleComponent {}
646
+ ```
647
+
648
+ Example with both trigger and column title customizations:
649
+
650
+ ```html
651
+ <re-data-grid-column-manager [columns]="managedColumns()" (columnsChange)="managedColumns.set($event)">
652
+ <ng-template reDataGridColumnManagerTrigger>Manage columns</ng-template>
653
+ <ng-template reDataGridColumnManagerColumnTitle let-title>
654
+ <span>{{ title }}</span>
655
+ </ng-template>
656
+ </re-data-grid-column-manager>
657
+ ```
658
+
659
+ Inputs:
660
+
661
+ - `columns: GridColumn<T>[]`
662
+ - `triggerLabel?: string`
663
+ - `showAllLabel?: string`
664
+ - `hideAllLabel?: string`
665
+ - `controlsVisible?: boolean` - hides search and "show all / hide optional" panel
666
+ - `searchable?: boolean`
667
+ - `allowReorder?: boolean`
668
+ - `allowPin?: boolean`
669
+ - `allowVisibility?: boolean`
670
+
671
+ Outputs:
672
+
673
+ - `columnsChange: GridColumn<T>[]`
672
674
 
673
675
  ### Column manager CSS Variables
674
676
 
@@ -194,6 +194,8 @@ class DataGridColumnManager {
194
194
  injector = inject(Injector);
195
195
  columns = input([], ...(ngDevMode ? [{ debugName: "columns" }] : []));
196
196
  triggerLabel = input('Columns', ...(ngDevMode ? [{ debugName: "triggerLabel" }] : []));
197
+ showAllLabel = input('Show all', ...(ngDevMode ? [{ debugName: "showAllLabel" }] : []));
198
+ hideAllLabel = input('Hide All', ...(ngDevMode ? [{ debugName: "hideAllLabel" }] : []));
197
199
  controlsVisible = input(true, { ...(ngDevMode ? { debugName: "controlsVisible" } : {}), transform: booleanAttribute });
198
200
  searchable = input(true, { ...(ngDevMode ? { debugName: "searchable" } : {}), transform: booleanAttribute });
199
201
  searchPlaceholder = input('Search columns...', ...(ngDevMode ? [{ debugName: "searchPlaceholder" }] : []));
@@ -437,15 +439,15 @@ class DataGridColumnManager {
437
439
  this.panelLeft.set(Number.isFinite(nextLeft) ? nextLeft : 0);
438
440
  }
439
441
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DataGridColumnManager, deps: [], target: i0.ɵɵFactoryTarget.Component });
440
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DataGridColumnManager, isStandalone: true, selector: "re-data-grid-column-manager", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, triggerLabel: { classPropertyName: "triggerLabel", publicName: "triggerLabel", isSignal: true, isRequired: false, transformFunction: null }, controlsVisible: { classPropertyName: "controlsVisible", publicName: "controlsVisible", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, allowReorder: { classPropertyName: "allowReorder", publicName: "allowReorder", isSignal: true, isRequired: false, transformFunction: null }, allowPin: { classPropertyName: "allowPin", publicName: "allowPin", isSignal: true, isRequired: false, transformFunction: null }, allowVisibility: { classPropertyName: "allowVisibility", publicName: "allowVisibility", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columnsChange: "columnsChange" }, host: { attributes: { "document:mousedown": "onDocumentMouseDown($event.target)", "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "triggerDirective", first: true, predicate: DataGridColumnManagerTriggerDirective, descendants: true, isSignal: true }, { propertyName: "columnTitleTemplate", first: true, predicate: (DataGridColumnManagerColumnTitleDirective), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "root", first: true, predicate: ["root"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"re-dg-cm\" #root>\n <button\n type=\"button\"\n class=\"re-dg-cm__trigger\"\n [class.re-dg-cm__trigger--open]=\"opened()\"\n [attr.aria-expanded]=\"opened()\"\n [attr.aria-haspopup]=\"'dialog'\"\n (click)=\"toggleOpen()\"\n >\n @if (triggerTemplate(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" />\n } @else {\n <span class=\"re-dg-cm__trigger-label\">{{ triggerLabel() }}</span>\n <span class=\"re-dg-cm__trigger-count\">{{ visibleColumnsCount() }}/{{ state().length }}</span>\n }\n </button>\n\n @if (opened()) {\n <div class=\"re-dg-cm__panel\" #panel role=\"dialog\" [style.left.px]=\"panelLeft()\">\n @let list = filteredColumns();\n\n @if (controlsVisible() && searchable()) {\n <label class=\"re-dg-cm__search\">\n <input\n type=\"search\"\n [value]=\"searchQuery()\"\n [placeholder]=\"searchPlaceholder()\"\n (input)=\"onSearch($event)\"\n />\n </label>\n }\n\n <div class=\"re-dg-cm__title-row\">\n @if (controlsVisible()) {\n <div class=\"re-dg-cm__tools\">\n <button type=\"button\" (click)=\"showAll()\">Show all</button>\n <button type=\"button\" (click)=\"hideOptional()\">Hide All</button>\n </div>\n } @else {\n <span></span>\n }\n\n <span class=\"re-dg-cm__meta\">{{ visibleColumnsCount() }} / {{ state().length }}</span>\n </div>\n\n <div class=\"re-dg-cm__list\">\n @for (column of list; track column.key) {\n @let currentPin = pin(column.key);\n @let disabled = !!column.disabled;\n @let canHideValue = canHideColumn(column.key);\n\n <div\n class=\"re-dg-cm__row\"\n [attr.draggable]=\"allowReorder() && !disabled\"\n [class.re-dg-cm__row--disabled]=\"disabled\"\n [class.re-dg-cm__row--dragging]=\"draggingKey() === column.key\"\n (dragstart)=\"onDragStart($event, column.key)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, column.key)\"\n (dragend)=\"draggingKey.set(null)\"\n >\n <span class=\"re-dg-cm__drag\" title=\"Reorder\">::</span>\n\n <label class=\"re-dg-cm__checkbox\">\n <button\n [class.active]=\"column.visible !== false\"\n [disabled]=\"disabled || !canHideValue\"\n (click)=\"onVisibleChange(column.key)\"\n >\n <re-eye-ic [open]=\"column.visible !== false\" />\n </button>\n @if (columnTitleTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"columnTitleTemplate()!.template\"\n [ngTemplateOutletContext]=\"buildColumnTitleContext(column)\"\n />\n } @else {\n <span>{{ column.header || column.key }}</span>\n }\n </label>\n\n <div class=\"re-dg-cm__actions\">\n @if (allowPin()) {\n <div class=\"re-dg-cm__pin-menu\" data-pin-menu>\n <button\n type=\"button\"\n class=\"re-dg-cm__pin-current\"\n [disabled]=\"disabled\"\n [class.re-dg-cm__action--active]=\"currentPin !== 'none'\"\n [attr.aria-expanded]=\"openedPinMenuKey() === column.key\"\n (click)=\"togglePinMenu($event, column.key)\"\n [title]=\"pinLabel(currentPin)\"\n >\n @if (currentPin === 'left') {\n <re-pin-ic />\n } @else if (currentPin === 'right') {\n <re-pin-ic toRight />\n } @else {\n <re-cross-ic />\n }\n </button>\n\n @if (openedPinMenuKey() === column.key && !disabled) {\n <div class=\"re-dg-cm__pin-popover\" data-pin-menu role=\"menu\">\n <button\n type=\"button\"\n class=\"pin-button\"\n [class.re-dg-cm__action--active]=\"currentPin === 'left'\"\n (click)=\"selectPin(column.key, 'left')\"\n title=\"Pin left\"\n >\n <re-pin-ic />\n </button>\n\n <button\n type=\"button\"\n class=\"pin-button\"\n [class.re-dg-cm__action--active]=\"currentPin === 'none'\"\n (click)=\"selectPin(column.key, 'none')\"\n title=\"Unpin\"\n >\n <re-cross-ic />\n </button>\n\n <button\n type=\"button\"\n class=\"pin-button\"\n [class.re-dg-cm__action--active]=\"currentPin === 'right'\"\n (click)=\"selectPin(column.key, 'right')\"\n title=\"Pin right\"\n >\n <re-pin-ic toRight />\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", styles: [":host{--re-data-grid-cm-gap: .5rem;--re-data-grid-cm-rounded: .625rem;--re-data-grid-cm-border: 1px solid var(--surface-border, #dfe1e6);--re-data-grid-cm-surface: var(--surface-neutral, #fff);--re-data-grid-cm-muted: var(--text-muted, #64748b);--re-data-grid-cm-active: var(--primary-color, #2a90f4);--re-data-grid-cm-shadow: 0 12px 30px rgba(15, 23, 42, .18);display:inline-block;position:relative}.re-dg-cm{position:relative;display:inline-flex;flex-direction:column;gap:var(--re-data-grid-cm-gap)}.re-dg-cm__trigger{display:inline-flex;align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;border:var(--re-data-grid-cm-border);border-radius:999px;background:var(--re-data-grid-cm-surface);color:inherit;cursor:pointer}.re-dg-cm__trigger--open{box-shadow:0 0 0 2px color-mix(in srgb,var(--re-data-grid-cm-active) 25%,transparent)}.re-dg-cm__trigger-label{font-size:.8125rem;font-weight:600}.re-dg-cm__trigger-count{font-size:.75rem;color:var(--re-data-grid-cm-muted)}.re-dg-cm__panel{position:absolute;top:calc(100% + .5rem);left:0;z-index:50;min-width:18rem;width:max-content;max-width:min(24rem,85vw);display:grid;gap:var(--re-data-grid-cm-gap);padding:.75rem;border:var(--re-data-grid-cm-border);border-radius:var(--re-data-grid-cm-rounded);background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__tools,.re-dg-cm__row,.re-dg-cm__actions{display:flex;align-items:center}.re-dg-cm__meta{color:var(--re-data-grid-cm-muted);font-size:.75rem}.re-dg-cm__search input{width:100%;height:2rem;border-radius:.5rem;border:var(--re-data-grid-cm-border);padding:0 .625rem;background:var(--re-data-grid-cm-surface);color:inherit}.re-dg-cm__tools{gap:.5rem}.re-dg-cm__title-row{display:flex;justify-content:space-between}.re-dg-cm__tools button,.re-dg-cm__actions button{color:inherit;cursor:pointer;font-size:.75rem;line-height:1}.re-dg-cm__tools button{height:1.8rem;padding:0 .5rem}.re-dg-cm__actions button{width:1.7rem;height:1.7rem}.re-dg-cm__list{display:grid;gap:.375rem;max-height:22rem;overflow:auto;padding-right:.125rem}.re-dg-cm__row{gap:.5rem;padding:.375rem .5rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:color-mix(in srgb,var(--re-data-grid-cm-surface) 88%,#f8fafc)}.re-dg-cm__row--dragging{opacity:.55}.re-dg-cm__row--disabled{opacity:.6}.re-dg-cm__drag{width:1rem;color:var(--re-data-grid-cm-muted);cursor:grab;-webkit-user-select:none;user-select:none}.re-dg-cm__checkbox{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.re-dg-cm__checkbox>button{color:var(--re-data-grid-cm-muted)}.re-dg-cm__checkbox>button.active{color:var(--re-data-grid-cm-active)}.re-dg-cm__actions{gap:.25rem;margin-left:auto}.re-dg-cm__pin-menu{position:relative}.re-dg-cm__pin-current{width:1.7rem;height:1.7rem}.re-dg-cm__pin-popover{position:absolute;right:0;top:calc(100% + .25rem);z-index:2;display:flex;align-items:center;gap:.25rem;padding:.25rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__action--active{color:var(--re-data-grid-cm-active)!important;font-weight:700}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: EyeIcon, selector: "re-eye-ic", inputs: ["open"] }, { kind: "component", type: CrossIcon, selector: "re-cross-ic" }, { kind: "component", type: PinIcon, selector: "re-pin-ic", inputs: ["toRight"] }] });
442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: DataGridColumnManager, isStandalone: true, selector: "re-data-grid-column-manager", inputs: { columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, triggerLabel: { classPropertyName: "triggerLabel", publicName: "triggerLabel", isSignal: true, isRequired: false, transformFunction: null }, showAllLabel: { classPropertyName: "showAllLabel", publicName: "showAllLabel", isSignal: true, isRequired: false, transformFunction: null }, hideAllLabel: { classPropertyName: "hideAllLabel", publicName: "hideAllLabel", isSignal: true, isRequired: false, transformFunction: null }, controlsVisible: { classPropertyName: "controlsVisible", publicName: "controlsVisible", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, allowReorder: { classPropertyName: "allowReorder", publicName: "allowReorder", isSignal: true, isRequired: false, transformFunction: null }, allowPin: { classPropertyName: "allowPin", publicName: "allowPin", isSignal: true, isRequired: false, transformFunction: null }, allowVisibility: { classPropertyName: "allowVisibility", publicName: "allowVisibility", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { columnsChange: "columnsChange" }, host: { attributes: { "document:mousedown": "onDocumentMouseDown($event.target)", "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "triggerDirective", first: true, predicate: DataGridColumnManagerTriggerDirective, descendants: true, isSignal: true }, { propertyName: "columnTitleTemplate", first: true, predicate: (DataGridColumnManagerColumnTitleDirective), descendants: true, isSignal: true }], viewQueries: [{ propertyName: "root", first: true, predicate: ["root"], descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"re-dg-cm\" #root>\r\n <button\r\n type=\"button\"\r\n [attr.aria-expanded]=\"opened()\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n @if (triggerTemplate(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n <div class=\"re-dg-cm__trigger\" [class.re-dg-cm__trigger--open]=\"opened()\">\r\n <span class=\"re-dg-cm__trigger-label\">{{ triggerLabel() }}</span>\r\n <span class=\"re-dg-cm__trigger-count\">{{ visibleColumnsCount() }}/{{ state().length }}</span>\r\n </div>\r\n }\r\n </button>\r\n\r\n @if (opened()) {\r\n <div class=\"re-dg-cm__panel\" #panel role=\"dialog\" [style.left.px]=\"panelLeft()\">\r\n @let list = filteredColumns();\r\n\r\n @if (controlsVisible() && searchable()) {\r\n <label class=\"re-dg-cm__search\">\r\n <input\r\n type=\"search\"\r\n [value]=\"searchQuery()\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n (input)=\"onSearch($event)\"\r\n />\r\n </label>\r\n }\r\n\r\n <div class=\"re-dg-cm__title-row\">\r\n @if (controlsVisible()) {\r\n <div class=\"re-dg-cm__tools\">\r\n <button type=\"button\" (click)=\"showAll()\">{{ showAllLabel() }}</button>\r\n <button type=\"button\" (click)=\"hideOptional()\">{{ hideAllLabel() }}</button>\r\n </div>\r\n } @else {\r\n <span></span>\r\n }\r\n\r\n <span class=\"re-dg-cm__meta\">{{ visibleColumnsCount() }} / {{ state().length }}</span>\r\n </div>\r\n\r\n <div class=\"re-dg-cm__list\">\r\n @for (column of list; track column.key) {\r\n @let currentPin = pin(column.key);\r\n @let disabled = !!column.disabled;\r\n @let canHideValue = canHideColumn(column.key);\r\n\r\n <div\r\n class=\"re-dg-cm__row\"\r\n [attr.draggable]=\"allowReorder() && !disabled\"\r\n [class.re-dg-cm__row--disabled]=\"disabled\"\r\n [class.re-dg-cm__row--dragging]=\"draggingKey() === column.key\"\r\n (dragstart)=\"onDragStart($event, column.key)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event, column.key)\"\r\n (dragend)=\"draggingKey.set(null)\"\r\n >\r\n <span class=\"re-dg-cm__drag\" title=\"Reorder\">::</span>\r\n\r\n <div class=\"re-dg-cm__checkbox\">\r\n <button\r\n type=\"button\"\r\n [class.active]=\"column.visible !== false\"\r\n [disabled]=\"disabled || !canHideValue\"\r\n (click)=\"onVisibleChange(column.key)\"\r\n >\r\n <re-eye-ic [open]=\"column.visible !== false\" />\r\n </button>\r\n @if (columnTitleTemplate()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"columnTitleTemplate()!.template\"\r\n [ngTemplateOutletContext]=\"buildColumnTitleContext(column)\"\r\n />\r\n } @else {\r\n <span>{{ column.header || column.key }}</span>\r\n }\r\n </div>\r\n\r\n <div class=\"re-dg-cm__actions\">\r\n @if (allowPin()) {\r\n <div class=\"re-dg-cm__pin-menu\" data-pin-menu>\r\n <button\r\n type=\"button\"\r\n class=\"re-dg-cm__pin-current\"\r\n [disabled]=\"disabled\"\r\n [class.re-dg-cm__action--active]=\"currentPin !== 'none'\"\r\n [attr.aria-expanded]=\"openedPinMenuKey() === column.key\"\r\n (click)=\"togglePinMenu($event, column.key)\"\r\n [title]=\"pinLabel(currentPin)\"\r\n >\r\n @if (currentPin === 'left') {\r\n <re-pin-ic />\r\n } @else if (currentPin === 'right') {\r\n <re-pin-ic toRight />\r\n } @else {\r\n <re-cross-ic />\r\n }\r\n </button>\r\n\r\n @if (openedPinMenuKey() === column.key && !disabled) {\r\n <div class=\"re-dg-cm__pin-popover\" data-pin-menu role=\"menu\">\r\n <button\r\n type=\"button\"\r\n class=\"pin-button\"\r\n [class.re-dg-cm__action--active]=\"currentPin === 'left'\"\r\n (click)=\"selectPin(column.key, 'left')\"\r\n title=\"Pin left\"\r\n >\r\n <re-pin-ic />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pin-button\"\r\n [class.re-dg-cm__action--active]=\"currentPin === 'none'\"\r\n (click)=\"selectPin(column.key, 'none')\"\r\n title=\"Unpin\"\r\n >\r\n <re-cross-ic />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pin-button\"\r\n [class.re-dg-cm__action--active]=\"currentPin === 'right'\"\r\n (click)=\"selectPin(column.key, 'right')\"\r\n title=\"Pin right\"\r\n >\r\n <re-pin-ic toRight />\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{--re-data-grid-cm-gap: .5rem;--re-data-grid-cm-rounded: .625rem;--re-data-grid-cm-border: 1px solid var(--surface-border, #dfe1e6);--re-data-grid-cm-surface: var(--surface-neutral, #fff);--re-data-grid-cm-muted: var(--text-muted, #64748b);--re-data-grid-cm-active: var(--primary-color, #2a90f4);--re-data-grid-cm-shadow: 0 12px 30px rgba(15, 23, 42, .18);display:inline-block;position:relative}.re-dg-cm{position:relative;display:inline-flex;flex-direction:column;gap:var(--re-data-grid-cm-gap)}.re-dg-cm__trigger{display:inline-flex;align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;border:var(--re-data-grid-cm-border);border-radius:999px;background:var(--re-data-grid-cm-surface);color:inherit;cursor:pointer}.re-dg-cm__trigger--open{box-shadow:0 0 0 2px color-mix(in srgb,var(--re-data-grid-cm-active) 25%,transparent)}.re-dg-cm__trigger-label{font-size:.8125rem;font-weight:600}.re-dg-cm__trigger-count{font-size:.75rem;color:var(--re-data-grid-cm-muted)}.re-dg-cm__panel{position:absolute;top:calc(100% + .5rem);left:0;z-index:50;min-width:18rem;width:max-content;max-width:min(24rem,85vw);display:grid;gap:var(--re-data-grid-cm-gap);padding:.75rem;border:var(--re-data-grid-cm-border);border-radius:var(--re-data-grid-cm-rounded);background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__tools,.re-dg-cm__row,.re-dg-cm__actions{display:flex;align-items:center}.re-dg-cm__meta{color:var(--re-data-grid-cm-muted);font-size:.75rem}.re-dg-cm__search input{width:100%;height:2rem;border-radius:.5rem;border:var(--re-data-grid-cm-border);padding:0 .625rem;background:var(--re-data-grid-cm-surface);color:inherit}.re-dg-cm__tools{gap:.5rem}.re-dg-cm__title-row{display:flex;justify-content:space-between}.re-dg-cm__tools button,.re-dg-cm__actions button{color:inherit;cursor:pointer;font-size:.75rem;line-height:1}.re-dg-cm__tools button{height:1.8rem;padding:0 .5rem}.re-dg-cm__actions button{width:1.7rem;height:1.7rem}.re-dg-cm__list{display:grid;gap:.375rem;max-height:22rem;overflow:auto;padding-right:.125rem}.re-dg-cm__row{gap:.5rem;padding:.375rem .5rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:color-mix(in srgb,var(--re-data-grid-cm-surface) 88%,#f8fafc)}.re-dg-cm__row--dragging{opacity:.55}.re-dg-cm__row--disabled{opacity:.6}.re-dg-cm__drag{width:1rem;color:var(--re-data-grid-cm-muted);cursor:grab;-webkit-user-select:none;user-select:none}.re-dg-cm__checkbox{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.re-dg-cm__checkbox>button{color:var(--re-data-grid-cm-muted)}.re-dg-cm__checkbox>button.active{color:var(--re-data-grid-cm-active)}.re-dg-cm__actions{gap:.25rem;margin-left:auto}.re-dg-cm__pin-menu{position:relative}.re-dg-cm__pin-current{width:1.7rem;height:1.7rem}.re-dg-cm__pin-popover{position:absolute;right:0;top:calc(100% + .25rem);z-index:2;display:flex;align-items:center;gap:.25rem;padding:.25rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__action--active{color:var(--re-data-grid-cm-active)!important;font-weight:700}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: EyeIcon, selector: "re-eye-ic", inputs: ["open"] }, { kind: "component", type: CrossIcon, selector: "re-cross-ic" }, { kind: "component", type: PinIcon, selector: "re-pin-ic", inputs: ["toRight"] }] });
441
443
  }
442
444
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: DataGridColumnManager, decorators: [{
443
445
  type: Component,
444
446
  args: [{ selector: 're-data-grid-column-manager', standalone: true, host: {
445
447
  'document:mousedown': 'onDocumentMouseDown($event.target)',
446
448
  'window:resize': 'onWindowResize()',
447
- }, imports: [NgTemplateOutlet, EyeIcon, CrossIcon, PinIcon], template: "<div class=\"re-dg-cm\" #root>\n <button\n type=\"button\"\n class=\"re-dg-cm__trigger\"\n [class.re-dg-cm__trigger--open]=\"opened()\"\n [attr.aria-expanded]=\"opened()\"\n [attr.aria-haspopup]=\"'dialog'\"\n (click)=\"toggleOpen()\"\n >\n @if (triggerTemplate(); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" />\n } @else {\n <span class=\"re-dg-cm__trigger-label\">{{ triggerLabel() }}</span>\n <span class=\"re-dg-cm__trigger-count\">{{ visibleColumnsCount() }}/{{ state().length }}</span>\n }\n </button>\n\n @if (opened()) {\n <div class=\"re-dg-cm__panel\" #panel role=\"dialog\" [style.left.px]=\"panelLeft()\">\n @let list = filteredColumns();\n\n @if (controlsVisible() && searchable()) {\n <label class=\"re-dg-cm__search\">\n <input\n type=\"search\"\n [value]=\"searchQuery()\"\n [placeholder]=\"searchPlaceholder()\"\n (input)=\"onSearch($event)\"\n />\n </label>\n }\n\n <div class=\"re-dg-cm__title-row\">\n @if (controlsVisible()) {\n <div class=\"re-dg-cm__tools\">\n <button type=\"button\" (click)=\"showAll()\">Show all</button>\n <button type=\"button\" (click)=\"hideOptional()\">Hide All</button>\n </div>\n } @else {\n <span></span>\n }\n\n <span class=\"re-dg-cm__meta\">{{ visibleColumnsCount() }} / {{ state().length }}</span>\n </div>\n\n <div class=\"re-dg-cm__list\">\n @for (column of list; track column.key) {\n @let currentPin = pin(column.key);\n @let disabled = !!column.disabled;\n @let canHideValue = canHideColumn(column.key);\n\n <div\n class=\"re-dg-cm__row\"\n [attr.draggable]=\"allowReorder() && !disabled\"\n [class.re-dg-cm__row--disabled]=\"disabled\"\n [class.re-dg-cm__row--dragging]=\"draggingKey() === column.key\"\n (dragstart)=\"onDragStart($event, column.key)\"\n (dragover)=\"onDragOver($event)\"\n (drop)=\"onDrop($event, column.key)\"\n (dragend)=\"draggingKey.set(null)\"\n >\n <span class=\"re-dg-cm__drag\" title=\"Reorder\">::</span>\n\n <label class=\"re-dg-cm__checkbox\">\n <button\n [class.active]=\"column.visible !== false\"\n [disabled]=\"disabled || !canHideValue\"\n (click)=\"onVisibleChange(column.key)\"\n >\n <re-eye-ic [open]=\"column.visible !== false\" />\n </button>\n @if (columnTitleTemplate()) {\n <ng-container\n [ngTemplateOutlet]=\"columnTitleTemplate()!.template\"\n [ngTemplateOutletContext]=\"buildColumnTitleContext(column)\"\n />\n } @else {\n <span>{{ column.header || column.key }}</span>\n }\n </label>\n\n <div class=\"re-dg-cm__actions\">\n @if (allowPin()) {\n <div class=\"re-dg-cm__pin-menu\" data-pin-menu>\n <button\n type=\"button\"\n class=\"re-dg-cm__pin-current\"\n [disabled]=\"disabled\"\n [class.re-dg-cm__action--active]=\"currentPin !== 'none'\"\n [attr.aria-expanded]=\"openedPinMenuKey() === column.key\"\n (click)=\"togglePinMenu($event, column.key)\"\n [title]=\"pinLabel(currentPin)\"\n >\n @if (currentPin === 'left') {\n <re-pin-ic />\n } @else if (currentPin === 'right') {\n <re-pin-ic toRight />\n } @else {\n <re-cross-ic />\n }\n </button>\n\n @if (openedPinMenuKey() === column.key && !disabled) {\n <div class=\"re-dg-cm__pin-popover\" data-pin-menu role=\"menu\">\n <button\n type=\"button\"\n class=\"pin-button\"\n [class.re-dg-cm__action--active]=\"currentPin === 'left'\"\n (click)=\"selectPin(column.key, 'left')\"\n title=\"Pin left\"\n >\n <re-pin-ic />\n </button>\n\n <button\n type=\"button\"\n class=\"pin-button\"\n [class.re-dg-cm__action--active]=\"currentPin === 'none'\"\n (click)=\"selectPin(column.key, 'none')\"\n title=\"Unpin\"\n >\n <re-cross-ic />\n </button>\n\n <button\n type=\"button\"\n class=\"pin-button\"\n [class.re-dg-cm__action--active]=\"currentPin === 'right'\"\n (click)=\"selectPin(column.key, 'right')\"\n title=\"Pin right\"\n >\n <re-pin-ic toRight />\n </button>\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n</div>\n", styles: [":host{--re-data-grid-cm-gap: .5rem;--re-data-grid-cm-rounded: .625rem;--re-data-grid-cm-border: 1px solid var(--surface-border, #dfe1e6);--re-data-grid-cm-surface: var(--surface-neutral, #fff);--re-data-grid-cm-muted: var(--text-muted, #64748b);--re-data-grid-cm-active: var(--primary-color, #2a90f4);--re-data-grid-cm-shadow: 0 12px 30px rgba(15, 23, 42, .18);display:inline-block;position:relative}.re-dg-cm{position:relative;display:inline-flex;flex-direction:column;gap:var(--re-data-grid-cm-gap)}.re-dg-cm__trigger{display:inline-flex;align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;border:var(--re-data-grid-cm-border);border-radius:999px;background:var(--re-data-grid-cm-surface);color:inherit;cursor:pointer}.re-dg-cm__trigger--open{box-shadow:0 0 0 2px color-mix(in srgb,var(--re-data-grid-cm-active) 25%,transparent)}.re-dg-cm__trigger-label{font-size:.8125rem;font-weight:600}.re-dg-cm__trigger-count{font-size:.75rem;color:var(--re-data-grid-cm-muted)}.re-dg-cm__panel{position:absolute;top:calc(100% + .5rem);left:0;z-index:50;min-width:18rem;width:max-content;max-width:min(24rem,85vw);display:grid;gap:var(--re-data-grid-cm-gap);padding:.75rem;border:var(--re-data-grid-cm-border);border-radius:var(--re-data-grid-cm-rounded);background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__tools,.re-dg-cm__row,.re-dg-cm__actions{display:flex;align-items:center}.re-dg-cm__meta{color:var(--re-data-grid-cm-muted);font-size:.75rem}.re-dg-cm__search input{width:100%;height:2rem;border-radius:.5rem;border:var(--re-data-grid-cm-border);padding:0 .625rem;background:var(--re-data-grid-cm-surface);color:inherit}.re-dg-cm__tools{gap:.5rem}.re-dg-cm__title-row{display:flex;justify-content:space-between}.re-dg-cm__tools button,.re-dg-cm__actions button{color:inherit;cursor:pointer;font-size:.75rem;line-height:1}.re-dg-cm__tools button{height:1.8rem;padding:0 .5rem}.re-dg-cm__actions button{width:1.7rem;height:1.7rem}.re-dg-cm__list{display:grid;gap:.375rem;max-height:22rem;overflow:auto;padding-right:.125rem}.re-dg-cm__row{gap:.5rem;padding:.375rem .5rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:color-mix(in srgb,var(--re-data-grid-cm-surface) 88%,#f8fafc)}.re-dg-cm__row--dragging{opacity:.55}.re-dg-cm__row--disabled{opacity:.6}.re-dg-cm__drag{width:1rem;color:var(--re-data-grid-cm-muted);cursor:grab;-webkit-user-select:none;user-select:none}.re-dg-cm__checkbox{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.re-dg-cm__checkbox>button{color:var(--re-data-grid-cm-muted)}.re-dg-cm__checkbox>button.active{color:var(--re-data-grid-cm-active)}.re-dg-cm__actions{gap:.25rem;margin-left:auto}.re-dg-cm__pin-menu{position:relative}.re-dg-cm__pin-current{width:1.7rem;height:1.7rem}.re-dg-cm__pin-popover{position:absolute;right:0;top:calc(100% + .25rem);z-index:2;display:flex;align-items:center;gap:.25rem;padding:.25rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__action--active{color:var(--re-data-grid-cm-active)!important;font-weight:700}\n"] }]
448
- }], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], triggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerLabel", required: false }] }], controlsVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlsVisible", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], allowReorder: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowReorder", required: false }] }], allowPin: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowPin", required: false }] }], allowVisibility: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowVisibility", required: false }] }], columnsChange: [{ type: i0.Output, args: ["columnsChange"] }], triggerDirective: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DataGridColumnManagerTriggerDirective), { isSignal: true }] }], columnTitleTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DataGridColumnManagerColumnTitleDirective), { isSignal: true }] }], root: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }] } });
449
+ }, imports: [NgTemplateOutlet, EyeIcon, CrossIcon, PinIcon], template: "<div class=\"re-dg-cm\" #root>\r\n <button\r\n type=\"button\"\r\n [attr.aria-expanded]=\"opened()\"\r\n [attr.aria-haspopup]=\"'dialog'\"\r\n (click)=\"toggleOpen()\"\r\n >\r\n @if (triggerTemplate(); as template) {\r\n <ng-container [ngTemplateOutlet]=\"template\" />\r\n } @else {\r\n <div class=\"re-dg-cm__trigger\" [class.re-dg-cm__trigger--open]=\"opened()\">\r\n <span class=\"re-dg-cm__trigger-label\">{{ triggerLabel() }}</span>\r\n <span class=\"re-dg-cm__trigger-count\">{{ visibleColumnsCount() }}/{{ state().length }}</span>\r\n </div>\r\n }\r\n </button>\r\n\r\n @if (opened()) {\r\n <div class=\"re-dg-cm__panel\" #panel role=\"dialog\" [style.left.px]=\"panelLeft()\">\r\n @let list = filteredColumns();\r\n\r\n @if (controlsVisible() && searchable()) {\r\n <label class=\"re-dg-cm__search\">\r\n <input\r\n type=\"search\"\r\n [value]=\"searchQuery()\"\r\n [placeholder]=\"searchPlaceholder()\"\r\n (input)=\"onSearch($event)\"\r\n />\r\n </label>\r\n }\r\n\r\n <div class=\"re-dg-cm__title-row\">\r\n @if (controlsVisible()) {\r\n <div class=\"re-dg-cm__tools\">\r\n <button type=\"button\" (click)=\"showAll()\">{{ showAllLabel() }}</button>\r\n <button type=\"button\" (click)=\"hideOptional()\">{{ hideAllLabel() }}</button>\r\n </div>\r\n } @else {\r\n <span></span>\r\n }\r\n\r\n <span class=\"re-dg-cm__meta\">{{ visibleColumnsCount() }} / {{ state().length }}</span>\r\n </div>\r\n\r\n <div class=\"re-dg-cm__list\">\r\n @for (column of list; track column.key) {\r\n @let currentPin = pin(column.key);\r\n @let disabled = !!column.disabled;\r\n @let canHideValue = canHideColumn(column.key);\r\n\r\n <div\r\n class=\"re-dg-cm__row\"\r\n [attr.draggable]=\"allowReorder() && !disabled\"\r\n [class.re-dg-cm__row--disabled]=\"disabled\"\r\n [class.re-dg-cm__row--dragging]=\"draggingKey() === column.key\"\r\n (dragstart)=\"onDragStart($event, column.key)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event, column.key)\"\r\n (dragend)=\"draggingKey.set(null)\"\r\n >\r\n <span class=\"re-dg-cm__drag\" title=\"Reorder\">::</span>\r\n\r\n <div class=\"re-dg-cm__checkbox\">\r\n <button\r\n type=\"button\"\r\n [class.active]=\"column.visible !== false\"\r\n [disabled]=\"disabled || !canHideValue\"\r\n (click)=\"onVisibleChange(column.key)\"\r\n >\r\n <re-eye-ic [open]=\"column.visible !== false\" />\r\n </button>\r\n @if (columnTitleTemplate()) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"columnTitleTemplate()!.template\"\r\n [ngTemplateOutletContext]=\"buildColumnTitleContext(column)\"\r\n />\r\n } @else {\r\n <span>{{ column.header || column.key }}</span>\r\n }\r\n </div>\r\n\r\n <div class=\"re-dg-cm__actions\">\r\n @if (allowPin()) {\r\n <div class=\"re-dg-cm__pin-menu\" data-pin-menu>\r\n <button\r\n type=\"button\"\r\n class=\"re-dg-cm__pin-current\"\r\n [disabled]=\"disabled\"\r\n [class.re-dg-cm__action--active]=\"currentPin !== 'none'\"\r\n [attr.aria-expanded]=\"openedPinMenuKey() === column.key\"\r\n (click)=\"togglePinMenu($event, column.key)\"\r\n [title]=\"pinLabel(currentPin)\"\r\n >\r\n @if (currentPin === 'left') {\r\n <re-pin-ic />\r\n } @else if (currentPin === 'right') {\r\n <re-pin-ic toRight />\r\n } @else {\r\n <re-cross-ic />\r\n }\r\n </button>\r\n\r\n @if (openedPinMenuKey() === column.key && !disabled) {\r\n <div class=\"re-dg-cm__pin-popover\" data-pin-menu role=\"menu\">\r\n <button\r\n type=\"button\"\r\n class=\"pin-button\"\r\n [class.re-dg-cm__action--active]=\"currentPin === 'left'\"\r\n (click)=\"selectPin(column.key, 'left')\"\r\n title=\"Pin left\"\r\n >\r\n <re-pin-ic />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pin-button\"\r\n [class.re-dg-cm__action--active]=\"currentPin === 'none'\"\r\n (click)=\"selectPin(column.key, 'none')\"\r\n title=\"Unpin\"\r\n >\r\n <re-cross-ic />\r\n </button>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"pin-button\"\r\n [class.re-dg-cm__action--active]=\"currentPin === 'right'\"\r\n (click)=\"selectPin(column.key, 'right')\"\r\n title=\"Pin right\"\r\n >\r\n <re-pin-ic toRight />\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [":host{--re-data-grid-cm-gap: .5rem;--re-data-grid-cm-rounded: .625rem;--re-data-grid-cm-border: 1px solid var(--surface-border, #dfe1e6);--re-data-grid-cm-surface: var(--surface-neutral, #fff);--re-data-grid-cm-muted: var(--text-muted, #64748b);--re-data-grid-cm-active: var(--primary-color, #2a90f4);--re-data-grid-cm-shadow: 0 12px 30px rgba(15, 23, 42, .18);display:inline-block;position:relative}.re-dg-cm{position:relative;display:inline-flex;flex-direction:column;gap:var(--re-data-grid-cm-gap)}.re-dg-cm__trigger{display:inline-flex;align-items:center;gap:.5rem;height:2.25rem;padding:0 .75rem;border:var(--re-data-grid-cm-border);border-radius:999px;background:var(--re-data-grid-cm-surface);color:inherit;cursor:pointer}.re-dg-cm__trigger--open{box-shadow:0 0 0 2px color-mix(in srgb,var(--re-data-grid-cm-active) 25%,transparent)}.re-dg-cm__trigger-label{font-size:.8125rem;font-weight:600}.re-dg-cm__trigger-count{font-size:.75rem;color:var(--re-data-grid-cm-muted)}.re-dg-cm__panel{position:absolute;top:calc(100% + .5rem);left:0;z-index:50;min-width:18rem;width:max-content;max-width:min(24rem,85vw);display:grid;gap:var(--re-data-grid-cm-gap);padding:.75rem;border:var(--re-data-grid-cm-border);border-radius:var(--re-data-grid-cm-rounded);background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__tools,.re-dg-cm__row,.re-dg-cm__actions{display:flex;align-items:center}.re-dg-cm__meta{color:var(--re-data-grid-cm-muted);font-size:.75rem}.re-dg-cm__search input{width:100%;height:2rem;border-radius:.5rem;border:var(--re-data-grid-cm-border);padding:0 .625rem;background:var(--re-data-grid-cm-surface);color:inherit}.re-dg-cm__tools{gap:.5rem}.re-dg-cm__title-row{display:flex;justify-content:space-between}.re-dg-cm__tools button,.re-dg-cm__actions button{color:inherit;cursor:pointer;font-size:.75rem;line-height:1}.re-dg-cm__tools button{height:1.8rem;padding:0 .5rem}.re-dg-cm__actions button{width:1.7rem;height:1.7rem}.re-dg-cm__list{display:grid;gap:.375rem;max-height:22rem;overflow:auto;padding-right:.125rem}.re-dg-cm__row{gap:.5rem;padding:.375rem .5rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:color-mix(in srgb,var(--re-data-grid-cm-surface) 88%,#f8fafc)}.re-dg-cm__row--dragging{opacity:.55}.re-dg-cm__row--disabled{opacity:.6}.re-dg-cm__drag{width:1rem;color:var(--re-data-grid-cm-muted);cursor:grab;-webkit-user-select:none;user-select:none}.re-dg-cm__checkbox{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;font-size:.8125rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.re-dg-cm__checkbox>button{color:var(--re-data-grid-cm-muted)}.re-dg-cm__checkbox>button.active{color:var(--re-data-grid-cm-active)}.re-dg-cm__actions{gap:.25rem;margin-left:auto}.re-dg-cm__pin-menu{position:relative}.re-dg-cm__pin-current{width:1.7rem;height:1.7rem}.re-dg-cm__pin-popover{position:absolute;right:0;top:calc(100% + .25rem);z-index:2;display:flex;align-items:center;gap:.25rem;padding:.25rem;border:var(--re-data-grid-cm-border);border-radius:.5rem;background:var(--re-data-grid-cm-surface);box-shadow:var(--re-data-grid-cm-shadow)}.re-dg-cm__action--active{color:var(--re-data-grid-cm-active)!important;font-weight:700}\n"] }]
450
+ }], ctorParameters: () => [], propDecorators: { columns: [{ type: i0.Input, args: [{ isSignal: true, alias: "columns", required: false }] }], triggerLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerLabel", required: false }] }], showAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAllLabel", required: false }] }], hideAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideAllLabel", required: false }] }], controlsVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "controlsVisible", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], allowReorder: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowReorder", required: false }] }], allowPin: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowPin", required: false }] }], allowVisibility: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowVisibility", required: false }] }], columnsChange: [{ type: i0.Output, args: ["columnsChange"] }], triggerDirective: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DataGridColumnManagerTriggerDirective), { isSignal: true }] }], columnTitleTemplate: [{ type: i0.ContentChild, args: [i0.forwardRef(() => DataGridColumnManagerColumnTitleDirective), { isSignal: true }] }], root: [{ type: i0.ViewChild, args: ['root', { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }] } });
449
451
 
450
452
  /**
451
453
  * Generated bundle index. Do not edit.
@@ -1,4 +1,4 @@
1
- import { c as computeScrollbarState, a as clampThumbTop, m as mapThumbTopToScrollTop } from './reforgium-data-grid-reforgium-data-grid-YSzBRJ5h.mjs';
1
+ import { c as computeScrollbarState, a as clampThumbTop, m as mapThumbTopToScrollTop } from './reforgium-data-grid-reforgium-data-grid-DDt9eHYx.mjs';
2
2
 
3
3
  function createGridOverlayScrollFeature(ctx) {
4
4
  const showScrollbar = () => {
@@ -76,4 +76,4 @@ function createGridOverlayScrollFeature(ctx) {
76
76
  }
77
77
 
78
78
  export { createGridOverlayScrollFeature };
79
- //# sourceMappingURL=reforgium-data-grid-grid-overlay-scroll.feature-C-_Cnt4M.mjs.map
79
+ //# sourceMappingURL=reforgium-data-grid-grid-overlay-scroll.feature-sTDtb2P0.mjs.map
@@ -1415,7 +1415,7 @@ function createGridExpanderFeature(ctx) {
1415
1415
  return map;
1416
1416
  });
1417
1417
  const columns = ctx
1418
- .getExtendedColumns()
1418
+ .getVmColumns()
1419
1419
  .map((col) => (col.expandBy === column.key ? { ...col, visible: expanded } : col));
1420
1420
  ctx.setVmColumns(columns);
1421
1421
  };
@@ -3159,7 +3159,7 @@ class DataGrid {
3159
3159
  if (this.overlayScrollFeaturePromise) {
3160
3160
  return this.overlayScrollFeaturePromise;
3161
3161
  }
3162
- this.overlayScrollFeaturePromise = import('./reforgium-data-grid-grid-overlay-scroll.feature-C-_Cnt4M.mjs').then(({ createGridOverlayScrollFeature }) => {
3162
+ this.overlayScrollFeaturePromise = import('./reforgium-data-grid-grid-overlay-scroll.feature-sTDtb2P0.mjs').then(({ createGridOverlayScrollFeature }) => {
3163
3163
  const feature = createGridOverlayScrollFeature({
3164
3164
  getScrollElement: () => this.scrollEl()?.nativeElement ?? null,
3165
3165
  getThumbTop: () => this.vm.thumbTopPx(),
@@ -3284,4 +3284,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
3284
3284
  */
3285
3285
 
3286
3286
  export { DataGridTypeCellTemplateDirective as D, clampThumbTop as a, DataGridCellTemplateDirective as b, computeScrollbarState as c, DataGridHeaderTemplateDirective as d, DataGridRowDirective as e, DataGridDeclarativeColumn as f, DataGridDeclarativeHeaderDirective as g, DataGridDeclarativeCellDirective as h, DataGridCellEmptyDirective as i, DataGridCellLoadingDirective as j, DataGridStickyRowDirective as k, DataGridSortIconDirective as l, mapThumbTopToScrollTop as m, DataGridExpanderIconDirective as n, DATA_GRID_CONFIG as o, DEFAULT_DATA_GRID_DEFAULTS as p, provideDataGridDefaults as q, DataGrid as r };
3287
- //# sourceMappingURL=reforgium-data-grid-reforgium-data-grid-YSzBRJ5h.mjs.map
3287
+ //# sourceMappingURL=reforgium-data-grid-reforgium-data-grid-DDt9eHYx.mjs.map
@@ -1,2 +1,2 @@
1
- export { o as DATA_GRID_CONFIG, p as DEFAULT_DATA_GRID_DEFAULTS, r as DataGrid, i as DataGridCellEmptyDirective, j as DataGridCellLoadingDirective, b as DataGridCellTemplateDirective, h as DataGridDeclarativeCellDirective, f as DataGridDeclarativeColumn, g as DataGridDeclarativeHeaderDirective, n as DataGridExpanderIconDirective, d as DataGridHeaderTemplateDirective, e as DataGridRowDirective, l as DataGridSortIconDirective, k as DataGridStickyRowDirective, D as DataGridTypeCellTemplateDirective, q as provideDataGridDefaults } from './reforgium-data-grid-reforgium-data-grid-YSzBRJ5h.mjs';
1
+ export { o as DATA_GRID_CONFIG, p as DEFAULT_DATA_GRID_DEFAULTS, r as DataGrid, i as DataGridCellEmptyDirective, j as DataGridCellLoadingDirective, b as DataGridCellTemplateDirective, h as DataGridDeclarativeCellDirective, f as DataGridDeclarativeColumn, g as DataGridDeclarativeHeaderDirective, n as DataGridExpanderIconDirective, d as DataGridHeaderTemplateDirective, e as DataGridRowDirective, l as DataGridSortIconDirective, k as DataGridStickyRowDirective, D as DataGridTypeCellTemplateDirective, q as provideDataGridDefaults } from './reforgium-data-grid-reforgium-data-grid-DDt9eHYx.mjs';
2
2
  //# sourceMappingURL=reforgium-data-grid.mjs.map
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.3.2",
2
+ "version": "2.3.4",
3
3
  "name": "@reforgium/data-grid",
4
4
  "description": "reforgium DataGrid component",
5
5
  "author": "rtommievich",
@@ -21,6 +21,8 @@ declare class DataGridColumnManager<Data extends RowLike = RowLike> {
21
21
  private injector;
22
22
  columns: _angular_core.InputSignal<GridColumn<Data>[]>;
23
23
  triggerLabel: _angular_core.InputSignal<string>;
24
+ showAllLabel: _angular_core.InputSignal<string>;
25
+ hideAllLabel: _angular_core.InputSignal<string>;
24
26
  controlsVisible: _angular_core.InputSignalWithTransform<boolean, unknown>;
25
27
  searchable: _angular_core.InputSignalWithTransform<boolean, unknown>;
26
28
  searchPlaceholder: _angular_core.InputSignal<string>;
@@ -67,7 +69,7 @@ declare class DataGridColumnManager<Data extends RowLike = RowLike> {
67
69
  private schedulePanelPositioning;
68
70
  private positionPanel;
69
71
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DataGridColumnManager<any>, never>;
70
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataGridColumnManager<any>, "re-data-grid-column-manager", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "controlsVisible": { "alias": "controlsVisible"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "allowReorder": { "alias": "allowReorder"; "required": false; "isSignal": true; }; "allowPin": { "alias": "allowPin"; "required": false; "isSignal": true; }; "allowVisibility": { "alias": "allowVisibility"; "required": false; "isSignal": true; }; }, { "columnsChange": "columnsChange"; }, ["triggerDirective", "columnTitleTemplate"], never, true, never>;
72
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DataGridColumnManager<any>, "re-data-grid-column-manager", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "showAllLabel": { "alias": "showAllLabel"; "required": false; "isSignal": true; }; "hideAllLabel": { "alias": "hideAllLabel"; "required": false; "isSignal": true; }; "controlsVisible": { "alias": "controlsVisible"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "allowReorder": { "alias": "allowReorder"; "required": false; "isSignal": true; }; "allowPin": { "alias": "allowPin"; "required": false; "isSignal": true; }; "allowVisibility": { "alias": "allowVisibility"; "required": false; "isSignal": true; }; }, { "columnsChange": "columnsChange"; }, ["triggerDirective", "columnTitleTemplate"], never, true, never>;
71
73
  }
72
74
 
73
75
  declare class DataGridColumnManagerTriggerDirective {