bways-grid 0.0.6 → 0.0.7

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, HostListener, Output, Input, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, HostBinding, Injectable, PLATFORM_ID, Inject, NgModule } from '@angular/core';
2
+ import { EventEmitter, HostListener, Output, Input, Directive, ViewEncapsulation, ChangeDetectionStrategy, Component, HostBinding, inject, ChangeDetectorRef, Injectable, PLATFORM_ID, Inject, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule, isPlatformBrowser } from '@angular/common';
5
5
  import * as i3$1 from '@angular/cdk/scrolling';
@@ -1656,6 +1656,8 @@ class FilterToolPanelComponent {
1656
1656
  filterApplied = new EventEmitter();
1657
1657
  conditionFilterChanged = new EventEmitter();
1658
1658
  clearAllFilters = new EventEmitter();
1659
+ saveFiltersRequested = new EventEmitter();
1660
+ filtersImported = new EventEmitter();
1659
1661
  sections = [];
1660
1662
  _loadedFields = new Set();
1661
1663
  constructor(cdr) {
@@ -1922,8 +1924,27 @@ class FilterToolPanelComponent {
1922
1924
  trackByField(index, section) {
1923
1925
  return section.column.field;
1924
1926
  }
1927
+ onFileSelected(event) {
1928
+ const file = event.target.files?.[0];
1929
+ if (!file)
1930
+ return;
1931
+ const reader = new FileReader();
1932
+ reader.onload = (e) => {
1933
+ try {
1934
+ const json = JSON.parse(e.target?.result);
1935
+ this.filtersImported.emit(json);
1936
+ // Reset input so importing same file again triggers change
1937
+ event.target.value = '';
1938
+ }
1939
+ catch (err) {
1940
+ console.error('Failed to parse filter JSON:', err);
1941
+ alert('Invalid filter file format.');
1942
+ }
1943
+ };
1944
+ reader.readAsText(file);
1945
+ }
1925
1946
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FilterToolPanelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1926
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: FilterToolPanelComponent, isStandalone: true, selector: "ug-filter-tool-panel", inputs: { columns: "columns", rowData: "rowData", activeFilters: "activeFilters", conditionFilters: "conditionFilters" }, outputs: { filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters" }, usesOnChanges: true, ngImport: i0, template: `
1947
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: FilterToolPanelComponent, isStandalone: true, selector: "ug-filter-tool-panel", inputs: { columns: "columns", rowData: "rowData", activeFilters: "activeFilters", conditionFilters: "conditionFilters" }, outputs: { filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters", saveFiltersRequested: "saveFiltersRequested", filtersImported: "filtersImported" }, usesOnChanges: true, ngImport: i0, template: `
1927
1948
  <div class="ug-ftp-wrapper">
1928
1949
  <!-- Global Toolbar -->
1929
1950
  <div class="ug-ftp-toolbar">
@@ -1939,6 +1960,18 @@ class FilterToolPanelComponent {
1939
1960
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
1940
1961
  Clear All
1941
1962
  </button>
1963
+
1964
+ <div style="flex: 1"></div>
1965
+
1966
+ <button class="ug-ftp-btn" (click)="saveFiltersRequested.emit()" title="Save Filters to JSON">
1967
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path><polyline points="17 21 17 13 7 13 7 21"></polyline><polyline points="7 3 7 8 15 8"></polyline></svg>
1968
+ Save
1969
+ </button>
1970
+ <button class="ug-ftp-btn" (click)="fileInput.click()" title="Import Filters from JSON">
1971
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg>
1972
+ Import
1973
+ </button>
1974
+ <input #fileInput type="file" accept=".json" style="display: none" (change)="onFileSelected($event)">
1942
1975
  </div>
1943
1976
 
1944
1977
  <!-- Column Filter Sections -->
@@ -2055,6 +2088,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2055
2088
  <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
2056
2089
  Clear All
2057
2090
  </button>
2091
+
2092
+ <div style="flex: 1"></div>
2093
+
2094
+ <button class="ug-ftp-btn" (click)="saveFiltersRequested.emit()" title="Save Filters to JSON">
2095
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path><polyline points="17 21 17 13 7 13 7 21"></polyline><polyline points="7 3 7 8 15 8"></polyline></svg>
2096
+ Save
2097
+ </button>
2098
+ <button class="ug-ftp-btn" (click)="fileInput.click()" title="Import Filters from JSON">
2099
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path><polyline points="17 8 12 3 7 8"></polyline><line x1="12" y1="3" x2="12" y2="15"></line></svg>
2100
+ Import
2101
+ </button>
2102
+ <input #fileInput type="file" accept=".json" style="display: none" (change)="onFileSelected($event)">
2058
2103
  </div>
2059
2104
 
2060
2105
  <!-- Column Filter Sections -->
@@ -2166,6 +2211,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2166
2211
  type: Output
2167
2212
  }], clearAllFilters: [{
2168
2213
  type: Output
2214
+ }], saveFiltersRequested: [{
2215
+ type: Output
2216
+ }], filtersImported: [{
2217
+ type: Output
2169
2218
  }] } });
2170
2219
 
2171
2220
  class SideBarComponent {
@@ -2186,17 +2235,23 @@ class SideBarComponent {
2186
2235
  filterApplied = new EventEmitter();
2187
2236
  conditionFilterChanged = new EventEmitter();
2188
2237
  clearAllFilters = new EventEmitter();
2238
+ saveFiltersRequested = new EventEmitter();
2239
+ filtersImported = new EventEmitter();
2189
2240
  activeTab = 'columns'; // Open by default for demo parity
2241
+ cdr = inject(ChangeDetectorRef);
2190
2242
  toggleTab(tab) {
2243
+ console.log('Sidebar toggleTab requested:', tab, 'Current:', this.activeTab);
2191
2244
  if (this.activeTab === tab) {
2192
2245
  this.activeTab = null;
2193
2246
  }
2194
2247
  else {
2195
2248
  this.activeTab = tab;
2196
2249
  }
2250
+ this.cdr.markForCheck();
2197
2251
  }
2198
2252
  closePanel() {
2199
2253
  this.activeTab = null;
2254
+ this.cdr.markForCheck();
2200
2255
  }
2201
2256
  onColumnsChanged(updatedCols) {
2202
2257
  this.columnsUpdated.emit(updatedCols);
@@ -2226,7 +2281,7 @@ class SideBarComponent {
2226
2281
  this.pivotModelUpdated.emit(model);
2227
2282
  }
2228
2283
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SideBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2229
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SideBarComponent, isStandalone: true, selector: "ug-side-bar", inputs: { columns: "columns", rowData: "rowData", activeFilters: "activeFilters", conditionFilters: "conditionFilters", groupModel: "groupModel", valuesModel: "valuesModel", pivotMode: "pivotMode", pivotColumns: "pivotColumns" }, outputs: { columnsUpdated: "columnsUpdated", groupModelUpdated: "groupModelUpdated", valuesModelUpdated: "valuesModelUpdated", pivotModeUpdated: "pivotModeUpdated", pivotModelUpdated: "pivotModelUpdated", exportExcelClicked: "exportExcelClicked", filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters" }, ngImport: i0, template: `
2284
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: SideBarComponent, isStandalone: true, selector: "ug-side-bar", inputs: { columns: "columns", rowData: "rowData", activeFilters: "activeFilters", conditionFilters: "conditionFilters", groupModel: "groupModel", valuesModel: "valuesModel", pivotMode: "pivotMode", pivotColumns: "pivotColumns" }, outputs: { columnsUpdated: "columnsUpdated", groupModelUpdated: "groupModelUpdated", valuesModelUpdated: "valuesModelUpdated", pivotModeUpdated: "pivotModeUpdated", pivotModelUpdated: "pivotModelUpdated", exportExcelClicked: "exportExcelClicked", filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters", saveFiltersRequested: "saveFiltersRequested", filtersImported: "filtersImported" }, ngImport: i0, template: `
2230
2285
  <div class="ug-side-bar-wrapper">
2231
2286
  <!-- Content Area -->
2232
2287
  <div class="ug-side-bar-content" *ngIf="activeTab">
@@ -2261,7 +2316,9 @@ class SideBarComponent {
2261
2316
  [conditionFilters]="conditionFilters"
2262
2317
  (filterApplied)="onFilterApplied($event)"
2263
2318
  (conditionFilterChanged)="onConditionFilterChanged($event)"
2264
- (clearAllFilters)="onClearAllFilters()">
2319
+ (clearAllFilters)="onClearAllFilters()"
2320
+ (saveFiltersRequested)="saveFiltersRequested.emit()"
2321
+ (filtersImported)="filtersImported.emit($event)">
2265
2322
  </ug-filter-tool-panel>
2266
2323
  </div>
2267
2324
  </div>
@@ -2283,7 +2340,7 @@ class SideBarComponent {
2283
2340
  </div>
2284
2341
  </div>
2285
2342
  </div>
2286
- `, isInline: true, styles: [".ug-side-bar-wrapper{display:flex;flex-direction:row;height:100%;background-color:var(--ug-bg-color);border-left:1px solid var(--ug-border-color);font-family:var(--ug-font-family, sans-serif);font-size:var(--ug-font-size, 13px);color:var(--ug-header-color)}.ug-side-bar-content{display:flex;flex-direction:column;width:250px;height:100%;border-right:1px solid var(--ug-border-color)}.ug-side-bar-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--ug-border-color);background-color:var(--ug-header-bg)}.ug-side-bar-title{font-family:var(--ug-font-family, sans-serif);font-size:var(--ug-font-size, 13px);font-weight:var(--ug-header-font-weight, 500);color:var(--ug-header-color)}.ug-side-bar-close{cursor:pointer;color:var(--ug-icon-color);display:flex;align-items:center;justify-content:center}.ug-side-bar-close:hover{color:var(--ug-primary-color)}.ug-side-bar-body{flex:1;overflow-y:auto;overflow-x:hidden;background-color:var(--ug-bg-color)}.ug-side-bar-toolbar{display:flex;flex-direction:column;width:40px;height:100%;background-color:var(--ug-header-bg);padding-top:8px;gap:8px;align-items:center}.ug-side-bar-tab{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px 4px;cursor:pointer;color:var(--ug-icon-color);border-left:2px solid transparent;width:100%;box-sizing:border-box}.ug-side-bar-tab span{writing-mode:vertical-rl;transform:rotate(180deg);margin-top:12px;font-family:var(--ug-font-family, sans-serif);font-weight:var(--ug-header-font-weight, 500);font-size:var(--ug-font-size, 13px);letter-spacing:.5px}.ug-side-bar-tab:hover{color:var(--ug-primary-color);background-color:var(--ug-row-hover-bg)}.ug-side-bar-tab.active{color:var(--ug-primary-color);background-color:var(--ug-bg-color);border-left:2px solid var(--ug-primary-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ColumnToolPanelComponent, selector: "ug-column-tool-panel", inputs: ["columns", "groupModel", "valuesModel", "pivotMode", "pivotColumns"], outputs: ["columnsUpdated", "groupModelChanged", "valuesModelChanged", "pivotModeChanged", "pivotModelChanged", "exportExcelClicked"] }, { kind: "component", type: FilterToolPanelComponent, selector: "ug-filter-tool-panel", inputs: ["columns", "rowData", "activeFilters", "conditionFilters"], outputs: ["filterApplied", "conditionFilterChanged", "clearAllFilters"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2343
+ `, isInline: true, styles: [".ug-side-bar-wrapper{display:flex;flex-direction:row;height:100%;background-color:var(--ug-bg-color);border-left:1px solid var(--ug-border-color);font-family:var(--ug-font-family, sans-serif);font-size:var(--ug-font-size, 13px);color:var(--ug-header-color)}.ug-side-bar-content{display:flex;flex-direction:column;width:250px;height:100%;border-right:1px solid var(--ug-border-color)}.ug-side-bar-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--ug-border-color);background-color:var(--ug-header-bg)}.ug-side-bar-title{font-family:var(--ug-font-family, sans-serif);font-size:var(--ug-font-size, 13px);font-weight:var(--ug-header-font-weight, 500);color:var(--ug-header-color)}.ug-side-bar-close{cursor:pointer;color:var(--ug-icon-color);display:flex;align-items:center;justify-content:center}.ug-side-bar-close:hover{color:var(--ug-primary-color)}.ug-side-bar-body{flex:1;overflow-y:auto;overflow-x:hidden;background-color:var(--ug-bg-color)}.ug-side-bar-toolbar{display:flex;flex-direction:column;width:40px;height:100%;background-color:var(--ug-header-bg);padding-top:8px;gap:8px;align-items:center}.ug-side-bar-tab{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:8px 4px;cursor:pointer;color:var(--ug-icon-color);border-left:2px solid transparent;width:100%;box-sizing:border-box}.ug-side-bar-tab span{writing-mode:vertical-rl;transform:rotate(180deg);margin-top:12px;font-family:var(--ug-font-family, sans-serif);font-weight:var(--ug-header-font-weight, 500);font-size:var(--ug-font-size, 13px);letter-spacing:.5px}.ug-side-bar-tab:hover{color:var(--ug-primary-color);background-color:var(--ug-row-hover-bg)}.ug-side-bar-tab.active{color:var(--ug-primary-color);background-color:var(--ug-bg-color);border-left:2px solid var(--ug-primary-color)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ColumnToolPanelComponent, selector: "ug-column-tool-panel", inputs: ["columns", "groupModel", "valuesModel", "pivotMode", "pivotColumns"], outputs: ["columnsUpdated", "groupModelChanged", "valuesModelChanged", "pivotModeChanged", "pivotModelChanged", "exportExcelClicked"] }, { kind: "component", type: FilterToolPanelComponent, selector: "ug-filter-tool-panel", inputs: ["columns", "rowData", "activeFilters", "conditionFilters"], outputs: ["filterApplied", "conditionFilterChanged", "clearAllFilters", "saveFiltersRequested", "filtersImported"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2287
2344
  }
2288
2345
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SideBarComponent, decorators: [{
2289
2346
  type: Component,
@@ -2322,7 +2379,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2322
2379
  [conditionFilters]="conditionFilters"
2323
2380
  (filterApplied)="onFilterApplied($event)"
2324
2381
  (conditionFilterChanged)="onConditionFilterChanged($event)"
2325
- (clearAllFilters)="onClearAllFilters()">
2382
+ (clearAllFilters)="onClearAllFilters()"
2383
+ (saveFiltersRequested)="saveFiltersRequested.emit()"
2384
+ (filtersImported)="filtersImported.emit($event)">
2326
2385
  </ug-filter-tool-panel>
2327
2386
  </div>
2328
2387
  </div>
@@ -2379,6 +2438,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2379
2438
  type: Output
2380
2439
  }], clearAllFilters: [{
2381
2440
  type: Output
2441
+ }], saveFiltersRequested: [{
2442
+ type: Output
2443
+ }], filtersImported: [{
2444
+ type: Output
2382
2445
  }] } });
2383
2446
 
2384
2447
  class GridFlattenerService {
@@ -3469,6 +3532,64 @@ class UltraGridComponent {
3469
3532
  }
3470
3533
  this.applyLocalData();
3471
3534
  }
3535
+ // --- Save / Import Filters ---
3536
+ handleSaveFilters() {
3537
+ const state = {
3538
+ activeFilters: {},
3539
+ conditionFilters: {}
3540
+ };
3541
+ // Convert Map<string, Set<any>> to Record<string, any[]>
3542
+ if (this.activeFilters.size > 0) {
3543
+ for (const [field, selectedSet] of this.activeFilters.entries()) {
3544
+ state.activeFilters[field] = Array.from(selectedSet);
3545
+ }
3546
+ }
3547
+ // Convert Map to Object
3548
+ if (this.conditionFilters.size > 0) {
3549
+ state.conditionFilters = Object.fromEntries(this.conditionFilters);
3550
+ }
3551
+ const json = JSON.stringify(state, null, 2);
3552
+ const blob = new Blob([json], { type: 'application/json' });
3553
+ const url = URL.createObjectURL(blob);
3554
+ const link = document.createElement('a');
3555
+ link.href = url;
3556
+ link.download = `grid-filters-${new Date().toISOString().slice(0, 10)}.json`;
3557
+ link.click();
3558
+ URL.revokeObjectURL(url);
3559
+ }
3560
+ handleImportFilters(data) {
3561
+ if (!data)
3562
+ return;
3563
+ console.log('Importing filters:', data);
3564
+ try {
3565
+ // Restore activeFilters (Record -> Map<string, Set>)
3566
+ // Important: We create a NEW Map instance to trigger Output/Input change detection
3567
+ const newActiveFilters = new Map();
3568
+ if (data.activeFilters) {
3569
+ Object.keys(data.activeFilters).forEach(field => {
3570
+ newActiveFilters.set(field, new Set(data.activeFilters[field]));
3571
+ });
3572
+ }
3573
+ this.activeFilters = newActiveFilters;
3574
+ // Restore conditionFilters (Object -> Map)
3575
+ // Important: We create a NEW Map instance to trigger Output/Input change detection
3576
+ if (data.conditionFilters) {
3577
+ this.conditionFilters = new Map(Object.entries(data.conditionFilters));
3578
+ }
3579
+ else {
3580
+ this.conditionFilters = new Map();
3581
+ }
3582
+ // Refresh grid
3583
+ this.currentPage = 1;
3584
+ this.applyLocalData();
3585
+ this.cdr.markForCheck();
3586
+ console.log('Filters imported and applied successfully.');
3587
+ }
3588
+ catch (err) {
3589
+ console.error('Error applying imported filters:', err);
3590
+ alert('Error applying filters. Please ensure the file format is correct.');
3591
+ }
3592
+ }
3472
3593
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UltraGridComponent, deps: [{ token: PLATFORM_ID }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: GridFlattenerService }, { token: ExcelExportService }], target: i0.ɵɵFactoryTarget.Component });
3473
3594
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.18", type: UltraGridComponent, isStandalone: true, selector: "bways-grid", inputs: { columns: "columns", rowData: "rowData", serverDataSource: "serverDataSource", config: "config", pagination: "pagination", pageSize: "pageSize", groupModel: "groupModel", valuesModel: "valuesModel", pivotColumns: "pivotColumns" }, outputs: { rowClicked: "rowClicked", sortChanged: "sortChanged" }, usesOnChanges: true, ngImport: i0, template: `
3474
3595
  <div class="ug-wrapper" [ngClass]="config.theme || 'ag-theme-alpine'">
@@ -3552,7 +3673,9 @@ class UltraGridComponent {
3552
3673
  (exportExcelClicked)="exportExcel({ includeHeaders: true })"
3553
3674
  (filterApplied)="onFilterApplied($event)"
3554
3675
  (conditionFilterChanged)="onConditionFilterChanged($event)"
3555
- (clearAllFilters)="onClearAllFilters()">
3676
+ (clearAllFilters)="onClearAllFilters()"
3677
+ (saveFiltersRequested)="handleSaveFilters()"
3678
+ (filtersImported)="handleImportFilters($event)">
3556
3679
  </ug-side-bar>
3557
3680
 
3558
3681
 
@@ -3588,7 +3711,7 @@ class UltraGridComponent {
3588
3711
  </div>
3589
3712
 
3590
3713
  </div>
3591
- `, isInline: true, styles: ["bways-grid{display:block;height:100%;width:100%}.ug-wrapper{display:flex;flex-direction:row;height:100%;width:100%;border:1px solid var(--ug-border-color);background-color:var(--ug-bg-color);box-sizing:border-box;font-family:var(--ug-font-family);font-size:var(--ug-font-size);color:var(--ug-header-color);overflow:hidden}.ug-main{display:flex;flex-direction:column;flex:1;min-width:0;overflow:hidden}.ug-body{flex:1;overflow:hidden;position:relative}.ug-viewport{height:100%;width:100%;overflow:auto}.ug-ssr-container{height:100%;width:100%;overflow:hidden}.ug-status-bar{display:flex;align-items:center;padding:0 16px;min-height:48px;border-top:1px solid var(--ug-border-color);font-weight:500;font-size:13px;color:var(--ug-header-color);background-color:var(--ug-footer-bg)}.ug-cc-overlay-container{position:fixed;z-index:1002}.ug-wrapper{--ug-border-color: #dde2eb;--ug-bg-color: #ffffff;--ug-header-bg: #f8f8f8;--ug-header-color: #181d1f;--ug-header-hover-bg: #ececec;--ug-row-bg: #ffffff;--ug-row-hover-bg: #f1f5f9;--ug-row-selected-bg: #dcebf7;--ug-primary-color: #1890ff;--ug-footer-bg: #ffffff;--ug-footer-color: #181d1f;--ug-icon-color: #68686e;--ug-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;--ug-font-size: 13px;--ug-header-font-weight: 500}.ug-wrapper.ag-theme-alpine-dark{--ug-border-color: #334155;--ug-bg-color: #1e293b;--ug-header-bg: #0f172a;--ug-header-color: #e2e8f0;--ug-header-hover-bg: #1e293b;--ug-row-bg: #1e293b;--ug-row-hover-bg: #334155;--ug-row-selected-bg: #0f172a;--ug-primary-color: #60a5fa;--ug-footer-bg: #0f172a;--ug-footer-color: #94a3b8;--ug-icon-color: #94a3b8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3$1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3$1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: HeaderComponent, selector: "ug-header", inputs: ["columns", "sortModel", "isAllSelected"], outputs: ["sortChanged", "columnsReordered", "columnResized", "headerCheckboxClicked", "menuClicked", "filterClicked"] }, { kind: "component", type: RowComponent, selector: "ug-row", inputs: ["columns", "row", "rowHeight", "isExpanded", "selectionVersion"], outputs: ["groupToggled"] }, { kind: "component", type: PaginationComponent, selector: "ug-pagination", inputs: ["totalCount", "pageSize", "currentPage"], outputs: ["pageChanged", "pageSizeChanged"] }, { kind: "component", type: HeaderMenuComponent, selector: "ug-header-menu", inputs: ["column", "isOpen", "position", "groupModel"], outputs: ["closeMenu", "sort", "pin", "autosize", "group", "chooseColumns"] }, { kind: "component", type: ChooseColumnsComponent, selector: "ug-choose-columns", inputs: ["columns"], outputs: ["columnsChanged", "closePanel"] }, { kind: "component", type: HeaderFilterComponent, selector: "ug-header-filter", inputs: ["column", "isOpen", "position", "uniqueValues", "activeFilterSet"], outputs: ["closeFilter", "filterApplied"] }, { kind: "component", type: SideBarComponent, selector: "ug-side-bar", inputs: ["columns", "rowData", "activeFilters", "conditionFilters", "groupModel", "valuesModel", "pivotMode", "pivotColumns"], outputs: ["columnsUpdated", "groupModelUpdated", "valuesModelUpdated", "pivotModeUpdated", "pivotModelUpdated", "exportExcelClicked", "filterApplied", "conditionFilterChanged", "clearAllFilters"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3714
+ `, isInline: true, styles: ["bways-grid{display:block;height:100%;width:100%}.ug-wrapper{display:flex;flex-direction:row;height:100%;width:100%;border:1px solid var(--ug-border-color);background-color:var(--ug-bg-color);box-sizing:border-box;font-family:var(--ug-font-family);font-size:var(--ug-font-size);color:var(--ug-header-color);overflow:hidden}.ug-main{display:flex;flex-direction:column;flex:1;min-width:0;overflow:hidden}.ug-body{flex:1;overflow:hidden;position:relative}.ug-viewport{height:100%;width:100%;overflow:auto}.ug-ssr-container{height:100%;width:100%;overflow:hidden}.ug-status-bar{display:flex;align-items:center;padding:0 16px;min-height:48px;border-top:1px solid var(--ug-border-color);font-weight:500;font-size:13px;color:var(--ug-header-color);background-color:var(--ug-footer-bg)}.ug-cc-overlay-container{position:fixed;z-index:1002}.ug-wrapper{--ug-border-color: #dde2eb;--ug-bg-color: #ffffff;--ug-header-bg: #f8f8f8;--ug-header-color: #181d1f;--ug-header-hover-bg: #ececec;--ug-row-bg: #ffffff;--ug-row-hover-bg: #f1f5f9;--ug-row-selected-bg: #dcebf7;--ug-primary-color: #1890ff;--ug-footer-bg: #ffffff;--ug-footer-color: #181d1f;--ug-icon-color: #68686e;--ug-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif;--ug-font-size: 13px;--ug-header-font-weight: 500}.ug-wrapper.ag-theme-alpine-dark{--ug-border-color: #334155;--ug-bg-color: #1e293b;--ug-header-bg: #0f172a;--ug-header-color: #e2e8f0;--ug-header-hover-bg: #1e293b;--ug-row-bg: #1e293b;--ug-row-hover-bg: #334155;--ug-row-selected-bg: #0f172a;--ug-primary-color: #60a5fa;--ug-footer-bg: #0f172a;--ug-footer-color: #94a3b8;--ug-icon-color: #94a3b8}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3$1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i3$1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i3$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "component", type: HeaderComponent, selector: "ug-header", inputs: ["columns", "sortModel", "isAllSelected"], outputs: ["sortChanged", "columnsReordered", "columnResized", "headerCheckboxClicked", "menuClicked", "filterClicked"] }, { kind: "component", type: RowComponent, selector: "ug-row", inputs: ["columns", "row", "rowHeight", "isExpanded", "selectionVersion"], outputs: ["groupToggled"] }, { kind: "component", type: PaginationComponent, selector: "ug-pagination", inputs: ["totalCount", "pageSize", "currentPage"], outputs: ["pageChanged", "pageSizeChanged"] }, { kind: "component", type: HeaderMenuComponent, selector: "ug-header-menu", inputs: ["column", "isOpen", "position", "groupModel"], outputs: ["closeMenu", "sort", "pin", "autosize", "group", "chooseColumns"] }, { kind: "component", type: ChooseColumnsComponent, selector: "ug-choose-columns", inputs: ["columns"], outputs: ["columnsChanged", "closePanel"] }, { kind: "component", type: HeaderFilterComponent, selector: "ug-header-filter", inputs: ["column", "isOpen", "position", "uniqueValues", "activeFilterSet"], outputs: ["closeFilter", "filterApplied"] }, { kind: "component", type: SideBarComponent, selector: "ug-side-bar", inputs: ["columns", "rowData", "activeFilters", "conditionFilters", "groupModel", "valuesModel", "pivotMode", "pivotColumns"], outputs: ["columnsUpdated", "groupModelUpdated", "valuesModelUpdated", "pivotModeUpdated", "pivotModelUpdated", "exportExcelClicked", "filterApplied", "conditionFilterChanged", "clearAllFilters", "saveFiltersRequested", "filtersImported"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3592
3715
  }
3593
3716
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UltraGridComponent, decorators: [{
3594
3717
  type: Component,
@@ -3684,7 +3807,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
3684
3807
  (exportExcelClicked)="exportExcel({ includeHeaders: true })"
3685
3808
  (filterApplied)="onFilterApplied($event)"
3686
3809
  (conditionFilterChanged)="onConditionFilterChanged($event)"
3687
- (clearAllFilters)="onClearAllFilters()">
3810
+ (clearAllFilters)="onClearAllFilters()"
3811
+ (saveFiltersRequested)="handleSaveFilters()"
3812
+ (filtersImported)="handleImportFilters($event)">
3688
3813
  </ug-side-bar>
3689
3814
 
3690
3815