bways-grid 0.0.14 → 0.0.15

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.
@@ -1657,12 +1657,11 @@ class FilterToolPanelComponent {
1657
1657
  rowData = [];
1658
1658
  activeFilters = new Map();
1659
1659
  conditionFilters = new Map();
1660
- savedReportNames = [];
1661
1660
  filterApplied = new EventEmitter();
1662
1661
  conditionFilterChanged = new EventEmitter();
1663
1662
  clearAllFilters = new EventEmitter();
1664
1663
  saveReportRequested = new EventEmitter();
1665
- loadReportRequested = new EventEmitter();
1664
+ importReportRequested = new EventEmitter();
1666
1665
  sections = [];
1667
1666
  _loadedFields = new Set();
1668
1667
  constructor(cdr) {
@@ -1932,19 +1931,49 @@ class FilterToolPanelComponent {
1932
1931
  onSaveReportPrompt() {
1933
1932
  const name = prompt('Enter a name for this report:');
1934
1933
  if (name && name.trim()) {
1935
- this.saveReportRequested.emit(name.trim());
1934
+ const reportObj = {
1935
+ reportName: name.trim(),
1936
+ activeFilters: {},
1937
+ conditionFilters: {}
1938
+ };
1939
+ // Convert Map<string, Set<any>> to Record<string, any[]>
1940
+ if (this.activeFilters.size > 0) {
1941
+ for (const [field, selectedSet] of this.activeFilters.entries()) {
1942
+ reportObj.activeFilters[field] = Array.from(selectedSet);
1943
+ }
1944
+ }
1945
+ // Convert Map to Object
1946
+ if (this.conditionFilters.size > 0) {
1947
+ reportObj.conditionFilters = Object.fromEntries(this.conditionFilters);
1948
+ }
1949
+ this.saveReportRequested.emit(reportObj);
1936
1950
  }
1937
1951
  }
1938
- onLoadReportSelected(event) {
1939
- const select = event.target;
1940
- const name = select.value;
1941
- if (name) {
1942
- this.loadReportRequested.emit(name);
1943
- select.value = ''; // Reset so it can be re-selected if needed
1944
- }
1952
+ onImportReport() {
1953
+ const input = document.createElement('input');
1954
+ input.type = 'file';
1955
+ input.accept = '.json';
1956
+ input.onchange = (event) => {
1957
+ const file = event.target.files[0];
1958
+ if (!file)
1959
+ return;
1960
+ const reader = new FileReader();
1961
+ reader.onload = (e) => {
1962
+ try {
1963
+ const reportData = JSON.parse(e.target.result);
1964
+ this.importReportRequested.emit(reportData);
1965
+ }
1966
+ catch (err) {
1967
+ alert('Invalid JSON file. Please select a valid report file.');
1968
+ console.error('Failed to parse imported report JSON:', err);
1969
+ }
1970
+ };
1971
+ reader.readAsText(file);
1972
+ };
1973
+ input.click();
1945
1974
  }
1946
1975
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: FilterToolPanelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
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", savedReportNames: "savedReportNames" }, outputs: { filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters", saveReportRequested: "saveReportRequested", loadReportRequested: "loadReportRequested" }, usesOnChanges: true, ngImport: i0, template: `
1976
+ 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", saveReportRequested: "saveReportRequested", importReportRequested: "importReportRequested" }, usesOnChanges: true, ngImport: i0, template: `
1948
1977
  <div class="ug-ftp-wrapper">
1949
1978
  <!-- Global Toolbar -->
1950
1979
  <div class="ug-ftp-toolbar">
@@ -1967,11 +1996,11 @@ class FilterToolPanelComponent {
1967
1996
  <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
1997
  Save
1969
1998
  </button>
1970
-
1971
- <select class="ug-ftp-toolbar-select" (change)="onLoadReportSelected($event)" title="Load Saved Report">
1972
- <option value="" disabled selected>Load</option>
1973
- <option *ngFor="let name of savedReportNames" [value]="name">{{ name }}</option>
1974
- </select>
1999
+
2000
+ <button class="ug-ftp-btn" (click)="onImportReport()" title="Import Saved Report">
2001
+ <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="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg>
2002
+ Import
2003
+ </button>
1975
2004
  </div>
1976
2005
 
1977
2006
  <!-- Column Filter Sections -->
@@ -2095,11 +2124,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2095
2124
  <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
2125
  Save
2097
2126
  </button>
2098
-
2099
- <select class="ug-ftp-toolbar-select" (change)="onLoadReportSelected($event)" title="Load Saved Report">
2100
- <option value="" disabled selected>Load</option>
2101
- <option *ngFor="let name of savedReportNames" [value]="name">{{ name }}</option>
2102
- </select>
2127
+
2128
+ <button class="ug-ftp-btn" (click)="onImportReport()" title="Import Saved Report">
2129
+ <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="7 10 12 15 17 10"></polyline><line x1="12" y1="15" x2="12" y2="3"></line></svg>
2130
+ Import
2131
+ </button>
2103
2132
  </div>
2104
2133
 
2105
2134
  <!-- Column Filter Sections -->
@@ -2205,8 +2234,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2205
2234
  type: Input
2206
2235
  }], conditionFilters: [{
2207
2236
  type: Input
2208
- }], savedReportNames: [{
2209
- type: Input
2210
2237
  }], filterApplied: [{
2211
2238
  type: Output
2212
2239
  }], conditionFilterChanged: [{
@@ -2215,7 +2242,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2215
2242
  type: Output
2216
2243
  }], saveReportRequested: [{
2217
2244
  type: Output
2218
- }], loadReportRequested: [{
2245
+ }], importReportRequested: [{
2219
2246
  type: Output
2220
2247
  }] } });
