bways-grid 0.0.5
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 +76 -0
- package/fesm2022/bways-grid.mjs +3440 -0
- package/fesm2022/bways-grid.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/bways-grid.module.d.ts +13 -0
- package/lib/components/cell/cell.component.d.ts +20 -0
- package/lib/components/choose-columns/choose-columns.component.d.ts +17 -0
- package/lib/components/column-tool-panel/column-tool-panel.component.d.ts +36 -0
- package/lib/components/filter-tool-panel/filter-tool-panel.component.d.ts +63 -0
- package/lib/components/header/header.component.d.ts +42 -0
- package/lib/components/header-filter/header-filter.component.d.ts +31 -0
- package/lib/components/header-menu/header-menu.component.d.ts +41 -0
- package/lib/components/pagination/pagination.component.d.ts +22 -0
- package/lib/components/row/row.component.d.ts +19 -0
- package/lib/components/side-bar/side-bar.component.d.ts +42 -0
- package/lib/components/ultra-grid/ultra-grid.component.d.ts +155 -0
- package/lib/core/grid-engine.service.d.ts +14 -0
- package/lib/core/grid-flattener.service.d.ts +8 -0
- package/lib/core/row-cache.d.ts +10 -0
- package/lib/core/viewport-manager.d.ts +21 -0
- package/lib/datasources/infinite-scroll.datasource.d.ts +17 -0
- package/lib/datasources/server-datasource.interface.d.ts +14 -0
- package/lib/directives/column-resize.directive.d.ts +18 -0
- package/lib/models/column.model.d.ts +21 -0
- package/lib/models/csv-export.model.d.ts +12 -0
- package/lib/models/filter.model.d.ts +18 -0
- package/lib/models/grid-config.model.d.ts +11 -0
- package/lib/models/row.model.d.ts +26 -0
- package/lib/services/csv-export.service.d.ts +11 -0
- package/lib/workers/generated/export.worker.code.d.ts +1 -0
- package/lib/workers/generated/sorting.worker.code.d.ts +1 -0
- package/package.json +23 -0
- package/public-api.d.ts +19 -0
- package/src/lib/workers/export.worker.ts +110 -0
- package/src/lib/workers/generated/export.worker.code.ts +7 -0
- package/src/lib/workers/generated/sorting.worker.code.ts +4 -0
- package/src/lib/workers/sorting.worker.ts +423 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bways-grid.mjs","sources":["../../../projects/bways-grid/src/lib/workers/generated/sorting.worker.code.ts","../../../projects/bways-grid/src/lib/datasources/infinite-scroll.datasource.ts","../../../projects/bways-grid/src/lib/directives/column-resize.directive.ts","../../../projects/bways-grid/src/lib/components/header/header.component.ts","../../../projects/bways-grid/src/lib/components/cell/cell.component.ts","../../../projects/bways-grid/src/lib/components/row/row.component.ts","../../../projects/bways-grid/src/lib/components/pagination/pagination.component.ts","../../../projects/bways-grid/src/lib/components/header-menu/header-menu.component.ts","../../../projects/bways-grid/src/lib/components/choose-columns/choose-columns.component.ts","../../../projects/bways-grid/src/lib/components/header-filter/header-filter.component.ts","../../../projects/bways-grid/src/lib/components/column-tool-panel/column-tool-panel.component.ts","../../../projects/bways-grid/src/lib/components/filter-tool-panel/filter-tool-panel.component.ts","../../../projects/bways-grid/src/lib/components/side-bar/side-bar.component.ts","../../../projects/bways-grid/src/lib/core/grid-flattener.service.ts","../../../projects/bways-grid/src/lib/workers/generated/export.worker.code.ts","../../../projects/bways-grid/src/lib/services/csv-export.service.ts","../../../projects/bways-grid/src/lib/components/ultra-grid/ultra-grid.component.ts","../../../projects/bways-grid/src/lib/bways-grid.module.ts","../../../projects/bways-grid/src/lib/models/filter.model.ts","../../../projects/bways-grid/src/lib/core/grid-engine.service.ts","../../../projects/bways-grid/src/lib/core/viewport-manager.ts","../../../projects/bways-grid/src/lib/core/row-cache.ts","../../../projects/bways-grid/src/public-api.ts","../../../projects/bways-grid/src/bways-grid.ts"],"sourcesContent":["// AUTO-GENERATED FILE. DO NOT EDIT.\n// Built from src/lib/workers/sorting.worker.ts\nexport const SORTING_WORKER_CODE = `\"use strict\";(()=>{var G=[],N=[];addEventListener(\"message\",r=>{let{action:a,rows:n,sortModel:o,filterModel:i,conditionFilters:e,groupModel:t,aggregations:d,groupStateMap:l}=r.data;if(a===\"INIT\"){G=(n||[]).map(u=>({...u,type:\"leaf\",level:0})),postMessage({action:\"INIT_DONE\"});return}if(a===\"FLATTEN_ONLY\"){let s=m(N,l||{},r.data.groupIncludeFooter);postMessage({flatList:s});return}if(a===\"EXECUTE\"){let s=G;if(i&&Object.keys(i).length>0){let c={};for(let p of Object.keys(i))c[p]=new Set(i[p]);s=s.filter(p=>{for(let y of Object.keys(c)){let F=c[y],k=p.data?p.data[y]:null;if(!F.has(k))return!1}return!0})}e&&Object.keys(e).length>0&&(s=O(s,e));let u=s,f=d||{};if(t&&t.length>0?u=E(s,t,f):s.forEach(c=>c.level=0),o&&o.length>0&&L(u,o),N=u,t&&t.length>0&&r.data.groupIncludeFooter&&Object.keys(f).length>0){let p={id:\"grand-total-footer\",type:\"group-footer\",level:0,groupField:\"Grand Total\",groupKey:\"Grand Total\",data:v(s,f)};N.push(p)}let g=m(N,l||{},r.data.groupIncludeFooter),h=U(N);postMessage({flatList:g,resultTree:h})}});function U(r){return r.map(a=>{if(a.type===\"leaf\")return{id:a.id,type:\"leaf\",level:a.level};if(a.type===\"group\"){let n=a;return{...n,children:n.children?U(n.children):void 0}}return a})}function m(r,a,n=!1){let o=[],i=[];for(let e=r.length-1;e>=0;e--)i.push(r[e]);for(;i.length>0;){let e=i.pop();if(e.type===\"group\"){let t=e;if(o.push({id:t.id,type:\"group\",level:t.level,groupField:t.groupField,groupKey:t.groupKey,data:t.data,childCount:t.children?t.children.length:0}),!!a[t.id]&&(n&&i.push({id:\\`\\${t.id}-footer\\`,type:\"group-footer\",level:t.level,groupField:t.groupField,groupKey:t.groupKey,data:{...t.data}}),t.children))for(let l=t.children.length-1;l>=0;l--)i.push(t.children[l])}else e.type===\"group-footer\"?o.push({id:e.id,type:\"group-footer\",level:e.level,groupField:e.groupField,groupKey:e.groupKey,data:e.data}):o.push({id:e.id,type:\"leaf\",level:e.level})}return o}function E(r,a,n){return T(r,a,0,n,\"root\")}function T(r,a,n,o,i){let e=a[n],t=n===a.length-1,d=new Map;for(let s of r){let u=s.data?s.data[e]:null;d.has(u)||d.set(u,[]),d.get(u).push(s)}let l=[];for(let[s,u]of d.entries()){let f=\\`\\${i}-\\${e}-\\${s}\\`,g={id:f,type:\"group\",level:n,groupField:e,groupKey:s,data:{[e]:s},children:[]},h=v(u,o);Object.assign(g.data,h),t?(u.forEach(c=>c.level=n+1),g.children=u):g.children=T(u,a,n+1,o,f),l.push(g)}return l}function v(r,a){let n={};for(let o of Object.keys(a)){let i=a[o],e=0;if(i===\"count\")e=r.length;else{let t=!0,d=0,l=0;for(let s of r){let u=s.data?s.data[o]:0,f=0;typeof u==\"number\"?f=u:typeof u==\"string\"&&(f=Number(u.replace(/[^0-9.-]+/g,\"\"))),isNaN(f)&&(f=0),i===\"sum\"?e+=f:i===\"min\"?t?e=f:e=Math.min(e,f):i===\"max\"?t?e=f:e=Math.max(e,f):i===\"avg\"&&(d+=f,l++),t=!1}i===\"avg\"&&(e=l>0?d/l:0)}n[o]=e}return n}function L(r,a){r.sort((n,o)=>{for(let i of a){let{field:e,direction:t}=i,d=n.data?n.data[e]:null,l=o.data?o.data[e]:null;if(d===l)continue;let s=d>l?1:-1;return t===\"asc\"?s:-s}return 0});for(let n of r)n.type===\"group\"&&n.children&&L(n.children,a)}function O(r,a){let n=Object.keys(a);return n.length===0?r:r.filter(o=>{for(let i of n){let e=a[i];if(!e||!e.condition1)continue;let t=o.data?o.data[i]:null,d=b(t,e.condition1);if(e.condition2&&e.condition2.type){let l=b(t,e.condition2);if(!(e.operator===\"OR\"?d||l:d&&l))return!1}else if(!d)return!1}return!0})}function b(r,a){let{type:n,value:o,valueTo:i}=a;if(n===\"blank\")return r==null||r===\"\";if(n===\"notBlank\")return r!=null&&r!==\"\";if(o==null||o===\"\")return!0;let e=String(r??\"\").toLowerCase(),t=String(o).toLowerCase();switch(n){case\"contains\":return e.includes(t);case\"notContains\":return!e.includes(t);case\"equals\":return!isNaN(Number(r))&&!isNaN(Number(o))?Number(r)===Number(o):e===t;case\"notEqual\":return!isNaN(Number(r))&&!isNaN(Number(o))?Number(r)!==Number(o):e!==t;case\"startsWith\":return e.startsWith(t);case\"endsWith\":return e.endsWith(t);case\"greaterThan\":return Number(r)>Number(o);case\"greaterThanOrEqual\":return Number(r)>=Number(o);case\"lessThan\":return Number(r)<Number(o);case\"lessThanOrEqual\":return Number(r)<=Number(o);case\"inRange\":if(i==null||i===\"\")return!0;let d=Number(r);return d>=Number(o)&&d<=Number(i);default:return!0}}})();\n`;\n","import { CollectionViewer, DataSource } from '@angular/cdk/collections';\r\nimport { BehaviorSubject, Observable, Subscription } from 'rxjs';\r\nimport { ServerDataSource } from './server-datasource.interface';\r\n\r\nexport class InfiniteScrollDataSource<T> extends DataSource<T | undefined> {\r\n private _cachedData: (T | undefined)[] = [];\r\n private _dataStream = new BehaviorSubject<(T | undefined)[]>([]);\r\n private _subscription = new Subscription();\r\n private _fetchedPages = new Set<number>();\r\n private _pageSize = 100;\r\n\r\n constructor(private _serverDataSource: ServerDataSource<T>, private _bufferSize: number = 200) {\r\n super();\r\n this._pageSize = this._bufferSize;\r\n }\r\n\r\n connect(collectionViewer: CollectionViewer): Observable<(T | undefined)[]> {\r\n this._subscription.add(\r\n collectionViewer.viewChange.subscribe(range => {\r\n const startPage = this._getPageForIndex(range.start);\r\n const endPage = this._getPageForIndex(range.end - 1);\r\n\r\n for (let i = startPage; i <= endPage; i++) {\r\n this._fetchPage(i);\r\n }\r\n })\r\n );\r\n return this._dataStream;\r\n }\r\n\r\n disconnect(): void {\r\n this._subscription.unsubscribe();\r\n }\r\n\r\n private _getPageForIndex(index: number): number {\r\n return Math.floor(index / this._pageSize);\r\n }\r\n\r\n private _fetchPage(page: number) {\r\n if (this._fetchedPages.has(page)) {\r\n return;\r\n }\r\n\r\n this._fetchedPages.add(page);\r\n const startRow = page * this._pageSize;\r\n const endRow = startRow + this._pageSize;\r\n\r\n this._serverDataSource.getRows({ startRow, endRow }).subscribe(res => {\r\n // Initialize array to totalCount if not yet done\r\n if (this._cachedData.length !== res.totalCount) {\r\n this._cachedData = Array.from<T | undefined>({ length: res.totalCount }).fill(undefined);\r\n }\r\n\r\n this._cachedData.splice(startRow, res.rows.length, ...res.rows);\r\n this._dataStream.next([...this._cachedData]);\r\n });\r\n }\r\n}\r\n","import { Directive, ElementRef, EventEmitter, HostListener, Input, Output, Renderer2 } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[ugColumnResize]',\r\n standalone: true\r\n})\r\nexport class ColumnResizeDirective {\r\n @Input('ugColumnResize') columnField!: string;\r\n @Output() resizeEnd = new EventEmitter<{ field: string, width: number }>();\r\n\r\n private startX!: number;\r\n private startWidth!: number;\r\n private minWidth = 50;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) { }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.startX = event.pageX;\r\n this.startWidth = this.el.nativeElement.parentElement.offsetWidth;\r\n\r\n const mouseMoveListener = this.renderer.listen('document', 'mousemove', (e: MouseEvent) => {\r\n const width = Math.max(this.minWidth, this.startWidth + (e.pageX - this.startX));\r\n this.renderer.setStyle(this.el.nativeElement.parentElement, 'width', `${width}px`);\r\n });\r\n\r\n const mouseUpListener = this.renderer.listen('document', 'mouseup', (e: MouseEvent) => {\r\n mouseMoveListener(); // Unregister\r\n mouseUpListener(); // Unregister\r\n const finalWidth = Math.max(this.minWidth, this.startWidth + (e.pageX - this.startX));\r\n this.resizeEnd.emit({ field: this.columnField, width: finalWidth });\r\n });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\nimport { ColumnResizeDirective } from '../../directives/column-resize.directive';\r\n\r\n@Component({\r\n selector: 'ug-header',\r\n standalone: true,\r\n imports: [CommonModule, DragDropModule, ColumnResizeDirective],\r\n template: `\r\n <div class=\"ug-header-row\" cdkDropList cdkDropListOrientation=\"horizontal\" (cdkDropListDropped)=\"onColumnDrop($event)\">\r\n <div \r\n class=\"ug-header-cell\" \r\n *ngFor=\"let col of columns; let isLast = last\" \r\n cdkDrag\r\n [style.width.px]=\"col.width || 200\"\r\n [style.min-width.px]=\"col.minWidth\"\r\n [style.max-width.px]=\"col.maxWidth\"\r\n [class.ug-cell-hide]=\"col.hide\"\r\n [class.ug-pinned-left]=\"col.pinned === 'left'\"\r\n [class.ug-pinned-right]=\"col.pinned === 'right'\"\r\n [style.left.px]=\"col._leftOffset\"\r\n [style.right.px]=\"col._rightOffset\"\r\n >\r\n <div class=\"ug-header-checkbox\" *ngIf=\"col.headerCheckboxSelection\" (click)=\"onHeaderCheckboxClick($event)\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" />\r\n </div>\r\n\r\n <div class=\"ug-header-cell-label\" (click)=\"col.sortable !== false ? onSort(col) : null\" [class.sortable]=\"col.sortable !== false\">\r\n <span>{{ col.headerName || col.field }}</span>\r\n \r\n <div class=\"ug-sort-icon\" *ngIf=\"col.sortable !== false && getSortDirection(col.field)\">\r\n <svg *ngIf=\"getSortDirection(col.field) === 'desc'\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><polyline points=\"19 12 12 19 5 12\"></polyline></svg>\r\n <svg *ngIf=\"getSortDirection(col.field) === 'asc'\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"5\"></line><polyline points=\"5 12 12 5 19 12\"></polyline></svg>\r\n </div>\r\n </div>\r\n\r\n <div class=\"ug-header-filter-icon\" (click)=\"onFilterClick(col, $event)\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>\r\n </div>\r\n\r\n <div class=\"ug-header-menu-icon\" (click)=\"onMenuClick(col, $event)\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"1\"></circle><circle cx=\"12\" cy=\"5\" r=\"1\"></circle><circle cx=\"12\" cy=\"19\" r=\"1\"></circle></svg>\r\n </div>\r\n\r\n <div class=\"ug-header-divider\" *ngIf=\"!isLast\"></div>\r\n\r\n <div \r\n *ngIf=\"col.resizable !== false\"\r\n class=\"ug-resize-handle\" \r\n [class.ug-hide-resizer]=\"isLast\"\r\n [ugColumnResize]=\"col.field\" \r\n (resizeEnd)=\"onResize($event)\"\r\n (click)=\"$event.stopPropagation()\">\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n ug-header {\r\n display: block;\r\n background-color: var(--ug-header-bg);\r\n border-bottom: 1px solid var(--ug-border-color);\r\n position: sticky;\r\n top: 0;\r\n z-index: 10;\r\n color: var(--ug-header-color);\r\n font-weight: var(--ug-header-font-weight);\r\n }\r\n .ug-header-row {\r\n display: inline-flex;\r\n min-width: 100%;\r\n height: 48px;\r\n }\r\n .ug-header-cell {\r\n display: flex;\r\n align-items: center;\r\n padding: 0 0 0 16px;\r\n box-sizing: border-box;\r\n position: relative;\r\n user-select: none;\r\n background-color: var(--ug-header-bg);\r\n transition: background-color 0.2s;\r\n flex-shrink: 0;\r\n flex-grow: 1;\r\n }\r\n .ug-header-cell:hover {\r\n background-color: var(--ug-header-hover-bg);\r\n }\r\n .ug-pinned-left {\r\n position: sticky;\r\n z-index: 2;\r\n border-right: 1px solid var(--ug-border-color);\r\n }\r\n .ug-pinned-right {\r\n position: sticky;\r\n z-index: 2;\r\n border-left: 1px solid var(--ug-border-color);\r\n }\r\n .ug-header-checkbox {\r\n margin-right: 12px;\r\n display: flex;\r\n align-items: center;\r\n }\r\n .ug-header-checkbox input[type=\"checkbox\"] {\r\n width: 16px;\r\n height: 16px;\r\n cursor: pointer;\r\n accent-color: var(--ug-primary-color);\r\n }\r\n .ug-header-cell-label {\r\n flex: 1;\r\n display: flex;\r\n align-items: center;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n height: 100%;\r\n }\r\n .ug-header-cell-label.sortable {\r\n cursor: pointer;\r\n }\r\n .ug-header-cell-label span {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n .ug-sort-icon {\r\n margin-left: 6px;\r\n display: flex;\r\n align-items: center;\r\n color: var(--ug-icon-color);\r\n }\r\n .ug-header-menu-icon, .ug-header-filter-icon {\r\n padding: 0 4px;\r\n cursor: pointer;\r\n color: var(--ug-icon-color);\r\n display: flex;\r\n align-items: center;\r\n opacity: 0;\r\n transition: opacity 0.2s;\r\n }\r\n .ug-header-menu-icon {\r\n padding-right: 8px; \r\n }\r\n .ug-header-cell:hover .ug-header-menu-icon,\r\n .ug-header-cell:hover .ug-header-filter-icon {\r\n opacity: 1;\r\n }\r\n .ug-header-divider {\r\n width: 1px;\r\n height: 50%;\r\n background-color: var(--ug-border-color);\r\n margin-right: 2px;\r\n }\r\n .ug-resize-handle {\r\n position: absolute;\r\n right: 0;\r\n top: 0;\r\n bottom: 0;\r\n width: 5px;\r\n cursor: col-resize;\r\n background-color: transparent;\r\n z-index: 1;\r\n }\r\n .ug-resize-handle:hover, .ug-resize-handle:active {\r\n background-color: var(--ug-primary-color);\r\n }\r\n .ug-hide-resizer {\r\n display: none !important;\r\n }\r\n .cdk-drag-preview {\r\n box-sizing: border-box;\r\n background-color: var(--ug-header-bg);\r\n border: 1px solid var(--ug-border-color);\r\n box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1);\r\n display: flex;\r\n align-items: center;\r\n padding: 0 16px;\r\n font-weight: var(--ug-header-font-weight);\r\n color: var(--ug-header-color);\r\n font-size: var(--ug-font-size);\r\n font-family: var(--ug-font-family);\r\n }\r\n .cdk-drag-placeholder {\r\n opacity: 0.3;\r\n }\r\n .cdk-drag-animating {\r\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class HeaderComponent {\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Input() sortModel: { field: string, direction: 'asc' | 'desc' }[] = [];\r\n @Input() isAllSelected: boolean = false;\r\n\r\n @Output() sortChanged = new EventEmitter<{ field: string, direction: 'asc' | 'desc' | null }>();\r\n @Output() columnsReordered = new EventEmitter<UltraGridColumn[]>();\r\n @Output() columnResized = new EventEmitter<{ field: string, width: number }>();\r\n @Output() headerCheckboxClicked = new EventEmitter<boolean>();\r\n @Output() menuClicked = new EventEmitter<{ column: UltraGridColumn, event: MouseEvent }>();\r\n @Output() filterClicked = new EventEmitter<{ column: UltraGridColumn, event: MouseEvent }>();\r\n\r\n getSortDirection(field: string): 'asc' | 'desc' | null {\r\n const model = this.sortModel.find(m => m.field === field);\r\n return model ? model.direction : null;\r\n }\r\n\r\n onSort(col: UltraGridColumn) {\r\n const current = this.getSortDirection(col.field);\r\n let next: 'asc' | 'desc' | null = 'asc';\r\n if (current === 'asc') next = 'desc';\r\n else if (current === 'desc') next = null;\r\n\r\n this.sortChanged.emit({ field: col.field, direction: next });\r\n }\r\n\r\n onColumnDrop(event: CdkDragDrop<string[]>) {\r\n const reordered = [...this.columns];\r\n moveItemInArray(reordered, event.previousIndex, event.currentIndex);\r\n this.columnsReordered.emit(reordered);\r\n }\r\n\r\n onResize(event: { field: string, width: number }) {\r\n this.columnResized.emit(event);\r\n }\r\n\r\n onHeaderCheckboxClick(event: MouseEvent) {\r\n event.stopPropagation();\r\n this.headerCheckboxClicked.emit(!this.isAllSelected);\r\n }\r\n\r\n onMenuClick(column: UltraGridColumn, event: MouseEvent) {\r\n event.stopPropagation();\r\n this.menuClicked.emit({ column, event });\r\n }\r\n\r\n onFilterClick(column: UltraGridColumn, event: MouseEvent) {\r\n event.stopPropagation();\r\n this.filterClicked.emit({ column, event });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\nimport { UltraGridRow } from '../../models/row.model';\r\n\r\n@Component({\r\n selector: 'ug-cell',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"ug-cell-wrapper\" [style.padding-left.px]=\"isFirstColumn && row.level ? row.level * 20 : 0\">\r\n \r\n <!-- Group Expand/Collapse Caret -->\r\n <div \r\n class=\"ug-group-caret\" \r\n *ngIf=\"isFirstColumn && isGroup\"\r\n (click)=\"onGroupToggleClick($event)\">\r\n <svg *ngIf=\"groupExpanded\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n <svg *ngIf=\"!groupExpanded\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </div>\r\n\r\n <div class=\"ug-cell-checkbox\" *ngIf=\"column.checkboxSelection && row.type !== 'group-footer'\" (click)=\"onCheckboxClick($event)\">\r\n <input type=\"checkbox\" [checked]=\"isSelected\" />\r\n </div>\r\n <ng-container *ngIf=\"column.cellTemplate; else defaultCell\">\r\n <ng-container *ngTemplateOutlet=\"column.cellTemplate; context: { $implicit: row?.data, row: row, column: column }\"></ng-container>\r\n </ng-container>\r\n <ng-template #defaultCell>\r\n <div class=\"ug-cell-content\" [title]=\"value\">\r\n <ng-container *ngIf=\"isFirstColumn && isGroup\">\r\n <b>{{ value }}</b>\r\n <span class=\"ug-group-count\" *ngIf=\"row?.type === 'group'\">({{ $any(row).childCount || 0 }})</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"isGroupFooter\">\r\n <b *ngIf=\"isFirstColumn\">\r\n {{ $any(row).groupField === 'Grand Total' ? 'Grand Total' : 'Total' }}\r\n </b>\r\n <span *ngIf=\"!isFirstColumn\">{{ formattedFooterValue }}</span>\r\n </ng-container>\r\n <ng-container *ngIf=\"!(isFirstColumn && isGroup) && !isGroupFooter\">\r\n {{ value }}\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </div>\r\n `,\r\n styles: [`\r\n ug-cell {\r\n display: flex;\r\n align-items: center;\r\n padding: 0 16px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n flex-shrink: 0;\r\n flex-grow: 1;\r\n white-space: nowrap;\r\n box-sizing: border-box;\r\n height: 100%;\r\n }\r\n .ug-cell-wrapper {\r\n display: flex;\r\n align-items: center;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n }\r\n .ug-cell-checkbox {\r\n margin-right: 12px;\r\n display: flex;\r\n align-items: center;\r\n }\r\n .ug-cell-checkbox input[type=\"checkbox\"] {\r\n width: 16px;\r\n height: 16px;\r\n cursor: pointer;\r\n accent-color: var(--ug-primary-color);\r\n }\r\n .ug-cell-content {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n width: 100%;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n }\r\n .ug-group-caret {\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n margin-right: 4px;\r\n color: var(--ug-text-color);\r\n opacity: 0.7;\r\n transition: opacity 0.2s;\r\n }\r\n .ug-group-caret:hover {\r\n opacity: 1;\r\n }\r\n .ug-group-count {\r\n font-size: 0.85em;\r\n opacity: 0.6;\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class CellComponent {\r\n @Input() column!: UltraGridColumn;\r\n @Input() row!: UltraGridRow;\r\n @Input() isSelected?: boolean = false;\r\n @Input() isFirstColumn: boolean = false;\r\n @Input() groupExpanded: boolean = false;\r\n\r\n @Output() groupToggleClicked = new EventEmitter<void>();\r\n\r\n get isGroup(): boolean {\r\n return !!this.row && this.row.type === 'group';\r\n }\r\n\r\n get isGroupFooter(): boolean {\r\n return !!this.row && this.row.type === 'group-footer';\r\n }\r\n\r\n get value(): any {\r\n return this.row && this.row.data ? this.row.data[this.column.field] : null;\r\n }\r\n\r\n get formattedFooterValue(): string {\r\n const v = this.value;\r\n if (v == null) return '';\r\n if (typeof v === 'number' && isFinite(v)) {\r\n return v.toLocaleString();\r\n }\r\n // Try parsing string numbers\r\n const num = Number(v);\r\n if (!isNaN(num) && isFinite(num)) {\r\n return num.toLocaleString();\r\n }\r\n return v;\r\n }\r\n\r\n onCheckboxClick(event: MouseEvent) {\r\n // Handled up the pipe by the row selection\r\n }\r\n\r\n onGroupToggleClick(event: MouseEvent) {\r\n event.stopPropagation();\r\n this.groupToggleClicked.emit();\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation, HostBinding } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\nimport { UltraGridRow } from '../../models/row.model';\r\nimport { CellComponent } from '../cell/cell.component';\r\n\r\n@Component({\r\n selector: 'ug-row',\r\n standalone: true,\r\n imports: [CommonModule, CellComponent],\r\n template: `\r\n <div class=\"ug-row-cells\">\r\n <ug-cell \r\n *ngFor=\"let col of columns; let isFirst = first; trackBy: trackByField\"\r\n [column]=\"col\"\r\n [row]=\"row\"\r\n [isSelected]=\"$any(row)?.selected\"\r\n [isFirstColumn]=\"isFirst\"\r\n [groupExpanded]=\"isExpanded\"\r\n (groupToggleClicked)=\"onGroupToggle()\"\r\n [style.width.px]=\"col.width || 200\"\r\n [style.min-width.px]=\"col.minWidth\"\r\n [style.max-width.px]=\"col.maxWidth\"\r\n [class.ug-cell-hide]=\"col.hide\"\r\n [class.ug-pinned-left]=\"col.pinned === 'left'\"\r\n [class.ug-pinned-right]=\"col.pinned === 'right'\"\r\n [style.left.px]=\"col._leftOffset\"\r\n [style.right.px]=\"col._rightOffset\">\r\n </ug-cell>\r\n </div>\r\n `,\r\n styles: [`\r\n ug-row {\r\n display: inline-flex;\r\n min-width: 100%;\r\n border-bottom: 1px solid var(--ug-border-color);\r\n background-color: var(--ug-row-bg);\r\n box-sizing: border-box;\r\n transition: background-color 0.2s;\r\n }\r\n ug-row:hover {\r\n background-color: var(--ug-row-hover-bg);\r\n }\r\n ug-row.ug-row-selected {\r\n background-color: var(--ug-row-selected-bg);\r\n }\r\n ug-row.ug-row-group-footer {\r\n background-color: var(--ug-group-footer-bg, #f8f9fa);\r\n font-weight: 600;\r\n border-top: 1px solid var(--ug-border-color);\r\n border-bottom: 2px solid var(--ug-border-color);\r\n }\r\n ug-row.ug-row-group-footer:hover {\r\n background-color: var(--ug-group-footer-bg, #f8f9fa);\r\n }\r\n .ug-row-cells {\r\n display: flex;\r\n width: 100%;\r\n height: 100%;\r\n }\r\n .ug-cell-hide {\r\n display: none !important;\r\n }\r\n ug-cell.ug-pinned-left {\r\n position: sticky;\r\n z-index: 1;\r\n border-right: 1px solid var(--ug-border-color);\r\n background-color: inherit;\r\n }\r\n ug-cell.ug-pinned-right {\r\n position: sticky;\r\n z-index: 1;\r\n border-left: 1px solid var(--ug-border-color);\r\n background-color: inherit;\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class RowComponent {\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Input() row!: UltraGridRow;\r\n @Input() rowHeight: number = 42;\r\n @Input() isExpanded: boolean = false;\r\n @Input() selectionVersion: number = 0;\r\n\r\n @Output() groupToggled = new EventEmitter<void>();\r\n\r\n @HostBinding('class.ug-row-selected') get isSelected() {\r\n return this.row?.selected;\r\n }\r\n\r\n @HostBinding('class.ug-row-group-footer') get isGroupFooter() {\r\n return this.row?.type === 'group-footer';\r\n }\r\n\r\n @HostBinding('style.height.px') get height() {\r\n return this.rowHeight;\r\n }\r\n\r\n trackByField(index: number, col: UltraGridColumn): string {\r\n return col.field;\r\n }\r\n\r\n onGroupToggle() {\r\n this.groupToggled.emit();\r\n }\r\n\r\n}","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'ug-pagination',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule], // Add FormsModule here\r\n template: `\r\n <div class=\"ug-pagination-container\">\r\n <div class=\"ug-pagination-left\">\r\n <!-- Optional space for additional footer info -->\r\n </div>\r\n <div class=\"ug-pagination-right\" *ngIf=\"showControls\">\r\n <div class=\"ug-page-size\">\r\n <span>Page Size:</span>\r\n <select [ngModel]=\"isAllSelectedSize ? 'All' : pageSize\" (ngModelChange)=\"onPageSizeChange($event)\">\r\n <option [ngValue]=\"10\">10</option>\r\n <option [ngValue]=\"25\">25</option>\r\n <option [ngValue]=\"50\">50</option>\r\n <option [ngValue]=\"100\">100</option>\r\n <option [ngValue]=\"500\">500</option>\r\n <option [ngValue]=\"'All'\">All</option>\r\n </select>\r\n </div>\r\n <div class=\"ug-pagination-info\">\r\n {{ startRow }} to {{ endRow }} of {{ totalCount || 'many' }}\r\n </div>\r\n <div class=\"ug-pagination-controls\">\r\n <button [disabled]=\"isFirstPage\" (click)=\"onPage(1)\" title=\"First Page\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 17l-5-5 5-5M18 17l-5-5 5-5M6 17V7\"></path></svg>\r\n </button>\r\n <button [disabled]=\"isFirstPage\" (click)=\"onPrev()\" title=\"Previous Page\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\r\n </button>\r\n <span class=\"ug-page-info\">Page {{ currentPage }} of {{ totalPages }}</span>\r\n <button [disabled]=\"isLastPage\" (click)=\"onNext()\" title=\"Next Page\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\r\n </button>\r\n <button [disabled]=\"isLastPage\" (click)=\"onPage(totalPages)\" title=\"Last Page\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 17l5-5-5-5M6 17l5-5-5-5M18 17V7\"></path></svg>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n ug-pagination {\r\n display: block;\r\n border-top: 1px solid var(--ug-border-color);\r\n background-color: var(--ug-footer-bg);\r\n color: var(--ug-footer-color);\r\n font-size: var(--ug-font-size);\r\n }\r\n .ug-pagination-container {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n height: 48px;\r\n padding: 0 16px;\r\n }\r\n .ug-pagination-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 24px;\r\n }\r\n .ug-page-size {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n .ug-page-size select {\r\n border: 1px solid var(--ug-border-color);\r\n border-radius: 4px;\r\n padding: 4px 8px;\r\n background-color: var(--ug-bg-color);\r\n color: var(--ug-footer-color);\r\n cursor: pointer;\r\n font-family: var(--ug-font-family);\r\n }\r\n .ug-pagination-info {\r\n font-weight: var(--ug-header-font-weight);\r\n }\r\n .ug-pagination-controls {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n }\r\n .ug-pagination-controls button {\r\n background: none;\r\n border: none;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n cursor: pointer;\r\n color: var(--ug-icon-color);\r\n padding: 4px;\r\n border-radius: 4px;\r\n }\r\n .ug-pagination-controls button:disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n }\r\n .ug-pagination-controls button:not(:disabled):hover {\r\n background-color: var(--ug-row-hover-bg);\r\n }\r\n .ug-page-info {\r\n margin: 0 4px;\r\n }\r\n `],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class PaginationComponent {\r\n @Input() totalCount: number = 0;\r\n @Input() pageSize: number = 100;\r\n @Input() currentPage: number = 1;\r\n\r\n @Output() pageChanged = new EventEmitter<number>();\r\n @Output() pageSizeChanged = new EventEmitter<number>(); // Added new output\r\n\r\n get showControls() { return true; }\r\n get totalPages() { return Math.max(1, Math.ceil(this.totalCount / this.pageSize)); }\r\n get isFirstPage() { return this.currentPage <= 1; }\r\n // Provide for infinite scrolling where total count might not be known immediately\r\n get isLastPage() { return this.totalCount ? this.currentPage >= this.totalPages : false; }\r\n\r\n get startRow() { return this.totalCount === 0 && this.currentPage === 1 ? 0 : (this.currentPage - 1) * this.pageSize + 1; }\r\n get endRow() { return this.totalCount ? Math.min(this.currentPage * this.pageSize, this.totalCount) : this.currentPage * this.pageSize; }\r\n\r\n onPrev() {\r\n if (!this.isFirstPage) {\r\n this.pageChanged.emit(this.currentPage - 1);\r\n }\r\n }\r\n\r\n onNext() {\r\n if (!this.isLastPage) {\r\n this.pageChanged.emit(this.currentPage + 1);\r\n }\r\n }\r\n\r\n // Added new method\r\n onPage(page: number) {\r\n if (page >= 1 && page <= this.totalPages && page !== this.currentPage) {\r\n this.pageChanged.emit(page);\r\n }\r\n }\r\n\r\n get isAllSelectedSize() {\r\n return this.pageSize === this.totalCount && this.totalCount > 0;\r\n }\r\n\r\n // Added new method\r\n onPageSizeChange(size: any) {\r\n if (size === 'All') {\r\n this.pageSizeChanged.emit(this.totalCount);\r\n } else {\r\n this.pageSizeChanged.emit(Number(size));\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, HostListener, ViewEncapsulation, ElementRef, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\n\r\n@Component({\r\n selector: 'ug-header-menu',\r\n standalone: true,\r\n imports: [CommonModule],\r\n template: `\r\n <div class=\"ug-header-menu-backdrop\" *ngIf=\"isOpen\" (click)=\"onClose()\"></div>\r\n <div class=\"ug-header-menu-panel\" *ngIf=\"isOpen\" [style.top.px]=\"position.y\" [style.left.px]=\"position.x\">\r\n \r\n <!-- Sorting -->\r\n <div class=\"ug-menu-item\" (click)=\"onSort('asc')\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 19V5M5 12l7-7 7 7\"/></svg>\r\n <span>Sort Ascending</span>\r\n </div>\r\n <div class=\"ug-menu-item\" (click)=\"onSort('desc')\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M12 5v14M5 12l7 7 7-7\"/></svg>\r\n <span>Sort Descending</span>\r\n </div>\r\n\r\n <div class=\"ug-menu-separator\"></div>\r\n\r\n <!-- Pinning (Submenu trigger) -->\r\n <div class=\"ug-menu-item ug-has-submenu\" (mouseenter)=\"showPinSubmenu = true\" (mouseleave)=\"showPinSubmenu = false\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M16 10l-4 4-4-4\"/></svg>\r\n <span>Pin Column</span>\r\n <svg class=\"ug-menu-arrow\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M9 18l6-6-6-6\"/></svg>\r\n\r\n <div class=\"ug-submenu\" *ngIf=\"showPinSubmenu\">\r\n <div class=\"ug-menu-item\" (click)=\"onPin(null)\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" [style.visibility]=\"column?.pinned ? 'hidden' : 'visible'\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n <span>No Pin</span>\r\n </div>\r\n <div class=\"ug-menu-item\" (click)=\"onPin('left')\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" [style.visibility]=\"column?.pinned === 'left' ? 'visible' : 'hidden'\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n <span>Pin Left</span>\r\n </div>\r\n <div class=\"ug-menu-item\" (click)=\"onPin('right')\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" [style.visibility]=\"column?.pinned === 'right' ? 'visible' : 'hidden'\"><path d=\"M20 6L9 17l-5-5\"/></svg>\r\n <span>Pin Right</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"ug-menu-separator\"></div>\r\n\r\n <!-- Autosize -->\r\n <div class=\"ug-menu-item\" (click)=\"onAutosize(false)\">\r\n <span class=\"ug-menu-text-only\">Autosize This Column</span>\r\n </div>\r\n <div class=\"ug-menu-item\" (click)=\"onAutosize(true)\">\r\n <span class=\"ug-menu-text-only\">Autosize All Columns</span>\r\n </div>\r\n\r\n <div class=\"ug-menu-separator\"></div>\r\n\r\n <!-- Grouping -->\r\n <div class=\"ug-menu-item\" (click)=\"onGroup()\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 3H3v18h18V3zM3 9h18M9 21V9\"/></svg>\r\n <span>{{ isGrouped ? 'Un-Group by' : 'Group by' }} {{ column?.headerName || column?.field }}</span>\r\n </div>\r\n\r\n <div class=\"ug-menu-separator\"></div>\r\n\r\n <!-- Choose Columns -->\r\n <div class=\"ug-menu-item\" (click)=\"onChooseColumns()\">\r\n <svg class=\"ug-menu-icon\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><path d=\"M9 3v18\"/></svg>\r\n <span>Choose Columns</span>\r\n </div>\r\n\r\n </div>\r\n `,\r\n styleUrls: ['./header-menu.component.scss'],\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class HeaderMenuComponent {\r\n @Input() column?: UltraGridColumn;\r\n @Input() isOpen = false;\r\n @Input() position = { x: 0, y: 0 };\r\n @Input() groupModel: string[] = [];\r\n\r\n @Output() closeMenu = new EventEmitter<void>();\r\n @Output() sort = new EventEmitter<{ field: string, direction: 'asc' | 'desc' }>();\r\n @Output() pin = new EventEmitter<{ field: string, pinned: 'left' | 'right' | null }>();\r\n @Output() autosize = new EventEmitter<{ field: string, all: boolean }>();\r\n @Output() group = new EventEmitter<{ field: string }>();\r\n @Output() chooseColumns = new EventEmitter<void>();\r\n\r\n showPinSubmenu = false;\r\n\r\n get isGrouped(): boolean {\r\n return !!this.column && this.groupModel.includes(this.column.field);\r\n }\r\n\r\n constructor(private el: ElementRef) { }\r\n\r\n onClose() {\r\n this.closeMenu.emit();\r\n }\r\n\r\n onSort(direction: 'asc' | 'desc') {\r\n if (this.column) {\r\n this.sort.emit({ field: this.column.field, direction });\r\n }\r\n this.onClose();\r\n }\r\n\r\n onPin(pinned: 'left' | 'right' | null) {\r\n if (this.column) {\r\n this.pin.emit({ field: this.column.field, pinned });\r\n }\r\n this.onClose();\r\n }\r\n\r\n onAutosize(all: boolean) {\r\n if (this.column) {\r\n this.autosize.emit({ field: this.column.field, all });\r\n }\r\n this.onClose();\r\n }\r\n\r\n onGroup() {\r\n if (this.column) {\r\n this.group.emit({ field: this.column.field });\r\n }\r\n this.onClose();\r\n }\r\n\r\n onChooseColumns() {\r\n this.chooseColumns.emit();\r\n this.onClose();\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\n\r\n@Component({\r\n selector: 'ug-choose-columns',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, DragDropModule],\r\n template: `\r\n <div class=\"ug-choose-columns-panel\">\r\n \r\n <div class=\"ug-cc-header\">\r\n <span class=\"ug-cc-title\">Choose Columns</span>\r\n <button class=\"ug-cc-close\" (click)=\"onClose()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 6L6 18M6 6l12 12\"/></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"ug-cc-search\">\r\n <div class=\"ug-cc-search-icon\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>\r\n </div>\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchQuery\" />\r\n </div>\r\n\r\n <div class=\"ug-cc-list\" cdkDropList (cdkDropListDropped)=\"onDrop($event)\">\r\n <ng-container *ngFor=\"let col of columns\">\r\n <div class=\"ug-cc-item\" cdkDrag *ngIf=\"matchesSearch(col)\">\r\n \r\n <label class=\"ug-cc-label\">\r\n <input type=\"checkbox\" [checked]=\"!col.hide\" (change)=\"toggleVisibility(col)\" />\r\n <span class=\"ug-cc-drag-handle\" cdkDragHandle>\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M8 6h.01M16 6h.01M8 12h.01M16 12h.01M8 18h.01M16 18h.01\"/></svg>\r\n </span>\r\n <span class=\"ug-cc-name\">{{ col.headerName || col.field }}</span>\r\n </label>\r\n\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n `,\r\n styleUrls: ['./choose-columns.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ChooseColumnsComponent {\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Output() columnsChanged = new EventEmitter<UltraGridColumn[]>();\r\n @Output() closePanel = new EventEmitter<void>();\r\n\r\n searchQuery = '';\r\n\r\n onClose() {\r\n this.closePanel.emit();\r\n }\r\n\r\n matchesSearch(col: UltraGridColumn): boolean {\r\n if (!this.searchQuery) return true;\r\n const name = (col.headerName || col.field || '').toLowerCase();\r\n return name.includes(this.searchQuery.toLowerCase());\r\n }\r\n\r\n toggleVisibility(col: UltraGridColumn) {\r\n col.hide = !col.hide;\r\n this.emitChange();\r\n }\r\n\r\n onDrop(event: CdkDragDrop<UltraGridColumn[]>) {\r\n // Because of the *ngIf matching search, the index in the drag drop event might not match the original array \r\n // if the user is filtering. We will only allow reordering if search is empty to be safe, \r\n // or we have to map visual index to actual index.\r\n if (this.searchQuery) {\r\n // Find actual indices\r\n const visibleCols = this.columns.filter(c => this.matchesSearch(c));\r\n const movedItem = visibleCols[event.previousIndex];\r\n const targetItem = visibleCols[event.currentIndex];\r\n\r\n const actualPrevIdx = this.columns.indexOf(movedItem);\r\n const actualCurrIdx = this.columns.indexOf(targetItem);\r\n\r\n moveItemInArray(this.columns, actualPrevIdx, actualCurrIdx);\r\n } else {\r\n moveItemInArray(this.columns, event.previousIndex, event.currentIndex);\r\n }\r\n\r\n this.emitChange();\r\n }\r\n\r\n private emitChange() {\r\n this.columnsChanged.emit([...this.columns]);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\n\r\n@Component({\r\n selector: 'ug-header-filter',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ScrollingModule],\r\n template: `\r\n <div class=\"ug-header-filter-backdrop\" *ngIf=\"isOpen\" (click)=\"onClose()\"></div>\r\n <div class=\"ug-header-filter-panel\" *ngIf=\"isOpen\" [style.top.px]=\"position.y\" [style.left.px]=\"position.x\">\r\n \r\n <div class=\"ug-filter-search\">\r\n <div class=\"ug-filter-search-icon\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>\r\n </div>\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchQuery\" (ngModelChange)=\"onSearchChanged()\" />\r\n </div>\r\n\r\n <div class=\"ug-filter-list\">\r\n <!-- Select All Checkbox -->\r\n <label class=\"ug-filter-item ug-filter-select-all\">\r\n <input type=\"checkbox\" [checked]=\"isAllSelected\" (change)=\"toggleAll()\" />\r\n <span>(Select All)</span>\r\n </label>\r\n\r\n <!-- Values Checkboxes -->\r\n <cdk-virtual-scroll-viewport itemSize=\"24\" class=\"ug-filter-viewport\">\r\n <label class=\"ug-filter-item\" *cdkVirtualFor=\"let item of displayValues\">\r\n <input type=\"checkbox\" [checked]=\"selectedValues.has(item)\" (change)=\"toggleValue(item)\" />\r\n <span>{{ item === null || item === undefined || item === '' ? '(Blanks)' : item }}</span>\r\n </label>\r\n </cdk-virtual-scroll-viewport>\r\n\r\n <div class=\"ug-filter-empty\" *ngIf=\"displayValues.length === 0\">\r\n No matches found\r\n </div>\r\n </div>\r\n\r\n </div>\r\n `,\r\n styleUrls: ['./header-filter.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class HeaderFilterComponent implements OnChanges {\r\n @Input() column?: UltraGridColumn;\r\n @Input() isOpen = false;\r\n @Input() position = { x: 0, y: 0 };\r\n\r\n // All unique values extracted from the dataset\r\n @Input() uniqueValues: any[] = [];\r\n\r\n // The currently applied active filter Set for this column\r\n @Input() activeFilterSet: Set<any> = new Set();\r\n\r\n @Output() closeFilter = new EventEmitter<void>();\r\n @Output() filterApplied = new EventEmitter<{ field: string, selected: Set<any> }>();\r\n\r\n searchQuery = '';\r\n displayValues: any[] = [];\r\n\r\n // Local working copy of selected values while the menu is open\r\n selectedValues: Set<any> = new Set();\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['isOpen'] && this.isOpen) {\r\n // Reset query and clone the active filters\r\n this.searchQuery = '';\r\n this.selectedValues = new Set(this.activeFilterSet);\r\n\r\n // If the active filter was totally empty (meaning NO filter was ever applied), \r\n // Excel defaults to having EVERYTHING checked initially.\r\n if (this.activeFilterSet.size === 0) {\r\n this.uniqueValues.forEach(v => this.selectedValues.add(v));\r\n }\r\n\r\n this.applySearch();\r\n }\r\n\r\n if (changes['uniqueValues']) {\r\n this.applySearch();\r\n }\r\n }\r\n\r\n onClose() {\r\n this.closeFilter.emit();\r\n }\r\n\r\n onSearchChanged() {\r\n this.applySearch();\r\n }\r\n\r\n private applySearch() {\r\n if (!this.searchQuery) {\r\n this.displayValues = [...this.uniqueValues];\r\n } else {\r\n const lowerQ = this.searchQuery.toLowerCase();\r\n this.displayValues = this.uniqueValues.filter(val =>\r\n String(val).toLowerCase().includes(lowerQ)\r\n );\r\n }\r\n }\r\n\r\n get isAllSelected(): boolean {\r\n if (this.displayValues.length === 0) return false;\r\n return this.displayValues.every(val => this.selectedValues.has(val));\r\n }\r\n\r\n toggleAll() {\r\n const targetState = !this.isAllSelected;\r\n if (targetState) {\r\n this.displayValues.forEach(val => this.selectedValues.add(val));\r\n } else {\r\n this.displayValues.forEach(val => this.selectedValues.delete(val));\r\n }\r\n this.emitFilter();\r\n }\r\n\r\n toggleValue(val: any) {\r\n if (this.selectedValues.has(val)) {\r\n this.selectedValues.delete(val);\r\n } else {\r\n this.selectedValues.add(val);\r\n }\r\n this.emitFilter();\r\n }\r\n\r\n private emitFilter() {\r\n if (!this.column) return;\r\n\r\n // If \"Select All\" of all unique values is checked, we conceptually have NO filter.\r\n // E.g., if we select everything, we just clear the filter for performance.\r\n let finalSet = new Set(this.selectedValues);\r\n let isDefaultAllSelected = true;\r\n for (const val of this.uniqueValues) {\r\n if (!this.selectedValues.has(val)) {\r\n isDefaultAllSelected = false;\r\n break;\r\n }\r\n }\r\n\r\n if (isDefaultAllSelected) {\r\n finalSet = new Set(); // Empty means no filter\r\n }\r\n\r\n this.filterApplied.emit({ field: this.column.field, selected: finalSet });\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ViewEncapsulation, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { CdkDragDrop, DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport { UltraGridColumn, ValueColumnModel } from '../../models/column.model';\r\n\r\n@Component({\r\n selector: 'ug-column-tool-panel',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, DragDropModule],\r\n template: `\r\n <div class=\"ug-ctp-wrapper\" cdkDropListGroup>\r\n <!-- Pivot Mode Toggle (Mock) -->\r\n <div class=\"ug-ctp-pivot-mode\">\r\n <label class=\"ug-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"pivotMode\" />\r\n <span class=\"ug-slider round\"></span>\r\n </label>\r\n <span>Pivot Mode</span>\r\n </div>\r\n\r\n <!-- Column List Section -->\r\n <div class=\"ug-ctp-columns-section\">\r\n <div class=\"ug-ctp-search\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"searchQuery\" (ngModelChange)=\"applySearch()\" />\r\n </div>\r\n\r\n <div \r\n class=\"ug-ctp-list\" \r\n id=\"colList\"\r\n cdkDropList \r\n [cdkDropListData]=\"displayColumns\"\r\n [cdkDropListConnectedTo]=\"['groupList', 'valueList']\"\r\n (cdkDropListDropped)=\"onDrop($event)\">\r\n <div \r\n class=\"ug-ctp-item\" \r\n *ngFor=\"let col of displayColumns\" \r\n cdkDrag \r\n [cdkDragData]=\"col\">\r\n <input type=\"checkbox\" [checked]=\"!col.hide\" (change)=\"toggleVisibility(col)\" />\r\n <svg class=\"ug-drag-handle\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" cdkDragHandle><circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/></svg>\r\n <span class=\"ug-ctp-item-name\">{{ col.headerName || col.field }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Row Groups (Mock) -->\r\n <div class=\"ug-ctp-group\">\r\n <div class=\"ug-ctp-group-header\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"></line><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"></line><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"></line><line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"></line><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"></line><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"></line></svg>\r\n <span>Row Groups</span>\r\n </div>\r\n <div \r\n class=\"ug-ctp-dropzone\" \r\n id=\"groupList\"\r\n cdkDropList \r\n [cdkDropListData]=\"groupColumns\" \r\n [cdkDropListConnectedTo]=\"['colList']\"\r\n (cdkDropListDropped)=\"onGroupDrop($event)\"\r\n [class.empty]=\"groupColumns.length === 0\">\r\n <div *ngIf=\"groupColumns.length === 0\">Drag here to set row groups</div>\r\n <div class=\"ug-ctp-item\" *ngFor=\"let col of groupColumns\" cdkDrag [cdkDragData]=\"col\">\r\n <svg class=\"ug-drag-handle\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" cdkDragHandle><circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/></svg>\r\n <span class=\"ug-ctp-item-name\">{{ col.headerName || col.field }}</span>\r\n <span class=\"ug-ctp-remove\" (click)=\"removeGroup(col)\" style=\"margin-left:auto;cursor:pointer;\">×</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Values -->\r\n <div class=\"ug-ctp-group\">\r\n <div class=\"ug-ctp-group-header\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"4 7 4 4 20 4 20 7\"></polyline><line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\"></line><line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\"></line></svg>\r\n <span>Values</span>\r\n </div>\r\n <div \r\n class=\"ug-ctp-dropzone\" \r\n id=\"valueList\"\r\n cdkDropList \r\n [cdkDropListData]=\"valueColumns\" \r\n [cdkDropListConnectedTo]=\"['colList']\"\r\n (cdkDropListDropped)=\"onValueDrop($event)\"\r\n [class.empty]=\"valueColumns.length === 0\">\r\n <div *ngIf=\"valueColumns.length === 0\">Drag here to aggregate</div>\r\n <div class=\"ug-ctp-item\" *ngFor=\"let vCol of valueColumns\" cdkDrag [cdkDragData]=\"vCol\">\r\n <svg class=\"ug-drag-handle\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" cdkDragHandle><circle cx=\"9\" cy=\"12\" r=\"1\"/><circle cx=\"9\" cy=\"5\" r=\"1\"/><circle cx=\"9\" cy=\"19\" r=\"1\"/><circle cx=\"15\" cy=\"12\" r=\"1\"/><circle cx=\"15\" cy=\"5\" r=\"1\"/><circle cx=\"15\" cy=\"19\" r=\"1\"/></svg>\r\n <div class=\"ug-ctp-agg-selector\" (click)=\"toggleAggDropdown(vCol.field)\">\r\n <span class=\"ug-ctp-item-name\"><b>{{ vCol.aggFunc }}</b>({{ getColumnHeader(vCol.field) }})</span>\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </div>\r\n <span class=\"ug-ctp-remove\" (click)=\"removeValue(vCol.field)\" style=\"margin-left:auto;cursor:pointer;\">×</span>\r\n \r\n <!-- Dropdown Menu -->\r\n <div class=\"ug-ctp-agg-menu\" *ngIf=\"openDropdownField === vCol.field\">\r\n <div class=\"ug-ctp-agg-option\" [class.selected]=\"vCol.aggFunc === 'sum'\" (click)=\"setAggFunc(vCol, 'sum')\">sum</div>\r\n <div class=\"ug-ctp-agg-option\" [class.selected]=\"vCol.aggFunc === 'min'\" (click)=\"setAggFunc(vCol, 'min')\">min</div>\r\n <div class=\"ug-ctp-agg-option\" [class.selected]=\"vCol.aggFunc === 'max'\" (click)=\"setAggFunc(vCol, 'max')\">max</div>\r\n <div class=\"ug-ctp-agg-option\" [class.selected]=\"vCol.aggFunc === 'count'\" (click)=\"setAggFunc(vCol, 'count')\">count</div>\r\n <div class=\"ug-ctp-agg-option\" [class.selected]=\"vCol.aggFunc === 'avg'\" (click)=\"setAggFunc(vCol, 'avg')\">avg</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Export Section -->\r\n <div class=\"ug-ctp-group\" style=\"padding: 15px; text-align: center; border-top: 1px solid #e2e8f0; margin-top: auto;\">\r\n <button \r\n style=\"padding: 10px 16px; width: 100%; background: #2196f3; color: white; border: none; border-radius: 4px; font-weight: 500; cursor: pointer; display: flex; justify-content: center; align-items: center; gap: 8px;\"\r\n (click)=\"exportCsvClicked.emit()\">\r\n <svg fill=\"currentColor\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><path d=\"M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z\"/></svg>\r\n Export CSV\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n styleUrls: ['./column-tool-panel.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class ColumnToolPanelComponent implements OnChanges {\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Input() groupModel: string[] = [];\r\n @Input() valuesModel: ValueColumnModel[] = [];\r\n @Output() columnsUpdated = new EventEmitter<UltraGridColumn[]>();\r\n @Output() groupModelChanged = new EventEmitter<string[]>();\r\n @Output() valuesModelChanged = new EventEmitter<ValueColumnModel[]>();\r\n @Output() exportCsvClicked = new EventEmitter<void>();\r\n\r\n displayColumns: UltraGridColumn[] = [];\r\n groupColumns: UltraGridColumn[] = [];\r\n valueColumns: ValueColumnModel[] = [];\r\n searchQuery: string = '';\r\n pivotMode = false;\r\n openDropdownField: string | null = null;\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['columns']) {\r\n this.applySearch();\r\n }\r\n // Reconstruct groupColumns from persisted groupModel (survives tab switches)\r\n if (changes['columns'] || changes['groupModel']) {\r\n this.rebuildGroupColumns();\r\n }\r\n // Reconstruct valueColumns from persisted valuesModel (survives tab switches)\r\n if (changes['columns'] || changes['valuesModel']) {\r\n this.rebuildValueColumns();\r\n }\r\n }\r\n\r\n private rebuildGroupColumns() {\r\n if (this.groupModel.length === 0) {\r\n this.groupColumns = [];\r\n return;\r\n }\r\n // Map field names back to column definitions, preserving order\r\n this.groupColumns = this.groupModel\r\n .map(field => this.columns.find(c => c.field === field))\r\n .filter((c): c is UltraGridColumn => !!c);\r\n }\r\n\r\n getColumnHeader(field: string): string {\r\n const col = this.columns.find(c => c.field === field);\r\n return col ? (col.headerName || col.field) : field;\r\n }\r\n\r\n applySearch() {\r\n if (!this.searchQuery) {\r\n this.displayColumns = [...this.columns];\r\n } else {\r\n const q = this.searchQuery.toLowerCase();\r\n this.displayColumns = this.columns.filter(c => {\r\n const name = (c.headerName || c.field).toLowerCase();\r\n return name.includes(q);\r\n });\r\n }\r\n }\r\n\r\n toggleVisibility(col: UltraGridColumn) {\r\n // Determine the original index in the main array\r\n const realIdx = this.columns.findIndex(c => c.field === col.field);\r\n if (realIdx > -1) {\r\n const newCols = [...this.columns];\r\n newCols[realIdx] = { ...newCols[realIdx], hide: !newCols[realIdx].hide };\r\n this.columnsUpdated.emit(newCols);\r\n }\r\n }\r\n\r\n onDrop(event: CdkDragDrop<UltraGridColumn[]>) {\r\n if (this.searchQuery) return; // Drag/drop while searching is complex, ignoring for MVP\r\n\r\n if (event.previousContainer === event.container) {\r\n const newCols = [...this.columns];\r\n moveItemInArray(newCols, event.previousIndex, event.currentIndex);\r\n this.columnsUpdated.emit(newCols);\r\n }\r\n }\r\n\r\n onGroupDrop(event: CdkDragDrop<UltraGridColumn[]>) {\r\n if (event.previousContainer === event.container) {\r\n const newGrp = [...this.groupColumns];\r\n moveItemInArray(newGrp, event.previousIndex, event.currentIndex);\r\n this.groupColumns = newGrp;\r\n } else {\r\n const col = event.previousContainer.data[event.previousIndex];\r\n // Prevent duplicate groupings\r\n if (this.groupColumns.find(c => c.field === col.field)) return;\r\n\r\n const newGrp = [...this.groupColumns];\r\n newGrp.splice(event.currentIndex, 0, col);\r\n this.groupColumns = newGrp;\r\n }\r\n this.emitGroupChange();\r\n }\r\n\r\n removeGroup(col: UltraGridColumn) {\r\n this.groupColumns = this.groupColumns.filter(c => c !== col);\r\n this.emitGroupChange();\r\n }\r\n\r\n private emitGroupChange() {\r\n this.groupModelChanged.emit(this.groupColumns.map(c => c.field));\r\n }\r\n\r\n private rebuildValueColumns() {\r\n this.valueColumns = [...this.valuesModel];\r\n }\r\n\r\n onValueDrop(event: CdkDragDrop<any[]>) {\r\n if (event.previousContainer === event.container) {\r\n const newVals = [...this.valueColumns];\r\n moveItemInArray(newVals, event.previousIndex, event.currentIndex);\r\n this.valueColumns = newVals;\r\n } else {\r\n const col = event.previousContainer.data[event.previousIndex] as UltraGridColumn;\r\n // Prevent duplicate\r\n if (this.valueColumns.find(c => c.field === col.field)) return;\r\n const newVals = [...this.valueColumns];\r\n newVals.splice(event.currentIndex, 0, { field: col.field, aggFunc: 'sum' });\r\n this.valueColumns = newVals;\r\n }\r\n this.emitValuesChange();\r\n }\r\n\r\n removeValue(field: string) {\r\n this.valueColumns = this.valueColumns.filter(c => c.field !== field);\r\n this.emitValuesChange();\r\n }\r\n\r\n toggleAggDropdown(field: string) {\r\n if (this.openDropdownField === field) {\r\n this.openDropdownField = null;\r\n } else {\r\n this.openDropdownField = field;\r\n }\r\n }\r\n\r\n setAggFunc(vCol: ValueColumnModel, func: 'sum' | 'min' | 'max' | 'count' | 'avg') {\r\n vCol.aggFunc = func;\r\n this.openDropdownField = null;\r\n this.emitValuesChange();\r\n }\r\n\r\n private emitValuesChange() {\r\n this.valuesModelChanged.emit([...this.valueColumns]);\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy, ViewEncapsulation, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { UltraGridColumn } from '../../models/column.model';\r\nimport { FilterConditionType, JoinOperator, ColumnConditionFilter } from '../../models/filter.model';\r\n\r\nconst TEXT_FILTER_OPTIONS: { value: FilterConditionType; label: string }[] = [\r\n { value: 'contains', label: 'Contains' },\r\n { value: 'notContains', label: 'Not Contains' },\r\n { value: 'equals', label: 'Equals' },\r\n { value: 'notEqual', label: 'Not Equal' },\r\n { value: 'startsWith', label: 'Starts With' },\r\n { value: 'endsWith', label: 'Ends With' },\r\n { value: 'blank', label: 'Blank' },\r\n { value: 'notBlank', label: 'Not Blank' }\r\n];\r\n\r\nconst NUMBER_FILTER_OPTIONS: { value: FilterConditionType; label: string }[] = [\r\n { value: 'equals', label: 'Equals' },\r\n { value: 'notEqual', label: 'Not Equal' },\r\n { value: 'greaterThan', label: 'Greater Than' },\r\n { value: 'greaterThanOrEqual', label: 'Greater Than or Equal' },\r\n { value: 'lessThan', label: 'Less Than' },\r\n { value: 'lessThanOrEqual', label: 'Less Than or Equal' },\r\n { value: 'inRange', label: 'In Range' },\r\n { value: 'blank', label: 'Blank' },\r\n { value: 'notBlank', label: 'Not Blank' }\r\n];\r\n\r\ninterface FilterSection {\r\n column: UltraGridColumn;\r\n expanded: boolean;\r\n searchQuery: string;\r\n uniqueValues: any[];\r\n displayValues: any[];\r\n selectedValues: Set<any>;\r\n hasActiveFilter: boolean;\r\n // Condition filter state\r\n filterOptions: { value: FilterConditionType; label: string }[];\r\n cond1Type: FilterConditionType;\r\n cond1Value: string;\r\n condOperator: JoinOperator;\r\n cond2Type: FilterConditionType;\r\n cond2Value: string;\r\n cond2ValueTo: string; // For inRange\r\n hasConditionFilter: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'ug-filter-tool-panel',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule, ScrollingModule],\r\n template: `\r\n <div class=\"ug-ftp-wrapper\">\r\n <!-- Global Toolbar -->\r\n <div class=\"ug-ftp-toolbar\">\r\n <button class=\"ug-ftp-btn\" (click)=\"expandAll()\" title=\"Expand All\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n Expand All\r\n </button>\r\n <button class=\"ug-ftp-btn\" (click)=\"collapseAll()\" title=\"Collapse All\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n Collapse All\r\n </button>\r\n <button class=\"ug-ftp-btn ug-ftp-btn-clear\" (click)=\"onClearAll()\" title=\"Clear All Filters\" [disabled]=\"!hasAnyActiveFilter\">\r\n <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>\r\n Clear All\r\n </button>\r\n </div>\r\n\r\n <!-- Column Filter Sections -->\r\n <div class=\"ug-ftp-sections\">\r\n <div class=\"ug-ftp-section\" *ngFor=\"let section of sections; trackBy: trackByField\">\r\n <!-- Section Header (Accordion) -->\r\n <div class=\"ug-ftp-section-header\" (click)=\"toggleSection(section)\" [class.active-filter]=\"section.hasActiveFilter || section.hasConditionFilter\">\r\n <svg class=\"ug-ftp-caret\" [class.expanded]=\"section.expanded\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\">\r\n <polyline points=\"9 18 15 12 9 6\"></polyline>\r\n </svg>\r\n <span class=\"ug-ftp-section-title\">{{ section.column.headerName || section.column.field }}</span>\r\n <span class=\"ug-ftp-active-dot\" *ngIf=\"section.hasActiveFilter || section.hasConditionFilter\" title=\"Filter active\"></span>\r\n </div>\r\n\r\n <!-- Section Body (Expanded) -->\r\n <div class=\"ug-ftp-section-body\" *ngIf=\"section.expanded\">\r\n\r\n <!-- ======= CONDITION FILTER ======= -->\r\n <div class=\"ug-ftp-condition-block\">\r\n <!-- Condition 1 -->\r\n <select class=\"ug-ftp-cond-select\" [(ngModel)]=\"section.cond1Type\" (ngModelChange)=\"onConditionChanged(section)\">\r\n <option *ngFor=\"let opt of section.filterOptions\" [ngValue]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <input *ngIf=\"section.cond1Type !== 'blank' && section.cond1Type !== 'notBlank'\"\r\n class=\"ug-ftp-cond-input\"\r\n type=\"text\"\r\n placeholder=\"Filter value...\"\r\n [(ngModel)]=\"section.cond1Value\"\r\n (ngModelChange)=\"onConditionChanged(section)\" />\r\n\r\n <!-- AND / OR Toggle -->\r\n <div class=\"ug-ftp-operator-row\">\r\n <label class=\"ug-ftp-radio\">\r\n <input type=\"radio\" name=\"op_{{section.column.field}}\" value=\"AND\" [(ngModel)]=\"section.condOperator\" (ngModelChange)=\"onConditionChanged(section)\" />\r\n AND\r\n </label>\r\n <label class=\"ug-ftp-radio\">\r\n <input type=\"radio\" name=\"op_{{section.column.field}}\" value=\"OR\" [(ngModel)]=\"section.condOperator\" (ngModelChange)=\"onConditionChanged(section)\" />\r\n OR\r\n </label>\r\n </div>\r\n\r\n <!-- Condition 2 -->\r\n <select class=\"ug-ftp-cond-select\" [(ngModel)]=\"section.cond2Type\" (ngModelChange)=\"onConditionChanged(section)\">\r\n <option *ngFor=\"let opt of section.filterOptions\" [ngValue]=\"opt.value\">{{ opt.label }}</option>\r\n </select>\r\n <input *ngIf=\"section.cond2Type !== 'blank' && section.cond2Type !== 'notBlank'\"\r\n class=\"ug-ftp-cond-input\"\r\n type=\"text\"\r\n placeholder=\"Filter value...\"\r\n [(ngModel)]=\"section.cond2Value\"\r\n (ngModelChange)=\"onConditionChanged(section)\" />\r\n\r\n <!-- In Range second value -->\r\n <input *ngIf=\"section.cond2Type === 'inRange'\"\r\n class=\"ug-ftp-cond-input\"\r\n type=\"text\"\r\n placeholder=\"To value...\"\r\n [(ngModel)]=\"section.cond2ValueTo\"\r\n (ngModelChange)=\"onConditionChanged(section)\" />\r\n </div>\r\n\r\n <!-- ======= SET FILTER (Checkboxes) ======= -->\r\n <div class=\"ug-ftp-search\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg>\r\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"section.searchQuery\" (ngModelChange)=\"onSectionSearch(section)\" />\r\n </div>\r\n\r\n <label class=\"ug-ftp-item ug-ftp-select-all\">\r\n <input type=\"checkbox\" [checked]=\"isSectionAllSelected(section)\" (change)=\"toggleSectionAll(section)\" />\r\n <span>(Select All)</span>\r\n </label>\r\n\r\n <div class=\"ug-ftp-values\">\r\n <cdk-virtual-scroll-viewport itemSize=\"28\" class=\"ug-ftp-viewport\">\r\n <label class=\"ug-ftp-item\" *cdkVirtualFor=\"let val of section.displayValues\">\r\n <input type=\"checkbox\" [checked]=\"section.selectedValues.has(val)\" (change)=\"toggleValue(section, val)\" />\r\n <span>{{ val === null || val === undefined || val === '' ? '(Blanks)' : val }}</span>\r\n </label>\r\n </cdk-virtual-scroll-viewport>\r\n <div class=\"ug-ftp-empty\" *ngIf=\"section.displayValues.length === 0\">\r\n No values found\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styleUrls: ['./filter-tool-panel.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class FilterToolPanelComponent implements OnChanges {\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Input() rowData: any[] = [];\r\n @Input() activeFilters: Map<string, Set<any>> = new Map();\r\n\r\n @Output() filterApplied = new EventEmitter<{ field: string, selected: Set<any> }>();\r\n @Output() conditionFilterChanged = new EventEmitter<{ field: string, filter: ColumnConditionFilter | null }>();\r\n @Output() clearAllFilters = new EventEmitter<void>();\r\n\r\n sections: FilterSection[] = [];\r\n private _loadedFields = new Set<string>();\r\n\r\n constructor(private cdr: ChangeDetectorRef) { }\r\n\r\n get hasAnyActiveFilter(): boolean {\r\n return this.sections.some(s => s.hasActiveFilter || s.hasConditionFilter);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['columns']) {\r\n this.buildSections();\r\n }\r\n\r\n if (changes['activeFilters']) {\r\n this.syncActiveFilters();\r\n }\r\n }\r\n\r\n private buildSections() {\r\n const oldStateMap = new Map<string, FilterSection>();\r\n for (const s of this.sections) {\r\n oldStateMap.set(s.column.field, s);\r\n }\r\n\r\n this._loadedFields.clear();\r\n\r\n this.sections = this.columns\r\n .map(col => {\r\n const existing = this.activeFilters.get(col.field);\r\n const hasActive = !!existing && existing.size > 0;\r\n const old = oldStateMap.get(col.field);\r\n\r\n // Auto-detect if column is numeric from first non-null value\r\n const isNumeric = this.detectNumericColumn(col.field);\r\n const filterOptions = isNumeric ? NUMBER_FILTER_OPTIONS : TEXT_FILTER_OPTIONS;\r\n\r\n const section: FilterSection = {\r\n column: col,\r\n expanded: old ? old.expanded : false,\r\n searchQuery: old ? old.searchQuery : '',\r\n uniqueValues: [],\r\n displayValues: [],\r\n selectedValues: new Set(),\r\n hasActiveFilter: hasActive,\r\n filterOptions: filterOptions,\r\n cond1Type: old ? old.cond1Type : (isNumeric ? 'equals' : 'contains'),\r\n cond1Value: old ? old.cond1Value : '',\r\n condOperator: old ? old.condOperator : 'AND',\r\n cond2Type: old ? old.cond2Type : (isNumeric ? 'equals' : 'contains'),\r\n cond2Value: old ? old.cond2Value : '',\r\n cond2ValueTo: old ? old.cond2ValueTo : '',\r\n hasConditionFilter: old ? old.hasConditionFilter : false\r\n };\r\n\r\n if (section.expanded) {\r\n this.ensureSectionLoaded(section);\r\n }\r\n\r\n return section;\r\n });\r\n }\r\n\r\n private detectNumericColumn(field: string): boolean {\r\n // Sample first 10 non-null values to detect type\r\n let count = 0;\r\n for (let i = 0; i < this.rowData.length && count < 10; i++) {\r\n const val = this.rowData[i][field];\r\n if (val !== null && val !== undefined && val !== '') {\r\n if (typeof val === 'number') return true;\r\n // Check if string looks like a number (but not \"$...\" formatted)\r\n const str = String(val);\r\n if (str.startsWith('$')) {\r\n // Currency — treat as number\r\n const numPart = str.replace(/[$,]/g, '');\r\n if (!isNaN(Number(numPart))) return true;\r\n }\r\n if (!isNaN(Number(str))) return true;\r\n count++;\r\n if (count >= 3) return false; // 3 non-numeric strings = text column\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private ensureSectionLoaded(section: FilterSection) {\r\n if (this._loadedFields.has(section.column.field)) return;\r\n this._loadedFields.add(section.column.field);\r\n\r\n const field = section.column.field;\r\n const uniqueSet = new Set<any>();\r\n\r\n for (let i = 0; i < this.rowData.length; i++) {\r\n uniqueSet.add(this.rowData[i][field]);\r\n }\r\n\r\n section.uniqueValues = Array.from(uniqueSet).sort((a, b) => {\r\n if (a === null || a === undefined || a === '') return -1;\r\n if (b === null || b === undefined || b === '') return 1;\r\n return a > b ? 1 : -1;\r\n });\r\n\r\n const existing = this.activeFilters.get(field);\r\n if (existing && existing.size > 0) {\r\n section.selectedValues = new Set(existing);\r\n } else {\r\n section.selectedValues = new Set(section.uniqueValues);\r\n }\r\n\r\n section.displayValues = [...section.uniqueValues];\r\n\r\n if (section.searchQuery) {\r\n this.applySearchOnSection(section);\r\n }\r\n }\r\n\r\n private syncActiveFilters() {\r\n for (const section of this.sections) {\r\n const existing = this.activeFilters.get(section.column.field);\r\n const hasActive = !!existing && existing.size > 0;\r\n section.hasActiveFilter = hasActive;\r\n\r\n if (this._loadedFields.has(section.column.field)) {\r\n if (hasActive) {\r\n section.selectedValues = new Set(existing);\r\n } else {\r\n section.selectedValues = new Set(section.uniqueValues);\r\n }\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // --- Condition Filter Logic ---\r\n\r\n onConditionChanged(section: FilterSection) {\r\n const hasCond1 = section.cond1Value.trim() !== '' || section.cond1Type === 'blank' || section.cond1Type === 'notBlank';\r\n const hasCond2 = section.cond2Value.trim() !== '' || section.cond2Type === 'blank' || section.cond2Type === 'notBlank';\r\n\r\n if (!hasCond1 && !hasCond2) {\r\n section.hasConditionFilter = false;\r\n this.conditionFilterChanged.emit({ field: section.column.field, filter: null });\r\n return;\r\n }\r\n\r\n section.hasConditionFilter = true;\r\n\r\n const filter: ColumnConditionFilter = {\r\n condition1: { type: section.cond1Type, value: section.cond1Value },\r\n operator: section.condOperator,\r\n condition2: hasCond2 ? { type: section.cond2Type, value: section.cond2Value, valueTo: section.cond2ValueTo } : undefined\r\n };\r\n\r\n this.conditionFilterChanged.emit({ field: section.column.field, filter });\r\n }\r\n\r\n // --- Accordion Controls ---\r\n\r\n toggleSection(section: FilterSection) {\r\n section.expanded = !section.expanded;\r\n if (section.expanded) {\r\n this.ensureSectionLoaded(section);\r\n }\r\n }\r\n\r\n expandAll() {\r\n this.sections.forEach(s => {\r\n s.expanded = true;\r\n this.ensureSectionLoaded(s);\r\n });\r\n }\r\n\r\n collapseAll() {\r\n this.sections.forEach(s => s.expanded = false);\r\n }\r\n\r\n // --- Search ---\r\n\r\n onSectionSearch(section: FilterSection) {\r\n this.applySearchOnSection(section);\r\n }\r\n\r\n private applySearchOnSection(section: FilterSection) {\r\n if (!section.searchQuery) {\r\n section.displayValues = [...section.uniqueValues];\r\n } else {\r\n const q = section.searchQuery.toLowerCase();\r\n section.displayValues = section.uniqueValues.filter(v =>\r\n String(v).toLowerCase().includes(q)\r\n );\r\n }\r\n }\r\n\r\n // --- Checkbox Logic ---\r\n\r\n isSectionAllSelected(section: FilterSection): boolean {\r\n if (section.displayValues.length === 0) return false;\r\n return section.displayValues.every(v => section.selectedValues.has(v));\r\n }\r\n\r\n toggleSectionAll(section: FilterSection) {\r\n const targetState = !this.isSectionAllSelected(section);\r\n if (targetState) {\r\n section.displayValues.forEach(v => section.selectedValues.add(v));\r\n } else {\r\n section.displayValues.forEach(v => section.selectedValues.delete(v));\r\n }\r\n this.emitFilter(section);\r\n }\r\n\r\n toggleValue(section: FilterSection, val: any) {\r\n if (section.selectedValues.has(val)) {\r\n section.selectedValues.delete(val);\r\n } else {\r\n section.selectedValues.add(val);\r\n }\r\n this.emitFilter(section);\r\n }\r\n\r\n private emitFilter(section: FilterSection) {\r\n let isAllSelected = true;\r\n for (const v of section.uniqueValues) {\r\n if (!section.selectedValues.has(v)) {\r\n isAllSelected = false;\r\n break;\r\n }\r\n }\r\n\r\n section.hasActiveFilter = !isAllSelected;\r\n\r\n const finalSet = isAllSelected ? new Set<any>() : new Set(section.selectedValues);\r\n this.filterApplied.emit({ field: section.column.field, selected: finalSet });\r\n }\r\n\r\n // --- Clear All ---\r\n\r\n onClearAll() {\r\n for (const section of this.sections) {\r\n if (this._loadedFields.has(section.column.field)) {\r\n section.selectedValues = new Set(section.uniqueValues);\r\n section.displayValues = [...section.uniqueValues];\r\n }\r\n section.hasActiveFilter = false;\r\n section.searchQuery = '';\r\n // Reset condition filters\r\n section.cond1Value = '';\r\n section.cond2Value = '';\r\n section.cond2ValueTo = '';\r\n section.hasConditionFilter = false;\r\n }\r\n this.clearAllFilters.emit();\r\n }\r\n\r\n trackByField(index: number, section: FilterSection): string {\r\n return section.column.field;\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewEncapsulation } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ColumnToolPanelComponent } from '../column-tool-panel/column-tool-panel.component';\r\nimport { FilterToolPanelComponent } from '../filter-tool-panel/filter-tool-panel.component';\r\nimport { UltraGridColumn, ValueColumnModel } from '../../models/column.model';\r\nimport { ColumnConditionFilter } from '../../models/filter.model';\r\n\r\n@Component({\r\n selector: 'ug-side-bar',\r\n standalone: true,\r\n imports: [CommonModule, ColumnToolPanelComponent, FilterToolPanelComponent],\r\n template: `\r\n <div class=\"ug-side-bar-wrapper\">\r\n <!-- Content Area -->\r\n <div class=\"ug-side-bar-content\" *ngIf=\"activeTab\">\r\n <div class=\"ug-side-bar-header\">\r\n <span class=\"ug-side-bar-title\">{{ activeTab === 'columns' ? 'Columns' : 'Filters' }}</span>\r\n <span class=\"ug-side-bar-close\" (click)=\"closePanel()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </span>\r\n </div>\r\n \r\n <div class=\"ug-side-bar-body\">\r\n <ug-column-tool-panel \r\n *ngIf=\"activeTab === 'columns'\"\r\n [columns]=\"columns\"\r\n [groupModel]=\"groupModel\"\r\n [valuesModel]=\"valuesModel\"\r\n (columnsUpdated)=\"onColumnsChanged($event)\"\r\n (groupModelChanged)=\"onGroupModelChanged($event)\"\r\n (valuesModelChanged)=\"onValuesModelChanged($event)\"\r\n (exportCsvClicked)=\"onExportCsvClicked()\">\r\n </ug-column-tool-panel>\r\n\r\n <ug-filter-tool-panel\r\n *ngIf=\"activeTab === 'filters'\"\r\n [columns]=\"columns\"\r\n [rowData]=\"rowData\"\r\n [activeFilters]=\"activeFilters\"\r\n (filterApplied)=\"onFilterApplied($event)\"\r\n (conditionFilterChanged)=\"onConditionFilterChanged($event)\"\r\n (clearAllFilters)=\"onClearAllFilters()\">\r\n </ug-filter-tool-panel>\r\n </div>\r\n </div>\r\n\r\n <!-- Toolbar / Tabs -->\r\n <div class=\"ug-side-bar-toolbar\">\r\n <div class=\"ug-side-bar-tab\" [class.active]=\"activeTab === 'columns'\" (click)=\"toggleTab('columns')\" title=\"Columns\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"></rect>\r\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"></line>\r\n </svg>\r\n <span>Columns</span>\r\n </div>\r\n <div class=\"ug-side-bar-tab\" [class.active]=\"activeTab === 'filters'\" (click)=\"toggleTab('filters')\" title=\"Filters\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon>\r\n </svg>\r\n <span>Filters</span>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styleUrls: ['./side-bar.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class SideBarComponent {\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Input() rowData: any[] = [];\r\n @Input() activeFilters: Map<string, Set<any>> = new Map();\r\n @Input() groupModel: string[] = [];\r\n @Input() valuesModel: ValueColumnModel[] = [];\r\n\r\n @Output() columnsUpdated = new EventEmitter<UltraGridColumn[]>();\r\n @Output() groupModelUpdated = new EventEmitter<string[]>();\r\n @Output() valuesModelUpdated = new EventEmitter<ValueColumnModel[]>();\r\n @Output() exportCsvClicked = new EventEmitter<void>();\r\n @Output() filterApplied = new EventEmitter<{ field: string, selected: Set<any> }>();\r\n @Output() conditionFilterChanged = new EventEmitter<{ field: string, filter: ColumnConditionFilter | null }>();\r\n @Output() clearAllFilters = new EventEmitter<void>();\r\n\r\n activeTab: 'columns' | 'filters' | null = 'columns'; // Open by default for demo parity\r\n\r\n toggleTab(tab: 'columns' | 'filters') {\r\n if (this.activeTab === tab) {\r\n this.activeTab = null;\r\n } else {\r\n this.activeTab = tab;\r\n }\r\n }\r\n\r\n closePanel() {\r\n this.activeTab = null;\r\n }\r\n\r\n onColumnsChanged(updatedCols: UltraGridColumn[]) {\r\n this.columnsUpdated.emit(updatedCols);\r\n }\r\n\r\n onGroupModelChanged(model: string[]) {\r\n this.groupModelUpdated.emit(model);\r\n }\r\n\r\n onExportCsvClicked() {\r\n this.exportCsvClicked.emit();\r\n }\r\n\r\n onFilterApplied(event: { field: string, selected: Set<any> }) {\r\n this.filterApplied.emit(event);\r\n }\r\n\r\n onClearAllFilters() {\r\n this.clearAllFilters.emit();\r\n }\r\n\r\n onConditionFilterChanged(event: { field: string, filter: ColumnConditionFilter | null }) {\r\n this.conditionFilterChanged.emit(event);\r\n }\r\n\r\n onValuesModelChanged(model: ValueColumnModel[]) {\r\n this.valuesModelUpdated.emit(model);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UltraGridNode, UltraGridGroupNode, UltraGridGroupFooterNode } from '../models/row.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class GridFlattenerService {\r\n\r\n flatten(nodes: UltraGridNode[], groupStateMap: Map<string, boolean>, groupIncludeFooter: boolean = false): UltraGridNode[] {\r\n const result: UltraGridNode[] = [];\r\n this.traverse(nodes, groupStateMap, groupIncludeFooter, result);\r\n return result;\r\n }\r\n\r\n private traverse(nodes: UltraGridNode[], stateMap: Map<string, boolean>, groupIncludeFooter: boolean, result: UltraGridNode[]) {\r\n for (const node of nodes) {\r\n // Push the current node (could be a group header or a leaf)\r\n result.push(node);\r\n\r\n // If it's a group node, only push its children if it is explicitly expanded in the state map\r\n if (node.type === 'group') {\r\n const groupNode = node as UltraGridGroupNode;\r\n const isExpanded = stateMap.get(groupNode.id as string);\r\n\r\n if (isExpanded) {\r\n if (groupNode.children && groupNode.children.length > 0) {\r\n this.traverse(groupNode.children, stateMap, groupIncludeFooter, result);\r\n }\r\n\r\n if (groupIncludeFooter) {\r\n const footerNode: UltraGridGroupFooterNode = {\r\n id: `${groupNode.id}-footer`,\r\n type: 'group-footer',\r\n level: groupNode.level,\r\n parent: groupNode.parent,\r\n groupField: groupNode.groupField,\r\n groupKey: groupNode.groupKey,\r\n data: { ...groupNode.data } // Copy aggregated data\r\n };\r\n result.push(footerNode);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","// AUTO-GENERATED FILE. DO NOT EDIT.\n// Built from src/lib/workers/export.worker.ts\nexport const EXPORT_WORKER_CODE = `\"use strict\";(()=>{var E=1e4;addEventListener(\"message\",({data:a})=>{let{action:c,columns:e,data:l,options:u}=a;if(c===\"START_EXPORT\")try{let s=u.separator||\",\",g=u.includeHeaders!==!1,o=[];if(g){let t=e.map(n=>m(n.headerName||n.field,s)).join(s);o.push(t+\\`\n\\`)}let r=\"\",d=0,f=(t,n)=>{let C=t.data?t.data:t,y=e.map((p,h)=>{let i=C[p.field];return h===0&&n>0&&(i=\" \".repeat(n)+(i||\"\")),h===0&&t.type===\"group\"&&t.children&&(i=(i||\"\")+\\` (\\${t.children.length})\\`),m(i,s)}).join(s);if(r+=y+\\`\n\\`,d++,d>0&&d%E===0&&(o.push(r),r=\"\"),t.type===\"group\"&&t.children&&t.children.length>0)for(let p of t.children)f(p,n+1)};for(let t=0;t<l.length;t++){let n=l[t].level||0;f(l[t],n)}r&&o.push(r),postMessage({action:\"COMPLETE\",payload:{parts:o,type:\"text/csv;charset=utf-8\"}})}catch(s){postMessage({action:\"ERROR\",error:s.message||\"CSV Export Failed\"})}});function m(a,c){if(a==null)return\"\";let e=String(a);return e.includes(c)||e.includes(\\`\n\\`)||e.includes('\"')?\\`\"\\${e.replace(/\"/g,'\"\"')}\"\\`:e}})();\n`;\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { CsvExportOptions } from '../models/csv-export.model';\r\nimport { UltraGridColumn } from '../models/column.model';\r\nimport { EXPORT_WORKER_CODE } from '../workers/generated/export.worker.code';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CsvExportService {\r\n private isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) platformId: Object) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n }\r\n\r\n exportDataAsCsv(options: CsvExportOptions, columns: UltraGridColumn[], data: any[], config?: any): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.isBrowser) {\r\n console.warn('CSV Export is only supported in browser environments');\r\n return resolve();\r\n }\r\n\r\n // Initialize Worker from inline JavaScript string blob\r\n const blob = new Blob([EXPORT_WORKER_CODE], { type: 'application/javascript' });\r\n const workerUrl = URL.createObjectURL(blob);\r\n const worker = new Worker(workerUrl);\r\n\r\n worker.onmessage = ({ data: workerData }) => {\r\n const { action, payload, error } = workerData;\r\n\r\n if (action === 'COMPLETE') {\r\n this.downloadBlob(payload, options.fileName || 'export.csv');\r\n worker.terminate();\r\n URL.revokeObjectURL(workerUrl);\r\n resolve();\r\n } else if (action === 'ERROR') {\r\n worker.terminate();\r\n URL.revokeObjectURL(workerUrl);\r\n reject(new Error(error));\r\n }\r\n };\r\n\r\n worker.onerror = (err) => {\r\n worker.terminate();\r\n URL.revokeObjectURL(workerUrl);\r\n reject(err);\r\n };\r\n\r\n // Post the data to process\r\n worker.postMessage({\r\n action: 'START_EXPORT',\r\n columns,\r\n data,\r\n options\r\n });\r\n });\r\n }\r\n\r\n private downloadBlob(blobParams: { parts: string[], type: string }, fileName: string) {\r\n if (!fileName.toLowerCase().endsWith('.csv')) {\r\n fileName += '.csv';\r\n }\r\n\r\n // Add UTF-8 BOM so Excel opens CSV files with correct characters natively\r\n const BOM = '\\uFEFF';\r\n const blob = new Blob([BOM, ...blobParams.parts], { type: blobParams.type });\r\n const url = URL.createObjectURL(blob);\r\n\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n\r\n document.body.appendChild(a);\r\n a.click();\r\n\r\n // Clean up\r\n setTimeout(() => {\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }, 100);\r\n }\r\n}\r\n","import {\r\n Component, Input, Output, EventEmitter, ChangeDetectionStrategy,\r\n ViewEncapsulation, PLATFORM_ID, Inject, OnInit, OnDestroy, OnChanges, SimpleChanges,\r\n ChangeDetectorRef, NgZone\r\n} from '@angular/core';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\r\nimport { Subject, BehaviorSubject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { ColumnConditionFilter } from '../../models/filter.model';\r\n\r\nimport { UltraGridColumn, ValueColumnModel } from '../../models/column.model';\r\nimport { UltraGridRow, UltraGridNode, UltraGridGroupNode } from '../../models/row.model';\r\nimport { UltraGridConfig } from '../../models/grid-config.model';\r\nimport { SORTING_WORKER_CODE } from '../../workers/generated/sorting.worker.code';\r\nimport { ServerDataSource, GetRowsParams } from '../../datasources/server-datasource.interface';\r\nimport { InfiniteScrollDataSource } from '../../datasources/infinite-scroll.datasource';\r\nimport { GridFlattenerService } from '../../core/grid-flattener.service';\r\nimport { CsvExportService } from '../../services/csv-export.service';\r\nimport { CsvExportOptions } from '../../models/csv-export.model';\r\n\r\nimport { HeaderComponent } from '../header/header.component';\r\nimport { RowComponent } from '../row/row.component';\r\nimport { PaginationComponent } from '../pagination/pagination.component';\r\nimport { HeaderMenuComponent } from '../header-menu/header-menu.component';\r\nimport { ChooseColumnsComponent } from '../choose-columns/choose-columns.component';\r\nimport { HeaderFilterComponent } from '../header-filter/header-filter.component';\r\nimport { SideBarComponent } from '../side-bar/side-bar.component';\r\n\r\n@Component({\r\n selector: 'bways-grid',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ScrollingModule,\r\n HeaderComponent,\r\n RowComponent,\r\n PaginationComponent,\r\n HeaderMenuComponent,\r\n ChooseColumnsComponent,\r\n HeaderFilterComponent,\r\n SideBarComponent\r\n ],\r\n template: `\r\n <div class=\"ug-wrapper\" [ngClass]=\"config.theme || 'ag-theme-alpine'\">\r\n \r\n <div class=\"ug-main\">\r\n <ug-header\r\n [columns]=\"visibleColumns\"\r\n [sortModel]=\"sortModel\"\r\n [isAllSelected]=\"isAllSelected\"\r\n (sortChanged)=\"onSortChanged($event)\"\r\n (columnsReordered)=\"onColumnsReordered($event)\"\r\n (columnResized)=\"onColumnResized($event)\"\r\n (headerCheckboxClicked)=\"onHeaderCheckboxClicked($event)\"\r\n (menuClicked)=\"onHeaderMenuClicked($event)\"\r\n (filterClicked)=\"onHeaderFilterClicked($event)\">\r\n </ug-header>\r\n\r\n <div class=\"ug-body\">\r\n <ng-container *ngIf=\"isBrowser; else ssrPlaceholder\">\r\n <cdk-virtual-scroll-viewport \r\n [itemSize]=\"rowHeight\" \r\n class=\"ug-viewport\">\r\n \r\n <ug-row\r\n *cdkVirtualFor=\"let row of _internalDataSource || renderedLocalData; let i = index; trackBy: trackByRowId\"\r\n [row]=\"row || getPlaceholderRow(i)\"\r\n [columns]=\"visibleColumns\"\r\n [rowHeight]=\"rowHeight\"\r\n [isExpanded]=\"isGroupExpanded(row!)\"\r\n [selectionVersion]=\"selectionVersion\"\r\n (groupToggled)=\"toggleGroup(row!.id.toString())\"\r\n (click)=\"onRowClicked(row)\">\r\n </ug-row>\r\n\r\n </cdk-virtual-scroll-viewport>\r\n </ng-container>\r\n\r\n <ng-template #ssrPlaceholder>\r\n <div class=\"ug-ssr-container\">\r\n <ug-row\r\n *ngFor=\"let row of ssrData; trackBy: trackByRowId\"\r\n [row]=\"row\"\r\n [columns]=\"visibleColumns\"\r\n [rowHeight]=\"rowHeight\"\r\n [selectionVersion]=\"selectionVersion\">\r\n </ug-row>\r\n </div>\r\n </ng-template>\r\n </div>\r\n\r\n <div class=\"ug-status-bar\" *ngIf=\"config.statusBar\">\r\n <span>Total Rows: {{ totalCount }}</span>\r\n <span style=\"margin-left: 16px;\">Selected: {{ selectedRowsCount }}</span>\r\n </div>\r\n\r\n <ug-pagination\r\n *ngIf=\"showPagination\"\r\n [totalCount]=\"totalCount\"\r\n [pageSize]=\"pageSize\"\r\n [currentPage]=\"currentPage\"\r\n (pageChanged)=\"onPageChanged($event)\"\r\n (pageSizeChanged)=\"onPageSizeChanged($event)\">\r\n </ug-pagination>\r\n </div>\r\n\r\n <ug-side-bar \r\n *ngIf=\"config.sideBar\" \r\n [columns]=\"columns\" \r\n [rowData]=\"rowData\"\r\n [activeFilters]=\"activeFilters\"\r\n [groupModel]=\"groupModel\"\r\n [valuesModel]=\"valuesModel\"\r\n (columnsUpdated)=\"onSideBarColumnsUpdated($event)\"\r\n (groupModelUpdated)=\"onSideBarGroupModelUpdated($event)\"\r\n (valuesModelUpdated)=\"onValuesModelUpdated($event)\"\r\n (exportCsvClicked)=\"exportCsv({ mode: 'visible' })\"\r\n (filterApplied)=\"onFilterApplied($event)\"\r\n (conditionFilterChanged)=\"onConditionFilterChanged($event)\"\r\n (clearAllFilters)=\"onClearAllFilters()\">\r\n </ug-side-bar>\r\n\r\n\r\n <ug-header-menu\r\n [column]=\"activeMenuColumn\"\r\n [isOpen]=\"isMenuOpen\"\r\n [position]=\"menuPosition\"\r\n [groupModel]=\"groupModel\"\r\n (closeMenu)=\"onMenuClosed()\"\r\n (sort)=\"onMenuSort($event)\"\r\n (pin)=\"onMenuPin($event)\"\r\n (autosize)=\"onMenuAutosize($event)\"\r\n (group)=\"onMenuGroup($event)\"\r\n (chooseColumns)=\"onMenuChooseColumns()\">\r\n </ug-header-menu>\r\n\r\n <ug-header-filter\r\n [column]=\"activeFilterColumn\"\r\n [isOpen]=\"isFilterOpen\"\r\n [position]=\"filterPosition\"\r\n [uniqueValues]=\"activeFilterUniqueValues\"\r\n [activeFilterSet]=\"getFilterSetForColumn(activeFilterColumn?.field)\"\r\n (closeFilter)=\"onFilterClosed()\"\r\n (filterApplied)=\"onFilterApplied($event)\">\r\n </ug-header-filter>\r\n\r\n <div class=\"ug-cc-overlay-container\" *ngIf=\"isChooseColumnsOpen\" [style.top.px]=\"chooseColumnsPosition.y\" [style.left.px]=\"chooseColumnsPosition.x\">\r\n <ug-choose-columns \r\n [columns]=\"columns\" \r\n (columnsChanged)=\"onChooseColumnsUpdated($event)\"\r\n (closePanel)=\"isChooseColumnsOpen = false\">\r\n </ug-choose-columns>\r\n </div>\r\n\r\n </div>\r\n `,\r\n styleUrls: ['./ultra-grid.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None\r\n})\r\nexport class UltraGridComponent implements OnInit, OnDestroy, OnChanges {\r\n private _workerInitialized = false;\r\n @Input() columns: UltraGridColumn[] = [];\r\n @Input() rowData: any[] = [];\r\n @Input() serverDataSource?: ServerDataSource;\r\n @Input() config: UltraGridConfig = {\r\n rowHeight: 40,\r\n theme: 'ag-theme-alpine'\r\n };\r\n @Input() pagination: boolean = false;\r\n @Input() pageSize: number = 100;\r\n\r\n @Output() rowClicked = new EventEmitter<UltraGridRow>();\r\n @Output() sortChanged = new EventEmitter<{ field: string, direction: 'asc' | 'desc' | null }[]>();\r\n\r\n isBrowser: boolean;\r\n\r\n visibleColumns: UltraGridColumn[] = [];\r\n sortModel: { field: string, direction: 'asc' | 'desc' }[] = [];\r\n groupModel: string[] = [];\r\n valuesModel: ValueColumnModel[] = [];\r\n groupStateMap = new Map<string, boolean>();\r\n\r\n _internalDataSource?: InfiniteScrollDataSource<UltraGridRow>;\r\n _localTreeData: UltraGridNode[] = [];\r\n _unpaginatedLocalData: UltraGridRow[] = [];\r\n _mappedRowData: UltraGridRow[] = []; // Cached array\r\n renderedLocalData: UltraGridRow[] = [];\r\n ssrData: UltraGridRow[] = [];\r\n\r\n totalCount = 0;\r\n currentPage = 1;\r\n selectionVersion = 0;\r\n\r\n isMenuOpen = false;\r\n activeMenuColumn?: UltraGridColumn;\r\n menuPosition = { x: 0, y: 0 };\r\n\r\n isFilterOpen = false;\r\n activeFilterColumn?: UltraGridColumn;\r\n filterPosition = { x: 0, y: 0 };\r\n activeFilterUniqueValues: any[] = [];\r\n\r\n // Tracks active filters per column: fieldName -> Set of checked values\r\n activeFilters: Map<string, Set<any>> = new Map();\r\n\r\n // Tracks condition-based filters per column\r\n conditionFilters: Map<string, ColumnConditionFilter> = new Map();\r\n\r\n isChooseColumnsOpen = false;\r\n chooseColumnsPosition = { x: 0, y: 0 };\r\n\r\n private destroy$ = new Subject<void>();\r\n private sortingWorker?: Worker;\r\n private sortingWorkerUrl?: string;\r\n\r\n private _unflattenedTreeData: UltraGridNode[] = [];\r\n\r\n private hasCheckboxSelection = false;\r\n private hasHeaderCheckboxSelection = false;\r\n\r\n get rowHeight() { return this.config.rowHeight || 40; }\r\n get showPagination() { return this.pagination || !!this.serverDataSource; }\r\n\r\n constructor(\r\n @Inject(PLATFORM_ID) platformId: Object,\r\n private cdr: ChangeDetectorRef,\r\n private ngZone: NgZone,\r\n private flattener: GridFlattenerService,\r\n private csvExportService: CsvExportService\r\n ) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n this.initSortingWorker();\r\n }\r\n\r\n ngOnInit() {\r\n this.hasCheckboxSelection = this.columns.some(c => c.checkboxSelection);\r\n this.hasHeaderCheckboxSelection = this.columns.some(c => c.headerCheckboxSelection);\r\n this.updateVisibleColumns();\r\n\r\n if (this.serverDataSource && this.isBrowser) {\r\n if (!this.pagination) {\r\n this._internalDataSource = new InfiniteScrollDataSource<UltraGridRow>(\r\n this.wrapServerDataSource(this.serverDataSource),\r\n this.config.bufferSize || 200\r\n );\r\n } else {\r\n this.fetchServerPage(1);\r\n }\r\n }\r\n }\r\n\r\n get selectedRowsCount() {\r\n if (!this._mappedRowData) return 0;\r\n return this._mappedRowData.filter(row => (row as any).selected).length;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['rowData']) {\r\n this.totalCount = this.rowData.length;\r\n\r\n this._mappedRowData = this.rowData.map((data, index) => ({\r\n id: index,\r\n type: 'leaf',\r\n level: 0,\r\n data: data\r\n }));\r\n\r\n if (this.sortingWorker) {\r\n this.sortingWorker.postMessage({ action: 'INIT', rows: this._mappedRowData });\r\n }\r\n\r\n // We do not immediately `applyLocalData()` here anymore if we have a worker,\r\n // because INIT needs to finish first. If no worker, we apply directly.\r\n if (!this.sortingWorker) {\r\n this.applyLocalData();\r\n }\r\n\r\n if (!this.isBrowser) {\r\n this.ssrData = this.renderedLocalData.slice(0, 50);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n if (this.sortingWorker) {\r\n this.sortingWorker.terminate();\r\n }\r\n if (this.sortingWorkerUrl) {\r\n URL.revokeObjectURL(this.sortingWorkerUrl);\r\n }\r\n if (this._internalDataSource) {\r\n this._internalDataSource.disconnect();\r\n }\r\n }\r\n\r\n private initSortingWorker() {\r\n if (this.isBrowser && typeof Worker !== 'undefined') {\r\n try {\r\n // Initialize Worker from inline JavaScript string blob\r\n const blob = new Blob([SORTING_WORKER_CODE], { type: 'application/javascript' });\r\n this.sortingWorkerUrl = URL.createObjectURL(blob);\r\n this.sortingWorker = new Worker(this.sortingWorkerUrl);\r\n\r\n this.sortingWorker.onmessage = ({ data }) => {\r\n this.ngZone.run(() => {\r\n if (data && data.action === 'INIT_DONE') {\r\n this._workerInitialized = true;\r\n // Now that worker has cached the data, run the first execution\r\n this.applyLocalData();\r\n return;\r\n }\r\n\r\n const flatList = data.flatList;\r\n this._unpaginatedLocalData = flatList;\r\n\r\n const groupSelectionMap = new Map<string | number, boolean>();\r\n\r\n // If sort/group happened, the worker returns a new structural tree. Cache it.\r\n if (data.resultTree) {\r\n this._unflattenedTreeData = data.resultTree;\r\n }\r\n\r\n // Always hydrate the structural tree so group node checkmarks strictly persist across flatten events\r\n const hydrateTree = (nodes: UltraGridNode[]): boolean => {\r\n let allSelected = true;\r\n if (nodes.length === 0) allSelected = false;\r\n\r\n for (let i = 0; i < nodes.length; i++) {\r\n const node = nodes[i];\r\n if (node.type === 'leaf') {\r\n const cached = this._mappedRowData[node.id as number];\r\n if (cached) {\r\n node.data = cached.data;\r\n (node as any).selected = cached.selected;\r\n if (!cached.selected) allSelected = false;\r\n } else {\r\n allSelected = false;\r\n }\r\n } else if (node.type === 'group' && (node as any).children) {\r\n const isGroupSelected = hydrateTree((node as any).children);\r\n (node as any).selected = isGroupSelected;\r\n groupSelectionMap.set(node.id, isGroupSelected);\r\n if (!isGroupSelected) allSelected = false;\r\n }\r\n }\r\n return allSelected;\r\n };\r\n\r\n if (this._unflattenedTreeData) {\r\n hydrateTree(this._unflattenedTreeData);\r\n }\r\n\r\n // Sync the flat list data payload and strictly enforce selection states\r\n for (let i = 0; i < flatList.length; i++) {\r\n const row = flatList[i];\r\n if (row.type === 'leaf') {\r\n const cached = this._mappedRowData[row.id as number];\r\n if (cached) {\r\n if (!row.data) row.data = cached.data;\r\n row.selected = cached.selected;\r\n }\r\n } else if (row.type === 'group') {\r\n row.selected = groupSelectionMap.has(row.id) ? groupSelectionMap.get(row.id) : (row.selected || false);\r\n }\r\n }\r\n\r\n this.totalCount = this._unpaginatedLocalData.length;\r\n this.updatePaginationForLocalData();\r\n this.cdr.markForCheck();\r\n });\r\n };\r\n } catch (e) {\r\n console.warn('Web worker initialization failed, falling back to local sorting', e);\r\n }\r\n }\r\n }\r\n\r\n private updateVisibleColumns() {\r\n const temp = this.columns.filter(c => !c.hide);\r\n const left = temp.filter(c => c.pinned === 'left');\r\n const right = temp.filter(c => c.pinned === 'right');\r\n const center = temp.filter(c => !c.pinned);\r\n\r\n let currLeft = 0;\r\n left.forEach(c => {\r\n c._leftOffset = currLeft;\r\n currLeft += (c.width || 200);\r\n });\r\n\r\n let currRight = 0;\r\n [...right].reverse().forEach(c => {\r\n c._rightOffset = currRight;\r\n currRight += (c.width || 200);\r\n });\r\n\r\n this.visibleColumns = [...left, ...center, ...right];\r\n\r\n // Ensure checkbox selection strictly stays on the first visible column, regardless of Drag&Drop swaps\r\n if (this.visibleColumns.length > 0) {\r\n this.visibleColumns.forEach((c, index) => {\r\n c.checkboxSelection = index === 0 ? this.hasCheckboxSelection : false;\r\n c.headerCheckboxSelection = index === 0 ? this.hasHeaderCheckboxSelection : false;\r\n });\r\n }\r\n }\r\n\r\n private wrapServerDataSource(source: ServerDataSource): ServerDataSource<UltraGridRow> {\r\n return {\r\n getRows: (params: GetRowsParams) => {\r\n return source.getRows({ ...params, sortModel: this.sortModel }).pipe(\r\n map(res => ({\r\n ...res,\r\n rows: res.rows.map((r, i) => ({ id: i + params.startRow, type: 'leaf', level: 0, data: r }))\r\n }))\r\n );\r\n }\r\n };\r\n }\r\n\r\n applyLocalData() {\r\n if (!this.rowData) return;\r\n if (this.sortingWorker && !this._workerInitialized) return; // Wait for worker INIT_DONE\r\n\r\n let processed: UltraGridRow[] = this._mappedRowData;\r\n\r\n // Prepare Filter Model for Worker by converting Set to Array\r\n const filterModelObj: { [key: string]: any[] } = {};\r\n let hasFilter = false;\r\n if (this.activeFilters.size > 0) {\r\n hasFilter = true;\r\n for (const [field, selectedSet] of this.activeFilters.entries()) {\r\n filterModelObj[field] = Array.from(selectedSet);\r\n }\r\n }\r\n\r\n const hasSort = this.sortModel.length > 0;\r\n\r\n // Prepare State Map for Worker\r\n const stateMapObj: { [key: string]: boolean } = {};\r\n for (const [key, value] of this.groupStateMap.entries()) {\r\n stateMapObj[key] = value;\r\n }\r\n\r\n // Prepare Aggregations map: merge static aggFunc from column defs with dynamic valuesModel\r\n const aggregations: { [key: string]: string } = {};\r\n // Static aggFunc from column definitions\r\n for (const col of this.columns) {\r\n if (col.aggFunc) {\r\n aggregations[col.field] = col.aggFunc;\r\n }\r\n }\r\n // Dynamic values from Values panel\r\n if (this.valuesModel.length > 0) {\r\n for (const vCol of this.valuesModel) {\r\n if (!aggregations[vCol.field]) {\r\n aggregations[vCol.field] = vCol.aggFunc;\r\n }\r\n }\r\n } else {\r\n // Default: aggregate all numeric columns if Values panel is empty\r\n for (const col of this.columns) {\r\n if (!aggregations[col.field] && this.isNumericColumn(col.field)) {\r\n aggregations[col.field] = 'sum';\r\n }\r\n }\r\n }\r\n\r\n if (hasFilter || hasSort || this.groupModel.length > 0 || this.conditionFilters.size > 0) {\r\n if (this.sortingWorker) {\r\n this.sortingWorker.postMessage({\r\n action: 'EXECUTE',\r\n sortModel: this.sortModel,\r\n filterModel: hasFilter ? filterModelObj : null,\r\n conditionFilters: this.conditionFilters.size > 0 ? Object.fromEntries(this.conditionFilters) : null,\r\n groupModel: this.groupModel,\r\n groupStateMap: stateMapObj,\r\n aggregations: aggregations,\r\n groupIncludeFooter: !!this.config.groupIncludeFooter\r\n });\r\n return;\r\n } else {\r\n // Fallback to local filtering if Worker fails/unsupported\r\n if (hasFilter) {\r\n processed = processed.filter(row => {\r\n for (const [field, selectedSet] of this.activeFilters.entries()) {\r\n const cellValue = row.data ? row.data[field] : null;\r\n if (!selectedSet.has(cellValue)) return false;\r\n }\r\n return true;\r\n });\r\n }\r\n if (hasSort) {\r\n processed = this.sortLocal(processed);\r\n }\r\n }\r\n }\r\n\r\n this._localTreeData = processed;\r\n this.refreshFlattener();\r\n }\r\n\r\n refreshFlattener() {\r\n this._unpaginatedLocalData = this.flattener.flatten(this._localTreeData, this.groupStateMap, !!this.config.groupIncludeFooter) as UltraGridRow[];\r\n this.totalCount = this._unpaginatedLocalData.length;\r\n this.updatePaginationForLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private isNumericColumn(field: string): boolean {\r\n // Check up to the first 5 rows to determine if the column contains numeric data\r\n const rowsToCheck = Math.min(20, this._unpaginatedLocalData.length);\r\n if (rowsToCheck === 0) return false;\r\n\r\n let hasNumeric = false;\r\n\r\n for (let i = 0; i < Math.min(rowsToCheck, this._unpaginatedLocalData.length); i++) {\r\n const val = this._unpaginatedLocalData[i]?.data?.[field];\r\n if (val !== undefined && val !== null && val !== '') {\r\n const strVal = String(val);\r\n // Reject if it contains alphabetic letters (e.g. \"User 1\" or \"101 USD\")\r\n if (/[a-zA-Z]/.test(strVal)) return false;\r\n\r\n // Remove currency symbols, commas, and spaces, then check if it's a valid number\r\n const parsed = Number(strVal.replace(/[^0-9.-]+/g, ''));\r\n if (!isNaN(parsed)) {\r\n hasNumeric = true;\r\n }\r\n }\r\n }\r\n return hasNumeric;\r\n }\r\n\r\n toggleGroup(groupId: string) {\r\n const isExpanded = this.groupStateMap.get(groupId);\r\n this.groupStateMap.set(groupId, !isExpanded);\r\n\r\n const stateObj = Object.fromEntries(this.groupStateMap);\r\n\r\n if (this.sortingWorker) {\r\n // High-performance path: only trigger flattening on the already-cached tree\r\n this.sortingWorker.postMessage({\r\n action: 'FLATTEN_ONLY',\r\n groupStateMap: stateObj,\r\n groupIncludeFooter: !!this.config.groupIncludeFooter\r\n });\r\n } else {\r\n // Fallback for non-worker mode\r\n this.refreshFlattener();\r\n }\r\n }\r\n\r\n isGroupExpanded(row: UltraGridRow): boolean {\r\n if (!row || row.type !== 'group') return false;\r\n return !!this.groupStateMap.get(row.id as string);\r\n }\r\n\r\n private sortLocal(rows: UltraGridRow[]): UltraGridRow[] {\r\n return [...rows].sort((a, b) => {\r\n for (const sort of this.sortModel) {\r\n const { field, direction } = sort;\r\n const valA = a.data ? a.data[field] : null;\r\n const valB = b.data ? b.data[field] : null;\r\n\r\n if (valA === valB) continue;\r\n\r\n const comparison = valA > valB ? 1 : -1;\r\n return direction === 'asc' ? comparison : -comparison;\r\n }\r\n return 0;\r\n });\r\n }\r\n\r\n private updatePaginationForLocalData() {\r\n if (this.pagination && !this.serverDataSource) {\r\n const start = (this.currentPage - 1) * this.pageSize;\r\n const end = start + this.pageSize;\r\n this.renderedLocalData = this._unpaginatedLocalData.slice(start, end);\r\n } else if (!this.serverDataSource) {\r\n this.renderedLocalData = this._unpaginatedLocalData;\r\n }\r\n }\r\n\r\n fetchServerPage(page: number) {\r\n if (!this.serverDataSource) return;\r\n\r\n const startRow = (page - 1) * this.pageSize;\r\n const endRow = startRow + this.pageSize;\r\n\r\n this.serverDataSource.getRows({\r\n startRow,\r\n endRow,\r\n sortModel: this.sortModel\r\n }).subscribe(res => {\r\n this.totalCount = res.totalCount;\r\n this.renderedLocalData = res.rows.map((r, i) => ({ id: startRow + i, type: 'leaf', level: 0, data: r }));\r\n this.currentPage = page;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * Triggers a Web-Worker powered CSV export of the grid data.\r\n * @param options Configures whether to export all records or just visible records, as well as CSV formatting.\r\n */\r\n public async exportCsv(options: CsvExportOptions = {}): Promise<void> {\r\n const mode = options.mode || 'all';\r\n const sourceColumns = options.columnKeys\r\n ? this.columns.filter(c => options.columnKeys!.includes(c.field))\r\n : this.visibleColumns;\r\n\r\n let exportData: any[] = [];\r\n\r\n if (mode === 'all') {\r\n exportData = this.rowData;\r\n if (this.serverDataSource) {\r\n console.warn('UltraGrid: \"all\" export mode is not fully supported with ServerDataSource since all rows are not loaded locally.');\r\n }\r\n } else {\r\n // When grouped, _unpaginatedLocalData only has expanded visible nodes.\r\n // We use the full nested _unflattenedTreeData so the export worker can extract all nested rows recursively.\r\n exportData = this._unflattenedTreeData && this._unflattenedTreeData.length > 0\r\n ? this._unflattenedTreeData\r\n : this._unpaginatedLocalData;\r\n }\r\n\r\n try {\r\n await this.csvExportService.exportDataAsCsv(options, sourceColumns, exportData, this.config);\r\n } catch (error) {\r\n console.error('UltraGrid CSV Export Failed:', error);\r\n }\r\n }\r\n\r\n onPageChanged(page: number) {\r\n if (this.serverDataSource && this.pagination) {\r\n this.fetchServerPage(page);\r\n } else {\r\n this.currentPage = page;\r\n this.applyLocalData();\r\n }\r\n }\r\n\r\n onSortChanged(event: { field: string, direction: 'asc' | 'desc' | null }) {\r\n if (this.config.multiSort) {\r\n const existingIdx = this.sortModel.findIndex(m => m.field === event.field);\r\n if (event.direction === null) {\r\n if (existingIdx >= 0) {\r\n this.sortModel = this.sortModel.filter(m => m.field !== event.field);\r\n }\r\n } else {\r\n if (existingIdx >= 0) {\r\n const newModel = [...this.sortModel];\r\n newModel[existingIdx] = { ...newModel[existingIdx], direction: event.direction };\r\n this.sortModel = newModel;\r\n } else {\r\n this.sortModel = [...this.sortModel, { field: event.field, direction: event.direction }];\r\n }\r\n }\r\n } else {\r\n if (event.direction === null) this.sortModel = [];\r\n else this.sortModel = [{ field: event.field, direction: event.direction }];\r\n }\r\n\r\n this.sortChanged.emit(this.sortModel);\r\n\r\n // Re-fetch or re-sort\r\n if (this.serverDataSource) {\r\n if (this._internalDataSource) {\r\n this._internalDataSource = new InfiniteScrollDataSource<UltraGridRow>(\r\n this.wrapServerDataSource(this.serverDataSource),\r\n this.config.bufferSize || 200\r\n );\r\n } else if (this.pagination) {\r\n this.fetchServerPage(1);\r\n }\r\n } else {\r\n this.applyLocalData();\r\n }\r\n }\r\n\r\n onColumnsReordered(cols: UltraGridColumn[]) {\r\n this.columns = cols;\r\n this.updateVisibleColumns();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onSideBarColumnsUpdated(cols: UltraGridColumn[]) {\r\n this.columns = cols;\r\n this.updateVisibleColumns();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onSideBarGroupModelUpdated(model: string[]) {\r\n this.groupModel = model;\r\n this.applyLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onValuesModelUpdated(model: ValueColumnModel[]) {\r\n this.valuesModel = model;\r\n this.applyLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onColumnResized(event: { field: string, width: number }) {\r\n const col = this.columns.find(c => c.field === event.field);\r\n if (col) {\r\n col.width = event.width;\r\n this.updateVisibleColumns();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n get isAllSelected(): boolean {\r\n const targetArray = this._unpaginatedLocalData;\r\n if (!targetArray || targetArray.length === 0) return false;\r\n return targetArray.every(r => r.selected);\r\n }\r\n\r\n onHeaderCheckboxClicked(selected: boolean) {\r\n // 1. Traverse the full unflattened tree to persist selection to ALL rows matching the filter\r\n const traverse = (nodes: UltraGridNode[]) => {\r\n for (const n of nodes) {\r\n (n as any).selected = selected;\r\n if (n.type === 'leaf' && this._mappedRowData[n.id as number]) {\r\n this._mappedRowData[n.id as number].selected = selected;\r\n } else if (n.type === 'group' && (n as any).children) {\r\n traverse((n as any).children);\r\n }\r\n }\r\n };\r\n traverse(this._unflattenedTreeData);\r\n\r\n // 2. Update the currently flattened array for instant UI update\r\n for (const row of this._unpaginatedLocalData) {\r\n row.selected = selected;\r\n }\r\n\r\n this.selectionVersion++;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onPageSizeChanged(size: number) {\r\n this.pageSize = size;\r\n this.currentPage = 1;\r\n if (this.serverDataSource && this.pagination) {\r\n this.fetchServerPage(1);\r\n } else {\r\n this.updatePaginationForLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n private selectNodeAndChildren(nodeId: string | number, selected: boolean) {\r\n // Find the node in the unflattened tree using DFS\r\n const findNode = (nodes: UltraGridNode[], id: string | number): UltraGridNode | undefined => {\r\n for (const node of nodes) {\r\n if (node.id === id) return node;\r\n if (node.type === 'group' && (node as any).children) {\r\n const found = findNode((node as any).children, id);\r\n if (found) return found;\r\n }\r\n }\r\n return undefined;\r\n };\r\n\r\n const targetNode = findNode(this._unflattenedTreeData, nodeId);\r\n if (!targetNode) return;\r\n\r\n // Collect all leaf IDs under this node, and set group selections\r\n const leafIdsToUpdate = new Set<number>();\r\n const groupIdsToUpdate = new Set<string | number>();\r\n\r\n const traverse = (n: UltraGridNode) => {\r\n (n as any).selected = selected;\r\n if (n.type === 'leaf') {\r\n leafIdsToUpdate.add(n.id as number);\r\n if (this._mappedRowData[n.id as number]) {\r\n this._mappedRowData[n.id as number].selected = selected;\r\n }\r\n } else if (n.type === 'group' && (n as any).children) {\r\n groupIdsToUpdate.add(n.id);\r\n (n as any).children.forEach((child: UltraGridNode) => traverse(child));\r\n }\r\n };\r\n traverse(targetNode);\r\n\r\n // Update the flattened list in O(N) time so the UI reflects it instantly\r\n for (let i = 0; i < this._unpaginatedLocalData.length; i++) {\r\n const row = this._unpaginatedLocalData[i];\r\n if (row.type === 'leaf' && leafIdsToUpdate.has(row.id as number)) {\r\n row.selected = selected;\r\n } else if (row.type === 'group' && groupIdsToUpdate.has(row.id)) {\r\n row.selected = selected;\r\n }\r\n }\r\n }\r\n\r\n onRowClicked(row: UltraGridRow | undefined) {\r\n if (!row) return;\r\n\r\n let newSelectedState = true;\r\n\r\n if (this.config.rowSelection === 'single') {\r\n this._unpaginatedLocalData.forEach(r => r.selected = false);\r\n this._mappedRowData.forEach(r => { if (r) r.selected = false; });\r\n row.selected = true;\r\n if (row.type === 'leaf' && this._mappedRowData[row.id as number]) {\r\n this._mappedRowData[row.id as number].selected = true;\r\n }\r\n } else if (this.config.rowSelection === 'multiple') {\r\n newSelectedState = !row.selected;\r\n row.selected = newSelectedState;\r\n\r\n if (row.type === 'leaf' && this._mappedRowData[row.id as number]) {\r\n this._mappedRowData[row.id as number].selected = newSelectedState;\r\n } else if (row.type === 'group') {\r\n this.selectNodeAndChildren(row.id, newSelectedState);\r\n }\r\n }\r\n\r\n this.selectionVersion++;\r\n this.rowClicked.emit(row);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n getPlaceholderRow(index: number): UltraGridRow {\r\n return {\r\n id: `placeholder-${index}`,\r\n type: 'leaf',\r\n level: 0,\r\n data: null\r\n };\r\n }\r\n\r\n trackByRowId(index: number, item: UltraGridRow | undefined): string | number {\r\n return item ? item.id : index;\r\n }\r\n\r\n onHeaderMenuClicked(event: { column: UltraGridColumn, event: MouseEvent }) {\r\n this.activeMenuColumn = event.column;\r\n this.menuPosition = { x: event.event.clientX, y: event.event.clientY };\r\n this.isMenuOpen = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMenuClosed() {\r\n this.isMenuOpen = false;\r\n this.activeMenuColumn = undefined;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMenuSort(event: { field: string, direction: 'asc' | 'desc' }) {\r\n this.onSortChanged(event);\r\n }\r\n\r\n onMenuPin(event: { field: string, pinned: 'left' | 'right' | null }) {\r\n const col = this.columns.find(c => c.field === event.field);\r\n if (col) {\r\n col.pinned = event.pinned || undefined;\r\n this.updateVisibleColumns();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onMenuAutosize(event: { field: string, all: boolean }) {\r\n // Basic implementation: set width to 200px or calculate based on sampling\r\n // A complete implementation would measure Canvas TextMetrics\r\n if (event.all) {\r\n this.columns.forEach(c => c.width = 200);\r\n } else {\r\n const col = this.columns.find(c => c.field === event.field);\r\n if (col) col.width = 250;\r\n }\r\n this.updateVisibleColumns();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMenuGroup(event: { field: string }) {\r\n if (!this.groupModel) {\r\n this.groupModel = [];\r\n }\r\n\r\n if (this.groupModel.includes(event.field)) {\r\n // Remove from grouping\r\n this.groupModel = this.groupModel.filter(f => f !== event.field);\r\n } else {\r\n // Add to grouping\r\n this.groupModel = [...this.groupModel, event.field];\r\n }\r\n\r\n this.applyLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMenuChooseColumns() {\r\n this.isChooseColumnsOpen = true;\r\n // Position it slightly shifted from the menu icon\r\n this.chooseColumnsPosition = { x: this.menuPosition.x + 20, y: this.menuPosition.y + 20 };\r\n this.isMenuOpen = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onChooseColumnsUpdated(columns: UltraGridColumn[]) {\r\n this.columns = columns;\r\n this.updateVisibleColumns();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // --- Filter logic ---\r\n\r\n getFilterSetForColumn(field?: string): Set<any> {\r\n if (!field) return new Set();\r\n return this.activeFilters.get(field) || new Set();\r\n }\r\n\r\n onHeaderFilterClicked(event: { column: UltraGridColumn, event: MouseEvent }) {\r\n this.activeFilterColumn = event.column;\r\n this.filterPosition = { x: event.event.clientX, y: event.event.clientY };\r\n this.isFilterOpen = true;\r\n\r\n // Calculate unique values based on un-paginated / un-filtered raw data\r\n const uniqueSet = new Set<any>();\r\n this.rowData.forEach(row => {\r\n const val = row[event.column.field];\r\n uniqueSet.add(val);\r\n });\r\n\r\n // Convert to array and sort (keeping nulls/blanks separate logically)\r\n this.activeFilterUniqueValues = Array.from(uniqueSet).sort((a, b) => {\r\n if (a === null || a === undefined || a === '') return -1;\r\n if (b === null || b === undefined || b === '') return 1;\r\n return a > b ? 1 : -1;\r\n });\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onFilterClosed() {\r\n this.isFilterOpen = false;\r\n this.activeFilterColumn = undefined;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onFilterApplied(event: { field: string, selected: Set<any> }) {\r\n if (event.selected.size === 0) {\r\n // Empty filter means \"Clear Filter / Show All\"\r\n this.activeFilters.delete(event.field);\r\n } else {\r\n this.activeFilters.set(event.field, event.selected);\r\n }\r\n\r\n this.currentPage = 1; // Reset to page 1 on filter\r\n this.applyLocalData(); // Re-run pipeline (filter -> sort -> paginate)\r\n }\r\n\r\n onClearAllFilters() {\r\n this.activeFilters.clear();\r\n this.conditionFilters.clear();\r\n this.currentPage = 1;\r\n this.applyLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onConditionFilterChanged(event: { field: string, filter: ColumnConditionFilter | null }) {\r\n if (event.filter === null) {\r\n this.conditionFilters.delete(event.field);\r\n } else {\r\n this.conditionFilters.set(event.field, event.filter);\r\n }\r\n this.currentPage = 1;\r\n this.applyLocalData();\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { UltraGridComponent } from './components/ultra-grid/ultra-grid.component';\r\nimport { HeaderComponent } from './components/header/header.component';\r\nimport { RowComponent } from './components/row/row.component';\r\nimport { CellComponent } from './components/cell/cell.component';\r\nimport { PaginationComponent } from './components/pagination/pagination.component';\r\nimport { ColumnResizeDirective } from './directives/column-resize.directive';\r\nimport { SideBarComponent } from './components/side-bar/side-bar.component';\r\n\r\nconst COMPONENTS = [\r\n UltraGridComponent,\r\n HeaderComponent,\r\n RowComponent,\r\n CellComponent,\r\n PaginationComponent,\r\n ColumnResizeDirective\r\n];\r\n\r\n@NgModule({\r\n imports: [\r\n UltraGridComponent,\r\n HeaderComponent,\r\n RowComponent,\r\n CellComponent,\r\n PaginationComponent,\r\n ColumnResizeDirective,\r\n SideBarComponent\r\n ],\r\n exports: [\r\n UltraGridComponent,\r\n HeaderComponent,\r\n RowComponent,\r\n CellComponent,\r\n PaginationComponent,\r\n ColumnResizeDirective,\r\n SideBarComponent\r\n ]\r\n})\r\nexport class BwaysGridModule { }\r\n","/**\r\n * Condition-based filter model for AG Grid-style advanced filtering.\r\n * Each column can have up to 2 conditions joined by AND/OR.\r\n */\r\n\r\n// --- Text Filter Types ---\r\nexport type TextFilterType =\r\n | 'contains'\r\n | 'notContains'\r\n | 'equals'\r\n | 'notEqual'\r\n | 'startsWith'\r\n | 'endsWith'\r\n | 'blank'\r\n | 'notBlank';\r\n\r\n// --- Number Filter Types ---\r\nexport type NumberFilterType =\r\n | 'equals'\r\n | 'notEqual'\r\n | 'greaterThan'\r\n | 'greaterThanOrEqual'\r\n | 'lessThan'\r\n | 'lessThanOrEqual'\r\n | 'inRange'\r\n | 'blank'\r\n | 'notBlank';\r\n\r\nexport type FilterConditionType = TextFilterType | NumberFilterType;\r\n\r\nexport interface FilterCondition {\r\n type: FilterConditionType;\r\n value: string;\r\n valueTo?: string; // For 'inRange' only\r\n}\r\n\r\nexport type JoinOperator = 'AND' | 'OR';\r\n\r\nexport interface ColumnConditionFilter {\r\n condition1: FilterCondition;\r\n operator: JoinOperator;\r\n condition2?: FilterCondition;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Subject, Observable } from 'rxjs';\r\n\r\nexport type GridEventName = 'rowClicked' | 'columnResized' | 'sortChanged' | 'filterChanged' | 'selectionChanged';\r\n\r\nexport interface GridEvent {\r\n name: GridEventName;\r\n payload: any;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class GridEngineService {\r\n private _eventBus = new Subject<GridEvent>();\r\n\r\n get events$(): Observable<GridEvent> {\r\n return this._eventBus.asObservable();\r\n }\r\n\r\n dispatch(name: GridEventName, payload: any) {\r\n this._eventBus.next({ name, payload });\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ViewportManager {\r\n private _scrollTop = 0;\r\n private _viewportHeight = 600;\r\n private _rowHeight = 40;\r\n private _bufferSize = 20;\r\n\r\n get scrollTop(): number { return this._scrollTop; }\r\n set scrollTop(val: number) { this._scrollTop = val; }\r\n\r\n get viewportHeight(): number { return this._viewportHeight; }\r\n set viewportHeight(val: number) { this._viewportHeight = val; }\r\n\r\n get rowHeight(): number { return this._rowHeight; }\r\n set rowHeight(val: number) { this._rowHeight = val; }\r\n\r\n get bufferSize(): number { return this._bufferSize; }\r\n set bufferSize(val: number) { this._bufferSize = val; }\r\n\r\n getVisibleRange(): { start: number, end: number } {\r\n const startRowIndex = Math.floor(this._scrollTop / this._rowHeight);\r\n const endRowIndex = startRowIndex + Math.ceil(this._viewportHeight / this._rowHeight);\r\n\r\n const start = Math.max(0, startRowIndex - this._bufferSize);\r\n const end = endRowIndex + this._bufferSize;\r\n\r\n return { start, end };\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { UltraGridRow } from '../models/row.model';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RowCache {\r\n private _cache: WeakMap<any, UltraGridRow> = new WeakMap();\r\n\r\n getRow(data: any): UltraGridRow | undefined {\r\n return this._cache.get(data);\r\n }\r\n\r\n setRow(data: any, row: UltraGridRow): void {\r\n if (data) {\r\n this._cache.set(data, row);\r\n }\r\n }\r\n\r\n clear(): void {\r\n this._cache = new WeakMap();\r\n }\r\n}\r\n","/*\r\n * Public API Surface of bways-grid\r\n */\r\nexport * from './lib/bways-grid.module';\r\nexport * from './lib/components/ultra-grid/ultra-grid.component';\r\nexport * from './lib/components/header/header.component';\r\nexport * from './lib/components/row/row.component';\r\nexport * from './lib/components/cell/cell.component';\r\nexport * from './lib/components/pagination/pagination.component';\r\nexport * from './lib/components/side-bar/side-bar.component';\r\nexport * from './lib/components/column-tool-panel/column-tool-panel.component';\r\nexport * from './lib/components/filter-tool-panel/filter-tool-panel.component';\r\n\r\nexport * from './lib/directives/column-resize.directive';\r\n\r\nexport * from './lib/models/column.model';\r\nexport * from './lib/models/row.model';\r\nexport * from './lib/models/grid-config.model';\r\nexport * from './lib/models/filter.model';\r\n\r\nexport * from './lib/datasources/server-datasource.interface';\r\nexport * from './lib/datasources/infinite-scroll.datasource';\r\n\r\nexport * from './lib/core/grid-engine.service';\r\nexport * from './lib/core/viewport-manager';\r\nexport * from './lib/core/row-cache';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1.GridFlattenerService","i2.CsvExportService","i4"],"mappings":"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"}
|