2221
2248
 
@@ -2228,7 +2255,7 @@ class SideBarComponent {
2228
2255
  valuesModel = [];
2229
2256
  pivotMode = false;
2230
2257
  pivotColumns = [];
2231
- savedReportNames = [];
2258
+ savedReportNames = []; // Kept for backward compat but no longer used
2232
2259
  columnsUpdated = new EventEmitter();
2233
2260
  groupModelUpdated = new EventEmitter();
2234
2261
  valuesModelUpdated = new EventEmitter();
@@ -2239,7 +2266,7 @@ class SideBarComponent {
2239
2266
  conditionFilterChanged = new EventEmitter();
2240
2267
  clearAllFilters = new EventEmitter();
2241
2268
  saveReportRequested = new EventEmitter();
2242
- loadReportRequested = new EventEmitter();
2269
+ importReportRequested = new EventEmitter();
2243
2270
  activeTab = null;
2244
2271
  cdr = inject(ChangeDetectorRef);
2245
2272
  constructor() {
@@ -2292,7 +2319,7 @@ class SideBarComponent {
2292
2319
  this.pivotModelUpdated.emit(model);
2293
2320
  }
2294
2321
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SideBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2295
- 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", savedReportNames: "savedReportNames", activeTab: "activeTab" }, outputs: { columnsUpdated: "columnsUpdated", groupModelUpdated: "groupModelUpdated", valuesModelUpdated: "valuesModelUpdated", pivotModeUpdated: "pivotModeUpdated", pivotModelUpdated: "pivotModelUpdated", exportExcelClicked: "exportExcelClicked", filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters", saveReportRequested: "saveReportRequested", loadReportRequested: "loadReportRequested" }, usesOnChanges: true, ngImport: i0, template: `
2322
+ 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", savedReportNames: "savedReportNames", activeTab: "activeTab" }, outputs: { columnsUpdated: "columnsUpdated", groupModelUpdated: "groupModelUpdated", valuesModelUpdated: "valuesModelUpdated", pivotModeUpdated: "pivotModeUpdated", pivotModelUpdated: "pivotModelUpdated", exportExcelClicked: "exportExcelClicked", filterApplied: "filterApplied", conditionFilterChanged: "conditionFilterChanged", clearAllFilters: "clearAllFilters", saveReportRequested: "saveReportRequested", importReportRequested: "importReportRequested" }, usesOnChanges: true, ngImport: i0, template: `
2296
2323
  <div class="ug-side-bar-wrapper">
2297
2324
  <!-- Content Area -->
2298
2325
  <div class="ug-side-bar-content" *ngIf="activeTab">
@@ -2325,12 +2352,11 @@ class SideBarComponent {
2325
2352
  [rowData]="rowData"
2326
2353
  [activeFilters]="activeFilters"
2327
2354
  [conditionFilters]="conditionFilters"
2328
- [savedReportNames]="savedReportNames"
2329
2355
  (filterApplied)="onFilterApplied($event)"
2330
2356
  (conditionFilterChanged)="onConditionFilterChanged($event)"
2331
2357
  (clearAllFilters)="onClearAllFilters()"
2332
2358
  (saveReportRequested)="saveReportRequested.emit($event)"
2333
- (loadReportRequested)="loadReportRequested.emit($event)">
2359
+ (importReportRequested)="importReportRequested.emit($event)">
2334
2360
  </ug-filter-tool-panel>
2335
2361
  </div>
2336
2362
  </div>
@@ -2352,7 +2378,7 @@ class SideBarComponent {
2352
2378
  </div>
2353
2379
  </div>
2354
2380
  </div>
2355
- `, isInline: true, styles: [".ug-side-bar-wrapper{display:flex;flex-direction:row;height:100%;background-color:var(--ug-panel-bg);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-panel-bg)}.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-panel-bg);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", "savedReportNames"], outputs: ["filterApplied", "conditionFilterChanged", "clearAllFilters", "saveReportRequested", "loadReportRequested"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2381
+ `, isInline: true, styles: [".ug-side-bar-wrapper{display:flex;flex-direction:row;height:100%;background-color:var(--ug-panel-bg);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-panel-bg)}.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-panel-bg);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", "saveReportRequested", "importReportRequested"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2356
2382
  }
2357
2383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: SideBarComponent, decorators: [{
2358
2384
  type: Component,
@@ -2389,12 +2415,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2389
2415
  [rowData]="rowData"
2390
2416
  [activeFilters]="activeFilters"
2391
2417
  [conditionFilters]="conditionFilters"
2392
- [savedReportNames]="savedReportNames"
2393
2418
  (filterApplied)="onFilterApplied($event)"
2394
2419
  (conditionFilterChanged)="onConditionFilterChanged($event)"
2395
2420
  (clearAllFilters)="onClearAllFilters()"
2396
2421
  (saveReportRequested)="saveReportRequested.emit($event)"
2397
- (loadReportRequested)="loadReportRequested.emit($event)">
2422
+ (importReportRequested)="importReportRequested.emit($event)">
2398
2423
  </ug-filter-tool-panel>
2399
2424
  </div>
2400
2425
  </div>
@@ -2455,7 +2480,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
2455
2480
  type: Output
2456
2481
  }], saveReportRequested: [{
2457
2482
  type: Output
2458
- }], loadReportRequested: [{
2483
+ }], importReportRequested: [{
2459
2484
  type: Output
2460
2485
  }], activeTab: [{
2461
2486
  type: Input
@@ -2694,6 +2719,7 @@ class UltraGridComponent {
2694
2719
  rowClicked = new EventEmitter();
2695
2720
  sortChanged = new EventEmitter();
2696
2721
  selectionChanged = new EventEmitter();
2722
+ reportSaved = new EventEmitter();
2697
2723
  getSelectedRows() {
2698
2724
  if (!this._mappedRowData)
2699
2725
  return [];
@@ -2731,7 +2757,6 @@ class UltraGridComponent {
2731
2757
  conditionFilters = new Map();
2732
2758
  isChooseColumnsOpen = false;
2733
2759
  chooseColumnsPosition = { x: 0, y: 0 };
2734
- savedReportNames = [];
2735
2760
  destroy$ = new Subject();
2736
2761
  sortingWorker;
2737
2762
  sortingWorkerUrl;
@@ -2760,9 +2785,6 @@ class UltraGridComponent {
2760
2785
  this.fetchServerPage(1);
2761
2786
  }
2762
2787
  }
2763
- if (this.isBrowser) {
2764
- this.loadSavedReportNames();
2765
- }
2766
2788
  }
2767
2789
  get selectedRowsCount() {
2768
2790
  if (!this._mappedRowData)
@@ -3588,67 +3610,20 @@ class UltraGridComponent {
3588
3610
  }
3589
3611
  this.applyLocalData();
3590
3612
  }
3591
- // --- Save / Import Filters natively to LocalStorage ---
3592
- loadSavedReportNames() {
3593
- if (!this.isBrowser)
3613
+ // --- Save / Import Filters ---
3614
+ handleSaveReport(reportObj) {
3615
+ if (!reportObj)
3594
3616
  return;
3595
- try {
3596
- const stored = localStorage.getItem('ug-saved-reports');
3597
- if (stored) {
3598
- const parsed = JSON.parse(stored);
3599
- this.savedReportNames = Object.keys(parsed);
3600
- this.cdr.markForCheck();
3601
- }
3602
- }
3603
- catch (e) { }
3604
- }
3605
- handleSaveReport(reportName) {
3606
- if (!reportName)
3607
- return;
3608
- const state = {
3609
- activeFilters: {},
3610
- conditionFilters: {}
3611
- };
3612
- // Convert Map<string, Set<any>> to Record<string, any[]>
3613
- if (this.activeFilters.size > 0) {
3614
- for (const [field, selectedSet] of this.activeFilters.entries()) {
3615
- state.activeFilters[field] = Array.from(selectedSet);
3616
- }
3617
- }
3618
- // Convert Map to Object
3619
- if (this.conditionFilters.size > 0) {
3620
- state.conditionFilters = Object.fromEntries(this.conditionFilters);
3621
- }
3622
- if (this.isBrowser) {
3623
- try {
3624
- const stored = localStorage.getItem('ug-saved-reports');
3625
- const reports = stored ? JSON.parse(stored) : {};
3626
- reports[reportName] = state;
3627
- localStorage.setItem('ug-saved-reports', JSON.stringify(reports));
3628
- this.loadSavedReportNames();
3629
- console.log(`Report '${reportName}' saved successfully locally.`);
3630
- }
3631
- catch (err) {
3632
- console.error('Failed to save report locally.', err);
3633
- }
3634
- }
3617
+ console.log('=== SAVED REPORT OBJECT ===');
3618
+ console.log(JSON.stringify(reportObj, null, 2));
3619
+ console.log('=== END REPORT OBJECT ===');
3620
+ this.reportSaved.emit(reportObj);
3635
3621
  }
3636
- handleLoadReport(reportName) {
3637
- if (!reportName || !this.isBrowser)
3622
+ handleImportReport(reportData) {
3623
+ if (!reportData)
3638
3624
  return;
3639
- try {
3640
- const stored = localStorage.getItem('ug-saved-reports');
3641
- if (stored) {
3642
- const reports = JSON.parse(stored);
3643
- const data = reports[reportName];
3644
- if (data) {
3645
- this.applyImportedFilters(data);
3646
- }
3647
- }
3648
- }
3649
- catch (err) {
3650
- console.error('Error loading report locally.', err);
3651
- }
3625
+ console.log('Importing report:', reportData.reportName || 'unnamed');
3626
+ this.applyImportedFilters(reportData);
3652
3627
  }
3653
3628
  applyImportedFilters(data) {
3654
3629
  if (!data)
@@ -3674,15 +3649,15 @@ class UltraGridComponent {
3674
3649
  this.currentPage = 1;
3675
3650
  this.applyLocalData();
3676
3651
  this.cdr.markForCheck();
3677
- console.log('Filters loaded and applied successfully.');
3652
+ console.log('Filters imported and applied successfully.');
3678
3653
  }
3679
3654
  catch (err) {
3680
- console.error('Error applying loaded filters:', err);
3681
- alert('Error loading report. Please ensure local storage data is not corrupted.');
3655
+ console.error('Error applying imported filters:', err);
3656
+ alert('Error importing report. Please ensure the JSON file is valid.');
3682
3657
  }
3683
3658
  }
3684
3659
  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 });
3685
- 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", selectionChanged: "selectionChanged" }, viewQueries: [{ propertyName: "headerElement", first: true, predicate: ["headerComponent"], descendants: true, read: ElementRef }, { propertyName: "viewport", first: true, predicate: ["viewport"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
3660
+ 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", selectionChanged: "selectionChanged", reportSaved: "reportSaved" }, viewQueries: [{ propertyName: "headerElement", first: true, predicate: ["headerComponent"], descendants: true, read: ElementRef }, { propertyName: "viewport", first: true, predicate: ["viewport"], descendants: true }], usesOnChanges: true, ngImport: i0, template: `
3686
3661
  <div class="ug-wrapper" [ngClass]="config.theme || 'ag-theme-alpine'">
3687
3662
 
3688
3663
  <div class="ug-main">
@@ -3750,8 +3725,7 @@ class UltraGridComponent {
3750
3725
  </div>
3751
3726
 
3752
3727
  <ug-side-bar
3753
- *ngIf="config.sideBar"
3754
- [activeTab]="config.sideBarDefaultTab || null"
3728
+ *ngIf="config.sideBar"
3755
3729
  [columns]="columns"
3756
3730
  [rowData]="rowData"
3757
3731
  [activeFilters]="activeFilters"
@@ -3760,7 +3734,6 @@ class UltraGridComponent {
3760
3734
  [valuesModel]="valuesModel"
3761
3735
  [pivotMode]="!!config.pivotMode"
3762
3736
  [pivotColumns]="pivotColumns"
3763
- [savedReportNames]="savedReportNames"
3764
3737
  (columnsUpdated)="onSideBarColumnsUpdated($event)"
3765
3738
  (groupModelUpdated)="onSideBarGroupModelUpdated($event)"
3766
3739
  (valuesModelUpdated)="onValuesModelUpdated($event)"
@@ -3771,7 +3744,7 @@ class UltraGridComponent {
3771
3744
  (conditionFilterChanged)="onConditionFilterChanged($event)"
3772
3745
  (clearAllFilters)="onClearAllFilters()"
3773
3746
  (saveReportRequested)="handleSaveReport($event)"
3774
- (loadReportRequested)="handleLoadReport($event)">
3747
+ (importReportRequested)="handleImportReport($event)">
3775
3748
  </ug-side-bar>
3776
3749
 
3777
3750
  </div>
@@ -3807,7 +3780,7 @@ class UltraGridComponent {
3807
3780
  (closePanel)="isChooseColumnsOpen = false">
3808
3781
  </ug-choose-columns>
3809
3782
  </div>
3810
- `, isInline: true, styles: ["@charset \"UTF-8\";bways-grid{display:block;height:100%;width:100%;--ug-border-color: rgba(221, 226, 235, .4);--ug-bg-color: transparent;--ug-header-bg: rgba(255, 255, 255, .25);--ug-header-color: #3f332f;--ug-header-hover-bg: rgba(255, 255, 255, .4);--ug-row-bg: rgba(255, 255, 255, .15);--ug-row-hover-bg: rgba(216, 48, 24, .05);--ug-row-selected-bg: rgba(216, 48, 24, .15);--ug-primary-color: #d83018;--ug-panel-bg: #ffffff;--ug-footer-bg: rgba(255, 255, 255, .25);--ug-footer-color: #554440;--ug-icon-color: #7b6d69;--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: 600}.ug-wrapper{display:flex;flex-direction:row;height:100%;width:100%;border:1px solid var(--ug-border-color);background-color:var(--ug-bg-color);background-image:url(\"data:image/svg+xml;utf8,<svg viewBox='0 0 800 800' xmlns='http://www.w3.org/2000/svg'><g fill='rgba(0,0,0,0.02)'><path transform='translate(150,150) scale(1.6)' d='M-20 -30c0-10 40-10 40 0v60c0 10-40 10-40 0z M-20 -10c0 10 40 10 40 0 M-20 10c0 10 40 10 40 0'/><path transform='translate(600,250) scale(1.8)' d='M-40 10a30 30 0 0 1 50-10 40 40 0 0 1 30 60h-80a20 20 0 0 1 0-50z'/><g transform='translate(350,550) scale(1.7)'><circle cx='0' cy='-20' r='10'/><circle cx='-30' cy='10' r='8'/><circle cx='30' cy='10' r='8'/><path d='M0 -20l-30 30m30-30l30 30' stroke='rgba(0,0,0,0.02)' stroke-width='4'/></g><path transform='translate(700,700) scale(1.4)' d='M-20 -30c0-10 40-10 40 0v60c0 10-40 10-40 0z M-20 -10c0 10 40 10 40 0 M-20 10c0 10 40 10 40 0'/><path transform='translate(100,600) scale(1.5)' d='M-40 10a30 30 0 0 1 50-10 40 40 0 0 1 30 60h-80a20 20 0 0 1 0-50z'/><g transform='translate(450,100) scale(1.3)'><circle cx='0' cy='-20' r='10'/><circle cx='-30' cy='10' r='8'/><circle cx='30' cy='10' r='8'/><path d='M0 -20l-30 30m30-30l30 30' stroke='rgba(0,0,0,0.02)' stroke-width='4'/></g></g></svg>\"),radial-gradient(circle at 10% 20%,#fdf5f5 0%,transparent 60%),radial-gradient(circle at 80% 10%,#eefbf6 0%,transparent 60%),radial-gradient(circle at 50% 80%,#f9f5f0,#f1efe9);background-size:800px 800px,100% 100%,100% 100%,100% 100%;background-position:center;background-repeat:repeat,no-repeat,no-repeat,no-repeat;box-sizing:border-box;font-family:var(--ug-font-family);font-size:var(--ug-font-size);color:var(--ug-header-color);overflow:hidden;backdrop-filter:blur(8px)}.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}bways-grid.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", "savedReportNames", "activeTab"], outputs: ["columnsUpdated", "groupModelUpdated", "valuesModelUpdated", "pivotModeUpdated", "pivotModelUpdated", "exportExcelClicked", "filterApplied", "conditionFilterChanged", "clearAllFilters", "saveReportRequested", "loadReportRequested"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3783
+ `, isInline: true, styles: ["@charset \"UTF-8\";bways-grid{display:block;height:100%;width:100%;--ug-border-color: rgba(221, 226, 235, .4);--ug-bg-color: transparent;--ug-header-bg: rgba(255, 255, 255, .25);--ug-header-color: #3f332f;--ug-header-hover-bg: rgba(255, 255, 255, .4);--ug-row-bg: rgba(255, 255, 255, .15);--ug-row-hover-bg: rgba(216, 48, 24, .05);--ug-row-selected-bg: rgba(216, 48, 24, .15);--ug-primary-color: #d83018;--ug-panel-bg: #ffffff;--ug-footer-bg: rgba(255, 255, 255, .25);--ug-footer-color: #554440;--ug-icon-color: #7b6d69;--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: 600}.ug-wrapper{display:flex;flex-direction:row;height:100%;width:100%;border:1px solid var(--ug-border-color);background-color:var(--ug-bg-color);background-image:url(\"data:image/svg+xml;utf8,<svg viewBox='0 0 800 800' xmlns='http://www.w3.org/2000/svg'><g fill='rgba(0,0,0,0.02)'><path transform='translate(150,150) scale(1.6)' d='M-20 -30c0-10 40-10 40 0v60c0 10-40 10-40 0z M-20 -10c0 10 40 10 40 0 M-20 10c0 10 40 10 40 0'/><path transform='translate(600,250) scale(1.8)' d='M-40 10a30 30 0 0 1 50-10 40 40 0 0 1 30 60h-80a20 20 0 0 1 0-50z'/><g transform='translate(350,550) scale(1.7)'><circle cx='0' cy='-20' r='10'/><circle cx='-30' cy='10' r='8'/><circle cx='30' cy='10' r='8'/><path d='M0 -20l-30 30m30-30l30 30' stroke='rgba(0,0,0,0.02)' stroke-width='4'/></g><path transform='translate(700,700) scale(1.4)' d='M-20 -30c0-10 40-10 40 0v60c0 10-40 10-40 0z M-20 -10c0 10 40 10 40 0 M-20 10c0 10 40 10 40 0'/><path transform='translate(100,600) scale(1.5)' d='M-40 10a30 30 0 0 1 50-10 40 40 0 0 1 30 60h-80a20 20 0 0 1 0-50z'/><g transform='translate(450,100) scale(1.3)'><circle cx='0' cy='-20' r='10'/><circle cx='-30' cy='10' r='8'/><circle cx='30' cy='10' r='8'/><path d='M0 -20l-30 30m30-30l30 30' stroke='rgba(0,0,0,0.02)' stroke-width='4'/></g></g></svg>\"),radial-gradient(circle at 10% 20%,#fdf5f5 0%,transparent 60%),radial-gradient(circle at 80% 10%,#eefbf6 0%,transparent 60%),radial-gradient(circle at 50% 80%,#f9f5f0,#f1efe9);background-size:800px 800px,100% 100%,100% 100%,100% 100%;background-position:center;background-repeat:repeat,no-repeat,no-repeat,no-repeat;box-sizing:border-box;font-family:var(--ug-font-family);font-size:var(--ug-font-size);color:var(--ug-header-color);overflow:hidden;backdrop-filter:blur(8px)}.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}bways-grid.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", "savedReportNames", "activeTab"], outputs: ["columnsUpdated", "groupModelUpdated", "valuesModelUpdated", "pivotModeUpdated", "pivotModelUpdated", "exportExcelClicked", "filterApplied", "conditionFilterChanged", "clearAllFilters", "saveReportRequested", "importReportRequested"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3811
3784
  }
3812
3785
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImport: i0, type: UltraGridComponent, decorators: [{
3813
3786
  type: Component,
@@ -3889,8 +3862,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
3889
3862
  </div>
3890
3863
 
3891
3864
  <ug-side-bar
3892
- *ngIf="config.sideBar"
3893
- [activeTab]="config.sideBarDefaultTab || null"
3865
+ *ngIf="config.sideBar"
3894
3866
  [columns]="columns"
3895
3867
  [rowData]="rowData"
3896
3868
  [activeFilters]="activeFilters"
@@ -3899,7 +3871,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
3899
3871
  [valuesModel]="valuesModel"
3900
3872
  [pivotMode]="!!config.pivotMode"
3901
3873
  [pivotColumns]="pivotColumns"
3902
- [savedReportNames]="savedReportNames"
3903
3874
  (columnsUpdated)="onSideBarColumnsUpdated($event)"
3904
3875
  (groupModelUpdated)="onSideBarGroupModelUpdated($event)"
3905
3876
  (valuesModelUpdated)="onValuesModelUpdated($event)"
@@ -3910,7 +3881,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
3910
3881
  (conditionFilterChanged)="onConditionFilterChanged($event)"
3911
3882
  (clearAllFilters)="onClearAllFilters()"
3912
3883
  (saveReportRequested)="handleSaveReport($event)"
3913
- (loadReportRequested)="handleLoadReport($event)">
3884
+ (importReportRequested)="handleImportReport($event)">
3914
3885
  </ug-side-bar>
3915
3886
 
3916
3887
  </div>
@@ -3974,6 +3945,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.18", ngImpo
3974
3945
  type: Output
3975
3946
  }], selectionChanged: [{
3976
3947
  type: Output
3948
+ }], reportSaved: [{
3949
+ type: Output
3977
3950
  }], groupModel: [{
3978
3951
  type: Input
3979
3952
  }], valuesModel: [{