osl-base-extended 1.1.44 → 1.1.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"osl-base-extended.mjs","sources":["../../../projects/osl-base-extended/src/lib/osl-base-extended.ts","../../../projects/osl-base-extended/src/lib/core/shared/components/dialog-wrapper/dialog-wrapper.ts","../../../projects/osl-base-extended/src/lib/core/shared/components/dialog-wrapper/dialog-wrapper.html","../../../projects/osl-base-extended/src/lib/core/shared/components/delete-confirmation/delete-confirmation.ts","../../../projects/osl-base-extended/src/lib/core/shared/components/delete-confirmation/delete-confirmation.html","../../../projects/osl-base-extended/src/lib/core/base/base.component.ts","../../../projects/osl-base-extended/src/lib/core/http/httpbase.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister-types.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/datasource-cache/datasource-cache.service.ts","../../../projects/osl-base-extended/src/lib/core/shared/directives/skeleton/skeleton-theme.service.ts","../../../projects/osl-base-extended/src/lib/core/shared/directives/skeleton/skeleton.directive.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/input/input.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/input/input.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/textarea/textarea.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/textarea/textarea.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/select/select.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/select/select.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/radio/radio.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/radio/radio.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/slide-toggle/slide-toggle.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/slide-toggle/slide-toggle.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete/autocomplete.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete/autocomplete.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/file-upload/file-upload.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/file-upload/file-upload.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/datepicker/datepicker.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/datepicker/datepicker.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/checkbox/checkbox.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/checkbox/checkbox.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/button/button.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/button/button.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/dynamic-form/dynamic-form.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/dynamic-form/dynamic-form.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/searchbar/searchbar.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/searchbar/searchbar.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/grid/grid.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/grid/grid.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/setup/setup.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/setup/setup.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/form-grid/form-grid.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/form-grid/form-grid.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister.html","../../../projects/osl-base-extended/src/lib/core/shared/directives/skeleton/skeleton.module.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-grid/report-grid.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-grid/report-grid.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-form/report-form.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-form/report-form.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/form-structure.module.ts","../../../projects/osl-base-extended/src/lib/core/util/array.util.ts","../../../projects/osl-base-extended/src/lib/core/util/date.util.ts","../../../projects/osl-base-extended/src/lib/core/util/number.util.ts","../../../projects/osl-base-extended/src/lib/core/util/object.util.ts","../../../projects/osl-base-extended/src/lib/core/util/storage.util.ts","../../../projects/osl-base-extended/src/lib/core/util/string.util.ts","../../../projects/osl-base-extended/src/lib/core/util/validation.util.ts","../../../projects/osl-base-extended/src/public-api.ts","../../../projects/osl-base-extended/src/osl-base-extended.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-osl-base-extended',\r\n imports: [],\r\n template: ` <p>osl-base-extended works!</p> `,\r\n styles: ``,\r\n})\r\nexport class OslBaseExtended {}\r\n","import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, Inject, TemplateRef } from '@angular/core';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n\r\n@Component({\r\n selector: 'dialog-wrapper',\r\n imports: [MatDialogModule, MatIconModule, NgTemplateOutlet, MatIconButton,NgComponentOutlet],\r\n templateUrl: './dialog-wrapper.html',\r\n styleUrl: './dialog-wrapper.scss',\r\n})\r\nexport class DialogWrapper {\r\n dialogData:Dialog= new Dialog()\r\n constructor(public dialogRef:MatDialogRef<DialogWrapper>,@Inject(MAT_DIALOG_DATA) public data: Dialog){\r\n this.dialogData.header = data.header;\r\n this.dialogData.partialHeader = data.partialHeader;\r\n this.dialogData.formBody = data.formBody;\r\n this.dialogData.formFooter = data.formFooter;\r\n this.dialogData.data = data.data\r\n this.dialogData.dialogRef = dialogRef\r\n this.dialogData.component = data.component\r\n }\r\n}\r\n\r\nexport class Dialog{\r\n header?:string|TemplateRef<any>= \"No Title Found\";\r\n partialHeader?:TemplateRef<any> | undefined;\r\n formBody?:TemplateRef<any> | undefined;\r\n formFooter?:TemplateRef<any> | undefined;\r\n data?:any;\r\n component?:any;\r\n dialogRef?:any;\r\n\r\n\r\n\r\n}\r\n","\r\n@if(dialogData.component){\r\n <ng-container [ngComponentOutlet]=\"dialogData.component\" [ngComponentOutletInputs]=\"{ data: dialogData }\"></ng-container>\r\n}\r\n@else{\r\n <div class=\"dialog-container\">\r\n \r\n <!-- Header -->\r\n @if(typeof dialogData.header == 'string') {\r\n <div class=\"dialog-header\" mat-dialog-title>\r\n <div class=\"dialog-header-left\">\r\n <div class=\"dialog-icon-ring\">\r\n <mat-icon class=\"dialog-icon\">\r\n {{ dialogData.header.startsWith('Add') ? 'add_circle' : dialogData.header.startsWith('Edit') ? 'edit' : 'info' }}\r\n </mat-icon>\r\n </div>\r\n <div class=\"dialog-title-group\">\r\n <span class=\"dialog-mode-label\">\r\n {{ dialogData.header.startsWith('Add') ? 'Creating New' : dialogData.header.startsWith('Edit') ? 'Edit' : '' }}\r\n </span>\r\n <span class=\"dialog-heading\"> {{ dialogData.header.startsWith('Add') ? dialogData.header.replace('Add','') : dialogData.header.startsWith('Edit') ? dialogData.header.replace('Edit','') : '' }}</span>\r\n </div>\r\n </div>\r\n @if(dialogData.partialHeader) {\r\n \r\n <ng-container *ngTemplateOutlet=\"dialogData.partialHeader; context: { $implicit: dialogData }\"></ng-container>\r\n }\r\n <button mat-icon-button class=\"dialog-close-btn\" mat-dialog-close>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n \r\n </div>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"dialogData.header; context: { $implicit: dialogData }\"></ng-container>\r\n }\r\n \r\n <!-- Body -->\r\n <mat-dialog-content class=\"dialog-content\">\r\n @if(dialogData.formBody) {\r\n <div class=\"dialog-body\">\r\n <ng-container *ngTemplateOutlet=\"dialogData.formBody; context: { $implicit: dialogData }\"></ng-container>\r\n </div>\r\n }\r\n </mat-dialog-content>\r\n \r\n <!-- Footer -->\r\n @if(dialogData.formFooter) {\r\n <mat-dialog-actions class=\"dialog-actions\">\r\n <div class=\"dialog-footer\">\r\n <ng-container *ngTemplateOutlet=\"dialogData.formFooter; context: { $implicit: dialogData }\"></ng-container>\r\n </div>\r\n </mat-dialog-actions>\r\n }\r\n \r\n </div>\r\n\r\n}\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'delete-confirmation',\r\n imports: [MatDialogModule, MatIconModule, MatButtonModule],\r\n templateUrl: './delete-confirmation.html',\r\n styleUrl: './delete-confirmation.scss',\r\n})\r\nexport class DeleteConfirmation {\r\n constructor(\r\n public dialogRef: MatDialogRef<DeleteConfirmation>,\r\n @Inject(MAT_DIALOG_DATA) public data: DeleteConfirmationData\r\n ) {}\r\n\r\n confirm() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n cancel() {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n\r\nexport class DeleteConfirmationData {\r\n title: string = 'Delete Confirmation';\r\n message: string = 'Are you sure you want to delete this item?';\r\n confirmText: string = 'Delete';\r\n cancelText: string = 'Cancel';\r\n data?: any;\r\n}\r\n","<div class=\"delete-dialog-container\">\r\n <div class=\"delete-dialog-header\">\r\n <div class=\"delete-icon-wrapper\">\r\n <div class=\"delete-icon-ring\">\r\n <mat-icon class=\"delete-icon\">delete_forever</mat-icon>\r\n </div>\r\n </div>\r\n <button mat-icon-button class=\"close-btn\" (click)=\"cancel()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"delete-dialog-content\">\r\n <h2 class=\"delete-title\">{{ data.title }}</h2>\r\n <p class=\"delete-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions class=\"delete-dialog-actions\">\r\n <button mat-stroked-button class=\"cancel-btn\" (click)=\"cancel()\">\r\n <mat-icon>close</mat-icon>\r\n {{ data.cancelText }}\r\n </button>\r\n <button mat-flat-button class=\"confirm-btn\" (click)=\"confirm()\">\r\n <mat-icon>delete_forever</mat-icon>\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { inject, Injectable, Injector, TemplateRef } from \"@angular/core\";\r\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { MatSnackBar } from \"@angular/material/snack-bar\";\r\nimport { Router } from \"@angular/router\";\r\nimport { Dialog, DialogWrapper } from \"../shared/components/dialog-wrapper/dialog-wrapper\";\r\nimport { DeleteConfirmation, DeleteConfirmationData } from \"../shared/components/delete-confirmation/delete-confirmation\";\r\n@Injectable()\r\n\r\nexport class baseComponent{\r\n private _injector = inject(Injector);\r\n\r\n protected showSuccess(message:any){\r\n if(Array.isArray(message)){\r\n message = message.join(',')\r\n }\r\n this.showSnack(message)\r\n }\r\n\r\n\r\n protected showError(error:string|string[]){\r\n if(Array.isArray(error)){\r\n error = error.join(',')\r\n }\r\n this.showSnack(error)\r\n }\r\n\r\n protected navigate(url:string){\r\n this._injector.get(Router).navigate([url])\r\n }\r\n\r\n private showSnack(message:string){\r\n message = message.replace(/<[^>]*>/g, '');\r\n this._injector.get(MatSnackBar).open(message,'Ok',{\r\n duration:3000\r\n })\r\n }\r\n\r\n protected openDialog(\r\n header?:string|TemplateRef<any>, \r\n formBody?:TemplateRef<any>,\r\n formFooter?:TemplateRef<any>,\r\n width:string = '40vw',\r\n data?:any,\r\n component?:any\r\n ):MatDialogRef<any>{\r\n const dialogData:Dialog= {\r\n header:header,\r\n formBody:formBody,\r\n formFooter:formFooter,\r\n data:data,\r\n component:component\r\n }\r\n const dialogRef = this._injector.get(MatDialog)?.open(DialogWrapper,{\r\n width:width,\r\n maxWidth:'80vw',\r\n data:{...dialogData,...data},\r\n\r\n })\r\n return dialogRef;\r\n }\r\n\r\n protected openDeleteDialog(\r\n message: string = 'Are you sure you want to delete this item?',\r\n title: string = 'Delete Confirmation',\r\n confirmText: string = 'Delete',\r\n cancelText: string = 'Cancel',\r\n data?: any,\r\n ): MatDialogRef<DeleteConfirmation> {\r\n const dialogData: DeleteConfirmationData = { title, message, confirmText, cancelText, data };\r\n return this._injector.get(MatDialog).open(DeleteConfirmation, {\r\n width: '380px',\r\n data: dialogData,\r\n disableClose: true,\r\n });\r\n }\r\n protected isValidBeforeSave<T>(formElements: T[], model: any): string[] {\r\n const errors: string[] = [];\r\n this._collectValidationErrors(formElements, model, errors);\r\n return errors;\r\n }\r\n\r\n private _collectValidationErrors<T>(formElements: T[] | any[], model: any, errors: string[]): void {\r\n for (const el of formElements) {\r\n if (el.elementType === 'fieldset') {\r\n if (el.rows?.length) {\r\n this._collectValidationErrors(el.rows, model, errors);\r\n }\r\n continue;\r\n }\r\n\r\n if (el.elementType === 'button' || el.elementType === 'templateRef' || el.elementType === 'spacer') {\r\n continue;\r\n }\r\n\r\n if (el.hideIf?.(model)) {\r\n continue;\r\n }\r\n\r\n const isRequired = el.required || el.requiredIf?.(model);\r\n const value = model[el.key];\r\n const isEmpty = value === null || value === undefined || value === ''\r\n || (Array.isArray(value) && value.length === 0);\r\n\r\n if (isRequired && isEmpty) {\r\n errors.push(`${el.label} is required`);\r\n continue;\r\n }\r\n\r\n if (el.inputType === 'email' && !isEmpty) {\r\n const emailRegex = /^(?!.*\\.\\.)(?!.*\\.$)[A-Za-z0-9][A-Za-z0-9._%+-]{0,63}@[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+)*\\.[A-Za-z]{2,}$/\r\n if (!emailRegex.test(value)) {\r\n errors.push(`${el.label} must be a valid email address`);\r\n }\r\n }\r\n\r\n if (el.elementType === 'datepicker' && !isEmpty) {\r\n const dateOnly = typeof value === 'string' && value.includes('T') ? value.split('T')[0] : value;\r\n const selectedDate = new Date(dateOnly + 'T00:00:00');\r\n if (!isNaN(selectedDate.getTime())) {\r\n const effectiveMin = el.minDateIf?.(model) ?? el.minDate;\r\n const effectiveMax = el.maxDateIf?.(model) ?? el.maxDate;\r\n if (effectiveMin) {\r\n const minDate = new Date(effectiveMin + 'T00:00:00');\r\n if (selectedDate < minDate) {\r\n errors.push(`${el.label} cannot be before ${this._formatDate(effectiveMin)}`);\r\n }\r\n }\r\n if (effectiveMax) {\r\n const maxDate = new Date(effectiveMax + 'T00:00:00');\r\n if (selectedDate > maxDate) {\r\n errors.push(`${el.label} cannot be after ${this._formatDate(effectiveMax)}`);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _formatDate(dateStr: string): string {\r\n const d = new Date(dateStr + 'T00:00:00');\r\n if (isNaN(d.getTime())) return dateStr;\r\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: '2-digit' });\r\n }\r\n\r\n}","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { firstValueFrom, timeout } from 'rxjs';\r\n\r\nexport interface HttpResponse<T = any> {\r\n isSuccessful: boolean;\r\n statusCode: number;\r\n error: string | any[];\r\n result: T;\r\n headers?: HttpHeaders;\r\n}\r\nexport interface myParams {\r\n property: string;\r\n value: any;\r\n}\r\nexport abstract class Httpbase {\r\n private controllerName: string = '';\r\n constructor(private controller: string,public baseUrl:string= '/api/') {\r\n this.controllerName = controller;\r\n }\r\n\r\n private getEndPoint(methodName: string) {\r\n return `${this.baseUrl}${this.controllerName}/${methodName}`;\r\n }\r\n\r\n // ─── Named shorthands ────────────────────────────────────────────────────────\r\n\r\n /** GET /controller/GetAll */\r\n async getAll<T>(): Promise<HttpResponse<T>> {\r\n return this.get<T>('GetAll');\r\n }\r\n\r\n /** GET /controller/GetById?id=<id> */\r\n async getById<T>(id: any): Promise<HttpResponse<T>> {\r\n return this.get<T>('GetById', [{ property: 'id', value: id }]);\r\n }\r\n\r\n /** POST /controller/Save */\r\n async save<T>(body: any): Promise<HttpResponse<T>> {\r\n return this.post<T>('Save', body);\r\n }\r\n\r\n /** PUT /controller/Update */\r\n async update<T>(body: any): Promise<HttpResponse<T>> {\r\n return this.put<T>('Update', body);\r\n }\r\n\r\n /** DELETE /controller/Delete?id=<id> */\r\n async remove<T>(id: any): Promise<HttpResponse<T>> {\r\n return this.delete<T>('Delete', [{ property: 'id', value: id }]);\r\n }\r\n\r\n /** POST /controller/Search */\r\n async search(body: any) {\r\n return this.post('Search', body);\r\n }\r\n\r\n /** GET /controller/getConfig */\r\n async getConfig() {\r\n return this.get('getConfig');\r\n }\r\n\r\n // ─── Internals ────────────────────────────────────────────────────────────────\r\n\r\n private getHeaders() {\r\n const token = localStorage.getItem('token');\r\n return new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n Authorization: token ? `Bearer ${token}` : '',\r\n });\r\n }\r\n\r\n private getUploadHeaders() {\r\n const token = localStorage.getItem('token');\r\n // No Content-Type — browser sets multipart boundary automatically\r\n return new HttpHeaders({\r\n Authorization: token ? `Bearer ${token}` : '',\r\n });\r\n }\r\n\r\n private handleSuccess<T>(statusCode: number, result: any, header: any): HttpResponse<T> {\r\n return {\r\n isSuccessful: statusCode >= 200 && statusCode < 300,\r\n error: '',\r\n result: result,\r\n statusCode: statusCode,\r\n headers: header,\r\n };\r\n }\r\n\r\n private handleError<T>(error: any): HttpResponse<T> {\r\n if (error.status === 401) {\r\n // localStorage.clear();\r\n window.location.href = '/login';\r\n }\r\n return {\r\n isSuccessful: false,\r\n error: this.mapError(error),\r\n statusCode: error.status,\r\n result: null as any,\r\n };\r\n }\r\n flatObject(object:any){\r\n return Object.values(object)?.flat()?.map((x:any)=>x.toString());\r\n }\r\n\r\n private mapError(error: HttpErrorResponse): string | string[] {\r\n switch (error.status) {\r\n case 0: return 'Connection Error! Please Contact Administration';\r\n case 400: return error.error?.errors? this.flatObject(error.error?.errors) :error.error?.message || 'Bad Request';\r\n case 401: return 'Unauthorized Access';\r\n case 403: return \"You don't have rights to perform this action\";\r\n case 404: return 'Resource not found';\r\n case 409: return error.error?.message || 'Conflict';\r\n case 422: return error.error?.message || 'Validation failed';\r\n case 500: return 'An error has occurred, Please contact support';\r\n default: return 'Something went wrong';\r\n }\r\n }\r\n\r\n private buildParams(paramsArray: myParams[]): HttpParams {\r\n return (paramsArray || []).reduce((params, { property, value }) => {\r\n if (property && value != null) {\r\n return Array.isArray(value)\r\n ? value.reduce((p, v) => p.append(property, v), params)\r\n : params.set(property, value);\r\n }\r\n return params;\r\n }, new HttpParams());\r\n }\r\n\r\n protected http = inject(HttpClient);\r\n\r\n // private baseUrl = '/api/';\r\n\r\n // ─── HTTP verb wrappers ───────────────────────────────────────────────────────\r\n protected async post<T>(methodName: string, body: any,params?:myParams[]): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .post(this.getEndPoint(methodName), body, {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n params: this.buildParams(params || []),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async get<T>(methodName: string, params?: myParams[]): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .get(this.getEndPoint(methodName), {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n params: this.buildParams(params || []),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async put<T>(methodName: string, body: any): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .put(this.getEndPoint(methodName), body, {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async patch<T>(methodName: string, body: any): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .patch(this.getEndPoint(methodName), body, {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async delete<T>(methodName: string, params?: myParams[]): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .delete(this.getEndPoint(methodName), {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n params: this.buildParams(params || []),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n /** Multipart file upload — do NOT pass Content-Type; browser sets the boundary */\r\n protected async upload<T>(methodName: string, formData: FormData): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .post(this.getEndPoint(methodName), formData, {\r\n observe: 'response',\r\n headers: this.getUploadHeaders(),\r\n })\r\n .pipe(timeout(60000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Type } from '@angular/core';\r\n\r\nexport const AUTOCOMPLETE_LISTER_COMPONENT = new InjectionToken<Type<any>>('AUTOCOMPLETE_LISTER_COMPONENT');\r\n\r\nexport interface oslListerData {\r\n title: string;\r\n methodName: string;\r\n service: any;\r\n configMethodName: string;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DatasourceCacheService {\r\n private cache = new Map<string, any[]>();\r\n private pending = new Map<string, Promise<any[]>>();\r\n\r\n private buildKey(service: any, methodName: string, body?: any): string {\r\n const serviceName = service?.constructor?.name ?? 'unknown';\r\n return `${serviceName}.${methodName}.${JSON.stringify(body ?? null)}`;\r\n }\r\n\r\n async load(service: any, methodName: string, body?: any): Promise<any[]> {\r\n const key = this.buildKey(service, methodName, body);\r\n\r\n if (this.cache.has(key)) {\r\n return this.cache.get(key)!;\r\n }\r\n\r\n if (this.pending.has(key)) {\r\n return this.pending.get(key)!;\r\n }\r\n\r\n const request = (async () => {\r\n try {\r\n const response = body !== undefined\r\n ? await service[methodName](body)\r\n : await service[methodName]();\r\n\r\n const data = Array.isArray(response) ? response : (response?.result ?? []);\r\n this.cache.set(key, data);\r\n return data;\r\n } finally {\r\n this.pending.delete(key);\r\n }\r\n })();\r\n\r\n this.pending.set(key, request);\r\n return request;\r\n }\r\n\r\n invalidate(service: any, methodName: string, body?: any): void {\r\n this.cache.delete(this.buildKey(service, methodName, body));\r\n }\r\n\r\n invalidateAll(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SkeletonTheme } from './skeleton.directive';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class OslSkeletonThemeService {\r\n private readonly _theme$ = new BehaviorSubject<SkeletonTheme>('light');\r\n\r\n /** Subscribe to react to global theme changes */\r\n readonly theme$ = this._theme$.asObservable();\r\n\r\n get current(): SkeletonTheme {\r\n return this._theme$.getValue();\r\n }\r\n\r\n setTheme(theme: SkeletonTheme): void {\r\n this._theme$.next(theme);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n Inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n PLATFORM_ID,\r\n Renderer2,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { OslSkeletonThemeService } from './skeleton-theme.service';\r\n\r\n// ─── Public Types ────────────────────────────────────────────────────────────\r\n\r\n/** How skeleton bones are laid out */\r\nexport type SkeletonType =\r\n | 'auto' // reads host children and mirrors their bounding boxes\r\n | 'text' // N horizontal bars (last one shorter)\r\n | 'rect' // single full-size block\r\n | 'circle' // single circle\r\n | 'card' // image block + text lines below\r\n | 'list' // N rows of avatar + two text lines\r\n | 'table' // header row + data rows × columns\r\n | 'avatar-text'; // circle on the left + N text lines on the right\r\n\r\n/** CSS animation applied to bones */\r\nexport type SkeletonAnimation = 'shimmer' | 'pulse' | 'wave' | 'none';\r\n\r\n/** Colour preset — overridden by oslSkeletonColor / oslSkeletonHighlight */\r\nexport type SkeletonTheme = 'light' | 'dark';\r\n\r\n// ─── Internal ────────────────────────────────────────────────────────────────\r\n\r\ninterface Bone {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n radius: string;\r\n delay?: number; // wave animation stagger (seconds)\r\n}\r\n\r\n// Injected once per app lifetime — static flag avoids duplicate <style> tags.\r\nlet _osl_sk_injected = false;\r\n\r\n// CSS is minified inline: zero runtime SCSS processing, one GPU-composited\r\n// keyframe (translateX uses the compositor thread, no layout/paint on each frame).\r\nconst SKELETON_CSS = `\r\n.osl-sk-host{position:relative!important}\r\n.osl-sk-overlay{position:absolute;inset:0;pointer-events:none;overflow:hidden;}\r\n.osl-sk-bone{position:absolute;background:var(--osl-sk-color,#e2e8f0);border-radius:var(--osl-sk-r,4px);overflow:hidden;will-change:transform,opacity}\r\n.osl-sk-bone::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent 0%,var(--osl-sk-hl,rgba(255,255,255,.6)) 50%,transparent 100%);transform:translateX(-100%);will-change:transform}\r\n.osl-sk-shimmer .osl-sk-bone::after{animation:_osl-sk-shimmer var(--osl-sk-dur,1.5s) ease-in-out infinite}\r\n.osl-sk-pulse .osl-sk-bone{animation:_osl-sk-pulse var(--osl-sk-dur,1.5s) ease-in-out infinite;animation-delay:var(--osl-sk-d,0s)}\r\n.osl-sk-wave .osl-sk-bone{animation:_osl-sk-pulse var(--osl-sk-dur,1.5s) ease-in-out infinite;animation-delay:var(--osl-sk-d,0s)}\r\n.osl-sk-none .osl-sk-bone::after{display:none}\r\n.osl-sk-host.osl-sk-active>*:not(.osl-sk-overlay){visibility:hidden}\r\n@keyframes _osl-sk-shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(200%)}}\r\n@keyframes _osl-sk-pulse{0%,100%{opacity:1}50%{opacity:.4}}\r\n`;\r\n\r\n// Keys whose changes require bone recomputation\r\nconst LAYOUT_KEYS = new Set([\r\n 'type',\r\n 'rows',\r\n 'rowGap',\r\n 'circleSize',\r\n 'listItems',\r\n 'tableRows',\r\n 'tableCols',\r\n 'cardLines',\r\n 'minHeight',\r\n]);\r\n\r\n// ─── Directive ───────────────────────────────────────────────────────────────\r\n\r\n@Directive({ \r\n selector: '[oslSkeleton]',\r\n standalone:false\r\n })\r\nexport class OslSkeletonDirective implements OnInit, OnChanges, OnDestroy {\r\n // ── Inputs ────────────────────────────────────────────────────────────────\r\n\r\n /** Primary toggle — set true while data is loading */\r\n @Input('oslSkeleton') loading = false;\r\n\r\n /** Layout strategy (default: auto — mirrors host children) */\r\n @Input('oslSkeletonType') type: SkeletonType = 'auto';\r\n\r\n /** Animation style (default: shimmer) */\r\n @Input('oslSkeletonAnimation') animation: SkeletonAnimation = 'shimmer';\r\n\r\n /** Colour preset — overridden by oslSkeletonColor & oslSkeletonHighlight.\r\n * When omitted, the global OslSkeletonThemeService value is used. */\r\n @Input('oslSkeletonTheme')\r\n set theme(value: SkeletonTheme) { this._themeOverride = value; }\r\n get theme(): SkeletonTheme { return this._themeOverride ?? this._serviceTheme; }\r\n\r\n /** Override bone background colour (e.g. '#cbd5e1') */\r\n @Input('oslSkeletonColor') color?: string;\r\n\r\n /** Override shimmer highlight colour (e.g. 'rgba(255,255,255,0.8)') */\r\n @Input('oslSkeletonHighlight') highlight?: string;\r\n\r\n /** Override bone border-radius (e.g. '8px' or '50%') */\r\n @Input('oslSkeletonRadius') radius?: string;\r\n\r\n /** Text rows — used by type=text and type=avatar-text */\r\n @Input('oslSkeletonRows') rows = 3;\r\n\r\n /** Gap between text rows (px) */\r\n @Input('oslSkeletonRowGap') rowGap = 10;\r\n\r\n /** Overlay z-index */\r\n @Input('oslSkeletonZIndex') zIndex = 10;\r\n\r\n /** Delay before skeleton appears (ms) — prevents flicker on fast responses */\r\n @Input('oslSkeletonDelay') delay = 0;\r\n\r\n /** Animation cycle duration (ms) */\r\n @Input('oslSkeletonDuration') duration = 1500;\r\n\r\n /** Minimum overlay height when host has no size yet (px) */\r\n @Input('oslSkeletonMinHeight') minHeight?: number;\r\n\r\n /** Re-read host DOM on every show() instead of using cached layout */\r\n @Input('oslSkeletonForceReread') forceReread = false;\r\n\r\n /** Circle diameter — used by type=circle and avatar in list/avatar-text (px) */\r\n @Input('oslSkeletonCircleSize') circleSize = 40;\r\n\r\n /** Item count for type=list */\r\n @Input('oslSkeletonListItems') listItems = 4;\r\n\r\n /** Row count for type=table (data rows, excluding header) */\r\n @Input('oslSkeletonTableRows') tableRows = 5;\r\n\r\n /** Column count for type=table */\r\n @Input('oslSkeletonTableCols') tableCols = 4;\r\n\r\n /** Body text lines for type=card */\r\n @Input('oslSkeletonCardLines') cardLines = 3;\r\n\r\n /** Overlay background colour — should match your page/card background to cover real content */\r\n @Input('oslSkeletonBgColor') bgColor?: string;\r\n\r\n // ── State ─────────────────────────────────────────────────────────────────\r\n\r\n private overlay: HTMLElement | null = null;\r\n private cachedBones: Bone[] | null = null;\r\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\r\n private rafId = 0;\r\n\r\n private _themeOverride?: SkeletonTheme;\r\n private _serviceTheme: SkeletonTheme = 'light';\r\n private _themeSub?: Subscription;\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────────────────\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n private zone: NgZone,\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n @Optional() private themeService: OslSkeletonThemeService,\r\n ) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n OslSkeletonDirective.injectStyles();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n if (!isPlatformBrowser(this.platformId) || !this.themeService) return;\r\n this._themeSub = this.themeService.theme$.subscribe(theme => {\r\n if (this._themeOverride !== undefined) return;\r\n this._serviceTheme = theme;\r\n if (this.loading && this.overlay?.parentNode) {\r\n this.zone.runOutsideAngular(() => this.applyConfig());\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n // Bust bone cache when any layout-affecting input changes\r\n for (const key of Object.keys(changes)) {\r\n if (LAYOUT_KEYS.has(key)) {\r\n this.cachedBones = null;\r\n break;\r\n }\r\n }\r\n\r\n if ('loading' in changes) {\r\n this.loading ? this.show() : this.hide();\r\n } else if (this.loading && this.overlay) {\r\n // Visual config changed while skeleton is visible — re-apply without toggling\r\n this.applyConfig();\r\n this.renderBones();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cancelPending();\r\n if (this.overlay?.parentNode) this.overlay.parentNode.removeChild(this.overlay);\r\n this.overlay = null;\r\n this.cachedBones = null;\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-host');\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-active');\r\n }\r\n\r\n // ── Visibility control ────────────────────────────────────────────────────\r\n\r\n private show(): void {\r\n this.cancelPending();\r\n if (this.delay > 0) {\r\n this.delayTimer = setTimeout(() => this.doRender(), this.delay);\r\n } else {\r\n this.doRender();\r\n }\r\n }\r\n\r\n private hide(): void {\r\n this.cancelPending();\r\n if (this.overlay?.parentNode) this.overlay.parentNode.removeChild(this.overlay);\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-host');\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-active');\r\n }\r\n\r\n // ── Rendering ─────────────────────────────────────────────────────────────\r\n\r\n private doRender(): void {\r\n this.zone.runOutsideAngular(() => {\r\n // ── Synchronous: hide real content this JS tick ───────────────────────\r\n // Runs before the browser gets a chance to paint, so real content is\r\n // never visible even for a single frame.\r\n this.ensureOverlay();\r\n this.applyConfig();\r\n this.renderer.addClass(this.el.nativeElement, 'osl-sk-host');\r\n this.renderer.addClass(this.el.nativeElement, 'osl-sk-active');\r\n this.el.nativeElement.appendChild(this.overlay!);\r\n\r\n // ── RAF: compute + paint bones ────────────────────────────────────────\r\n // By the time RAF fires, Angular has finished rendering all children into\r\n // the DOM, so getBoundingClientRect() in autoDetect() returns real sizes.\r\n this.rafId = requestAnimationFrame(() => {\r\n if (!this.overlay?.parentNode) return; // hide() was called before RAF fired\r\n if (!this.cachedBones || this.forceReread) {\r\n this.cachedBones = this.computeBones();\r\n }\r\n this.renderBones();\r\n });\r\n });\r\n }\r\n\r\n private ensureOverlay(): void {\r\n if (!this.overlay) {\r\n this.overlay = document.createElement('div');\r\n }\r\n }\r\n\r\n private applyConfig(): void {\r\n const ov = this.overlay!;\r\n // Reset to known baseline before adding animation class\r\n ov.className = `osl-sk-overlay osl-sk-${this.animation}`;\r\n\r\n const dark = this.theme === 'dark';\r\n const parts = [\r\n `--osl-sk-dur:${this.duration}ms`,\r\n `--osl-sk-color:${this.color ?? (dark ? '#374151' : '#e2e8f0')}`,\r\n `--osl-sk-bg:${this.bgColor ?? (dark ? '#1f2937' : '#f8fafc')}`,\r\n `--osl-sk-hl:${this.highlight ?? (dark ? 'rgba(255,255,255,.1)' : 'rgba(255,255,255,.6)')}`,\r\n `z-index:${this.zIndex}`,\r\n ];\r\n if (this.radius) parts.push(`--osl-sk-r:${this.radius}`);\r\n // Single cssText assignment avoids repeated style flushes\r\n ov.style.cssText = parts.join(';');\r\n }\r\n\r\n private renderBones(): void {\r\n const ov = this.overlay!;\r\n // Clear previous bones without innerHTML (avoids serialisation overhead)\r\n while (ov.firstChild) ov.removeChild(ov.firstChild);\r\n if (!this.cachedBones?.length) return;\r\n\r\n const isWave = this.animation === 'wave';\r\n // DocumentFragment = single reflow when appended\r\n const frag = document.createDocumentFragment();\r\n\r\n this.cachedBones.forEach((b, i) => {\r\n const div = document.createElement('div');\r\n div.className = 'osl-sk-bone';\r\n let css = `top:${b.top}px;left:${b.left}px;width:${b.width}px;height:${b.height}px;border-radius:${b.radius}`;\r\n if (isWave) css += `;--osl-sk-d:${b.delay ?? i * 0.1}s`;\r\n div.style.cssText = css;\r\n frag.appendChild(div);\r\n });\r\n\r\n ov.appendChild(frag);\r\n }\r\n\r\n // ── Bone computation ──────────────────────────────────────────────────────\r\n\r\n private computeBones(): Bone[] {\r\n return this.type === 'auto' ? this.autoDetect() : this.predefined();\r\n }\r\n\r\n /**\r\n * Reads the host's direct children, computes their bounding boxes in a\r\n * single batched pass (all reads before writes), and creates matching bones.\r\n * Falls back to predefined() when host is empty.\r\n */\r\n private autoDetect(): Bone[] {\r\n const host = this.el.nativeElement;\r\n const kids = Array.from(host.children).filter(\r\n (c) => !(c as HTMLElement).classList.contains('osl-sk-overlay'),\r\n ) as HTMLElement[];\r\n\r\n if (!kids.length) return this.predefined();\r\n\r\n // ── Batch reads (no write between these) ──\r\n const hostRect = host.getBoundingClientRect();\r\n const rects = kids.map((k) => k.getBoundingClientRect());\r\n\r\n // ── Build bone descriptors ──\r\n const bones: Bone[] = [];\r\n rects.forEach((r, i) => {\r\n if (r.width === 0 && r.height === 0) return;\r\n bones.push({\r\n top: r.top - hostRect.top,\r\n left: r.left - hostRect.left,\r\n width: r.width,\r\n height: r.height,\r\n radius: this.inferRadius(kids[i]),\r\n delay: i * 0.1,\r\n });\r\n });\r\n\r\n return bones.length ? bones : this.predefined();\r\n }\r\n\r\n /** Classifies an element's shape without triggering getComputedStyle */\r\n private inferRadius(el: HTMLElement): string {\r\n const cls = el.className ?? '';\r\n const tag = el.tagName.toLowerCase();\r\n if (tag === 'mat-icon' || /\\bcircle\\b|\\bround\\b|\\bavatar\\b/.test(cls)) return '50%';\r\n return '4px';\r\n }\r\n\r\n /** Generates a fully predefined bone layout for the current type */\r\n private predefined(): Bone[] {\r\n const host = this.el.nativeElement;\r\n const w = host.offsetWidth || 300;\r\n const rh = host.offsetHeight;\r\n const h = rh > 20 ? rh : (this.minHeight ?? 200);\r\n\r\n const { rows, rowGap, circleSize, listItems, tableRows, tableCols, cardLines } = this;\r\n\r\n switch (this.type) {\r\n // ── Circle ────────────────────────────────────────────────────────────\r\n case 'circle':\r\n return [{ top: 0, left: 0, width: circleSize, height: circleSize, radius: '50%' }];\r\n\r\n // ── Rect ──────────────────────────────────────────────────────────────\r\n case 'rect':\r\n return [{ top: 0, left: 0, width: w, height: h, radius: '4px' }];\r\n\r\n // ── Text ──────────────────────────────────────────────────────────────\r\n case 'text': {\r\n const lh = 14;\r\n return Array.from({ length: rows }, (_, i) => ({\r\n top: i * (lh + rowGap),\r\n left: 0,\r\n width: i === rows - 1 ? Math.round(w * 0.6) : w,\r\n height: lh,\r\n radius: '4px',\r\n delay: i * 0.1,\r\n }));\r\n }\r\n\r\n // ── Card ──────────────────────────────────────────────────────────────\r\n case 'card': {\r\n const imgH = Math.round(h * 0.45);\r\n const lh = 14;\r\n const bones: Bone[] = [\r\n { top: 0, left: 0, width: w, height: imgH, radius: '4px', delay: 0 },\r\n ];\r\n for (let i = 0; i < cardLines; i++) {\r\n bones.push({\r\n top: imgH + 16 + i * (lh + rowGap),\r\n left: 0,\r\n width: i === cardLines - 1 ? Math.round(w * 0.5) : Math.round(w * 0.9),\r\n height: lh,\r\n radius: '4px',\r\n delay: (i + 1) * 0.1,\r\n });\r\n }\r\n return bones;\r\n }\r\n\r\n // ── List ──────────────────────────────────────────────────────────────\r\n case 'list': {\r\n const itemH = Math.max(circleSize + 12, 52);\r\n const gap = 12;\r\n const bones: Bone[] = [];\r\n for (let i = 0; i < listItems; i++) {\r\n const t = i * (itemH + gap);\r\n // Avatar\r\n bones.push({\r\n top: t,\r\n left: 0,\r\n width: circleSize,\r\n height: circleSize,\r\n radius: '50%',\r\n delay: i * 0.06,\r\n });\r\n // Title\r\n bones.push({\r\n top: t,\r\n left: circleSize + 12,\r\n width: Math.round(w * 0.5),\r\n height: 14,\r\n radius: '4px',\r\n delay: i * 0.06,\r\n });\r\n // Subtitle\r\n bones.push({\r\n top: t + 22,\r\n left: circleSize + 12,\r\n width: Math.round(w * 0.35),\r\n height: 12,\r\n radius: '4px',\r\n delay: i * 0.06 + 0.05,\r\n });\r\n }\r\n return bones;\r\n }\r\n\r\n // ── Table ─────────────────────────────────────────────────────────────\r\n case 'table': {\r\n const rh2 = 36;\r\n const cw = Math.floor(w / tableCols);\r\n const bones: Bone[] = [];\r\n // Header\r\n for (let c = 0; c < tableCols; c++) {\r\n bones.push({\r\n top: 0,\r\n left: c * cw + 4,\r\n width: cw - 8,\r\n height: rh2,\r\n radius: '4px',\r\n delay: c * 0.05,\r\n });\r\n }\r\n // Data rows\r\n for (let r = 0; r < tableRows; r++) {\r\n for (let c = 0; c < tableCols; c++) {\r\n bones.push({\r\n top: (r + 1) * (rh2 + 4) + 4,\r\n left: c * cw + 4,\r\n width: cw - 8,\r\n height: rh2 - 8,\r\n radius: '4px',\r\n delay: (c + r * tableCols) * 0.03,\r\n });\r\n }\r\n }\r\n return bones;\r\n }\r\n\r\n // ── Avatar + text ─────────────────────────────────────────────────────\r\n case 'avatar-text': {\r\n const bones: Bone[] = [\r\n { top: 0, left: 0, width: circleSize, height: circleSize, radius: '50%', delay: 0 },\r\n ];\r\n const tLeft = circleSize + 12;\r\n const tWidth = w - tLeft;\r\n const lh = 14;\r\n for (let i = 0; i < rows; i++) {\r\n bones.push({\r\n top: i * (lh + rowGap),\r\n left: tLeft,\r\n width: i === rows - 1 ? Math.round(tWidth * 0.6) : tWidth,\r\n height: lh,\r\n radius: '4px',\r\n delay: (i + 1) * 0.1,\r\n });\r\n }\r\n return bones;\r\n }\r\n\r\n // ── Fallback ──────────────────────────────────────────────────────────\r\n default:\r\n return [{ top: 0, left: 0, width: w, height: h, radius: '4px' }];\r\n }\r\n }\r\n\r\n // ── Utilities ─────────────────────────────────────────────────────────────\r\n\r\n private cancelPending(): void {\r\n if (this.delayTimer) { clearTimeout(this.delayTimer); this.delayTimer = null; }\r\n if (this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = 0; }\r\n }\r\n\r\n private static injectStyles(): void {\r\n if (_osl_sk_injected) return;\r\n _osl_sk_injected = true;\r\n const style = document.createElement('style');\r\n style.id = 'osl-sk-styles';\r\n style.textContent = SKELETON_CSS;\r\n document.head.appendChild(style);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\n\r\nexport type InputType = 'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'int';\r\n\r\n@Component({\r\n selector: 'osl-input',\r\n standalone: false,\r\n templateUrl: './input.html',\r\n styleUrl: './input.scss',\r\n})\r\nexport class Oslinput implements OnInit, OnChanges {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = '';\r\n @Input('type') type: InputType = 'text';\r\n @Input('placeholder') placeholder: string = '';\r\n /** Mask pattern: 0=digit, A=letter, *=alphanumeric, other chars are literals. E.g. '(000) 000-0000' */\r\n @Input('mask') mask: string = '';\r\n @Input('min') min: string | number = '';\r\n @Input('max') max: string | number = '';\r\n @Input('minLength') minLength: number | null = null;\r\n @Input('maxLength') maxLength: number | null = null;\r\n @Input('prefixIcon') prefixIcon: string = '';\r\n @Input('suffixIcon') suffixIcon: string = '';\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n @Input('onlyChars') onlyChars: boolean = false;\r\n @Input('isCapitalize') isCapitalize: boolean = false;\r\n /** Enforce N decimal places. Shows 0.00 when blank; auto-pads on blur. */\r\n @Input('decimalPortion') decimalPortion: number | null = null;\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n\r\n showPassword = false;\r\n isFocused = false;\r\n\r\n get inputType(): string {\r\n if (this.type === 'password') return this.showPassword ? 'text' : 'password';\r\n if (this.decimalPortion !== null || this.type === 'int') return 'text';\r\n return this.type;\r\n }\r\n\r\n get hasWrapper(): boolean {\r\n return !!(this.prefixIcon || this.suffixIcon || this.type === 'password');\r\n }\r\n\r\n ngOnInit() {\r\n if (this.decimalPortion !== null) {\r\n this.applyDecimalFormat();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['model'] && !changes['model'].firstChange && this.decimalPortion !== null && !this.isFocused) {\r\n this.applyDecimalFormat();\r\n }\r\n }\r\n\r\n togglePassword() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onFocusIn(event: FocusEvent) {\r\n this.isFocused = true;\r\n if (this.decimalPortion !== null) {\r\n setTimeout(() => (event.target as HTMLInputElement).select(), 0);\r\n }\r\n }\r\n\r\n onFocusOut() {\r\n this.isFocused = false;\r\n if (this.decimalPortion !== null) {\r\n const raw = String(this.model ?? '');\r\n const formatted = raw ? this.formatDecimal(raw) : (0).toFixed(this.decimalPortion);\r\n this.model = formatted;\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n }\r\n\r\n private applyDecimalFormat() {\r\n const raw = this.model == null || this.model === '' ? '' : String(this.model);\r\n const formatted = raw ? this.formatDecimal(raw) : (0).toFixed(this.decimalPortion!);\r\n if (formatted !== String(this.model ?? '')) {\r\n this.model = formatted;\r\n this.modelChange.emit(this.model);\r\n }\r\n }\r\n\r\n private formatDecimal(value: string): string {\r\n const cleaned = value.replace(/[^\\d.]/g, '');\r\n const num = parseFloat(cleaned);\r\n if (isNaN(num)) return (0).toFixed(this.decimalPortion!);\r\n return num.toFixed(this.decimalPortion!);\r\n }\r\n\r\n private cleanDecimalInput(value: string): string {\r\n let cleaned = value.replace(/[^\\d.]/g, '');\r\n const parts = cleaned.split('.');\r\n if (parts.length > 2) {\r\n cleaned = parts[0] + '.' + parts.slice(1).join('');\r\n }\r\n if (parts.length >= 2 && parts[1].length > this.decimalPortion!) {\r\n cleaned = parts[0] + '.' + parts[1].substring(0, this.decimalPortion!);\r\n }\r\n return cleaned;\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (event.ctrlKey || event.metaKey || event.altKey) return;\r\n if (event.key.length !== 1) return;\r\n\r\n if (this.onlyChars && /\\d/.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (this.type === 'int') {\r\n if (!/\\d/.test(event.key)) {\r\n event.preventDefault();\r\n }\r\n return;\r\n }\r\n\r\n if (this.decimalPortion !== null) {\r\n const key = event.key;\r\n if (!/[\\d.]/.test(key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n if (key === '.' && (this.decimalPortion === 0 || String(this.model ?? '').includes('.'))) {\r\n event.preventDefault();\r\n return;\r\n }\r\n if (/\\d/.test(key)) {\r\n const input = event.target as HTMLInputElement;\r\n const val = input.value;\r\n const dotIndex = val.indexOf('.');\r\n if (dotIndex !== -1) {\r\n const selStart = input.selectionStart ?? val.length;\r\n const selEnd = input.selectionEnd ?? selStart;\r\n if (selStart > dotIndex) {\r\n const afterDotStart = dotIndex + 1;\r\n const afterDotLen = val.length - afterDotStart;\r\n const selInAfterDotStart = Math.max(selStart, afterDotStart);\r\n const selInAfterDotEnd = Math.max(selEnd, afterDotStart);\r\n const selectedInAfterDot = selInAfterDotEnd - selInAfterDotStart;\r\n const remainingDecimals = afterDotLen - selectedInAfterDot;\r\n if (remainingDecimals >= this.decimalPortion!) {\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (this.mask && !this.isKeyAllowedByMask(event.key)) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n private isKeyAllowedByMask(key: string): boolean {\r\n const maskSlots = new Set<string>();\r\n for (const c of this.mask) {\r\n if (c === '0') maskSlots.add('digit');\r\n else if (c === 'A') maskSlots.add('letter');\r\n else if (c === '*') maskSlots.add('any');\r\n }\r\n if (maskSlots.has('any')) return true;\r\n if (maskSlots.has('letter') && /[a-zA-Z]/.test(key)) return true;\r\n if (maskSlots.has('digit') && /\\d/.test(key)) return true;\r\n return false;\r\n }\r\n\r\n onModelChange(value: string) {\r\n if (this.decimalPortion !== null) {\r\n const cleaned = this.cleanDecimalInput(value);\r\n this.model = cleaned;\r\n this.modelChange.emit(this.model);\r\n return;\r\n }\r\n if (this.type === 'int') {\r\n const dotIndex = value.indexOf('.');\r\n const truncated = dotIndex !== -1 ? value.substring(0, dotIndex) : value;\r\n const digits = truncated.replace(/[^\\d]/g, '');\r\n this.model = digits === '' ? null : parseInt(digits, 10);\r\n this.modelChange.emit(this.model);\r\n return;\r\n }\r\n if(this.isCapitalize){\r\n value = typeof value == 'string' ? value?.toUpperCase() : value\r\n }\r\n const processed = this.mask ? this.applyMask(value) : value;\r\n this.model = processed;\r\n this.modelChange.emit(this.model);\r\n }\r\n\r\n onChange() {\r\n if (this.decimalPortion !== null) return;\r\n this.changeEv.emit(this.model);\r\n }\r\n\r\n private applyMask(value: string): string {\r\n if (!this.mask || !value) return value;\r\n const stripped = value.replace(/[^a-zA-Z0-9]/g, '');\r\n let result = '';\r\n let si = 0;\r\n\r\n for (let mi = 0; mi < this.mask.length; mi++) {\r\n if (si >= stripped.length) break;\r\n const mc = this.mask[mi];\r\n\r\n if (mc === '0') {\r\n if (/\\d/.test(stripped[si])) result += stripped[si];\r\n si++;\r\n } else if (mc === 'A') {\r\n if (/[a-zA-Z]/.test(stripped[si])) result += stripped[si];\r\n si++;\r\n } else if (mc === '*') {\r\n result += stripped[si++];\r\n } else {\r\n result += mc;\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label){\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n <span [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">{{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span></span>\r\n </label>\r\n </div>\r\n}\r\n\r\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.plain]=\"!hasWrapper\" [class.error]=\"myField.touched && myField.invalid\" [class.input-disabled]=\"disabled\">\r\n @if(prefixIcon) {\r\n <mat-icon class=\"input-icon prefix-icon\">{{prefixIcon}}</mat-icon>\r\n }\r\n <input\r\n\r\n [type]=\"inputType\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onFocusIn($event)\"\r\n (blur)=\"onFocusOut()\"\r\n (change)=\"onChange()\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [attr.min]=\"min || null\"\r\n [attr.max]=\"max || null\"\r\n [attr.minlength]=\"minLength\"\r\n [attr.maxlength]=\"maxLength\"\r\n [email]=\"type === 'email'\"\r\n #myField=\"ngModel\"\r\n class=\"inner-input\"\r\n >\r\n @if(type === 'password') {\r\n <button type=\"button\" class=\"password-toggle\" (click)=\"togglePassword()\" tabindex=\"-1\">\r\n <mat-icon>{{showPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n </button>\r\n }\r\n @if(suffixIcon && type !== 'password') {\r\n <mat-icon class=\"input-icon suffix-icon\">{{suffixIcon}}</mat-icon>\r\n }\r\n </div>\r\n\r\n @if(myField.touched && myField.invalid) {\r\n @if(myField.errors?.['required']) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n } @else if(myField.errors?.['email']) {\r\n <mat-hint class=\"hint\">Please enter a valid email address.</mat-hint>\r\n } @else if(myField.errors?.['minlength']) {\r\n <mat-hint class=\"hint\">Minimum {{minLength}} characters required.</mat-hint>\r\n } @else if(myField.errors?.['maxlength']) {\r\n <mat-hint class=\"hint\">Maximum {{maxLength}} characters allowed.</mat-hint>\r\n } @else if(myField.errors?.['min']) {\r\n <mat-hint class=\"hint\">Value must be at least {{min}}.</mat-hint>\r\n } @else if(myField.errors?.['max']) {\r\n <mat-hint class=\"hint\">Value must be at most {{max}}.</mat-hint>\r\n }\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport type TextareaResize = 'none' | 'both' | 'horizontal' | 'vertical';\r\n\r\n@Component({\r\n selector: 'osl-textarea',\r\n standalone: false,\r\n templateUrl: './textarea.html',\r\n styleUrl: './textarea.scss',\r\n})\r\nexport class Osltextarea {\r\n @Input('label') label: string = '';\r\n @Input('rows') rows: number = 3;\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = '';\r\n @Input('placeholder') placeholder: string = '';\r\n @Input('maxLength') maxLength: number | null = null;\r\n @Input('minLength') minLength: number | null = null;\r\n @Input('characterCounter') characterCounter: boolean = false;\r\n @Input('resize') resize: TextareaResize = 'none';\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n get currentLength(): number {\r\n return this.model ? String(this.model).length : 0;\r\n }\r\n\r\n get showCounter(): boolean {\r\n return this.characterCounter && this.maxLength !== null;\r\n }\r\n\r\n get counterClass(): string {\r\n if (this.maxLength === null) return '';\r\n return this.currentLength >= this.maxLength ? 'counter-limit' : '';\r\n }\r\n\r\n onModelChange(event: any) {\r\n this.model = event;\r\n this.modelChange.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label){\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </label>\r\n \r\n </div>\r\n }\r\n \r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <textarea\r\n [rows]=\"rows\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (change)=\"changeEv.emit(model)\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [attr.maxlength]=\"maxLength\"\r\n [attr.minlength]=\"minLength\"\r\n [style.resize]=\"resize\"\r\n #myField=\"ngModel\"\r\n [class.error]=\"myField.touched && myField.invalid\"\r\n ></textarea>\r\n </div>\r\n <div class=\"textarea-footer\">\r\n @if(myField.touched && myField.invalid) {\r\n @if(myField.errors?.['required']) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n } @else if(myField.errors?.['minlength']) {\r\n <mat-hint class=\"hint\">Minimum {{minLength}} characters required.</mat-hint>\r\n } @else if(myField.errors?.['maxlength']) {\r\n <mat-hint class=\"hint\">Maximum {{maxLength}} characters allowed.</mat-hint>\r\n }\r\n } @else {\r\n <span></span>\r\n }\r\n @if(showCounter) {\r\n <span class=\"char-counter\" [class.counter-limit]=\"currentLength >= maxLength!\">\r\n {{currentLength}}/{{maxLength}}\r\n </span>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-select',\r\n standalone: false,\r\n templateUrl: './select.html',\r\n styleUrl: './select.scss',\r\n})\r\nexport class OslSelect {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = null;\r\n @Input('datasource') datasource: any[] = [];\r\n @Input('displayField') displayField: string = '';\r\n @Input('valueField') valueField: string = '';\r\n @Input('placeholder') placeholder: string = 'Select...';\r\n @Input('loading') loading: boolean = false;\r\n @Input('clearable') clearable: boolean = false;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n\r\n getDisplay(item: any): string {\r\n return this.displayField ? item[this.displayField] : item;\r\n }\r\n\r\n getValue(item: any): any {\r\n return this.valueField ? item[this.valueField] : item;\r\n }\r\n\r\n onModelChange(event: any) {\r\n this.model = event === '' ? null : event;\r\n this.modelChange.emit(this.model);\r\n }\r\n\r\n onClear(event: Event) {\r\n event.stopPropagation();\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n }\r\n\r\n onChange() {\r\n this.changeEv.emit(this.model);\r\n }\r\n\r\n get hasValue(): boolean {\r\n return this.model !== null && this.model !== undefined && this.model !== '';\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if (label) {\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </label>\r\n \r\n </div>\r\n\r\n }\r\n\r\n <div class=\"select-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.error]=\"myField.touched && myField.invalid\" [class.select-disabled]=\"disabled || loading\">\r\n @if(loading) {\r\n <span class=\"select-spinner\"></span>\r\n }\r\n <select\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (change)=\"onChange()\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled || loading\"\r\n #myField=\"ngModel\"\r\n >\r\n <option value=\"\" [disabled]=\"required\" [hidden]=\"required\" selected>{{placeholder}}</option>\r\n @for(item of datasource; track item) {\r\n <option [value]=\"getValue(item)\">{{getDisplay(item)}}</option>\r\n }\r\n </select>\r\n @if(clearable && hasValue && !disabled && !loading) {\r\n <button type=\"button\" class=\"select-clear\" (click)=\"onClear($event)\" title=\"Clear\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon class=\"select-arrow\">expand_more</mat-icon>\r\n </div>\r\n\r\n @if(myField.touched && myField.invalid && required) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-radio',\r\n standalone: false,\r\n templateUrl: './radio.html',\r\n styleUrl: './radio.scss',\r\n})\r\nexport class OslRadio {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = null;\r\n @Input('datasource') datasource: any[] = [];\r\n @Input('displayField') displayField: string = '';\r\n @Input('valueField') valueField: string = '';\r\n @Input('inline') inline: boolean = false;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n\r\n private static _idCounter = 0;\r\n readonly groupName = `osl_radio_${++OslRadio._idCounter}`;\r\n\r\n getDisplay(item: any): string {\r\n return this.displayField ? item[this.displayField] : item;\r\n }\r\n\r\n getValue(item: any): any {\r\n return this.valueField ? item[this.valueField] : item;\r\n }\r\n\r\n isChecked(item: any): boolean {\r\n return this.model === this.getValue(item);\r\n }\r\n\r\n onSelect(item: any) {\r\n this.model = this.getValue(item);\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label){\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\">{{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span></label>\r\n \r\n </div>\r\n\r\n }\r\n <div class=\"radio-group\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.radio-inline]=\"inline\">\r\n @for(item of datasource; track item) {\r\n <label class=\"radio-item\" [class.disabled]=\"disabled\">\r\n <input\r\n type=\"radio\"\r\n [name]=\"groupName\"\r\n [checked]=\"isChecked(item)\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onSelect(item)\"\r\n >\r\n <span>{{getDisplay(item)}}</span>\r\n </label>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-slide-toggle',\r\n standalone: false,\r\n templateUrl: './slide-toggle.html',\r\n styleUrl: './slide-toggle.scss',\r\n})\r\nexport class OslSlideToggle {\r\n @Input('label') label: string = '';\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: boolean = false;\r\n @Input('labelPosition') labelPosition: 'before' | 'after' = 'after';\r\n @Input('trueLabel') trueLabel: string = '';\r\n @Input('falseLabel') falseLabel: string = '';\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<boolean>();\r\n @Output() changeEv = new EventEmitter<boolean>();\r\n\r\n get stateLabel(): string {\r\n if (this.model && this.trueLabel) return this.trueLabel;\r\n if (!this.model && this.falseLabel) return this.falseLabel;\r\n return '';\r\n }\r\n\r\n onModelChange(event: boolean) {\r\n this.model = event;\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label) {\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\">{{label}}</label>\r\n\r\n </div>\r\n }\r\n <div class=\"toggle-row\" [class.reverse]=\"labelPosition === 'before'\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"toggle\" [class.toggle-disabled]=\"disabled\">\r\n <input type=\"checkbox\" [ngModel]=\"model\" (ngModelChange)=\"onModelChange($event)\" [disabled]=\"disabled\">\r\n <span class=\"slider\"></span>\r\n </label>\r\n @if(stateLabel) {\r\n <span class=\"state-label\" [class.state-on]=\"model\" [class.state-off]=\"!model\">{{stateLabel}}</span>\r\n }\r\n </div>\r\n</div>\r\n","import {\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { baseComponent } from '../../../base/base.component';\nimport { AUTOCOMPLETE_LISTER_COMPONENT, oslListerData } from '../autocomplete-lister/autocomplete-lister-types';\nimport { HttpResponse } from '../../../http/httpbase';\n\n@Component({\n selector: 'osl-autocomplete',\n standalone: false,\n templateUrl: './autocomplete.html',\n styleUrl: './autocomplete.scss',\n})\nexport class OslAutocomplete extends baseComponent implements OnInit, OnChanges {\n @Input('label') label: string = '';\n @Input('required') required: boolean = false;\n @Input('disabled') disabled: boolean = false;\n\n private _model: any = null;\n private _object: any;\n\n // Fix: removed if(val) guard — _model must be settable to null/0/false\n @Input('model') set model(val: any) {\n this._model = val;\n if (val !== null && val !== undefined && this._object) {\n this.datasource = [this._object];\n this.filteredItems = [...this.datasource];\n this.syncInputFromModel();\n this.datasourceChange.emit(this.datasource);\n }\n }\n\n get model(): any {\n return this._model;\n }\n\n @Input('datasource') datasource: any[] = [];\n @Output() datasourceChange = new EventEmitter<any>();\n @Input('displayField') displayField: string = '';\n @Input('valueField') valueField: string = '';\n @Input('placeholder') placeholder: string = 'Type to search...';\n @Input('loading') loading: boolean = false;\n @Input('searchType') searchType: 'Local' | 'Api' = 'Local';\n @Input('methodName') methodName: string = '';\n @Input('configMethodName') configMethodName: string = '';\n @Input('service') service: any;\n\n @Input('object') set object(val: any) {\n if (val) {\n this._object = val;\n this.datasource = [val];\n this.filteredItems = [...this.datasource];\n this.datasourceChange.emit(this.datasource);\n }\n if (this._model !== null && this._model !== undefined) {\n this.syncInputFromModel();\n }\n }\n\n @Input('skeletonLoading') skeletonLoading: boolean = false;\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\n @Input('isLister') isLister: boolean = false;\n\n @Output() modelChange = new EventEmitter<any>();\n @Output() changeEv = new EventEmitter<any>();\n\n private listerComponent = inject(AUTOCOMPLETE_LISTER_COMPONENT);\n inputControl = new FormControl('');\n\n inputValue: string = '';\n private _showDropdown: boolean = false;\n get showDropdown(): boolean { return this._showDropdown; }\n set showDropdown(val: boolean) {\n this._showDropdown = val;\n if (val) this.updateDropdownPosition();\n }\n dropdownStyle: { [key: string]: string } = {};\n filteredItems: any[] = [];\n touched: boolean = false;\n\n constructor(\n private elRef: ElementRef,\n public cdr: ChangeDetectorRef,\n ) {\n super();\n }\n\n private updateDropdownPosition() {\n const wrapper = this.elRef.nativeElement.querySelector('.autocomplete-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n this.dropdownStyle = {\n 'position': 'fixed',\n 'top': `${rect.bottom + 5}px`,\n 'left': `${rect.left}px`,\n 'width': `${rect.width}px`,\n };\n this.cdr.markForCheck();\n }\n\n openLister() {\n const inputLister: oslListerData = {\n title: this.label,\n methodName: this.methodName,\n configMethodName: this.configMethodName,\n service: this.service,\n };\n const dialogRef = this.openDialog(\n undefined,\n undefined,\n undefined,\n '60vw',\n inputLister,\n this.listerComponent,\n );\n dialogRef.afterClosed().subscribe((selectedRow: any) => {\n if (selectedRow && selectedRow[this.valueField]) {\n this.datasource = [selectedRow];\n this.datasourceChange.emit(this.datasource);\n this.filteredItems = [...this.datasource];\n this.selectItem(selectedRow);\n }\n });\n }\n\n ngOnInit() {\n if (this.searchType === 'Api' && this.methodName && this.service) {\n this.placeholder = this.isLister ? 'Type to Search Or Press Enter' : 'Type to Search';\n\n // Fix: [formControl] already updates inputControl on user input, so valueChanges\n // fires once per keystroke. Do NOT call inputControl.setValue() inside onInput\n // for API mode to avoid double emission.\n this.inputControl.valueChanges\n .pipe(debounceTime(500), distinctUntilChanged())\n .subscribe(async (value) => {\n if (!value) return;\n const res: HttpResponse = await this.service[this.methodName](value);\n if (!res.isSuccessful) return;\n this.datasource = res?.result && Array.isArray(res?.result) ? res.result : res?.result?.data;\n this.datasourceChange.emit(this.datasource);\n this.filteredItems = this.datasource;\n this.cdr.markForCheck();\n });\n\n if (this._object) {\n this.datasource = [this._object];\n this.datasourceChange.emit(this.datasource);\n this.filteredItems = [...this.datasource];\n }\n }\n this.syncInputFromModel();\n this.cdr.markForCheck();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['datasource']) {\n this.filteredItems = [...(this.datasource || [])];\n // Only sync when dropdown is closed (user is not actively typing/searching)\n if (!this._showDropdown) {\n this.syncInputFromModel();\n }\n }\n if (changes['model']) {\n this.syncInputFromModel();\n }\n }\n\n private syncInputFromModel() {\n if (this._model !== null && this._model !== undefined) {\n const found = this.datasource.find((item) => this.getValue(item) === this._model);\n if (found) {\n const display = this.getDisplay(found);\n this.inputValue = display;\n this.inputControl.setValue(display, { emitEvent: false });\n }\n } else {\n this.inputValue = '';\n this.inputControl.setValue('', { emitEvent: false });\n }\n this.cdr.markForCheck();\n }\n\n getDisplay(item: any): string {\n return item && this.displayField ? item[this.displayField] : String(item);\n }\n\n getValue(item: any): any {\n return this.valueField ? item[this.valueField] : item;\n }\n\n get isInvalid(): boolean {\n return this.touched && this.required && !this._model;\n }\n\n onInput(val: string) {\n // Fix: set _model directly so null is always stored, bypassing the setter's\n // datasource-refresh side effect which should only run on external model changes\n this._model = null;\n this.inputValue = val;\n\n if (this.searchType === 'Local') {\n this.showDropdown = true;\n this.filteredItems = this.datasource.filter((item) =>\n this.getDisplay(item)?.toLowerCase()?.includes(val?.toLowerCase()),\n );\n if (!val) {\n this.modelChange.emit(null);\n this.changeEv.emit(null);\n }\n } else {\n // API mode: [formControl] already updated inputControl, valueChanges handles the search\n if (!val) {\n this.filteredItems = [];\n this.showDropdown = false;\n this.modelChange.emit(null);\n this.changeEv.emit(null);\n } else {\n this.showDropdown = true;\n }\n }\n }\n\n onFocus() {\n if (this.loading) return;\n this.showDropdown = true;\n if (this.searchType === 'Local') {\n this.filteredItems = this.datasource.filter((item) =>\n this.getDisplay(item)?.toLowerCase()?.includes(this.inputValue?.toLowerCase()),\n );\n }\n }\n\n onFocusOut() {\n this.touched = true;\n this.showDropdown = false;\n // Fix: removed auto-select-on-single-match — it caused refill when user\n // cleared text and datasource had only 1 item.\n // If no selection was made, clear the typed text.\n if (this._model === null || this._model === undefined) {\n this.inputValue = '';\n this.inputControl.setValue('', { emitEvent: false });\n }\n this.cdr.markForCheck();\n }\n\n clearValue(event?: Event) {\n event?.stopPropagation();\n // Fix: set _model directly to null — using the setter would trigger the\n // datasource-refresh side effect unnecessarily\n this._model = null;\n this.inputValue = '';\n this.inputControl.setValue('', { emitEvent: false });\n this.showDropdown = false;\n this.modelChange.emit(null);\n this.changeEv.emit(null);\n this.cdr.markForCheck();\n }\n\n selectItem(item: any) {\n const display = this.getDisplay(item);\n const value = this.getValue(item);\n this.inputValue = display;\n this.inputControl.setValue(display, { emitEvent: false });\n this._model = value;\n this.modelChange.emit(value);\n this.changeEv.emit(value);\n this.showDropdown = false;\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (!this.elRef.nativeElement.contains(event.target)) {\n this.showDropdown = false;\n }\n }\n}\n","<div class=\"d-flex flex-column\">\n @if(label){\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <label class=\"label\" [class.txt-clr-red]=\"isInvalid\">\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\n </label>\n\n </div>\n\n }\n <div class=\"autocomplete-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.error]=\"isInvalid\" [class.autocomplete-wrapper--api]=\"searchType == 'Api'\">\n <input\n (input)=\"onInput($any($event.target).value)\"\n (focus)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n [disabled]=\"disabled || loading\"\n [formControl]=\"inputControl\"\n [class.error]=\"isInvalid\"\n [placeholder]=\"loading ? 'Loading...' : placeholder\"\n autocomplete=\"off\"\n (keyup.enter)=\"searchType == 'Api' ? openLister() : null\"\n >\n @if(loading) {\n <span class=\"ac-spinner\"></span>\n } @else {\n @if(inputControl.value && !disabled) {\n <button type=\"button\" class=\"ac-clear\" [class.ac-clear--shifted]=\"searchType == 'Api'\" (mousedown)=\"clearValue($event)\" tabindex=\"-1\" title=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n }\n @if(searchType == 'Api' && isLister && !disabled) {\n <button type=\"button\" class=\"ac-lister-btn\" (mousedown)=\"$event.preventDefault(); openLister()\" tabindex=\"-1\" title=\"Browse list or press Enter\">\n <mat-icon>manage_search</mat-icon>\n </button>\n }\n }\n @if(showDropdown && !loading) {\n <div class=\"dropdown\" [ngStyle]=\"dropdownStyle\">\n @if(filteredItems.length > 0) {\n @for(item of filteredItems; track item) {\n <div class=\"dropdown-item\" (mousedown)=\"selectItem(item)\">{{getDisplay(item)}}</div>\n }\n } @else {\n @if(searchType == 'Local'){\n <div class=\"no-results\">No results found</div>\n }\n }\n </div>\n }\n </div>\n @if(isInvalid) {\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\n }\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-file-upload',\r\n standalone: false,\r\n templateUrl: './file-upload.html',\r\n styleUrl: './file-upload.scss',\r\n})\r\nexport class OslFileUpload {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: File | File[] | null = null;\r\n @Input('accept') accept: string = '';\r\n @Input('multiple') multiple: boolean = false;\r\n /** Max file size in bytes. 0 = no limit. */\r\n @Input('maxSize') maxSize: number = 0;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<File | File[] | null>();\r\n @Output() changeEv = new EventEmitter<File | File[] | null>();\r\n\r\n touched = false;\r\n isDragOver = false;\r\n sizeError = false;\r\n\r\n get fileNames(): string {\r\n if (!this.model) return '';\r\n if (Array.isArray(this.model)) return this.model.map(f => f.name).join(', ');\r\n return this.model.name;\r\n }\r\n\r\n get isInvalid(): boolean {\r\n return this.touched && this.required && !this.model;\r\n }\r\n\r\n onFileChange(event: Event) {\r\n this.touched = true;\r\n const input = event.target as HTMLInputElement;\r\n this.processFiles(input.files);\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n if (!this.disabled) this.isDragOver = true;\r\n }\r\n\r\n onDragLeave() {\r\n this.isDragOver = false;\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n this.isDragOver = false;\r\n if (this.disabled) return;\r\n this.touched = true;\r\n this.processFiles(event.dataTransfer?.files ?? null);\r\n }\r\n\r\n private processFiles(files: FileList | null) {\r\n if (!files || files.length === 0) return;\r\n this.sizeError = false;\r\n\r\n if (this.maxSize > 0) {\r\n for (let i = 0; i < files.length; i++) {\r\n if (files[i].size > this.maxSize) {\r\n this.sizeError = true;\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this.multiple) {\r\n this.model = Array.from(files);\r\n } else {\r\n this.model = files[0];\r\n }\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n\r\n triggerInput(fileInput: HTMLInputElement) {\r\n if (!this.disabled) fileInput.click();\r\n }\r\n\r\n clearFiles(event: Event) {\r\n event.stopPropagation();\r\n this.model = null;\r\n this.sizeError = false;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n }\r\n\r\n get maxSizeLabel(): string {\r\n if (!this.maxSize) return '';\r\n if (this.maxSize >= 1024 * 1024) return `Max ${(this.maxSize / 1024 / 1024).toFixed(1)} MB`;\r\n if (this.maxSize >= 1024) return `Max ${(this.maxSize / 1024).toFixed(0)} KB`;\r\n return `Max ${this.maxSize} B`;\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"isInvalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </label>\r\n </div>\r\n\r\n <input\r\n type=\"file\"\r\n [accept]=\"accept\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onFileChange($event)\"\r\n #fileInput\r\n class=\"file-input\"\r\n >\r\n\r\n <div\r\n [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\"\r\n class=\"drop-zone\"\r\n [class.error]=\"isInvalid || sizeError\"\r\n [class.file-disabled]=\"disabled\"\r\n [class.drag-over]=\"isDragOver\"\r\n [class.has-file]=\"!!model\"\r\n (click)=\"triggerInput(fileInput)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n @if(!model) {\r\n <div class=\"drop-content\">\r\n <mat-icon class=\"upload-icon\">upload_file</mat-icon>\r\n <div class=\"drop-text\">\r\n <span class=\"browse-link\">Browse</span> or drag & drop\r\n </div>\r\n @if(accept) { <div class=\"drop-meta\">{{accept}}</div> }\r\n @if(maxSize) { <div class=\"drop-meta\">{{maxSizeLabel}}</div> }\r\n </div>\r\n } @else {\r\n <div class=\"file-list\">\r\n <mat-icon class=\"file-icon\">insert_drive_file</mat-icon>\r\n <span class=\"file-name\">{{fileNames}}</span>\r\n <button type=\"button\" class=\"clear-btn\" (click)=\"clearFiles($event)\" title=\"Remove\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if(sizeError) {\r\n <mat-hint class=\"hint\">File exceeds the {{maxSizeLabel}} limit.</mat-hint>\r\n } @else if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport type DateInputType = 'date' | 'datetime-local' | 'time' | 'month' | 'week';\r\n\r\n@Component({\r\n selector: 'osl-datepicker',\r\n standalone: false,\r\n templateUrl: './datepicker.html',\r\n styleUrl: './datepicker.scss',\r\n})\r\nexport class OslDatepicker {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n\r\n dateValue: Date | null = null;\r\n\r\n private _model: string = '';\r\n @Input('model') set model(val: string) {\r\n this._model = val\r\n // const clean = val?.includes('T') ? val.split('T')[0] : (val ?? '');\r\n // if (clean === this._model) return;\r\n // this._model = clean;\r\n // this.dateValue = clean ? this._toDate(clean) : null;\r\n }\r\n get model(): string { return this._model; }\r\n\r\n @Input('dateType') dateType: DateInputType = 'date';\r\n @Input('placeholder') placeholder: string = '';\r\n\r\n private _minDate: string = '';\r\n minDateObj: Date | null = null;\r\n @Input('minDate') set minDate(val: string) {\r\n this._minDate = val ?? '';\r\n this.minDateObj = this._minDate ? this._toDate(this._minDate) : null;\r\n }\r\n get minDate(): string { return this._minDate; }\r\n\r\n private _maxDate: string = '';\r\n maxDateObj: Date | null = null;\r\n @Input('maxDate') set maxDate(val: string) {\r\n this._maxDate = val ?? '';\r\n this.maxDateObj = this._maxDate ? this._toDate(this._maxDate) : null;\r\n }\r\n get maxDate(): string { return this._maxDate; }\r\n\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<string>();\r\n @Output() changeEv = new EventEmitter<string>();\r\n\r\n onDateChange(date: Date | null) {\r\n const newModel = date? this._toString(date):null\r\n if (newModel === this._model) return;\r\n if(newModel)this._model = newModel;\r\n this.modelChange.emit(this._model);\r\n this.changeEv.emit(this._model);\r\n }\r\n\r\n private _toDate(str: string): Date | null {\r\n const d = new Date(str + 'T00:00:00');\r\n return isNaN(d.getTime()) ? null : d;\r\n }\r\n\r\n private _toString(date: Date): string {\r\n const d = new Date(date)\r\n const localISO =\r\n d.getFullYear() + \"-\" +\r\n String(d.getMonth() + 1).padStart(2, \"0\") + \"-\" +\r\n String(d.getDate()).padStart(2, \"0\") + \"T\" +\r\n String(d.getHours()).padStart(2, \"0\") + \":\" +\r\n String(d.getMinutes()).padStart(2, \"0\") + \":\" +\r\n String(d.getSeconds()).padStart(2, \"0\");\r\n return localISO\r\n\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if (label) {\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required ? '*' : ''}}</span>\r\n </label>\r\n </div>\r\n }\r\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <input\r\n class=\"date-input\"\r\n [matDatepicker]=\"picker\"\r\n [ngModel]=\"model\"\r\n \r\n (dateChange)=\"onDateChange($event.value)\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"\r\n [min]=\"minDateObj\"\r\n [max]=\"maxDateObj\"\r\n [placeholder]=\"placeholder || 'DD/MMM/YYYY'\"\r\n [class.error]=\"myField.touched && myField.invalid\"\r\n #myField=\"ngModel\"\r\n >\r\n <mat-datepicker-toggle class=\"picker-toggle\" [for]=\"picker\" [disabled]=\"disabled\">\r\n <mat-icon matDatepickerToggleIcon>calendar_today</mat-icon>\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </div>\r\n @if (myField.touched && myField.invalid && required) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-checkbox',\r\n standalone: false,\r\n templateUrl: './checkbox.html',\r\n styleUrl: './checkbox.scss',\r\n})\r\nexport class OslCheckbox implements OnChanges {\r\n @ViewChild('checkboxEl') checkboxEl!: ElementRef<HTMLInputElement>;\r\n\r\n @Input('label') label: string = '';\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('required') required: boolean = false;\r\n @Input('model') model: boolean = false;\r\n @Input('indeterminate') indeterminate: boolean = false;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<boolean>();\r\n @Output() changeEv = new EventEmitter<boolean>();\r\n\r\n touched = false;\r\n\r\n get isInvalid(): boolean {\r\n return this.touched && this.required && !this.model;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['indeterminate'] && this.checkboxEl) {\r\n this.checkboxEl.nativeElement.indeterminate = this.indeterminate;\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.checkboxEl) {\r\n this.checkboxEl.nativeElement.indeterminate = this.indeterminate;\r\n }\r\n }\r\n\r\n onModelChange(event: boolean) {\r\n this.touched = true;\r\n this.model = event;\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n\r\n <label class=\"checkbox-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.checkbox-disabled]=\"disabled\" [class.checkbox-invalid]=\"isInvalid\">\r\n <input\r\n #checkboxEl\r\n type=\"checkbox\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span class=\"checkbox-label\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </span>\r\n </label>\r\n @if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport type ButtonVariant =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'info'\r\n | 'outline-primary'\r\n | 'outline-secondary'\r\n | 'outline-success'\r\n | 'outline-danger'\r\n | 'outline-warning'\r\n | 'outline-info'\r\n | 'icon'\r\n\r\nexport type ButtonSize = 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'osl-button',\r\n standalone: false,\r\n templateUrl: './button.html',\r\n styleUrl: './button.scss',\r\n})\r\nexport class OslButton {\r\n @Input('label') label: string = 'Button';\r\n @Input('icon') icon: string = '';\r\n @Input('variant') variant: ButtonVariant = 'primary';\r\n @Input('size') size: ButtonSize = 'md';\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('loading') loading: boolean = false;\r\n @Input('type') type: 'button' | 'submit' | 'reset' = 'button';\r\n @Input('fullWidth') fullWidth: boolean = false;\r\n @Output() clickEv = new EventEmitter<void>();\r\n\r\n get classes(): string {\r\n return [\r\n 'osl-btn',\r\n `osl-btn--${this.variant}`,\r\n `osl-btn--${this.size}`,\r\n this.fullWidth ? 'osl-btn--full' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n onClick() {\r\n if (!this.disabled && !this.loading) {\r\n this.clickEv.emit();\r\n }\r\n }\r\n}\r\n","@if (variant == 'icon' && icon) {\r\n <button class=\"icon-btn\" [type]=\"type\" [disabled]=\"disabled || loading\" (click)=\"onClick()\">\r\n @if (loading) {\r\n <span class=\"osl-btn__spinner\"></span>\r\n } @else {\r\n <mat-icon>{{ icon }}</mat-icon>\r\n }\r\n </button>\r\n} @else {\r\n <button [class]=\"classes\" [type]=\"type\" [disabled]=\"disabled || loading\" (click)=\"onClick()\">\r\n @if (loading) {\r\n <span class=\"osl-btn__spinner\"></span>\r\n }\r\n <span class=\"osl-btn__label\">{{ label }}</span>\r\n @if (icon) {\r\n <span class=\"osl-btn__label-icon\"\r\n ><mat-icon>{{ icon }}</mat-icon></span\r\n >\r\n }\r\n </button>\r\n}\r\n","import { ChangeDetectorRef, Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef } from '@angular/core';\r\nimport { DatasourceCacheService } from '../datasource-cache/datasource-cache.service';\r\nimport { InputType } from '../input/input';\r\nimport { DateInputType } from '../datepicker/datepicker';\r\nimport { TextareaResize } from '../textarea/textarea';\r\n\r\n@Component({\r\n selector: 'osl-dynamic-form',\r\n standalone: false,\r\n templateUrl: './dynamic-form.html',\r\n styleUrl: './dynamic-form.scss',\r\n})\r\nexport class DynamicForm implements OnInit, OnChanges {\r\n @Input('elements') elements: elements[] = [];\r\n private _model: any;\r\n @Input('model') set model(val:any){\r\n this._model = val\r\n\r\n }\r\n get model(){\r\n return this._model\r\n }\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n\r\n\r\n private datasourceCache = inject(DatasourceCacheService);\r\n constructor(public cdr:ChangeDetectorRef){\r\n\r\n }\r\n ngOnInit(): void {\r\n this.loadApiDatasources();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['elements']) {\r\n this.loadApiDatasources();\r\n }\r\n }\r\n\r\n private loadApiDatasources(): void {\r\n this._loadForList(this.elements);\r\n }\r\n\r\n private async _loadForList(list: elements[]): Promise<void> {\r\n for (const elem of list) {\r\n if (elem.elementType === 'fieldset' && elem.rows?.length) {\r\n this._loadForList(elem.rows);\r\n } else if (elem.apiService && elem.apiMethod && (!elem.searchType || elem.searchType == 'Local')) {\r\n elem.loadingIf = ()=>true\r\n const data = await this.datasourceCache.load(elem.apiService, elem.apiMethod, elem.apiBody? elem.apiBody(this.model):null)\r\n elem.loadingIf = ()=>false\r\n this.cdr.markForCheck()\r\n\r\n if(data && data.length > 0){\r\n elem.datasource = data;\r\n\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n onModelChange(event: any, key: any) {\r\n this.model[key] = event;\r\n this.modelChange.emit(this.model);\r\n }\r\n\r\n onSelectChange(elem: elements, value: any) {\r\n if (!elem.change) return;\r\n let selectedObj: any = undefined;\r\n if (elem.datasource) {\r\n if (Array.isArray(value)) {\r\n selectedObj = value.map(v =>\r\n elem.datasource!.find(item => (elem.valueField ? item[elem.valueField] : item) === v) ?? null\r\n );\r\n } else if (value !== null && value !== undefined) {\r\n selectedObj = elem.datasource.find(item =>\r\n (elem.valueField ? item[elem.valueField] : item) === (isNaN(Number(value))?value:Number(value))\r\n ) ?? null;\r\n } else {\r\n selectedObj = null;\r\n }\r\n }\r\n elem.change(this.model, undefined, selectedObj);\r\n }\r\n}\r\n\r\nexport interface elements {\r\n columns: number;\r\n label: string;\r\n elementType: 'button' | 'checkbox' | 'textbox' | 'textarea' | 'radio' | 'select' | 'datepicker' | 'file-uploader' | 'autocomplete' | 'slide-toggle' | 'fieldset' | 'templateRef' | 'chips-input' | 'spacer';\r\n key: string;\r\n /** Child elements rendered inside a fieldset. Only used when elementType is 'fieldset'. */\r\n rows?: elements[];\r\n change?: (model: any, index?: any, selectedObj?: any) => void;\r\n disabled?: boolean;\r\n hide?: boolean;\r\n disabledIf?: (row:any, index?:any) => boolean;\r\n hideIf?: (model: any) => boolean;\r\n minDateIf?: (model: any) => string;\r\n maxDateIf?: (model: any) => string;\r\n datasource?: any[];\r\n displayField?: string;\r\n valueField?: string;\r\n required?: boolean;\r\n requiredIf?: (model: any) => boolean;\r\n loadingIf?: (model: any) => boolean;\r\n /** API-based datasource loading */\r\n apiService?: any;\r\n apiMethod?: string;\r\n apiConfigMethod?: string;\r\n apiBody?:(model:any)=>any,\r\n\r\n // ── osl-input ─────────────────────────────────────\r\n inputType?: InputType;\r\n placeholder?: string;\r\n /** Mask pattern: 0=digit, A=letter, *=alphanumeric. E.g. '(000) 000-0000' */\r\n mask?: string;\r\n min?: string | number;\r\n max?: string | number;\r\n minLength?: number;\r\n maxLength?: number;\r\n prefixIcon?: string;\r\n suffixIcon?: string;\r\n onlyChars?: boolean;\r\n /** Enforce N decimal places on osl-input. Shows 0.00 when blank; auto-pads on blur. */\r\n decimalPortion?: number;\r\n\r\n // ── osl-textarea ──────────────────────────────────\r\n textareaRows?: number;\r\n characterCounter?: boolean;\r\n resize?: TextareaResize;\r\n\r\n // ── osl-select ────────────────────────────────────\r\n selectPlaceholder?: string;\r\n clearable?: boolean;\r\n /** Enable multi-select mode — model becomes any[]. */\r\n selectMultiple?: boolean;\r\n /** Show a \"Select All\" checkbox at the top of the multi-select dropdown. Only applies when selectMultiple is true. */\r\n showSelectAll?: boolean;\r\n\r\n // ── osl-datepicker ────────────────────────────────\r\n dateType?: DateInputType;\r\n minDate?: string;\r\n maxDate?: string;\r\n\r\n // ── osl-radio ─────────────────────────────────────\r\n inline?: boolean;\r\n\r\n // ── osl-slide-toggle ──────────────────────────────\r\n labelPosition?: 'before' | 'after';\r\n trueLabel?: string;\r\n falseLabel?: string;\r\n\r\n // ── osl-file-upload ───────────────────────────────\r\n accept?: string;\r\n multiple?: boolean;\r\n maxFileSize?: number;\r\n\r\n // ── osl-checkbox ──────────────────────────────────\r\n indeterminate?: boolean;\r\n\r\n // ── osl-autocomplete ──────────────────────────────\r\n autocompletePlaceholder?: string;\r\n /** Enable multiple selection with checkboxes — model becomes any[]. */\r\n autocompleteMultiple?: boolean;\r\n\r\n templateRef?:TemplateRef<any>\r\n searchType?:'Api' | 'Local';\r\n objectName?:string;\r\n isListerAutocomplete?:boolean\r\n isCapitalize?:boolean\r\n}\r\n","@if(elements && elements.length > 0) {\r\n <div class=\"row align-items-center w-100\">\r\n @for(elem of elements; track elem) {\r\n @if(!(elem.hideIf ? elem.hideIf(model) : elem.hide)) {\r\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: elem }\"></ng-container>\r\n }\r\n }\r\n </div>\r\n}\r\n\r\n<ng-template #formField let-elem>\r\n @if(elem.hideIf ? !elem.hideIf(model) : true) {\r\n @switch (elem.elementType) {\r\n\r\n @case (\"textbox\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-input\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [type]=\"elem.inputType || 'text'\"\r\n [placeholder]=\"elem.placeholder || ''\"\r\n [mask]=\"elem.mask || ''\"\r\n [min]=\"elem.min ?? ''\"\r\n [max]=\"elem.max ?? ''\"\r\n [minLength]=\"elem.minLength ?? null\"\r\n [maxLength]=\"elem.maxLength ?? null\"\r\n [prefixIcon]=\"elem.prefixIcon || ''\"\r\n [suffixIcon]=\"elem.suffixIcon || ''\"\r\n [onlyChars]=\"!!elem.onlyChars\"\r\n [decimalPortion]=\"elem.decimalPortion ?? null\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n [isCapitalize]=\"elem.isCapitalize\"\r\n ></osl-input>\r\n </div>\r\n }\r\n\r\n @case (\"textarea\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-textarea\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [rows]=\"elem.textareaRows || 3\"\r\n [placeholder]=\"elem.placeholder || ''\"\r\n [maxLength]=\"elem.maxLength ?? null\"\r\n [minLength]=\"elem.minLength ?? null\"\r\n [characterCounter]=\"!!elem.characterCounter\"\r\n [resize]=\"elem.resize || 'none'\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-textarea>\r\n </div>\r\n }\r\n\r\n @case (\"select\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-select\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [datasource]=\"elem.datasource || []\"\r\n [displayField]=\"elem.displayField || ''\"\r\n [valueField]=\"elem.valueField || ''\"\r\n [placeholder]=\"elem.selectPlaceholder || 'Select...'\"\r\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\r\n [clearable]=\"!!elem.clearable\"\r\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-select>\r\n </div>\r\n }\r\n\r\n @case (\"radio\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-radio\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [datasource]=\"elem.datasource || []\"\r\n [displayField]=\"elem.displayField || ''\"\r\n [valueField]=\"elem.valueField || ''\"\r\n [inline]=\"!!elem.inline\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-radio>\r\n </div>\r\n }\r\n\r\n @case (\"slide-toggle\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-slide-toggle\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [labelPosition]=\"elem.labelPosition || 'after'\"\r\n [trueLabel]=\"elem.trueLabel || ''\"\r\n [falseLabel]=\"elem.falseLabel || ''\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-slide-toggle>\r\n </div>\r\n }\r\n\r\n @case (\"autocomplete\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-autocomplete\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [(datasource)]=\"elem.datasource\"\r\n [displayField]=\"elem.displayField || ''\"\r\n [valueField]=\"elem.valueField || ''\"\r\n [placeholder]=\"elem.autocompletePlaceholder || 'Type to search...'\"\r\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\r\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n [methodName]=\"elem.apiMethod\"\r\n [service]=\"elem.apiService\"\r\n [object]=\"model[elem.objectName]\"\r\n [searchType]=\"elem.searchType\"\r\n [configMethodName]=\"elem.apiConfigMethod\"\r\n [isLister]=\"elem.isListerAutocomplete\"\r\n \r\n \r\n ></osl-autocomplete>\r\n </div>\r\n }\r\n\r\n @case (\"file-uploader\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-file-upload\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [accept]=\"elem.accept || ''\"\r\n [multiple]=\"!!elem.multiple\"\r\n [maxSize]=\"elem.maxFileSize || 0\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-file-upload>\r\n </div>\r\n }\r\n\r\n @case (\"datepicker\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-datepicker\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [dateType]=\"elem.dateType || 'date'\"\r\n [placeholder]=\"elem.placeholder || ''\"\r\n [minDate]=\"elem.minDateIf ? elem.minDateIf(model): elem.minDate ? elem.minDate : ''\"\r\n [maxDate]=\"elem.maxDateIf ? elem.maxDateIf(model): elem.maxDate ? elem.maxDate : ''\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-datepicker>\r\n </div>\r\n }\r\n\r\n @case (\"checkbox\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-checkbox\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [indeterminate]=\"!!elem.indeterminate\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-checkbox>\r\n </div>\r\n }\r\n\r\n @case (\"button\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-button\r\n \r\n [label]=\"elem.label\"\r\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\r\n variant=\"secondary\"\r\n (clickEv)=\"elem.change ? elem.change(model) : null\"\r\n ></osl-button>\r\n </div>\r\n }\r\n\r\n @case (\"fieldset\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\r\n <fieldset class=\"osl-fieldset\">\r\n @if(elem.label) {\r\n <legend class=\"osl-fieldset-legend\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <span class=\"osl-fieldset-legend__text\">{{ elem.label }}</span>\r\n </legend>\r\n }\r\n <div class=\"row w-100 osl-fieldset-body\">\r\n @for(innerElem of elem.rows; track innerElem) {\r\n @if(!(innerElem.hideIf ? innerElem.hideIf(model) : innerElem.hide)) {\r\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: innerElem }\"></ng-container>\r\n }\r\n }\r\n </div>\r\n </fieldset>\r\n </div>\r\n }\r\n\r\n @case (\"templateRef\"){\r\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\r\n <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container>\r\n\r\n \r\n </div>\r\n }\r\n @case (\"spacer\"){\r\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\r\n <!-- <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container> -->\r\n\r\n \r\n </div>\r\n }\r\n\r\n }\r\n }\r\n</ng-template>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n import { FormControl } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n@Component({\r\n selector: 'osl-searchbar',\r\n standalone:false,\r\n templateUrl: './searchbar.html',\r\n styleUrl: './searchbar.scss',\r\n})\r\nexport class OslSearchbar {\r\n @Input('label') label:string=\"Type to Search...\"\r\n @Output() onSearch = new EventEmitter<any>();\r\n\r\n searchQuery:string=\"\"\r\n\r\n\r\nsearchControl = new FormControl('');\r\n\r\nngOnInit() {\r\n this.searchControl.valueChanges.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged()\r\n ).subscribe(value => {\r\n this.onSearch.emit(value)\r\n });\r\n}\r\n}\r\n"," <div class=\"search-wrap\" [class.focused]=\"searchQuery.length > 0\">\r\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\r\n <circle cx=\"11\" cy=\"11\" r=\"8\"/>\r\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\r\n </svg>\r\n <input\r\n type=\"text\"\r\n [formControl]=\"searchControl\"\r\n class=\"search-input\"\r\n [placeholder]=\"label\"\r\n [(ngModel)]=\"searchQuery\"\r\n />\r\n \r\n \r\n </div>","import { Component, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\n\r\nexport type OslDisplayType = 'date' | 'datetime' | 'time' | 'link';\r\n\r\nexport interface OslGridColumn {\r\n key: string;\r\n label: string;\r\n enums?: { value: any; label: string }[];\r\n displayFn?: (value: any, row: any) => string;\r\n /** When true, renders edit + delete icon buttons instead of cell text. */\r\n isActions?: boolean;\r\n /** Applies a built-in transform to the cell value. 'date' → dd/MM/yyyy, 'datetime' → dd/MM/yyyy HH:mm, 'time' → HH:mm */\r\n displayType?: OslDisplayType;\r\n click?:(row:any,col:any)=>void;\r\n}\r\n\r\nexport interface OslMenuAction {\r\n label: string;\r\n labelIf?: (row: any) => string;\r\n hideIf?: (row: any) => boolean;\r\n click: (row: any) => void;\r\n}\r\n\r\nexport interface OslSortEvent {\r\n key: string;\r\n asc: boolean;\r\n}\r\n\r\nexport interface OslPageEvent {\r\n page: number;\r\n pageSize: number;\r\n searchValue?:any;\r\n}\r\n\r\n@Component({\r\n selector: 'osl-grid',\r\n standalone: false,\r\n templateUrl: './grid.html',\r\n styleUrl: './grid.scss',\r\n})\r\nexport class OslGrid implements OnChanges {\r\n @Input('columns') columns: OslGridColumn[] = [];\r\n @Input('datasource') datasource: any[] = [];\r\n @Output() datasourceChange = new EventEmitter<any[]>();\r\n\r\n @Input('isPaginated') isPaginated: boolean = false;\r\n @Input('pageSize') pageSize: number = 25;\r\n\r\n /** When true, component handles sorting/pagination internally.\r\n * When false, events fire and the host is responsible for updating datasource. */\r\n @Input('autoMode') autoMode: boolean = true;\r\n\r\n @Input('totalRecords') totalRecords: number = 0;\r\n\r\n /** Height of the scrollable table body. Defaults to fill remaining viewport.\r\n * Pass any valid CSS value: '400px', 'calc(100vh - 200px)', etc. */\r\n @Input('tableHeight') tableHeight: string = 'calc(100vh - 200px)';\r\n\r\n /** When true, shows skeleton loading rows instead of data. */\r\n @Input('loading') loading: boolean = false;\r\n @Input('isSelectable') isSelectable: boolean = false;\r\n @Input('moreMenuActions') moreMenuActions: OslMenuAction[] = [];\r\n @Input('canEdit') canEdit: boolean = true;\r\n @Input('canDelete') canDelete: boolean = true;\r\n\r\n @Output() pageChange = new EventEmitter<OslPageEvent>();\r\n @Output() pageSizeChange = new EventEmitter<OslPageEvent>();\r\n @Output() sortChange = new EventEmitter<OslSortEvent>();\r\n @Output() editClick = new EventEmitter<any>();\r\n @Output() deleteClick = new EventEmitter<any>();\r\n @Output() onRowClick = new EventEmitter<any>();\r\n\r\n currentPage = 1;\r\n sortKey: string = '';\r\n sortAsc: boolean = true;\r\n pageSizeOptions = [10, 25, 50, 100];\r\n openMenuIndex: number | null = null;\r\n menuPosition = { top: 0, left: 0 };\r\n\r\n @HostListener('document:click')\r\n onDocumentClick(): void {\r\n this.openMenuIndex = null;\r\n }\r\n\r\n toggleMenu(index: number, event: Event): void {\r\n event.stopPropagation();\r\n if (this.openMenuIndex === index) {\r\n this.openMenuIndex = null;\r\n return;\r\n }\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n const menuWidth = 190;\r\n const left = Math.min(\r\n Math.max(rect.right - menuWidth, 8),\r\n window.innerWidth - menuWidth - 8\r\n );\r\n this.menuPosition = { top: rect.bottom + 6, left };\r\n this.openMenuIndex = index;\r\n }\r\n\r\n closeMenu(): void {\r\n this.openMenuIndex = null;\r\n }\r\n\r\n get skeletonRows(): number[] {\r\n return Array.from({ length: Math.min(this.pageSize, 10) });\r\n }\r\n\r\n get skeletonColumns(): number[] {\r\n return Array.from({ length: 5 });\r\n }\r\n\r\n get _total(): number {\r\n return this.autoMode ? this.datasource.length : this.totalRecords;\r\n }\r\n\r\n get totalPages(): number {\r\n return Math.ceil(this._total / this.pageSize) || 1;\r\n }\r\n\r\n get sortedData(): any[] {\r\n if (!this.autoMode || !this.sortKey) return [...this.datasource];\r\n return [...this.datasource].sort((a, b) => {\r\n const va = a[this.sortKey] ?? '';\r\n const vb = b[this.sortKey] ?? '';\r\n const cmp = String(va).localeCompare(String(vb), undefined, { numeric: true });\r\n return this.sortAsc ? cmp : -cmp;\r\n });\r\n }\r\n\r\n get pagedData(): any[] {\r\n if (!this.isPaginated || !this.autoMode) return this.sortedData;\r\n const start = (this.currentPage - 1) * this.pageSize;\r\n return this.sortedData.slice(start, start + this.pageSize);\r\n }\r\n\r\n get pageNumbers(): number[] {\r\n const total = this.totalPages;\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n const pages: number[] = [1];\r\n if (this.currentPage > 3) pages.push(-1);\r\n for (let i = Math.max(2, this.currentPage - 1); i <= Math.min(total - 1, this.currentPage + 1); i++) {\r\n pages.push(i);\r\n }\r\n if (this.currentPage < total - 2) pages.push(-1);\r\n pages.push(total);\r\n return pages;\r\n }\r\n\r\n get startRecord(): number {\r\n if (this._total === 0) return 0;\r\n return (this.currentPage - 1) * this.pageSize + 1;\r\n }\r\n\r\n get endRecord(): number {\r\n return Math.min(this.currentPage * this.pageSize, this._total);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['datasource'] && this.autoMode) {\r\n this.currentPage = 1;\r\n }\r\n }\r\n\r\n sort(key: string, isActions?: boolean): void {\r\n if (isActions) return;\r\n if (this.sortKey === key) {\r\n this.sortAsc = !this.sortAsc;\r\n } else {\r\n this.sortKey = key;\r\n this.sortAsc = true;\r\n }\r\n this.sortChange.emit({ key: this.sortKey, asc: this.sortAsc });\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1 || page > this.totalPages) return;\r\n this.currentPage = page;\r\n this.pageChange.emit({ page: this.currentPage, pageSize: this.pageSize });\r\n }\r\n\r\n onPageSizeChange(size: number): void {\r\n this.pageSize = Number(size);\r\n this.currentPage = 1;\r\n this.pageSizeChange.emit({ page: this.currentPage, pageSize: this.pageSize });\r\n }\r\n\r\n hasVisibleActions(row: any): boolean {\r\n return this.moreMenuActions.some(a => !a.hideIf || !a.hideIf(row));\r\n }\r\n\r\n getActionLabel(action: OslMenuAction, row: any): string {\r\n return action.labelIf ? action.labelIf(row) : action.label;\r\n }\r\n\r\n getCellValue(row: any, col: OslGridColumn): string {\r\n const raw = row[col.key];\r\n if (col.displayFn) return col.displayFn(raw, row);\r\n if (col.enums?.length) {\r\n const match = col.enums.find(e => e.value === raw);\r\n return match ? match.label : (raw ?? '--');\r\n }\r\n return raw !== null && raw !== undefined && raw !== '' ? raw : '--';\r\n }\r\n}\r\n","<div class=\"osl-grid-wrapper\">\r\n\r\n <div class=\"osl-grid-table-container\" [style.height]=\"tableHeight\">\r\n <table class=\"osl-grid-table\">\r\n <thead class=\"osl-grid-thead\">\r\n <tr>\r\n @if (loading && columns.length === 0) {\r\n @for (sk of skeletonColumns; track $index) {\r\n <th class=\"osl-grid-th osl-grid-th--skeleton\">\r\n <div class=\"osl-skeleton osl-skeleton--header\"></div>\r\n </th>\r\n }\r\n } @else {\r\n @for (col of columns; track col.key; let last = $last) {\r\n <th\r\n class=\"osl-grid-th\"\r\n [class.osl-grid-th--last]=\"last\"\r\n [class.osl-grid-th--actions]=\"col.isActions\"\r\n (click)=\"sort(col.key, col.isActions)\"\r\n >\r\n @if (!col.isActions) {\r\n <span class=\"osl-grid-th-inner\">\r\n {{ col.label }}\r\n <span class=\"osl-grid-sort-icon\" [class.osl-grid-sort-icon--active]=\"sortKey === col.key\">\r\n @if (sortKey === col.key) {\r\n {{ sortAsc ? '↑' : '↓' }}\r\n } @else {\r\n <span class=\"osl-grid-sort-icon--idle\">⇅</span>\r\n }\r\n </span>\r\n </span>\r\n }\r\n </th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (loading) {\r\n @for (sk of skeletonRows; track $index) {\r\n <tr class=\"osl-grid-row osl-grid-row--skeleton\">\r\n @if (columns.length > 0) {\r\n @for (col of columns; track col.key; let last = $last) {\r\n <td class=\"osl-grid-td\" [class.osl-grid-td--last]=\"last\" [class.osl-grid-td--actions]=\"col.isActions\">\r\n @if (col.isActions) {\r\n <div class=\"osl-skeleton osl-skeleton--actions\"></div>\r\n } @else {\r\n <div class=\"osl-skeleton\"></div>\r\n }\r\n </td>\r\n }\r\n } @else {\r\n @for (sk2 of skeletonColumns; track $index; let last = $last) {\r\n <td class=\"osl-grid-td\" [class.osl-grid-td--last]=\"last\">\r\n <div class=\"osl-skeleton\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n } @else {\r\n @if (pagedData.length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columns.length\" class=\"osl-grid-empty\">\r\n <div class=\"d-flex align-items-center justify-content-center floating-element\">\r\n <div class=\"mx-4\">\r\n <p class=\"f-s-20 f-w-600 text-start\">No Records match the <br> current filters.</p>\r\n <p class=\"text-start\">Expecting to see new Records? Try again in <br> a few seconds as the system catches up</p>\r\n </div>\r\n <i class=\"icon\"></i>\r\n\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n @for (row of pagedData; track $index; let rowIdx = $index) {\r\n <tr class=\"osl-grid-row\" [class.pointer]=\"isSelectable\" (click)=\"onRowClick.emit(row)\">\r\n @for (col of columns; track col.key; let last = $last) {\r\n @if (col.isActions) {\r\n <td class=\"osl-grid-td osl-grid-td--actions\" [class.osl-grid-td--last]=\"last\">\r\n @if (moreMenuActions.length > 0 && hasVisibleActions(row)) {\r\n <div class=\"osl-menu-wrapper\">\r\n <button class=\"osl-grid-icon-btn\" (click)=\"toggleMenu(rowIdx, $event)\" title=\"More actions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n @if (openMenuIndex === rowIdx) {\r\n <div class=\"osl-custom-menu\"\r\n [style.top.px]=\"menuPosition.top\"\r\n [style.left.px]=\"menuPosition.left\">\r\n <div class=\"osl-custom-menu-header\">Actions</div>\r\n @for (action of moreMenuActions; track $index) {\r\n @if (!action.hideIf || !action.hideIf(row)) {\r\n <button class=\"osl-custom-menu-item\" (click)=\"action.click(row); closeMenu(); $event.stopPropagation()\">\r\n <span class=\"osl-custom-menu-dot\"></span>\r\n {{ getActionLabel(action, row) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(canEdit){\r\n <button class=\"osl-grid-icon-btn\" (click)=\"$event.stopPropagation(); editClick.emit(row)\" title=\"Edit\">\r\n <mat-icon>mode_edit_outline</mat-icon>\r\n </button>\r\n }\r\n @if(canDelete){\r\n <button class=\"osl-grid-icon-btn osl-grid-icon-btn--danger\" (click)=\"$event.stopPropagation(); deleteClick.emit(row)\" title=\"Delete\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </button>\r\n }\r\n </td>\r\n } @else {\r\n <td class=\"osl-grid-td\" [class.osl-grid-td--last]=\"last\" >\r\n <span [class.link]=\"col.displayType == 'link'\" (click)=\"col.click ? col.click(row,col):null\">\r\n @switch (col.displayType) {\r\n @case ('date') { {{ row[col.key] | date }} }\r\n @case ('datetime') { {{ row[col.key] | date:'medium' }} }\r\n @case ('time') { {{ row[col.key] | date:'shortTime' }} }\r\n @default { {{ getCellValue(row, col) }} }\r\n }\r\n </span>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n @if (isPaginated) {\r\n <div class=\"osl-grid-pagination\">\r\n\r\n <span class=\"osl-grid-pagination__info\">\r\n @if (loading) {\r\n Loading...\r\n } @else if (_total > 0) {\r\n {{ startRecord }}–{{ endRecord }} of {{ _total }} records\r\n } @else {\r\n No records\r\n }\r\n </span>\r\n\r\n <div class=\"osl-grid-pagination__controls\">\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(1)\" [disabled]=\"currentPage === 1 || loading\" title=\"First page\">\r\n «\r\n </button>\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(currentPage - 1)\" [disabled]=\"currentPage === 1 || loading\" title=\"Previous page\">\r\n ‹ Prev\r\n </button>\r\n\r\n @for (page of pageNumbers; track $index) {\r\n @if (page === -1) {\r\n <span class=\"osl-grid-page-ellipsis\">…</span>\r\n } @else {\r\n <button\r\n class=\"osl-grid-page-btn osl-grid-page-btn--num\"\r\n [class.osl-grid-page-btn--active]=\"page === currentPage\"\r\n [disabled]=\"loading\"\r\n (click)=\"goToPage(page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(currentPage + 1)\" [disabled]=\"currentPage === totalPages || loading\" title=\"Next page\">\r\n Next ›\r\n </button>\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(totalPages)\" [disabled]=\"currentPage === totalPages || loading\" title=\"Last page\">\r\n »\r\n </button>\r\n </div>\r\n\r\n <div class=\"osl-grid-pagination__size\">\r\n <select class=\"osl-grid-page-size\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" [disabled]=\"loading\">\r\n @for (opt of pageSizeOptions; track opt) {\r\n <option [value]=\"opt\">{{ opt }} per page</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n </div>\r\n }\r\n\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n inject,\r\n Injector,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { OslGrid, OslGridColumn, OslMenuAction, OslPageEvent, OslSortEvent } from '../grid/grid';\r\nimport { elements } from '../dynamic-form/dynamic-form';\r\nimport { DialogWrapper } from '../../../shared/components/dialog-wrapper/dialog-wrapper';\r\nimport { DeleteConfirmation, DeleteConfirmationData } from '../../../shared/components/delete-confirmation/delete-confirmation';\r\nimport { OslSearchbar } from '../searchbar/searchbar';\r\n\r\nexport interface OslSetupSaveEvent {\r\n model: any;\r\n mode: 'add' | 'edit';\r\n}\r\n\r\n@Component({\r\n selector: 'osl-setup',\r\n standalone: false,\r\n templateUrl: './setup.html',\r\n styleUrl: './setup.scss',\r\n})\r\nexport class OslSetup {\r\n private _injector = inject(Injector);\r\n formLoading:boolean = false\r\n saveLoading:boolean = false\r\n @ViewChild('formBodyTpl') formBodyTpl!: TemplateRef<any>;\r\n @ViewChild('formFooterTpl') formFooterTpl!: TemplateRef<any>;\r\n @ViewChild('customFooterWrapperTpl') customFooterWrapperTpl!: TemplateRef<any>;\r\n @ViewChild('searchbar') searchbar?: OslSearchbar;\r\n\r\n // ── Inputs ────────────────────────────────────────────────────\r\n @Input('title') title: string|undefined= '';\r\n @Input('columns') columns: OslGridColumn[] = [];\r\n @Input('datasource') datasource: any[] = [];\r\n @Input('isPaginated') isPaginated: boolean = true;\r\n @Input('pageSize') pageSize: number = 25;\r\n @Input('autoMode') autoMode: boolean = true;\r\n @Input('tableHeight') tableHeight: string = 'calc(100vh - 220px)';\r\n @Input('totalRecords') totalRecords: number = 0;\r\n @Input('loading') loading: boolean = false;\r\n @Input('dialogWidth') dialogWidth: string = \"50vw\";\r\n /** Dynamic form elements — when provided, enables Add/Edit dialog and action column. */\r\n @Input('formElements') formElements: elements[] = [];\r\n @Input('beforeDisplay')beforeDisplay :((model: any) => any | undefined) | undefined;\r\n\r\n @Input('onAddEditFn') onAddEditFn:((row?: any) => void | undefined) | undefined;\r\n @Input('isLister') isLister:boolean = false\r\n @Input('canAdd') canAdd: boolean = true;\r\n @Input('canEdit') canEdit: boolean = true;\r\n @Input('canDelete') canDelete: boolean = true;\r\n @Input('moreMenuActions') moreMenuActions: OslMenuAction[] = []\r\n @Input('customFormFooter') customFormFooter: TemplateRef<any> | undefined\r\n @Input('customHeaderTemp') customHeaderTemp: TemplateRef<any> | undefined\r\n @Input('partialCustomHeaderTemp') partialCustomHeaderTemp: TemplateRef<any> | undefined\r\n\r\n // ── Outputs ───────────────────────────────────────────────────\r\n @Output() onSearch = new EventEmitter<string>();\r\n @Output() onAdd = new EventEmitter<void>();\r\n // @Output() onSave = new EventEmitter<OslSetupSaveEvent>();\r\n @Output() onEdit = new EventEmitter<any>();\r\n @Output() onDelete = new EventEmitter<any>();\r\n @Output() pageChange = new EventEmitter<OslPageEvent>();\r\n @Output() pageSizeChange = new EventEmitter<OslPageEvent>();\r\n @Output() sortChange = new EventEmitter<OslSortEvent>();\r\n @Output() onRowClick = new EventEmitter<any>();\r\n@ViewChild('gridRef') gridRef:OslGrid | undefined\r\n @Input('onSave') onSave:((row?: any) => boolean | undefined) | undefined;\r\n\r\n\r\n // ── Dialog state ──────────────────────────────────────────────\r\n dialogModel: any = {};\r\n dialogMode: 'add' | 'edit' = 'add';\r\n private _dialogRef: MatDialogRef<any> | null = null;\r\n\r\n get hasForm(): boolean {\r\n return this.formElements?.length > 0 || !! this.onAddEditFn;\r\n }\r\n onSearchSetup(event:any){\r\n if(this.gridRef)this.gridRef.currentPage = 1\r\n this.pageChange.emit({\r\n page:1,\r\n pageSize:this.gridRef?.pageSize || 10,\r\n searchValue:event\r\n })\r\n this.onSearch.emit(event)\r\n\r\n }\r\n\r\n /** Prepends the actions column when formElements are provided. */\r\n get columnsWithActions(): OslGridColumn[] {\r\n if (!this.hasForm) return this.columns;\r\n if (this.isLister) return [...this.columns];\r\n if (!this.canEdit && !this.canDelete) return this.columns;\r\n return [{ key: '__actions', label: '', isActions: true }, ...this.columns];\r\n }\r\n onPageChange(eventEmitter:EventEmitter<OslPageEvent>,event:OslPageEvent){\r\n\r\n eventEmitter.emit({...event,searchValue:this.searchbar?.searchControl?.value})\r\n\r\n }\r\n\r\n openAddDialog(): void {\r\n this.dialogMode = 'add';\r\n if(this.beforeDisplay){\r\n this.dialogModel = this.beforeDisplay(this.dialogModel)\r\n }else{\r\n this.dialogModel = {};\r\n }\r\n this.onAdd.emit();\r\n if(this.onAddEditFn){\r\n this.onAddEditFn();\r\n return;\r\n }\r\n this._openDialog();\r\n }\r\n\r\nasync openEditDialog(row: any): Promise<void> {\r\n this.dialogMode = 'edit';\r\n this.onEdit.emit(row);\r\n if(this.onAddEditFn){\r\n this.onAddEditFn(row)\r\n return;\r\n }\r\n \r\n this._openDialog();\r\n if(this.beforeDisplay){\r\n // this.datasource.find(x=>x[this.primaryKey]==)\r\n this.formLoading = true\r\n this.dialogModel = await this.beforeDisplay(row)\r\n this.formLoading = false\r\n \r\n }else{\r\n this.dialogModel = { ...row };\r\n }\r\n \r\n \r\n \r\n \r\n }\r\n\r\n\r\n onDeleteClick(row: any): void {\r\n const dialogData: DeleteConfirmationData = {\r\n title: 'Delete ' + this.title,\r\n message: `Are you sure you want to delete this ${this.title?.toLowerCase()}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n };\r\n this._injector.get(MatDialog).open(DeleteConfirmation, {\r\n width: '380px',\r\n data: dialogData,\r\n disableClose: true,\r\n }).afterClosed().subscribe((confirmed: boolean) => {\r\n if (confirmed) this.onDelete.emit(row);\r\n });\r\n }\r\n\r\n cancelDialog(): void {\r\n this._dialogRef?.close();\r\n this._dialogRef = null;\r\n }\r\n\r\n async saveDialog() {\r\n let isSuccess:any = false\r\n if(this.onSave){\r\n this.saveLoading = true\r\n isSuccess = await this.onSave({ model: { ...this.dialogModel }, mode: this.dialogMode })\r\n \r\n this.saveLoading = false\r\n }\r\n if(isSuccess){\r\n this._dialogRef?.close();\r\n this._dialogRef = null;\r\n\r\n }\r\n }\r\n\r\n private _openDialog(): void {\r\n this._dialogRef = this._injector.get(MatDialog).open(DialogWrapper, {\r\n width: this.dialogWidth,\r\n maxWidth:'90vw',\r\n\r\n data: {\r\n header: this.customHeaderTemp ?? ((this.dialogMode === 'add' ? 'Add ' : 'Edit ') + this.title),\r\n partialHeader: this.partialCustomHeaderTemp,\r\n formBody: this.formBodyTpl,\r\n formFooter: this.customFormFooter ? this.customFooterWrapperTpl : this.formFooterTpl,\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"p-2\">\r\n\r\n <!-- Header -->\r\n <div class=\"osl-setup-header\">\r\n <h5 class=\"mb-0\">{{ title }}</h5>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <osl-searchbar #searchbar class=\"mx-2\" (onSearch)=\"onSearchSetup($event)\"></osl-searchbar>\r\n @if(!isLister && canAdd){\r\n <osl-button\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n [label]=\"'Add ' + title\"\r\n (clickEv)=\"openAddDialog()\"\r\n ></osl-button>\r\n\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Grid -->\r\n <div class=\"osl-setup-body my-2\">\r\n <osl-grid\r\n #gridRef\r\n [columns]=\"columnsWithActions\"\r\n [(datasource)]=\"datasource\"\r\n [isPaginated]=\"isPaginated\"\r\n [pageSize]=\"pageSize\"\r\n [autoMode]=\"autoMode\"\r\n [tableHeight]=\"tableHeight\"\r\n [totalRecords]=\"totalRecords\"\r\n [loading]=\"loading\"\r\n [moreMenuActions]=\"moreMenuActions\"\r\n [canEdit]=\"canEdit\"\r\n [canDelete]=\"canDelete\"\r\n (editClick)=\"openEditDialog($event)\"\r\n (deleteClick)=\"onDeleteClick($event)\"\r\n (pageChange)=\"onPageChange(pageChange,$event)\"\r\n (pageSizeChange)=\"onPageChange(pageSizeChange,$event)\"\r\n (sortChange)=\"sortChange.emit($event)\"\r\n [isSelectable]=\"isLister\";\r\n (onRowClick)=\"onRowClick.emit($event)\"\r\n />\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Dialog: Form Body -->\r\n<ng-template #formBodyTpl>\r\n <osl-dynamic-form\r\n [skeletonLoading]=\"formLoading\"\r\n [elements]=\"formElements\"\r\n [(model)]=\"dialogModel\"\r\n ></osl-dynamic-form>\r\n</ng-template>\r\n\r\n<!-- Dialog: Form Footer -->\r\n<ng-template #formFooterTpl>\r\n <div class=\"osl-setup-dialog-footer\">\r\n\r\n\r\n <osl-button [loading]=\"saveLoading\" variant=\"secondary\" label=\"Save\" (click)=\"saveDialog()\"></osl-button>\r\n\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Wrapper that bridges DialogWrapper's implicit context to the custom footer template -->\r\n<ng-template #customFooterWrapperTpl let-data>\r\n <ng-container *ngTemplateOutlet=\"customFormFooter!; context: { $implicit: { dialogModel: dialogModel, dialogMode: dialogMode, dialogRef: data.dialogRef } }\"></ng-container>\r\n</ng-template>\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\nimport { elements } from '../dynamic-form/dynamic-form';\r\n\r\nexport interface OslFormGridColumn {\r\n key: string;\r\n displayName: string;\r\n label?: string;\r\n /** When provided, renders the matching dynamic-form element in the cell bound to row[key]. */\r\n formElem?: elements;\r\n /** Optional CSS width, e.g. '150px' or '20%'. */\r\n width?: string;\r\n}\r\n\r\nexport interface OslFormGridFooterColumn {\r\n colspan?: number;\r\n display?: string;\r\n displayFn?: (datasource: any[]) => any;\r\n class?: string;\r\n}\r\n\r\nexport interface OslFormGridRowEvent {\r\n row: any;\r\n index: number;\r\n}\r\n\r\n@Component({\r\n selector: 'osl-form-grid',\r\n standalone: false,\r\n templateUrl: './form-grid.html',\r\n styleUrl: './form-grid.scss',\r\n})\r\nexport class OslFormGrid {\r\n @Input('columns') columns: OslFormGridColumn[] = [];\r\n @Input('datasource') datasource: any[] = [];\r\n @Output() datasourceChange = new EventEmitter<any[]>();\r\n\r\n @Input('isPaginated') isPaginated: boolean = false;\r\n @Input('pageSize') pageSize: number = 10;\r\n @Input('canAdd') canAdd: boolean = true;\r\n @Input('canDelete') canDelete: boolean = true;\r\n @Input('loading') loading: boolean = false;\r\n @Input('tableHeight') tableHeight: string = '350px';\r\n @Input('footerColumns') footerColumns: OslFormGridFooterColumn[] = [];\r\n\r\n @Output() rowAdd = new EventEmitter<any>();\r\n @Output() rowDelete = new EventEmitter<OslFormGridRowEvent>();\r\n\r\n get hasActions(): boolean {\r\n return this.canAdd || this.canDelete;\r\n }\r\n\r\n currentPage = 1;\r\n pageSizeOptions = [5, 10, 25, 50];\r\n\r\n get _total(): number {\r\n return this.datasource.length;\r\n }\r\n\r\n get totalPages(): number {\r\n return Math.ceil(this._total / this.pageSize) || 1;\r\n }\r\n\r\n get pagedData(): any[] {\r\n if (!this.isPaginated) return this.datasource;\r\n const start = (this.currentPage - 1) * this.pageSize;\r\n return this.datasource.slice(start, start + this.pageSize);\r\n }\r\n\r\n get startRecord(): number {\r\n return this._total === 0 ? 0 : (this.currentPage - 1) * this.pageSize + 1;\r\n }\r\n\r\n get endRecord(): number {\r\n return Math.min(this.currentPage * this.pageSize, this._total);\r\n }\r\n\r\n get pageNumbers(): number[] {\r\n const total = this.totalPages;\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n const pages: number[] = [1];\r\n if (this.currentPage > 3) pages.push(-1);\r\n for (let i = Math.max(2, this.currentPage - 1); i <= Math.min(total - 1, this.currentPage + 1); i++) {\r\n pages.push(i);\r\n }\r\n if (this.currentPage < total - 2) pages.push(-1);\r\n pages.push(total);\r\n return pages;\r\n }\r\n\r\n get skeletonRows(): number[] {\r\n return Array.from({ length: Math.min(this.pageSize, 6) });\r\n }\r\n\r\n // ngOnChanges(changes: SimpleChanges): void {\r\n // if (changes['datasource']) {\r\n // this.currentPage = 1;\r\n // }\r\n // }\r\n\r\n addRow(): void {\r\n const newRow: any = {};\r\n this.columns.forEach(col => (newRow[col.key] = null));\r\n this.datasource = [...this.datasource, newRow];\r\n this.datasourceChange.emit(this.datasource);\r\n this.rowAdd.emit(newRow);\r\n if (this.isPaginated) {\r\n // this.currentPage = this.totalPages;\r\n this.goToPage(this.totalPages)\r\n }\r\n }\r\n\r\n deleteRow(pagedIndex: number): void {\r\n const actualIndex = this.isPaginated\r\n ? (this.currentPage - 1) * this.pageSize + pagedIndex\r\n : pagedIndex;\r\n const row = this.datasource[actualIndex];\r\n this.datasource = this.datasource.filter((_, i) => i !== actualIndex);\r\n this.datasourceChange.emit(this.datasource);\r\n this.rowDelete.emit({ row, index: actualIndex });\r\n if (this.currentPage > this.totalPages) {\r\n this.currentPage = this.totalPages;\r\n }\r\n }\r\n\r\n onCellChange(row: any, col: OslFormGridColumn, value: any): void {\r\n row[col.key] = value;\r\n this.datasourceChange.emit(this.datasource);\r\n // if (col.formElem?.change) col.formElem.change(row);\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1 || page > this.totalPages) return;\r\n this.currentPage = page;\r\n // this.cd.markForCheck()\r\n }\r\n\r\n onPageSizeChange(size: number): void {\r\n this.pageSize = Number(size);\r\n this.currentPage = 1;\r\n }\r\n\r\n isDisabled(elem: elements,row:any,index:number): boolean {\r\n return elem.disabledIf ? elem.disabledIf(row,index) : !!elem.disabled;\r\n }\r\n\r\n isLoading(row: any, elem: elements): boolean {\r\n return elem.loadingIf ? elem.loadingIf(row) : false;\r\n }\r\n\r\n colRequired(col: OslFormGridColumn): boolean {\r\n return !!col.formElem?.required || !!col.formElem?.requiredIf;\r\n }\r\n\r\n onSelectChange(col: OslFormGridColumn, row: any, i: number, value: any): void {\r\n if (!col.formElem?.change) return;\r\n const elem = col.formElem;\r\n let selectedObj: any = undefined;\r\n if (elem.datasource) {\r\n if (Array.isArray(value)) {\r\n selectedObj = value.map(v =>\r\n elem.datasource!.find(item => (elem.valueField ? item[elem.valueField] : item) === v) ?? null\r\n );\r\n } else if (value !== null && value !== undefined) {\r\n selectedObj = elem.datasource.find(item =>\r\n (elem.valueField ? item[elem.valueField] : item) === value\r\n ) ?? null;\r\n } else {\r\n selectedObj = null;\r\n }\r\n }\r\n elem.change!(row, i, selectedObj);\r\n }\r\n}\r\n","<div class=\"osl-fg-wrapper\">\r\n\r\n <div class=\"osl-fg-table-container\" [style.height]=\"tableHeight\">\r\n <table class=\"osl-fg-table\">\r\n\r\n <thead class=\"osl-fg-thead\">\r\n <tr>\r\n <!-- Actions column: + add button in header -->\r\n @if (hasActions) {\r\n <th class=\"osl-fg-th osl-fg-th--actions\">\r\n @if (canAdd) {\r\n <button class=\"osl-grid-icon-btn\" (click)=\"addRow()\" [disabled]=\"loading\" title=\"Add row\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n </th>\r\n }\r\n @for (col of columns; track col.key) {\r\n <th class=\"osl-fg-th\" [style.width]=\"col.width\">\r\n {{ col.displayName }}\r\n @if (colRequired(col)) {\r\n <span class=\"osl-fg-th-required\">*</span>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n\r\n @if (loading) {\r\n @for (sk of skeletonRows; track $index) {\r\n <tr class=\"osl-fg-row osl-fg-row--skeleton\">\r\n @if (hasActions) {\r\n <td class=\"osl-fg-td osl-fg-td--actions\">\r\n <div class=\"osl-fg-skeleton osl-fg-skeleton--sm\"></div>\r\n </td>\r\n }\r\n @for (col of columns; track col.key) {\r\n <td class=\"osl-fg-td\"><div class=\"osl-fg-skeleton\"></div></td>\r\n }\r\n </tr>\r\n }\r\n\r\n } @else if (pagedData.length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\" class=\"osl-fg-empty\">\r\n <div class=\"osl-fg-empty-inner\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/>\r\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/>\r\n <line x1=\"9\" y1=\"9\" x2=\"9\" y2=\"21\"/>\r\n </svg>\r\n <p>No rows yet.{{ canAdd ? ' Use + to get started.' : '' }}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n\r\n } @else {\r\n @for (row of pagedData; track $index; let i = $index) {\r\n <tr class=\"osl-fg-row\">\r\n\r\n <!-- Delete button first -->\r\n @if (hasActions) {\r\n <td class=\"osl-fg-td osl-fg-td--actions\">\r\n @if (canDelete) {\r\n <button class=\"osl-grid-icon-btn osl-grid-icon-btn--danger\" (click)=\"deleteRow(i)\" title=\"Delete\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </button>\r\n }\r\n </td>\r\n }\r\n\r\n @for (col of columns; track col.key) {\r\n <td class=\"osl-fg-td\" [style.width]=\"col.width\">\r\n @if (col.formElem) {\r\n <div class=\"osl-fg-cell-form\" [style.width]=\"col.width\">\r\n @switch (col.formElem.elementType) {\r\n\r\n @case ('textbox') {\r\n <osl-input\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [type]=\"col.formElem.inputType || 'text'\"\r\n [placeholder]=\"col.formElem.placeholder || col.displayName\"\r\n [mask]=\"col.formElem.mask || ''\"\r\n [min]=\"col.formElem.min ?? ''\"\r\n [max]=\"col.formElem.max ?? ''\"\r\n [minLength]=\"col.formElem.minLength ?? null\"\r\n [maxLength]=\"col.formElem.maxLength ?? null\"\r\n [prefixIcon]=\"col.formElem.prefixIcon || ''\"\r\n [suffixIcon]=\"col.formElem.suffixIcon || ''\"\r\n [decimalPortion]=\"col.formElem.decimalPortion ?? null\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-input>\r\n }\r\n\r\n @case ('textarea') {\r\n <osl-textarea\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [rows]=\"col.formElem.textareaRows || 3\"\r\n [placeholder]=\"col.formElem.placeholder || col.displayName\"\r\n [maxLength]=\"col.formElem.maxLength ?? null\"\r\n [minLength]=\"col.formElem.minLength ?? null\"\r\n [characterCounter]=\"!!col.formElem.characterCounter\"\r\n [resize]=\"col.formElem.resize || 'none'\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-textarea>\r\n }\r\n\r\n @case ('select') {\r\n <osl-select\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [datasource]=\"col.formElem.datasource || []\"\r\n [displayField]=\"col.formElem.displayField || ''\"\r\n [valueField]=\"col.formElem.valueField || ''\"\r\n [placeholder]=\"col.formElem.selectPlaceholder || col.displayName\"\r\n [loading]=\"isLoading(row, col.formElem)\"\r\n [clearable]=\"!!col.formElem.clearable\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? onSelectChange(col, row, i, $event) : null\">\r\n </osl-select>\r\n }\r\n\r\n @case ('autocomplete') {\r\n <osl-autocomplete\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [datasource]=\"col.formElem.datasource || []\"\r\n [displayField]=\"col.formElem.displayField || ''\"\r\n [valueField]=\"col.formElem.valueField || ''\"\r\n [placeholder]=\"col.formElem.autocompletePlaceholder || col.displayName\"\r\n [loading]=\"isLoading(row, col.formElem)\"\r\n [searchType]=\"col.formElem.searchType ? col.formElem.searchType : 'Local'\"\r\n [methodName]=\"col.formElem.apiMethod || ''\"\r\n [configMethodName]=\"col.formElem.apiConfigMethod || ''\"\r\n [service]=\"col.formElem.apiService\"\r\n [object]=\"col.formElem.objectName ? row[col.formElem.objectName] : null\"\r\n [isLister]=\"!!col.formElem.isListerAutocomplete\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? onSelectChange(col, row, i, $event) : null\">\r\n </osl-autocomplete>\r\n }\r\n\r\n @case ('radio') {\r\n <osl-radio\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [datasource]=\"col.formElem.datasource || []\"\r\n [displayField]=\"col.formElem.displayField || ''\"\r\n [valueField]=\"col.formElem.valueField || ''\"\r\n [inline]=\"!!col.formElem.inline\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-radio>\r\n }\r\n\r\n @case ('checkbox') {\r\n <osl-checkbox\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [indeterminate]=\"!!col.formElem.indeterminate\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-checkbox>\r\n }\r\n\r\n @case ('slide-toggle') {\r\n <osl-slide-toggle\r\n [label]=\"''\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [labelPosition]=\"col.formElem.labelPosition || 'after'\"\r\n [trueLabel]=\"col.formElem.trueLabel || ''\"\r\n [falseLabel]=\"col.formElem.falseLabel || ''\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-slide-toggle>\r\n }\r\n\r\n @case ('datepicker') {\r\n <osl-datepicker\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [dateType]=\"col.formElem.dateType || 'date'\"\r\n [placeholder]=\"col.formElem.placeholder || col.displayName\"\r\n [minDate]=\"col.formElem.minDate || ''\"\r\n [maxDate]=\"col.formElem.maxDate || ''\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-datepicker>\r\n }\r\n\r\n @case ('file-uploader') {\r\n <osl-file-upload\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [accept]=\"col.formElem.accept || ''\"\r\n [multiple]=\"!!col.formElem.multiple\"\r\n [maxSize]=\"col.formElem.maxFileSize || 0\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-file-upload>\r\n }\r\n\r\n }\r\n </div>\r\n } @else {\r\n <span class=\"osl-fg-cell-text\">{{ row[col.key] ?? '--' }}</span>\r\n }\r\n </td>\r\n }\r\n\r\n </tr>\r\n }\r\n }\r\n\r\n </tbody>\r\n\r\n @if (footerColumns && footerColumns.length > 0 && datasource && datasource.length > 0) {\r\n <tfoot class=\"osl-fg-tfoot\">\r\n <tr class=\"osl-fg-footer-row\">\r\n @for (fcol of footerColumns; track $index) {\r\n <td\r\n [class]=\"'osl-fg-footer-td ' + (fcol.class || '')\"\r\n [attr.colspan]=\"fcol.colspan || 1\">\r\n {{ fcol.displayFn ? fcol.displayFn(datasource) : (fcol.display || '') }}\r\n </td>\r\n }\r\n </tr>\r\n </tfoot>\r\n }\r\n\r\n </table>\r\n </div>\r\n\r\n @if (isPaginated) {\r\n <div class=\"osl-fg-pagination\">\r\n\r\n <span class=\"osl-fg-pagination__info\">\r\n @if (loading) {\r\n Loading...\r\n } @else if (_total > 0) {\r\n {{ startRecord }}–{{ endRecord }} of {{ _total }} rows\r\n } @else {\r\n No rows\r\n }\r\n </span>\r\n\r\n <div class=\"osl-fg-pagination__controls\">\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(1)\" [disabled]=\"currentPage === 1 || loading\">«</button>\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(currentPage - 1)\" [disabled]=\"currentPage === 1 || loading\">‹ Prev</button>\r\n\r\n @for (page of pageNumbers; track $index) {\r\n @if (page === -1) {\r\n <span class=\"osl-fg-page-ellipsis\">…</span>\r\n } @else {\r\n <button\r\n class=\"osl-fg-page-btn osl-fg-page-btn--num\"\r\n [class.osl-fg-page-btn--active]=\"page === currentPage\"\r\n [disabled]=\"loading\"\r\n (click)=\"goToPage(page)\">\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(currentPage + 1)\" [disabled]=\"currentPage === totalPages || loading\">Next ›</button>\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(totalPages)\" [disabled]=\"currentPage === totalPages || loading\">»</button>\r\n </div>\r\n\r\n <div class=\"osl-fg-pagination__size\">\r\n <select class=\"osl-fg-page-size\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" [disabled]=\"loading\">\r\n @for (opt of pageSizeOptions; track opt) {\r\n <option [value]=\"opt\">{{ opt }} per page</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n </div>\r\n }\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, Input } from '@angular/core';\r\nimport { OslGridColumn, OslPageEvent } from '../grid/grid';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { HttpResponse } from '../../../http/httpbase';\r\n\r\n@Component({\r\n selector: 'osl-autocomplete-lister',\r\n standalone:false,\r\n templateUrl: './autocomplete-lister.html',\r\n styleUrl: './autocomplete-lister.scss',\r\n})\r\nexport class OslAutocompleteLister {\r\n @Input('data') data:any;\r\n column:OslGridColumn[]=[]\r\n datasource=[]\r\n autocompleteData:any;\r\n recordCount: number=0;\r\n loader: boolean = false;\r\n constructor(public dialogRef: MatDialogRef<OslAutocompleteLister>,public cd:ChangeDetectorRef){\r\n \r\n \r\n\r\n }\r\n async ngAfterViewInit(){\r\n this.autocompleteData = this.data?.data \r\n this.loader = true\r\n await this.getConfig()\r\n // await this.search()\r\n // this.loader = false\r\n this.cd.markForCheck()\r\n\r\n }\r\n async getConfig(){\r\n const res:HttpResponse = await this.autocompleteData.service[this.autocompleteData.configMethodName || 'getConfig']();\r\n if(!res.isSuccessful) return;\r\n this.column = res.result\r\n }\r\n\r\n async search(searchValue?:any,page = 1 , pageSize = 25){ \r\n this.loader = true\r\n const res:HttpResponse = await this.autocompleteData.service[this.autocompleteData.methodName || 'Search']({\r\n page:page,\r\n pageSize:pageSize,\r\n searchValue\r\n });\r\n \r\n this.cd.markForCheck()\r\n\r\n if(!res.isSuccessful) return;\r\n this.datasource = res.result?.data || []\r\n setTimeout(()=>{\r\n this.loader = false\r\n\r\n },20)\r\n this.recordCount = res.result?.recordsFiltered\r\n }\r\n onPageChange(event:OslPageEvent){\r\n this.search(event.searchValue,event.page,event.pageSize)\r\n\r\n }\r\n onSearch(value:string){\r\n this.search(value)\r\n }\r\n \r\n onRowClick(event:any){\r\n \r\n this.dialogRef.close(event)\r\n \r\n }\r\n \r\n\r\n}\r\n\r\nexport type { oslListerData } from './autocomplete-lister-types';","<div class=\"p-4\">\r\n <osl-setup [loading]=\"loader\" [autoMode]=\"false\" [title]=\"autocompleteData?.title\" [totalRecords]=\"recordCount\" (pageSizeChange)=\"onPageChange($event)\" (pageChange)=\"onPageChange($event)\" (onRowClick)=\"onRowClick($event)\" [columns]=\"column\" [datasource]=\"datasource\" [isLister]=\"true\"></osl-setup>\r\n \r\n</div>","import { NgModule } from '@angular/core';\r\nimport { OslSkeletonDirective } from './skeleton.directive';\r\n\r\n@NgModule({\r\n declarations: [OslSkeletonDirective],\r\n exports: [OslSkeletonDirective],\r\n})\r\nexport class OslSkeletonModule {}\r\n","import {\n Component, Input, Output, EventEmitter, OnChanges, SimpleChanges,\n HostListener, ElementRef, ViewChild, ChangeDetectorRef, ChangeDetectionStrategy, inject\n} from '@angular/core';\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { DatePipe, DecimalPipe } from '@angular/common';\n\n// ─── Public interfaces ────────────────────────────────────────────────────────\n\nexport interface OslReportColumn {\n key: string;\n label: string;\n width?: number;\n minWidth?: number;\n pinned?: boolean;\n sortable?: boolean;\n filterable?: boolean;\n searchable?: boolean;\n groupable?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n displayFn?: (value: any, row: any) => string;\n cellClass?: string | ((value: any, row: any) => string);\n align?: 'left' | 'center' | 'right';\n aggregate?: 'sum' | 'avg' | 'count' | 'min' | 'max';\n displayType?: 'date' | 'datetime' | 'time' | 'currency' | 'number' | 'percentage';\n enums?: { value: any; label: string }[];\n /** Optional group label shown in the top header row (double header). Consecutive columns sharing the same label are merged into one spanning cell. */\n headerGroup?: string;\n /** When true, this column's values are summed in PDF/Excel exports (subtotal per group + grand total). */\n sumOnPdf?: boolean;\n}\n\nexport interface OslReportPageEvent { page: number; pageSize: number; }\nexport interface OslReportSortEvent { sorts: { key: string; asc: boolean }[]; }\n\nexport interface OslPdfConfig {\n /** Base64 or URL of logo image shown top-left of PDF header. */\n logo?: string;\n /** Company name displayed centered in PDF header. */\n companyName?: string;\n /** Company address line displayed under company name. */\n companyAddress?: string;\n /** Report name rendered between two full-width horizontal lines, centered. */\n reportName?: string;\n /** Page orientation (default: landscape). */\n orientation?: 'portrait' | 'landscape';\n /** Show alternating row background colors (default: false — clean white). */\n alternatingRows?: boolean;\n}\n\n// ─── Internal types ───────────────────────────────────────────────────────────\n\nexport interface InternalColumn extends OslReportColumn {\n _width: number;\n _hidden: boolean;\n _pinned: boolean;\n _stickyLeft: number;\n}\n\nexport type FlatRow =\n | { _type: 'data'; _data: any; _rowIndex: number }\n | { _type: 'group'; _key: string; _value: any; _label: string; _colLabel: string; _level: number; _count: number; _expanded: boolean; _path: string };\n\ninterface SortState { key: string; asc: boolean; index: number; }\n\ninterface ExcelFilterState {\n allItems: { value: any; label: string; checked: boolean }[];\n search: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n@Component({\n selector: 'osl-report-grid',\n standalone: false,\n templateUrl: './report-grid.html',\n styleUrl: './report-grid.scss',\n providers: [DatePipe, DecimalPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OslReportGrid implements OnChanges {\n\n // Inputs\n @Input() columns: OslReportColumn[] = [];\n @Input() datasource: any[] = [];\n @Input() loading = false;\n @Input() totalRecords = 0;\n @Input() autoMode = true;\n @Input() isPaginated = true;\n @Input() pageSize = 50;\n @Input() tableHeight = 'calc(100vh - 220px)';\n @Input() striped = true;\n @Input() exportable = true;\n @Input() rowHeight = 40;\n @Input() rowSelection: 'single' | 'multiple' | null = null;\n @Input() showAggregates = false;\n @Input() title = '';\n @Input() pdfExportFromGrid = false;\n @Input() pdfConfig: OslPdfConfig = {};\n\n // Outputs\n @Output() pageChange = new EventEmitter<OslReportPageEvent>();\n @Output() pageSizeChange = new EventEmitter<OslReportPageEvent>();\n @Output() sortChange = new EventEmitter<OslReportSortEvent>();\n @Output() rowClick = new EventEmitter<any>();\n @Output() selectionChange = new EventEmitter<any[]>();\n\n @ViewChild('headerScrollRef') headerScrollRef!: ElementRef<HTMLDivElement>;\n @ViewChild('bodyScrollRef') bodyScrollRef!: ElementRef<HTMLDivElement>;\n\n private cdr = inject(ChangeDetectorRef);\n private datePipe = inject(DatePipe);\n private decimalPipe = inject(DecimalPipe);\n\n // ── Column state ─────────────────────────────────────────────────────────────\n\n _cols: InternalColumn[] = [];\n _visibleCols: InternalColumn[] = [];\n _totalWidth = 0;\n\n get visibleCols(): InternalColumn[] { return this._visibleCols; }\n get totalWidth(): number { return this._totalWidth; }\n\n get pinnedWidth(): number {\n return this._visibleCols.filter(c => c._pinned).reduce((s, c) => s + c._width, 0);\n }\n\n get hasHeaderGroups(): boolean {\n return this._visibleCols.some(c => !!c.headerGroup);\n }\n\n get computedHeaderGroups(): { label: string; width: number; isPinned: boolean; stickyLeft: number }[] {\n const result: { label: string; width: number; isPinned: boolean; stickyLeft: number }[] = [];\n for (const col of this._visibleCols) {\n const label = col.headerGroup ?? '';\n const last = result[result.length - 1];\n if (last && last.label === label && last.isPinned === col._pinned) {\n last.width += col._width;\n } else {\n result.push({ label, width: col._width, isPinned: col._pinned, stickyLeft: col._pinned ? col._stickyLeft : 0 });\n }\n }\n return result;\n }\n\n private updateVisibleCols(): void {\n this._visibleCols = this._cols.filter(c => !c._hidden);\n this._totalWidth = this._visibleCols.reduce((s, c) => s + c._width, 0)\n + (this.rowSelection === 'multiple' ? 36 : 0);\n }\n\n // ── Sort state ────────────────────────────────────────────────────────────────\n\n sortStates = new Map<string, SortState>();\n public sortCounter = 0;\n\n // ── Filter / Search state ─────────────────────────────────────────────────────\n\n globalSearch = '';\n columnSearch: { [key: string]: string } = {};\n excelFilters: { [key: string]: Set<any> } = {};\n excelFilterState: { [key: string]: ExcelFilterState } = {};\n openFilterKey: string | null = null;\n filterDropdownPos = { top: 0, left: 0 };\n\n // ── Group state ───────────────────────────────────────────────────────────────\n\n activeGroups: string[] = [];\n collapsedPaths = new Set<string>();\n showGroupPanel = true;\n\n // ── Flat rows (computed) ──────────────────────────────────────────────────────\n\n flatRows: FlatRow[] = [];\n _filteredTotal = 0;\n\n // ── Pagination ────────────────────────────────────────────────────────────────\n\n currentPage = 1;\n pageSizeOptions = [25, 50, 100, 200, 500];\n\n // ── UI state ──────────────────────────────────────────────────────────────────\n\n showColumnConfig = false;\n selectedRows = new Set<any>();\n columnMenuKey: string | null = null;\n columnMenuPos = { top: 0, left: 0 };\n copiedCell: string | null = null;\n resizing: { key: string; startX: number; startWidth: number } | null = null;\n\n private _suppressNextHeaderClick = false;\n private _columnDragJustEnded = false;\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────────\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['columns']) {\n this.initColumns();\n this.excelFilterState = {};\n }\n if (changes['datasource'] || changes['columns']) {\n this.currentPage = 1;\n this.processData();\n }\n }\n\n private initColumns(): void {\n this._cols = this.columns.map(col => ({\n ...col,\n _width: col.width ?? 150,\n _hidden: col.hidden ?? false,\n _pinned: col.pinned ?? false,\n _stickyLeft: 0,\n sortable: col.sortable !== false,\n filterable: col.filterable !== false,\n searchable: col.searchable !== false,\n groupable: col.groupable !== false,\n resizable: col.resizable !== false,\n minWidth: col.minWidth ?? 60,\n align: col.align ?? 'left',\n }));\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n }\n\n recomputePinnedOffsets(): void {\n let offset = this.rowSelection === 'multiple' ? 36 : 0;\n for (const col of this._cols) {\n if (!col._hidden && col._pinned) {\n col._stickyLeft = offset;\n offset += col._width;\n }\n }\n }\n\n // ─── Data pipeline ────────────────────────────────────────────────────────────\n\n private getFilteredRows(): any[] {\n let rows = [...this.datasource];\n\n if (this.globalSearch.trim()) {\n const term = this.globalSearch.toLowerCase();\n rows = rows.filter(row =>\n this.visibleCols.some(col => String(this.getCellDisplay(row, col)).toLowerCase().includes(term))\n );\n }\n\n for (const col of this._cols) {\n const term = (this.columnSearch[col.key] ?? '').trim().toLowerCase();\n if (term) {\n rows = rows.filter(row => String(this.getCellDisplay(row, col)).toLowerCase().includes(term));\n }\n }\n\n for (const [key, activeSet] of Object.entries(this.excelFilters)) {\n if (activeSet.size > 0) {\n rows = rows.filter(row => activeSet.has(row[key]));\n }\n }\n\n return rows;\n }\n\n private getSortedFilteredRows(): any[] {\n let rows = this.getFilteredRows();\n if (this.autoMode && this.sortStates.size > 0) {\n const sorts = [...this.sortStates.values()].sort((a, b) => a.index - b.index);\n rows.sort((a, b) => {\n for (const s of sorts) {\n const cmp = String(a[s.key] ?? '').localeCompare(String(b[s.key] ?? ''), undefined, { numeric: true });\n if (cmp !== 0) return s.asc ? cmp : -cmp;\n }\n return 0;\n });\n }\n return rows;\n }\n\n processData(): void {\n const rows = this.getSortedFilteredRows();\n this._filteredTotal = rows.length;\n\n if (this.activeGroups.length > 0) {\n // Group ALL filtered rows first, then paginate the flat list so every\n // group is computed across the full dataset, not just one page's slice.\n const allGrouped = this.flattenGroups(rows, this.activeGroups, 0, '');\n if (this.isPaginated && this.autoMode) {\n const start = (this.currentPage - 1) * this.pageSize;\n this.flatRows = allGrouped.slice(start, start + this.pageSize);\n } else {\n this.flatRows = allGrouped;\n }\n } else if (this.isPaginated && this.autoMode) {\n const start = (this.currentPage - 1) * this.pageSize;\n this.flatRows = rows.slice(start, start + this.pageSize)\n .map((r, i) => ({ _type: 'data', _data: r, _rowIndex: i } as FlatRow));\n } else {\n this.flatRows = rows.map((r, i) => ({ _type: 'data', _data: r, _rowIndex: i } as FlatRow));\n }\n\n this.cdr.markForCheck();\n }\n\n private flattenGroups(rows: any[], groupKeys: string[], level: number, parentPath: string): FlatRow[] {\n const key = groupKeys[0];\n const remaining = groupKeys.slice(1);\n const groups = new Map<any, any[]>();\n for (const row of rows) {\n const val = row[key];\n if (!groups.has(val)) groups.set(val, []);\n groups.get(val)!.push(row);\n }\n const col = this._cols.find(c => c.key === key);\n const result: FlatRow[] = [];\n for (const [val, groupRows] of groups) {\n const path = parentPath ? `${parentPath}||${key}=${val}` : `${key}=${val}`;\n const expanded = !this.collapsedPaths.has(path);\n result.push({\n _type: 'group', _key: key, _value: val,\n _label: this.getCellDisplayByKey(val, col!, undefined),\n _colLabel: col?.label ?? key,\n _level: level, _count: groupRows.length,\n _expanded: expanded, _path: path,\n });\n if (expanded) {\n if (remaining.length > 0) {\n result.push(...this.flattenGroups(groupRows, remaining, level + 1, path));\n } else {\n groupRows.forEach((r, i) => result.push({ _type: 'data', _data: r, _rowIndex: i }));\n }\n }\n }\n return result;\n }\n\n // ─── Sort ─────────────────────────────────────────────────────────────────────\n\n onHeaderClick(col: InternalColumn, event: MouseEvent): void {\n if (!col.sortable) return;\n if (this._suppressNextHeaderClick || this._columnDragJustEnded) return;\n const existing = this.sortStates.get(col.key);\n if (event.shiftKey) {\n if (existing) {\n existing.asc ? this.sortStates.set(col.key, { ...existing, asc: false })\n : this.sortStates.delete(col.key);\n } else {\n this.sortStates.set(col.key, { key: col.key, asc: true, index: this.sortCounter++ });\n }\n } else {\n this.sortStates.clear();\n this.sortStates.set(col.key, { key: col.key, asc: existing ? !existing.asc : true, index: 0 });\n this.sortCounter = 1;\n }\n this.sortChange.emit({ sorts: [...this.sortStates.values()].map(s => ({ key: s.key, asc: s.asc })) });\n this.processData();\n }\n\n getSortState(key: string): SortState | undefined { return this.sortStates.get(key); }\n\n clearSort(): void { this.sortStates.clear(); this.processData(); }\n\n // ─── Column search ────────────────────────────────────────────────────────────\n\n onColumnSearch(key: string, value: string): void {\n this.columnSearch[key] = value;\n this.currentPage = 1;\n this.processData();\n }\n\n // ─── Excel filter ─────────────────────────────────────────────────────────────\n\n openExcelFilter(key: string, event: Event): void {\n event.stopPropagation();\n if (this.openFilterKey === key) { this.openFilterKey = null; return; }\n this.buildExcelFilterItems(key);\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.filterDropdownPos = {\n top: rect.bottom + 4,\n left: Math.max(4, Math.min(rect.left, window.innerWidth - 264)),\n };\n this.openFilterKey = key;\n }\n\n private getFilteredRowsExcluding(excludeKey: string): any[] {\n let rows = [...this.datasource];\n\n if (this.globalSearch.trim()) {\n const term = this.globalSearch.toLowerCase();\n rows = rows.filter(row =>\n this.visibleCols.some(col => String(this.getCellDisplay(row, col)).toLowerCase().includes(term))\n );\n }\n\n for (const col of this._cols) {\n const term = (this.columnSearch[col.key] ?? '').trim().toLowerCase();\n if (term) {\n rows = rows.filter(row => String(this.getCellDisplay(row, col)).toLowerCase().includes(term));\n }\n }\n\n for (const [key, activeSet] of Object.entries(this.excelFilters)) {\n if (key === excludeKey) continue;\n if (activeSet.size > 0) {\n rows = rows.filter(row => activeSet.has(row[key]));\n }\n }\n\n return rows;\n }\n\n private buildExcelFilterItems(key: string): void {\n const activeSet = this.excelFilters[key] ?? new Set();\n const col = this._cols.find(c => c.key === key)!;\n const seen = new Map<any, string>();\n for (const row of this.getFilteredRowsExcluding(key)) {\n const val = row[key];\n if (!seen.has(val)) seen.set(val, this.getCellDisplayByKey(val, col, undefined));\n }\n this.excelFilterState[key] = {\n search: this.excelFilterState[key]?.search ?? '',\n allItems: [...seen.entries()].map(([value, label]) => ({\n value, label,\n checked: activeSet.size === 0 || activeSet.has(value),\n })),\n };\n }\n\n getFilteredExcelItems(key: string): ExcelFilterState['allItems'] {\n const state = this.excelFilterState[key];\n if (!state) return [];\n const s = state.search.toLowerCase();\n return s ? state.allItems.filter(i => i.label.toLowerCase().includes(s)) : state.allItems;\n }\n\n isAllExcelChecked(key: string): boolean {\n const state = this.excelFilterState[key];\n return !!state && state.allItems.every(i => i.checked);\n }\n\n toggleAllExcelFilter(key: string, checked: boolean): void {\n this.excelFilterState[key]?.allItems.forEach(i => (i.checked = checked));\n }\n\n applyExcelFilter(key: string): void {\n const state = this.excelFilterState[key];\n if (!state) return;\n const checked = state.allItems.filter(i => i.checked).map(i => i.value);\n if (checked.length === state.allItems.length) {\n delete this.excelFilters[key];\n } else {\n this.excelFilters[key] = new Set(checked);\n }\n this.openFilterKey = null;\n this.currentPage = 1;\n this.processData();\n }\n\n clearExcelFilter(key: string, event?: Event): void {\n event?.stopPropagation();\n delete this.excelFilters[key];\n if (this.excelFilterState[key]) this.excelFilterState[key].allItems.forEach(i => (i.checked = true));\n this.processData();\n }\n\n hasActiveFilter(key: string): boolean {\n return !!this.excelFilters[key] && this.excelFilters[key].size > 0;\n }\n\n clearAllFilters(): void {\n this.excelFilters = {};\n this.excelFilterState = {};\n this.columnSearch = {};\n this.globalSearch = '';\n this.currentPage = 1;\n this.processData();\n }\n\n get hasAnyFilter(): boolean {\n return !!this.globalSearch.trim()\n || Object.values(this.columnSearch).some(v => !!v?.trim())\n || Object.values(this.excelFilters).some(s => s.size > 0);\n }\n\n // ─── Grouping ─────────────────────────────────────────────────────────────────\n\n addGroup(key: string): void {\n if (!this.activeGroups.includes(key)) {\n this.activeGroups.push(key);\n this.collapsedPaths.clear();\n this.processData();\n }\n }\n\n removeGroup(key: string): void {\n this.activeGroups = this.activeGroups.filter(k => k !== key);\n this.collapsedPaths.clear();\n this.processData();\n }\n\n clearGroups(): void { this.activeGroups = []; this.collapsedPaths.clear(); this.processData(); }\n\n toggleGroup(path: string): void {\n this.collapsedPaths.has(path) ? this.collapsedPaths.delete(path) : this.collapsedPaths.add(path);\n this.processData();\n }\n\n expandAll(): void { this.collapsedPaths.clear(); this.processData(); }\n\n collapseAll(): void {\n this.flatRows\n .filter((r): r is Extract<FlatRow, { _type: 'group' }> => r._type === 'group' && r._level === 0)\n .forEach(r => this.collapsedPaths.add(r._path));\n this.processData();\n }\n\n onGroupPanelDrop(event: CdkDragDrop<string[]>): void {\n moveItemInArray(this.activeGroups, event.previousIndex, event.currentIndex);\n this.collapsedPaths.clear();\n this.processData();\n }\n\n getGroupColLabel(key: string): string {\n return this._cols.find(c => c.key === key)?.label ?? key;\n }\n\n // ─── Column config ────────────────────────────────────────────────────────────\n\n toggleColumnVisibility(col: InternalColumn): void {\n col._hidden = !col._hidden;\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.processData();\n }\n\n toggleColumnPin(col: InternalColumn): void {\n col._pinned = !col._pinned;\n const pinned = this._cols.filter(c => c._pinned);\n const unpinned = this._cols.filter(c => !c._pinned);\n this._cols = [...pinned, ...unpinned];\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.closeColumnMenu();\n this.cdr.markForCheck();\n }\n\n // Header drag: CDK indices are relative to visibleCols DOM order\n onColumnReorder(event: CdkDragDrop<InternalColumn[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n const fromCol = this._visibleCols[event.previousIndex];\n const toCol = this._visibleCols[event.currentIndex];\n if (!fromCol || !toCol) return;\n const fromIdx = this._cols.indexOf(fromCol);\n const toIdx = this._cols.indexOf(toCol);\n if (fromIdx === -1 || toIdx === -1) return;\n moveItemInArray(this._cols, fromIdx, toIdx);\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.cdr.markForCheck();\n }\n\n // Config panel drag: CDK indices are relative to _cols directly\n onConfigColumnReorder(event: CdkDragDrop<InternalColumn[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n moveItemInArray(this._cols, event.previousIndex, event.currentIndex);\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.cdr.markForCheck();\n }\n\n autoSizeColumn(col: InternalColumn, event?: Event): void {\n event?.stopPropagation();\n const labelPx = col.label.length * 8 + 48;\n const sample = this.datasource.slice(0, 200);\n const maxDataPx = sample.reduce((max, row) => {\n const len = String(this.getCellDisplay(row, col)).length * 7 + 24;\n return Math.max(max, len);\n }, 0);\n col._width = Math.max(col.minWidth ?? 60, Math.min(Math.max(labelPx, maxDataPx), 420));\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.closeColumnMenu();\n this.cdr.markForCheck();\n }\n\n autoSizeAll(): void { this.visibleCols.forEach(c => this.autoSizeColumn(c)); }\n\n // ─── Column menu ──────────────────────────────────────────────────────────────\n\n openColumnMenu(key: string, event: Event): void {\n event.stopPropagation();\n this.columnMenuKey = this.columnMenuKey === key ? null : key;\n if (this.columnMenuKey) {\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.columnMenuPos = { top: rect.bottom + 4, left: Math.max(rect.left - 100, 4) };\n }\n }\n\n closeColumnMenu(): void { this.columnMenuKey = null; }\n\n getColumnByKey(key: string): InternalColumn | undefined {\n return this._cols.find(c => c.key === key);\n }\n\n // ─── Column resize ────────────────────────────────────────────────────────────\n\n startResize(col: InternalColumn, event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.resizing = { key: col.key, startX: event.clientX, startWidth: col._width };\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.resizing) return;\n const col = this._cols.find(c => c.key === this.resizing!.key);\n if (!col) return;\n col._width = Math.max(col.minWidth ?? 60, this.resizing.startWidth + (event.clientX - this.resizing.startX));\n this.recomputePinnedOffsets();\n this._totalWidth = this._visibleCols.reduce((s, c) => s + c._width, 0)\n + (this.rowSelection === 'multiple' ? 36 : 0);\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.resizing) {\n this._suppressNextHeaderClick = true;\n setTimeout(() => { this._suppressNextHeaderClick = false; }, 100);\n }\n this.resizing = null;\n this.cdr.markForCheck();\n }\n\n onColumnDragStarted(): void { this._columnDragJustEnded = false; }\n\n onColumnDragEnded(): void {\n this._columnDragJustEnded = true;\n setTimeout(() => { this._columnDragJustEnded = false; }, 100);\n }\n\n showAllColumns(): void {\n this._cols.forEach(c => (c._hidden = false));\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.cdr.markForCheck();\n }\n\n // ─── Header scroll sync ───────────────────────────────────────────────────────\n\n onBodyScroll(event: Event): void {\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.headerScrollRef) {\n this.headerScrollRef.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n // ─── Row selection ────────────────────────────────────────────────────────────\n\n onRowClick(row: any, event: MouseEvent): void {\n this.rowClick.emit(row);\n if (!this.rowSelection) return;\n if (this.rowSelection === 'single') {\n this.selectedRows.clear();\n this.selectedRows.add(row);\n } else {\n if (this.selectedRows.has(row)) {\n this.selectedRows.delete(row);\n } else {\n if (!event.ctrlKey) this.selectedRows.clear();\n this.selectedRows.add(row);\n }\n }\n this.selectionChange.emit([...this.selectedRows]);\n }\n\n toggleRowSelect(row: any, event: Event): void {\n event.stopPropagation();\n this.selectedRows.has(row) ? this.selectedRows.delete(row) : this.selectedRows.add(row);\n this.selectionChange.emit([...this.selectedRows]);\n }\n\n toggleSelectAll(checked: boolean): void {\n this.selectedRows.clear();\n if (checked) {\n this.flatRows.filter(r => r._type === 'data').forEach((r: any) => this.selectedRows.add(r._data));\n }\n this.selectionChange.emit([...this.selectedRows]);\n }\n\n get allSelected(): boolean {\n const dr = this.flatRows.filter(r => r._type === 'data');\n return dr.length > 0 && dr.every((r: any) => this.selectedRows.has(r._data));\n }\n\n get someSelected(): boolean {\n return this.selectedRows.size > 0 && !this.allSelected;\n }\n\n // ─── Pagination ───────────────────────────────────────────────────────────────\n\n get _total(): number { return this.autoMode ? this._filteredTotal : this.totalRecords; }\n get totalPages(): number { return Math.ceil(this._total / this.pageSize) || 1; }\n\n get pageNumbers(): number[] {\n const total = this.totalPages;\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n const pages: number[] = [1];\n if (this.currentPage > 3) pages.push(-1);\n for (let i = Math.max(2, this.currentPage - 1); i <= Math.min(total - 1, this.currentPage + 1); i++) pages.push(i);\n if (this.currentPage < total - 2) pages.push(-1);\n pages.push(total);\n return pages;\n }\n\n get startRecord(): number { return this._total === 0 ? 0 : (this.currentPage - 1) * this.pageSize + 1; }\n get endRecord(): number { return Math.min(this.currentPage * this.pageSize, this._total); }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages) return;\n this.currentPage = page;\n this.processData();\n this.pageChange.emit({ page: this.currentPage, pageSize: this.pageSize });\n }\n\n onPageSizeChange(size: number): void {\n this.pageSize = Number(size);\n this.currentPage = 1;\n this.processData();\n this.pageSizeChange.emit({ page: 1, pageSize: this.pageSize });\n }\n\n // ─── Export Excel ─────────────────────────────────────────────────────────────\n\n exportExcel(): void {\n this._doExportExcel().catch(err => console.error('Excel export failed:', err));\n }\n\n private async _doExportExcel(): Promise<void> {\n const xlsxMod = await import('xlsx-js-style');\n // Handle both ESM default-export and CJS direct-export shapes\n const XLSX: any = (xlsxMod as any).default ?? xlsxMod;\n\n const cols = this.visibleCols;\n const filteredRows = this.getSortedFilteredRows();\n\n const thinBorder = (rgb = 'D9D9D9') => ({\n top: { style: 'thin', color: { rgb } },\n bottom: { style: 'thin', color: { rgb } },\n left: { style: 'thin', color: { rgb } },\n right: { style: 'thin', color: { rgb } },\n });\n\n const headerStyle = {\n font: { bold: true, color: { rgb: 'FFFFFF' }, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: '4472C4' } },\n alignment: { horizontal: 'center', vertical: 'center', wrapText: true },\n border: thinBorder('4472C4'),\n };\n\n // Per-level group header colors (background / font)\n const groupColors = [\n { bg: 'D9E1F2', fg: '1F3864' },\n { bg: 'E2EFDA', fg: '375623' },\n { bg: 'FFF2CC', fg: '7F6000' },\n ];\n\n const dataStyle = {\n font: { sz: 10 },\n border: thinBorder(),\n };\n\n const ws: any = {};\n const merges: { s: { r: number; c: number }; e: { r: number; c: number } }[] = [];\n let rowIdx = 0;\n\n // ── Header group row ────────────────────────────────────────────────────────\n if (this.hasHeaderGroups) {\n let colIdx = 0;\n let i = 0;\n while (i < cols.length) {\n const groupLabel = cols[i].headerGroup ?? '';\n let span = 1;\n while (i + span < cols.length && (cols[i + span].headerGroup ?? '') === groupLabel) span++;\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: colIdx })] = { v: groupLabel, t: 's', s: headerStyle };\n for (let k = 1; k < span; k++) {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: colIdx + k })] = { v: '', t: 's', s: headerStyle };\n }\n if (span > 1) merges.push({ s: { r: rowIdx, c: colIdx }, e: { r: rowIdx, c: colIdx + span - 1 } });\n colIdx += span;\n i += span;\n }\n rowIdx++;\n }\n\n // ── Column label row ────────────────────────────────────────────────────────\n cols.forEach((col, ci) => {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = { v: col.label, t: 's', s: headerStyle };\n });\n rowIdx++;\n\n // ── Data / group rows ───────────────────────────────────────────────────────\n const writeDataRows = (rows: any[]): void => {\n rows.forEach(r => {\n cols.forEach((col, ci) => {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: this.getCellDisplay(r, col), t: 's', s: dataStyle,\n };\n });\n rowIdx++;\n });\n };\n\n const buildExcelRows = (rows: any[], groupKeys: string[], level: number): void => {\n if (groupKeys.length === 0) { writeDataRows(rows); return; }\n const key = groupKeys[0];\n const remaining = groupKeys.slice(1);\n const groups = new Map<any, any[]>();\n for (const row of rows) {\n const v = row[key]; if (!groups.has(v)) groups.set(v, []); groups.get(v)!.push(row);\n }\n const colDef = this._cols.find(c => c.key === key)!;\n const color = groupColors[Math.min(level, groupColors.length - 1)];\n const groupStyle = {\n font: { bold: true, color: { rgb: color.fg }, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: color.bg } },\n alignment: { horizontal: 'left', vertical: 'center' },\n border: thinBorder(),\n };\n const subtotalStyle = {\n font: { bold: true, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: 'F2F2F2' } },\n border: thinBorder(),\n };\n const sumCols = cols.filter(c => c.sumOnPdf);\n\n for (const [val, gr] of groups) {\n const label = this.getCellDisplayByKey(val, colDef, undefined);\n const indent = ' '.repeat(level);\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: 0 })] = {\n v: `${indent}${colDef?.label ?? key}: ${label} (${gr.length} rows)`, t: 's', s: groupStyle,\n };\n for (let k = 1; k < cols.length; k++) {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: k })] = { v: '', t: 's', s: groupStyle };\n }\n if (cols.length > 1) merges.push({ s: { r: rowIdx, c: 0 }, e: { r: rowIdx, c: cols.length - 1 } });\n rowIdx++;\n\n buildExcelRows(gr, remaining, level + 1);\n\n if (sumCols.length > 0) {\n cols.forEach((col, ci) => {\n if (col.sumOnPdf) {\n const s = gr.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: s, t: 'n', s: { ...subtotalStyle, alignment: { horizontal: 'right' } },\n };\n } else {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: ci === 0 ? `${indent}Subtotal: ${label}` : '', t: 's', s: subtotalStyle,\n };\n }\n });\n rowIdx++;\n }\n }\n };\n\n if (this.activeGroups.length > 0) {\n buildExcelRows(filteredRows, this.activeGroups, 0);\n } else {\n writeDataRows(filteredRows);\n }\n\n // ── Grand total row ─────────────────────────────────────────────────────────\n const sumCols = cols.filter(c => c.sumOnPdf);\n if (sumCols.length > 0) {\n const grandStyle = {\n font: { bold: true, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: 'D9D9D9' } },\n border: thinBorder('000000'),\n };\n cols.forEach((col, ci) => {\n if (col.sumOnPdf) {\n const s = filteredRows.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: s, t: 'n', s: { ...grandStyle, alignment: { horizontal: 'right' } },\n };\n } else {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: ci === 0 ? 'Grand Total' : '', t: 's', s: grandStyle,\n };\n }\n });\n rowIdx++;\n }\n\n ws['!ref'] = XLSX.utils.encode_range({ s: { r: 0, c: 0 }, e: { r: rowIdx - 1, c: cols.length - 1 } });\n ws['!cols'] = cols.map(c => ({ wpx: c._width }));\n if (merges.length) ws['!merges'] = merges;\n\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, (this.title || 'Report').slice(0, 31));\n XLSX.writeFile(wb, `${this.title || 'report'}.xlsx`);\n }\n\n // ─── Export PDF ───────────────────────────────────────────────────────────────\n\n async exportPdf(): Promise<void> {\n const [{ jsPDF }, { default: autoTable }] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n\n const cfg = this.pdfConfig ?? {};\n const orientation = cfg.orientation ?? 'landscape';\n const doc = new jsPDF({ orientation, unit: 'pt', format: 'a4' });\n const pw = doc.internal.pageSize.getWidth();\n const ph = doc.internal.pageSize.getHeight();\n const margin = 36;\n const usableW = pw - margin * 2;\n let yPos = margin;\n\n // Logo (top-left) + Company name/address (center)\n const logoH = 50;\n if (cfg.logo) {\n try {\n const img = await this._loadImageForPdf(cfg.logo);\n const logoW = (img.naturalWidth / img.naturalHeight) * logoH;\n doc.addImage(img.dataUrl, img.imgType as any, margin, yPos, logoW, logoH);\n } catch { /* ignore broken logo */ }\n }\n if (cfg.companyName) {\n doc.setFont('helvetica', 'bold'); doc.setFontSize(16); doc.setTextColor(0, 0, 0);\n doc.text(cfg.companyName, pw / 2, yPos + 20, { align: 'center' });\n }\n if (cfg.companyAddress) {\n doc.setFont('helvetica', 'normal'); doc.setFontSize(9); doc.setTextColor(60, 60, 60);\n doc.text(cfg.companyAddress, pw / 2, yPos + 34, { align: 'center' });\n }\n if (cfg.logo || cfg.companyName || cfg.companyAddress) { yPos += logoH + 10; }\n\n // Report name: ══════ Report Name ══════ (double lines on each side, centered)\n if (cfg.reportName) {\n doc.setFont('helvetica', 'bold');\n doc.setFontSize(12);\n doc.setTextColor(0, 0, 0);\n const textW = doc.getTextWidth(cfg.reportName);\n const cx = pw / 2;\n const gap = 12;\n const ty = yPos + 16; // text baseline\n const ly = ty - 5; // top line Y\n doc.setLineWidth(0.4);\n doc.setDrawColor(0, 0, 0);\n // left double lines — end exactly where the text begins\n doc.line(margin, ly, cx - textW / 2 - gap, ly);\n doc.line(margin, ly + 2, cx - textW / 2 - gap, ly + 2);\n // centered report name\n doc.text(cfg.reportName, cx, ty, { align: 'center' });\n // right double lines — start exactly where the text ends\n doc.line(cx + textW / 2 + gap, ly, pw - margin, ly);\n doc.line(cx + textW / 2 + gap, ly + 2, pw - margin, ly + 2);\n yPos = ty + 14;\n }\n\n // Build table body (recursive, supports groups + subtotals)\n const cols = this.visibleCols;\n const filteredRows = this.getSortedFilteredRows();\n const totalGridW = cols.reduce((s, c) => s + c._width, 0) || 1;\n const colWidths = cols.map(c => (c._width / totalGridW) * usableW);\n const sumCols = cols.filter(c => c.sumOnPdf);\n\n const body: any[][] = [];\n // Light gray shading per group level — no blue, clean financial-report look\n const groupBg = [[242, 242, 242], [247, 247, 247], [252, 252, 252]];\n const subtotalBg = [[232, 232, 232], [237, 237, 237], [242, 242, 242]];\n\n const buildPdfRows = (rows: any[], groupKeys: string[], level: number): void => {\n if (groupKeys.length === 0) {\n rows.forEach(r => body.push(cols.map(col => ({\n content: this.getCellDisplay(r, col),\n styles: { halign: col.align ?? 'left', textColor: [0, 0, 0] },\n }))));\n return;\n }\n const key = groupKeys[0];\n const remaining = groupKeys.slice(1);\n const groups = new Map<any, any[]>();\n for (const row of rows) { const v = row[key]; if (!groups.has(v)) groups.set(v, []); groups.get(v)!.push(row); }\n const colDef = this._cols.find(c => c.key === key)!;\n const bg = groupBg[Math.min(level, groupBg.length - 1)];\n const sb = subtotalBg[Math.min(level, subtotalBg.length - 1)];\n\n for (const [val, gr] of groups) {\n const label = this.getCellDisplayByKey(val, colDef, undefined);\n const indent = ' '.repeat(level);\n body.push([{\n content: `${indent}${colDef?.label ?? key}: ${label} (${gr.length.toLocaleString()} rows)`,\n colSpan: cols.length,\n styles: { fontStyle: 'bold', fillColor: bg, textColor: [0, 0, 0] },\n }]);\n buildPdfRows(gr, remaining, level + 1);\n if (sumCols.length > 0) {\n body.push(cols.map((col, i) => {\n if (col.sumOnPdf) {\n const s = gr.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n return { content: this.decimalPipe.transform(s, '1.0-2') ?? String(s), styles: { fontStyle: 'bold', halign: 'right', fillColor: sb, textColor: [0, 0, 0] } };\n }\n return { content: i === 0 ? `${indent}Subtotal: ${label}` : '', styles: { fontStyle: 'bold', fillColor: sb, textColor: [0, 0, 0] } };\n }));\n }\n }\n };\n\n if (this.activeGroups.length > 0) {\n buildPdfRows(filteredRows, this.activeGroups, 0);\n } else {\n filteredRows.forEach(r => body.push(cols.map(col => ({\n content: this.getCellDisplay(r, col),\n styles: { halign: col.align ?? 'left', textColor: [0, 0, 0] },\n }))));\n }\n\n // Grand total row\n if (sumCols.length > 0) {\n body.push(cols.map((col, i) => {\n if (col.sumOnPdf) {\n const s = filteredRows.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n return { content: this.decimalPipe.transform(s, '1.0-2') ?? String(s), styles: { fontStyle: 'bold', halign: 'right', fillColor: [220, 220, 220], textColor: [0, 0, 0] } };\n }\n return { content: i === 0 ? 'Grand Total' : '', styles: { fontStyle: 'bold', fillColor: [220, 220, 220], textColor: [0, 0, 0] } };\n }));\n }\n\n // Render table: clean black-bordered financial-report style\n const colStylesMap: Record<number, any> = {};\n cols.forEach((_col, i) => { colStylesMap[i] = { cellWidth: colWidths[i] }; });\n\n // Build double header rows when headerGroup is used\n const colLabelsRow = cols.map((c, i) => ({ content: c.label, styles: { halign: c.align ?? 'left', cellWidth: colWidths[i] } }));\n const pdfHead: any[][] = [];\n if (this.hasHeaderGroups) {\n const groupRow: any[] = [];\n let i = 0;\n while (i < cols.length) {\n const groupLabel = cols[i].headerGroup ?? '';\n let span = 1;\n while (i + span < cols.length && (cols[i + span].headerGroup ?? '') === groupLabel) span++;\n groupRow.push({ content: groupLabel, colSpan: span, styles: { halign: 'center', fontStyle: 'bold' } });\n i += span;\n }\n pdfHead.push(groupRow);\n }\n pdfHead.push(colLabelsRow);\n\n autoTable(doc, {\n head: pdfHead,\n body,\n startY: yPos,\n margin: { left: margin, right: margin, top: margin, bottom: margin + 18 },\n styles: {\n fontSize: 8,\n cellPadding: { top: 4, right: 6, bottom: 4, left: 6 },\n overflow: 'linebreak',\n lineColor: [0, 0, 0],\n lineWidth: 0.3,\n textColor: [0, 0, 0],\n fillColor: [255, 255, 255],\n },\n headStyles: {\n fillColor: [255, 255, 255],\n textColor: [0, 0, 0],\n fontStyle: 'bold',\n fontSize: 8.5,\n lineColor: [0, 0, 0],\n lineWidth: 0.4,\n },\n alternateRowStyles: cfg.alternatingRows ? { fillColor: [248, 248, 248] } : {},\n columnStyles: colStylesMap,\n showHead: 'everyPage',\n tableLineColor: [0, 0, 0],\n tableLineWidth: 0.4,\n } as any);\n\n // Footer: page numbers + timestamp on every page\n const total = (doc as any).internal.pages.length - 1;\n const ts = new Date().toLocaleString();\n for (let p = 1; p <= total; p++) {\n doc.setPage(p);\n doc.setFontSize(7.5); doc.setTextColor(100);\n doc.text(`Generated: ${ts}`, margin, ph - 14);\n doc.text(`Page ${p} of ${total}`, pw - margin, ph - 14, { align: 'right' });\n doc.setTextColor(0);\n }\n\n doc.save(`${this.title || 'report'}.pdf`);\n }\n\n private async _loadImageForPdf(src: string): Promise<{ dataUrl: string; imgType: string; naturalWidth: number; naturalHeight: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth; canvas.height = img.naturalHeight;\n canvas.getContext('2d')!.drawImage(img, 0, 0);\n const ext = (src.split('?')[0].split('.').pop() ?? '').toLowerCase();\n const imgType = ext === 'png' ? 'PNG' : 'JPEG';\n resolve({ dataUrl: canvas.toDataURL(`image/${imgType.toLowerCase()}`), imgType, naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = src;\n });\n }\n\n // ─── Aggregates ───────────────────────────────────────────────────────────────\n\n getAggregate(col: InternalColumn): string {\n if (!col.aggregate) return '';\n const vals = this.flatRows\n .filter(r => r._type === 'data')\n .map((r: any) => Number(r._data[col.key]))\n .filter(v => !isNaN(v));\n if (!vals.length) return '--';\n const fmt = (n: number) => this.decimalPipe.transform(n, '1.0-2') ?? String(n);\n switch (col.aggregate) {\n case 'sum': return fmt(vals.reduce((a, b) => a + b, 0));\n case 'avg': return fmt(vals.reduce((a, b) => a + b, 0) / vals.length);\n case 'count': return String(vals.length);\n case 'min': return fmt(Math.min(...vals));\n case 'max': return fmt(Math.max(...vals));\n default: return '';\n }\n }\n\n hasAnyAggregate(): boolean { return this.visibleCols.some(c => !!c.aggregate); }\n\n // ─── Cell display ─────────────────────────────────────────────────────────────\n\n getCellDisplay(row: any, col: InternalColumn): string {\n return this.getCellDisplayByKey(row[col.key], col, row);\n }\n\n getCellDisplayByKey(raw: any, col: InternalColumn, row: any): string {\n if (col.displayFn && row !== undefined) return col.displayFn(raw, row);\n if (col.enums?.length) return col.enums.find(e => e.value === raw)?.label ?? (raw ?? '--');\n if (raw === null || raw === undefined || raw === '') return '--';\n switch (col.displayType) {\n case 'date': return this.datePipe.transform(raw, 'MM/dd/yyyy') ?? '--';\n case 'datetime': return this.datePipe.transform(raw, 'MM/dd/yyyy HH:mm') ?? '--';\n case 'time': return this.datePipe.transform(raw, 'HH:mm') ?? '--';\n case 'currency': return '$' + Number(raw).toLocaleString('en-US', { minimumFractionDigits: 2 });\n case 'number': return Number(raw).toLocaleString();\n case 'percentage': return Number(raw).toFixed(2) + '%';\n default: return String(raw);\n }\n }\n\n getCellClass(row: any, col: InternalColumn): string {\n if (!col.cellClass) return '';\n return typeof col.cellClass === 'function' ? col.cellClass(row[col.key], row) : col.cellClass;\n }\n\n // ─── Copy cell ────────────────────────────────────────────────────────────────\n\n copyCell(value: string, event: Event): void {\n event.stopPropagation();\n navigator.clipboard?.writeText(value).then(() => {\n this.copiedCell = value;\n setTimeout(() => (this.copiedCell = null), 1500);\n });\n }\n\n // ─── Skeleton / empty ─────────────────────────────────────────────────────────\n\n get skeletonRows(): number[] { return Array.from({ length: Math.min(this.pageSize, 15) }); }\n\n get isEmpty(): boolean {\n return !this.loading && this.flatRows.length === 0;\n }\n\n // ─── Global click close ───────────────────────────────────────────────────────\n\n @HostListener('document:click')\n onDocumentClick(): void {\n this.openFilterKey = null;\n this.columnMenuKey = null;\n }\n\n // ─── TrackBy ─────────────────────────────────────────────────────────────────\n\n trackByRow = (_: number, row: FlatRow): any =>\n row._type === 'data' ? `d-${row._rowIndex}` : `g-${(row as any)._path}`;\n\n trackByCol = (_: number, col: InternalColumn): string => col.key;\n\n trackByStr = (_: number, s: string): string => s;\n\n asGroupRow = (row: FlatRow): Extract<FlatRow, { _type: 'group' }> =>\n row as Extract<FlatRow, { _type: 'group' }>;\n\n asDataRow = (row: FlatRow): Extract<FlatRow, { _type: 'data' }> =>\n row as Extract<FlatRow, { _type: 'data' }>;\n}\n","<div class=\"osl-rg\" (click)=\"closeColumnMenu(); openFilterKey = null; $event.stopPropagation()\">\n\n <!-- ══ TOOLBAR ══════════════════════════════════════════════════════════════ -->\n <div class=\"osl-rg-toolbar\">\n <div class=\"osl-rg-toolbar__left\">\n @if (title) { <span class=\"osl-rg-title\">{{ title }}</span> }\n @if (!loading) {\n @if (_filteredTotal !== datasource.length) {\n <span class=\"osl-rg-filter-badge\">\n <span class=\"osl-rg-filter-badge__dot\"></span>\n {{ _filteredTotal | number }} of {{ datasource.length | number }} rows\n </span>\n } @else {\n <span class=\"osl-rg-record-count\">{{ datasource.length | number }} rows</span>\n }\n }\n </div>\n <div class=\"osl-rg-toolbar__right\">\n\n <!-- Global search -->\n <div class=\"osl-rg-global-search\">\n <svg class=\"osl-rg-global-search__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>\n </svg>\n <input class=\"osl-rg-global-search__input\" placeholder=\"Search all columns…\"\n [(ngModel)]=\"globalSearch\" (ngModelChange)=\"currentPage=1; processData()\" />\n @if (globalSearch) {\n <button class=\"osl-rg-global-search__clear\" (click)=\"globalSearch=''; processData()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n </div>\n\n <!-- Sort active badge -->\n @if (sortStates.size > 0) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--active\" (click)=\"clearSort()\" title=\"Clear sort\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 5H4M11 9H4M11 13H4M18 4v16M15 7l3-3 3 3M15 17l3 3 3-3\"/>\n </svg>\n <span>{{ sortStates.size }} sort{{ sortStates.size > 1 ? 's' : '' }}</span>\n <svg class=\"rg-icon rg-icon--xs\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n\n <!-- Filter active badge -->\n @if (hasAnyFilter) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--danger\" (click)=\"clearAllFilters()\" title=\"Clear all filters\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M22 3H2l8 9.46V19l4 2V12.46z\"/></svg>\n <span>Filtered</span>\n <svg class=\"rg-icon rg-icon--xs\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n\n <!-- Group toggle -->\n <button class=\"osl-rg-toolbar-btn\" [class.osl-rg-toolbar-btn--on]=\"showGroupPanel\"\n (click)=\"showGroupPanel=!showGroupPanel\" title=\"Group panel\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 3H8a2 2 0 0 0-2 2v2h12V5a2 2 0 0 0-2-2z\"/>\n </svg>\n <span>Group</span>\n </button>\n\n <!-- Expand / collapse when grouped -->\n @if (activeGroups.length > 0) {\n <button class=\"osl-rg-toolbar-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 20 5-5 5 5M7 4l5 5 5-5\"/></svg>\n </button>\n <button class=\"osl-rg-toolbar-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 15 5-5 5 5M7 9l5 5 5 5\"/></svg>\n </button>\n }\n\n <!-- Auto-size all -->\n <button class=\"osl-rg-toolbar-btn\" (click)=\"autoSizeAll()\" title=\"Auto-size all columns\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 6H3M21 18H3\"/><path d=\"M8 3 3 6l5 3M16 3l5 3-5 3M8 15l-5 3 5 3M16 15l5 3-5 3\"/>\n </svg>\n <span>Auto-size</span>\n </button>\n\n <!-- Column config -->\n <button class=\"osl-rg-toolbar-btn\" [class.osl-rg-toolbar-btn--on]=\"showColumnConfig\"\n (click)=\"showColumnConfig=!showColumnConfig; $event.stopPropagation()\" title=\"Column settings\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 6h16M4 12h16M4 18h16\"/>\n <circle cx=\"8\" cy=\"6\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"12\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"8\" cy=\"18\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Columns</span>\n </button>\n\n <!-- Export Excel -->\n @if (exportable) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--excel\" (click)=\"exportExcel()\" title=\"Export to Excel\">\n <svg class=\"rg-icon rg-icon--excel\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" rx=\"3\" fill=\"#1D6F42\"/>\n <path d=\"M13.5 3H7a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7.5L13.5 3z\" fill=\"#fff\" opacity=\".15\"/>\n <path d=\"M13.5 3v4.5H18L13.5 3z\" fill=\"#fff\" opacity=\".3\"/>\n <path d=\"M8 9.5l2.3 3.5L8 16.5h1.6l1.4-2.3 1.4 2.3H14l-2.3-3.5 2.3-3.5h-1.6l-1.4 2.3-1.4-2.3H8z\" fill=\"#fff\"/>\n </svg>\n <span>Export Excel</span>\n </button>\n }\n\n <!-- Export PDF -->\n @if (exportable && pdfExportFromGrid) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--pdf\" (click)=\"exportPdf()\" title=\"Export to PDF\">\n <svg class=\"rg-icon rg-icon--pdf\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" rx=\"3\" fill=\"#D32F2F\"/>\n <path d=\"M13.5 3H7a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7.5L13.5 3z\" fill=\"#fff\" opacity=\".15\"/>\n <path d=\"M13.5 3v4.5H18L13.5 3z\" fill=\"#fff\" opacity=\".3\"/>\n <text x=\"4.5\" y=\"17.5\" fill=\"#fff\" font-size=\"6.5\" font-family=\"sans-serif\" font-weight=\"700\">PDF</text>\n </svg>\n <span>Export PDF</span>\n </button>\n }\n </div>\n </div>\n\n <!-- ══ GROUP PANEL ═══════════════════════════════════════════════════════════ -->\n @if (showGroupPanel) {\n <div class=\"osl-rg-group-panel\">\n <span class=\"osl-rg-group-panel__label\">Group by:</span>\n @if (activeGroups.length === 0) {\n <span class=\"osl-rg-group-panel__hint\">Use the ⋮ column menu → \"Group by this\"</span>\n }\n <div class=\"osl-rg-group-chips\" cdkDropList cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"activeGroups\" (cdkDropListDropped)=\"onGroupPanelDrop($event)\">\n @for (key of activeGroups; track key) {\n <div class=\"osl-rg-group-chip\" cdkDrag>\n <svg cdkDragHandle class=\"rg-drag-handle\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\"/><circle cx=\"15\" cy=\"5\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"12\" r=\"1.5\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"19\" r=\"1.5\"/><circle cx=\"15\" cy=\"19\" r=\"1.5\"/>\n </svg>\n <span>{{ getGroupColLabel(key) }}</span>\n <button class=\"osl-rg-group-chip__remove\" (click)=\"removeGroup(key)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n </div>\n }\n </div>\n @if (activeGroups.length > 0) {\n <button class=\"osl-rg-group-panel__clear\" (click)=\"clearGroups()\">Clear groups</button>\n }\n </div>\n }\n\n <!-- ══ STICKY HEADER ════════════════════════════════════════════════════════ -->\n <div class=\"osl-rg-header-wrap\" #headerScrollRef>\n\n <!-- Double header – group row (only rendered when headerGroup is used on any column) -->\n @if (hasHeaderGroups) {\n <div class=\"osl-rg-header-row osl-rg-header-row--groups\" [style.minWidth.px]=\"totalWidth\">\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-th osl-rg-th--checkbox osl-rg-th--group-span\"></div>\n }\n <div style=\"display:flex;flex:1;min-width:0;\">\n @for (group of computedHeaderGroups; track $index) {\n <div class=\"osl-rg-th osl-rg-th--group-span\"\n [class.osl-rg-th--group-span--labeled]=\"!!group.label\"\n [class.osl-rg-th--pinned]=\"group.isPinned\"\n [style.width.px]=\"group.width\"\n [style.minWidth.px]=\"group.width\"\n [style.left.px]=\"group.isPinned ? group.stickyLeft : null\"\n [style.position]=\"group.isPinned ? 'sticky' : 'relative'\"\n [style.zIndex]=\"group.isPinned ? 3 : 1\">\n @if (group.label) {\n <span class=\"osl-rg-th-group-label\">{{ group.label }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"osl-rg-header-row\" [style.minWidth.px]=\"totalWidth\">\n\n <!-- Select-all checkbox -->\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-th osl-rg-th--checkbox\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\"\n [checked]=\"allSelected\" [indeterminate]=\"someSelected\"\n (change)=\"toggleSelectAll($any($event.target).checked)\" />\n </div>\n }\n\n <!-- Column headers (drag-to-reorder) -->\n <div class=\"osl-rg-header-cols\" cdkDropList cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"_cols\" (cdkDropListDropped)=\"onColumnReorder($event)\"\n style=\"display:flex;flex:1;min-width:0;\">\n\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-th\"\n [class.osl-rg-th--pinned]=\"col._pinned\"\n [class.osl-rg-th--sorted]=\"getSortState(col.key)\"\n [class.osl-rg-th--filtered]=\"hasActiveFilter(col.key)\"\n [style.width.px]=\"col._width\"\n [style.minWidth.px]=\"col._width\"\n [style.left.px]=\"col._pinned ? col._stickyLeft : null\"\n [style.position]=\"col._pinned ? 'sticky' : 'relative'\"\n [style.zIndex]=\"col._pinned ? 3 : 1\"\n cdkDrag [cdkDragDisabled]=\"col._pinned\"\n (cdkDragStarted)=\"onColumnDragStarted()\"\n (cdkDragEnded)=\"onColumnDragEnded()\"\n (click)=\"onHeaderClick(col, $event)\">\n\n <div *cdkDragPlaceholder class=\"osl-rg-th-drag-placeholder\"></div>\n\n <!-- Pin badge -->\n @if (col._pinned) {\n <span class=\"osl-rg-th-pin-badge\" title=\"Pinned\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"9\" height=\"9\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/></svg>\n </span>\n }\n\n <!-- Label row -->\n <div class=\"osl-rg-th-content\">\n <span class=\"osl-rg-th-label\" [title]=\"col.label\">{{ col.label }}</span>\n <div class=\"osl-rg-th-actions\">\n\n <!-- Sort indicator -->\n @if (col.sortable) {\n <span class=\"osl-rg-sort-icon\"\n [class.osl-rg-sort-icon--asc]=\"getSortState(col.key)?.asc === true\"\n [class.osl-rg-sort-icon--desc]=\"getSortState(col.key)?.asc === false\">\n @if (getSortState(col.key); as s) {\n @if (s.asc) {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5m-7 7 7-7 7 7\"/></svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14m7-7-7 7-7-7\"/></svg>\n }\n @if (sortStates.size > 1) { <sup class=\"osl-rg-sort-badge\">{{ s.index + 1 }}</sup> }\n } @else {\n <svg class=\"osl-rg-sort-idle\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 9l4-4 4 4M16 15l-4 4-4-4\"/></svg>\n }\n </span>\n }\n\n <!-- Excel filter button -->\n @if (col.filterable) {\n <button class=\"osl-rg-filter-btn\" [class.osl-rg-filter-btn--active]=\"hasActiveFilter(col.key)\"\n (click)=\"openExcelFilter(col.key, $event)\" title=\"Filter\">\n @if (hasActiveFilter(col.key)) {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M22 3H2l8 9.46V19l4 2V12.46z\"/></svg>\n } @else {\n <svg 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\"/></svg>\n }\n </button>\n }\n\n <!-- Column menu -->\n <button class=\"osl-rg-col-menu-btn\" (click)=\"openColumnMenu(col.key, $event)\" title=\"Column options\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"12\" cy=\"5\" r=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><circle cx=\"12\" cy=\"19\" r=\"2\"/></svg>\n </button>\n\n </div>\n </div>\n\n <!-- Per-column search -->\n @if (col.searchable) {\n <div class=\"osl-rg-col-search\" (click)=\"$event.stopPropagation()\">\n <svg class=\"osl-rg-col-search__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m18 18-3.5-3.5\"/>\n </svg>\n <input class=\"osl-rg-col-search__input\" [placeholder]=\"col.label + '…'\"\n [ngModel]=\"columnSearch[col.key]\" (ngModelChange)=\"onColumnSearch(col.key, $event)\" />\n @if (columnSearch[col.key]) {\n <button class=\"osl-rg-col-search__clear\" (click)=\"columnSearch[col.key]=''; processData()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n </div>\n }\n\n <!-- Resize handle -->\n @if (col.resizable) {\n <div class=\"osl-rg-resize-handle\" (mousedown)=\"startResize(col, $event)\" (dblclick)=\"autoSizeColumn(col, $event)\" (click)=\"$event.stopPropagation()\"></div>\n }\n\n\n </div><!-- /osl-rg-th -->\n }\n\n </div><!-- /header-cols -->\n </div><!-- /header-row -->\n </div><!-- /header-wrap -->\n\n <!-- ══ SCROLLABLE BODY ══════════════════════════════════════════════════════ -->\n <div class=\"osl-rg-body\" [style.height]=\"tableHeight\" #bodyScrollRef (scroll)=\"onBodyScroll($event)\">\n <div class=\"osl-rg-inner\" [style.minWidth.px]=\"totalWidth\">\n\n <!-- Skeleton loading -->\n @if (loading) {\n @for (sk of skeletonRows; track $index) {\n <div class=\"osl-rg-row osl-rg-row--skeleton\" [style.height.px]=\"rowHeight\">\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-td osl-rg-td--checkbox\"><div class=\"osl-rg-skel\" style=\"width:14px;height:14px;border-radius:3px;\"></div></div>\n }\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-td\" [style.width.px]=\"col._width\" [style.minWidth.px]=\"col._width\">\n <div class=\"osl-rg-skel\" [style.width]=\"$index % 3 === 0 ? '55%' : $index % 3 === 1 ? '80%' : '65%'\"></div>\n </div>\n }\n </div>\n }\n\n } @else if (isEmpty) {\n <!-- Empty state -->\n <div class=\"osl-rg-empty\">\n <div class=\"osl-rg-empty__icon\">\n <svg viewBox=\"0 0 48 48\" fill=\"none\" stroke=\"#d1d5db\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"6\" y=\"6\" width=\"36\" height=\"36\" rx=\"4\"/>\n <path d=\"M6 18h36M6 30h36M18 6v36\"/>\n </svg>\n </div>\n <p class=\"osl-rg-empty__title\">No records found</p>\n <p class=\"osl-rg-empty__sub\">\n @if (hasAnyFilter) { Try adjusting your filters or search terms }\n @else { No data to display }\n </p>\n @if (hasAnyFilter) {\n <button class=\"osl-rg-empty__action\" (click)=\"clearAllFilters()\">Clear all filters</button>\n }\n </div>\n\n } @else {\n <!-- Data rows -->\n @for (row of flatRows; track trackByRow($index, row)) {\n\n @if (row._type === 'group') {\n <div class=\"osl-rg-group-row\"\n [class.osl-rg-group-row--l0]=\"asGroupRow(row)._level === 0\"\n [class.osl-rg-group-row--l1]=\"asGroupRow(row)._level === 1\"\n [class.osl-rg-group-row--l2]=\"asGroupRow(row)._level >= 2\"\n [style.height.px]=\"rowHeight\"\n [style.paddingLeft.px]=\"asGroupRow(row)._level * 20 + 12\"\n (click)=\"toggleGroup(asGroupRow(row)._path)\">\n @if (asGroupRow(row)._expanded) {\n <svg class=\"osl-rg-group-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>\n } @else {\n <svg class=\"osl-rg-group-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n }\n <span class=\"osl-rg-group-row__key\">{{ asGroupRow(row)._colLabel }}:</span>\n <span class=\"osl-rg-group-row__value\">{{ asGroupRow(row)._label }}</span>\n <span class=\"osl-rg-group-row__count\">{{ asGroupRow(row)._count | number }} rows</span>\n </div>\n\n } @else {\n <div class=\"osl-rg-row\"\n [class.osl-rg-row--striped]=\"striped && asDataRow(row)._rowIndex % 2 === 1\"\n [class.osl-rg-row--selected]=\"selectedRows.has(asDataRow(row)._data)\"\n [style.height.px]=\"rowHeight\"\n (click)=\"onRowClick(asDataRow(row)._data, $event)\">\n\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-td osl-rg-td--checkbox\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\"\n [checked]=\"selectedRows.has(asDataRow(row)._data)\"\n (change)=\"toggleRowSelect(asDataRow(row)._data, $event)\" />\n </div>\n }\n\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-td\"\n [class.osl-rg-td--pinned]=\"col._pinned\"\n [ngClass]=\"getCellClass(asDataRow(row)._data, col)\"\n [style.width.px]=\"col._width\"\n [style.minWidth.px]=\"col._width\"\n [style.left.px]=\"col._pinned ? col._stickyLeft : null\"\n [style.position]=\"col._pinned ? 'sticky' : 'relative'\"\n [style.zIndex]=\"col._pinned ? 2 : 0\"\n [style.textAlign]=\"col.align ?? 'left'\"\n (dblclick)=\"copyCell(getCellDisplay(asDataRow(row)._data, col), $event)\"\n [title]=\"getCellDisplay(asDataRow(row)._data, col)\">\n <span class=\"osl-rg-cell-text\">{{ getCellDisplay(asDataRow(row)._data, col) }}</span>\n </div>\n }\n\n </div>\n }\n\n }\n }\n\n </div><!-- /osl-rg-inner -->\n </div><!-- /osl-rg-body -->\n\n <!-- ══ AGGREGATE FOOTER ═════════════════════════════════════════════════════ -->\n @if (showAggregates && hasAnyAggregate() && !loading) {\n <div class=\"osl-rg-aggregate-row\" [style.minWidth.px]=\"totalWidth\">\n @if (rowSelection === 'multiple') { <div class=\"osl-rg-agg-cell osl-rg-agg-cell--checkbox\"></div> }\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-agg-cell\" [style.width.px]=\"col._width\" [style.minWidth.px]=\"col._width\" [style.textAlign]=\"col.align ?? 'left'\">\n @if (col.aggregate) {\n <span class=\"osl-rg-agg-label\">{{ col.aggregate | uppercase }}</span>\n <span class=\"osl-rg-agg-value\">{{ getAggregate(col) }}</span>\n }\n </div>\n }\n </div>\n }\n\n <!-- ══ PAGINATION ════════════════════════════════════════════════════════════ -->\n @if (isPaginated) {\n <div class=\"osl-rg-pagination\">\n <span class=\"osl-rg-pagination__info\">\n @if (loading) { Loading… }\n @else if (_total > 0) { Showing <strong>{{ startRecord | number }}–{{ endRecord | number }}</strong> of <strong>{{ _total | number }}</strong> records }\n @else { No records }\n </span>\n <div class=\"osl-rg-pagination__controls\">\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(1)\" [disabled]=\"currentPage===1||loading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m11 17-5-5 5-5M18 17l-5-5 5-5\"/></svg>\n </button>\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(currentPage-1)\" [disabled]=\"currentPage===1||loading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m15 18-6-6 6-6\"/></svg>\n Prev\n </button>\n @for (page of pageNumbers; track $index) {\n @if (page === -1) { <span class=\"osl-rg-page-ellipsis\">…</span> }\n @else {\n <button class=\"osl-rg-page-btn osl-rg-page-btn--num\" [class.osl-rg-page-btn--active]=\"page===currentPage\"\n [disabled]=\"loading\" (click)=\"goToPage(page)\">{{ page }}</button>\n }\n }\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(currentPage+1)\" [disabled]=\"currentPage===totalPages||loading\">\n Next\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m9 18 6-6-6-6\"/></svg>\n </button>\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(totalPages)\" [disabled]=\"currentPage===totalPages||loading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m13 17 5-5-5-5M6 17l5-5-5-5\"/></svg>\n </button>\n </div>\n <div class=\"osl-rg-pagination__size\">\n <span class=\"osl-rg-pagination__size-label\">Rows per page</span>\n <select class=\"osl-rg-page-size\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" [disabled]=\"loading\">\n @for (opt of pageSizeOptions; track opt) { <option [value]=\"opt\">{{ opt }}</option> }\n </select>\n </div>\n </div>\n }\n\n</div><!-- /osl-rg -->\n\n\n<!-- ══ EXCEL FILTER DROPDOWN (fixed, outside overflow containers) ════════════ -->\n@if (openFilterKey && excelFilterState[openFilterKey]) {\n <div class=\"osl-rg-excel-filter\"\n [style.top.px]=\"filterDropdownPos.top\"\n [style.left.px]=\"filterDropdownPos.left\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"osl-rg-excel-filter__header\">\n <div class=\"osl-rg-excel-filter__title\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"12\" height=\"12\" style=\"flex-shrink:0;\"><path d=\"M22 3H2l8 9.46V19l4 2V12.46z\"/></svg>\n Filter: {{ getColumnByKey(openFilterKey)?.label }}\n </div>\n @if (hasActiveFilter(openFilterKey)) {\n <button class=\"osl-rg-excel-filter__clear-btn\" (click)=\"clearExcelFilter(openFilterKey!)\">Clear</button>\n }\n </div>\n <div class=\"osl-rg-excel-filter__search\">\n <input class=\"osl-rg-excel-filter__search-input\" placeholder=\"Search values…\"\n [(ngModel)]=\"excelFilterState[openFilterKey].search\" />\n </div>\n <div class=\"osl-rg-excel-filter__select-all\">\n <label class=\"osl-rg-excel-filter__item osl-rg-excel-filter__item--all\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\" [checked]=\"isAllExcelChecked(openFilterKey)\"\n (change)=\"toggleAllExcelFilter(openFilterKey!, $any($event.target).checked)\" />\n <span class=\"osl-rg-excel-filter__item-label\">(Select All)</span>\n </label>\n </div>\n <div class=\"osl-rg-excel-filter__list\">\n @for (item of getFilteredExcelItems(openFilterKey); track item.value) {\n <label class=\"osl-rg-excel-filter__item\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\" [(ngModel)]=\"item.checked\" />\n <span class=\"osl-rg-excel-filter__item-label\">{{ item.label }}</span>\n </label>\n }\n </div>\n <div class=\"osl-rg-excel-filter__footer\">\n <button class=\"osl-rg-excel-filter__apply\" (click)=\"applyExcelFilter(openFilterKey!)\">Apply Filter</button>\n <button class=\"osl-rg-excel-filter__cancel\" (click)=\"openFilterKey=null\">Cancel</button>\n </div>\n </div>\n}\n\n\n<!-- ══ COLUMN CONTEXT MENU (fixed) ══════════════════════════════════════════ -->\n@if (columnMenuKey && getColumnByKey(columnMenuKey); as menuCol) {\n <div class=\"osl-rg-col-menu\"\n [style.top.px]=\"columnMenuPos.top\" [style.left.px]=\"columnMenuPos.left\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"osl-rg-col-menu__header\">{{ menuCol.label }}</div>\n @if (menuCol.sortable) {\n <button class=\"osl-rg-col-menu__item\"\n (click)=\"sortStates.clear(); sortStates.set(menuCol.key,{key:menuCol.key,asc:true,index:0}); sortCounter=1; processData(); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5m-7 7 7-7 7 7\"/></svg>\n Sort A → Z\n </button>\n <button class=\"osl-rg-col-menu__item\"\n (click)=\"sortStates.clear(); sortStates.set(menuCol.key,{key:menuCol.key,asc:false,index:0}); sortCounter=1; processData(); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14m7-7-7 7-7-7\"/></svg>\n Sort Z → A\n </button>\n }\n @if (menuCol.groupable) {\n <div class=\"osl-rg-col-menu__divider\"></div>\n <button class=\"osl-rg-col-menu__item\" (click)=\"addGroup(menuCol.key); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 3H8a2 2 0 0 0-2 2v2h12V5a2 2 0 0 0-2-2z\"/></svg>\n Group by this\n </button>\n }\n <div class=\"osl-rg-col-menu__divider\"></div>\n <button class=\"osl-rg-col-menu__item\" (click)=\"toggleColumnPin(menuCol)\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/></svg>\n {{ menuCol._pinned ? 'Unpin column' : 'Pin to left' }}\n </button>\n <button class=\"osl-rg-col-menu__item\" (click)=\"autoSizeColumn(menuCol); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 6H3M21 18H3\"/><path d=\"M8 3 3 6l5 3M16 3l5 3-5 3M8 15l-5 3 5 3M16 15l5 3-5 3\"/></svg>\n Auto-size column\n </button>\n <div class=\"osl-rg-col-menu__divider\"></div>\n <button class=\"osl-rg-col-menu__item osl-rg-col-menu__item--danger\" (click)=\"toggleColumnVisibility(menuCol); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24M1 1l22 22\"/>\n </svg>\n Hide column\n </button>\n </div>\n}\n\n\n<!-- ══ COLUMN CONFIG SIDE DRAWER ═════════════════════════════════════════════ -->\n@if (showColumnConfig) {\n <div class=\"osl-rg-config-backdrop\" (click)=\"showColumnConfig=false\"></div>\n <div class=\"osl-rg-config-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"osl-rg-config-panel__header\">\n <div class=\"osl-rg-config-panel__title\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"16\" height=\"16\">\n <path d=\"M4 6h16M4 12h16M4 18h16\"/>\n <circle cx=\"8\" cy=\"6\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"12\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"8\" cy=\"18\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n Column Settings\n </div>\n <button class=\"osl-rg-config-panel__close\" (click)=\"showColumnConfig=false\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n </div>\n <div class=\"osl-rg-config-panel__actions\">\n <button class=\"osl-rg-config-action\" (click)=\"autoSizeAll()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"M21 6H3M21 18H3\"/><path d=\"M8 3 3 6l5 3M16 3l5 3-5 3\"/></svg>\n Auto-size all\n </button>\n <button class=\"osl-rg-config-action\" (click)=\"showAllColumns()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\n Show all\n </button>\n </div>\n <div class=\"osl-rg-config-hint\">Drag to reorder · Toggle to show/hide · Pin to freeze</div>\n <div class=\"osl-rg-config-list\" cdkDropList (cdkDropListDropped)=\"onConfigColumnReorder($event)\">\n @for (col of _cols; track col.key) {\n <div class=\"osl-rg-config-item\" cdkDrag [class.osl-rg-config-item--hidden]=\"col._hidden\">\n <svg cdkDragHandle class=\"rg-drag-handle\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\"/><circle cx=\"15\" cy=\"5\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"12\" r=\"1.5\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"19\" r=\"1.5\"/><circle cx=\"15\" cy=\"19\" r=\"1.5\"/>\n </svg>\n <input type=\"checkbox\" class=\"osl-rg-checkbox\" [checked]=\"!col._hidden\" (change)=\"toggleColumnVisibility(col)\" />\n <span class=\"osl-rg-config-item__label\" [class.osl-rg-config-item__label--hidden]=\"col._hidden\">{{ col.label }}</span>\n <button class=\"osl-rg-config-item__pin-btn\" (click)=\"toggleColumnPin(col)\"\n [class.osl-rg-config-item__pin-btn--active]=\"col._pinned\"\n [title]=\"col._pinned ? 'Unpin' : 'Pin to left'\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"12\" height=\"12\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/></svg>\n </button>\n </div>\n }\n </div>\n </div>\n}\n\n\n<!-- ══ COPY TOAST ════════════════════════════════════════════════════════════ -->\n@if (copiedCell !== null) {\n <div class=\"osl-rg-copy-toast\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><polyline points=\"20 6 9 17 4 12\"/></svg>\n Copied to clipboard\n </div>\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { elements } from '../dynamic-form/dynamic-form';\nimport { OslPdfConfig, OslReportColumn, OslReportGrid } from '../report-grid/report-grid';\n\nexport type ReportGenerateType = 'pdf' | 'grid' | 'excel';\n\n@Component({\n selector: 'osl-report-form',\n standalone: false,\n templateUrl: './report-form.html',\n styleUrl: './report-form.scss',\n})\nexport class OslReportForm implements OnInit {\n @Input() title: string = 'Report';\n @Input() formElements: elements[] = [];\n\n private _model: any = {};\n @Input() set model(val: any) { this._model = val ?? {}; }\n get model(): any { return this._model; }\n @Output() modelChange = new EventEmitter<any>();\n\n @Input() generateOptions: ReportGenerateType[] = ['pdf', 'grid', 'excel'];\n @Input() reportColumns: OslReportColumn[] = [];\n @Input() onGenerate!: (model: any, type: ReportGenerateType) => Promise<any[]> | any[];\n @Input() skeletonLoading: boolean = false;\n @Input() skeletonTheme: 'light' | 'dark' = 'light';\n @Input() pageSize: number = 50;\n @Input() pdfConfig: OslPdfConfig = {};\n\n @ViewChild(OslReportGrid) private _grid?: OslReportGrid;\n\n get _mergedPdfConfig(): OslPdfConfig {\n return { ...this.pdfConfig, reportName: this.pdfConfig.reportName ?? this.title };\n }\n\n constructor(public cd: ChangeDetectorRef) {}\n\n selectedType: ReportGenerateType = 'grid';\n generating: boolean = false;\n resultDatasource: any[] = [];\n showResultView: boolean = false;\n\n ngOnInit(): void {\n if (this.generateOptions.length > 0 && !this.generateOptions.includes(this.selectedType)) {\n this.selectedType = this.generateOptions[0];\n }\n }\n\n selectType(type: ReportGenerateType): void {\n this.selectedType = type;\n }\n\n async generate(): Promise<void> {\n if (!this.onGenerate) return;\n this.generating = true;\n try {\n const result = await Promise.resolve(this.onGenerate({ ...this._model }, this.selectedType));\n if (result && result.length > 0) {\n this.resultDatasource = result || [];\n if (this.selectedType === 'grid') {\n this.showResultView = true;\n this.cd.markForCheck();\n // Let the view render the grid before triggering export\n // await new Promise(r => setTimeout(r, 50));\n // if (this.selectedType === 'pdf') {\n // await this._grid?.exportPdf();\n // } else if (this.selectedType === 'excel') {\n // this._grid?.exportCsv();\n // }\n }\n }\n } finally {\n this.generating = false;\n this.cd.markForCheck();\n }\n }\n\n backToForm(): void {\n this.showResultView = false;\n this.resultDatasource = [];\n }\n\n reExportExcel(): void { this._grid?.exportExcel(); }\n reExportPdf(): void { this._grid?.exportPdf(); }\n\n typeLabel(type: ReportGenerateType): string {\n return type === 'pdf' ? 'PDF' : type === 'excel' ? 'Excel' : 'Grid';\n }\n\n typeIcon(type: ReportGenerateType): string {\n return type === 'pdf' ? 'picture_as_pdf' : type === 'excel' ? 'table_chart' : 'grid_on';\n }\n\n onModelChange(val: any): void {\n this._model = val;\n this.modelChange.emit(val);\n }\n\n}\n\n","<!-- ── Form view (hidden when results are shown) ────────────────────────── -->\n@if (!showResultView) {\n <div class=\"orf-card\">\n\n <!-- Header -->\n <div class=\"orf-header\">\n <div class=\"orf-header__left\">\n <div class=\"orf-header__icon-wrap\">\n <svg class=\"orf-header__icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M8 16V11\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <path d=\"M12 16V8\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <path d=\"M16 16V13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n <div class=\"orf-header__text\">\n <h4 class=\"orf-header__title\">{{ title }}</h4>\n <p class=\"orf-header__sub\">Configure parameters and generate report</p>\n </div>\n </div>\n\n <div class=\"orf-header__right\">\n @for (type of generateOptions; track type) {\n <button\n class=\"orf-type-btn\"\n [class.active]=\"selectedType === type\"\n [class.orf-type-btn--pdf]=\"type === 'pdf'\"\n [class.orf-type-btn--excel]=\"type === 'excel'\"\n [class.orf-type-btn--grid]=\"type === 'grid'\"\n (click)=\"selectType(type)\"\n type=\"button\"\n >\n @if (type === 'pdf') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M9 13h1.5a1.5 1.5 0 0 1 0 3H9v-4\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n <path d=\"M14 13v4\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n <path d=\"M14 13h1.5a1.5 1.5 0 0 1 0 3H14\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n </svg>\n }\n @if (type === 'excel') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M2 8h20\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M8 8v13M14 8v13\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\n <path d=\"M2 13h20M2 18h20\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\n </svg>\n }\n @if (type === 'grid') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n </svg>\n }\n <span>{{ typeLabel(type) }}</span>\n </button>\n }\n </div>\n </div>\n\n <!-- Section divider with label -->\n <div class=\"orf-section-divider\">\n <div class=\"orf-section-divider__line\"></div>\n <span class=\"orf-section-divider__label\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4h12M2 8h9M2 12h6\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n </svg>\n Report Parameters\n </span>\n <div class=\"orf-section-divider__line\"></div>\n </div>\n\n <!-- Form Body -->\n <div class=\"orf-body\">\n <osl-dynamic-form\n [elements]=\"formElements\"\n [model]=\"model\"\n (modelChange)=\"onModelChange($event)\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n ></osl-dynamic-form>\n </div>\n\n <!-- Footer -->\n <div class=\"orf-footer\">\n <button\n class=\"orf-generate-btn\"\n (click)=\"generate()\"\n [disabled]=\"generating\"\n type=\"button\"\n >\n @if (generating) {\n <span class=\"orf-generate-btn__spinner\"></span>\n <span>Generating...</span>\n } @else {\n @if (selectedType === 'pdf') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\n stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n </svg>\n }\n @if (selectedType === 'excel') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <path d=\"M2 8h20M8 8v13M14 8v13M2 13h20M2 18h20\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n </svg>\n }\n @if (selectedType === 'grid') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n </svg>\n }\n <span>Generate {{ typeLabel(selectedType) }}</span>\n <svg class=\"orf-generate-btn__arrow\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M4 10h12M11 5l5 5-5 5\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </button>\n </div>\n\n </div>\n}\n\n<!-- ── Full-screen results view ─────────────────────────────────────────── -->\n@if (showResultView) {\n\n <!-- Results header bar -->\n <div class=\"orf-results-header\">\n\n <div class=\"orf-results-header__left\">\n <button class=\"orf-back-btn\" (click)=\"backToForm()\" type=\"button\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16 10H4M9 5l-5 5 5 5\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Back</span>\n </button>\n <div class=\"orf-results-header__sep\"></div>\n <svg class=\"orf-results-header__report-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M8 16V11M12 16V8M16 16V13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"orf-results-header__title\">{{ title }}</span>\n <span class=\"orf-results-badge\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"3\" rx=\"1\" fill=\"currentColor\"/>\n <rect x=\"2\" y=\"7\" width=\"12\" height=\"3\" rx=\"1\" fill=\"currentColor\" opacity=\".65\"/>\n <rect x=\"2\" y=\"12\" width=\"8\" height=\"2\" rx=\"1\" fill=\"currentColor\" opacity=\".35\"/>\n </svg>\n {{ resultDatasource.length | number }} records\n </span>\n </div>\n\n <!-- <div class=\"orf-results-header__right\">\n @if (generateOptions.includes('excel')) {\n <button class=\"orf-reexport-btn orf-reexport-btn--excel\" (click)=\"reExportExcel()\" type=\"button\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M2 8h20M8 8v13M14 8v13M2 13h20M2 18h20\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n </svg>\n <span>Excel</span>\n </button>\n }\n @if (generateOptions.includes('pdf')) {\n <button class=\"orf-reexport-btn orf-reexport-btn--pdf\" (click)=\"reExportPdf()\" type=\"button\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n </svg>\n <span>PDF</span>\n </button>\n }\n </div> -->\n\n </div>\n\n <!-- Report grid -->\n <div class=\"orf-results-body\">\n <osl-report-grid\n [columns]=\"reportColumns\"\n [datasource]=\"resultDatasource\"\n [loading]=\"generating\"\n [title]=\"title\"\n tableHeight=\"calc(100vh - 365px)\"\n [pageSize]=\"pageSize\"\n [exportable]=\"true\"\n [pdfExportFromGrid]=\"true\"\n [pdfConfig]=\"_mergedPdfConfig\"\n [showAggregates]=\"true\"\n [striped]=\"true\"\n ></osl-report-grid>\n </div>\n\n}\n","import { NgModule } from \"@angular/core\";\r\nimport { AUTOCOMPLETE_LISTER_COMPONENT } from \"./autocomplete-lister/autocomplete-lister-types\";\r\nimport { DynamicForm } from \"./dynamic-form/dynamic-form\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { DatePipe, DecimalPipe, NgClass, NgStyle, NgTemplateOutlet, UpperCasePipe } from \"@angular/common\";\r\nimport { MatFormFieldModule, MatHint } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { Oslinput } from \"./input/input\";\r\nimport { Osltextarea } from \"./textarea/textarea\";\r\nimport { OslSelect } from \"./select/select\";\r\nimport { OslRadio } from \"./radio/radio\";\r\nimport { OslSlideToggle } from \"./slide-toggle/slide-toggle\";\r\nimport { OslAutocomplete } from \"./autocomplete/autocomplete\";\r\nimport { OslFileUpload } from \"./file-upload/file-upload\";\r\nimport { OslDatepicker } from \"./datepicker/datepicker\";\r\nimport { OslCheckbox } from \"./checkbox/checkbox\";\r\nimport { OslButton } from \"./button/button\";\r\nimport { OslSetup } from \"./setup/setup\";\r\nimport { OslSearchbar } from \"./searchbar/searchbar\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { OslGrid } from \"./grid/grid\";\r\nimport { OslFormGrid } from \"./form-grid/form-grid\";\r\nimport { OslAutocompleteLister } from \"./autocomplete-lister/autocomplete-lister\";\r\nimport { OslSkeletonModule } from \"../directives/skeleton/skeleton.module\";\r\nimport { MatDatepickerModule } from \"@angular/material/datepicker\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { ScrollingModule } from \"@angular/cdk/scrolling\";\r\nimport { DragDropModule } from \"@angular/cdk/drag-drop\";\r\nimport { OslReportGrid } from \"./report-grid/report-grid\";\r\nimport { OslReportForm } from \"./report-form/report-form\";\r\n\r\n@NgModule({\r\n declarations: [\r\n DynamicForm,\r\n Oslinput,\r\n Osltextarea,\r\n OslSelect,\r\n OslRadio,\r\n OslSlideToggle,\r\n OslAutocomplete,\r\n OslFileUpload,\r\n OslDatepicker,\r\n OslCheckbox,\r\n OslButton,\r\n OslSetup,\r\n OslSearchbar,\r\n OslGrid,\r\n OslFormGrid,\r\n OslAutocompleteLister,\r\n OslReportGrid,\r\n OslReportForm,\r\n ],\r\n imports: [\r\n NgTemplateOutlet,\r\n NgStyle,\r\n NgClass,\r\n DatePipe,\r\n DecimalPipe,\r\n UpperCasePipe,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatHint,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n OslSkeletonModule,\r\n MatDatepickerModule,\r\n MatMenuModule,\r\n ScrollingModule,\r\n DragDropModule,\r\n ],\r\n exports: [DynamicForm, OslSetup, OslGrid, OslFormGrid, Oslinput,\r\n Osltextarea,\r\n OslSelect,\r\n OslRadio,\r\n OslSlideToggle,\r\n OslAutocomplete,\r\n OslFileUpload,\r\n OslDatepicker,\r\n OslCheckbox,\r\n OslButton,\r\n OslSetup,\r\n OslSearchbar, OslAutocompleteLister, OslReportGrid, OslReportForm],\r\n providers: [\r\n { provide: AUTOCOMPLETE_LISTER_COMPONENT, useValue: OslAutocompleteLister },\r\n ],\r\n})\r\nexport class FormStructureModule {}\r\n","// ─── Array Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Splits an array into chunks of the given size. */\r\nexport function chunk<T>(array: T[], size: number): T[][] {\r\n if (size <= 0) return [];\r\n const result: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n}\r\n\r\n/** Removes duplicate primitive values. */\r\nexport function unique<T>(array: T[]): T[] {\r\n return [...new Set(array)];\r\n}\r\n\r\n/** Removes duplicates by object key. */\r\nexport function uniqueBy<T>(array: T[], key: keyof T): T[] {\r\n const seen = new Set<unknown>();\r\n return array.filter(item => {\r\n const val = item[key];\r\n if (seen.has(val)) return false;\r\n seen.add(val);\r\n return true;\r\n });\r\n}\r\n\r\n/** Flattens one level of nesting. */\r\nexport function flatten<T>(array: (T | T[])[]): T[] {\r\n return (array as T[][]).flat();\r\n}\r\n\r\n/** Deeply flattens a nested array. */\r\nexport function flattenDeep<T>(array: unknown[]): T[] {\r\n return array.reduce<T[]>((acc, val) =>\r\n Array.isArray(val) ? acc.concat(flattenDeep<T>(val)) : [...acc, val as T], []);\r\n}\r\n\r\n/** Groups array elements by a key. */\r\nexport function groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\r\n return array.reduce<Record<string, T[]>>((acc, item) => {\r\n const group = String(item[key]);\r\n acc[group] = acc[group] ?? [];\r\n acc[group].push(item);\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Sorts array by key ascending or descending. */\r\nexport function sortBy<T>(array: T[], key: keyof T, direction: 'asc' | 'desc' = 'asc'): T[] {\r\n return [...array].sort((a, b) => {\r\n const aVal = a[key];\r\n const bVal = b[key];\r\n if (aVal < bVal) return direction === 'asc' ? -1 : 1;\r\n if (aVal > bVal) return direction === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n}\r\n\r\n/** Filters array where key matches value (strict equality). */\r\nexport function filterBy<T>(array: T[], key: keyof T, value: unknown): T[] {\r\n return array.filter(item => item[key] === value);\r\n}\r\n\r\n/** Sums values at the given numeric key. */\r\nexport function sumBy<T>(array: T[], key: keyof T): number {\r\n return array.reduce((acc, item) => acc + Number(item[key]), 0);\r\n}\r\n\r\n/** Returns the item with the minimum value at key. */\r\nexport function minBy<T>(array: T[], key: keyof T): T | undefined {\r\n if (!array.length) return undefined;\r\n return array.reduce((min, item) => (item[key] < min[key] ? item : min));\r\n}\r\n\r\n/** Returns the item with the maximum value at key. */\r\nexport function maxBy<T>(array: T[], key: keyof T): T | undefined {\r\n if (!array.length) return undefined;\r\n return array.reduce((max, item) => (item[key] > max[key] ? item : max));\r\n}\r\n\r\n/** Computes the average of an array of numbers. */\r\nexport function average(numbers: number[]): number {\r\n if (!numbers.length) return 0;\r\n return numbers.reduce((a, b) => a + b, 0) / numbers.length;\r\n}\r\n\r\n/** Returns true if the array is null, undefined, or has no elements. */\r\nexport function isEmpty<T>(array: T[] | null | undefined): boolean {\r\n return !array || array.length === 0;\r\n}\r\n\r\n/** Returns the last element. */\r\nexport function last<T>(array: T[]): T | undefined {\r\n return array[array.length - 1];\r\n}\r\n\r\n/** Returns the first element. */\r\nexport function first<T>(array: T[]): T | undefined {\r\n return array[0];\r\n}\r\n\r\n/** Returns a slice of the array for the given page (1-based). */\r\nexport function paginate<T>(array: T[], page: number, pageSize: number): T[] {\r\n const start = (page - 1) * pageSize;\r\n return array.slice(start, start + pageSize);\r\n}\r\n\r\n/** Moves an element from one index to another (immutable). */\r\nexport function move<T>(array: T[], fromIndex: number, toIndex: number): T[] {\r\n const result = [...array];\r\n const [item] = result.splice(fromIndex, 1);\r\n result.splice(toIndex, 0, item);\r\n return result;\r\n}\r\n\r\n/** Adds the item if absent, removes it if present. */\r\nexport function toggle<T>(array: T[], item: T): T[] {\r\n return array.includes(item) ? array.filter(i => i !== item) : [...array, item];\r\n}\r\n\r\n/** Returns elements present in both arrays. */\r\nexport function intersection<T>(a: T[], b: T[]): T[] {\r\n const setB = new Set(b);\r\n return a.filter(item => setB.has(item));\r\n}\r\n\r\n/** Returns elements in `a` not present in `b`. */\r\nexport function difference<T>(a: T[], b: T[]): T[] {\r\n const setB = new Set(b);\r\n return a.filter(item => !setB.has(item));\r\n}\r\n\r\n/** Converts an array to a lookup map keyed by the given property. */\r\nexport function toMap<T>(array: T[], key: keyof T): Record<string, T> {\r\n return array.reduce<Record<string, T>>((acc, item) => {\r\n acc[String(item[key])] = item;\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Removes falsy values (null, undefined, 0, '', false). */\r\nexport function compact<T>(array: (T | null | undefined | false | 0 | '')[]): T[] {\r\n return array.filter(Boolean) as T[];\r\n}\r\n\r\n/** Returns a new randomly shuffled copy. */\r\nexport function shuffle<T>(array: T[]): T[] {\r\n const result = [...array];\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [result[i], result[j]] = [result[j], result[i]];\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns a random element, or multiple elements if count is given. */\r\nexport function sample<T>(array: T[]): T | undefined;\r\nexport function sample<T>(array: T[], count: number): T[];\r\nexport function sample<T>(array: T[], count?: number): T | T[] | undefined {\r\n if (count === undefined) return array[Math.floor(Math.random() * array.length)];\r\n return shuffle(array).slice(0, count);\r\n}\r\n\r\n/** Counts occurrences of each value at the given key. */\r\nexport function countBy<T>(array: T[], key: keyof T): Record<string, number> {\r\n return array.reduce<Record<string, number>>((acc, item) => {\r\n const group = String(item[key]);\r\n acc[group] = (acc[group] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Returns the union of two arrays (unique values from both). */\r\nexport function union<T>(a: T[], b: T[]): T[] {\r\n return unique([...a, ...b]);\r\n}\r\n\r\n/** Zips multiple arrays into an array of tuples. */\r\nexport function zip<T>(...arrays: T[][]): T[][] {\r\n const length = Math.max(...arrays.map(a => a.length));\r\n return Array.from({ length }, (_, i) => arrays.map(a => a[i]));\r\n}\r\n\r\n/** Returns true if predicate holds for all elements. */\r\nexport function every<T>(array: T[], predicate: (item: T) => boolean): boolean {\r\n return array.every(predicate);\r\n}\r\n\r\n/** Returns true if predicate holds for at least one element. */\r\nexport function some<T>(array: T[], predicate: (item: T) => boolean): boolean {\r\n return array.some(predicate);\r\n}\r\n\r\n/** Partitions an array into two groups based on predicate. */\r\nexport function partition<T>(array: T[], predicate: (item: T) => boolean): [T[], T[]] {\r\n const pass: T[] = [];\r\n const fail: T[] = [];\r\n for (const item of array) {\r\n (predicate(item) ? pass : fail).push(item);\r\n }\r\n return [pass, fail];\r\n}\r\n","// ─── Date Utilities ───────────────────────────────────────────────────────────\r\n\r\nconst MONTH_NAMES_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\nconst MONTH_NAMES_FULL = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nconst DAY_NAMES_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\nconst DAY_NAMES_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nfunction pad(n: number): string {\r\n return String(n).padStart(2, '0');\r\n}\r\n\r\n/** Returns the current date and time. */\r\nexport function now(): Date {\r\n return new Date();\r\n}\r\n\r\n/** Returns today's date with time set to midnight. */\r\nexport function today(): Date {\r\n return startOfDay(new Date());\r\n}\r\n\r\n/** Returns true if the value is a valid Date object. */\r\nexport function isValidDate(value: unknown): value is Date {\r\n return value instanceof Date && !isNaN(value.getTime());\r\n}\r\n\r\n/**\r\n * Formats a Date using a pattern string.\r\n * Tokens: YYYY, YY, MM, M, DD, D, HH, H, mm, m, ss, s,\r\n * MMM (short month), MMMM (full month),\r\n * ddd (short day), dddd (full day).\r\n */\r\nexport function formatDate(date: Date | string | number, pattern: string): string {\r\n const d = new Date(date);\r\n if (!isValidDate(d)) return '';\r\n\r\n const year = d.getFullYear();\r\n const month = d.getMonth();\r\n const day = d.getDate();\r\n const hours = d.getHours();\r\n const mins = d.getMinutes();\r\n const secs = d.getSeconds();\r\n const dayOfWeek = d.getDay();\r\n\r\n return pattern\r\n .replace('YYYY', String(year))\r\n .replace('YY', String(year).slice(-2))\r\n .replace('MMMM', MONTH_NAMES_FULL[month])\r\n .replace('MMM', MONTH_NAMES_SHORT[month])\r\n .replace('MM', pad(month + 1))\r\n .replace('M', String(month + 1))\r\n .replace('dddd', DAY_NAMES_FULL[dayOfWeek])\r\n .replace('ddd', DAY_NAMES_SHORT[dayOfWeek])\r\n .replace('DD', pad(day))\r\n .replace('D', String(day))\r\n .replace('HH', pad(hours))\r\n .replace('H', String(hours))\r\n .replace('mm', pad(mins))\r\n .replace('m', String(mins))\r\n .replace('ss', pad(secs))\r\n .replace('s', String(secs));\r\n}\r\n\r\n/** Returns date as `YYYY-MM-DD`. */\r\nexport function toDateOnly(date: Date): string {\r\n return formatDate(date, 'YYYY-MM-DD');\r\n}\r\n\r\n/** Returns the ISO 8601 string for a date. */\r\nexport function toISOString(date: Date): string {\r\n return date.toISOString();\r\n}\r\n\r\n/** Returns a new date with `days` added. */\r\nexport function addDays(date: Date, days: number): Date {\r\n const result = new Date(date);\r\n result.setDate(result.getDate() + days);\r\n return result;\r\n}\r\n\r\n/** Returns a new date with `months` added. */\r\nexport function addMonths(date: Date, months: number): Date {\r\n const result = new Date(date);\r\n result.setMonth(result.getMonth() + months);\r\n return result;\r\n}\r\n\r\n/** Returns a new date with `years` added. */\r\nexport function addYears(date: Date, years: number): Date {\r\n const result = new Date(date);\r\n result.setFullYear(result.getFullYear() + years);\r\n return result;\r\n}\r\n\r\n/** Returns a new date with `hours` added. */\r\nexport function addHours(date: Date, hours: number): Date {\r\n return new Date(date.getTime() + hours * 3_600_000);\r\n}\r\n\r\n/** Returns a new date with `minutes` added. */\r\nexport function addMinutes(date: Date, minutes: number): Date {\r\n return new Date(date.getTime() + minutes * 60_000);\r\n}\r\n\r\n/** Returns a new date with `days` subtracted. */\r\nexport function subtractDays(date: Date, days: number): Date {\r\n return addDays(date, -days);\r\n}\r\n\r\n/** Returns a new date with `months` subtracted. */\r\nexport function subtractMonths(date: Date, months: number): Date {\r\n return addMonths(date, -months);\r\n}\r\n\r\n/** Returns a new date with `years` subtracted. */\r\nexport function subtractYears(date: Date, years: number): Date {\r\n return addYears(date, -years);\r\n}\r\n\r\n/** Returns the absolute difference in whole days between two dates. */\r\nexport function diffInDays(date1: Date, date2: Date): number {\r\n return Math.abs(Math.floor((date1.getTime() - date2.getTime()) / 86_400_000));\r\n}\r\n\r\n/** Returns the absolute difference in whole months between two dates. */\r\nexport function diffInMonths(date1: Date, date2: Date): number {\r\n return Math.abs(\r\n (date1.getFullYear() - date2.getFullYear()) * 12 +\r\n (date1.getMonth() - date2.getMonth())\r\n );\r\n}\r\n\r\n/** Returns the absolute difference in whole years between two dates. */\r\nexport function diffInYears(date1: Date, date2: Date): number {\r\n return Math.abs(date1.getFullYear() - date2.getFullYear());\r\n}\r\n\r\n/** Returns the difference in minutes between two dates (date1 - date2). */\r\nexport function diffInMinutes(date1: Date, date2: Date): number {\r\n return Math.floor((date1.getTime() - date2.getTime()) / 60_000);\r\n}\r\n\r\n/** Returns true if date1 is strictly before date2. */\r\nexport function isBefore(date1: Date, date2: Date): boolean {\r\n return date1.getTime() < date2.getTime();\r\n}\r\n\r\n/** Returns true if date1 is strictly after date2. */\r\nexport function isAfter(date1: Date, date2: Date): boolean {\r\n return date1.getTime() > date2.getTime();\r\n}\r\n\r\n/** Returns true if both dates fall on the same calendar day. */\r\nexport function isSameDay(date1: Date, date2: Date): boolean {\r\n return (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n}\r\n\r\n/** Returns true if the date falls on a Saturday or Sunday. */\r\nexport function isWeekend(date: Date): boolean {\r\n return date.getDay() === 0 || date.getDay() === 6;\r\n}\r\n\r\n/** Returns true if the date is today. */\r\nexport function isToday(date: Date): boolean {\r\n return isSameDay(date, new Date());\r\n}\r\n\r\n/** Returns true if the date falls in the past (before now). */\r\nexport function isPast(date: Date): boolean {\r\n return date.getTime() < Date.now();\r\n}\r\n\r\n/** Returns true if the date falls in the future (after now). */\r\nexport function isFuture(date: Date): boolean {\r\n return date.getTime() > Date.now();\r\n}\r\n\r\n/** Returns the date with time set to 00:00:00.000. */\r\nexport function startOfDay(date: Date): Date {\r\n const result = new Date(date);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n}\r\n\r\n/** Returns the date with time set to 23:59:59.999. */\r\nexport function endOfDay(date: Date): Date {\r\n const result = new Date(date);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/** Returns the first day of the month (time 00:00:00.000). */\r\nexport function startOfMonth(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n}\r\n\r\n/** Returns the last day of the month (time 23:59:59.999). */\r\nexport function endOfMonth(date: Date): Date {\r\n const result = new Date(date.getFullYear(), date.getMonth() + 1, 0);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/** Returns the first day of the year (Jan 1, 00:00:00.000). */\r\nexport function startOfYear(date: Date): Date {\r\n return new Date(date.getFullYear(), 0, 1);\r\n}\r\n\r\n/** Returns the last day of the year (Dec 31, 23:59:59.999). */\r\nexport function endOfYear(date: Date): Date {\r\n const result = new Date(date.getFullYear(), 11, 31);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/** Calculates the age in years from a birth date. */\r\nexport function getAge(birthDate: Date): number {\r\n const n = new Date();\r\n let age = n.getFullYear() - birthDate.getFullYear();\r\n const monthDiff = n.getMonth() - birthDate.getMonth();\r\n if (monthDiff < 0 || (monthDiff === 0 && n.getDate() < birthDate.getDate())) age--;\r\n return age;\r\n}\r\n\r\n/** Returns the number of days in a given month (0-based month). */\r\nexport function daysInMonth(year: number, month: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n}\r\n\r\n/** Returns true if the given year is a leap year. */\r\nexport function isLeapYear(year: number): boolean {\r\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n}\r\n\r\n/**\r\n * Returns a human-friendly relative time string.\r\n * @example timeAgo(new Date(Date.now() - 3600_000)) → '1 hour ago'\r\n */\r\nexport function timeAgo(date: Date): string {\r\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\r\n const abs = Math.abs(seconds);\r\n const future = seconds < 0;\r\n\r\n const intervals: [number, string][] = [\r\n [31_536_000, 'year'],\r\n [2_592_000, 'month'],\r\n [604_800, 'week'],\r\n [86_400, 'day'],\r\n [3_600, 'hour'],\r\n [60, 'minute'],\r\n [1, 'second'],\r\n ];\r\n\r\n for (const [secs, label] of intervals) {\r\n const count = Math.floor(abs / secs);\r\n if (count >= 1) {\r\n const unit = count === 1 ? label : `${label}s`;\r\n return future ? `in ${count} ${unit}` : `${count} ${unit} ago`;\r\n }\r\n }\r\n return 'just now';\r\n}\r\n\r\n/** Returns the ISO week number (1–53) for the given date. */\r\nexport function getWeekNumber(date: Date): number {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / 86_400_000) + 1) / 7);\r\n}\r\n\r\n/** Returns the next weekday (Mon–Fri) after the given date. */\r\nexport function nextWorkday(date: Date): Date {\r\n const result = addDays(date, 1);\r\n while (isWeekend(result)) {\r\n result.setDate(result.getDate() + 1);\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns true if a date falls within the range [start, end] (inclusive). */\r\nexport function inRange(date: Date, start: Date, end: Date): boolean {\r\n return date >= start && date <= end;\r\n}\r\n\r\n/** Parses a `YYYY-MM-DD` string and returns a local-midnight Date or null. */\r\nexport function parseDate(dateStr: string): Date | null {\r\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateStr);\r\n if (!match) return null;\r\n const [, y, mo, d] = match.map(Number);\r\n const result = new Date(y, mo - 1, d);\r\n return isValidDate(result) ? result : null;\r\n}\r\n","// ─── Number Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Rounds to the given number of decimal places (default 0). */\r\nexport function round(num: number, decimals = 0): number {\r\n const factor = Math.pow(10, decimals);\r\n return Math.round(num * factor) / factor;\r\n}\r\n\r\n/** Floors to the given number of decimal places (default 0). */\r\nexport function floor(num: number, decimals = 0): number {\r\n const factor = Math.pow(10, decimals);\r\n return Math.floor(num * factor) / factor;\r\n}\r\n\r\n/** Ceils to the given number of decimal places (default 0). */\r\nexport function ceil(num: number, decimals = 0): number {\r\n const factor = Math.pow(10, decimals);\r\n return Math.ceil(num * factor) / factor;\r\n}\r\n\r\n/** Clamps a number within [min, max]. */\r\nexport function clamp(num: number, min: number, max: number): number {\r\n return Math.min(Math.max(num, min), max);\r\n}\r\n\r\n/**\r\n * Formats a number as currency using Intl.NumberFormat.\r\n * @example formatCurrency(1234.5, 'USD', 'en-US') → '$1,234.50'\r\n */\r\nexport function formatCurrency(num: number, currency = 'USD', locale = 'en-US'): string {\r\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(num);\r\n}\r\n\r\n/**\r\n * Formats a number with grouping separators and fixed decimal places.\r\n * @example formatNumber(1234567.89, 2, 'en-US') → '1,234,567.89'\r\n */\r\nexport function formatNumber(num: number, decimals = 2, locale = 'en-US'): string {\r\n return new Intl.NumberFormat(locale, {\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals,\r\n }).format(num);\r\n}\r\n\r\n/**\r\n * Calculates what percentage `value` is of `total`.\r\n * @example percentage(25, 200) → 12.5\r\n */\r\nexport function percentage(value: number, total: number, decimals = 2): number {\r\n if (total === 0) return 0;\r\n return round((value / total) * 100, decimals);\r\n}\r\n\r\n/** Returns true if `num` is a prime number. */\r\nexport function isPrime(num: number): boolean {\r\n if (num < 2) return false;\r\n if (num === 2) return true;\r\n if (num % 2 === 0) return false;\r\n for (let i = 3; i <= Math.sqrt(num); i += 2) {\r\n if (num % i === 0) return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Returns true if the number is even. */\r\nexport function isEven(num: number): boolean {\r\n return num % 2 === 0;\r\n}\r\n\r\n/** Returns true if the number is odd. */\r\nexport function isOdd(num: number): boolean {\r\n return num % 2 !== 0;\r\n}\r\n\r\n/** Returns a random floating-point number in [min, max). */\r\nexport function random(min: number, max: number): number {\r\n return Math.random() * (max - min) + min;\r\n}\r\n\r\n/** Returns a random integer in [min, max] (inclusive). */\r\nexport function randomInt(min: number, max: number): number {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n}\r\n\r\n/** Returns the sum of an array of numbers. */\r\nexport function sum(numbers: number[]): number {\r\n return numbers.reduce((acc, n) => acc + n, 0);\r\n}\r\n\r\n/** Returns the average of an array of numbers. */\r\nexport function average(numbers: number[]): number {\r\n if (!numbers.length) return 0;\r\n return sum(numbers) / numbers.length;\r\n}\r\n\r\n/** Returns the minimum value in an array. */\r\nexport function min(numbers: number[]): number {\r\n return Math.min(...numbers);\r\n}\r\n\r\n/** Returns the maximum value in an array. */\r\nexport function max(numbers: number[]): number {\r\n return Math.max(...numbers);\r\n}\r\n\r\n/**\r\n * Returns the ordinal string for a number.\r\n * @example toOrdinal(3) → '3rd'\r\n */\r\nexport function toOrdinal(num: number): string {\r\n const abs = Math.abs(num);\r\n const suffix =\r\n abs % 100 >= 11 && abs % 100 <= 13 ? 'th' :\r\n abs % 10 === 1 ? 'st' :\r\n abs % 10 === 2 ? 'nd' :\r\n abs % 10 === 3 ? 'rd' : 'th';\r\n return `${num}${suffix}`;\r\n}\r\n\r\n/**\r\n * Abbreviates large numbers with K / M / B / T suffixes.\r\n * @example abbreviate(1500000) → '1.5M'\r\n */\r\nexport function abbreviate(num: number, decimals = 1): string {\r\n const tiers: [number, string][] = [\r\n [1e12, 'T'],\r\n [1e9, 'B'],\r\n [1e6, 'M'],\r\n [1e3, 'K'],\r\n ];\r\n const abs = Math.abs(num);\r\n for (const [threshold, suffix] of tiers) {\r\n if (abs >= threshold) {\r\n return `${round(num / threshold, decimals)}${suffix}`;\r\n }\r\n }\r\n return String(num);\r\n}\r\n\r\n/** Returns true if `num` is within [min, max] (inclusive). */\r\nexport function inRange(num: number, min: number, max: number): boolean {\r\n return num >= min && num <= max;\r\n}\r\n\r\n/** Parses a string to float; returns null if not a valid number. */\r\nexport function safeParseFloat(str: string): number | null {\r\n const n = parseFloat(str);\r\n return isNaN(n) ? null : n;\r\n}\r\n\r\n/** Parses a string to integer; returns null if not a valid number. */\r\nexport function safeParseInt(str: string, radix = 10): number | null {\r\n const n = parseInt(str, radix);\r\n return isNaN(n) ? null : n;\r\n}\r\n\r\n/** Returns the greatest common divisor of two integers. */\r\nexport function gcd(a: number, b: number): number {\r\n a = Math.abs(a);\r\n b = Math.abs(b);\r\n while (b) {\r\n [a, b] = [b, a % b];\r\n }\r\n return a;\r\n}\r\n\r\n/** Returns the least common multiple of two integers. */\r\nexport function lcm(a: number, b: number): number {\r\n return Math.abs(a * b) / gcd(a, b);\r\n}\r\n\r\n/** Returns the Nth Fibonacci number (0-indexed). */\r\nexport function fibonacci(n: number): number {\r\n if (n <= 1) return n;\r\n let a = 0, b = 1;\r\n for (let i = 2; i <= n; i++) {\r\n [a, b] = [b, a + b];\r\n }\r\n return b;\r\n}\r\n\r\n/** Returns true if the value is a finite number (not NaN, not ±Infinity). */\r\nexport function isFiniteNumber(value: unknown): value is number {\r\n return typeof value === 'number' && isFinite(value);\r\n}\r\n\r\n/** Returns true if the value is NaN. */\r\nexport function isNaNValue(value: unknown): boolean {\r\n return typeof value === 'number' && isNaN(value);\r\n}\r\n\r\n/** Returns true if the number is positive (> 0). */\r\nexport function isPositive(num: number): boolean {\r\n return num > 0;\r\n}\r\n\r\n/** Returns true if the number is negative (< 0). */\r\nexport function isNegative(num: number): boolean {\r\n return num < 0;\r\n}\r\n\r\n/** Converts degrees to radians. */\r\nexport function toRadians(degrees: number): number {\r\n return degrees * (Math.PI / 180);\r\n}\r\n\r\n/** Converts radians to degrees. */\r\nexport function toDegrees(radians: number): number {\r\n return radians * (180 / Math.PI);\r\n}\r\n\r\n/** Linearly interpolates between `start` and `end` by factor `t` (0–1). */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * clamp(t, 0, 1);\r\n}\r\n","// ─── Object Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Returns a deep clone of the value using structured clone. */\r\nexport function deepClone<T>(obj: T): T {\r\n return structuredClone(obj);\r\n}\r\n\r\n/** Deep-merges one or more source objects into target (immutable). */\r\nexport function deepMerge<T extends object>(target: T, ...sources: Partial<T>[]): T {\r\n const result = deepClone(target);\r\n for (const source of sources) {\r\n for (const key in source) {\r\n const srcVal = source[key as keyof typeof source];\r\n const tgtVal = result[key as keyof T];\r\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\r\n (result as Record<string, unknown>)[key] = deepMerge(\r\n tgtVal as object,\r\n srcVal as object\r\n );\r\n } else if (srcVal !== undefined) {\r\n (result as Record<string, unknown>)[key] = deepClone(srcVal);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns true if `value` is a plain (non-null) object literal. */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\r\n}\r\n\r\n/** Creates a new object containing only the specified keys. */\r\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\r\n return keys.reduce((acc, key) => {\r\n if (key in obj) acc[key] = obj[key];\r\n return acc;\r\n }, {} as Pick<T, K>);\r\n}\r\n\r\n/** Creates a new object excluding the specified keys. */\r\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\r\n const keySet = new Set<PropertyKey>(keys);\r\n return Object.fromEntries(\r\n Object.entries(obj).filter(([k]) => !keySet.has(k))\r\n ) as Omit<T, K>;\r\n}\r\n\r\n/** Returns true if the object has no own enumerable properties. */\r\nexport function isEmpty(obj: object | null | undefined): boolean {\r\n if (obj == null) return true;\r\n return Object.keys(obj).length === 0;\r\n}\r\n\r\n/** Deep equality check. */\r\nexport function isEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (a == null || b == null) return a === b;\r\n if (typeof a !== typeof b) return false;\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n return a.every((v, i) => isEqual(v, b[i]));\r\n }\r\n if (isPlainObject(a) && isPlainObject(b)) {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n return keysA.every(k => isEqual(a[k], (b as Record<string, unknown>)[k]));\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Flattens a nested object to a single depth using `delimiter` as key separator.\r\n * @example flattenObject({ a: { b: 1 } }) → { 'a.b': 1 }\r\n */\r\nexport function flattenObject(\r\n obj: Record<string, unknown>,\r\n delimiter = '.',\r\n prefix = ''\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const key in obj) {\r\n const fullKey = prefix ? `${prefix}${delimiter}${key}` : key;\r\n const value = obj[key];\r\n if (isPlainObject(value)) {\r\n Object.assign(result, flattenObject(value, delimiter, fullKey));\r\n } else {\r\n result[fullKey] = value;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Converts a flat object with delimiter-separated keys back to a nested object.\r\n * @example unflattenObject({ 'a.b': 1 }) → { a: { b: 1 } }\r\n */\r\nexport function unflattenObject(\r\n obj: Record<string, unknown>,\r\n delimiter = '.'\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const flatKey in obj) {\r\n const parts = flatKey.split(delimiter);\r\n let current = result;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n if (!isPlainObject(current[part])) current[part] = {};\r\n current = current[part] as Record<string, unknown>;\r\n }\r\n current[parts[parts.length - 1]] = obj[flatKey];\r\n }\r\n return result;\r\n}\r\n\r\n/** Serializes an object to a URL query string (excludes null/undefined values). */\r\nexport function toQueryString(obj: Record<string, unknown>): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value != null) params.append(key, String(value));\r\n }\r\n return params.toString();\r\n}\r\n\r\n/** Parses a URL query string into a key-value map. */\r\nexport function fromQueryString(queryString: string): Record<string, string> {\r\n const params = new URLSearchParams(queryString.startsWith('?') ? queryString.slice(1) : queryString);\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => { result[key] = value; });\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets a deeply nested value by dot-path string.\r\n * @example getPath({ a: { b: 2 } }, 'a.b') → 2\r\n */\r\nexport function getPath<T = unknown>(\r\n obj: Record<string, unknown>,\r\n path: string,\r\n defaultValue?: T\r\n): T | undefined {\r\n const keys = path.split('.');\r\n let current: unknown = obj;\r\n for (const key of keys) {\r\n if (current == null || typeof current !== 'object') return defaultValue;\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n return (current as T) ?? defaultValue;\r\n}\r\n\r\n/**\r\n * Sets a deeply nested value by dot-path string (mutates the object).\r\n * @example setPath(obj, 'a.b', 42)\r\n */\r\nexport function setPath(obj: Record<string, unknown>, path: string, value: unknown): void {\r\n const keys = path.split('.');\r\n let current = obj;\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!isPlainObject(current[key])) current[key] = {};\r\n current = current[key] as Record<string, unknown>;\r\n }\r\n current[keys[keys.length - 1]] = value;\r\n}\r\n\r\n/** Returns true if a dot-path resolves to a defined value. */\r\nexport function hasPath(obj: Record<string, unknown>, path: string): boolean {\r\n return getPath(obj, path) !== undefined;\r\n}\r\n\r\n/** Applies a mapping function to every value in an object. */\r\nexport function mapValues<T, R>(\r\n obj: Record<string, T>,\r\n fn: (value: T, key: string) => R\r\n): Record<string, R> {\r\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, fn(v, k)]));\r\n}\r\n\r\n/** Returns a new object containing only entries where the predicate returns true. */\r\nexport function filterValues<T>(\r\n obj: Record<string, T>,\r\n fn: (value: T, key: string) => boolean\r\n): Record<string, T> {\r\n return Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(v, k)));\r\n}\r\n\r\n/** Swaps keys and values in an object (both must be strings). */\r\nexport function invertObject(obj: Record<string, string>): Record<string, string> {\r\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]));\r\n}\r\n\r\n/** Returns a new object with keys sorted alphabetically. */\r\nexport function sortByKey<T>(obj: Record<string, T>): Record<string, T> {\r\n return Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)));\r\n}\r\n\r\n/**\r\n * Returns the keys of obj2 whose values differ from obj1 (shallow comparison).\r\n * Useful for detecting changed form fields.\r\n */\r\nexport function diff<T extends Record<string, unknown>>(obj1: T, obj2: T): Partial<T> {\r\n const result: Partial<T> = {};\r\n for (const key in obj2) {\r\n if (obj1[key] !== obj2[key]) {\r\n result[key] = obj2[key];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns the number of own enumerable keys. */\r\nexport function size(obj: object): number {\r\n return Object.keys(obj).length;\r\n}\r\n\r\n/** Returns true if `obj` has the given own enumerable key. */\r\nexport function hasKey<T extends object>(obj: T, key: PropertyKey): key is keyof T {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\n","// ─── Storage Utilities ───────────────────────────────────────────────────────\r\n// Values are JSON-serialized before storage and deserialized on retrieval.\r\n\r\n// ── Local Storage ────────────────────────────────────────────────────────────\r\n\r\n/** Serializes `value` and writes it to localStorage. */\r\nexport function setLocal(key: string, value: unknown): void {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } catch {\r\n /* quota exceeded or private browsing — silently ignore */\r\n }\r\n}\r\n\r\n/** Reads and deserializes a value from localStorage. Returns null if absent or invalid. */\r\nexport function getLocal<T>(key: string): T | null {\r\n try {\r\n const item = localStorage.getItem(key);\r\n return item !== null ? (JSON.parse(item) as T) : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Removes a key from localStorage. */\r\nexport function removeLocal(key: string): void {\r\n localStorage.removeItem(key);\r\n}\r\n\r\n/** Clears all entries from localStorage. */\r\nexport function clearLocal(): void {\r\n localStorage.clear();\r\n}\r\n\r\n/** Returns true if the key exists in localStorage. */\r\nexport function hasLocal(key: string): boolean {\r\n return localStorage.getItem(key) !== null;\r\n}\r\n\r\n/** Returns all keys currently in localStorage. */\r\nexport function localKeys(): string[] {\r\n return Object.keys(localStorage);\r\n}\r\n\r\n// ── Session Storage ───────────────────────────────────────────────────────────\r\n\r\n/** Serializes `value` and writes it to sessionStorage. */\r\nexport function setSession(key: string, value: unknown): void {\r\n try {\r\n sessionStorage.setItem(key, JSON.stringify(value));\r\n } catch {\r\n /* quota exceeded — silently ignore */\r\n }\r\n}\r\n\r\n/** Reads and deserializes a value from sessionStorage. Returns null if absent or invalid. */\r\nexport function getSession<T>(key: string): T | null {\r\n try {\r\n const item = sessionStorage.getItem(key);\r\n return item !== null ? (JSON.parse(item) as T) : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Removes a key from sessionStorage. */\r\nexport function removeSession(key: string): void {\r\n sessionStorage.removeItem(key);\r\n}\r\n\r\n/** Clears all entries from sessionStorage. */\r\nexport function clearSession(): void {\r\n sessionStorage.clear();\r\n}\r\n\r\n/** Returns true if the key exists in sessionStorage. */\r\nexport function hasSession(key: string): boolean {\r\n return sessionStorage.getItem(key) !== null;\r\n}\r\n\r\n/** Returns all keys currently in sessionStorage. */\r\nexport function sessionKeys(): string[] {\r\n return Object.keys(sessionStorage);\r\n}\r\n\r\n// ── Cookies ──────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Sets a cookie.\r\n * @param days - Expiry in days. Omit or pass 0 for a session cookie.\r\n * @param path - Cookie path (default '/').\r\n */\r\nexport function setCookie(name: string, value: string, days?: number, path = '/'): void {\r\n let expires = '';\r\n if (days) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + days * 86_400_000);\r\n expires = `; expires=${date.toUTCString()}`;\r\n }\r\n document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}${expires}; path=${path}; SameSite=Lax`;\r\n}\r\n\r\n/** Returns the decoded cookie value, or null if not found. */\r\nexport function getCookie(name: string): string | null {\r\n const key = `${encodeURIComponent(name)}=`;\r\n for (const part of document.cookie.split(';')) {\r\n const trimmed = part.trimStart();\r\n if (trimmed.startsWith(key)) {\r\n return decodeURIComponent(trimmed.slice(key.length));\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Removes a cookie by setting its expiry to the past. */\r\nexport function removeCookie(name: string, path = '/'): void {\r\n document.cookie = `${encodeURIComponent(name)}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}`;\r\n}\r\n\r\n/** Returns all current cookies as a key-value map (both decoded). */\r\nexport function getAllCookies(): Record<string, string> {\r\n return document.cookie\r\n .split(';')\r\n .reduce<Record<string, string>>((acc, part) => {\r\n const [k, ...rest] = part.trim().split('=');\r\n if (k) acc[decodeURIComponent(k)] = decodeURIComponent(rest.join('='));\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Returns true if the cookie exists. */\r\nexport function hasCookie(name: string): boolean {\r\n return getCookie(name) !== null;\r\n}\r\n","// ─── String Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Returns true if the value is null, undefined, or an empty string. */\r\nexport function isEmpty(str: string | null | undefined): boolean {\r\n return str == null || str.length === 0;\r\n}\r\n\r\n/** Returns true if the value is null, undefined, empty, or whitespace only. */\r\nexport function isBlank(str: string | null | undefined): boolean {\r\n return str == null || str.trim().length === 0;\r\n}\r\n\r\n/** Capitalizes the first letter; lowercases the rest. */\r\nexport function capitalize(str: string): string {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\r\n}\r\n\r\n/** Converts each word's first letter to uppercase. */\r\nexport function titleCase(str: string): string {\r\n return str.replace(/\\w\\S*/g, word => capitalize(word));\r\n}\r\n\r\n/** Converts a string to camelCase. */\r\nexport function camelCase(str: string): string {\r\n return str\r\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\r\n .replace(/^[A-Z]/, c => c.toLowerCase());\r\n}\r\n\r\n/** Converts a string to PascalCase. */\r\nexport function pascalCase(str: string): string {\r\n const cc = camelCase(str);\r\n return cc.charAt(0).toUpperCase() + cc.slice(1);\r\n}\r\n\r\n/** Converts a string to snake_case. */\r\nexport function snakeCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1_$2')\r\n .replace(/[\\s\\-]+/g, '_')\r\n .toLowerCase();\r\n}\r\n\r\n/** Converts a string to kebab-case. */\r\nexport function kebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\n/** Truncates a string to the given length, appending a suffix if cut. */\r\nexport function truncate(str: string, length: number, suffix = '...'): string {\r\n if (str.length <= length) return str;\r\n return str.slice(0, length - suffix.length) + suffix;\r\n}\r\n\r\n/** Removes all HTML tags from a string. */\r\nexport function stripHtml(str: string): string {\r\n return str.replace(/<[^>]*>/g, '');\r\n}\r\n\r\n/** Escapes HTML special characters. */\r\nexport function escapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\n/** Unescapes HTML entities back to characters. */\r\nexport function unescapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/"/g, '\"')\r\n .replace(/'/g, \"'\");\r\n}\r\n\r\n/** Converts a string to a URL-friendly slug. */\r\nexport function toSlug(str: string): string {\r\n return str\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[̀-ͯ]/g, '')\r\n .replace(/[^a-z0-9\\s-]/g, '')\r\n .trim()\r\n .replace(/[\\s_-]+/g, '-')\r\n .replace(/^-+|-+$/g, '');\r\n}\r\n\r\n/** Counts the number of words in a string. */\r\nexport function countWords(str: string): number {\r\n return str.trim().split(/\\s+/).filter(Boolean).length;\r\n}\r\n\r\n/** Extracts initials from a name (up to `maxLetters`). */\r\nexport function initials(name: string, maxLetters = 2): string {\r\n return name\r\n .split(/\\s+/)\r\n .slice(0, maxLetters)\r\n .map(w => w.charAt(0).toUpperCase())\r\n .join('');\r\n}\r\n\r\n/** Case-insensitive containment check. */\r\nexport function contains(str: string, search: string): boolean {\r\n return str.toLowerCase().includes(search.toLowerCase());\r\n}\r\n\r\n/**\r\n * Replaces `{{key}}` placeholders in a template with values from the map.\r\n * @example format('Hello {{name}}', { name: 'World' }) → 'Hello World'\r\n */\r\nexport function format(template: string, values: Record<string, unknown>): string {\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) =>\r\n key in values ? String(values[key]) : `{{${key}}}`\r\n );\r\n}\r\n\r\n/** Repeats a string `times` times. */\r\nexport function repeat(str: string, times: number): string {\r\n return str.repeat(Math.max(0, times));\r\n}\r\n\r\n/** Reverses the characters of a string. */\r\nexport function reverseString(str: string): string {\r\n return [...str].reverse().join('');\r\n}\r\n\r\n/** Counts non-overlapping occurrences of `search` in `str`. */\r\nexport function countOccurrences(str: string, search: string): number {\r\n if (!search) return 0;\r\n return str.split(search).length - 1;\r\n}\r\n\r\n/** Removes characters not in `[a-zA-Z0-9]` plus anything in `preserve`. */\r\nexport function removeSpecialChars(str: string, preserve = ''): string {\r\n const escaped = preserve.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n return str.replace(new RegExp(`[^a-zA-Z0-9${escaped}]`, 'g'), '');\r\n}\r\n\r\n/**\r\n * Masks part of a string, keeping `visibleChars` visible at the end.\r\n * @example mask('4111111111111234', 4) → '************1234'\r\n */\r\nexport function mask(str: string, visibleChars = 4, maskChar = '*'): string {\r\n if (str.length <= visibleChars) return str;\r\n return maskChar.repeat(str.length - visibleChars) + str.slice(-visibleChars);\r\n}\r\n\r\n/** Parses common truthy strings (\"true\", \"yes\", \"1\", \"on\") to boolean. */\r\nexport function toBoolean(str: string): boolean {\r\n return ['true', 'yes', '1', 'on'].includes(str.trim().toLowerCase());\r\n}\r\n\r\n/** Pads the start of a string. */\r\nexport function padStart(str: string, length: number, padChar = ' '): string {\r\n return str.padStart(length, padChar);\r\n}\r\n\r\n/** Pads the end of a string. */\r\nexport function padEnd(str: string, length: number, padChar = ' '): string {\r\n return str.padEnd(length, padChar);\r\n}\r\n\r\n/** Generates a random alphanumeric string of the given length. */\r\nexport function randomString(length: number): string {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n return Array.from({ length }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join('');\r\n}\r\n\r\n/** Removes all whitespace from a string. */\r\nexport function removeWhitespace(str: string): string {\r\n return str.replace(/\\s+/g, '');\r\n}\r\n\r\n/** Checks if a string is a palindrome (case- and space-insensitive). */\r\nexport function isPalindrome(str: string): boolean {\r\n const normalized = str.toLowerCase().replace(/\\s+/g, '');\r\n return normalized === [...normalized].reverse().join('');\r\n}\r\n\r\n/** Wraps a string at `width` characters, splitting on spaces where possible. */\r\nexport function wordWrap(str: string, width: number): string {\r\n const words = str.split(' ');\r\n const lines: string[] = [];\r\n let current = '';\r\n for (const word of words) {\r\n if ((current + (current ? ' ' : '') + word).length <= width) {\r\n current += (current ? ' ' : '') + word;\r\n } else {\r\n if (current) lines.push(current);\r\n current = word;\r\n }\r\n }\r\n if (current) lines.push(current);\r\n return lines.join('\\n');\r\n}\r\n","// ─── Validation Utilities ────────────────────────────────────────────────────\r\n\r\n/** Returns true if value is not null, undefined, empty string, or whitespace. */\r\nexport function isRequired(value: unknown): boolean {\r\n if (value == null) return false;\r\n if (typeof value === 'string') return value.trim().length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return true;\r\n}\r\n\r\n/** RFC 5322-compliant email validation. */\r\nexport function isEmail(value: string): boolean {\r\n return /^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$/.test(value.trim());\r\n}\r\n\r\n/** Returns true if the string is a valid HTTP/HTTPS URL. */\r\nexport function isUrl(value: string): boolean {\r\n try {\r\n const url = new URL(value);\r\n return url.protocol === 'http:' || url.protocol === 'https:';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Returns true if the string looks like a phone number.\r\n * Accepts formats: +1-800-555-5555, (800) 555 5555, 08001234567, etc.\r\n */\r\nexport function isPhone(value: string): boolean {\r\n return /^\\+?[\\d\\s\\-().]{7,20}$/.test(value.trim());\r\n}\r\n\r\n/**\r\n * Luhn algorithm — validates credit card numbers.\r\n * Works for Visa, MasterCard, Amex, Discover, etc.\r\n */\r\nexport function isCreditCard(value: string): boolean {\r\n const digits = value.replace(/\\D/g, '');\r\n if (digits.length < 13 || digits.length > 19) return false;\r\n let sum = 0;\r\n let isEven = false;\r\n for (let i = digits.length - 1; i >= 0; i--) {\r\n let digit = parseInt(digits[i], 10);\r\n if (isEven) {\r\n digit *= 2;\r\n if (digit > 9) digit -= 9;\r\n }\r\n sum += digit;\r\n isEven = !isEven;\r\n }\r\n return sum % 10 === 0;\r\n}\r\n\r\n/**\r\n * Validates postal / ZIP codes.\r\n * Supports: US (12345 / 12345-6789), UK (SW1A 1AA), CA (K1A 0B1),\r\n * DE/FR/AU/IN (5-digit numeric).\r\n */\r\nexport function isPostalCode(value: string, countryCode = 'US'): boolean {\r\n const patterns: Record<string, RegExp> = {\r\n US: /^\\d{5}(-\\d{4})?$/,\r\n UK: /^[A-Z]{1,2}\\d[A-Z\\d]?\\s?\\d[A-Z]{2}$/i,\r\n CA: /^[A-Z]\\d[A-Z]\\s?\\d[A-Z]\\d$/i,\r\n DE: /^\\d{5}$/,\r\n FR: /^\\d{5}$/,\r\n AU: /^\\d{4}$/,\r\n IN: /^\\d{6}$/,\r\n };\r\n const pattern = patterns[countryCode.toUpperCase()] ?? /^\\d{4,10}$/;\r\n return pattern.test(value.trim());\r\n}\r\n\r\n/** Returns true if the string contains only ASCII letters. */\r\nexport function isAlpha(value: string): boolean {\r\n return /^[a-zA-Z]+$/.test(value);\r\n}\r\n\r\n/** Returns true if the string contains only ASCII letters and digits. */\r\nexport function isAlphanumeric(value: string): boolean {\r\n return /^[a-zA-Z0-9]+$/.test(value);\r\n}\r\n\r\n/** Returns true if the string contains only digits (no decimal points). */\r\nexport function isNumeric(value: string): boolean {\r\n return /^\\d+$/.test(value.trim());\r\n}\r\n\r\n/** Returns true if the string represents a valid decimal number. */\r\nexport function isDecimal(value: string): boolean {\r\n return /^-?\\d+(\\.\\d+)?$/.test(value.trim());\r\n}\r\n\r\n/** Returns true if `value` is a positive number (> 0). */\r\nexport function isPositive(value: number): boolean {\r\n return value > 0;\r\n}\r\n\r\n/** Returns true if `value` is a negative number (< 0). */\r\nexport function isNegative(value: number): boolean {\r\n return value < 0;\r\n}\r\n\r\n/** Returns true if the string length is at least `min`. */\r\nexport function minLength(value: string, min: number): boolean {\r\n return value.length >= min;\r\n}\r\n\r\n/** Returns true if the string length does not exceed `max`. */\r\nexport function maxLength(value: string, max: number): boolean {\r\n return value.length <= max;\r\n}\r\n\r\n/** Returns true if the string length is within [min, max] (inclusive). */\r\nexport function lengthBetween(value: string, min: number, max: number): boolean {\r\n return value.length >= min && value.length <= max;\r\n}\r\n\r\n/** Returns true if `value` is at least `min`. */\r\nexport function minValue(value: number, min: number): boolean {\r\n return value >= min;\r\n}\r\n\r\n/** Returns true if `value` does not exceed `max`. */\r\nexport function maxValue(value: number, max: number): boolean {\r\n return value <= max;\r\n}\r\n\r\n/** Returns true if `value` is within [min, max] (inclusive). */\r\nexport function inRange(value: number, min: number, max: number): boolean {\r\n return value >= min && value <= max;\r\n}\r\n\r\n/** Returns true if the value is a valid Date or a parseable date string. */\r\nexport function isValidDate(value: unknown): boolean {\r\n if (value == null) return false;\r\n const d = new Date(value as string | number | Date);\r\n return !isNaN(d.getTime());\r\n}\r\n\r\n/** Returns true if the string is a valid dotted-decimal IPv4 address. */\r\nexport function isIPv4(value: string): boolean {\r\n return /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(value) &&\r\n value.split('.').every(octet => parseInt(octet, 10) <= 255);\r\n}\r\n\r\n/** Returns true if the string is a valid IPv6 address. */\r\nexport function isIPv6(value: string): boolean {\r\n return /^([\\da-f]{1,4}:){7}[\\da-f]{1,4}$/i.test(value) ||\r\n /^([\\da-f]{1,4}:)*::([\\da-f]{1,4}:)*[\\da-f]{1,4}$/i.test(value) ||\r\n value === '::';\r\n}\r\n\r\n/** Returns true if the string matches the given pattern (string or RegExp). */\r\nexport function matchesPattern(value: string, pattern: RegExp | string): boolean {\r\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\r\n return regex.test(value);\r\n}\r\n\r\n/** Returns true if the string is a valid MAC address (with : or - separator). */\r\nexport function isMACAddress(value: string): boolean {\r\n return /^([0-9A-Fa-f]{2}[:\\-]){5}[0-9A-Fa-f]{2}$/.test(value);\r\n}\r\n\r\n/** Returns true if the string is a valid CSS hex color (#RGB or #RRGGBB). */\r\nexport function isHexColor(value: string): boolean {\r\n return /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(value);\r\n}\r\n\r\nexport interface PasswordOptions {\r\n minLength?: number;\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireNumber?: boolean;\r\n requireSpecial?: boolean;\r\n}\r\n\r\n/**\r\n * Returns true if the password meets the given strength requirements.\r\n * Default: min 8 chars, at least one uppercase, lowercase, number, and special character.\r\n */\r\nexport function isStrongPassword(value: string, options: PasswordOptions = {}): boolean {\r\n const {\r\n minLength = 8,\r\n requireUppercase = true,\r\n requireLowercase = true,\r\n requireNumber = true,\r\n requireSpecial = true,\r\n } = options;\r\n\r\n if (value.length < minLength) return false;\r\n if (requireUppercase && !/[A-Z]/.test(value)) return false;\r\n if (requireLowercase && !/[a-z]/.test(value)) return false;\r\n if (requireNumber && !/\\d/.test(value)) return false;\r\n if (requireSpecial && !/[^a-zA-Z0-9]/.test(value)) return false;\r\n return true;\r\n}\r\n\r\n/** Returns a password strength score: 0 (very weak) – 5 (very strong). */\r\nexport function passwordStrength(value: string): number {\r\n let score = 0;\r\n if (value.length >= 8) score++;\r\n if (value.length >= 12) score++;\r\n if (/[A-Z]/.test(value)) score++;\r\n if (/\\d/.test(value)) score++;\r\n if (/[^a-zA-Z0-9]/.test(value)) score++;\r\n return score;\r\n}\r\n\r\n/** Returns true if the two values are strictly equal (useful for confirm-password fields). */\r\nexport function isMatch(a: unknown, b: unknown): boolean {\r\n return a === b;\r\n}\r\n\r\n/** Returns true if the string is a valid JSON string. */\r\nexport function isJSON(value: string): boolean {\r\n try {\r\n JSON.parse(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Returns true if the string contains only printable ASCII characters. */\r\nexport function isASCII(value: string): boolean {\r\n return /^[\\x20-\\x7E]*$/.test(value);\r\n}\r\n\r\n/** Returns true if the number is a whole integer (no fractional part). */\r\nexport function isInteger(value: number): boolean {\r\n return Number.isInteger(value);\r\n}\r\n","/*\r\n * Public API Surface of osl-base-extended\r\n */\r\n\r\nexport * from './lib/osl-base-extended';\r\nexport * from './lib/core/base/base.component';\r\nexport * from './lib/core/http/httpbase';\r\nexport * from './lib/core/shared/components/dialog-wrapper/dialog-wrapper';\r\nexport * from './lib/core/shared/components/delete-confirmation/delete-confirmation';\r\nexport * from './lib/core/shared/form-structure/form-structure.module'\r\nexport * from './lib/core/shared/form-structure/dynamic-form/dynamic-form'\r\nexport * from './lib/core/shared/form-structure/setup/setup'\r\nexport * from './lib/core/shared/form-structure/grid/grid'\r\nexport * from './lib/core/shared/form-structure/form-grid/form-grid'\r\nexport * from './lib/core/shared/form-structure/autocomplete/autocomplete'\r\nexport * from './lib/core/shared/form-structure/input/input'\r\nexport * from './lib/core/shared/form-structure/select/select'\r\nexport * from './lib/core/shared/form-structure/button/button'\r\nexport * from './lib/core/shared/form-structure/checkbox/checkbox'\r\nexport * from './lib/core/shared/form-structure/datepicker/datepicker'\r\nexport * from './lib/core/shared/form-structure/radio/radio'\r\nexport * from './lib/core/shared/form-structure/file-upload/file-upload'\r\nexport * from './lib/core/shared/form-structure/textarea/textarea'\r\nexport * from './lib/core/shared/form-structure/searchbar/searchbar'\r\nexport * from './lib/core/shared/form-structure/slide-toggle/slide-toggle'\r\nexport * from './lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister'\r\nexport * from './lib/core/shared/form-structure/report-grid/report-grid'\r\nexport * from './lib/core/shared/form-structure/report-form/report-form'\r\nexport * from './lib/core/shared/directives/skeleton/skeleton.directive'\r\nexport * from './lib/core/shared/directives/skeleton/skeleton.module'\r\nexport * from './lib/core/shared/directives/skeleton/skeleton-theme.service'\r\nexport * from './lib/core/util/index'\r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.OslSkeletonThemeService","i1","i2","i3","i4.OslSkeletonDirective","i3.OslSkeletonDirective","i1.OslSkeletonDirective","i2.OslSkeletonDirective","i4","i5.OslSkeletonDirective","i3.Oslinput","i4.Osltextarea","i5.OslSelect","i6.OslRadio","i7.OslSlideToggle","i8.OslAutocomplete","i9.OslFileUpload","i10.OslDatepicker","i11.OslCheckbox","i12.OslButton","debounceTime","distinctUntilChanged","i2.DynamicForm","i3.OslButton","i4.OslSearchbar","i5.OslGrid","i2.OslSetup","i1.DynamicForm","i2.OslReportGrid","average","isEmpty","isValidDate","inRange","isPositive","isNegative"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"osl-base-extended.mjs","sources":["../../../projects/osl-base-extended/src/lib/osl-base-extended.ts","../../../projects/osl-base-extended/src/lib/core/shared/components/dialog-wrapper/dialog-wrapper.ts","../../../projects/osl-base-extended/src/lib/core/shared/components/dialog-wrapper/dialog-wrapper.html","../../../projects/osl-base-extended/src/lib/core/shared/components/delete-confirmation/delete-confirmation.ts","../../../projects/osl-base-extended/src/lib/core/shared/components/delete-confirmation/delete-confirmation.html","../../../projects/osl-base-extended/src/lib/core/base/base.component.ts","../../../projects/osl-base-extended/src/lib/core/http/httpbase.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister-types.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/datasource-cache/datasource-cache.service.ts","../../../projects/osl-base-extended/src/lib/core/shared/directives/skeleton/skeleton-theme.service.ts","../../../projects/osl-base-extended/src/lib/core/shared/directives/skeleton/skeleton.directive.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/input/input.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/input/input.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/textarea/textarea.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/textarea/textarea.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/select/select.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/select/select.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/radio/radio.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/radio/radio.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/slide-toggle/slide-toggle.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/slide-toggle/slide-toggle.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete/autocomplete.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete/autocomplete.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/file-upload/file-upload.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/file-upload/file-upload.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/datepicker/datepicker.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/datepicker/datepicker.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/checkbox/checkbox.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/checkbox/checkbox.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/button/button.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/button/button.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/dynamic-form/dynamic-form.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/dynamic-form/dynamic-form.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/searchbar/searchbar.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/searchbar/searchbar.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/grid/grid.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/grid/grid.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/setup/setup.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/setup/setup.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/form-grid/form-grid.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/form-grid/form-grid.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister.html","../../../projects/osl-base-extended/src/lib/core/shared/directives/skeleton/skeleton.module.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-grid/report-grid.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-grid/report-grid.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-form/report-form.ts","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/report-form/report-form.html","../../../projects/osl-base-extended/src/lib/core/shared/form-structure/form-structure.module.ts","../../../projects/osl-base-extended/src/lib/core/util/array.util.ts","../../../projects/osl-base-extended/src/lib/core/util/date.util.ts","../../../projects/osl-base-extended/src/lib/core/util/number.util.ts","../../../projects/osl-base-extended/src/lib/core/util/object.util.ts","../../../projects/osl-base-extended/src/lib/core/util/storage.util.ts","../../../projects/osl-base-extended/src/lib/core/util/string.util.ts","../../../projects/osl-base-extended/src/lib/core/util/validation.util.ts","../../../projects/osl-base-extended/src/public-api.ts","../../../projects/osl-base-extended/src/osl-base-extended.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-osl-base-extended',\r\n imports: [],\r\n template: ` <p>osl-base-extended works!</p> `,\r\n styles: ``,\r\n})\r\nexport class OslBaseExtended {}\r\n","import { NgComponentOutlet, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, Inject, TemplateRef } from '@angular/core';\r\nimport { MatIconButton } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n\r\n@Component({\r\n selector: 'dialog-wrapper',\r\n imports: [MatDialogModule, MatIconModule, NgTemplateOutlet, MatIconButton,NgComponentOutlet],\r\n templateUrl: './dialog-wrapper.html',\r\n styleUrl: './dialog-wrapper.scss',\r\n})\r\nexport class DialogWrapper {\r\n dialogData:Dialog= new Dialog()\r\n constructor(public dialogRef:MatDialogRef<DialogWrapper>,@Inject(MAT_DIALOG_DATA) public data: Dialog){\r\n this.dialogData.header = data.header;\r\n this.dialogData.partialHeader = data.partialHeader;\r\n this.dialogData.formBody = data.formBody;\r\n this.dialogData.formFooter = data.formFooter;\r\n this.dialogData.data = data.data\r\n this.dialogData.dialogRef = dialogRef\r\n this.dialogData.component = data.component\r\n }\r\n}\r\n\r\nexport class Dialog{\r\n header?:string|TemplateRef<any>= \"No Title Found\";\r\n partialHeader?:TemplateRef<any> | undefined;\r\n formBody?:TemplateRef<any> | undefined;\r\n formFooter?:TemplateRef<any> | undefined;\r\n data?:any;\r\n component?:any;\r\n dialogRef?:any;\r\n\r\n\r\n\r\n}\r\n","\r\n@if(dialogData.component){\r\n <ng-container [ngComponentOutlet]=\"dialogData.component\" [ngComponentOutletInputs]=\"{ data: dialogData }\"></ng-container>\r\n}\r\n@else{\r\n <div class=\"dialog-container\">\r\n \r\n <!-- Header -->\r\n @if(typeof dialogData.header == 'string') {\r\n <div class=\"dialog-header\" mat-dialog-title>\r\n <div class=\"dialog-header-left\">\r\n <div class=\"dialog-icon-ring\">\r\n <mat-icon class=\"dialog-icon\">\r\n {{ dialogData.header.startsWith('Add') ? 'add_circle' : dialogData.header.startsWith('Edit') ? 'edit' : 'info' }}\r\n </mat-icon>\r\n </div>\r\n <div class=\"dialog-title-group\">\r\n <span class=\"dialog-mode-label\">\r\n {{ dialogData.header.startsWith('Add') ? 'Creating New' : dialogData.header.startsWith('Edit') ? 'Edit' : '' }}\r\n </span>\r\n <span class=\"dialog-heading\"> {{ dialogData.header.startsWith('Add') ? dialogData.header.replace('Add','') : dialogData.header.startsWith('Edit') ? dialogData.header.replace('Edit','') : '' }}</span>\r\n </div>\r\n </div>\r\n @if(dialogData.partialHeader) {\r\n \r\n <ng-container *ngTemplateOutlet=\"dialogData.partialHeader; context: { $implicit: dialogData }\"></ng-container>\r\n }\r\n <button mat-icon-button class=\"dialog-close-btn\" mat-dialog-close>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n \r\n </div>\r\n } @else {\r\n <ng-container *ngTemplateOutlet=\"dialogData.header; context: { $implicit: dialogData }\"></ng-container>\r\n }\r\n \r\n <!-- Body -->\r\n <mat-dialog-content class=\"dialog-content\">\r\n @if(dialogData.formBody) {\r\n <div class=\"dialog-body\">\r\n <ng-container *ngTemplateOutlet=\"dialogData.formBody; context: { $implicit: dialogData }\"></ng-container>\r\n </div>\r\n }\r\n </mat-dialog-content>\r\n \r\n <!-- Footer -->\r\n @if(dialogData.formFooter) {\r\n <mat-dialog-actions class=\"dialog-actions\">\r\n <div class=\"dialog-footer\">\r\n <ng-container *ngTemplateOutlet=\"dialogData.formFooter; context: { $implicit: dialogData }\"></ng-container>\r\n </div>\r\n </mat-dialog-actions>\r\n }\r\n \r\n </div>\r\n\r\n}\r\n","import { Component, Inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\n@Component({\r\n selector: 'delete-confirmation',\r\n imports: [MatDialogModule, MatIconModule, MatButtonModule],\r\n templateUrl: './delete-confirmation.html',\r\n styleUrl: './delete-confirmation.scss',\r\n})\r\nexport class DeleteConfirmation {\r\n constructor(\r\n public dialogRef: MatDialogRef<DeleteConfirmation>,\r\n @Inject(MAT_DIALOG_DATA) public data: DeleteConfirmationData\r\n ) {}\r\n\r\n confirm() {\r\n this.dialogRef.close(true);\r\n }\r\n\r\n cancel() {\r\n this.dialogRef.close(false);\r\n }\r\n}\r\n\r\nexport class DeleteConfirmationData {\r\n title: string = 'Delete Confirmation';\r\n message: string = 'Are you sure you want to delete this item?';\r\n confirmText: string = 'Delete';\r\n cancelText: string = 'Cancel';\r\n data?: any;\r\n}\r\n","<div class=\"delete-dialog-container\">\r\n <div class=\"delete-dialog-header\">\r\n <div class=\"delete-icon-wrapper\">\r\n <div class=\"delete-icon-ring\">\r\n <mat-icon class=\"delete-icon\">delete_forever</mat-icon>\r\n </div>\r\n </div>\r\n <button mat-icon-button class=\"close-btn\" (click)=\"cancel()\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <mat-dialog-content class=\"delete-dialog-content\">\r\n <h2 class=\"delete-title\">{{ data.title }}</h2>\r\n <p class=\"delete-message\">{{ data.message }}</p>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions class=\"delete-dialog-actions\">\r\n <button mat-stroked-button class=\"cancel-btn\" (click)=\"cancel()\">\r\n <mat-icon>close</mat-icon>\r\n {{ data.cancelText }}\r\n </button>\r\n <button mat-flat-button class=\"confirm-btn\" (click)=\"confirm()\">\r\n <mat-icon>delete_forever</mat-icon>\r\n {{ data.confirmText }}\r\n </button>\r\n </mat-dialog-actions>\r\n</div>\r\n","import { inject, Injectable, Injector, TemplateRef } from \"@angular/core\";\r\nimport { MatDialog, MatDialogRef } from \"@angular/material/dialog\";\r\nimport { MatSnackBar } from \"@angular/material/snack-bar\";\r\nimport { Router } from \"@angular/router\";\r\nimport { Dialog, DialogWrapper } from \"../shared/components/dialog-wrapper/dialog-wrapper\";\r\nimport { DeleteConfirmation, DeleteConfirmationData } from \"../shared/components/delete-confirmation/delete-confirmation\";\r\n@Injectable()\r\n\r\nexport class baseComponent{\r\n private _injector = inject(Injector);\r\n\r\n protected showSuccess(message:any){\r\n if(Array.isArray(message)){\r\n message = message.join(',')\r\n }\r\n this.showSnack(message)\r\n }\r\n\r\n\r\n protected showError(error:string|string[]){\r\n if(Array.isArray(error)){\r\n error = error.join(',')\r\n }\r\n this.showSnack(error)\r\n }\r\n\r\n protected navigate(url:string){\r\n this._injector.get(Router).navigate([url])\r\n }\r\n\r\n private showSnack(message:string){\r\n message = message.replace(/<[^>]*>/g, '');\r\n this._injector.get(MatSnackBar).open(message,'Ok',{\r\n duration:3000\r\n })\r\n }\r\n\r\n protected openDialog(\r\n header?:string|TemplateRef<any>, \r\n formBody?:TemplateRef<any>,\r\n formFooter?:TemplateRef<any>,\r\n width:string = '40vw',\r\n data?:any,\r\n component?:any\r\n ):MatDialogRef<any>{\r\n const dialogData:Dialog= {\r\n header:header,\r\n formBody:formBody,\r\n formFooter:formFooter,\r\n data:data,\r\n component:component\r\n }\r\n const dialogRef = this._injector.get(MatDialog)?.open(DialogWrapper,{\r\n width:width,\r\n maxWidth:'80vw',\r\n data:{...dialogData,...data},\r\n\r\n })\r\n return dialogRef;\r\n }\r\n\r\n protected openDeleteDialog(\r\n message: string = 'Are you sure you want to delete this item?',\r\n title: string = 'Delete Confirmation',\r\n confirmText: string = 'Delete',\r\n cancelText: string = 'Cancel',\r\n data?: any,\r\n ): MatDialogRef<DeleteConfirmation> {\r\n const dialogData: DeleteConfirmationData = { title, message, confirmText, cancelText, data };\r\n return this._injector.get(MatDialog).open(DeleteConfirmation, {\r\n width: '380px',\r\n data: dialogData,\r\n disableClose: true,\r\n });\r\n }\r\n protected isValidBeforeSave<T>(formElements: T[], model: any): string[] {\r\n const errors: string[] = [];\r\n this._collectValidationErrors(formElements, model, errors);\r\n return errors;\r\n }\r\n\r\n private _collectValidationErrors<T>(formElements: T[] | any[], model: any, errors: string[]): void {\r\n for (const el of formElements) {\r\n if (el.elementType === 'fieldset') {\r\n if (el.rows?.length) {\r\n this._collectValidationErrors(el.rows, model, errors);\r\n }\r\n continue;\r\n }\r\n\r\n if (el.elementType === 'button' || el.elementType === 'templateRef' || el.elementType === 'spacer') {\r\n continue;\r\n }\r\n\r\n if (el.hideIf?.(model)) {\r\n continue;\r\n }\r\n\r\n const isRequired = el.required || el.requiredIf?.(model);\r\n const value = model[el.key];\r\n const isEmpty = value === null || value === undefined || value === ''\r\n || (Array.isArray(value) && value.length === 0);\r\n\r\n if (isRequired && isEmpty) {\r\n errors.push(`${el.label} is required`);\r\n continue;\r\n }\r\n\r\n if (el.inputType === 'email' && !isEmpty) {\r\n const emailRegex = /^(?!.*\\.\\.)(?!.*\\.$)[A-Za-z0-9][A-Za-z0-9._%+-]{0,63}@[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+)*\\.[A-Za-z]{2,}$/\r\n if (!emailRegex.test(value)) {\r\n errors.push(`${el.label} must be a valid email address`);\r\n }\r\n }\r\n\r\n if (el.elementType === 'datepicker' && !isEmpty) {\r\n const dateOnly = typeof value === 'string' && value.includes('T') ? value.split('T')[0] : value;\r\n const selectedDate = new Date(dateOnly + 'T00:00:00');\r\n if (!isNaN(selectedDate.getTime())) {\r\n const effectiveMin = el.minDateIf?.(model) ?? el.minDate;\r\n const effectiveMax = el.maxDateIf?.(model) ?? el.maxDate;\r\n if (effectiveMin) {\r\n const minDate = new Date(effectiveMin + 'T00:00:00');\r\n if (selectedDate < minDate) {\r\n errors.push(`${el.label} cannot be before ${this._formatDate(effectiveMin)}`);\r\n }\r\n }\r\n if (effectiveMax) {\r\n const maxDate = new Date(effectiveMax + 'T00:00:00');\r\n if (selectedDate > maxDate) {\r\n errors.push(`${el.label} cannot be after ${this._formatDate(effectiveMax)}`);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _formatDate(dateStr: string): string {\r\n const d = new Date(dateStr + 'T00:00:00');\r\n if (isNaN(d.getTime())) return dateStr;\r\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: '2-digit' });\r\n }\r\n\r\n}","import { HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { firstValueFrom, timeout } from 'rxjs';\r\n\r\nexport interface HttpResponse<T = any> {\r\n isSuccessful: boolean;\r\n statusCode: number;\r\n error: string | any[];\r\n result: T;\r\n headers?: HttpHeaders;\r\n}\r\nexport interface myParams {\r\n property: string;\r\n value: any;\r\n}\r\nexport abstract class Httpbase {\r\n private controllerName: string = '';\r\n constructor(private controller: string,public baseUrl:string= '/api/') {\r\n this.controllerName = controller;\r\n }\r\n\r\n private getEndPoint(methodName: string) {\r\n return `${this.baseUrl}${this.controllerName}/${methodName}`;\r\n }\r\n\r\n // ─── Named shorthands ────────────────────────────────────────────────────────\r\n\r\n /** GET /controller/GetAll */\r\n async getAll<T>(): Promise<HttpResponse<T>> {\r\n return this.get<T>('GetAll');\r\n }\r\n\r\n /** GET /controller/GetById?id=<id> */\r\n async getById<T>(id: any): Promise<HttpResponse<T>> {\r\n return this.get<T>('GetById', [{ property: 'id', value: id }]);\r\n }\r\n\r\n /** POST /controller/Save */\r\n async save<T>(body: any): Promise<HttpResponse<T>> {\r\n return this.post<T>('Save', body);\r\n }\r\n\r\n /** PUT /controller/Update */\r\n async update<T>(body: any): Promise<HttpResponse<T>> {\r\n return this.put<T>('Update', body);\r\n }\r\n\r\n /** DELETE /controller/Delete?id=<id> */\r\n async remove<T>(id: any): Promise<HttpResponse<T>> {\r\n return this.delete<T>('Delete', [{ property: 'id', value: id }]);\r\n }\r\n\r\n /** POST /controller/Search */\r\n async search(body: any) {\r\n return this.post('Search', body);\r\n }\r\n\r\n /** GET /controller/getConfig */\r\n async getConfig() {\r\n return this.get('getConfig');\r\n }\r\n\r\n // ─── Internals ────────────────────────────────────────────────────────────────\r\n\r\n private getHeaders() {\r\n const token = localStorage.getItem('token');\r\n return new HttpHeaders({\r\n 'Content-Type': 'application/json',\r\n Authorization: token ? `Bearer ${token}` : '',\r\n });\r\n }\r\n\r\n private getUploadHeaders() {\r\n const token = localStorage.getItem('token');\r\n // No Content-Type — browser sets multipart boundary automatically\r\n return new HttpHeaders({\r\n Authorization: token ? `Bearer ${token}` : '',\r\n });\r\n }\r\n\r\n private handleSuccess<T>(statusCode: number, result: any, header: any): HttpResponse<T> {\r\n return {\r\n isSuccessful: statusCode >= 200 && statusCode < 300,\r\n error: '',\r\n result: result,\r\n statusCode: statusCode,\r\n headers: header,\r\n };\r\n }\r\n\r\n private handleError<T>(error: any): HttpResponse<T> {\r\n if (error.status === 401) {\r\n // localStorage.clear();\r\n window.location.href = '/login';\r\n }\r\n return {\r\n isSuccessful: false,\r\n error: this.mapError(error),\r\n statusCode: error.status,\r\n result: null as any,\r\n };\r\n }\r\n flatObject(object:any){\r\n return Object.values(object)?.flat()?.map((x:any)=>x.toString());\r\n }\r\n\r\n private mapError(error: HttpErrorResponse): string | string[] {\r\n switch (error.status) {\r\n case 0: return 'Connection Error! Please Contact Administration';\r\n case 400: return error.error?.errors? this.flatObject(error.error?.errors) :error.error?.message || 'Bad Request';\r\n case 401: return 'Unauthorized Access';\r\n case 403: return \"You don't have rights to perform this action\";\r\n case 404: return 'Resource not found';\r\n case 409: return error.error?.message || 'Conflict';\r\n case 422: return error.error?.message || 'Validation failed';\r\n case 500: return 'An error has occurred, Please contact support';\r\n default: return 'Something went wrong';\r\n }\r\n }\r\n\r\n private buildParams(paramsArray: myParams[]): HttpParams {\r\n return (paramsArray || []).reduce((params, { property, value }) => {\r\n if (property && value != null) {\r\n return Array.isArray(value)\r\n ? value.reduce((p, v) => p.append(property, v), params)\r\n : params.set(property, value);\r\n }\r\n return params;\r\n }, new HttpParams());\r\n }\r\n\r\n protected http = inject(HttpClient);\r\n\r\n // private baseUrl = '/api/';\r\n\r\n // ─── HTTP verb wrappers ───────────────────────────────────────────────────────\r\n protected async post<T>(methodName: string, body: any,params?:myParams[]): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .post(this.getEndPoint(methodName), body, {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n params: this.buildParams(params || []),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async get<T>(methodName: string, params?: myParams[]): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .get(this.getEndPoint(methodName), {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n params: this.buildParams(params || []),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async put<T>(methodName: string, body: any): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .put(this.getEndPoint(methodName), body, {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async patch<T>(methodName: string, body: any): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .patch(this.getEndPoint(methodName), body, {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n protected async delete<T>(methodName: string, params?: myParams[]): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .delete(this.getEndPoint(methodName), {\r\n observe: 'response',\r\n headers: this.getHeaders(),\r\n params: this.buildParams(params || []),\r\n })\r\n .pipe(timeout(30000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n\r\n /** Multipart file upload — do NOT pass Content-Type; browser sets the boundary */\r\n protected async upload<T>(methodName: string, formData: FormData): Promise<HttpResponse<T>> {\r\n try {\r\n const res = await firstValueFrom(\r\n this.http\r\n .post(this.getEndPoint(methodName), formData, {\r\n observe: 'response',\r\n headers: this.getUploadHeaders(),\r\n })\r\n .pipe(timeout(60000)),\r\n );\r\n return this.handleSuccess(res.status, res.body, res.headers);\r\n } catch (error: any) {\r\n return this.handleError(error);\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Type } from '@angular/core';\r\n\r\nexport const AUTOCOMPLETE_LISTER_COMPONENT = new InjectionToken<Type<any>>('AUTOCOMPLETE_LISTER_COMPONENT');\r\n\r\nexport interface oslListerData {\r\n title: string;\r\n methodName: string;\r\n service: any;\r\n configMethodName: string;\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DatasourceCacheService {\r\n private cache = new Map<string, any[]>();\r\n private pending = new Map<string, Promise<any[]>>();\r\n\r\n private buildKey(service: any, methodName: string, body?: any): string {\r\n const serviceName = service?.constructor?.name ?? 'unknown';\r\n return `${serviceName}.${methodName}.${JSON.stringify(body ?? null)}`;\r\n }\r\n\r\n async load(service: any, methodName: string, body?: any): Promise<any[]> {\r\n const key = this.buildKey(service, methodName, body);\r\n\r\n if (this.cache.has(key)) {\r\n return this.cache.get(key)!;\r\n }\r\n\r\n if (this.pending.has(key)) {\r\n return this.pending.get(key)!;\r\n }\r\n\r\n const request = (async () => {\r\n try {\r\n const response = body !== undefined\r\n ? await service[methodName](body)\r\n : await service[methodName]();\r\n\r\n const data = Array.isArray(response) ? response : (response?.result ?? []);\r\n this.cache.set(key, data);\r\n return data;\r\n } finally {\r\n this.pending.delete(key);\r\n }\r\n })();\r\n\r\n this.pending.set(key, request);\r\n return request;\r\n }\r\n\r\n invalidate(service: any, methodName: string, body?: any): void {\r\n this.cache.delete(this.buildKey(service, methodName, body));\r\n }\r\n\r\n invalidateAll(): void {\r\n this.cache.clear();\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SkeletonTheme } from './skeleton.directive';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class OslSkeletonThemeService {\r\n private readonly _theme$ = new BehaviorSubject<SkeletonTheme>('light');\r\n\r\n /** Subscribe to react to global theme changes */\r\n readonly theme$ = this._theme$.asObservable();\r\n\r\n get current(): SkeletonTheme {\r\n return this._theme$.getValue();\r\n }\r\n\r\n setTheme(theme: SkeletonTheme): void {\r\n this._theme$.next(theme);\r\n }\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n Inject,\r\n Input,\r\n NgZone,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n PLATFORM_ID,\r\n Renderer2,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { OslSkeletonThemeService } from './skeleton-theme.service';\r\n\r\n// ─── Public Types ────────────────────────────────────────────────────────────\r\n\r\n/** How skeleton bones are laid out */\r\nexport type SkeletonType =\r\n | 'auto' // reads host children and mirrors their bounding boxes\r\n | 'text' // N horizontal bars (last one shorter)\r\n | 'rect' // single full-size block\r\n | 'circle' // single circle\r\n | 'card' // image block + text lines below\r\n | 'list' // N rows of avatar + two text lines\r\n | 'table' // header row + data rows × columns\r\n | 'avatar-text'; // circle on the left + N text lines on the right\r\n\r\n/** CSS animation applied to bones */\r\nexport type SkeletonAnimation = 'shimmer' | 'pulse' | 'wave' | 'none';\r\n\r\n/** Colour preset — overridden by oslSkeletonColor / oslSkeletonHighlight */\r\nexport type SkeletonTheme = 'light' | 'dark';\r\n\r\n// ─── Internal ────────────────────────────────────────────────────────────────\r\n\r\ninterface Bone {\r\n top: number;\r\n left: number;\r\n width: number;\r\n height: number;\r\n radius: string;\r\n delay?: number; // wave animation stagger (seconds)\r\n}\r\n\r\n// Injected once per app lifetime — static flag avoids duplicate <style> tags.\r\nlet _osl_sk_injected = false;\r\n\r\n// CSS is minified inline: zero runtime SCSS processing, one GPU-composited\r\n// keyframe (translateX uses the compositor thread, no layout/paint on each frame).\r\nconst SKELETON_CSS = `\r\n.osl-sk-host{position:relative!important}\r\n.osl-sk-overlay{position:absolute;inset:0;pointer-events:none;overflow:hidden;}\r\n.osl-sk-bone{position:absolute;background:var(--osl-sk-color,#e2e8f0);border-radius:var(--osl-sk-r,4px);overflow:hidden;will-change:transform,opacity}\r\n.osl-sk-bone::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,transparent 0%,var(--osl-sk-hl,rgba(255,255,255,.6)) 50%,transparent 100%);transform:translateX(-100%);will-change:transform}\r\n.osl-sk-shimmer .osl-sk-bone::after{animation:_osl-sk-shimmer var(--osl-sk-dur,1.5s) ease-in-out infinite}\r\n.osl-sk-pulse .osl-sk-bone{animation:_osl-sk-pulse var(--osl-sk-dur,1.5s) ease-in-out infinite;animation-delay:var(--osl-sk-d,0s)}\r\n.osl-sk-wave .osl-sk-bone{animation:_osl-sk-pulse var(--osl-sk-dur,1.5s) ease-in-out infinite;animation-delay:var(--osl-sk-d,0s)}\r\n.osl-sk-none .osl-sk-bone::after{display:none}\r\n.osl-sk-host.osl-sk-active>*:not(.osl-sk-overlay){visibility:hidden}\r\n@keyframes _osl-sk-shimmer{0%{transform:translateX(-100%)}100%{transform:translateX(200%)}}\r\n@keyframes _osl-sk-pulse{0%,100%{opacity:1}50%{opacity:.4}}\r\n`;\r\n\r\n// Keys whose changes require bone recomputation\r\nconst LAYOUT_KEYS = new Set([\r\n 'type',\r\n 'rows',\r\n 'rowGap',\r\n 'circleSize',\r\n 'listItems',\r\n 'tableRows',\r\n 'tableCols',\r\n 'cardLines',\r\n 'minHeight',\r\n]);\r\n\r\n// ─── Directive ───────────────────────────────────────────────────────────────\r\n\r\n@Directive({ \r\n selector: '[oslSkeleton]',\r\n standalone:false\r\n })\r\nexport class OslSkeletonDirective implements OnInit, OnChanges, OnDestroy {\r\n // ── Inputs ────────────────────────────────────────────────────────────────\r\n\r\n /** Primary toggle — set true while data is loading */\r\n @Input('oslSkeleton') loading = false;\r\n\r\n /** Layout strategy (default: auto — mirrors host children) */\r\n @Input('oslSkeletonType') type: SkeletonType = 'auto';\r\n\r\n /** Animation style (default: shimmer) */\r\n @Input('oslSkeletonAnimation') animation: SkeletonAnimation = 'shimmer';\r\n\r\n /** Colour preset — overridden by oslSkeletonColor & oslSkeletonHighlight.\r\n * When omitted, the global OslSkeletonThemeService value is used. */\r\n @Input('oslSkeletonTheme')\r\n set theme(value: SkeletonTheme) { this._themeOverride = value; }\r\n get theme(): SkeletonTheme { return this._themeOverride ?? this._serviceTheme; }\r\n\r\n /** Override bone background colour (e.g. '#cbd5e1') */\r\n @Input('oslSkeletonColor') color?: string;\r\n\r\n /** Override shimmer highlight colour (e.g. 'rgba(255,255,255,0.8)') */\r\n @Input('oslSkeletonHighlight') highlight?: string;\r\n\r\n /** Override bone border-radius (e.g. '8px' or '50%') */\r\n @Input('oslSkeletonRadius') radius?: string;\r\n\r\n /** Text rows — used by type=text and type=avatar-text */\r\n @Input('oslSkeletonRows') rows = 3;\r\n\r\n /** Gap between text rows (px) */\r\n @Input('oslSkeletonRowGap') rowGap = 10;\r\n\r\n /** Overlay z-index */\r\n @Input('oslSkeletonZIndex') zIndex = 10;\r\n\r\n /** Delay before skeleton appears (ms) — prevents flicker on fast responses */\r\n @Input('oslSkeletonDelay') delay = 0;\r\n\r\n /** Animation cycle duration (ms) */\r\n @Input('oslSkeletonDuration') duration = 1500;\r\n\r\n /** Minimum overlay height when host has no size yet (px) */\r\n @Input('oslSkeletonMinHeight') minHeight?: number;\r\n\r\n /** Re-read host DOM on every show() instead of using cached layout */\r\n @Input('oslSkeletonForceReread') forceReread = false;\r\n\r\n /** Circle diameter — used by type=circle and avatar in list/avatar-text (px) */\r\n @Input('oslSkeletonCircleSize') circleSize = 40;\r\n\r\n /** Item count for type=list */\r\n @Input('oslSkeletonListItems') listItems = 4;\r\n\r\n /** Row count for type=table (data rows, excluding header) */\r\n @Input('oslSkeletonTableRows') tableRows = 5;\r\n\r\n /** Column count for type=table */\r\n @Input('oslSkeletonTableCols') tableCols = 4;\r\n\r\n /** Body text lines for type=card */\r\n @Input('oslSkeletonCardLines') cardLines = 3;\r\n\r\n /** Overlay background colour — should match your page/card background to cover real content */\r\n @Input('oslSkeletonBgColor') bgColor?: string;\r\n\r\n // ── State ─────────────────────────────────────────────────────────────────\r\n\r\n private overlay: HTMLElement | null = null;\r\n private cachedBones: Bone[] | null = null;\r\n private delayTimer: ReturnType<typeof setTimeout> | null = null;\r\n private rafId = 0;\r\n\r\n private _themeOverride?: SkeletonTheme;\r\n private _serviceTheme: SkeletonTheme = 'light';\r\n private _themeSub?: Subscription;\r\n\r\n // ── Lifecycle ─────────────────────────────────────────────────────────────\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private renderer: Renderer2,\r\n private zone: NgZone,\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n @Optional() private themeService: OslSkeletonThemeService,\r\n ) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n OslSkeletonDirective.injectStyles();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n if (!isPlatformBrowser(this.platformId) || !this.themeService) return;\r\n this._themeSub = this.themeService.theme$.subscribe(theme => {\r\n if (this._themeOverride !== undefined) return;\r\n this._serviceTheme = theme;\r\n if (this.loading && this.overlay?.parentNode) {\r\n this.zone.runOutsideAngular(() => this.applyConfig());\r\n }\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n\r\n // Bust bone cache when any layout-affecting input changes\r\n for (const key of Object.keys(changes)) {\r\n if (LAYOUT_KEYS.has(key)) {\r\n this.cachedBones = null;\r\n break;\r\n }\r\n }\r\n\r\n if ('loading' in changes) {\r\n this.loading ? this.show() : this.hide();\r\n } else if (this.loading && this.overlay) {\r\n // Visual config changed while skeleton is visible — re-apply without toggling\r\n this.applyConfig();\r\n this.renderBones();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.cancelPending();\r\n if (this.overlay?.parentNode) this.overlay.parentNode.removeChild(this.overlay);\r\n this.overlay = null;\r\n this.cachedBones = null;\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-host');\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-active');\r\n }\r\n\r\n // ── Visibility control ────────────────────────────────────────────────────\r\n\r\n private show(): void {\r\n this.cancelPending();\r\n if (this.delay > 0) {\r\n this.delayTimer = setTimeout(() => this.doRender(), this.delay);\r\n } else {\r\n this.doRender();\r\n }\r\n }\r\n\r\n private hide(): void {\r\n this.cancelPending();\r\n if (this.overlay?.parentNode) this.overlay.parentNode.removeChild(this.overlay);\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-host');\r\n this.renderer.removeClass(this.el.nativeElement, 'osl-sk-active');\r\n }\r\n\r\n // ── Rendering ─────────────────────────────────────────────────────────────\r\n\r\n private doRender(): void {\r\n this.zone.runOutsideAngular(() => {\r\n // ── Synchronous: hide real content this JS tick ───────────────────────\r\n // Runs before the browser gets a chance to paint, so real content is\r\n // never visible even for a single frame.\r\n this.ensureOverlay();\r\n this.applyConfig();\r\n this.renderer.addClass(this.el.nativeElement, 'osl-sk-host');\r\n this.renderer.addClass(this.el.nativeElement, 'osl-sk-active');\r\n this.el.nativeElement.appendChild(this.overlay!);\r\n\r\n // ── RAF: compute + paint bones ────────────────────────────────────────\r\n // By the time RAF fires, Angular has finished rendering all children into\r\n // the DOM, so getBoundingClientRect() in autoDetect() returns real sizes.\r\n this.rafId = requestAnimationFrame(() => {\r\n if (!this.overlay?.parentNode) return; // hide() was called before RAF fired\r\n if (!this.cachedBones || this.forceReread) {\r\n this.cachedBones = this.computeBones();\r\n }\r\n this.renderBones();\r\n });\r\n });\r\n }\r\n\r\n private ensureOverlay(): void {\r\n if (!this.overlay) {\r\n this.overlay = document.createElement('div');\r\n }\r\n }\r\n\r\n private applyConfig(): void {\r\n const ov = this.overlay!;\r\n // Reset to known baseline before adding animation class\r\n ov.className = `osl-sk-overlay osl-sk-${this.animation}`;\r\n\r\n const dark = this.theme === 'dark';\r\n const parts = [\r\n `--osl-sk-dur:${this.duration}ms`,\r\n `--osl-sk-color:${this.color ?? (dark ? '#374151' : '#e2e8f0')}`,\r\n `--osl-sk-bg:${this.bgColor ?? (dark ? '#1f2937' : '#f8fafc')}`,\r\n `--osl-sk-hl:${this.highlight ?? (dark ? 'rgba(255,255,255,.1)' : 'rgba(255,255,255,.6)')}`,\r\n `z-index:${this.zIndex}`,\r\n ];\r\n if (this.radius) parts.push(`--osl-sk-r:${this.radius}`);\r\n // Single cssText assignment avoids repeated style flushes\r\n ov.style.cssText = parts.join(';');\r\n }\r\n\r\n private renderBones(): void {\r\n const ov = this.overlay!;\r\n // Clear previous bones without innerHTML (avoids serialisation overhead)\r\n while (ov.firstChild) ov.removeChild(ov.firstChild);\r\n if (!this.cachedBones?.length) return;\r\n\r\n const isWave = this.animation === 'wave';\r\n // DocumentFragment = single reflow when appended\r\n const frag = document.createDocumentFragment();\r\n\r\n this.cachedBones.forEach((b, i) => {\r\n const div = document.createElement('div');\r\n div.className = 'osl-sk-bone';\r\n let css = `top:${b.top}px;left:${b.left}px;width:${b.width}px;height:${b.height}px;border-radius:${b.radius}`;\r\n if (isWave) css += `;--osl-sk-d:${b.delay ?? i * 0.1}s`;\r\n div.style.cssText = css;\r\n frag.appendChild(div);\r\n });\r\n\r\n ov.appendChild(frag);\r\n }\r\n\r\n // ── Bone computation ──────────────────────────────────────────────────────\r\n\r\n private computeBones(): Bone[] {\r\n return this.type === 'auto' ? this.autoDetect() : this.predefined();\r\n }\r\n\r\n /**\r\n * Reads the host's direct children, computes their bounding boxes in a\r\n * single batched pass (all reads before writes), and creates matching bones.\r\n * Falls back to predefined() when host is empty.\r\n */\r\n private autoDetect(): Bone[] {\r\n const host = this.el.nativeElement;\r\n const kids = Array.from(host.children).filter(\r\n (c) => !(c as HTMLElement).classList.contains('osl-sk-overlay'),\r\n ) as HTMLElement[];\r\n\r\n if (!kids.length) return this.predefined();\r\n\r\n // ── Batch reads (no write between these) ──\r\n const hostRect = host.getBoundingClientRect();\r\n const rects = kids.map((k) => k.getBoundingClientRect());\r\n\r\n // ── Build bone descriptors ──\r\n const bones: Bone[] = [];\r\n rects.forEach((r, i) => {\r\n if (r.width === 0 && r.height === 0) return;\r\n bones.push({\r\n top: r.top - hostRect.top,\r\n left: r.left - hostRect.left,\r\n width: r.width,\r\n height: r.height,\r\n radius: this.inferRadius(kids[i]),\r\n delay: i * 0.1,\r\n });\r\n });\r\n\r\n return bones.length ? bones : this.predefined();\r\n }\r\n\r\n /** Classifies an element's shape without triggering getComputedStyle */\r\n private inferRadius(el: HTMLElement): string {\r\n const cls = el.className ?? '';\r\n const tag = el.tagName.toLowerCase();\r\n if (tag === 'mat-icon' || /\\bcircle\\b|\\bround\\b|\\bavatar\\b/.test(cls)) return '50%';\r\n return '4px';\r\n }\r\n\r\n /** Generates a fully predefined bone layout for the current type */\r\n private predefined(): Bone[] {\r\n const host = this.el.nativeElement;\r\n const w = host.offsetWidth || 300;\r\n const rh = host.offsetHeight;\r\n const h = rh > 20 ? rh : (this.minHeight ?? 200);\r\n\r\n const { rows, rowGap, circleSize, listItems, tableRows, tableCols, cardLines } = this;\r\n\r\n switch (this.type) {\r\n // ── Circle ────────────────────────────────────────────────────────────\r\n case 'circle':\r\n return [{ top: 0, left: 0, width: circleSize, height: circleSize, radius: '50%' }];\r\n\r\n // ── Rect ──────────────────────────────────────────────────────────────\r\n case 'rect':\r\n return [{ top: 0, left: 0, width: w, height: h, radius: '4px' }];\r\n\r\n // ── Text ──────────────────────────────────────────────────────────────\r\n case 'text': {\r\n const lh = 14;\r\n return Array.from({ length: rows }, (_, i) => ({\r\n top: i * (lh + rowGap),\r\n left: 0,\r\n width: i === rows - 1 ? Math.round(w * 0.6) : w,\r\n height: lh,\r\n radius: '4px',\r\n delay: i * 0.1,\r\n }));\r\n }\r\n\r\n // ── Card ──────────────────────────────────────────────────────────────\r\n case 'card': {\r\n const imgH = Math.round(h * 0.45);\r\n const lh = 14;\r\n const bones: Bone[] = [\r\n { top: 0, left: 0, width: w, height: imgH, radius: '4px', delay: 0 },\r\n ];\r\n for (let i = 0; i < cardLines; i++) {\r\n bones.push({\r\n top: imgH + 16 + i * (lh + rowGap),\r\n left: 0,\r\n width: i === cardLines - 1 ? Math.round(w * 0.5) : Math.round(w * 0.9),\r\n height: lh,\r\n radius: '4px',\r\n delay: (i + 1) * 0.1,\r\n });\r\n }\r\n return bones;\r\n }\r\n\r\n // ── List ──────────────────────────────────────────────────────────────\r\n case 'list': {\r\n const itemH = Math.max(circleSize + 12, 52);\r\n const gap = 12;\r\n const bones: Bone[] = [];\r\n for (let i = 0; i < listItems; i++) {\r\n const t = i * (itemH + gap);\r\n // Avatar\r\n bones.push({\r\n top: t,\r\n left: 0,\r\n width: circleSize,\r\n height: circleSize,\r\n radius: '50%',\r\n delay: i * 0.06,\r\n });\r\n // Title\r\n bones.push({\r\n top: t,\r\n left: circleSize + 12,\r\n width: Math.round(w * 0.5),\r\n height: 14,\r\n radius: '4px',\r\n delay: i * 0.06,\r\n });\r\n // Subtitle\r\n bones.push({\r\n top: t + 22,\r\n left: circleSize + 12,\r\n width: Math.round(w * 0.35),\r\n height: 12,\r\n radius: '4px',\r\n delay: i * 0.06 + 0.05,\r\n });\r\n }\r\n return bones;\r\n }\r\n\r\n // ── Table ─────────────────────────────────────────────────────────────\r\n case 'table': {\r\n const rh2 = 36;\r\n const cw = Math.floor(w / tableCols);\r\n const bones: Bone[] = [];\r\n // Header\r\n for (let c = 0; c < tableCols; c++) {\r\n bones.push({\r\n top: 0,\r\n left: c * cw + 4,\r\n width: cw - 8,\r\n height: rh2,\r\n radius: '4px',\r\n delay: c * 0.05,\r\n });\r\n }\r\n // Data rows\r\n for (let r = 0; r < tableRows; r++) {\r\n for (let c = 0; c < tableCols; c++) {\r\n bones.push({\r\n top: (r + 1) * (rh2 + 4) + 4,\r\n left: c * cw + 4,\r\n width: cw - 8,\r\n height: rh2 - 8,\r\n radius: '4px',\r\n delay: (c + r * tableCols) * 0.03,\r\n });\r\n }\r\n }\r\n return bones;\r\n }\r\n\r\n // ── Avatar + text ─────────────────────────────────────────────────────\r\n case 'avatar-text': {\r\n const bones: Bone[] = [\r\n { top: 0, left: 0, width: circleSize, height: circleSize, radius: '50%', delay: 0 },\r\n ];\r\n const tLeft = circleSize + 12;\r\n const tWidth = w - tLeft;\r\n const lh = 14;\r\n for (let i = 0; i < rows; i++) {\r\n bones.push({\r\n top: i * (lh + rowGap),\r\n left: tLeft,\r\n width: i === rows - 1 ? Math.round(tWidth * 0.6) : tWidth,\r\n height: lh,\r\n radius: '4px',\r\n delay: (i + 1) * 0.1,\r\n });\r\n }\r\n return bones;\r\n }\r\n\r\n // ── Fallback ──────────────────────────────────────────────────────────\r\n default:\r\n return [{ top: 0, left: 0, width: w, height: h, radius: '4px' }];\r\n }\r\n }\r\n\r\n // ── Utilities ─────────────────────────────────────────────────────────────\r\n\r\n private cancelPending(): void {\r\n if (this.delayTimer) { clearTimeout(this.delayTimer); this.delayTimer = null; }\r\n if (this.rafId) { cancelAnimationFrame(this.rafId); this.rafId = 0; }\r\n }\r\n\r\n private static injectStyles(): void {\r\n if (_osl_sk_injected) return;\r\n _osl_sk_injected = true;\r\n const style = document.createElement('style');\r\n style.id = 'osl-sk-styles';\r\n style.textContent = SKELETON_CSS;\r\n document.head.appendChild(style);\r\n }\r\n}\r\n","import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';\r\n\r\nexport type InputType = 'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'int';\r\n\r\n@Component({\r\n selector: 'osl-input',\r\n standalone: false,\r\n templateUrl: './input.html',\r\n styleUrl: './input.scss',\r\n})\r\nexport class Oslinput implements OnInit, OnChanges {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = '';\r\n @Input('type') type: InputType = 'text';\r\n @Input('placeholder') placeholder: string = '';\r\n /** Mask pattern: 0=digit, A=letter, *=alphanumeric, other chars are literals. E.g. '(000) 000-0000' */\r\n @Input('mask') mask: string = '';\r\n @Input('min') min: string | number = '';\r\n @Input('max') max: string | number = '';\r\n @Input('minLength') minLength: number | null = null;\r\n @Input('maxLength') maxLength: number | null = null;\r\n @Input('prefixIcon') prefixIcon: string = '';\r\n @Input('suffixIcon') suffixIcon: string = '';\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n @Input('onlyChars') onlyChars: boolean = false;\r\n @Input('isCapitalize') isCapitalize: boolean = false;\r\n /** Enforce N decimal places. Shows 0.00 when blank; auto-pads on blur. */\r\n @Input('decimalPortion') decimalPortion: number | null = null;\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n\r\n showPassword = false;\r\n isFocused = false;\r\n\r\n get inputType(): string {\r\n if (this.type === 'password') return this.showPassword ? 'text' : 'password';\r\n if (this.decimalPortion !== null || this.type === 'int') return 'text';\r\n return this.type;\r\n }\r\n\r\n get hasWrapper(): boolean {\r\n return !!(this.prefixIcon || this.suffixIcon || this.type === 'password');\r\n }\r\n\r\n ngOnInit() {\r\n if (this.decimalPortion !== null) {\r\n this.applyDecimalFormat();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['model'] && !changes['model'].firstChange && this.decimalPortion !== null && !this.isFocused) {\r\n this.applyDecimalFormat();\r\n }\r\n }\r\n\r\n togglePassword() {\r\n this.showPassword = !this.showPassword;\r\n }\r\n\r\n onFocusIn(event: FocusEvent) {\r\n this.isFocused = true;\r\n if (this.decimalPortion !== null) {\r\n setTimeout(() => (event.target as HTMLInputElement).select(), 0);\r\n }\r\n }\r\n\r\n onFocusOut() {\r\n this.isFocused = false;\r\n if (this.decimalPortion !== null) {\r\n const raw = String(this.model ?? '');\r\n const formatted = raw ? this.formatDecimal(raw) : (0).toFixed(this.decimalPortion);\r\n this.model = formatted;\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n }\r\n\r\n private applyDecimalFormat() {\r\n const raw = this.model == null || this.model === '' ? '' : String(this.model);\r\n const formatted = raw ? this.formatDecimal(raw) : (0).toFixed(this.decimalPortion!);\r\n if (formatted !== String(this.model ?? '')) {\r\n this.model = formatted;\r\n this.modelChange.emit(this.model);\r\n }\r\n }\r\n\r\n private formatDecimal(value: string): string {\r\n const cleaned = value.replace(/[^\\d.]/g, '');\r\n const num = parseFloat(cleaned);\r\n if (isNaN(num)) return (0).toFixed(this.decimalPortion!);\r\n return num.toFixed(this.decimalPortion!);\r\n }\r\n\r\n private cleanDecimalInput(value: string): string {\r\n let cleaned = value.replace(/[^\\d.]/g, '');\r\n const parts = cleaned.split('.');\r\n if (parts.length > 2) {\r\n cleaned = parts[0] + '.' + parts.slice(1).join('');\r\n }\r\n if (parts.length >= 2 && parts[1].length > this.decimalPortion!) {\r\n cleaned = parts[0] + '.' + parts[1].substring(0, this.decimalPortion!);\r\n }\r\n return cleaned;\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent) {\r\n if (event.ctrlKey || event.metaKey || event.altKey) return;\r\n if (event.key.length !== 1) return;\r\n\r\n if (this.onlyChars && /\\d/.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (this.type === 'int') {\r\n if (!/\\d/.test(event.key)) {\r\n event.preventDefault();\r\n }\r\n return;\r\n }\r\n\r\n if (this.decimalPortion !== null) {\r\n const key = event.key;\r\n if (!/[\\d.]/.test(key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n if (key === '.' && (this.decimalPortion === 0 || String(this.model ?? '').includes('.'))) {\r\n event.preventDefault();\r\n return;\r\n }\r\n if (/\\d/.test(key)) {\r\n const input = event.target as HTMLInputElement;\r\n const val = input.value;\r\n const dotIndex = val.indexOf('.');\r\n if (dotIndex !== -1) {\r\n const selStart = input.selectionStart ?? val.length;\r\n const selEnd = input.selectionEnd ?? selStart;\r\n if (selStart > dotIndex) {\r\n const afterDotStart = dotIndex + 1;\r\n const afterDotLen = val.length - afterDotStart;\r\n const selInAfterDotStart = Math.max(selStart, afterDotStart);\r\n const selInAfterDotEnd = Math.max(selEnd, afterDotStart);\r\n const selectedInAfterDot = selInAfterDotEnd - selInAfterDotStart;\r\n const remainingDecimals = afterDotLen - selectedInAfterDot;\r\n if (remainingDecimals >= this.decimalPortion!) {\r\n event.preventDefault();\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (this.mask && !this.isKeyAllowedByMask(event.key)) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n private isKeyAllowedByMask(key: string): boolean {\r\n const maskSlots = new Set<string>();\r\n for (const c of this.mask) {\r\n if (c === '0') maskSlots.add('digit');\r\n else if (c === 'A') maskSlots.add('letter');\r\n else if (c === '*') maskSlots.add('any');\r\n }\r\n if (maskSlots.has('any')) return true;\r\n if (maskSlots.has('letter') && /[a-zA-Z]/.test(key)) return true;\r\n if (maskSlots.has('digit') && /\\d/.test(key)) return true;\r\n return false;\r\n }\r\n\r\n onModelChange(value: string) {\r\n if (this.decimalPortion !== null) {\r\n const cleaned = this.cleanDecimalInput(value);\r\n this.model = cleaned;\r\n this.modelChange.emit(this.model);\r\n return;\r\n }\r\n if (this.type === 'int') {\r\n const dotIndex = value.indexOf('.');\r\n const truncated = dotIndex !== -1 ? value.substring(0, dotIndex) : value;\r\n const digits = truncated.replace(/[^\\d]/g, '');\r\n this.model = digits === '' ? null : parseInt(digits, 10);\r\n this.modelChange.emit(this.model);\r\n return;\r\n }\r\n if(this.isCapitalize){\r\n value = typeof value == 'string' ? value?.toUpperCase() : value\r\n }\r\n const processed = this.mask ? this.applyMask(value) : value;\r\n this.model = processed;\r\n this.modelChange.emit(this.model);\r\n }\r\n\r\n onChange() {\r\n if (this.decimalPortion !== null) return;\r\n this.changeEv.emit(this.model);\r\n }\r\n\r\n private applyMask(value: string): string {\r\n if (!this.mask || !value) return value;\r\n const stripped = value.replace(/[^a-zA-Z0-9]/g, '');\r\n let result = '';\r\n let si = 0;\r\n\r\n for (let mi = 0; mi < this.mask.length; mi++) {\r\n if (si >= stripped.length) break;\r\n const mc = this.mask[mi];\r\n\r\n if (mc === '0') {\r\n if (/\\d/.test(stripped[si])) result += stripped[si];\r\n si++;\r\n } else if (mc === 'A') {\r\n if (/[a-zA-Z]/.test(stripped[si])) result += stripped[si];\r\n si++;\r\n } else if (mc === '*') {\r\n result += stripped[si++];\r\n } else {\r\n result += mc;\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label){\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n <span [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">{{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span></span>\r\n </label>\r\n </div>\r\n}\r\n\r\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.plain]=\"!hasWrapper\" [class.error]=\"myField.touched && myField.invalid\" [class.input-disabled]=\"disabled\">\r\n @if(prefixIcon) {\r\n <mat-icon class=\"input-icon prefix-icon\">{{prefixIcon}}</mat-icon>\r\n }\r\n <input\r\n\r\n [type]=\"inputType\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (keydown)=\"onKeyDown($event)\"\r\n (focus)=\"onFocusIn($event)\"\r\n (blur)=\"onFocusOut()\"\r\n (change)=\"onChange()\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [attr.min]=\"min || null\"\r\n [attr.max]=\"max || null\"\r\n [attr.minlength]=\"minLength\"\r\n [attr.maxlength]=\"maxLength\"\r\n [email]=\"type === 'email'\"\r\n #myField=\"ngModel\"\r\n class=\"inner-input\"\r\n >\r\n @if(type === 'password') {\r\n <button type=\"button\" class=\"password-toggle\" (click)=\"togglePassword()\" tabindex=\"-1\">\r\n <mat-icon>{{showPassword ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n </button>\r\n }\r\n @if(suffixIcon && type !== 'password') {\r\n <mat-icon class=\"input-icon suffix-icon\">{{suffixIcon}}</mat-icon>\r\n }\r\n </div>\r\n\r\n @if(myField.touched && myField.invalid) {\r\n @if(myField.errors?.['required']) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n } @else if(myField.errors?.['email']) {\r\n <mat-hint class=\"hint\">Please enter a valid email address.</mat-hint>\r\n } @else if(myField.errors?.['minlength']) {\r\n <mat-hint class=\"hint\">Minimum {{minLength}} characters required.</mat-hint>\r\n } @else if(myField.errors?.['maxlength']) {\r\n <mat-hint class=\"hint\">Maximum {{maxLength}} characters allowed.</mat-hint>\r\n } @else if(myField.errors?.['min']) {\r\n <mat-hint class=\"hint\">Value must be at least {{min}}.</mat-hint>\r\n } @else if(myField.errors?.['max']) {\r\n <mat-hint class=\"hint\">Value must be at most {{max}}.</mat-hint>\r\n }\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport type TextareaResize = 'none' | 'both' | 'horizontal' | 'vertical';\r\n\r\n@Component({\r\n selector: 'osl-textarea',\r\n standalone: false,\r\n templateUrl: './textarea.html',\r\n styleUrl: './textarea.scss',\r\n})\r\nexport class Osltextarea {\r\n @Input('label') label: string = '';\r\n @Input('rows') rows: number = 3;\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = '';\r\n @Input('placeholder') placeholder: string = '';\r\n @Input('maxLength') maxLength: number | null = null;\r\n @Input('minLength') minLength: number | null = null;\r\n @Input('characterCounter') characterCounter: boolean = false;\r\n @Input('resize') resize: TextareaResize = 'none';\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n get currentLength(): number {\r\n return this.model ? String(this.model).length : 0;\r\n }\r\n\r\n get showCounter(): boolean {\r\n return this.characterCounter && this.maxLength !== null;\r\n }\r\n\r\n get counterClass(): string {\r\n if (this.maxLength === null) return '';\r\n return this.currentLength >= this.maxLength ? 'counter-limit' : '';\r\n }\r\n\r\n onModelChange(event: any) {\r\n this.model = event;\r\n this.modelChange.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label){\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </label>\r\n \r\n </div>\r\n }\r\n \r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <textarea\r\n [rows]=\"rows\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (change)=\"changeEv.emit(model)\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [attr.maxlength]=\"maxLength\"\r\n [attr.minlength]=\"minLength\"\r\n [style.resize]=\"resize\"\r\n #myField=\"ngModel\"\r\n [class.error]=\"myField.touched && myField.invalid\"\r\n ></textarea>\r\n </div>\r\n <div class=\"textarea-footer\">\r\n @if(myField.touched && myField.invalid) {\r\n @if(myField.errors?.['required']) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n } @else if(myField.errors?.['minlength']) {\r\n <mat-hint class=\"hint\">Minimum {{minLength}} characters required.</mat-hint>\r\n } @else if(myField.errors?.['maxlength']) {\r\n <mat-hint class=\"hint\">Maximum {{maxLength}} characters allowed.</mat-hint>\r\n }\r\n } @else {\r\n <span></span>\r\n }\r\n @if(showCounter) {\r\n <span class=\"char-counter\" [class.counter-limit]=\"currentLength >= maxLength!\">\r\n {{currentLength}}/{{maxLength}}\r\n </span>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-select',\r\n standalone: false,\r\n templateUrl: './select.html',\r\n styleUrl: './select.scss',\r\n})\r\nexport class OslSelect {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = null;\r\n @Input('datasource') datasource: any[] = [];\r\n @Input('displayField') displayField: string = '';\r\n @Input('valueField') valueField: string = '';\r\n @Input('placeholder') placeholder: string = 'Select...';\r\n @Input('loading') loading: boolean = false;\r\n @Input('clearable') clearable: boolean = false;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n\r\n getDisplay(item: any): string {\r\n return this.displayField ? item[this.displayField] : item;\r\n }\r\n\r\n getValue(item: any): any {\r\n return this.valueField ? item[this.valueField] : item;\r\n }\r\n\r\n onModelChange(event: any) {\r\n this.model = event === '' ? null : event;\r\n this.modelChange.emit(this.model);\r\n }\r\n\r\n onClear(event: Event) {\r\n event.stopPropagation();\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n }\r\n\r\n onChange() {\r\n this.changeEv.emit(this.model);\r\n }\r\n\r\n get hasValue(): boolean {\r\n return this.model !== null && this.model !== undefined && this.model !== '';\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if (label) {\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </label>\r\n \r\n </div>\r\n\r\n }\r\n\r\n <div class=\"select-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.error]=\"myField.touched && myField.invalid\" [class.select-disabled]=\"disabled || loading\">\r\n @if(loading) {\r\n <span class=\"select-spinner\"></span>\r\n }\r\n <select\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n (change)=\"onChange()\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled || loading\"\r\n #myField=\"ngModel\"\r\n >\r\n <option value=\"\" [disabled]=\"required\" [hidden]=\"required\" selected>{{placeholder}}</option>\r\n @for(item of datasource; track item) {\r\n <option [value]=\"getValue(item)\">{{getDisplay(item)}}</option>\r\n }\r\n </select>\r\n @if(clearable && hasValue && !disabled && !loading) {\r\n <button type=\"button\" class=\"select-clear\" (click)=\"onClear($event)\" title=\"Clear\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-icon class=\"select-arrow\">expand_more</mat-icon>\r\n </div>\r\n\r\n @if(myField.touched && myField.invalid && required) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-radio',\r\n standalone: false,\r\n templateUrl: './radio.html',\r\n styleUrl: './radio.scss',\r\n})\r\nexport class OslRadio {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: any = null;\r\n @Input('datasource') datasource: any[] = [];\r\n @Input('displayField') displayField: string = '';\r\n @Input('valueField') valueField: string = '';\r\n @Input('inline') inline: boolean = false;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n\r\n private static _idCounter = 0;\r\n readonly groupName = `osl_radio_${++OslRadio._idCounter}`;\r\n\r\n getDisplay(item: any): string {\r\n return this.displayField ? item[this.displayField] : item;\r\n }\r\n\r\n getValue(item: any): any {\r\n return this.valueField ? item[this.valueField] : item;\r\n }\r\n\r\n isChecked(item: any): boolean {\r\n return this.model === this.getValue(item);\r\n }\r\n\r\n onSelect(item: any) {\r\n this.model = this.getValue(item);\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label){\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\">{{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span></label>\r\n \r\n </div>\r\n\r\n }\r\n <div class=\"radio-group\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.radio-inline]=\"inline\">\r\n @for(item of datasource; track item) {\r\n <label class=\"radio-item\" [class.disabled]=\"disabled\">\r\n <input\r\n type=\"radio\"\r\n [name]=\"groupName\"\r\n [checked]=\"isChecked(item)\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onSelect(item)\"\r\n >\r\n <span>{{getDisplay(item)}}</span>\r\n </label>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-slide-toggle',\r\n standalone: false,\r\n templateUrl: './slide-toggle.html',\r\n styleUrl: './slide-toggle.scss',\r\n})\r\nexport class OslSlideToggle {\r\n @Input('label') label: string = '';\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: boolean = false;\r\n @Input('labelPosition') labelPosition: 'before' | 'after' = 'after';\r\n @Input('trueLabel') trueLabel: string = '';\r\n @Input('falseLabel') falseLabel: string = '';\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<boolean>();\r\n @Output() changeEv = new EventEmitter<boolean>();\r\n\r\n get stateLabel(): string {\r\n if (this.model && this.trueLabel) return this.trueLabel;\r\n if (!this.model && this.falseLabel) return this.falseLabel;\r\n return '';\r\n }\r\n\r\n onModelChange(event: boolean) {\r\n this.model = event;\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if(label) {\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\">{{label}}</label>\r\n\r\n </div>\r\n }\r\n <div class=\"toggle-row\" [class.reverse]=\"labelPosition === 'before'\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"toggle\" [class.toggle-disabled]=\"disabled\">\r\n <input type=\"checkbox\" [ngModel]=\"model\" (ngModelChange)=\"onModelChange($event)\" [disabled]=\"disabled\">\r\n <span class=\"slider\"></span>\r\n </label>\r\n @if(stateLabel) {\r\n <span class=\"state-label\" [class.state-on]=\"model\" [class.state-off]=\"!model\">{{stateLabel}}</span>\r\n }\r\n </div>\r\n</div>\r\n","import {\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n} from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { debounceTime, distinctUntilChanged } from 'rxjs';\nimport { baseComponent } from '../../../base/base.component';\nimport { AUTOCOMPLETE_LISTER_COMPONENT, oslListerData } from '../autocomplete-lister/autocomplete-lister-types';\nimport { HttpResponse } from '../../../http/httpbase';\n\n@Component({\n selector: 'osl-autocomplete',\n standalone: false,\n templateUrl: './autocomplete.html',\n styleUrl: './autocomplete.scss',\n})\nexport class OslAutocomplete extends baseComponent implements OnInit, OnChanges {\n @Input('label') label: string = '';\n @Input('required') required: boolean = false;\n @Input('disabled') disabled: boolean = false;\n\n private _model: any = null;\n private _object: any;\n\n // Fix: removed if(val) guard — _model must be settable to null/0/false\n @Input('model') set model(val: any) {\n this._model = val;\n if (val !== null && val !== undefined && this._object) {\n this.datasource = [this._object];\n this.filteredItems = [...this.datasource];\n this.syncInputFromModel();\n this.datasourceChange.emit(this.datasource);\n }\n }\n\n get model(): any {\n return this._model;\n }\n\n @Input('datasource') datasource: any[] = [];\n @Output() datasourceChange = new EventEmitter<any>();\n @Input('displayField') displayField: string = '';\n @Input('valueField') valueField: string = '';\n @Input('placeholder') placeholder: string = 'Type to search...';\n @Input('loading') loading: boolean = false;\n @Input('searchType') searchType: 'Local' | 'Api' = 'Local';\n @Input('methodName') methodName: string = '';\n @Input('configMethodName') configMethodName: string = '';\n @Input('service') service: any;\n\n @Input('object') set object(val: any) {\n if (val) {\n this._object = val;\n this.datasource = [val];\n this.filteredItems = [...this.datasource];\n this.datasourceChange.emit(this.datasource);\n }\n if (this._model !== null && this._model !== undefined) {\n this.syncInputFromModel();\n }\n }\n\n @Input('skeletonLoading') skeletonLoading: boolean = false;\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\n @Input('isLister') isLister: boolean = false;\n\n @Output() modelChange = new EventEmitter<any>();\n @Output() changeEv = new EventEmitter<any>();\n\n private listerComponent = inject(AUTOCOMPLETE_LISTER_COMPONENT);\n inputControl = new FormControl('');\n\n inputValue: string = '';\n private _showDropdown: boolean = false;\n get showDropdown(): boolean { return this._showDropdown; }\n set showDropdown(val: boolean) {\n this._showDropdown = val;\n if (val) this.updateDropdownPosition();\n }\n dropdownStyle: { [key: string]: string } = {};\n filteredItems: any[] = [];\n touched: boolean = false;\n\n constructor(\n private elRef: ElementRef,\n public cdr: ChangeDetectorRef,\n ) {\n super();\n }\n\n private updateDropdownPosition() {\n const wrapper = this.elRef.nativeElement.querySelector('.autocomplete-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n this.dropdownStyle = {\n 'position': 'fixed',\n 'top': `${rect.bottom + 5}px`,\n 'left': `${rect.left}px`,\n 'width': `${rect.width}px`,\n };\n this.cdr.markForCheck();\n }\n\n openLister() {\n const inputLister: oslListerData = {\n title: this.label,\n methodName: this.methodName,\n configMethodName: this.configMethodName,\n service: this.service,\n };\n const dialogRef = this.openDialog(\n undefined,\n undefined,\n undefined,\n '60vw',\n inputLister,\n this.listerComponent,\n );\n dialogRef.afterClosed().subscribe((selectedRow: any) => {\n if (selectedRow && selectedRow[this.valueField]) {\n this.datasource = [selectedRow];\n this.datasourceChange.emit(this.datasource);\n this.filteredItems = [...this.datasource];\n this.selectItem(selectedRow);\n }\n });\n }\n\n ngOnInit() {\n if (this.searchType === 'Api' && this.methodName && this.service) {\n this.placeholder = this.isLister ? 'Type to Search Or Press Enter' : 'Type to Search';\n\n // Fix: [formControl] already updates inputControl on user input, so valueChanges\n // fires once per keystroke. Do NOT call inputControl.setValue() inside onInput\n // for API mode to avoid double emission.\n this.inputControl.valueChanges\n .pipe(debounceTime(500), distinctUntilChanged())\n .subscribe(async (value) => {\n if (!value) return;\n const res: HttpResponse = await this.service[this.methodName](value);\n if (!res.isSuccessful) return;\n this.datasource = res?.result && Array.isArray(res?.result) ? res.result : res?.result?.data;\n this.datasourceChange.emit(this.datasource);\n this.filteredItems = this.datasource;\n this.cdr.markForCheck();\n });\n\n if (this._object) {\n this.datasource = [this._object];\n this.datasourceChange.emit(this.datasource);\n this.filteredItems = [...this.datasource];\n }\n }\n this.syncInputFromModel();\n this.cdr.markForCheck();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['datasource']) {\n this.filteredItems = [...(this.datasource || [])];\n // Only sync when dropdown is closed (user is not actively typing/searching)\n if (!this._showDropdown) {\n this.syncInputFromModel();\n }\n }\n if (changes['model']) {\n this.syncInputFromModel();\n }\n }\n\n private syncInputFromModel() {\n if (this._model !== null && this._model !== undefined) {\n const found = this.datasource.find((item) => this.getValue(item) === this._model);\n if (found) {\n const display = this.getDisplay(found);\n this.inputValue = display;\n this.inputControl.setValue(display, { emitEvent: false });\n }\n } else {\n this.inputValue = '';\n this.inputControl.setValue('', { emitEvent: false });\n }\n this.cdr.markForCheck();\n }\n\n getDisplay(item: any): string {\n return item && this.displayField ? item[this.displayField] : String(item);\n }\n\n getValue(item: any): any {\n return this.valueField ? item[this.valueField] : item;\n }\n\n get isInvalid(): boolean {\n return this.touched && this.required && !this._model;\n }\n\n onInput(val: string) {\n // Fix: set _model directly so null is always stored, bypassing the setter's\n // datasource-refresh side effect which should only run on external model changes\n this._model = null;\n this.inputValue = val;\n\n if (this.searchType === 'Local') {\n this.showDropdown = true;\n this.filteredItems = this.datasource.filter((item) =>\n this.getDisplay(item)?.toLowerCase()?.includes(val?.toLowerCase()),\n );\n if (!val) {\n this.modelChange.emit(null);\n this.changeEv.emit(null);\n }\n } else {\n // API mode: [formControl] already updated inputControl, valueChanges handles the search\n if (!val) {\n this.filteredItems = [];\n this.showDropdown = false;\n this.modelChange.emit(null);\n this.changeEv.emit(null);\n } else {\n this.showDropdown = true;\n }\n }\n }\n\n onFocus() {\n if (this.loading) return;\n this.showDropdown = true;\n if (this.searchType === 'Local') {\n this.filteredItems = this.datasource.filter((item) =>\n this.getDisplay(item)?.toLowerCase()?.includes(this.inputValue?.toLowerCase()),\n );\n }\n }\n\n onFocusOut() {\n this.touched = true;\n this.showDropdown = false;\n // Fix: removed auto-select-on-single-match — it caused refill when user\n // cleared text and datasource had only 1 item.\n // If no selection was made, clear the typed text.\n if (this._model === null || this._model === undefined) {\n this.inputValue = '';\n this.inputControl.setValue('', { emitEvent: false });\n }\n this.cdr.markForCheck();\n }\n\n clearValue(event?: Event) {\n event?.stopPropagation();\n // Fix: set _model directly to null — using the setter would trigger the\n // datasource-refresh side effect unnecessarily\n this._model = null;\n this.inputValue = '';\n this.inputControl.setValue('', { emitEvent: false });\n this.showDropdown = false;\n this.modelChange.emit(null);\n this.changeEv.emit(null);\n this.cdr.markForCheck();\n }\n\n selectItem(item: any) {\n const display = this.getDisplay(item);\n const value = this.getValue(item);\n this.inputValue = display;\n this.inputControl.setValue(display, { emitEvent: false });\n this._model = value;\n this.modelChange.emit(value);\n this.changeEv.emit(value);\n this.showDropdown = false;\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent) {\n if (!this.elRef.nativeElement.contains(event.target)) {\n this.showDropdown = false;\n }\n }\n}\n","<div class=\"d-flex flex-column\">\n @if(label){\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\n <label class=\"label\" [class.txt-clr-red]=\"isInvalid\">\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\n </label>\n\n </div>\n\n }\n <div class=\"autocomplete-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.error]=\"isInvalid\" [class.autocomplete-wrapper--api]=\"searchType == 'Api'\">\n <input\n (input)=\"onInput($any($event.target).value)\"\n (focus)=\"onFocus()\"\n (focusout)=\"onFocusOut()\"\n [disabled]=\"disabled || loading\"\n [formControl]=\"inputControl\"\n [class.error]=\"isInvalid\"\n [placeholder]=\"loading ? 'Loading...' : placeholder\"\n autocomplete=\"off\"\n (keyup.enter)=\"searchType == 'Api' ? openLister() : null\"\n >\n @if(loading) {\n <span class=\"ac-spinner\"></span>\n } @else {\n @if(inputControl.value && !disabled) {\n <button type=\"button\" class=\"ac-clear\" [class.ac-clear--shifted]=\"searchType == 'Api'\" (mousedown)=\"clearValue($event)\" tabindex=\"-1\" title=\"Clear\">\n <mat-icon>close</mat-icon>\n </button>\n }\n @if(searchType == 'Api' && isLister && !disabled) {\n <button type=\"button\" class=\"ac-lister-btn\" (mousedown)=\"$event.preventDefault(); openLister()\" tabindex=\"-1\" title=\"Browse list or press Enter\">\n <mat-icon>manage_search</mat-icon>\n </button>\n }\n }\n @if(showDropdown && !loading) {\n <div class=\"dropdown\" [ngStyle]=\"dropdownStyle\">\n @if(filteredItems.length > 0) {\n @for(item of filteredItems; track item) {\n <div class=\"dropdown-item\" (mousedown)=\"selectItem(item)\">{{getDisplay(item)}}</div>\n }\n } @else {\n @if(searchType == 'Local'){\n <div class=\"no-results\">No results found</div>\n }\n }\n </div>\n }\n </div>\n @if(isInvalid) {\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\n }\n</div>\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-file-upload',\r\n standalone: false,\r\n templateUrl: './file-upload.html',\r\n styleUrl: './file-upload.scss',\r\n})\r\nexport class OslFileUpload {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('model') model: File | File[] | null = null;\r\n @Input('accept') accept: string = '';\r\n @Input('multiple') multiple: boolean = false;\r\n /** Max file size in bytes. 0 = no limit. */\r\n @Input('maxSize') maxSize: number = 0;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<File | File[] | null>();\r\n @Output() changeEv = new EventEmitter<File | File[] | null>();\r\n\r\n touched = false;\r\n isDragOver = false;\r\n sizeError = false;\r\n\r\n get fileNames(): string {\r\n if (!this.model) return '';\r\n if (Array.isArray(this.model)) return this.model.map(f => f.name).join(', ');\r\n return this.model.name;\r\n }\r\n\r\n get isInvalid(): boolean {\r\n return this.touched && this.required && !this.model;\r\n }\r\n\r\n onFileChange(event: Event) {\r\n this.touched = true;\r\n const input = event.target as HTMLInputElement;\r\n this.processFiles(input.files);\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n if (!this.disabled) this.isDragOver = true;\r\n }\r\n\r\n onDragLeave() {\r\n this.isDragOver = false;\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n this.isDragOver = false;\r\n if (this.disabled) return;\r\n this.touched = true;\r\n this.processFiles(event.dataTransfer?.files ?? null);\r\n }\r\n\r\n private processFiles(files: FileList | null) {\r\n if (!files || files.length === 0) return;\r\n this.sizeError = false;\r\n\r\n if (this.maxSize > 0) {\r\n for (let i = 0; i < files.length; i++) {\r\n if (files[i].size > this.maxSize) {\r\n this.sizeError = true;\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n if (this.multiple) {\r\n this.model = Array.from(files);\r\n } else {\r\n this.model = files[0];\r\n }\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n\r\n triggerInput(fileInput: HTMLInputElement) {\r\n if (!this.disabled) fileInput.click();\r\n }\r\n\r\n clearFiles(event: Event) {\r\n event.stopPropagation();\r\n this.model = null;\r\n this.sizeError = false;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n }\r\n\r\n get maxSizeLabel(): string {\r\n if (!this.maxSize) return '';\r\n if (this.maxSize >= 1024 * 1024) return `Max ${(this.maxSize / 1024 / 1024).toFixed(1)} MB`;\r\n if (this.maxSize >= 1024) return `Max ${(this.maxSize / 1024).toFixed(0)} KB`;\r\n return `Max ${this.maxSize} B`;\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"isInvalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </label>\r\n </div>\r\n\r\n <input\r\n type=\"file\"\r\n [accept]=\"accept\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onFileChange($event)\"\r\n #fileInput\r\n class=\"file-input\"\r\n >\r\n\r\n <div\r\n [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\"\r\n class=\"drop-zone\"\r\n [class.error]=\"isInvalid || sizeError\"\r\n [class.file-disabled]=\"disabled\"\r\n [class.drag-over]=\"isDragOver\"\r\n [class.has-file]=\"!!model\"\r\n (click)=\"triggerInput(fileInput)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave()\"\r\n (drop)=\"onDrop($event)\"\r\n >\r\n @if(!model) {\r\n <div class=\"drop-content\">\r\n <mat-icon class=\"upload-icon\">upload_file</mat-icon>\r\n <div class=\"drop-text\">\r\n <span class=\"browse-link\">Browse</span> or drag & drop\r\n </div>\r\n @if(accept) { <div class=\"drop-meta\">{{accept}}</div> }\r\n @if(maxSize) { <div class=\"drop-meta\">{{maxSizeLabel}}</div> }\r\n </div>\r\n } @else {\r\n <div class=\"file-list\">\r\n <mat-icon class=\"file-icon\">insert_drive_file</mat-icon>\r\n <span class=\"file-name\">{{fileNames}}</span>\r\n <button type=\"button\" class=\"clear-btn\" (click)=\"clearFiles($event)\" title=\"Remove\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if(sizeError) {\r\n <mat-hint class=\"hint\">File exceeds the {{maxSizeLabel}} limit.</mat-hint>\r\n } @else if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport type DateInputType = 'date' | 'datetime-local' | 'time' | 'month' | 'week';\r\n\r\n@Component({\r\n selector: 'osl-datepicker',\r\n standalone: false,\r\n templateUrl: './datepicker.html',\r\n styleUrl: './datepicker.scss',\r\n})\r\nexport class OslDatepicker {\r\n @Input('label') label: string = '';\r\n @Input('required') required: boolean = false;\r\n @Input('disabled') disabled: boolean = false;\r\n\r\n dateValue: Date | null = null;\r\n\r\n private _model: string = '';\r\n @Input('model') set model(val: string) {\r\n this._model = val\r\n // const clean = val?.includes('T') ? val.split('T')[0] : (val ?? '');\r\n // if (clean === this._model) return;\r\n // this._model = clean;\r\n // this.dateValue = clean ? this._toDate(clean) : null;\r\n }\r\n get model(): string { return this._model; }\r\n\r\n @Input('dateType') dateType: DateInputType = 'date';\r\n @Input('placeholder') placeholder: string = '';\r\n\r\n private _minDate: string = '';\r\n minDateObj: Date | null = null;\r\n @Input('minDate') set minDate(val: string) {\r\n this._minDate = val ?? '';\r\n this.minDateObj = this._minDate ? this._toDate(this._minDate) : null;\r\n }\r\n get minDate(): string { return this._minDate; }\r\n\r\n private _maxDate: string = '';\r\n maxDateObj: Date | null = null;\r\n @Input('maxDate') set maxDate(val: string) {\r\n this._maxDate = val ?? '';\r\n this.maxDateObj = this._maxDate ? this._toDate(this._maxDate) : null;\r\n }\r\n get maxDate(): string { return this._maxDate; }\r\n\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<string>();\r\n @Output() changeEv = new EventEmitter<string>();\r\n\r\n onDateChange(date: Date | null) {\r\n const newModel = date? this._toString(date):null\r\n if (newModel === this._model) return;\r\n if(newModel)this._model = newModel;\r\n this.modelChange.emit(this._model);\r\n this.changeEv.emit(this._model);\r\n }\r\n\r\n private _toDate(str: string): Date | null {\r\n const d = new Date(str + 'T00:00:00');\r\n return isNaN(d.getTime()) ? null : d;\r\n }\r\n\r\n private _toString(date: Date): string {\r\n const d = new Date(date)\r\n const localISO =\r\n d.getFullYear() + \"-\" +\r\n String(d.getMonth() + 1).padStart(2, \"0\") + \"-\" +\r\n String(d.getDate()).padStart(2, \"0\") + \"T\" +\r\n String(d.getHours()).padStart(2, \"0\") + \":\" +\r\n String(d.getMinutes()).padStart(2, \"0\") + \":\" +\r\n String(d.getSeconds()).padStart(2, \"0\");\r\n return localISO\r\n\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n @if (label) {\r\n <div [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <label class=\"label\" [class.txt-clr-red]=\"myField.touched && myField.invalid\">\r\n {{label}} <span class=\"txt-clr-red\">{{required ? '*' : ''}}</span>\r\n </label>\r\n </div>\r\n }\r\n <div class=\"input-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <input\r\n class=\"date-input\"\r\n [matDatepicker]=\"picker\"\r\n [ngModel]=\"model\"\r\n \r\n (dateChange)=\"onDateChange($event.value)\"\r\n [required]=\"required\"\r\n [disabled]=\"disabled\"\r\n [min]=\"minDateObj\"\r\n [max]=\"maxDateObj\"\r\n [placeholder]=\"placeholder || 'DD/MMM/YYYY'\"\r\n [class.error]=\"myField.touched && myField.invalid\"\r\n #myField=\"ngModel\"\r\n >\r\n <mat-datepicker-toggle class=\"picker-toggle\" [for]=\"picker\" [disabled]=\"disabled\">\r\n <mat-icon matDatepickerToggleIcon>calendar_today</mat-icon>\r\n </mat-datepicker-toggle>\r\n <mat-datepicker #picker></mat-datepicker>\r\n </div>\r\n @if (myField.touched && myField.invalid && required) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, ElementRef, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'osl-checkbox',\r\n standalone: false,\r\n templateUrl: './checkbox.html',\r\n styleUrl: './checkbox.scss',\r\n})\r\nexport class OslCheckbox implements OnChanges {\r\n @ViewChild('checkboxEl') checkboxEl!: ElementRef<HTMLInputElement>;\r\n\r\n @Input('label') label: string = '';\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('required') required: boolean = false;\r\n @Input('model') model: boolean = false;\r\n @Input('indeterminate') indeterminate: boolean = false;\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<boolean>();\r\n @Output() changeEv = new EventEmitter<boolean>();\r\n\r\n touched = false;\r\n\r\n get isInvalid(): boolean {\r\n return this.touched && this.required && !this.model;\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['indeterminate'] && this.checkboxEl) {\r\n this.checkboxEl.nativeElement.indeterminate = this.indeterminate;\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n if (this.checkboxEl) {\r\n this.checkboxEl.nativeElement.indeterminate = this.indeterminate;\r\n }\r\n }\r\n\r\n onModelChange(event: boolean) {\r\n this.touched = true;\r\n this.model = event;\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n }\r\n}\r\n","<div class=\"d-flex flex-column\">\r\n\r\n <label class=\"checkbox-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.checkbox-disabled]=\"disabled\" [class.checkbox-invalid]=\"isInvalid\">\r\n <input\r\n #checkboxEl\r\n type=\"checkbox\"\r\n [ngModel]=\"model\"\r\n (ngModelChange)=\"onModelChange($event)\"\r\n [disabled]=\"disabled\"\r\n >\r\n <span class=\"checkbox-label\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n {{label}} <span class=\"txt-clr-red\">{{required?'*':''}}</span>\r\n </span>\r\n </label>\r\n @if(isInvalid) {\r\n <mat-hint class=\"hint\">{{label}} is Required!</mat-hint>\r\n }\r\n</div>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\nexport type ButtonVariant =\r\n | 'primary'\r\n | 'secondary'\r\n | 'success'\r\n | 'danger'\r\n | 'warning'\r\n | 'info'\r\n | 'outline-primary'\r\n | 'outline-secondary'\r\n | 'outline-success'\r\n | 'outline-danger'\r\n | 'outline-warning'\r\n | 'outline-info'\r\n | 'icon'\r\n\r\nexport type ButtonSize = 'sm' | 'md' | 'lg';\r\n\r\n@Component({\r\n selector: 'osl-button',\r\n standalone: false,\r\n templateUrl: './button.html',\r\n styleUrl: './button.scss',\r\n})\r\nexport class OslButton {\r\n @Input('label') label: string = 'Button';\r\n @Input('icon') icon: string = '';\r\n @Input('variant') variant: ButtonVariant = 'primary';\r\n @Input('size') size: ButtonSize = 'md';\r\n @Input('disabled') disabled: boolean = false;\r\n @Input('loading') loading: boolean = false;\r\n @Input('type') type: 'button' | 'submit' | 'reset' = 'button';\r\n @Input('fullWidth') fullWidth: boolean = false;\r\n @Output() clickEv = new EventEmitter<void>();\r\n\r\n get classes(): string {\r\n return [\r\n 'osl-btn',\r\n `osl-btn--${this.variant}`,\r\n `osl-btn--${this.size}`,\r\n this.fullWidth ? 'osl-btn--full' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n onClick() {\r\n if (!this.disabled && !this.loading) {\r\n this.clickEv.emit();\r\n }\r\n }\r\n}\r\n","@if (variant == 'icon' && icon) {\r\n <button class=\"icon-btn\" [type]=\"type\" [disabled]=\"disabled || loading\" (click)=\"onClick()\">\r\n @if (loading) {\r\n <span class=\"osl-btn__spinner\"></span>\r\n } @else {\r\n <mat-icon>{{ icon }}</mat-icon>\r\n }\r\n </button>\r\n} @else {\r\n <button [class]=\"classes\" [type]=\"type\" [disabled]=\"disabled || loading\" (click)=\"onClick()\">\r\n @if (loading) {\r\n <span class=\"osl-btn__spinner\"></span>\r\n }\r\n <span class=\"osl-btn__label\">{{ label }}</span>\r\n @if (icon) {\r\n <span class=\"osl-btn__label-icon\"\r\n ><mat-icon>{{ icon }}</mat-icon></span\r\n >\r\n }\r\n </button>\r\n}\r\n","import { ChangeDetectorRef, Component, EventEmitter, inject, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef } from '@angular/core';\r\nimport { DatasourceCacheService } from '../datasource-cache/datasource-cache.service';\r\nimport { InputType } from '../input/input';\r\nimport { DateInputType } from '../datepicker/datepicker';\r\nimport { TextareaResize } from '../textarea/textarea';\r\n\r\n@Component({\r\n selector: 'osl-dynamic-form',\r\n standalone: false,\r\n templateUrl: './dynamic-form.html',\r\n styleUrl: './dynamic-form.scss',\r\n})\r\nexport class DynamicForm implements OnInit, OnChanges {\r\n @Input('elements') elements: elements[] = [];\r\n private _model: any;\r\n @Input('model') set model(val:any){\r\n this._model = val\r\n\r\n }\r\n get model(){\r\n return this._model\r\n }\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n\r\n\r\n private datasourceCache = inject(DatasourceCacheService);\r\n constructor(public cdr:ChangeDetectorRef){\r\n\r\n }\r\n ngOnInit(): void {\r\n this.loadApiDatasources();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['elements']) {\r\n this.loadApiDatasources();\r\n }\r\n }\r\n\r\n private loadApiDatasources(): void {\r\n this._loadForList(this.elements);\r\n }\r\n\r\n private async _loadForList(list: elements[]): Promise<void> {\r\n for (const elem of list) {\r\n if (elem.elementType === 'fieldset' && elem.rows?.length) {\r\n this._loadForList(elem.rows);\r\n } else if (elem.apiService && elem.apiMethod && (!elem.searchType || elem.searchType == 'Local')) {\r\n elem.loadingIf = ()=>true\r\n const data = await this.datasourceCache.load(elem.apiService, elem.apiMethod, elem.apiBody? elem.apiBody(this.model):null)\r\n elem.loadingIf = ()=>false\r\n this.cdr.markForCheck()\r\n\r\n if(data && data.length > 0){\r\n elem.datasource = data;\r\n\r\n\r\n }\r\n }\r\n }\r\n }\r\n\r\n onModelChange(event: any, key: any) {\r\n this.model[key] = event;\r\n this.modelChange.emit(this.model);\r\n }\r\n\r\n onSelectChange(elem: elements, value: any) {\r\n if (!elem.change) return;\r\n let selectedObj: any = undefined;\r\n if (elem.datasource) {\r\n if (Array.isArray(value)) {\r\n selectedObj = value.map(v =>\r\n elem.datasource!.find(item => (elem.valueField ? item[elem.valueField] : item) === v) ?? null\r\n );\r\n } else if (value !== null && value !== undefined) {\r\n selectedObj = elem.datasource.find(item =>\r\n (elem.valueField ? item[elem.valueField] : item) === (isNaN(Number(value))?value:Number(value))\r\n ) ?? null;\r\n } else {\r\n selectedObj = null;\r\n }\r\n }\r\n elem.change(this.model, undefined, selectedObj);\r\n }\r\n}\r\n\r\nexport interface elements {\r\n columns: number;\r\n label: string;\r\n elementType: 'button' | 'checkbox' | 'textbox' | 'textarea' | 'radio' | 'select' | 'datepicker' | 'file-uploader' | 'autocomplete' | 'slide-toggle' | 'fieldset' | 'templateRef' | 'chips-input' | 'spacer';\r\n key: string;\r\n /** Child elements rendered inside a fieldset. Only used when elementType is 'fieldset'. */\r\n rows?: elements[];\r\n change?: (model: any, index?: any, selectedObj?: any) => void;\r\n disabled?: boolean;\r\n hide?: boolean;\r\n disabledIf?: (row:any, index?:any) => boolean;\r\n hideIf?: (model: any) => boolean;\r\n minDateIf?: (model: any) => string;\r\n maxDateIf?: (model: any) => string;\r\n datasource?: any[];\r\n displayField?: string;\r\n valueField?: string;\r\n required?: boolean;\r\n requiredIf?: (model: any) => boolean;\r\n loadingIf?: (model: any) => boolean;\r\n /** API-based datasource loading */\r\n apiService?: any;\r\n apiMethod?: string;\r\n apiConfigMethod?: string;\r\n apiBody?:(model:any)=>any,\r\n\r\n // ── osl-input ─────────────────────────────────────\r\n inputType?: InputType;\r\n placeholder?: string;\r\n /** Mask pattern: 0=digit, A=letter, *=alphanumeric. E.g. '(000) 000-0000' */\r\n mask?: string;\r\n min?: string | number;\r\n max?: string | number;\r\n minLength?: number;\r\n maxLength?: number;\r\n prefixIcon?: string;\r\n suffixIcon?: string;\r\n onlyChars?: boolean;\r\n /** Enforce N decimal places on osl-input. Shows 0.00 when blank; auto-pads on blur. */\r\n decimalPortion?: number;\r\n\r\n // ── osl-textarea ──────────────────────────────────\r\n textareaRows?: number;\r\n characterCounter?: boolean;\r\n resize?: TextareaResize;\r\n\r\n // ── osl-select ────────────────────────────────────\r\n selectPlaceholder?: string;\r\n clearable?: boolean;\r\n /** Enable multi-select mode — model becomes any[]. */\r\n selectMultiple?: boolean;\r\n /** Show a \"Select All\" checkbox at the top of the multi-select dropdown. Only applies when selectMultiple is true. */\r\n showSelectAll?: boolean;\r\n\r\n // ── osl-datepicker ────────────────────────────────\r\n dateType?: DateInputType;\r\n minDate?: string;\r\n maxDate?: string;\r\n\r\n // ── osl-radio ─────────────────────────────────────\r\n inline?: boolean;\r\n\r\n // ── osl-slide-toggle ──────────────────────────────\r\n labelPosition?: 'before' | 'after';\r\n trueLabel?: string;\r\n falseLabel?: string;\r\n\r\n // ── osl-file-upload ───────────────────────────────\r\n accept?: string;\r\n multiple?: boolean;\r\n maxFileSize?: number;\r\n\r\n // ── osl-checkbox ──────────────────────────────────\r\n indeterminate?: boolean;\r\n\r\n // ── osl-autocomplete ──────────────────────────────\r\n autocompletePlaceholder?: string;\r\n /** Enable multiple selection with checkboxes — model becomes any[]. */\r\n autocompleteMultiple?: boolean;\r\n\r\n templateRef?:TemplateRef<any>\r\n searchType?:'Api' | 'Local';\r\n objectName?:string;\r\n isListerAutocomplete?:boolean\r\n isCapitalize?:boolean\r\n}\r\n","@if(elements && elements.length > 0) {\r\n <div class=\"row align-items-center w-100\">\r\n @for(elem of elements; track elem) {\r\n @if(!(elem.hideIf ? elem.hideIf(model) : elem.hide)) {\r\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: elem }\"></ng-container>\r\n }\r\n }\r\n </div>\r\n}\r\n\r\n<ng-template #formField let-elem>\r\n @if(elem.hideIf ? !elem.hideIf(model) : true) {\r\n @switch (elem.elementType) {\r\n\r\n @case (\"textbox\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-input\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [type]=\"elem.inputType || 'text'\"\r\n [placeholder]=\"elem.placeholder || ''\"\r\n [mask]=\"elem.mask || ''\"\r\n [min]=\"elem.min ?? ''\"\r\n [max]=\"elem.max ?? ''\"\r\n [minLength]=\"elem.minLength ?? null\"\r\n [maxLength]=\"elem.maxLength ?? null\"\r\n [prefixIcon]=\"elem.prefixIcon || ''\"\r\n [suffixIcon]=\"elem.suffixIcon || ''\"\r\n [onlyChars]=\"!!elem.onlyChars\"\r\n [decimalPortion]=\"elem.decimalPortion ?? null\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n [isCapitalize]=\"elem.isCapitalize\"\r\n ></osl-input>\r\n </div>\r\n }\r\n\r\n @case (\"textarea\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-textarea\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [rows]=\"elem.textareaRows || 3\"\r\n [placeholder]=\"elem.placeholder || ''\"\r\n [maxLength]=\"elem.maxLength ?? null\"\r\n [minLength]=\"elem.minLength ?? null\"\r\n [characterCounter]=\"!!elem.characterCounter\"\r\n [resize]=\"elem.resize || 'none'\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-textarea>\r\n </div>\r\n }\r\n\r\n @case (\"select\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-select\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [datasource]=\"elem.datasource || []\"\r\n [displayField]=\"elem.displayField || ''\"\r\n [valueField]=\"elem.valueField || ''\"\r\n [placeholder]=\"elem.selectPlaceholder || 'Select...'\"\r\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\r\n [clearable]=\"!!elem.clearable\"\r\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-select>\r\n </div>\r\n }\r\n\r\n @case (\"radio\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-radio\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [datasource]=\"elem.datasource || []\"\r\n [displayField]=\"elem.displayField || ''\"\r\n [valueField]=\"elem.valueField || ''\"\r\n [inline]=\"!!elem.inline\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-radio>\r\n </div>\r\n }\r\n\r\n @case (\"slide-toggle\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-slide-toggle\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [labelPosition]=\"elem.labelPosition || 'after'\"\r\n [trueLabel]=\"elem.trueLabel || ''\"\r\n [falseLabel]=\"elem.falseLabel || ''\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-slide-toggle>\r\n </div>\r\n }\r\n\r\n @case (\"autocomplete\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-autocomplete\r\n [label]=\"elem.label\"\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [(datasource)]=\"elem.datasource\"\r\n [displayField]=\"elem.displayField || ''\"\r\n [valueField]=\"elem.valueField || ''\"\r\n [placeholder]=\"elem.autocompletePlaceholder || 'Type to search...'\"\r\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\r\n (changeEv)=\"elem.change ? onSelectChange(elem, $event) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n [methodName]=\"elem.apiMethod\"\r\n [service]=\"elem.apiService\"\r\n [object]=\"model[elem.objectName]\"\r\n [searchType]=\"elem.searchType\"\r\n [configMethodName]=\"elem.apiConfigMethod\"\r\n [isLister]=\"elem.isListerAutocomplete\"\r\n \r\n \r\n ></osl-autocomplete>\r\n </div>\r\n }\r\n\r\n @case (\"file-uploader\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-file-upload\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [accept]=\"elem.accept || ''\"\r\n [multiple]=\"!!elem.multiple\"\r\n [maxSize]=\"elem.maxFileSize || 0\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-file-upload>\r\n </div>\r\n }\r\n\r\n @case (\"datepicker\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-datepicker\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [dateType]=\"elem.dateType || 'date'\"\r\n [placeholder]=\"elem.placeholder || ''\"\r\n [minDate]=\"elem.minDateIf ? elem.minDateIf(model): elem.minDate ? elem.minDate : ''\"\r\n [maxDate]=\"elem.maxDateIf ? elem.maxDateIf(model): elem.maxDate ? elem.maxDate : ''\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-datepicker>\r\n </div>\r\n }\r\n\r\n @case (\"checkbox\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-checkbox\r\n [skeletonLoading]=\"skeletonLoading\"\r\n [skeletonTheme]=\"skeletonTheme\"\r\n\r\n [label]=\"elem.label\"\r\n [disabled]=\"elem.disabledIf ? elem.disabledIf(model) : !!elem.disabled\"\r\n [required]=\"elem.requiredIf ? elem.requiredIf(model) : !!elem.required\"\r\n [indeterminate]=\"!!elem.indeterminate\"\r\n (changeEv)=\"elem.change ? elem.change(model) : null\"\r\n [(model)]=\"model[elem.key]\"\r\n ></osl-checkbox>\r\n </div>\r\n }\r\n\r\n @case (\"button\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-2'\">\r\n <osl-button\r\n \r\n [label]=\"elem.label\"\r\n [loading]=\"elem.loadingIf ? elem.loadingIf(model) : false\"\r\n variant=\"secondary\"\r\n (clickEv)=\"elem.change ? elem.change(model) : null\"\r\n ></osl-button>\r\n </div>\r\n }\r\n\r\n @case (\"fieldset\") {\r\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\r\n <fieldset class=\"osl-fieldset\">\r\n @if(elem.label) {\r\n <legend class=\"osl-fieldset-legend\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\">\r\n <span class=\"osl-fieldset-legend__text\">{{ elem.label }}</span>\r\n </legend>\r\n }\r\n <div class=\"row w-100 osl-fieldset-body\">\r\n @for(innerElem of elem.rows; track innerElem) {\r\n @if(!(innerElem.hideIf ? innerElem.hideIf(model) : innerElem.hide)) {\r\n <ng-container *ngTemplateOutlet=\"formField; context: { $implicit: innerElem }\"></ng-container>\r\n }\r\n }\r\n </div>\r\n </fieldset>\r\n </div>\r\n }\r\n\r\n @case (\"templateRef\"){\r\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\r\n <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container>\r\n\r\n \r\n </div>\r\n }\r\n @case (\"spacer\"){\r\n <div [class]=\"'col-md-'+elem.columns+' mt-3'\">\r\n <!-- <ng-container *ngTemplateOutlet=\"elem.templateRef; context: { $implicit: elem}\"></ng-container> -->\r\n\r\n \r\n </div>\r\n }\r\n\r\n }\r\n }\r\n</ng-template>\r\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\r\n\r\n import { FormControl } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\r\n@Component({\r\n selector: 'osl-searchbar',\r\n standalone:false,\r\n templateUrl: './searchbar.html',\r\n styleUrl: './searchbar.scss',\r\n})\r\nexport class OslSearchbar {\r\n @Input('label') label:string=\"Type to Search...\"\r\n @Output() onSearch = new EventEmitter<any>();\r\n\r\n searchQuery:string=\"\"\r\n\r\n\r\nsearchControl = new FormControl('');\r\n\r\nngOnInit() {\r\n this.searchControl.valueChanges.pipe(\r\n debounceTime(300),\r\n distinctUntilChanged()\r\n ).subscribe(value => {\r\n this.onSearch.emit(value)\r\n });\r\n}\r\n}\r\n"," <div class=\"search-wrap\" [class.focused]=\"searchQuery.length > 0\">\r\n <svg class=\"search-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\">\r\n <circle cx=\"11\" cy=\"11\" r=\"8\"/>\r\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/>\r\n </svg>\r\n <input\r\n type=\"text\"\r\n [formControl]=\"searchControl\"\r\n class=\"search-input\"\r\n [placeholder]=\"label\"\r\n [(ngModel)]=\"searchQuery\"\r\n />\r\n \r\n \r\n </div>","import { Component, EventEmitter, HostListener, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\n\r\nexport type OslDisplayType = 'date' | 'datetime' | 'time' | 'link';\r\n\r\nexport interface OslGridColumn {\r\n key: string;\r\n label: string;\r\n enums?: { value: any; label: string }[];\r\n displayFn?: (value: any, row: any) => string;\r\n /** When true, renders edit + delete icon buttons instead of cell text. */\r\n isActions?: boolean;\r\n /** Applies a built-in transform to the cell value. 'date' → dd/MM/yyyy, 'datetime' → dd/MM/yyyy HH:mm, 'time' → HH:mm */\r\n displayType?: OslDisplayType;\r\n click?:(row:any,col:any)=>void;\r\n}\r\n\r\nexport interface OslMenuAction {\r\n label: string;\r\n labelIf?: (row: any) => string;\r\n hideIf?: (row: any) => boolean;\r\n click: (row: any) => void;\r\n}\r\n\r\nexport interface OslSortEvent {\r\n key: string;\r\n asc: boolean;\r\n}\r\n\r\nexport interface OslPageEvent {\r\n page: number;\r\n pageSize: number;\r\n searchValue?:any;\r\n}\r\n\r\n@Component({\r\n selector: 'osl-grid',\r\n standalone: false,\r\n templateUrl: './grid.html',\r\n styleUrl: './grid.scss',\r\n})\r\nexport class OslGrid implements OnChanges {\r\n @Input('columns') columns: OslGridColumn[] = [];\r\n @Input('datasource') datasource: any[] = [];\r\n @Output() datasourceChange = new EventEmitter<any[]>();\r\n\r\n @Input('isPaginated') isPaginated: boolean = false;\r\n @Input('pageSize') pageSize: number = 25;\r\n\r\n /** When true, component handles sorting/pagination internally.\r\n * When false, events fire and the host is responsible for updating datasource. */\r\n @Input('autoMode') autoMode: boolean = true;\r\n\r\n @Input('totalRecords') totalRecords: number = 0;\r\n\r\n /** Height of the scrollable table body. Defaults to fill remaining viewport.\r\n * Pass any valid CSS value: '400px', 'calc(100vh - 200px)', etc. */\r\n @Input('tableHeight') tableHeight: string = 'calc(100vh - 200px)';\r\n\r\n /** When true, shows skeleton loading rows instead of data. */\r\n @Input('loading') loading: boolean = false;\r\n @Input('isSelectable') isSelectable: boolean = false;\r\n @Input('moreMenuActions') moreMenuActions: OslMenuAction[] = [];\r\n @Input('canEdit') canEdit: boolean = true;\r\n @Input('canDelete') canDelete: boolean = true;\r\n\r\n @Output() pageChange = new EventEmitter<OslPageEvent>();\r\n @Output() pageSizeChange = new EventEmitter<OslPageEvent>();\r\n @Output() sortChange = new EventEmitter<OslSortEvent>();\r\n @Output() editClick = new EventEmitter<any>();\r\n @Output() deleteClick = new EventEmitter<any>();\r\n @Output() onRowClick = new EventEmitter<any>();\r\n\r\n currentPage = 1;\r\n sortKey: string = '';\r\n sortAsc: boolean = true;\r\n pageSizeOptions = [10, 25, 50, 100];\r\n openMenuIndex: number | null = null;\r\n menuPosition = { top: 0, left: 0 };\r\n\r\n @HostListener('document:click')\r\n onDocumentClick(): void {\r\n this.openMenuIndex = null;\r\n }\r\n\r\n toggleMenu(index: number, event: Event): void {\r\n event.stopPropagation();\r\n if (this.openMenuIndex === index) {\r\n this.openMenuIndex = null;\r\n return;\r\n }\r\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\r\n const menuWidth = 190;\r\n const left = Math.min(\r\n Math.max(rect.right - menuWidth, 8),\r\n window.innerWidth - menuWidth - 8\r\n );\r\n this.menuPosition = { top: rect.bottom + 6, left };\r\n this.openMenuIndex = index;\r\n }\r\n\r\n closeMenu(): void {\r\n this.openMenuIndex = null;\r\n }\r\n\r\n get skeletonRows(): number[] {\r\n return Array.from({ length: Math.min(this.pageSize, 10) });\r\n }\r\n\r\n get skeletonColumns(): number[] {\r\n return Array.from({ length: 5 });\r\n }\r\n\r\n get _total(): number {\r\n return this.autoMode ? this.datasource.length : this.totalRecords;\r\n }\r\n\r\n get totalPages(): number {\r\n return Math.ceil(this._total / this.pageSize) || 1;\r\n }\r\n\r\n get sortedData(): any[] {\r\n if (!this.autoMode || !this.sortKey) return [...this.datasource];\r\n return [...this.datasource].sort((a, b) => {\r\n const va = a[this.sortKey] ?? '';\r\n const vb = b[this.sortKey] ?? '';\r\n const cmp = String(va).localeCompare(String(vb), undefined, { numeric: true });\r\n return this.sortAsc ? cmp : -cmp;\r\n });\r\n }\r\n\r\n get pagedData(): any[] {\r\n if (!this.isPaginated || !this.autoMode) return this.sortedData;\r\n const start = (this.currentPage - 1) * this.pageSize;\r\n return this.sortedData.slice(start, start + this.pageSize);\r\n }\r\n\r\n get pageNumbers(): number[] {\r\n const total = this.totalPages;\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n const pages: number[] = [1];\r\n if (this.currentPage > 3) pages.push(-1);\r\n for (let i = Math.max(2, this.currentPage - 1); i <= Math.min(total - 1, this.currentPage + 1); i++) {\r\n pages.push(i);\r\n }\r\n if (this.currentPage < total - 2) pages.push(-1);\r\n pages.push(total);\r\n return pages;\r\n }\r\n\r\n get startRecord(): number {\r\n if (this._total === 0) return 0;\r\n return (this.currentPage - 1) * this.pageSize + 1;\r\n }\r\n\r\n get endRecord(): number {\r\n return Math.min(this.currentPage * this.pageSize, this._total);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['datasource'] && this.autoMode) {\r\n this.currentPage = 1;\r\n }\r\n }\r\n\r\n sort(key: string, isActions?: boolean): void {\r\n if (isActions) return;\r\n if (this.sortKey === key) {\r\n this.sortAsc = !this.sortAsc;\r\n } else {\r\n this.sortKey = key;\r\n this.sortAsc = true;\r\n }\r\n this.sortChange.emit({ key: this.sortKey, asc: this.sortAsc });\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1 || page > this.totalPages) return;\r\n this.currentPage = page;\r\n this.pageChange.emit({ page: this.currentPage, pageSize: this.pageSize });\r\n }\r\n\r\n onPageSizeChange(size: number): void {\r\n this.pageSize = Number(size);\r\n this.currentPage = 1;\r\n this.pageSizeChange.emit({ page: this.currentPage, pageSize: this.pageSize });\r\n }\r\n\r\n hasVisibleActions(row: any): boolean {\r\n return this.moreMenuActions.some(a => !a.hideIf || !a.hideIf(row));\r\n }\r\n\r\n getActionLabel(action: OslMenuAction, row: any): string {\r\n return action.labelIf ? action.labelIf(row) : action.label;\r\n }\r\n\r\n getCellValue(row: any, col: OslGridColumn): string {\r\n const raw = row[col.key];\r\n if (col.displayFn) return col.displayFn(raw, row);\r\n if (col.enums?.length) {\r\n const match = col.enums.find(e => e.value === raw);\r\n return match ? match.label : (raw ?? '--');\r\n }\r\n return raw !== null && raw !== undefined && raw !== '' ? raw : '--';\r\n }\r\n}\r\n","<div class=\"osl-grid-wrapper\">\r\n\r\n <div class=\"osl-grid-table-container\" [style.height]=\"tableHeight\">\r\n <table class=\"osl-grid-table\">\r\n <thead class=\"osl-grid-thead\">\r\n <tr>\r\n @if (loading && columns.length === 0) {\r\n @for (sk of skeletonColumns; track $index) {\r\n <th class=\"osl-grid-th osl-grid-th--skeleton\">\r\n <div class=\"osl-skeleton osl-skeleton--header\"></div>\r\n </th>\r\n }\r\n } @else {\r\n @for (col of columns; track col.key; let last = $last) {\r\n <th\r\n class=\"osl-grid-th\"\r\n [class.osl-grid-th--last]=\"last\"\r\n [class.osl-grid-th--actions]=\"col.isActions\"\r\n (click)=\"sort(col.key, col.isActions)\"\r\n >\r\n @if (!col.isActions) {\r\n <span class=\"osl-grid-th-inner\">\r\n {{ col.label }}\r\n <span class=\"osl-grid-sort-icon\" [class.osl-grid-sort-icon--active]=\"sortKey === col.key\">\r\n @if (sortKey === col.key) {\r\n {{ sortAsc ? '↑' : '↓' }}\r\n } @else {\r\n <span class=\"osl-grid-sort-icon--idle\">⇅</span>\r\n }\r\n </span>\r\n </span>\r\n }\r\n </th>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @if (loading) {\r\n @for (sk of skeletonRows; track $index) {\r\n <tr class=\"osl-grid-row osl-grid-row--skeleton\">\r\n @if (columns.length > 0) {\r\n @for (col of columns; track col.key; let last = $last) {\r\n <td class=\"osl-grid-td\" [class.osl-grid-td--last]=\"last\" [class.osl-grid-td--actions]=\"col.isActions\">\r\n @if (col.isActions) {\r\n <div class=\"osl-skeleton osl-skeleton--actions\"></div>\r\n } @else {\r\n <div class=\"osl-skeleton\"></div>\r\n }\r\n </td>\r\n }\r\n } @else {\r\n @for (sk2 of skeletonColumns; track $index; let last = $last) {\r\n <td class=\"osl-grid-td\" [class.osl-grid-td--last]=\"last\">\r\n <div class=\"osl-skeleton\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n } @else {\r\n @if (pagedData.length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columns.length\" class=\"osl-grid-empty\">\r\n <div class=\"d-flex align-items-center justify-content-center floating-element\">\r\n <div class=\"mx-4\">\r\n <p class=\"f-s-20 f-w-600 text-start\">No Records match the <br> current filters.</p>\r\n <p class=\"text-start\">Expecting to see new Records? Try again in <br> a few seconds as the system catches up</p>\r\n </div>\r\n <i class=\"icon\"></i>\r\n\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n @for (row of pagedData; track $index; let rowIdx = $index) {\r\n <tr class=\"osl-grid-row\" [class.pointer]=\"isSelectable\" (click)=\"onRowClick.emit(row)\">\r\n @for (col of columns; track col.key; let last = $last) {\r\n @if (col.isActions) {\r\n <td class=\"osl-grid-td osl-grid-td--actions\" [class.osl-grid-td--last]=\"last\">\r\n @if (moreMenuActions.length > 0 && hasVisibleActions(row)) {\r\n <div class=\"osl-menu-wrapper\">\r\n <button class=\"osl-grid-icon-btn\" (click)=\"toggleMenu(rowIdx, $event)\" title=\"More actions\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n @if (openMenuIndex === rowIdx) {\r\n <div class=\"osl-custom-menu\"\r\n [style.top.px]=\"menuPosition.top\"\r\n [style.left.px]=\"menuPosition.left\">\r\n <div class=\"osl-custom-menu-header\">Actions</div>\r\n @for (action of moreMenuActions; track $index) {\r\n @if (!action.hideIf || !action.hideIf(row)) {\r\n <button class=\"osl-custom-menu-item\" (click)=\"action.click(row); closeMenu(); $event.stopPropagation()\">\r\n <span class=\"osl-custom-menu-dot\"></span>\r\n {{ getActionLabel(action, row) }}\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n @if(canEdit){\r\n <button class=\"osl-grid-icon-btn\" (click)=\"$event.stopPropagation(); editClick.emit(row)\" title=\"Edit\">\r\n <mat-icon>mode_edit_outline</mat-icon>\r\n </button>\r\n }\r\n @if(canDelete){\r\n <button class=\"osl-grid-icon-btn osl-grid-icon-btn--danger\" (click)=\"$event.stopPropagation(); deleteClick.emit(row)\" title=\"Delete\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </button>\r\n }\r\n </td>\r\n } @else {\r\n <td class=\"osl-grid-td\" [class.osl-grid-td--last]=\"last\" >\r\n <span [class.link]=\"col.displayType == 'link'\" (click)=\"col.click ? col.click(row,col):null\">\r\n @switch (col.displayType) {\r\n @case ('date') { {{ row[col.key] | date }} }\r\n @case ('datetime') { {{ row[col.key] | date:'medium' }} }\r\n @case ('time') { {{ row[col.key] | date:'shortTime' }} }\r\n @default { {{ getCellValue(row, col) }} }\r\n }\r\n </span>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n @if (isPaginated) {\r\n <div class=\"osl-grid-pagination\">\r\n\r\n <span class=\"osl-grid-pagination__info\">\r\n @if (loading) {\r\n Loading...\r\n } @else if (_total > 0) {\r\n {{ startRecord }}–{{ endRecord }} of {{ _total }} records\r\n } @else {\r\n No records\r\n }\r\n </span>\r\n\r\n <div class=\"osl-grid-pagination__controls\">\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(1)\" [disabled]=\"currentPage === 1 || loading\" title=\"First page\">\r\n «\r\n </button>\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(currentPage - 1)\" [disabled]=\"currentPage === 1 || loading\" title=\"Previous page\">\r\n ‹ Prev\r\n </button>\r\n\r\n @for (page of pageNumbers; track $index) {\r\n @if (page === -1) {\r\n <span class=\"osl-grid-page-ellipsis\">…</span>\r\n } @else {\r\n <button\r\n class=\"osl-grid-page-btn osl-grid-page-btn--num\"\r\n [class.osl-grid-page-btn--active]=\"page === currentPage\"\r\n [disabled]=\"loading\"\r\n (click)=\"goToPage(page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(currentPage + 1)\" [disabled]=\"currentPage === totalPages || loading\" title=\"Next page\">\r\n Next ›\r\n </button>\r\n <button class=\"osl-grid-page-btn osl-grid-page-btn--nav\" (click)=\"goToPage(totalPages)\" [disabled]=\"currentPage === totalPages || loading\" title=\"Last page\">\r\n »\r\n </button>\r\n </div>\r\n\r\n <div class=\"osl-grid-pagination__size\">\r\n <select class=\"osl-grid-page-size\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" [disabled]=\"loading\">\r\n @for (opt of pageSizeOptions; track opt) {\r\n <option [value]=\"opt\">{{ opt }} per page</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n </div>\r\n }\r\n\r\n</div>\r\n","import {\r\n Component,\r\n EventEmitter,\r\n inject,\r\n Injector,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { MatDialog, MatDialogRef } from '@angular/material/dialog';\r\nimport { OslGrid, OslGridColumn, OslMenuAction, OslPageEvent, OslSortEvent } from '../grid/grid';\r\nimport { elements } from '../dynamic-form/dynamic-form';\r\nimport { DialogWrapper } from '../../../shared/components/dialog-wrapper/dialog-wrapper';\r\nimport { DeleteConfirmation, DeleteConfirmationData } from '../../../shared/components/delete-confirmation/delete-confirmation';\r\nimport { OslSearchbar } from '../searchbar/searchbar';\r\n\r\nexport interface OslSetupSaveEvent {\r\n model: any;\r\n mode: 'add' | 'edit';\r\n}\r\n\r\n@Component({\r\n selector: 'osl-setup',\r\n standalone: false,\r\n templateUrl: './setup.html',\r\n styleUrl: './setup.scss',\r\n})\r\nexport class OslSetup {\r\n private _injector = inject(Injector);\r\n formLoading:boolean = false\r\n saveLoading:boolean = false\r\n @ViewChild('formBodyTpl') formBodyTpl!: TemplateRef<any>;\r\n @ViewChild('formFooterTpl') formFooterTpl!: TemplateRef<any>;\r\n @ViewChild('customFooterWrapperTpl') customFooterWrapperTpl!: TemplateRef<any>;\r\n @ViewChild('searchbar') searchbar?: OslSearchbar;\r\n\r\n // ── Inputs ────────────────────────────────────────────────────\r\n @Input('title') title: string|undefined= '';\r\n @Input('columns') columns: OslGridColumn[] = [];\r\n @Input('datasource') datasource: any[] = [];\r\n @Input('isPaginated') isPaginated: boolean = true;\r\n @Input('pageSize') pageSize: number = 25;\r\n @Input('autoMode') autoMode: boolean = true;\r\n @Input('tableHeight') tableHeight: string = 'calc(100vh - 220px)';\r\n @Input('totalRecords') totalRecords: number = 0;\r\n @Input('loading') loading: boolean = false;\r\n @Input('dialogWidth') dialogWidth: string = \"50vw\";\r\n /** Dynamic form elements — when provided, enables Add/Edit dialog and action column. */\r\n @Input('formElements') formElements: elements[] = [];\r\n @Input('beforeDisplay')beforeDisplay :((model: any) => any | undefined) | undefined;\r\n\r\n @Input('onAddEditFn') onAddEditFn:((row?: any) => void | undefined) | undefined;\r\n @Input('isLister') isLister:boolean = false\r\n @Input('canAdd') canAdd: boolean = true;\r\n @Input('canEdit') canEdit: boolean = true;\r\n @Input('canDelete') canDelete: boolean = true;\r\n @Input('moreMenuActions') moreMenuActions: OslMenuAction[] = []\r\n @Input('customFormFooter') customFormFooter: TemplateRef<any> | undefined\r\n @Input('customHeaderTemp') customHeaderTemp: TemplateRef<any> | undefined\r\n @Input('partialCustomHeaderTemp') partialCustomHeaderTemp: TemplateRef<any> | undefined\r\n\r\n // ── Outputs ───────────────────────────────────────────────────\r\n @Output() onSearch = new EventEmitter<string>();\r\n @Output() onAdd = new EventEmitter<void>();\r\n // @Output() onSave = new EventEmitter<OslSetupSaveEvent>();\r\n @Output() onEdit = new EventEmitter<any>();\r\n @Output() onDelete = new EventEmitter<any>();\r\n @Output() pageChange = new EventEmitter<OslPageEvent>();\r\n @Output() pageSizeChange = new EventEmitter<OslPageEvent>();\r\n @Output() sortChange = new EventEmitter<OslSortEvent>();\r\n @Output() onRowClick = new EventEmitter<any>();\r\n@ViewChild('gridRef') gridRef:OslGrid | undefined\r\n @Input('onSave') onSave:((row?: any) => boolean | undefined) | undefined;\r\n\r\n\r\n // ── Dialog state ──────────────────────────────────────────────\r\n dialogModel: any = {};\r\n dialogMode: 'add' | 'edit' = 'add';\r\n public _dialogRef: MatDialogRef<any> | null = null;\r\n\r\n get hasForm(): boolean {\r\n return this.formElements?.length > 0 || !! this.onAddEditFn;\r\n }\r\n onSearchSetup(event:any){\r\n if(this.gridRef)this.gridRef.currentPage = 1\r\n this.pageChange.emit({\r\n page:1,\r\n pageSize:this.gridRef?.pageSize || 10,\r\n searchValue:event\r\n })\r\n this.onSearch.emit(event)\r\n\r\n }\r\n\r\n /** Prepends the actions column when formElements are provided. */\r\n get columnsWithActions(): OslGridColumn[] {\r\n if (!this.hasForm) return this.columns;\r\n if (this.isLister) return [...this.columns];\r\n if (!this.canEdit && !this.canDelete) return this.columns;\r\n return [{ key: '__actions', label: '', isActions: true }, ...this.columns];\r\n }\r\n onPageChange(eventEmitter:EventEmitter<OslPageEvent>,event:OslPageEvent){\r\n\r\n eventEmitter.emit({...event,searchValue:this.searchbar?.searchControl?.value})\r\n\r\n }\r\n\r\n openAddDialog(): void {\r\n this.dialogMode = 'add';\r\n if(this.beforeDisplay){\r\n this.dialogModel = this.beforeDisplay(this.dialogModel)\r\n }else{\r\n this.dialogModel = {};\r\n }\r\n this.onAdd.emit();\r\n if(this.onAddEditFn){\r\n this.onAddEditFn();\r\n return;\r\n }\r\n this._openDialog();\r\n }\r\n\r\nasync openEditDialog(row: any): Promise<void> {\r\n this.dialogMode = 'edit';\r\n this.onEdit.emit(row);\r\n if(this.onAddEditFn){\r\n this.onAddEditFn(row)\r\n return;\r\n }\r\n \r\n this._openDialog();\r\n if(this.beforeDisplay){\r\n // this.datasource.find(x=>x[this.primaryKey]==)\r\n this.formLoading = true\r\n this.dialogModel = await this.beforeDisplay(row)\r\n this.formLoading = false\r\n \r\n }else{\r\n this.dialogModel = { ...row };\r\n }\r\n \r\n \r\n \r\n \r\n }\r\n\r\n\r\n onDeleteClick(row: any): void {\r\n const dialogData: DeleteConfirmationData = {\r\n title: 'Delete ' + this.title,\r\n message: `Are you sure you want to delete this ${this.title?.toLowerCase()}? This action cannot be undone.`,\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel',\r\n };\r\n this._injector.get(MatDialog).open(DeleteConfirmation, {\r\n width: '380px',\r\n data: dialogData,\r\n disableClose: true,\r\n }).afterClosed().subscribe((confirmed: boolean) => {\r\n if (confirmed) this.onDelete.emit(row);\r\n });\r\n }\r\n\r\n cancelDialog(): void {\r\n this._dialogRef?.close();\r\n this._dialogRef = null;\r\n }\r\n\r\n async saveDialog() {\r\n let isSuccess:any = false\r\n if(this.onSave){\r\n this.saveLoading = true\r\n isSuccess = await this.onSave({ model: { ...this.dialogModel }, mode: this.dialogMode })\r\n \r\n this.saveLoading = false\r\n }\r\n if(isSuccess){\r\n this._dialogRef?.close();\r\n this._dialogRef = null;\r\n\r\n }\r\n }\r\n\r\n private _openDialog(): void {\r\n this._dialogRef = this._injector.get(MatDialog).open(DialogWrapper, {\r\n width: this.dialogWidth,\r\n maxWidth:'90vw',\r\n\r\n data: {\r\n header: this.customHeaderTemp ?? ((this.dialogMode === 'add' ? 'Add ' : 'Edit ') + this.title),\r\n partialHeader: this.partialCustomHeaderTemp,\r\n formBody: this.formBodyTpl,\r\n formFooter: this.customFormFooter ? this.customFooterWrapperTpl : this.formFooterTpl,\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"p-2\">\r\n\r\n <!-- Header -->\r\n <div class=\"osl-setup-header\">\r\n <h5 class=\"mb-0\">{{ title }}</h5>\r\n <div class=\"d-flex align-items-center gap-2\">\r\n <osl-searchbar #searchbar class=\"mx-2\" (onSearch)=\"onSearchSetup($event)\"></osl-searchbar>\r\n @if(!isLister && canAdd){\r\n <osl-button\r\n variant=\"secondary\"\r\n size=\"sm\"\r\n [label]=\"'Add ' + title\"\r\n (clickEv)=\"openAddDialog()\"\r\n ></osl-button>\r\n\r\n }\r\n </div>\r\n </div>\r\n\r\n <!-- Grid -->\r\n <div class=\"osl-setup-body my-2\">\r\n <osl-grid\r\n #gridRef\r\n [columns]=\"columnsWithActions\"\r\n [(datasource)]=\"datasource\"\r\n [isPaginated]=\"isPaginated\"\r\n [pageSize]=\"pageSize\"\r\n [autoMode]=\"autoMode\"\r\n [tableHeight]=\"tableHeight\"\r\n [totalRecords]=\"totalRecords\"\r\n [loading]=\"loading\"\r\n [moreMenuActions]=\"moreMenuActions\"\r\n [canEdit]=\"canEdit\"\r\n [canDelete]=\"canDelete\"\r\n (editClick)=\"openEditDialog($event)\"\r\n (deleteClick)=\"onDeleteClick($event)\"\r\n (pageChange)=\"onPageChange(pageChange,$event)\"\r\n (pageSizeChange)=\"onPageChange(pageSizeChange,$event)\"\r\n (sortChange)=\"sortChange.emit($event)\"\r\n [isSelectable]=\"isLister\";\r\n (onRowClick)=\"onRowClick.emit($event)\"\r\n />\r\n </div>\r\n\r\n</div>\r\n\r\n<!-- Dialog: Form Body -->\r\n<ng-template #formBodyTpl>\r\n <osl-dynamic-form\r\n [skeletonLoading]=\"formLoading\"\r\n [elements]=\"formElements\"\r\n [(model)]=\"dialogModel\"\r\n ></osl-dynamic-form>\r\n</ng-template>\r\n\r\n<!-- Dialog: Form Footer -->\r\n<ng-template #formFooterTpl>\r\n <div class=\"osl-setup-dialog-footer\">\r\n\r\n\r\n <osl-button [loading]=\"saveLoading\" variant=\"secondary\" label=\"Save\" (click)=\"saveDialog()\"></osl-button>\r\n\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Wrapper that bridges DialogWrapper's implicit context to the custom footer template -->\r\n<ng-template #customFooterWrapperTpl let-data>\r\n <ng-container *ngTemplateOutlet=\"customFormFooter!; context: { $implicit: { dialogModel: dialogModel, dialogMode: dialogMode, dialogRef: data.dialogRef } }\"></ng-container>\r\n</ng-template>\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\r\nimport { elements } from '../dynamic-form/dynamic-form';\r\n\r\nexport interface OslFormGridColumn {\r\n key: string;\r\n displayName: string;\r\n label?: string;\r\n /** When provided, renders the matching dynamic-form element in the cell bound to row[key]. */\r\n formElem?: elements;\r\n /** Optional CSS width, e.g. '150px' or '20%'. */\r\n width?: string;\r\n}\r\n\r\nexport interface OslFormGridFooterColumn {\r\n colspan?: number;\r\n display?: string;\r\n displayFn?: (datasource: any[]) => any;\r\n class?: string;\r\n}\r\n\r\nexport interface OslFormGridRowEvent {\r\n row: any;\r\n index: number;\r\n}\r\n\r\n@Component({\r\n selector: 'osl-form-grid',\r\n standalone: false,\r\n templateUrl: './form-grid.html',\r\n styleUrl: './form-grid.scss',\r\n})\r\nexport class OslFormGrid {\r\n @Input('columns') columns: OslFormGridColumn[] = [];\r\n @Input('datasource') datasource: any[] = [];\r\n @Output() datasourceChange = new EventEmitter<any[]>();\r\n\r\n @Input('isPaginated') isPaginated: boolean = false;\r\n @Input('pageSize') pageSize: number = 10;\r\n @Input('canAdd') canAdd: boolean = true;\r\n @Input('canDelete') canDelete: boolean = true;\r\n @Input('loading') loading: boolean = false;\r\n @Input('tableHeight') tableHeight: string = '350px';\r\n @Input('footerColumns') footerColumns: OslFormGridFooterColumn[] = [];\r\n\r\n @Output() rowAdd = new EventEmitter<any>();\r\n @Output() rowDelete = new EventEmitter<OslFormGridRowEvent>();\r\n\r\n get hasActions(): boolean {\r\n return this.canAdd || this.canDelete;\r\n }\r\n\r\n currentPage = 1;\r\n pageSizeOptions = [5, 10, 25, 50];\r\n\r\n get _total(): number {\r\n return this.datasource.length;\r\n }\r\n\r\n get totalPages(): number {\r\n return Math.ceil(this._total / this.pageSize) || 1;\r\n }\r\n\r\n get pagedData(): any[] {\r\n if (!this.isPaginated) return this.datasource;\r\n const start = (this.currentPage - 1) * this.pageSize;\r\n return this.datasource.slice(start, start + this.pageSize);\r\n }\r\n\r\n get startRecord(): number {\r\n return this._total === 0 ? 0 : (this.currentPage - 1) * this.pageSize + 1;\r\n }\r\n\r\n get endRecord(): number {\r\n return Math.min(this.currentPage * this.pageSize, this._total);\r\n }\r\n\r\n get pageNumbers(): number[] {\r\n const total = this.totalPages;\r\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\r\n const pages: number[] = [1];\r\n if (this.currentPage > 3) pages.push(-1);\r\n for (let i = Math.max(2, this.currentPage - 1); i <= Math.min(total - 1, this.currentPage + 1); i++) {\r\n pages.push(i);\r\n }\r\n if (this.currentPage < total - 2) pages.push(-1);\r\n pages.push(total);\r\n return pages;\r\n }\r\n\r\n get skeletonRows(): number[] {\r\n return Array.from({ length: Math.min(this.pageSize, 6) });\r\n }\r\n\r\n // ngOnChanges(changes: SimpleChanges): void {\r\n // if (changes['datasource']) {\r\n // this.currentPage = 1;\r\n // }\r\n // }\r\n\r\n addRow(): void {\r\n const newRow: any = {};\r\n this.columns.forEach(col => (newRow[col.key] = null));\r\n this.datasource = [...this.datasource, newRow];\r\n this.datasourceChange.emit(this.datasource);\r\n this.rowAdd.emit(newRow);\r\n if (this.isPaginated) {\r\n // this.currentPage = this.totalPages;\r\n this.goToPage(this.totalPages)\r\n }\r\n }\r\n\r\n deleteRow(pagedIndex: number): void {\r\n const actualIndex = this.isPaginated\r\n ? (this.currentPage - 1) * this.pageSize + pagedIndex\r\n : pagedIndex;\r\n const row = this.datasource[actualIndex];\r\n this.datasource = this.datasource.filter((_, i) => i !== actualIndex);\r\n this.datasourceChange.emit(this.datasource);\r\n this.rowDelete.emit({ row, index: actualIndex });\r\n if (this.currentPage > this.totalPages) {\r\n this.currentPage = this.totalPages;\r\n }\r\n }\r\n\r\n onCellChange(row: any, col: OslFormGridColumn, value: any): void {\r\n row[col.key] = value;\r\n this.datasourceChange.emit(this.datasource);\r\n // if (col.formElem?.change) col.formElem.change(row);\r\n }\r\n\r\n goToPage(page: number): void {\r\n if (page < 1 || page > this.totalPages) return;\r\n this.currentPage = page;\r\n // this.cd.markForCheck()\r\n }\r\n\r\n onPageSizeChange(size: number): void {\r\n this.pageSize = Number(size);\r\n this.currentPage = 1;\r\n }\r\n\r\n isDisabled(elem: elements,row:any,index:number): boolean {\r\n return elem.disabledIf ? elem.disabledIf(row,index) : !!elem.disabled;\r\n }\r\n\r\n isLoading(row: any, elem: elements): boolean {\r\n return elem.loadingIf ? elem.loadingIf(row) : false;\r\n }\r\n\r\n colRequired(col: OslFormGridColumn): boolean {\r\n return !!col.formElem?.required || !!col.formElem?.requiredIf;\r\n }\r\n\r\n onSelectChange(col: OslFormGridColumn, row: any, i: number, value: any): void {\r\n if (!col.formElem?.change) return;\r\n const elem = col.formElem;\r\n let selectedObj: any = undefined;\r\n if (elem.datasource) {\r\n if (Array.isArray(value)) {\r\n selectedObj = value.map(v =>\r\n elem.datasource!.find(item => (elem.valueField ? item[elem.valueField] : item) === v) ?? null\r\n );\r\n } else if (value !== null && value !== undefined) {\r\n selectedObj = elem.datasource.find(item =>\r\n (elem.valueField ? item[elem.valueField] : item) === value\r\n ) ?? null;\r\n } else {\r\n selectedObj = null;\r\n }\r\n }\r\n elem.change!(row, i, selectedObj);\r\n }\r\n}\r\n","<div class=\"osl-fg-wrapper\">\r\n\r\n <div class=\"osl-fg-table-container\" [style.height]=\"tableHeight\">\r\n <table class=\"osl-fg-table\">\r\n\r\n <thead class=\"osl-fg-thead\">\r\n <tr>\r\n <!-- Actions column: + add button in header -->\r\n @if (hasActions) {\r\n <th class=\"osl-fg-th osl-fg-th--actions\">\r\n @if (canAdd) {\r\n <button class=\"osl-grid-icon-btn\" (click)=\"addRow()\" [disabled]=\"loading\" title=\"Add row\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n </th>\r\n }\r\n @for (col of columns; track col.key) {\r\n <th class=\"osl-fg-th\" [style.width]=\"col.width\">\r\n {{ col.displayName }}\r\n @if (colRequired(col)) {\r\n <span class=\"osl-fg-th-required\">*</span>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n\r\n @if (loading) {\r\n @for (sk of skeletonRows; track $index) {\r\n <tr class=\"osl-fg-row osl-fg-row--skeleton\">\r\n @if (hasActions) {\r\n <td class=\"osl-fg-td osl-fg-td--actions\">\r\n <div class=\"osl-fg-skeleton osl-fg-skeleton--sm\"></div>\r\n </td>\r\n }\r\n @for (col of columns; track col.key) {\r\n <td class=\"osl-fg-td\"><div class=\"osl-fg-skeleton\"></div></td>\r\n }\r\n </tr>\r\n }\r\n\r\n } @else if (pagedData.length === 0) {\r\n <tr>\r\n <td [attr.colspan]=\"columns.length + (hasActions ? 1 : 0)\" class=\"osl-fg-empty\">\r\n <div class=\"osl-fg-empty-inner\">\r\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\r\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/>\r\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/>\r\n <line x1=\"9\" y1=\"9\" x2=\"9\" y2=\"21\"/>\r\n </svg>\r\n <p>No rows yet.{{ canAdd ? ' Use + to get started.' : '' }}</p>\r\n </div>\r\n </td>\r\n </tr>\r\n\r\n } @else {\r\n @for (row of pagedData; track $index; let i = $index) {\r\n <tr class=\"osl-fg-row\">\r\n\r\n <!-- Delete button first -->\r\n @if (hasActions) {\r\n <td class=\"osl-fg-td osl-fg-td--actions\">\r\n @if (canDelete) {\r\n <button class=\"osl-grid-icon-btn osl-grid-icon-btn--danger\" (click)=\"deleteRow(i)\" title=\"Delete\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </button>\r\n }\r\n </td>\r\n }\r\n\r\n @for (col of columns; track col.key) {\r\n <td class=\"osl-fg-td\" [style.width]=\"col.width\">\r\n @if (col.formElem) {\r\n <div class=\"osl-fg-cell-form\" [style.width]=\"col.width\">\r\n @switch (col.formElem.elementType) {\r\n\r\n @case ('textbox') {\r\n <osl-input\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [type]=\"col.formElem.inputType || 'text'\"\r\n [placeholder]=\"col.formElem.placeholder || col.displayName\"\r\n [mask]=\"col.formElem.mask || ''\"\r\n [min]=\"col.formElem.min ?? ''\"\r\n [max]=\"col.formElem.max ?? ''\"\r\n [minLength]=\"col.formElem.minLength ?? null\"\r\n [maxLength]=\"col.formElem.maxLength ?? null\"\r\n [prefixIcon]=\"col.formElem.prefixIcon || ''\"\r\n [suffixIcon]=\"col.formElem.suffixIcon || ''\"\r\n [decimalPortion]=\"col.formElem.decimalPortion ?? null\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-input>\r\n }\r\n\r\n @case ('textarea') {\r\n <osl-textarea\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [rows]=\"col.formElem.textareaRows || 3\"\r\n [placeholder]=\"col.formElem.placeholder || col.displayName\"\r\n [maxLength]=\"col.formElem.maxLength ?? null\"\r\n [minLength]=\"col.formElem.minLength ?? null\"\r\n [characterCounter]=\"!!col.formElem.characterCounter\"\r\n [resize]=\"col.formElem.resize || 'none'\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-textarea>\r\n }\r\n\r\n @case ('select') {\r\n <osl-select\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [datasource]=\"col.formElem.datasource || []\"\r\n [displayField]=\"col.formElem.displayField || ''\"\r\n [valueField]=\"col.formElem.valueField || ''\"\r\n [placeholder]=\"col.formElem.selectPlaceholder || col.displayName\"\r\n [loading]=\"isLoading(row, col.formElem)\"\r\n [clearable]=\"!!col.formElem.clearable\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? onSelectChange(col, row, i, $event) : null\">\r\n </osl-select>\r\n }\r\n\r\n @case ('autocomplete') {\r\n <osl-autocomplete\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [datasource]=\"col.formElem.datasource || []\"\r\n [displayField]=\"col.formElem.displayField || ''\"\r\n [valueField]=\"col.formElem.valueField || ''\"\r\n [placeholder]=\"col.formElem.autocompletePlaceholder || col.displayName\"\r\n [loading]=\"isLoading(row, col.formElem)\"\r\n [searchType]=\"col.formElem.searchType ? col.formElem.searchType : 'Local'\"\r\n [methodName]=\"col.formElem.apiMethod || ''\"\r\n [configMethodName]=\"col.formElem.apiConfigMethod || ''\"\r\n [service]=\"col.formElem.apiService\"\r\n [object]=\"col.formElem.objectName ? row[col.formElem.objectName] : null\"\r\n [isLister]=\"!!col.formElem.isListerAutocomplete\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? onSelectChange(col, row, i, $event) : null\">\r\n </osl-autocomplete>\r\n }\r\n\r\n @case ('radio') {\r\n <osl-radio\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [datasource]=\"col.formElem.datasource || []\"\r\n [displayField]=\"col.formElem.displayField || ''\"\r\n [valueField]=\"col.formElem.valueField || ''\"\r\n [inline]=\"!!col.formElem.inline\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-radio>\r\n }\r\n\r\n @case ('checkbox') {\r\n <osl-checkbox\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [indeterminate]=\"!!col.formElem.indeterminate\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-checkbox>\r\n }\r\n\r\n @case ('slide-toggle') {\r\n <osl-slide-toggle\r\n [label]=\"''\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [labelPosition]=\"col.formElem.labelPosition || 'after'\"\r\n [trueLabel]=\"col.formElem.trueLabel || ''\"\r\n [falseLabel]=\"col.formElem.falseLabel || ''\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-slide-toggle>\r\n }\r\n\r\n @case ('datepicker') {\r\n <osl-datepicker\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [dateType]=\"col.formElem.dateType || 'date'\"\r\n [placeholder]=\"col.formElem.placeholder || col.displayName\"\r\n [minDate]=\"col.formElem.minDate || ''\"\r\n [maxDate]=\"col.formElem.maxDate || ''\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-datepicker>\r\n }\r\n\r\n @case ('file-uploader') {\r\n <osl-file-upload\r\n [label]=\"''\"\r\n [required]=\"false\"\r\n [disabled]=\"isDisabled(col.formElem,row,i)\"\r\n [accept]=\"col.formElem.accept || ''\"\r\n [multiple]=\"!!col.formElem.multiple\"\r\n [maxSize]=\"col.formElem.maxFileSize || 0\"\r\n [model]=\"row[col.key]\"\r\n (modelChange)=\"onCellChange(row, col, $event)\"\r\n (changeEv)=\"col.formElem.change ? col.formElem.change(row,i) : null\">\r\n </osl-file-upload>\r\n }\r\n\r\n }\r\n </div>\r\n } @else {\r\n <span class=\"osl-fg-cell-text\">{{ row[col.key] ?? '--' }}</span>\r\n }\r\n </td>\r\n }\r\n\r\n </tr>\r\n }\r\n }\r\n\r\n </tbody>\r\n\r\n @if (footerColumns && footerColumns.length > 0 && datasource && datasource.length > 0) {\r\n <tfoot class=\"osl-fg-tfoot\">\r\n <tr class=\"osl-fg-footer-row\">\r\n @for (fcol of footerColumns; track $index) {\r\n <td\r\n [class]=\"'osl-fg-footer-td ' + (fcol.class || '')\"\r\n [attr.colspan]=\"fcol.colspan || 1\">\r\n {{ fcol.displayFn ? fcol.displayFn(datasource) : (fcol.display || '') }}\r\n </td>\r\n }\r\n </tr>\r\n </tfoot>\r\n }\r\n\r\n </table>\r\n </div>\r\n\r\n @if (isPaginated) {\r\n <div class=\"osl-fg-pagination\">\r\n\r\n <span class=\"osl-fg-pagination__info\">\r\n @if (loading) {\r\n Loading...\r\n } @else if (_total > 0) {\r\n {{ startRecord }}–{{ endRecord }} of {{ _total }} rows\r\n } @else {\r\n No rows\r\n }\r\n </span>\r\n\r\n <div class=\"osl-fg-pagination__controls\">\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(1)\" [disabled]=\"currentPage === 1 || loading\">«</button>\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(currentPage - 1)\" [disabled]=\"currentPage === 1 || loading\">‹ Prev</button>\r\n\r\n @for (page of pageNumbers; track $index) {\r\n @if (page === -1) {\r\n <span class=\"osl-fg-page-ellipsis\">…</span>\r\n } @else {\r\n <button\r\n class=\"osl-fg-page-btn osl-fg-page-btn--num\"\r\n [class.osl-fg-page-btn--active]=\"page === currentPage\"\r\n [disabled]=\"loading\"\r\n (click)=\"goToPage(page)\">\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(currentPage + 1)\" [disabled]=\"currentPage === totalPages || loading\">Next ›</button>\r\n <button class=\"osl-fg-page-btn osl-fg-page-btn--nav\" (click)=\"goToPage(totalPages)\" [disabled]=\"currentPage === totalPages || loading\">»</button>\r\n </div>\r\n\r\n <div class=\"osl-fg-pagination__size\">\r\n <select class=\"osl-fg-page-size\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" [disabled]=\"loading\">\r\n @for (opt of pageSizeOptions; track opt) {\r\n <option [value]=\"opt\">{{ opt }} per page</option>\r\n }\r\n </select>\r\n </div>\r\n\r\n </div>\r\n }\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, Input } from '@angular/core';\r\nimport { OslGridColumn, OslPageEvent } from '../grid/grid';\r\nimport { MatDialogRef } from '@angular/material/dialog';\r\nimport { HttpResponse } from '../../../http/httpbase';\r\n\r\n@Component({\r\n selector: 'osl-autocomplete-lister',\r\n standalone:false,\r\n templateUrl: './autocomplete-lister.html',\r\n styleUrl: './autocomplete-lister.scss',\r\n})\r\nexport class OslAutocompleteLister {\r\n @Input('data') data:any;\r\n column:OslGridColumn[]=[]\r\n datasource=[]\r\n autocompleteData:any;\r\n recordCount: number=0;\r\n loader: boolean = false;\r\n constructor(public dialogRef: MatDialogRef<OslAutocompleteLister>,public cd:ChangeDetectorRef){\r\n \r\n \r\n\r\n }\r\n async ngAfterViewInit(){\r\n this.autocompleteData = this.data?.data \r\n this.loader = true\r\n await this.getConfig()\r\n // await this.search()\r\n // this.loader = false\r\n this.cd.markForCheck()\r\n\r\n }\r\n async getConfig(){\r\n const res:HttpResponse = await this.autocompleteData.service[this.autocompleteData.configMethodName || 'getConfig']();\r\n if(!res.isSuccessful) return;\r\n this.column = res.result\r\n }\r\n\r\n async search(searchValue?:any,page = 1 , pageSize = 25){ \r\n this.loader = true\r\n const res:HttpResponse = await this.autocompleteData.service[this.autocompleteData.methodName || 'Search']({\r\n page:page,\r\n pageSize:pageSize,\r\n searchValue\r\n });\r\n \r\n this.cd.markForCheck()\r\n\r\n if(!res.isSuccessful) return;\r\n this.datasource = res.result?.data || []\r\n setTimeout(()=>{\r\n this.loader = false\r\n\r\n },20)\r\n this.recordCount = res.result?.recordsFiltered\r\n }\r\n onPageChange(event:OslPageEvent){\r\n this.search(event.searchValue,event.page,event.pageSize)\r\n\r\n }\r\n onSearch(value:string){\r\n this.search(value)\r\n }\r\n \r\n onRowClick(event:any){\r\n \r\n this.dialogRef.close(event)\r\n \r\n }\r\n \r\n\r\n}\r\n\r\nexport type { oslListerData } from './autocomplete-lister-types';","<div class=\"p-4\">\r\n <osl-setup [loading]=\"loader\" [autoMode]=\"false\" [title]=\"autocompleteData?.title\" [totalRecords]=\"recordCount\" (pageSizeChange)=\"onPageChange($event)\" (pageChange)=\"onPageChange($event)\" (onRowClick)=\"onRowClick($event)\" [columns]=\"column\" [datasource]=\"datasource\" [isLister]=\"true\"></osl-setup>\r\n \r\n</div>","import { NgModule } from '@angular/core';\r\nimport { OslSkeletonDirective } from './skeleton.directive';\r\n\r\n@NgModule({\r\n declarations: [OslSkeletonDirective],\r\n exports: [OslSkeletonDirective],\r\n})\r\nexport class OslSkeletonModule {}\r\n","import {\n Component, Input, Output, EventEmitter, OnChanges, SimpleChanges,\n HostListener, ElementRef, ViewChild, ChangeDetectorRef, ChangeDetectionStrategy, inject\n} from '@angular/core';\nimport { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { DatePipe, DecimalPipe } from '@angular/common';\n\n// ─── Public interfaces ────────────────────────────────────────────────────────\n\nexport interface OslReportColumn {\n key: string;\n label: string;\n width?: number;\n minWidth?: number;\n pinned?: boolean;\n sortable?: boolean;\n filterable?: boolean;\n searchable?: boolean;\n groupable?: boolean;\n resizable?: boolean;\n hidden?: boolean;\n displayFn?: (value: any, row: any) => string;\n cellClass?: string | ((value: any, row: any) => string);\n align?: 'left' | 'center' | 'right';\n aggregate?: 'sum' | 'avg' | 'count' | 'min' | 'max';\n displayType?: 'date' | 'datetime' | 'time' | 'currency' | 'number' | 'percentage';\n enums?: { value: any; label: string }[];\n /** Optional group label shown in the top header row (double header). Consecutive columns sharing the same label are merged into one spanning cell. */\n headerGroup?: string;\n /** When true, this column's values are summed in PDF/Excel exports (subtotal per group + grand total). */\n sumOnPdf?: boolean;\n}\n\nexport interface OslReportPageEvent { page: number; pageSize: number; }\nexport interface OslReportSortEvent { sorts: { key: string; asc: boolean }[]; }\n\nexport interface OslPdfConfig {\n /** Base64 or URL of logo image shown top-left of PDF header. */\n logo?: string;\n /** Company name displayed centered in PDF header. */\n companyName?: string;\n /** Company address line displayed under company name. */\n companyAddress?: string;\n /** Report name rendered between two full-width horizontal lines, centered. */\n reportName?: string;\n /** Page orientation (default: landscape). */\n orientation?: 'portrait' | 'landscape';\n /** Show alternating row background colors (default: false — clean white). */\n alternatingRows?: boolean;\n}\n\n// ─── Internal types ───────────────────────────────────────────────────────────\n\nexport interface InternalColumn extends OslReportColumn {\n _width: number;\n _hidden: boolean;\n _pinned: boolean;\n _stickyLeft: number;\n}\n\nexport type FlatRow =\n | { _type: 'data'; _data: any; _rowIndex: number }\n | { _type: 'group'; _key: string; _value: any; _label: string; _colLabel: string; _level: number; _count: number; _expanded: boolean; _path: string };\n\ninterface SortState { key: string; asc: boolean; index: number; }\n\ninterface ExcelFilterState {\n allItems: { value: any; label: string; checked: boolean }[];\n search: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n@Component({\n selector: 'osl-report-grid',\n standalone: false,\n templateUrl: './report-grid.html',\n styleUrl: './report-grid.scss',\n providers: [DatePipe, DecimalPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class OslReportGrid implements OnChanges {\n\n // Inputs\n @Input() columns: OslReportColumn[] = [];\n @Input() datasource: any[] = [];\n @Input() loading = false;\n @Input() totalRecords = 0;\n @Input() autoMode = true;\n @Input() isPaginated = true;\n @Input() pageSize = 50;\n @Input() tableHeight = 'calc(100vh - 220px)';\n @Input() striped = true;\n @Input() exportable = true;\n @Input() rowHeight = 40;\n @Input() rowSelection: 'single' | 'multiple' | null = null;\n @Input() showAggregates = false;\n @Input() title = '';\n @Input() pdfExportFromGrid = false;\n @Input() pdfConfig: OslPdfConfig = {};\n\n // Outputs\n @Output() pageChange = new EventEmitter<OslReportPageEvent>();\n @Output() pageSizeChange = new EventEmitter<OslReportPageEvent>();\n @Output() sortChange = new EventEmitter<OslReportSortEvent>();\n @Output() rowClick = new EventEmitter<any>();\n @Output() selectionChange = new EventEmitter<any[]>();\n\n @ViewChild('headerScrollRef') headerScrollRef!: ElementRef<HTMLDivElement>;\n @ViewChild('bodyScrollRef') bodyScrollRef!: ElementRef<HTMLDivElement>;\n\n private cdr = inject(ChangeDetectorRef);\n private datePipe = inject(DatePipe);\n private decimalPipe = inject(DecimalPipe);\n\n // ── Column state ─────────────────────────────────────────────────────────────\n\n _cols: InternalColumn[] = [];\n _visibleCols: InternalColumn[] = [];\n _totalWidth = 0;\n\n get visibleCols(): InternalColumn[] { return this._visibleCols; }\n get totalWidth(): number { return this._totalWidth; }\n\n get pinnedWidth(): number {\n return this._visibleCols.filter(c => c._pinned).reduce((s, c) => s + c._width, 0);\n }\n\n get hasHeaderGroups(): boolean {\n return this._visibleCols.some(c => !!c.headerGroup);\n }\n\n get computedHeaderGroups(): { label: string; width: number; isPinned: boolean; stickyLeft: number }[] {\n const result: { label: string; width: number; isPinned: boolean; stickyLeft: number }[] = [];\n for (const col of this._visibleCols) {\n const label = col.headerGroup ?? '';\n const last = result[result.length - 1];\n if (last && last.label === label && last.isPinned === col._pinned) {\n last.width += col._width;\n } else {\n result.push({ label, width: col._width, isPinned: col._pinned, stickyLeft: col._pinned ? col._stickyLeft : 0 });\n }\n }\n return result;\n }\n\n private updateVisibleCols(): void {\n this._visibleCols = this._cols.filter(c => !c._hidden);\n this._totalWidth = this._visibleCols.reduce((s, c) => s + c._width, 0)\n + (this.rowSelection === 'multiple' ? 36 : 0);\n }\n\n // ── Sort state ────────────────────────────────────────────────────────────────\n\n sortStates = new Map<string, SortState>();\n public sortCounter = 0;\n\n // ── Filter / Search state ─────────────────────────────────────────────────────\n\n globalSearch = '';\n columnSearch: { [key: string]: string } = {};\n excelFilters: { [key: string]: Set<any> } = {};\n excelFilterState: { [key: string]: ExcelFilterState } = {};\n openFilterKey: string | null = null;\n filterDropdownPos = { top: 0, left: 0 };\n\n // ── Group state ───────────────────────────────────────────────────────────────\n\n activeGroups: string[] = [];\n collapsedPaths = new Set<string>();\n showGroupPanel = true;\n\n // ── Flat rows (computed) ──────────────────────────────────────────────────────\n\n flatRows: FlatRow[] = [];\n _filteredTotal = 0;\n\n // ── Pagination ────────────────────────────────────────────────────────────────\n\n currentPage = 1;\n pageSizeOptions = [25, 50, 100, 200, 500];\n\n // ── UI state ──────────────────────────────────────────────────────────────────\n\n showColumnConfig = false;\n selectedRows = new Set<any>();\n columnMenuKey: string | null = null;\n columnMenuPos = { top: 0, left: 0 };\n copiedCell: string | null = null;\n resizing: { key: string; startX: number; startWidth: number } | null = null;\n\n private _suppressNextHeaderClick = false;\n private _columnDragJustEnded = false;\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────────\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['columns']) {\n this.initColumns();\n this.excelFilterState = {};\n }\n if (changes['datasource'] || changes['columns']) {\n this.currentPage = 1;\n this.processData();\n }\n }\n\n private initColumns(): void {\n this._cols = this.columns.map(col => ({\n ...col,\n _width: col.width ?? 150,\n _hidden: col.hidden ?? false,\n _pinned: col.pinned ?? false,\n _stickyLeft: 0,\n sortable: col.sortable !== false,\n filterable: col.filterable !== false,\n searchable: col.searchable !== false,\n groupable: col.groupable !== false,\n resizable: col.resizable !== false,\n minWidth: col.minWidth ?? 60,\n align: col.align ?? 'left',\n }));\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n }\n\n recomputePinnedOffsets(): void {\n let offset = this.rowSelection === 'multiple' ? 36 : 0;\n for (const col of this._cols) {\n if (!col._hidden && col._pinned) {\n col._stickyLeft = offset;\n offset += col._width;\n }\n }\n }\n\n // ─── Data pipeline ────────────────────────────────────────────────────────────\n\n private getFilteredRows(): any[] {\n let rows = [...this.datasource];\n\n if (this.globalSearch.trim()) {\n const term = this.globalSearch.toLowerCase();\n rows = rows.filter(row =>\n this.visibleCols.some(col => String(this.getCellDisplay(row, col)).toLowerCase().includes(term))\n );\n }\n\n for (const col of this._cols) {\n const term = (this.columnSearch[col.key] ?? '').trim().toLowerCase();\n if (term) {\n rows = rows.filter(row => String(this.getCellDisplay(row, col)).toLowerCase().includes(term));\n }\n }\n\n for (const [key, activeSet] of Object.entries(this.excelFilters)) {\n if (activeSet.size > 0) {\n rows = rows.filter(row => activeSet.has(row[key]));\n }\n }\n\n return rows;\n }\n\n private getSortedFilteredRows(): any[] {\n let rows = this.getFilteredRows();\n if (this.autoMode && this.sortStates.size > 0) {\n const sorts = [...this.sortStates.values()].sort((a, b) => a.index - b.index);\n rows.sort((a, b) => {\n for (const s of sorts) {\n const cmp = String(a[s.key] ?? '').localeCompare(String(b[s.key] ?? ''), undefined, { numeric: true });\n if (cmp !== 0) return s.asc ? cmp : -cmp;\n }\n return 0;\n });\n }\n return rows;\n }\n\n processData(): void {\n const rows = this.getSortedFilteredRows();\n this._filteredTotal = rows.length;\n\n if (this.activeGroups.length > 0) {\n // Group ALL filtered rows first, then paginate the flat list so every\n // group is computed across the full dataset, not just one page's slice.\n const allGrouped = this.flattenGroups(rows, this.activeGroups, 0, '');\n if (this.isPaginated && this.autoMode) {\n const start = (this.currentPage - 1) * this.pageSize;\n this.flatRows = allGrouped.slice(start, start + this.pageSize);\n } else {\n this.flatRows = allGrouped;\n }\n } else if (this.isPaginated && this.autoMode) {\n const start = (this.currentPage - 1) * this.pageSize;\n this.flatRows = rows.slice(start, start + this.pageSize)\n .map((r, i) => ({ _type: 'data', _data: r, _rowIndex: i } as FlatRow));\n } else {\n this.flatRows = rows.map((r, i) => ({ _type: 'data', _data: r, _rowIndex: i } as FlatRow));\n }\n\n this.cdr.markForCheck();\n }\n\n private flattenGroups(rows: any[], groupKeys: string[], level: number, parentPath: string): FlatRow[] {\n const key = groupKeys[0];\n const remaining = groupKeys.slice(1);\n const groups = new Map<any, any[]>();\n for (const row of rows) {\n const val = row[key];\n if (!groups.has(val)) groups.set(val, []);\n groups.get(val)!.push(row);\n }\n const col = this._cols.find(c => c.key === key);\n const result: FlatRow[] = [];\n for (const [val, groupRows] of groups) {\n const path = parentPath ? `${parentPath}||${key}=${val}` : `${key}=${val}`;\n const expanded = !this.collapsedPaths.has(path);\n result.push({\n _type: 'group', _key: key, _value: val,\n _label: this.getCellDisplayByKey(val, col!, undefined),\n _colLabel: col?.label ?? key,\n _level: level, _count: groupRows.length,\n _expanded: expanded, _path: path,\n });\n if (expanded) {\n if (remaining.length > 0) {\n result.push(...this.flattenGroups(groupRows, remaining, level + 1, path));\n } else {\n groupRows.forEach((r, i) => result.push({ _type: 'data', _data: r, _rowIndex: i }));\n }\n }\n }\n return result;\n }\n\n // ─── Sort ─────────────────────────────────────────────────────────────────────\n\n onHeaderClick(col: InternalColumn, event: MouseEvent): void {\n if (!col.sortable) return;\n if (this._suppressNextHeaderClick || this._columnDragJustEnded) return;\n const existing = this.sortStates.get(col.key);\n if (event.shiftKey) {\n if (existing) {\n existing.asc ? this.sortStates.set(col.key, { ...existing, asc: false })\n : this.sortStates.delete(col.key);\n } else {\n this.sortStates.set(col.key, { key: col.key, asc: true, index: this.sortCounter++ });\n }\n } else {\n this.sortStates.clear();\n this.sortStates.set(col.key, { key: col.key, asc: existing ? !existing.asc : true, index: 0 });\n this.sortCounter = 1;\n }\n this.sortChange.emit({ sorts: [...this.sortStates.values()].map(s => ({ key: s.key, asc: s.asc })) });\n this.processData();\n }\n\n getSortState(key: string): SortState | undefined { return this.sortStates.get(key); }\n\n clearSort(): void { this.sortStates.clear(); this.processData(); }\n\n // ─── Column search ────────────────────────────────────────────────────────────\n\n onColumnSearch(key: string, value: string): void {\n this.columnSearch[key] = value;\n this.currentPage = 1;\n this.processData();\n }\n\n // ─── Excel filter ─────────────────────────────────────────────────────────────\n\n openExcelFilter(key: string, event: Event): void {\n event.stopPropagation();\n if (this.openFilterKey === key) { this.openFilterKey = null; return; }\n this.buildExcelFilterItems(key);\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.filterDropdownPos = {\n top: rect.bottom + 4,\n left: Math.max(4, Math.min(rect.left, window.innerWidth - 264)),\n };\n this.openFilterKey = key;\n }\n\n private getFilteredRowsExcluding(excludeKey: string): any[] {\n let rows = [...this.datasource];\n\n if (this.globalSearch.trim()) {\n const term = this.globalSearch.toLowerCase();\n rows = rows.filter(row =>\n this.visibleCols.some(col => String(this.getCellDisplay(row, col)).toLowerCase().includes(term))\n );\n }\n\n for (const col of this._cols) {\n const term = (this.columnSearch[col.key] ?? '').trim().toLowerCase();\n if (term) {\n rows = rows.filter(row => String(this.getCellDisplay(row, col)).toLowerCase().includes(term));\n }\n }\n\n for (const [key, activeSet] of Object.entries(this.excelFilters)) {\n if (key === excludeKey) continue;\n if (activeSet.size > 0) {\n rows = rows.filter(row => activeSet.has(row[key]));\n }\n }\n\n return rows;\n }\n\n private buildExcelFilterItems(key: string): void {\n const activeSet = this.excelFilters[key] ?? new Set();\n const col = this._cols.find(c => c.key === key)!;\n const seen = new Map<any, string>();\n for (const row of this.getFilteredRowsExcluding(key)) {\n const val = row[key];\n if (!seen.has(val)) seen.set(val, this.getCellDisplayByKey(val, col, undefined));\n }\n this.excelFilterState[key] = {\n search: this.excelFilterState[key]?.search ?? '',\n allItems: [...seen.entries()].map(([value, label]) => ({\n value, label,\n checked: activeSet.size === 0 || activeSet.has(value),\n })),\n };\n }\n\n getFilteredExcelItems(key: string): ExcelFilterState['allItems'] {\n const state = this.excelFilterState[key];\n if (!state) return [];\n const s = state.search.toLowerCase();\n return s ? state.allItems.filter(i => i.label.toLowerCase().includes(s)) : state.allItems;\n }\n\n isAllExcelChecked(key: string): boolean {\n const state = this.excelFilterState[key];\n return !!state && state.allItems.every(i => i.checked);\n }\n\n toggleAllExcelFilter(key: string, checked: boolean): void {\n this.excelFilterState[key]?.allItems.forEach(i => (i.checked = checked));\n }\n\n applyExcelFilter(key: string): void {\n const state = this.excelFilterState[key];\n if (!state) return;\n const checked = state.allItems.filter(i => i.checked).map(i => i.value);\n if (checked.length === state.allItems.length) {\n delete this.excelFilters[key];\n } else {\n this.excelFilters[key] = new Set(checked);\n }\n this.openFilterKey = null;\n this.currentPage = 1;\n this.processData();\n }\n\n clearExcelFilter(key: string, event?: Event): void {\n event?.stopPropagation();\n delete this.excelFilters[key];\n if (this.excelFilterState[key]) this.excelFilterState[key].allItems.forEach(i => (i.checked = true));\n this.processData();\n }\n\n hasActiveFilter(key: string): boolean {\n return !!this.excelFilters[key] && this.excelFilters[key].size > 0;\n }\n\n clearAllFilters(): void {\n this.excelFilters = {};\n this.excelFilterState = {};\n this.columnSearch = {};\n this.globalSearch = '';\n this.currentPage = 1;\n this.processData();\n }\n\n get hasAnyFilter(): boolean {\n return !!this.globalSearch.trim()\n || Object.values(this.columnSearch).some(v => !!v?.trim())\n || Object.values(this.excelFilters).some(s => s.size > 0);\n }\n\n // ─── Grouping ─────────────────────────────────────────────────────────────────\n\n addGroup(key: string): void {\n if (!this.activeGroups.includes(key)) {\n this.activeGroups.push(key);\n this.collapsedPaths.clear();\n this.processData();\n }\n }\n\n removeGroup(key: string): void {\n this.activeGroups = this.activeGroups.filter(k => k !== key);\n this.collapsedPaths.clear();\n this.processData();\n }\n\n clearGroups(): void { this.activeGroups = []; this.collapsedPaths.clear(); this.processData(); }\n\n toggleGroup(path: string): void {\n this.collapsedPaths.has(path) ? this.collapsedPaths.delete(path) : this.collapsedPaths.add(path);\n this.processData();\n }\n\n expandAll(): void { this.collapsedPaths.clear(); this.processData(); }\n\n collapseAll(): void {\n this.flatRows\n .filter((r): r is Extract<FlatRow, { _type: 'group' }> => r._type === 'group' && r._level === 0)\n .forEach(r => this.collapsedPaths.add(r._path));\n this.processData();\n }\n\n onGroupPanelDrop(event: CdkDragDrop<string[]>): void {\n moveItemInArray(this.activeGroups, event.previousIndex, event.currentIndex);\n this.collapsedPaths.clear();\n this.processData();\n }\n\n getGroupColLabel(key: string): string {\n return this._cols.find(c => c.key === key)?.label ?? key;\n }\n\n // ─── Column config ────────────────────────────────────────────────────────────\n\n toggleColumnVisibility(col: InternalColumn): void {\n col._hidden = !col._hidden;\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.processData();\n }\n\n toggleColumnPin(col: InternalColumn): void {\n col._pinned = !col._pinned;\n const pinned = this._cols.filter(c => c._pinned);\n const unpinned = this._cols.filter(c => !c._pinned);\n this._cols = [...pinned, ...unpinned];\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.closeColumnMenu();\n this.cdr.markForCheck();\n }\n\n // Header drag: CDK indices are relative to visibleCols DOM order\n onColumnReorder(event: CdkDragDrop<InternalColumn[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n const fromCol = this._visibleCols[event.previousIndex];\n const toCol = this._visibleCols[event.currentIndex];\n if (!fromCol || !toCol) return;\n const fromIdx = this._cols.indexOf(fromCol);\n const toIdx = this._cols.indexOf(toCol);\n if (fromIdx === -1 || toIdx === -1) return;\n moveItemInArray(this._cols, fromIdx, toIdx);\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.cdr.markForCheck();\n }\n\n // Config panel drag: CDK indices are relative to _cols directly\n onConfigColumnReorder(event: CdkDragDrop<InternalColumn[]>): void {\n if (event.previousIndex === event.currentIndex) return;\n moveItemInArray(this._cols, event.previousIndex, event.currentIndex);\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.cdr.markForCheck();\n }\n\n autoSizeColumn(col: InternalColumn, event?: Event): void {\n event?.stopPropagation();\n const labelPx = col.label.length * 8 + 48;\n const sample = this.datasource.slice(0, 200);\n const maxDataPx = sample.reduce((max, row) => {\n const len = String(this.getCellDisplay(row, col)).length * 7 + 24;\n return Math.max(max, len);\n }, 0);\n col._width = Math.max(col.minWidth ?? 60, Math.min(Math.max(labelPx, maxDataPx), 420));\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.closeColumnMenu();\n this.cdr.markForCheck();\n }\n\n autoSizeAll(): void { this.visibleCols.forEach(c => this.autoSizeColumn(c)); }\n\n // ─── Column menu ──────────────────────────────────────────────────────────────\n\n openColumnMenu(key: string, event: Event): void {\n event.stopPropagation();\n this.columnMenuKey = this.columnMenuKey === key ? null : key;\n if (this.columnMenuKey) {\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.columnMenuPos = { top: rect.bottom + 4, left: Math.max(rect.left - 100, 4) };\n }\n }\n\n closeColumnMenu(): void { this.columnMenuKey = null; }\n\n getColumnByKey(key: string): InternalColumn | undefined {\n return this._cols.find(c => c.key === key);\n }\n\n // ─── Column resize ────────────────────────────────────────────────────────────\n\n startResize(col: InternalColumn, event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.resizing = { key: col.key, startX: event.clientX, startWidth: col._width };\n }\n\n @HostListener('document:mousemove', ['$event'])\n onMouseMove(event: MouseEvent): void {\n if (!this.resizing) return;\n const col = this._cols.find(c => c.key === this.resizing!.key);\n if (!col) return;\n col._width = Math.max(col.minWidth ?? 60, this.resizing.startWidth + (event.clientX - this.resizing.startX));\n this.recomputePinnedOffsets();\n this._totalWidth = this._visibleCols.reduce((s, c) => s + c._width, 0)\n + (this.rowSelection === 'multiple' ? 36 : 0);\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onMouseUp(): void {\n if (this.resizing) {\n this._suppressNextHeaderClick = true;\n setTimeout(() => { this._suppressNextHeaderClick = false; }, 100);\n }\n this.resizing = null;\n this.cdr.markForCheck();\n }\n\n onColumnDragStarted(): void { this._columnDragJustEnded = false; }\n\n onColumnDragEnded(): void {\n this._columnDragJustEnded = true;\n setTimeout(() => { this._columnDragJustEnded = false; }, 100);\n }\n\n showAllColumns(): void {\n this._cols.forEach(c => (c._hidden = false));\n this.recomputePinnedOffsets();\n this.updateVisibleCols();\n this.cdr.markForCheck();\n }\n\n // ─── Header scroll sync ───────────────────────────────────────────────────────\n\n onBodyScroll(event: Event): void {\n const scrollLeft = (event.target as HTMLElement).scrollLeft;\n if (this.headerScrollRef) {\n this.headerScrollRef.nativeElement.scrollLeft = scrollLeft;\n }\n }\n\n // ─── Row selection ────────────────────────────────────────────────────────────\n\n onRowClick(row: any, event: MouseEvent): void {\n this.rowClick.emit(row);\n if (!this.rowSelection) return;\n if (this.rowSelection === 'single') {\n this.selectedRows.clear();\n this.selectedRows.add(row);\n } else {\n if (this.selectedRows.has(row)) {\n this.selectedRows.delete(row);\n } else {\n if (!event.ctrlKey) this.selectedRows.clear();\n this.selectedRows.add(row);\n }\n }\n this.selectionChange.emit([...this.selectedRows]);\n }\n\n toggleRowSelect(row: any, event: Event): void {\n event.stopPropagation();\n this.selectedRows.has(row) ? this.selectedRows.delete(row) : this.selectedRows.add(row);\n this.selectionChange.emit([...this.selectedRows]);\n }\n\n toggleSelectAll(checked: boolean): void {\n this.selectedRows.clear();\n if (checked) {\n this.flatRows.filter(r => r._type === 'data').forEach((r: any) => this.selectedRows.add(r._data));\n }\n this.selectionChange.emit([...this.selectedRows]);\n }\n\n get allSelected(): boolean {\n const dr = this.flatRows.filter(r => r._type === 'data');\n return dr.length > 0 && dr.every((r: any) => this.selectedRows.has(r._data));\n }\n\n get someSelected(): boolean {\n return this.selectedRows.size > 0 && !this.allSelected;\n }\n\n // ─── Pagination ───────────────────────────────────────────────────────────────\n\n get _total(): number { return this.autoMode ? this._filteredTotal : this.totalRecords; }\n get totalPages(): number { return Math.ceil(this._total / this.pageSize) || 1; }\n\n get pageNumbers(): number[] {\n const total = this.totalPages;\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n const pages: number[] = [1];\n if (this.currentPage > 3) pages.push(-1);\n for (let i = Math.max(2, this.currentPage - 1); i <= Math.min(total - 1, this.currentPage + 1); i++) pages.push(i);\n if (this.currentPage < total - 2) pages.push(-1);\n pages.push(total);\n return pages;\n }\n\n get startRecord(): number { return this._total === 0 ? 0 : (this.currentPage - 1) * this.pageSize + 1; }\n get endRecord(): number { return Math.min(this.currentPage * this.pageSize, this._total); }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages) return;\n this.currentPage = page;\n this.processData();\n this.pageChange.emit({ page: this.currentPage, pageSize: this.pageSize });\n }\n\n onPageSizeChange(size: number): void {\n this.pageSize = Number(size);\n this.currentPage = 1;\n this.processData();\n this.pageSizeChange.emit({ page: 1, pageSize: this.pageSize });\n }\n\n // ─── Export Excel ─────────────────────────────────────────────────────────────\n\n exportExcel(): void {\n this._doExportExcel().catch(err => console.error('Excel export failed:', err));\n }\n\n private async _doExportExcel(): Promise<void> {\n const xlsxMod = await import('xlsx-js-style');\n // Handle both ESM default-export and CJS direct-export shapes\n const XLSX: any = (xlsxMod as any).default ?? xlsxMod;\n\n const cols = this.visibleCols;\n const filteredRows = this.getSortedFilteredRows();\n\n const thinBorder = (rgb = 'D9D9D9') => ({\n top: { style: 'thin', color: { rgb } },\n bottom: { style: 'thin', color: { rgb } },\n left: { style: 'thin', color: { rgb } },\n right: { style: 'thin', color: { rgb } },\n });\n\n const headerStyle = {\n font: { bold: true, color: { rgb: 'FFFFFF' }, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: '4472C4' } },\n alignment: { horizontal: 'center', vertical: 'center', wrapText: true },\n border: thinBorder('4472C4'),\n };\n\n // Per-level group header colors (background / font)\n const groupColors = [\n { bg: 'D9E1F2', fg: '1F3864' },\n { bg: 'E2EFDA', fg: '375623' },\n { bg: 'FFF2CC', fg: '7F6000' },\n ];\n\n const dataStyle = {\n font: { sz: 10 },\n border: thinBorder(),\n };\n\n const ws: any = {};\n const merges: { s: { r: number; c: number }; e: { r: number; c: number } }[] = [];\n let rowIdx = 0;\n\n // ── Header group row ────────────────────────────────────────────────────────\n if (this.hasHeaderGroups) {\n let colIdx = 0;\n let i = 0;\n while (i < cols.length) {\n const groupLabel = cols[i].headerGroup ?? '';\n let span = 1;\n while (i + span < cols.length && (cols[i + span].headerGroup ?? '') === groupLabel) span++;\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: colIdx })] = { v: groupLabel, t: 's', s: headerStyle };\n for (let k = 1; k < span; k++) {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: colIdx + k })] = { v: '', t: 's', s: headerStyle };\n }\n if (span > 1) merges.push({ s: { r: rowIdx, c: colIdx }, e: { r: rowIdx, c: colIdx + span - 1 } });\n colIdx += span;\n i += span;\n }\n rowIdx++;\n }\n\n // ── Column label row ────────────────────────────────────────────────────────\n cols.forEach((col, ci) => {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = { v: col.label, t: 's', s: headerStyle };\n });\n rowIdx++;\n\n // ── Data / group rows ───────────────────────────────────────────────────────\n const writeDataRows = (rows: any[]): void => {\n rows.forEach(r => {\n cols.forEach((col, ci) => {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: this.getCellDisplay(r, col), t: 's', s: dataStyle,\n };\n });\n rowIdx++;\n });\n };\n\n const buildExcelRows = (rows: any[], groupKeys: string[], level: number): void => {\n if (groupKeys.length === 0) { writeDataRows(rows); return; }\n const key = groupKeys[0];\n const remaining = groupKeys.slice(1);\n const groups = new Map<any, any[]>();\n for (const row of rows) {\n const v = row[key]; if (!groups.has(v)) groups.set(v, []); groups.get(v)!.push(row);\n }\n const colDef = this._cols.find(c => c.key === key)!;\n const color = groupColors[Math.min(level, groupColors.length - 1)];\n const groupStyle = {\n font: { bold: true, color: { rgb: color.fg }, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: color.bg } },\n alignment: { horizontal: 'left', vertical: 'center' },\n border: thinBorder(),\n };\n const subtotalStyle = {\n font: { bold: true, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: 'F2F2F2' } },\n border: thinBorder(),\n };\n const sumCols = cols.filter(c => c.sumOnPdf);\n\n for (const [val, gr] of groups) {\n const label = this.getCellDisplayByKey(val, colDef, undefined);\n const indent = ' '.repeat(level);\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: 0 })] = {\n v: `${indent}${colDef?.label ?? key}: ${label} (${gr.length} rows)`, t: 's', s: groupStyle,\n };\n for (let k = 1; k < cols.length; k++) {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: k })] = { v: '', t: 's', s: groupStyle };\n }\n if (cols.length > 1) merges.push({ s: { r: rowIdx, c: 0 }, e: { r: rowIdx, c: cols.length - 1 } });\n rowIdx++;\n\n buildExcelRows(gr, remaining, level + 1);\n\n if (sumCols.length > 0) {\n cols.forEach((col, ci) => {\n if (col.sumOnPdf) {\n const s = gr.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: s, t: 'n', s: { ...subtotalStyle, alignment: { horizontal: 'right' } },\n };\n } else {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: ci === 0 ? `${indent}Subtotal: ${label}` : '', t: 's', s: subtotalStyle,\n };\n }\n });\n rowIdx++;\n }\n }\n };\n\n if (this.activeGroups.length > 0) {\n buildExcelRows(filteredRows, this.activeGroups, 0);\n } else {\n writeDataRows(filteredRows);\n }\n\n // ── Grand total row ─────────────────────────────────────────────────────────\n const sumCols = cols.filter(c => c.sumOnPdf);\n if (sumCols.length > 0) {\n const grandStyle = {\n font: { bold: true, sz: 10 },\n fill: { patternType: 'solid', fgColor: { rgb: 'D9D9D9' } },\n border: thinBorder('000000'),\n };\n cols.forEach((col, ci) => {\n if (col.sumOnPdf) {\n const s = filteredRows.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: s, t: 'n', s: { ...grandStyle, alignment: { horizontal: 'right' } },\n };\n } else {\n ws[XLSX.utils.encode_cell({ r: rowIdx, c: ci })] = {\n v: ci === 0 ? 'Grand Total' : '', t: 's', s: grandStyle,\n };\n }\n });\n rowIdx++;\n }\n\n ws['!ref'] = XLSX.utils.encode_range({ s: { r: 0, c: 0 }, e: { r: rowIdx - 1, c: cols.length - 1 } });\n ws['!cols'] = cols.map(c => ({ wpx: c._width }));\n if (merges.length) ws['!merges'] = merges;\n\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, (this.title || 'Report').slice(0, 31));\n XLSX.writeFile(wb, `${this.title || 'report'}.xlsx`);\n }\n\n // ─── Export PDF ───────────────────────────────────────────────────────────────\n\n async exportPdf(): Promise<void> {\n const [{ jsPDF }, { default: autoTable }] = await Promise.all([\n import('jspdf'),\n import('jspdf-autotable'),\n ]);\n\n const cfg = this.pdfConfig ?? {};\n const orientation = cfg.orientation ?? 'landscape';\n const doc = new jsPDF({ orientation, unit: 'pt', format: 'a4' });\n const pw = doc.internal.pageSize.getWidth();\n const ph = doc.internal.pageSize.getHeight();\n const margin = 36;\n const usableW = pw - margin * 2;\n let yPos = margin;\n\n // Logo (top-left) + Company name/address (center)\n const logoH = 50;\n if (cfg.logo) {\n try {\n const img = await this._loadImageForPdf(cfg.logo);\n const logoW = (img.naturalWidth / img.naturalHeight) * logoH;\n doc.addImage(img.dataUrl, img.imgType as any, margin, yPos, logoW, logoH);\n } catch { /* ignore broken logo */ }\n }\n if (cfg.companyName) {\n doc.setFont('helvetica', 'bold'); doc.setFontSize(16); doc.setTextColor(0, 0, 0);\n doc.text(cfg.companyName, pw / 2, yPos + 20, { align: 'center' });\n }\n if (cfg.companyAddress) {\n doc.setFont('helvetica', 'normal'); doc.setFontSize(9); doc.setTextColor(60, 60, 60);\n doc.text(cfg.companyAddress, pw / 2, yPos + 34, { align: 'center' });\n }\n if (cfg.logo || cfg.companyName || cfg.companyAddress) { yPos += logoH + 10; }\n\n // Report name: ══════ Report Name ══════ (double lines on each side, centered)\n if (cfg.reportName) {\n doc.setFont('helvetica', 'bold');\n doc.setFontSize(12);\n doc.setTextColor(0, 0, 0);\n const textW = doc.getTextWidth(cfg.reportName);\n const cx = pw / 2;\n const gap = 12;\n const ty = yPos + 16; // text baseline\n const ly = ty - 5; // top line Y\n doc.setLineWidth(0.4);\n doc.setDrawColor(0, 0, 0);\n // left double lines — end exactly where the text begins\n doc.line(margin, ly, cx - textW / 2 - gap, ly);\n doc.line(margin, ly + 2, cx - textW / 2 - gap, ly + 2);\n // centered report name\n doc.text(cfg.reportName, cx, ty, { align: 'center' });\n // right double lines — start exactly where the text ends\n doc.line(cx + textW / 2 + gap, ly, pw - margin, ly);\n doc.line(cx + textW / 2 + gap, ly + 2, pw - margin, ly + 2);\n yPos = ty + 14;\n }\n\n // Build table body (recursive, supports groups + subtotals)\n const cols = this.visibleCols;\n const filteredRows = this.getSortedFilteredRows();\n const totalGridW = cols.reduce((s, c) => s + c._width, 0) || 1;\n const colWidths = cols.map(c => (c._width / totalGridW) * usableW);\n const sumCols = cols.filter(c => c.sumOnPdf);\n\n const body: any[][] = [];\n // Light gray shading per group level — no blue, clean financial-report look\n const groupBg = [[242, 242, 242], [247, 247, 247], [252, 252, 252]];\n const subtotalBg = [[232, 232, 232], [237, 237, 237], [242, 242, 242]];\n\n const buildPdfRows = (rows: any[], groupKeys: string[], level: number): void => {\n if (groupKeys.length === 0) {\n rows.forEach(r => body.push(cols.map(col => ({\n content: this.getCellDisplay(r, col),\n styles: { halign: col.align ?? 'left', textColor: [0, 0, 0] },\n }))));\n return;\n }\n const key = groupKeys[0];\n const remaining = groupKeys.slice(1);\n const groups = new Map<any, any[]>();\n for (const row of rows) { const v = row[key]; if (!groups.has(v)) groups.set(v, []); groups.get(v)!.push(row); }\n const colDef = this._cols.find(c => c.key === key)!;\n const bg = groupBg[Math.min(level, groupBg.length - 1)];\n const sb = subtotalBg[Math.min(level, subtotalBg.length - 1)];\n\n for (const [val, gr] of groups) {\n const label = this.getCellDisplayByKey(val, colDef, undefined);\n const indent = ' '.repeat(level);\n body.push([{\n content: `${indent}${colDef?.label ?? key}: ${label} (${gr.length.toLocaleString()} rows)`,\n colSpan: cols.length,\n styles: { fontStyle: 'bold', fillColor: bg, textColor: [0, 0, 0] },\n }]);\n buildPdfRows(gr, remaining, level + 1);\n if (sumCols.length > 0) {\n body.push(cols.map((col, i) => {\n if (col.sumOnPdf) {\n const s = gr.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n return { content: this.decimalPipe.transform(s, '1.0-2') ?? String(s), styles: { fontStyle: 'bold', halign: 'right', fillColor: sb, textColor: [0, 0, 0] } };\n }\n return { content: i === 0 ? `${indent}Subtotal: ${label}` : '', styles: { fontStyle: 'bold', fillColor: sb, textColor: [0, 0, 0] } };\n }));\n }\n }\n };\n\n if (this.activeGroups.length > 0) {\n buildPdfRows(filteredRows, this.activeGroups, 0);\n } else {\n filteredRows.forEach(r => body.push(cols.map(col => ({\n content: this.getCellDisplay(r, col),\n styles: { halign: col.align ?? 'left', textColor: [0, 0, 0] },\n }))));\n }\n\n // Grand total row\n if (sumCols.length > 0) {\n body.push(cols.map((col, i) => {\n if (col.sumOnPdf) {\n const s = filteredRows.map(r => Number(r[col.key])).filter(v => !isNaN(v)).reduce((a, b) => a + b, 0);\n return { content: this.decimalPipe.transform(s, '1.0-2') ?? String(s), styles: { fontStyle: 'bold', halign: 'right', fillColor: [220, 220, 220], textColor: [0, 0, 0] } };\n }\n return { content: i === 0 ? 'Grand Total' : '', styles: { fontStyle: 'bold', fillColor: [220, 220, 220], textColor: [0, 0, 0] } };\n }));\n }\n\n // Render table: clean black-bordered financial-report style\n const colStylesMap: Record<number, any> = {};\n cols.forEach((_col, i) => { colStylesMap[i] = { cellWidth: colWidths[i] }; });\n\n // Build double header rows when headerGroup is used\n const colLabelsRow = cols.map((c, i) => ({ content: c.label, styles: { halign: c.align ?? 'left', cellWidth: colWidths[i] } }));\n const pdfHead: any[][] = [];\n if (this.hasHeaderGroups) {\n const groupRow: any[] = [];\n let i = 0;\n while (i < cols.length) {\n const groupLabel = cols[i].headerGroup ?? '';\n let span = 1;\n while (i + span < cols.length && (cols[i + span].headerGroup ?? '') === groupLabel) span++;\n groupRow.push({ content: groupLabel, colSpan: span, styles: { halign: 'center', fontStyle: 'bold' } });\n i += span;\n }\n pdfHead.push(groupRow);\n }\n pdfHead.push(colLabelsRow);\n\n autoTable(doc, {\n head: pdfHead,\n body,\n startY: yPos,\n margin: { left: margin, right: margin, top: margin, bottom: margin + 18 },\n styles: {\n fontSize: 8,\n cellPadding: { top: 4, right: 6, bottom: 4, left: 6 },\n overflow: 'linebreak',\n lineColor: [0, 0, 0],\n lineWidth: 0.3,\n textColor: [0, 0, 0],\n fillColor: [255, 255, 255],\n },\n headStyles: {\n fillColor: [255, 255, 255],\n textColor: [0, 0, 0],\n fontStyle: 'bold',\n fontSize: 8.5,\n lineColor: [0, 0, 0],\n lineWidth: 0.4,\n },\n alternateRowStyles: cfg.alternatingRows ? { fillColor: [248, 248, 248] } : {},\n columnStyles: colStylesMap,\n showHead: 'everyPage',\n tableLineColor: [0, 0, 0],\n tableLineWidth: 0.4,\n } as any);\n\n // Footer: page numbers + timestamp on every page\n const total = (doc as any).internal.pages.length - 1;\n const ts = new Date().toLocaleString();\n for (let p = 1; p <= total; p++) {\n doc.setPage(p);\n doc.setFontSize(7.5); doc.setTextColor(100);\n doc.text(`Generated: ${ts}`, margin, ph - 14);\n doc.text(`Page ${p} of ${total}`, pw - margin, ph - 14, { align: 'right' });\n doc.setTextColor(0);\n }\n\n doc.save(`${this.title || 'report'}.pdf`);\n }\n\n private async _loadImageForPdf(src: string): Promise<{ dataUrl: string; imgType: string; naturalWidth: number; naturalHeight: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth; canvas.height = img.naturalHeight;\n canvas.getContext('2d')!.drawImage(img, 0, 0);\n const ext = (src.split('?')[0].split('.').pop() ?? '').toLowerCase();\n const imgType = ext === 'png' ? 'PNG' : 'JPEG';\n resolve({ dataUrl: canvas.toDataURL(`image/${imgType.toLowerCase()}`), imgType, naturalWidth: img.naturalWidth, naturalHeight: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = src;\n });\n }\n\n // ─── Aggregates ───────────────────────────────────────────────────────────────\n\n getAggregate(col: InternalColumn): string {\n if (!col.aggregate) return '';\n const vals = this.flatRows\n .filter(r => r._type === 'data')\n .map((r: any) => Number(r._data[col.key]))\n .filter(v => !isNaN(v));\n if (!vals.length) return '--';\n const fmt = (n: number) => this.decimalPipe.transform(n, '1.0-2') ?? String(n);\n switch (col.aggregate) {\n case 'sum': return fmt(vals.reduce((a, b) => a + b, 0));\n case 'avg': return fmt(vals.reduce((a, b) => a + b, 0) / vals.length);\n case 'count': return String(vals.length);\n case 'min': return fmt(Math.min(...vals));\n case 'max': return fmt(Math.max(...vals));\n default: return '';\n }\n }\n\n hasAnyAggregate(): boolean { return this.visibleCols.some(c => !!c.aggregate); }\n\n // ─── Cell display ─────────────────────────────────────────────────────────────\n\n getCellDisplay(row: any, col: InternalColumn): string {\n return this.getCellDisplayByKey(row[col.key], col, row);\n }\n\n getCellDisplayByKey(raw: any, col: InternalColumn, row: any): string {\n if (col.displayFn && row !== undefined) return col.displayFn(raw, row);\n if (col.enums?.length) return col.enums.find(e => e.value === raw)?.label ?? (raw ?? '--');\n if (raw === null || raw === undefined || raw === '') return '--';\n switch (col.displayType) {\n case 'date': return this.datePipe.transform(raw, 'MM/dd/yyyy') ?? '--';\n case 'datetime': return this.datePipe.transform(raw, 'MM/dd/yyyy HH:mm') ?? '--';\n case 'time': return this.datePipe.transform(raw, 'HH:mm') ?? '--';\n case 'currency': return '$' + Number(raw).toLocaleString('en-US', { minimumFractionDigits: 2 });\n case 'number': return Number(raw).toLocaleString();\n case 'percentage': return Number(raw).toFixed(2) + '%';\n default: return String(raw);\n }\n }\n\n getCellClass(row: any, col: InternalColumn): string {\n if (!col.cellClass) return '';\n return typeof col.cellClass === 'function' ? col.cellClass(row[col.key], row) : col.cellClass;\n }\n\n // ─── Copy cell ────────────────────────────────────────────────────────────────\n\n copyCell(value: string, event: Event): void {\n event.stopPropagation();\n navigator.clipboard?.writeText(value).then(() => {\n this.copiedCell = value;\n setTimeout(() => (this.copiedCell = null), 1500);\n });\n }\n\n // ─── Skeleton / empty ─────────────────────────────────────────────────────────\n\n get skeletonRows(): number[] { return Array.from({ length: Math.min(this.pageSize, 15) }); }\n\n get isEmpty(): boolean {\n return !this.loading && this.flatRows.length === 0;\n }\n\n // ─── Global click close ───────────────────────────────────────────────────────\n\n @HostListener('document:click')\n onDocumentClick(): void {\n this.openFilterKey = null;\n this.columnMenuKey = null;\n }\n\n // ─── TrackBy ─────────────────────────────────────────────────────────────────\n\n trackByRow = (_: number, row: FlatRow): any =>\n row._type === 'data' ? `d-${row._rowIndex}` : `g-${(row as any)._path}`;\n\n trackByCol = (_: number, col: InternalColumn): string => col.key;\n\n trackByStr = (_: number, s: string): string => s;\n\n asGroupRow = (row: FlatRow): Extract<FlatRow, { _type: 'group' }> =>\n row as Extract<FlatRow, { _type: 'group' }>;\n\n asDataRow = (row: FlatRow): Extract<FlatRow, { _type: 'data' }> =>\n row as Extract<FlatRow, { _type: 'data' }>;\n}\n","<div class=\"osl-rg\" (click)=\"closeColumnMenu(); openFilterKey = null; $event.stopPropagation()\">\n\n <!-- ══ TOOLBAR ══════════════════════════════════════════════════════════════ -->\n <div class=\"osl-rg-toolbar\">\n <div class=\"osl-rg-toolbar__left\">\n @if (title) { <span class=\"osl-rg-title\">{{ title }}</span> }\n @if (!loading) {\n @if (_filteredTotal !== datasource.length) {\n <span class=\"osl-rg-filter-badge\">\n <span class=\"osl-rg-filter-badge__dot\"></span>\n {{ _filteredTotal | number }} of {{ datasource.length | number }} rows\n </span>\n } @else {\n <span class=\"osl-rg-record-count\">{{ datasource.length | number }} rows</span>\n }\n }\n </div>\n <div class=\"osl-rg-toolbar__right\">\n\n <!-- Global search -->\n <div class=\"osl-rg-global-search\">\n <svg class=\"osl-rg-global-search__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\"/>\n </svg>\n <input class=\"osl-rg-global-search__input\" placeholder=\"Search all columns…\"\n [(ngModel)]=\"globalSearch\" (ngModelChange)=\"currentPage=1; processData()\" />\n @if (globalSearch) {\n <button class=\"osl-rg-global-search__clear\" (click)=\"globalSearch=''; processData()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n </div>\n\n <!-- Sort active badge -->\n @if (sortStates.size > 0) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--active\" (click)=\"clearSort()\" title=\"Clear sort\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M11 5H4M11 9H4M11 13H4M18 4v16M15 7l3-3 3 3M15 17l3 3 3-3\"/>\n </svg>\n <span>{{ sortStates.size }} sort{{ sortStates.size > 1 ? 's' : '' }}</span>\n <svg class=\"rg-icon rg-icon--xs\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n\n <!-- Filter active badge -->\n @if (hasAnyFilter) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--danger\" (click)=\"clearAllFilters()\" title=\"Clear all filters\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M22 3H2l8 9.46V19l4 2V12.46z\"/></svg>\n <span>Filtered</span>\n <svg class=\"rg-icon rg-icon--xs\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n\n <!-- Group toggle -->\n <button class=\"osl-rg-toolbar-btn\" [class.osl-rg-toolbar-btn--on]=\"showGroupPanel\"\n (click)=\"showGroupPanel=!showGroupPanel\" title=\"Group panel\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 3H8a2 2 0 0 0-2 2v2h12V5a2 2 0 0 0-2-2z\"/>\n </svg>\n <span>Group</span>\n </button>\n\n <!-- Expand / collapse when grouped -->\n @if (activeGroups.length > 0) {\n <button class=\"osl-rg-toolbar-btn\" (click)=\"expandAll()\" title=\"Expand all\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 20 5-5 5 5M7 4l5 5 5-5\"/></svg>\n </button>\n <button class=\"osl-rg-toolbar-btn\" (click)=\"collapseAll()\" title=\"Collapse all\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m7 15 5-5 5 5M7 9l5 5 5 5\"/></svg>\n </button>\n }\n\n <!-- Auto-size all -->\n <button class=\"osl-rg-toolbar-btn\" (click)=\"autoSizeAll()\" title=\"Auto-size all columns\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 6H3M21 18H3\"/><path d=\"M8 3 3 6l5 3M16 3l5 3-5 3M8 15l-5 3 5 3M16 15l5 3-5 3\"/>\n </svg>\n <span>Auto-size</span>\n </button>\n\n <!-- Column config -->\n <button class=\"osl-rg-toolbar-btn\" [class.osl-rg-toolbar-btn--on]=\"showColumnConfig\"\n (click)=\"showColumnConfig=!showColumnConfig; $event.stopPropagation()\" title=\"Column settings\">\n <svg class=\"rg-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 6h16M4 12h16M4 18h16\"/>\n <circle cx=\"8\" cy=\"6\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"12\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"8\" cy=\"18\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Columns</span>\n </button>\n\n <!-- Export Excel -->\n @if (exportable) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--excel\" (click)=\"exportExcel()\" title=\"Export to Excel\">\n <svg class=\"rg-icon rg-icon--excel\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" rx=\"3\" fill=\"#1D6F42\"/>\n <path d=\"M13.5 3H7a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7.5L13.5 3z\" fill=\"#fff\" opacity=\".15\"/>\n <path d=\"M13.5 3v4.5H18L13.5 3z\" fill=\"#fff\" opacity=\".3\"/>\n <path d=\"M8 9.5l2.3 3.5L8 16.5h1.6l1.4-2.3 1.4 2.3H14l-2.3-3.5 2.3-3.5h-1.6l-1.4 2.3-1.4-2.3H8z\" fill=\"#fff\"/>\n </svg>\n <span>Export Excel</span>\n </button>\n }\n\n <!-- Export PDF -->\n @if (exportable && pdfExportFromGrid) {\n <button class=\"osl-rg-toolbar-btn osl-rg-toolbar-btn--pdf\" (click)=\"exportPdf()\" title=\"Export to PDF\">\n <svg class=\"rg-icon rg-icon--pdf\" viewBox=\"0 0 24 24\">\n <rect width=\"24\" height=\"24\" rx=\"3\" fill=\"#D32F2F\"/>\n <path d=\"M13.5 3H7a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V7.5L13.5 3z\" fill=\"#fff\" opacity=\".15\"/>\n <path d=\"M13.5 3v4.5H18L13.5 3z\" fill=\"#fff\" opacity=\".3\"/>\n <text x=\"4.5\" y=\"17.5\" fill=\"#fff\" font-size=\"6.5\" font-family=\"sans-serif\" font-weight=\"700\">PDF</text>\n </svg>\n <span>Export PDF</span>\n </button>\n }\n </div>\n </div>\n\n <!-- ══ GROUP PANEL ═══════════════════════════════════════════════════════════ -->\n @if (showGroupPanel) {\n <div class=\"osl-rg-group-panel\">\n <span class=\"osl-rg-group-panel__label\">Group by:</span>\n @if (activeGroups.length === 0) {\n <span class=\"osl-rg-group-panel__hint\">Use the ⋮ column menu → \"Group by this\"</span>\n }\n <div class=\"osl-rg-group-chips\" cdkDropList cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"activeGroups\" (cdkDropListDropped)=\"onGroupPanelDrop($event)\">\n @for (key of activeGroups; track key) {\n <div class=\"osl-rg-group-chip\" cdkDrag>\n <svg cdkDragHandle class=\"rg-drag-handle\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\"/><circle cx=\"15\" cy=\"5\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"12\" r=\"1.5\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"19\" r=\"1.5\"/><circle cx=\"15\" cy=\"19\" r=\"1.5\"/>\n </svg>\n <span>{{ getGroupColLabel(key) }}</span>\n <button class=\"osl-rg-group-chip__remove\" (click)=\"removeGroup(key)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n </div>\n }\n </div>\n @if (activeGroups.length > 0) {\n <button class=\"osl-rg-group-panel__clear\" (click)=\"clearGroups()\">Clear groups</button>\n }\n </div>\n }\n\n <!-- ══ STICKY HEADER ════════════════════════════════════════════════════════ -->\n <div class=\"osl-rg-header-wrap\" #headerScrollRef>\n\n <!-- Double header – group row (only rendered when headerGroup is used on any column) -->\n @if (hasHeaderGroups) {\n <div class=\"osl-rg-header-row osl-rg-header-row--groups\" [style.minWidth.px]=\"totalWidth\">\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-th osl-rg-th--checkbox osl-rg-th--group-span\"></div>\n }\n <div style=\"display:flex;flex:1;min-width:0;\">\n @for (group of computedHeaderGroups; track $index) {\n <div class=\"osl-rg-th osl-rg-th--group-span\"\n [class.osl-rg-th--group-span--labeled]=\"!!group.label\"\n [class.osl-rg-th--pinned]=\"group.isPinned\"\n [style.width.px]=\"group.width\"\n [style.minWidth.px]=\"group.width\"\n [style.left.px]=\"group.isPinned ? group.stickyLeft : null\"\n [style.position]=\"group.isPinned ? 'sticky' : 'relative'\"\n [style.zIndex]=\"group.isPinned ? 3 : 1\">\n @if (group.label) {\n <span class=\"osl-rg-th-group-label\">{{ group.label }}</span>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"osl-rg-header-row\" [style.minWidth.px]=\"totalWidth\">\n\n <!-- Select-all checkbox -->\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-th osl-rg-th--checkbox\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\"\n [checked]=\"allSelected\" [indeterminate]=\"someSelected\"\n (change)=\"toggleSelectAll($any($event.target).checked)\" />\n </div>\n }\n\n <!-- Column headers (drag-to-reorder) -->\n <div class=\"osl-rg-header-cols\" cdkDropList cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"_cols\" (cdkDropListDropped)=\"onColumnReorder($event)\"\n style=\"display:flex;flex:1;min-width:0;\">\n\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-th\"\n [class.osl-rg-th--pinned]=\"col._pinned\"\n [class.osl-rg-th--sorted]=\"getSortState(col.key)\"\n [class.osl-rg-th--filtered]=\"hasActiveFilter(col.key)\"\n [style.width.px]=\"col._width\"\n [style.minWidth.px]=\"col._width\"\n [style.left.px]=\"col._pinned ? col._stickyLeft : null\"\n [style.position]=\"col._pinned ? 'sticky' : 'relative'\"\n [style.zIndex]=\"col._pinned ? 3 : 1\"\n cdkDrag [cdkDragDisabled]=\"col._pinned\"\n (cdkDragStarted)=\"onColumnDragStarted()\"\n (cdkDragEnded)=\"onColumnDragEnded()\"\n (click)=\"onHeaderClick(col, $event)\">\n\n <div *cdkDragPlaceholder class=\"osl-rg-th-drag-placeholder\"></div>\n\n <!-- Pin badge -->\n @if (col._pinned) {\n <span class=\"osl-rg-th-pin-badge\" title=\"Pinned\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"9\" height=\"9\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/></svg>\n </span>\n }\n\n <!-- Label row -->\n <div class=\"osl-rg-th-content\">\n <span class=\"osl-rg-th-label\" [title]=\"col.label\">{{ col.label }}</span>\n <div class=\"osl-rg-th-actions\">\n\n <!-- Sort indicator -->\n @if (col.sortable) {\n <span class=\"osl-rg-sort-icon\"\n [class.osl-rg-sort-icon--asc]=\"getSortState(col.key)?.asc === true\"\n [class.osl-rg-sort-icon--desc]=\"getSortState(col.key)?.asc === false\">\n @if (getSortState(col.key); as s) {\n @if (s.asc) {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5m-7 7 7-7 7 7\"/></svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14m7-7-7 7-7-7\"/></svg>\n }\n @if (sortStates.size > 1) { <sup class=\"osl-rg-sort-badge\">{{ s.index + 1 }}</sup> }\n } @else {\n <svg class=\"osl-rg-sort-idle\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8 9l4-4 4 4M16 15l-4 4-4-4\"/></svg>\n }\n </span>\n }\n\n <!-- Excel filter button -->\n @if (col.filterable) {\n <button class=\"osl-rg-filter-btn\" [class.osl-rg-filter-btn--active]=\"hasActiveFilter(col.key)\"\n (click)=\"openExcelFilter(col.key, $event)\" title=\"Filter\">\n @if (hasActiveFilter(col.key)) {\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M22 3H2l8 9.46V19l4 2V12.46z\"/></svg>\n } @else {\n <svg 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\"/></svg>\n }\n </button>\n }\n\n <!-- Column menu -->\n <button class=\"osl-rg-col-menu-btn\" (click)=\"openColumnMenu(col.key, $event)\" title=\"Column options\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><circle cx=\"12\" cy=\"5\" r=\"2\"/><circle cx=\"12\" cy=\"12\" r=\"2\"/><circle cx=\"12\" cy=\"19\" r=\"2\"/></svg>\n </button>\n\n </div>\n </div>\n\n <!-- Per-column search -->\n @if (col.searchable) {\n <div class=\"osl-rg-col-search\" (click)=\"$event.stopPropagation()\">\n <svg class=\"osl-rg-col-search__icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"/><path d=\"m18 18-3.5-3.5\"/>\n </svg>\n <input class=\"osl-rg-col-search__input\" [placeholder]=\"col.label + '…'\"\n [ngModel]=\"columnSearch[col.key]\" (ngModelChange)=\"onColumnSearch(col.key, $event)\" />\n @if (columnSearch[col.key]) {\n <button class=\"osl-rg-col-search__clear\" (click)=\"columnSearch[col.key]=''; processData()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n }\n </div>\n }\n\n <!-- Resize handle -->\n @if (col.resizable) {\n <div class=\"osl-rg-resize-handle\" (mousedown)=\"startResize(col, $event)\" (dblclick)=\"autoSizeColumn(col, $event)\" (click)=\"$event.stopPropagation()\"></div>\n }\n\n\n </div><!-- /osl-rg-th -->\n }\n\n </div><!-- /header-cols -->\n </div><!-- /header-row -->\n </div><!-- /header-wrap -->\n\n <!-- ══ SCROLLABLE BODY ══════════════════════════════════════════════════════ -->\n <div class=\"osl-rg-body\" [style.height]=\"tableHeight\" #bodyScrollRef (scroll)=\"onBodyScroll($event)\">\n <div class=\"osl-rg-inner\" [style.minWidth.px]=\"totalWidth\">\n\n <!-- Skeleton loading -->\n @if (loading) {\n @for (sk of skeletonRows; track $index) {\n <div class=\"osl-rg-row osl-rg-row--skeleton\" [style.height.px]=\"rowHeight\">\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-td osl-rg-td--checkbox\"><div class=\"osl-rg-skel\" style=\"width:14px;height:14px;border-radius:3px;\"></div></div>\n }\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-td\" [style.width.px]=\"col._width\" [style.minWidth.px]=\"col._width\">\n <div class=\"osl-rg-skel\" [style.width]=\"$index % 3 === 0 ? '55%' : $index % 3 === 1 ? '80%' : '65%'\"></div>\n </div>\n }\n </div>\n }\n\n } @else if (isEmpty) {\n <!-- Empty state -->\n <div class=\"osl-rg-empty\">\n <div class=\"osl-rg-empty__icon\">\n <svg viewBox=\"0 0 48 48\" fill=\"none\" stroke=\"#d1d5db\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"6\" y=\"6\" width=\"36\" height=\"36\" rx=\"4\"/>\n <path d=\"M6 18h36M6 30h36M18 6v36\"/>\n </svg>\n </div>\n <p class=\"osl-rg-empty__title\">No records found</p>\n <p class=\"osl-rg-empty__sub\">\n @if (hasAnyFilter) { Try adjusting your filters or search terms }\n @else { No data to display }\n </p>\n @if (hasAnyFilter) {\n <button class=\"osl-rg-empty__action\" (click)=\"clearAllFilters()\">Clear all filters</button>\n }\n </div>\n\n } @else {\n <!-- Data rows -->\n @for (row of flatRows; track trackByRow($index, row)) {\n\n @if (row._type === 'group') {\n <div class=\"osl-rg-group-row\"\n [class.osl-rg-group-row--l0]=\"asGroupRow(row)._level === 0\"\n [class.osl-rg-group-row--l1]=\"asGroupRow(row)._level === 1\"\n [class.osl-rg-group-row--l2]=\"asGroupRow(row)._level >= 2\"\n [style.height.px]=\"rowHeight\"\n [style.paddingLeft.px]=\"asGroupRow(row)._level * 20 + 12\"\n (click)=\"toggleGroup(asGroupRow(row)._path)\">\n @if (asGroupRow(row)._expanded) {\n <svg class=\"osl-rg-group-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m6 9 6 6 6-6\"/></svg>\n } @else {\n <svg class=\"osl-rg-group-chevron\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m9 18 6-6-6-6\"/></svg>\n }\n <span class=\"osl-rg-group-row__key\">{{ asGroupRow(row)._colLabel }}:</span>\n <span class=\"osl-rg-group-row__value\">{{ asGroupRow(row)._label }}</span>\n <span class=\"osl-rg-group-row__count\">{{ asGroupRow(row)._count | number }} rows</span>\n </div>\n\n } @else {\n <div class=\"osl-rg-row\"\n [class.osl-rg-row--striped]=\"striped && asDataRow(row)._rowIndex % 2 === 1\"\n [class.osl-rg-row--selected]=\"selectedRows.has(asDataRow(row)._data)\"\n [style.height.px]=\"rowHeight\"\n (click)=\"onRowClick(asDataRow(row)._data, $event)\">\n\n @if (rowSelection === 'multiple') {\n <div class=\"osl-rg-td osl-rg-td--checkbox\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\"\n [checked]=\"selectedRows.has(asDataRow(row)._data)\"\n (change)=\"toggleRowSelect(asDataRow(row)._data, $event)\" />\n </div>\n }\n\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-td\"\n [class.osl-rg-td--pinned]=\"col._pinned\"\n [ngClass]=\"getCellClass(asDataRow(row)._data, col)\"\n [style.width.px]=\"col._width\"\n [style.minWidth.px]=\"col._width\"\n [style.left.px]=\"col._pinned ? col._stickyLeft : null\"\n [style.position]=\"col._pinned ? 'sticky' : 'relative'\"\n [style.zIndex]=\"col._pinned ? 2 : 0\"\n [style.textAlign]=\"col.align ?? 'left'\"\n (dblclick)=\"copyCell(getCellDisplay(asDataRow(row)._data, col), $event)\"\n [title]=\"getCellDisplay(asDataRow(row)._data, col)\">\n <span class=\"osl-rg-cell-text\">{{ getCellDisplay(asDataRow(row)._data, col) }}</span>\n </div>\n }\n\n </div>\n }\n\n }\n }\n\n </div><!-- /osl-rg-inner -->\n </div><!-- /osl-rg-body -->\n\n <!-- ══ AGGREGATE FOOTER ═════════════════════════════════════════════════════ -->\n @if (showAggregates && hasAnyAggregate() && !loading) {\n <div class=\"osl-rg-aggregate-row\" [style.minWidth.px]=\"totalWidth\">\n @if (rowSelection === 'multiple') { <div class=\"osl-rg-agg-cell osl-rg-agg-cell--checkbox\"></div> }\n @for (col of visibleCols; track col.key) {\n <div class=\"osl-rg-agg-cell\" [style.width.px]=\"col._width\" [style.minWidth.px]=\"col._width\" [style.textAlign]=\"col.align ?? 'left'\">\n @if (col.aggregate) {\n <span class=\"osl-rg-agg-label\">{{ col.aggregate | uppercase }}</span>\n <span class=\"osl-rg-agg-value\">{{ getAggregate(col) }}</span>\n }\n </div>\n }\n </div>\n }\n\n <!-- ══ PAGINATION ════════════════════════════════════════════════════════════ -->\n @if (isPaginated) {\n <div class=\"osl-rg-pagination\">\n <span class=\"osl-rg-pagination__info\">\n @if (loading) { Loading… }\n @else if (_total > 0) { Showing <strong>{{ startRecord | number }}–{{ endRecord | number }}</strong> of <strong>{{ _total | number }}</strong> records }\n @else { No records }\n </span>\n <div class=\"osl-rg-pagination__controls\">\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(1)\" [disabled]=\"currentPage===1||loading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m11 17-5-5 5-5M18 17l-5-5 5-5\"/></svg>\n </button>\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(currentPage-1)\" [disabled]=\"currentPage===1||loading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m15 18-6-6 6-6\"/></svg>\n Prev\n </button>\n @for (page of pageNumbers; track $index) {\n @if (page === -1) { <span class=\"osl-rg-page-ellipsis\">…</span> }\n @else {\n <button class=\"osl-rg-page-btn osl-rg-page-btn--num\" [class.osl-rg-page-btn--active]=\"page===currentPage\"\n [disabled]=\"loading\" (click)=\"goToPage(page)\">{{ page }}</button>\n }\n }\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(currentPage+1)\" [disabled]=\"currentPage===totalPages||loading\">\n Next\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m9 18 6-6-6-6\"/></svg>\n </button>\n <button class=\"osl-rg-page-btn osl-rg-page-btn--nav\" (click)=\"goToPage(totalPages)\" [disabled]=\"currentPage===totalPages||loading\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"m13 17 5-5-5-5M6 17l5-5-5-5\"/></svg>\n </button>\n </div>\n <div class=\"osl-rg-pagination__size\">\n <span class=\"osl-rg-pagination__size-label\">Rows per page</span>\n <select class=\"osl-rg-page-size\" [ngModel]=\"pageSize\" (ngModelChange)=\"onPageSizeChange($event)\" [disabled]=\"loading\">\n @for (opt of pageSizeOptions; track opt) { <option [value]=\"opt\">{{ opt }}</option> }\n </select>\n </div>\n </div>\n }\n\n</div><!-- /osl-rg -->\n\n\n<!-- ══ EXCEL FILTER DROPDOWN (fixed, outside overflow containers) ════════════ -->\n@if (openFilterKey && excelFilterState[openFilterKey]) {\n <div class=\"osl-rg-excel-filter\"\n [style.top.px]=\"filterDropdownPos.top\"\n [style.left.px]=\"filterDropdownPos.left\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"osl-rg-excel-filter__header\">\n <div class=\"osl-rg-excel-filter__title\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"12\" height=\"12\" style=\"flex-shrink:0;\"><path d=\"M22 3H2l8 9.46V19l4 2V12.46z\"/></svg>\n Filter: {{ getColumnByKey(openFilterKey)?.label }}\n </div>\n @if (hasActiveFilter(openFilterKey)) {\n <button class=\"osl-rg-excel-filter__clear-btn\" (click)=\"clearExcelFilter(openFilterKey!)\">Clear</button>\n }\n </div>\n <div class=\"osl-rg-excel-filter__search\">\n <input class=\"osl-rg-excel-filter__search-input\" placeholder=\"Search values…\"\n [(ngModel)]=\"excelFilterState[openFilterKey].search\" />\n </div>\n <div class=\"osl-rg-excel-filter__select-all\">\n <label class=\"osl-rg-excel-filter__item osl-rg-excel-filter__item--all\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\" [checked]=\"isAllExcelChecked(openFilterKey)\"\n (change)=\"toggleAllExcelFilter(openFilterKey!, $any($event.target).checked)\" />\n <span class=\"osl-rg-excel-filter__item-label\">(Select All)</span>\n </label>\n </div>\n <div class=\"osl-rg-excel-filter__list\">\n @for (item of getFilteredExcelItems(openFilterKey); track item.value) {\n <label class=\"osl-rg-excel-filter__item\">\n <input type=\"checkbox\" class=\"osl-rg-checkbox\" [(ngModel)]=\"item.checked\" />\n <span class=\"osl-rg-excel-filter__item-label\">{{ item.label }}</span>\n </label>\n }\n </div>\n <div class=\"osl-rg-excel-filter__footer\">\n <button class=\"osl-rg-excel-filter__apply\" (click)=\"applyExcelFilter(openFilterKey!)\">Apply Filter</button>\n <button class=\"osl-rg-excel-filter__cancel\" (click)=\"openFilterKey=null\">Cancel</button>\n </div>\n </div>\n}\n\n\n<!-- ══ COLUMN CONTEXT MENU (fixed) ══════════════════════════════════════════ -->\n@if (columnMenuKey && getColumnByKey(columnMenuKey); as menuCol) {\n <div class=\"osl-rg-col-menu\"\n [style.top.px]=\"columnMenuPos.top\" [style.left.px]=\"columnMenuPos.left\"\n (click)=\"$event.stopPropagation()\">\n <div class=\"osl-rg-col-menu__header\">{{ menuCol.label }}</div>\n @if (menuCol.sortable) {\n <button class=\"osl-rg-col-menu__item\"\n (click)=\"sortStates.clear(); sortStates.set(menuCol.key,{key:menuCol.key,asc:true,index:0}); sortCounter=1; processData(); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 19V5m-7 7 7-7 7 7\"/></svg>\n Sort A → Z\n </button>\n <button class=\"osl-rg-col-menu__item\"\n (click)=\"sortStates.clear(); sortStates.set(menuCol.key,{key:menuCol.key,asc:false,index:0}); sortCounter=1; processData(); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 5v14m7-7-7 7-7-7\"/></svg>\n Sort Z → A\n </button>\n }\n @if (menuCol.groupable) {\n <div class=\"osl-rg-col-menu__divider\"></div>\n <button class=\"osl-rg-col-menu__item\" (click)=\"addGroup(menuCol.key); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 3H8a2 2 0 0 0-2 2v2h12V5a2 2 0 0 0-2-2z\"/></svg>\n Group by this\n </button>\n }\n <div class=\"osl-rg-col-menu__divider\"></div>\n <button class=\"osl-rg-col-menu__item\" (click)=\"toggleColumnPin(menuCol)\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/></svg>\n {{ menuCol._pinned ? 'Unpin column' : 'Pin to left' }}\n </button>\n <button class=\"osl-rg-col-menu__item\" (click)=\"autoSizeColumn(menuCol); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 6H3M21 18H3\"/><path d=\"M8 3 3 6l5 3M16 3l5 3-5 3M8 15l-5 3 5 3M16 15l5 3-5 3\"/></svg>\n Auto-size column\n </button>\n <div class=\"osl-rg-col-menu__divider\"></div>\n <button class=\"osl-rg-col-menu__item osl-rg-col-menu__item--danger\" (click)=\"toggleColumnVisibility(menuCol); closeColumnMenu()\">\n <svg class=\"rg-icon rg-icon--sm\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24M1 1l22 22\"/>\n </svg>\n Hide column\n </button>\n </div>\n}\n\n\n<!-- ══ COLUMN CONFIG SIDE DRAWER ═════════════════════════════════════════════ -->\n@if (showColumnConfig) {\n <div class=\"osl-rg-config-backdrop\" (click)=\"showColumnConfig=false\"></div>\n <div class=\"osl-rg-config-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"osl-rg-config-panel__header\">\n <div class=\"osl-rg-config-panel__title\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"16\" height=\"16\">\n <path d=\"M4 6h16M4 12h16M4 18h16\"/>\n <circle cx=\"8\" cy=\"6\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"12\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n <circle cx=\"8\" cy=\"18\" r=\"2\" fill=\"white\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n Column Settings\n </div>\n <button class=\"osl-rg-config-panel__close\" (click)=\"showColumnConfig=false\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M18 6 6 18M6 6l12 12\"/></svg>\n </button>\n </div>\n <div class=\"osl-rg-config-panel__actions\">\n <button class=\"osl-rg-config-action\" (click)=\"autoSizeAll()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"M21 6H3M21 18H3\"/><path d=\"M8 3 3 6l5 3M16 3l5 3-5 3\"/></svg>\n Auto-size all\n </button>\n <button class=\"osl-rg-config-action\" (click)=\"showAllColumns()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3\"/></svg>\n Show all\n </button>\n </div>\n <div class=\"osl-rg-config-hint\">Drag to reorder · Toggle to show/hide · Pin to freeze</div>\n <div class=\"osl-rg-config-list\" cdkDropList (cdkDropListDropped)=\"onConfigColumnReorder($event)\">\n @for (col of _cols; track col.key) {\n <div class=\"osl-rg-config-item\" cdkDrag [class.osl-rg-config-item--hidden]=\"col._hidden\">\n <svg cdkDragHandle class=\"rg-drag-handle\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <circle cx=\"9\" cy=\"5\" r=\"1.5\"/><circle cx=\"15\" cy=\"5\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"12\" r=\"1.5\"/><circle cx=\"15\" cy=\"12\" r=\"1.5\"/>\n <circle cx=\"9\" cy=\"19\" r=\"1.5\"/><circle cx=\"15\" cy=\"19\" r=\"1.5\"/>\n </svg>\n <input type=\"checkbox\" class=\"osl-rg-checkbox\" [checked]=\"!col._hidden\" (change)=\"toggleColumnVisibility(col)\" />\n <span class=\"osl-rg-config-item__label\" [class.osl-rg-config-item__label--hidden]=\"col._hidden\">{{ col.label }}</span>\n <button class=\"osl-rg-config-item__pin-btn\" (click)=\"toggleColumnPin(col)\"\n [class.osl-rg-config-item__pin-btn--active]=\"col._pinned\"\n [title]=\"col._pinned ? 'Unpin' : 'Pin to left'\">\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" width=\"12\" height=\"12\"><path d=\"M16 12V4h1V2H7v2h1v8l-2 2v2h5.2v6h1.6v-6H18v-2l-2-2z\"/></svg>\n </button>\n </div>\n }\n </div>\n </div>\n}\n\n\n<!-- ══ COPY TOAST ════════════════════════════════════════════════════════════ -->\n@if (copiedCell !== null) {\n <div class=\"osl-rg-copy-toast\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" width=\"13\" height=\"13\"><polyline points=\"20 6 9 17 4 12\"/></svg>\n Copied to clipboard\n </div>\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core';\nimport { elements } from '../dynamic-form/dynamic-form';\nimport { OslPdfConfig, OslReportColumn, OslReportGrid } from '../report-grid/report-grid';\n\nexport type ReportGenerateType = 'pdf' | 'grid' | 'excel';\n\n@Component({\n selector: 'osl-report-form',\n standalone: false,\n templateUrl: './report-form.html',\n styleUrl: './report-form.scss',\n})\nexport class OslReportForm implements OnInit {\n @Input() title: string = 'Report';\n @Input() formElements: elements[] = [];\n\n private _model: any = {};\n @Input() set model(val: any) { this._model = val ?? {}; }\n get model(): any { return this._model; }\n @Output() modelChange = new EventEmitter<any>();\n\n @Input() generateOptions: ReportGenerateType[] = ['pdf', 'grid', 'excel'];\n @Input() reportColumns: OslReportColumn[] = [];\n @Input() onGenerate!: (model: any, type: ReportGenerateType) => Promise<any[]> | any[];\n @Input() skeletonLoading: boolean = false;\n @Input() skeletonTheme: 'light' | 'dark' = 'light';\n @Input() pageSize: number = 50;\n @Input() pdfConfig: OslPdfConfig = {};\n\n @ViewChild(OslReportGrid) private _grid?: OslReportGrid;\n\n get _mergedPdfConfig(): OslPdfConfig {\n return { ...this.pdfConfig, reportName: this.pdfConfig.reportName ?? this.title };\n }\n\n constructor(public cd: ChangeDetectorRef) {}\n\n selectedType: ReportGenerateType = 'grid';\n generating: boolean = false;\n resultDatasource: any[] = [];\n showResultView: boolean = false;\n\n ngOnInit(): void {\n if (this.generateOptions.length > 0 && !this.generateOptions.includes(this.selectedType)) {\n this.selectedType = this.generateOptions[0];\n }\n }\n\n selectType(type: ReportGenerateType): void {\n this.selectedType = type;\n }\n\n async generate(): Promise<void> {\n if (!this.onGenerate) return;\n this.generating = true;\n try {\n const result = await Promise.resolve(this.onGenerate({ ...this._model }, this.selectedType));\n if (result && result.length > 0) {\n this.resultDatasource = result || [];\n if (this.selectedType === 'grid') {\n this.showResultView = true;\n this.cd.markForCheck();\n // Let the view render the grid before triggering export\n // await new Promise(r => setTimeout(r, 50));\n // if (this.selectedType === 'pdf') {\n // await this._grid?.exportPdf();\n // } else if (this.selectedType === 'excel') {\n // this._grid?.exportCsv();\n // }\n }\n }\n } finally {\n this.generating = false;\n this.cd.markForCheck();\n }\n }\n\n backToForm(): void {\n this.showResultView = false;\n this.resultDatasource = [];\n }\n\n reExportExcel(): void { this._grid?.exportExcel(); }\n reExportPdf(): void { this._grid?.exportPdf(); }\n\n typeLabel(type: ReportGenerateType): string {\n return type === 'pdf' ? 'PDF' : type === 'excel' ? 'Excel' : 'Grid';\n }\n\n typeIcon(type: ReportGenerateType): string {\n return type === 'pdf' ? 'picture_as_pdf' : type === 'excel' ? 'table_chart' : 'grid_on';\n }\n\n onModelChange(val: any): void {\n this._model = val;\n this.modelChange.emit(val);\n }\n\n}\n\n","<!-- ── Form view (hidden when results are shown) ────────────────────────── -->\n@if (!showResultView) {\n <div class=\"orf-card\">\n\n <!-- Header -->\n <div class=\"orf-header\">\n <div class=\"orf-header__left\">\n <div class=\"orf-header__icon-wrap\">\n <svg class=\"orf-header__icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M8 16V11\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <path d=\"M12 16V8\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n <path d=\"M16 16V13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n </svg>\n </div>\n <div class=\"orf-header__text\">\n <h4 class=\"orf-header__title\">{{ title }}</h4>\n <p class=\"orf-header__sub\">Configure parameters and generate report</p>\n </div>\n </div>\n\n <div class=\"orf-header__right\">\n @for (type of generateOptions; track type) {\n <button\n class=\"orf-type-btn\"\n [class.active]=\"selectedType === type\"\n [class.orf-type-btn--pdf]=\"type === 'pdf'\"\n [class.orf-type-btn--excel]=\"type === 'excel'\"\n [class.orf-type-btn--grid]=\"type === 'grid'\"\n (click)=\"selectType(type)\"\n type=\"button\"\n >\n @if (type === 'pdf') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M9 13h1.5a1.5 1.5 0 0 1 0 3H9v-4\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n <path d=\"M14 13v4\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n <path d=\"M14 13h1.5a1.5 1.5 0 0 1 0 3H14\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>\n </svg>\n }\n @if (type === 'excel') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M2 8h20\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M8 8v13M14 8v13\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\n <path d=\"M2 13h20M2 18h20\" stroke=\"currentColor\" stroke-width=\"1.2\"/>\n </svg>\n }\n @if (type === 'grid') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n </svg>\n }\n <span>{{ typeLabel(type) }}</span>\n </button>\n }\n </div>\n </div>\n\n <!-- Section divider with label -->\n <div class=\"orf-section-divider\">\n <div class=\"orf-section-divider__line\"></div>\n <span class=\"orf-section-divider__label\">\n <svg viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M2 4h12M2 8h9M2 12h6\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n </svg>\n Report Parameters\n </span>\n <div class=\"orf-section-divider__line\"></div>\n </div>\n\n <!-- Form Body -->\n <div class=\"orf-body\">\n <osl-dynamic-form\n [elements]=\"formElements\"\n [model]=\"model\"\n (modelChange)=\"onModelChange($event)\"\n [skeletonLoading]=\"skeletonLoading\"\n [skeletonTheme]=\"skeletonTheme\"\n ></osl-dynamic-form>\n </div>\n\n <!-- Footer -->\n <div class=\"orf-footer\">\n <button\n class=\"orf-generate-btn\"\n (click)=\"generate()\"\n [disabled]=\"generating\"\n type=\"button\"\n >\n @if (generating) {\n <span class=\"orf-generate-btn__spinner\"></span>\n <span>Generating...</span>\n } @else {\n @if (selectedType === 'pdf') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\n stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\"/>\n </svg>\n }\n @if (selectedType === 'excel') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <path d=\"M2 8h20M8 8v13M14 8v13M2 13h20M2 18h20\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n </svg>\n }\n @if (selectedType === 'grid') {\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n <rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.8\"/>\n </svg>\n }\n <span>Generate {{ typeLabel(selectedType) }}</span>\n <svg class=\"orf-generate-btn__arrow\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M4 10h12M11 5l5 5-5 5\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n }\n </button>\n </div>\n\n </div>\n}\n\n<!-- ── Full-screen results view ─────────────────────────────────────────── -->\n@if (showResultView) {\n\n <!-- Results header bar -->\n <div class=\"orf-results-header\">\n\n <div class=\"orf-results-header__left\">\n <button class=\"orf-back-btn\" (click)=\"backToForm()\" type=\"button\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M16 10H4M9 5l-5 5 5 5\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <span>Back</span>\n </button>\n <div class=\"orf-results-header__sep\"></div>\n <svg class=\"orf-results-header__report-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M8 16V11M12 16V8M16 16V13\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\"/>\n </svg>\n <span class=\"orf-results-header__title\">{{ title }}</span>\n <span class=\"orf-results-badge\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 16 16\" fill=\"none\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"3\" rx=\"1\" fill=\"currentColor\"/>\n <rect x=\"2\" y=\"7\" width=\"12\" height=\"3\" rx=\"1\" fill=\"currentColor\" opacity=\".65\"/>\n <rect x=\"2\" y=\"12\" width=\"8\" height=\"2\" rx=\"1\" fill=\"currentColor\" opacity=\".35\"/>\n </svg>\n {{ resultDatasource.length | number }} records\n </span>\n </div>\n\n <!-- <div class=\"orf-results-header__right\">\n @if (generateOptions.includes('excel')) {\n <button class=\"orf-reexport-btn orf-reexport-btn--excel\" (click)=\"reExportExcel()\" type=\"button\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"18\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"1.5\"/>\n <path d=\"M2 8h20M8 8v13M14 8v13M2 13h20M2 18h20\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n </svg>\n <span>Excel</span>\n </button>\n }\n @if (generateOptions.includes('pdf')) {\n <button class=\"orf-reexport-btn orf-reexport-btn--pdf\" (click)=\"reExportPdf()\" type=\"button\">\n <svg class=\"orf-btn-icon\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"\n stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n <path d=\"M14 2v6h6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>\n </svg>\n <span>PDF</span>\n </button>\n }\n </div> -->\n\n </div>\n\n <!-- Report grid -->\n <div class=\"orf-results-body\">\n <osl-report-grid\n [columns]=\"reportColumns\"\n [datasource]=\"resultDatasource\"\n [loading]=\"generating\"\n [title]=\"title\"\n tableHeight=\"calc(100vh - 365px)\"\n [pageSize]=\"pageSize\"\n [exportable]=\"true\"\n [pdfExportFromGrid]=\"true\"\n [pdfConfig]=\"_mergedPdfConfig\"\n [showAggregates]=\"true\"\n [striped]=\"true\"\n ></osl-report-grid>\n </div>\n\n}\n","import { NgModule } from \"@angular/core\";\r\nimport { AUTOCOMPLETE_LISTER_COMPONENT } from \"./autocomplete-lister/autocomplete-lister-types\";\r\nimport { DynamicForm } from \"./dynamic-form/dynamic-form\";\r\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\r\nimport { DatePipe, DecimalPipe, NgClass, NgStyle, NgTemplateOutlet, UpperCasePipe } from \"@angular/common\";\r\nimport { MatFormFieldModule, MatHint } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { Oslinput } from \"./input/input\";\r\nimport { Osltextarea } from \"./textarea/textarea\";\r\nimport { OslSelect } from \"./select/select\";\r\nimport { OslRadio } from \"./radio/radio\";\r\nimport { OslSlideToggle } from \"./slide-toggle/slide-toggle\";\r\nimport { OslAutocomplete } from \"./autocomplete/autocomplete\";\r\nimport { OslFileUpload } from \"./file-upload/file-upload\";\r\nimport { OslDatepicker } from \"./datepicker/datepicker\";\r\nimport { OslCheckbox } from \"./checkbox/checkbox\";\r\nimport { OslButton } from \"./button/button\";\r\nimport { OslSetup } from \"./setup/setup\";\r\nimport { OslSearchbar } from \"./searchbar/searchbar\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatDialogModule } from \"@angular/material/dialog\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { OslGrid } from \"./grid/grid\";\r\nimport { OslFormGrid } from \"./form-grid/form-grid\";\r\nimport { OslAutocompleteLister } from \"./autocomplete-lister/autocomplete-lister\";\r\nimport { OslSkeletonModule } from \"../directives/skeleton/skeleton.module\";\r\nimport { MatDatepickerModule } from \"@angular/material/datepicker\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { ScrollingModule } from \"@angular/cdk/scrolling\";\r\nimport { DragDropModule } from \"@angular/cdk/drag-drop\";\r\nimport { OslReportGrid } from \"./report-grid/report-grid\";\r\nimport { OslReportForm } from \"./report-form/report-form\";\r\n\r\n@NgModule({\r\n declarations: [\r\n DynamicForm,\r\n Oslinput,\r\n Osltextarea,\r\n OslSelect,\r\n OslRadio,\r\n OslSlideToggle,\r\n OslAutocomplete,\r\n OslFileUpload,\r\n OslDatepicker,\r\n OslCheckbox,\r\n OslButton,\r\n OslSetup,\r\n OslSearchbar,\r\n OslGrid,\r\n OslFormGrid,\r\n OslAutocompleteLister,\r\n OslReportGrid,\r\n OslReportForm,\r\n ],\r\n imports: [\r\n NgTemplateOutlet,\r\n NgStyle,\r\n NgClass,\r\n DatePipe,\r\n DecimalPipe,\r\n UpperCasePipe,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n MatFormFieldModule,\r\n MatInputModule,\r\n MatHint,\r\n MatIconModule,\r\n MatDialogModule,\r\n MatButtonModule,\r\n OslSkeletonModule,\r\n MatDatepickerModule,\r\n MatMenuModule,\r\n ScrollingModule,\r\n DragDropModule,\r\n ],\r\n exports: [DynamicForm, OslSetup, OslGrid, OslFormGrid, Oslinput,\r\n Osltextarea,\r\n OslSelect,\r\n OslRadio,\r\n OslSlideToggle,\r\n OslAutocomplete,\r\n OslFileUpload,\r\n OslDatepicker,\r\n OslCheckbox,\r\n OslButton,\r\n OslSetup,\r\n OslSearchbar, OslAutocompleteLister, OslReportGrid, OslReportForm],\r\n providers: [\r\n { provide: AUTOCOMPLETE_LISTER_COMPONENT, useValue: OslAutocompleteLister },\r\n ],\r\n})\r\nexport class FormStructureModule {}\r\n","// ─── Array Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Splits an array into chunks of the given size. */\r\nexport function chunk<T>(array: T[], size: number): T[][] {\r\n if (size <= 0) return [];\r\n const result: T[][] = [];\r\n for (let i = 0; i < array.length; i += size) {\r\n result.push(array.slice(i, i + size));\r\n }\r\n return result;\r\n}\r\n\r\n/** Removes duplicate primitive values. */\r\nexport function unique<T>(array: T[]): T[] {\r\n return [...new Set(array)];\r\n}\r\n\r\n/** Removes duplicates by object key. */\r\nexport function uniqueBy<T>(array: T[], key: keyof T): T[] {\r\n const seen = new Set<unknown>();\r\n return array.filter(item => {\r\n const val = item[key];\r\n if (seen.has(val)) return false;\r\n seen.add(val);\r\n return true;\r\n });\r\n}\r\n\r\n/** Flattens one level of nesting. */\r\nexport function flatten<T>(array: (T | T[])[]): T[] {\r\n return (array as T[][]).flat();\r\n}\r\n\r\n/** Deeply flattens a nested array. */\r\nexport function flattenDeep<T>(array: unknown[]): T[] {\r\n return array.reduce<T[]>((acc, val) =>\r\n Array.isArray(val) ? acc.concat(flattenDeep<T>(val)) : [...acc, val as T], []);\r\n}\r\n\r\n/** Groups array elements by a key. */\r\nexport function groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\r\n return array.reduce<Record<string, T[]>>((acc, item) => {\r\n const group = String(item[key]);\r\n acc[group] = acc[group] ?? [];\r\n acc[group].push(item);\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Sorts array by key ascending or descending. */\r\nexport function sortBy<T>(array: T[], key: keyof T, direction: 'asc' | 'desc' = 'asc'): T[] {\r\n return [...array].sort((a, b) => {\r\n const aVal = a[key];\r\n const bVal = b[key];\r\n if (aVal < bVal) return direction === 'asc' ? -1 : 1;\r\n if (aVal > bVal) return direction === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n}\r\n\r\n/** Filters array where key matches value (strict equality). */\r\nexport function filterBy<T>(array: T[], key: keyof T, value: unknown): T[] {\r\n return array.filter(item => item[key] === value);\r\n}\r\n\r\n/** Sums values at the given numeric key. */\r\nexport function sumBy<T>(array: T[], key: keyof T): number {\r\n return array.reduce((acc, item) => acc + Number(item[key]), 0);\r\n}\r\n\r\n/** Returns the item with the minimum value at key. */\r\nexport function minBy<T>(array: T[], key: keyof T): T | undefined {\r\n if (!array.length) return undefined;\r\n return array.reduce((min, item) => (item[key] < min[key] ? item : min));\r\n}\r\n\r\n/** Returns the item with the maximum value at key. */\r\nexport function maxBy<T>(array: T[], key: keyof T): T | undefined {\r\n if (!array.length) return undefined;\r\n return array.reduce((max, item) => (item[key] > max[key] ? item : max));\r\n}\r\n\r\n/** Computes the average of an array of numbers. */\r\nexport function average(numbers: number[]): number {\r\n if (!numbers.length) return 0;\r\n return numbers.reduce((a, b) => a + b, 0) / numbers.length;\r\n}\r\n\r\n/** Returns true if the array is null, undefined, or has no elements. */\r\nexport function isEmpty<T>(array: T[] | null | undefined): boolean {\r\n return !array || array.length === 0;\r\n}\r\n\r\n/** Returns the last element. */\r\nexport function last<T>(array: T[]): T | undefined {\r\n return array[array.length - 1];\r\n}\r\n\r\n/** Returns the first element. */\r\nexport function first<T>(array: T[]): T | undefined {\r\n return array[0];\r\n}\r\n\r\n/** Returns a slice of the array for the given page (1-based). */\r\nexport function paginate<T>(array: T[], page: number, pageSize: number): T[] {\r\n const start = (page - 1) * pageSize;\r\n return array.slice(start, start + pageSize);\r\n}\r\n\r\n/** Moves an element from one index to another (immutable). */\r\nexport function move<T>(array: T[], fromIndex: number, toIndex: number): T[] {\r\n const result = [...array];\r\n const [item] = result.splice(fromIndex, 1);\r\n result.splice(toIndex, 0, item);\r\n return result;\r\n}\r\n\r\n/** Adds the item if absent, removes it if present. */\r\nexport function toggle<T>(array: T[], item: T): T[] {\r\n return array.includes(item) ? array.filter(i => i !== item) : [...array, item];\r\n}\r\n\r\n/** Returns elements present in both arrays. */\r\nexport function intersection<T>(a: T[], b: T[]): T[] {\r\n const setB = new Set(b);\r\n return a.filter(item => setB.has(item));\r\n}\r\n\r\n/** Returns elements in `a` not present in `b`. */\r\nexport function difference<T>(a: T[], b: T[]): T[] {\r\n const setB = new Set(b);\r\n return a.filter(item => !setB.has(item));\r\n}\r\n\r\n/** Converts an array to a lookup map keyed by the given property. */\r\nexport function toMap<T>(array: T[], key: keyof T): Record<string, T> {\r\n return array.reduce<Record<string, T>>((acc, item) => {\r\n acc[String(item[key])] = item;\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Removes falsy values (null, undefined, 0, '', false). */\r\nexport function compact<T>(array: (T | null | undefined | false | 0 | '')[]): T[] {\r\n return array.filter(Boolean) as T[];\r\n}\r\n\r\n/** Returns a new randomly shuffled copy. */\r\nexport function shuffle<T>(array: T[]): T[] {\r\n const result = [...array];\r\n for (let i = result.length - 1; i > 0; i--) {\r\n const j = Math.floor(Math.random() * (i + 1));\r\n [result[i], result[j]] = [result[j], result[i]];\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns a random element, or multiple elements if count is given. */\r\nexport function sample<T>(array: T[]): T | undefined;\r\nexport function sample<T>(array: T[], count: number): T[];\r\nexport function sample<T>(array: T[], count?: number): T | T[] | undefined {\r\n if (count === undefined) return array[Math.floor(Math.random() * array.length)];\r\n return shuffle(array).slice(0, count);\r\n}\r\n\r\n/** Counts occurrences of each value at the given key. */\r\nexport function countBy<T>(array: T[], key: keyof T): Record<string, number> {\r\n return array.reduce<Record<string, number>>((acc, item) => {\r\n const group = String(item[key]);\r\n acc[group] = (acc[group] ?? 0) + 1;\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Returns the union of two arrays (unique values from both). */\r\nexport function union<T>(a: T[], b: T[]): T[] {\r\n return unique([...a, ...b]);\r\n}\r\n\r\n/** Zips multiple arrays into an array of tuples. */\r\nexport function zip<T>(...arrays: T[][]): T[][] {\r\n const length = Math.max(...arrays.map(a => a.length));\r\n return Array.from({ length }, (_, i) => arrays.map(a => a[i]));\r\n}\r\n\r\n/** Returns true if predicate holds for all elements. */\r\nexport function every<T>(array: T[], predicate: (item: T) => boolean): boolean {\r\n return array.every(predicate);\r\n}\r\n\r\n/** Returns true if predicate holds for at least one element. */\r\nexport function some<T>(array: T[], predicate: (item: T) => boolean): boolean {\r\n return array.some(predicate);\r\n}\r\n\r\n/** Partitions an array into two groups based on predicate. */\r\nexport function partition<T>(array: T[], predicate: (item: T) => boolean): [T[], T[]] {\r\n const pass: T[] = [];\r\n const fail: T[] = [];\r\n for (const item of array) {\r\n (predicate(item) ? pass : fail).push(item);\r\n }\r\n return [pass, fail];\r\n}\r\n","// ─── Date Utilities ───────────────────────────────────────────────────────────\r\n\r\nconst MONTH_NAMES_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\nconst MONTH_NAMES_FULL = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\nconst DAY_NAMES_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\r\nconst DAY_NAMES_FULL = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nfunction pad(n: number): string {\r\n return String(n).padStart(2, '0');\r\n}\r\n\r\n/** Returns the current date and time. */\r\nexport function now(): Date {\r\n return new Date();\r\n}\r\n\r\n/** Returns today's date with time set to midnight. */\r\nexport function today(): Date {\r\n return startOfDay(new Date());\r\n}\r\n\r\n/** Returns true if the value is a valid Date object. */\r\nexport function isValidDate(value: unknown): value is Date {\r\n return value instanceof Date && !isNaN(value.getTime());\r\n}\r\n\r\n/**\r\n * Formats a Date using a pattern string.\r\n * Tokens: YYYY, YY, MM, M, DD, D, HH, H, mm, m, ss, s,\r\n * MMM (short month), MMMM (full month),\r\n * ddd (short day), dddd (full day).\r\n */\r\nexport function formatDate(date: Date | string | number, pattern: string): string {\r\n const d = new Date(date);\r\n if (!isValidDate(d)) return '';\r\n\r\n const year = d.getFullYear();\r\n const month = d.getMonth();\r\n const day = d.getDate();\r\n const hours = d.getHours();\r\n const mins = d.getMinutes();\r\n const secs = d.getSeconds();\r\n const dayOfWeek = d.getDay();\r\n\r\n return pattern\r\n .replace('YYYY', String(year))\r\n .replace('YY', String(year).slice(-2))\r\n .replace('MMMM', MONTH_NAMES_FULL[month])\r\n .replace('MMM', MONTH_NAMES_SHORT[month])\r\n .replace('MM', pad(month + 1))\r\n .replace('M', String(month + 1))\r\n .replace('dddd', DAY_NAMES_FULL[dayOfWeek])\r\n .replace('ddd', DAY_NAMES_SHORT[dayOfWeek])\r\n .replace('DD', pad(day))\r\n .replace('D', String(day))\r\n .replace('HH', pad(hours))\r\n .replace('H', String(hours))\r\n .replace('mm', pad(mins))\r\n .replace('m', String(mins))\r\n .replace('ss', pad(secs))\r\n .replace('s', String(secs));\r\n}\r\n\r\n/** Returns date as `YYYY-MM-DD`. */\r\nexport function toDateOnly(date: Date): string {\r\n return formatDate(date, 'YYYY-MM-DD');\r\n}\r\n\r\n/** Returns the ISO 8601 string for a date. */\r\nexport function toISOString(date: Date): string {\r\n return date.toISOString();\r\n}\r\n\r\n/** Returns a new date with `days` added. */\r\nexport function addDays(date: Date, days: number): Date {\r\n const result = new Date(date);\r\n result.setDate(result.getDate() + days);\r\n return result;\r\n}\r\n\r\n/** Returns a new date with `months` added. */\r\nexport function addMonths(date: Date, months: number): Date {\r\n const result = new Date(date);\r\n result.setMonth(result.getMonth() + months);\r\n return result;\r\n}\r\n\r\n/** Returns a new date with `years` added. */\r\nexport function addYears(date: Date, years: number): Date {\r\n const result = new Date(date);\r\n result.setFullYear(result.getFullYear() + years);\r\n return result;\r\n}\r\n\r\n/** Returns a new date with `hours` added. */\r\nexport function addHours(date: Date, hours: number): Date {\r\n return new Date(date.getTime() + hours * 3_600_000);\r\n}\r\n\r\n/** Returns a new date with `minutes` added. */\r\nexport function addMinutes(date: Date, minutes: number): Date {\r\n return new Date(date.getTime() + minutes * 60_000);\r\n}\r\n\r\n/** Returns a new date with `days` subtracted. */\r\nexport function subtractDays(date: Date, days: number): Date {\r\n return addDays(date, -days);\r\n}\r\n\r\n/** Returns a new date with `months` subtracted. */\r\nexport function subtractMonths(date: Date, months: number): Date {\r\n return addMonths(date, -months);\r\n}\r\n\r\n/** Returns a new date with `years` subtracted. */\r\nexport function subtractYears(date: Date, years: number): Date {\r\n return addYears(date, -years);\r\n}\r\n\r\n/** Returns the absolute difference in whole days between two dates. */\r\nexport function diffInDays(date1: Date, date2: Date): number {\r\n return Math.abs(Math.floor((date1.getTime() - date2.getTime()) / 86_400_000));\r\n}\r\n\r\n/** Returns the absolute difference in whole months between two dates. */\r\nexport function diffInMonths(date1: Date, date2: Date): number {\r\n return Math.abs(\r\n (date1.getFullYear() - date2.getFullYear()) * 12 +\r\n (date1.getMonth() - date2.getMonth())\r\n );\r\n}\r\n\r\n/** Returns the absolute difference in whole years between two dates. */\r\nexport function diffInYears(date1: Date, date2: Date): number {\r\n return Math.abs(date1.getFullYear() - date2.getFullYear());\r\n}\r\n\r\n/** Returns the difference in minutes between two dates (date1 - date2). */\r\nexport function diffInMinutes(date1: Date, date2: Date): number {\r\n return Math.floor((date1.getTime() - date2.getTime()) / 60_000);\r\n}\r\n\r\n/** Returns true if date1 is strictly before date2. */\r\nexport function isBefore(date1: Date, date2: Date): boolean {\r\n return date1.getTime() < date2.getTime();\r\n}\r\n\r\n/** Returns true if date1 is strictly after date2. */\r\nexport function isAfter(date1: Date, date2: Date): boolean {\r\n return date1.getTime() > date2.getTime();\r\n}\r\n\r\n/** Returns true if both dates fall on the same calendar day. */\r\nexport function isSameDay(date1: Date, date2: Date): boolean {\r\n return (\r\n date1.getFullYear() === date2.getFullYear() &&\r\n date1.getMonth() === date2.getMonth() &&\r\n date1.getDate() === date2.getDate()\r\n );\r\n}\r\n\r\n/** Returns true if the date falls on a Saturday or Sunday. */\r\nexport function isWeekend(date: Date): boolean {\r\n return date.getDay() === 0 || date.getDay() === 6;\r\n}\r\n\r\n/** Returns true if the date is today. */\r\nexport function isToday(date: Date): boolean {\r\n return isSameDay(date, new Date());\r\n}\r\n\r\n/** Returns true if the date falls in the past (before now). */\r\nexport function isPast(date: Date): boolean {\r\n return date.getTime() < Date.now();\r\n}\r\n\r\n/** Returns true if the date falls in the future (after now). */\r\nexport function isFuture(date: Date): boolean {\r\n return date.getTime() > Date.now();\r\n}\r\n\r\n/** Returns the date with time set to 00:00:00.000. */\r\nexport function startOfDay(date: Date): Date {\r\n const result = new Date(date);\r\n result.setHours(0, 0, 0, 0);\r\n return result;\r\n}\r\n\r\n/** Returns the date with time set to 23:59:59.999. */\r\nexport function endOfDay(date: Date): Date {\r\n const result = new Date(date);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/** Returns the first day of the month (time 00:00:00.000). */\r\nexport function startOfMonth(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), 1);\r\n}\r\n\r\n/** Returns the last day of the month (time 23:59:59.999). */\r\nexport function endOfMonth(date: Date): Date {\r\n const result = new Date(date.getFullYear(), date.getMonth() + 1, 0);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/** Returns the first day of the year (Jan 1, 00:00:00.000). */\r\nexport function startOfYear(date: Date): Date {\r\n return new Date(date.getFullYear(), 0, 1);\r\n}\r\n\r\n/** Returns the last day of the year (Dec 31, 23:59:59.999). */\r\nexport function endOfYear(date: Date): Date {\r\n const result = new Date(date.getFullYear(), 11, 31);\r\n result.setHours(23, 59, 59, 999);\r\n return result;\r\n}\r\n\r\n/** Calculates the age in years from a birth date. */\r\nexport function getAge(birthDate: Date): number {\r\n const n = new Date();\r\n let age = n.getFullYear() - birthDate.getFullYear();\r\n const monthDiff = n.getMonth() - birthDate.getMonth();\r\n if (monthDiff < 0 || (monthDiff === 0 && n.getDate() < birthDate.getDate())) age--;\r\n return age;\r\n}\r\n\r\n/** Returns the number of days in a given month (0-based month). */\r\nexport function daysInMonth(year: number, month: number): number {\r\n return new Date(year, month + 1, 0).getDate();\r\n}\r\n\r\n/** Returns true if the given year is a leap year. */\r\nexport function isLeapYear(year: number): boolean {\r\n return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\r\n}\r\n\r\n/**\r\n * Returns a human-friendly relative time string.\r\n * @example timeAgo(new Date(Date.now() - 3600_000)) → '1 hour ago'\r\n */\r\nexport function timeAgo(date: Date): string {\r\n const seconds = Math.floor((Date.now() - date.getTime()) / 1000);\r\n const abs = Math.abs(seconds);\r\n const future = seconds < 0;\r\n\r\n const intervals: [number, string][] = [\r\n [31_536_000, 'year'],\r\n [2_592_000, 'month'],\r\n [604_800, 'week'],\r\n [86_400, 'day'],\r\n [3_600, 'hour'],\r\n [60, 'minute'],\r\n [1, 'second'],\r\n ];\r\n\r\n for (const [secs, label] of intervals) {\r\n const count = Math.floor(abs / secs);\r\n if (count >= 1) {\r\n const unit = count === 1 ? label : `${label}s`;\r\n return future ? `in ${count} ${unit}` : `${count} ${unit} ago`;\r\n }\r\n }\r\n return 'just now';\r\n}\r\n\r\n/** Returns the ISO week number (1–53) for the given date. */\r\nexport function getWeekNumber(date: Date): number {\r\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\r\n d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));\r\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\r\n return Math.ceil((((d.getTime() - yearStart.getTime()) / 86_400_000) + 1) / 7);\r\n}\r\n\r\n/** Returns the next weekday (Mon–Fri) after the given date. */\r\nexport function nextWorkday(date: Date): Date {\r\n const result = addDays(date, 1);\r\n while (isWeekend(result)) {\r\n result.setDate(result.getDate() + 1);\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns true if a date falls within the range [start, end] (inclusive). */\r\nexport function inRange(date: Date, start: Date, end: Date): boolean {\r\n return date >= start && date <= end;\r\n}\r\n\r\n/** Parses a `YYYY-MM-DD` string and returns a local-midnight Date or null. */\r\nexport function parseDate(dateStr: string): Date | null {\r\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(dateStr);\r\n if (!match) return null;\r\n const [, y, mo, d] = match.map(Number);\r\n const result = new Date(y, mo - 1, d);\r\n return isValidDate(result) ? result : null;\r\n}\r\n","// ─── Number Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Rounds to the given number of decimal places (default 0). */\r\nexport function round(num: number, decimals = 0): number {\r\n const factor = Math.pow(10, decimals);\r\n return Math.round(num * factor) / factor;\r\n}\r\n\r\n/** Floors to the given number of decimal places (default 0). */\r\nexport function floor(num: number, decimals = 0): number {\r\n const factor = Math.pow(10, decimals);\r\n return Math.floor(num * factor) / factor;\r\n}\r\n\r\n/** Ceils to the given number of decimal places (default 0). */\r\nexport function ceil(num: number, decimals = 0): number {\r\n const factor = Math.pow(10, decimals);\r\n return Math.ceil(num * factor) / factor;\r\n}\r\n\r\n/** Clamps a number within [min, max]. */\r\nexport function clamp(num: number, min: number, max: number): number {\r\n return Math.min(Math.max(num, min), max);\r\n}\r\n\r\n/**\r\n * Formats a number as currency using Intl.NumberFormat.\r\n * @example formatCurrency(1234.5, 'USD', 'en-US') → '$1,234.50'\r\n */\r\nexport function formatCurrency(num: number, currency = 'USD', locale = 'en-US'): string {\r\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(num);\r\n}\r\n\r\n/**\r\n * Formats a number with grouping separators and fixed decimal places.\r\n * @example formatNumber(1234567.89, 2, 'en-US') → '1,234,567.89'\r\n */\r\nexport function formatNumber(num: number, decimals = 2, locale = 'en-US'): string {\r\n return new Intl.NumberFormat(locale, {\r\n minimumFractionDigits: decimals,\r\n maximumFractionDigits: decimals,\r\n }).format(num);\r\n}\r\n\r\n/**\r\n * Calculates what percentage `value` is of `total`.\r\n * @example percentage(25, 200) → 12.5\r\n */\r\nexport function percentage(value: number, total: number, decimals = 2): number {\r\n if (total === 0) return 0;\r\n return round((value / total) * 100, decimals);\r\n}\r\n\r\n/** Returns true if `num` is a prime number. */\r\nexport function isPrime(num: number): boolean {\r\n if (num < 2) return false;\r\n if (num === 2) return true;\r\n if (num % 2 === 0) return false;\r\n for (let i = 3; i <= Math.sqrt(num); i += 2) {\r\n if (num % i === 0) return false;\r\n }\r\n return true;\r\n}\r\n\r\n/** Returns true if the number is even. */\r\nexport function isEven(num: number): boolean {\r\n return num % 2 === 0;\r\n}\r\n\r\n/** Returns true if the number is odd. */\r\nexport function isOdd(num: number): boolean {\r\n return num % 2 !== 0;\r\n}\r\n\r\n/** Returns a random floating-point number in [min, max). */\r\nexport function random(min: number, max: number): number {\r\n return Math.random() * (max - min) + min;\r\n}\r\n\r\n/** Returns a random integer in [min, max] (inclusive). */\r\nexport function randomInt(min: number, max: number): number {\r\n return Math.floor(Math.random() * (max - min + 1)) + min;\r\n}\r\n\r\n/** Returns the sum of an array of numbers. */\r\nexport function sum(numbers: number[]): number {\r\n return numbers.reduce((acc, n) => acc + n, 0);\r\n}\r\n\r\n/** Returns the average of an array of numbers. */\r\nexport function average(numbers: number[]): number {\r\n if (!numbers.length) return 0;\r\n return sum(numbers) / numbers.length;\r\n}\r\n\r\n/** Returns the minimum value in an array. */\r\nexport function min(numbers: number[]): number {\r\n return Math.min(...numbers);\r\n}\r\n\r\n/** Returns the maximum value in an array. */\r\nexport function max(numbers: number[]): number {\r\n return Math.max(...numbers);\r\n}\r\n\r\n/**\r\n * Returns the ordinal string for a number.\r\n * @example toOrdinal(3) → '3rd'\r\n */\r\nexport function toOrdinal(num: number): string {\r\n const abs = Math.abs(num);\r\n const suffix =\r\n abs % 100 >= 11 && abs % 100 <= 13 ? 'th' :\r\n abs % 10 === 1 ? 'st' :\r\n abs % 10 === 2 ? 'nd' :\r\n abs % 10 === 3 ? 'rd' : 'th';\r\n return `${num}${suffix}`;\r\n}\r\n\r\n/**\r\n * Abbreviates large numbers with K / M / B / T suffixes.\r\n * @example abbreviate(1500000) → '1.5M'\r\n */\r\nexport function abbreviate(num: number, decimals = 1): string {\r\n const tiers: [number, string][] = [\r\n [1e12, 'T'],\r\n [1e9, 'B'],\r\n [1e6, 'M'],\r\n [1e3, 'K'],\r\n ];\r\n const abs = Math.abs(num);\r\n for (const [threshold, suffix] of tiers) {\r\n if (abs >= threshold) {\r\n return `${round(num / threshold, decimals)}${suffix}`;\r\n }\r\n }\r\n return String(num);\r\n}\r\n\r\n/** Returns true if `num` is within [min, max] (inclusive). */\r\nexport function inRange(num: number, min: number, max: number): boolean {\r\n return num >= min && num <= max;\r\n}\r\n\r\n/** Parses a string to float; returns null if not a valid number. */\r\nexport function safeParseFloat(str: string): number | null {\r\n const n = parseFloat(str);\r\n return isNaN(n) ? null : n;\r\n}\r\n\r\n/** Parses a string to integer; returns null if not a valid number. */\r\nexport function safeParseInt(str: string, radix = 10): number | null {\r\n const n = parseInt(str, radix);\r\n return isNaN(n) ? null : n;\r\n}\r\n\r\n/** Returns the greatest common divisor of two integers. */\r\nexport function gcd(a: number, b: number): number {\r\n a = Math.abs(a);\r\n b = Math.abs(b);\r\n while (b) {\r\n [a, b] = [b, a % b];\r\n }\r\n return a;\r\n}\r\n\r\n/** Returns the least common multiple of two integers. */\r\nexport function lcm(a: number, b: number): number {\r\n return Math.abs(a * b) / gcd(a, b);\r\n}\r\n\r\n/** Returns the Nth Fibonacci number (0-indexed). */\r\nexport function fibonacci(n: number): number {\r\n if (n <= 1) return n;\r\n let a = 0, b = 1;\r\n for (let i = 2; i <= n; i++) {\r\n [a, b] = [b, a + b];\r\n }\r\n return b;\r\n}\r\n\r\n/** Returns true if the value is a finite number (not NaN, not ±Infinity). */\r\nexport function isFiniteNumber(value: unknown): value is number {\r\n return typeof value === 'number' && isFinite(value);\r\n}\r\n\r\n/** Returns true if the value is NaN. */\r\nexport function isNaNValue(value: unknown): boolean {\r\n return typeof value === 'number' && isNaN(value);\r\n}\r\n\r\n/** Returns true if the number is positive (> 0). */\r\nexport function isPositive(num: number): boolean {\r\n return num > 0;\r\n}\r\n\r\n/** Returns true if the number is negative (< 0). */\r\nexport function isNegative(num: number): boolean {\r\n return num < 0;\r\n}\r\n\r\n/** Converts degrees to radians. */\r\nexport function toRadians(degrees: number): number {\r\n return degrees * (Math.PI / 180);\r\n}\r\n\r\n/** Converts radians to degrees. */\r\nexport function toDegrees(radians: number): number {\r\n return radians * (180 / Math.PI);\r\n}\r\n\r\n/** Linearly interpolates between `start` and `end` by factor `t` (0–1). */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * clamp(t, 0, 1);\r\n}\r\n","// ─── Object Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Returns a deep clone of the value using structured clone. */\r\nexport function deepClone<T>(obj: T): T {\r\n return structuredClone(obj);\r\n}\r\n\r\n/** Deep-merges one or more source objects into target (immutable). */\r\nexport function deepMerge<T extends object>(target: T, ...sources: Partial<T>[]): T {\r\n const result = deepClone(target);\r\n for (const source of sources) {\r\n for (const key in source) {\r\n const srcVal = source[key as keyof typeof source];\r\n const tgtVal = result[key as keyof T];\r\n if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {\r\n (result as Record<string, unknown>)[key] = deepMerge(\r\n tgtVal as object,\r\n srcVal as object\r\n );\r\n } else if (srcVal !== undefined) {\r\n (result as Record<string, unknown>)[key] = deepClone(srcVal);\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns true if `value` is a plain (non-null) object literal. */\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && Object.getPrototypeOf(value) === Object.prototype;\r\n}\r\n\r\n/** Creates a new object containing only the specified keys. */\r\nexport function pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {\r\n return keys.reduce((acc, key) => {\r\n if (key in obj) acc[key] = obj[key];\r\n return acc;\r\n }, {} as Pick<T, K>);\r\n}\r\n\r\n/** Creates a new object excluding the specified keys. */\r\nexport function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> {\r\n const keySet = new Set<PropertyKey>(keys);\r\n return Object.fromEntries(\r\n Object.entries(obj).filter(([k]) => !keySet.has(k))\r\n ) as Omit<T, K>;\r\n}\r\n\r\n/** Returns true if the object has no own enumerable properties. */\r\nexport function isEmpty(obj: object | null | undefined): boolean {\r\n if (obj == null) return true;\r\n return Object.keys(obj).length === 0;\r\n}\r\n\r\n/** Deep equality check. */\r\nexport function isEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (a == null || b == null) return a === b;\r\n if (typeof a !== typeof b) return false;\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n if (a.length !== b.length) return false;\r\n return a.every((v, i) => isEqual(v, b[i]));\r\n }\r\n if (isPlainObject(a) && isPlainObject(b)) {\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n if (keysA.length !== keysB.length) return false;\r\n return keysA.every(k => isEqual(a[k], (b as Record<string, unknown>)[k]));\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Flattens a nested object to a single depth using `delimiter` as key separator.\r\n * @example flattenObject({ a: { b: 1 } }) → { 'a.b': 1 }\r\n */\r\nexport function flattenObject(\r\n obj: Record<string, unknown>,\r\n delimiter = '.',\r\n prefix = ''\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const key in obj) {\r\n const fullKey = prefix ? `${prefix}${delimiter}${key}` : key;\r\n const value = obj[key];\r\n if (isPlainObject(value)) {\r\n Object.assign(result, flattenObject(value, delimiter, fullKey));\r\n } else {\r\n result[fullKey] = value;\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Converts a flat object with delimiter-separated keys back to a nested object.\r\n * @example unflattenObject({ 'a.b': 1 }) → { a: { b: 1 } }\r\n */\r\nexport function unflattenObject(\r\n obj: Record<string, unknown>,\r\n delimiter = '.'\r\n): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n for (const flatKey in obj) {\r\n const parts = flatKey.split(delimiter);\r\n let current = result;\r\n for (let i = 0; i < parts.length - 1; i++) {\r\n const part = parts[i];\r\n if (!isPlainObject(current[part])) current[part] = {};\r\n current = current[part] as Record<string, unknown>;\r\n }\r\n current[parts[parts.length - 1]] = obj[flatKey];\r\n }\r\n return result;\r\n}\r\n\r\n/** Serializes an object to a URL query string (excludes null/undefined values). */\r\nexport function toQueryString(obj: Record<string, unknown>): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(obj)) {\r\n if (value != null) params.append(key, String(value));\r\n }\r\n return params.toString();\r\n}\r\n\r\n/** Parses a URL query string into a key-value map. */\r\nexport function fromQueryString(queryString: string): Record<string, string> {\r\n const params = new URLSearchParams(queryString.startsWith('?') ? queryString.slice(1) : queryString);\r\n const result: Record<string, string> = {};\r\n params.forEach((value, key) => { result[key] = value; });\r\n return result;\r\n}\r\n\r\n/**\r\n * Gets a deeply nested value by dot-path string.\r\n * @example getPath({ a: { b: 2 } }, 'a.b') → 2\r\n */\r\nexport function getPath<T = unknown>(\r\n obj: Record<string, unknown>,\r\n path: string,\r\n defaultValue?: T\r\n): T | undefined {\r\n const keys = path.split('.');\r\n let current: unknown = obj;\r\n for (const key of keys) {\r\n if (current == null || typeof current !== 'object') return defaultValue;\r\n current = (current as Record<string, unknown>)[key];\r\n }\r\n return (current as T) ?? defaultValue;\r\n}\r\n\r\n/**\r\n * Sets a deeply nested value by dot-path string (mutates the object).\r\n * @example setPath(obj, 'a.b', 42)\r\n */\r\nexport function setPath(obj: Record<string, unknown>, path: string, value: unknown): void {\r\n const keys = path.split('.');\r\n let current = obj;\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n if (!isPlainObject(current[key])) current[key] = {};\r\n current = current[key] as Record<string, unknown>;\r\n }\r\n current[keys[keys.length - 1]] = value;\r\n}\r\n\r\n/** Returns true if a dot-path resolves to a defined value. */\r\nexport function hasPath(obj: Record<string, unknown>, path: string): boolean {\r\n return getPath(obj, path) !== undefined;\r\n}\r\n\r\n/** Applies a mapping function to every value in an object. */\r\nexport function mapValues<T, R>(\r\n obj: Record<string, T>,\r\n fn: (value: T, key: string) => R\r\n): Record<string, R> {\r\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, fn(v, k)]));\r\n}\r\n\r\n/** Returns a new object containing only entries where the predicate returns true. */\r\nexport function filterValues<T>(\r\n obj: Record<string, T>,\r\n fn: (value: T, key: string) => boolean\r\n): Record<string, T> {\r\n return Object.fromEntries(Object.entries(obj).filter(([k, v]) => fn(v, k)));\r\n}\r\n\r\n/** Swaps keys and values in an object (both must be strings). */\r\nexport function invertObject(obj: Record<string, string>): Record<string, string> {\r\n return Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]));\r\n}\r\n\r\n/** Returns a new object with keys sorted alphabetically. */\r\nexport function sortByKey<T>(obj: Record<string, T>): Record<string, T> {\r\n return Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)));\r\n}\r\n\r\n/**\r\n * Returns the keys of obj2 whose values differ from obj1 (shallow comparison).\r\n * Useful for detecting changed form fields.\r\n */\r\nexport function diff<T extends Record<string, unknown>>(obj1: T, obj2: T): Partial<T> {\r\n const result: Partial<T> = {};\r\n for (const key in obj2) {\r\n if (obj1[key] !== obj2[key]) {\r\n result[key] = obj2[key];\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/** Returns the number of own enumerable keys. */\r\nexport function size(obj: object): number {\r\n return Object.keys(obj).length;\r\n}\r\n\r\n/** Returns true if `obj` has the given own enumerable key. */\r\nexport function hasKey<T extends object>(obj: T, key: PropertyKey): key is keyof T {\r\n return Object.prototype.hasOwnProperty.call(obj, key);\r\n}\r\n","// ─── Storage Utilities ───────────────────────────────────────────────────────\r\n// Values are JSON-serialized before storage and deserialized on retrieval.\r\n\r\n// ── Local Storage ────────────────────────────────────────────────────────────\r\n\r\n/** Serializes `value` and writes it to localStorage. */\r\nexport function setLocal(key: string, value: unknown): void {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(value));\r\n } catch {\r\n /* quota exceeded or private browsing — silently ignore */\r\n }\r\n}\r\n\r\n/** Reads and deserializes a value from localStorage. Returns null if absent or invalid. */\r\nexport function getLocal<T>(key: string): T | null {\r\n try {\r\n const item = localStorage.getItem(key);\r\n return item !== null ? (JSON.parse(item) as T) : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Removes a key from localStorage. */\r\nexport function removeLocal(key: string): void {\r\n localStorage.removeItem(key);\r\n}\r\n\r\n/** Clears all entries from localStorage. */\r\nexport function clearLocal(): void {\r\n localStorage.clear();\r\n}\r\n\r\n/** Returns true if the key exists in localStorage. */\r\nexport function hasLocal(key: string): boolean {\r\n return localStorage.getItem(key) !== null;\r\n}\r\n\r\n/** Returns all keys currently in localStorage. */\r\nexport function localKeys(): string[] {\r\n return Object.keys(localStorage);\r\n}\r\n\r\n// ── Session Storage ───────────────────────────────────────────────────────────\r\n\r\n/** Serializes `value` and writes it to sessionStorage. */\r\nexport function setSession(key: string, value: unknown): void {\r\n try {\r\n sessionStorage.setItem(key, JSON.stringify(value));\r\n } catch {\r\n /* quota exceeded — silently ignore */\r\n }\r\n}\r\n\r\n/** Reads and deserializes a value from sessionStorage. Returns null if absent or invalid. */\r\nexport function getSession<T>(key: string): T | null {\r\n try {\r\n const item = sessionStorage.getItem(key);\r\n return item !== null ? (JSON.parse(item) as T) : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Removes a key from sessionStorage. */\r\nexport function removeSession(key: string): void {\r\n sessionStorage.removeItem(key);\r\n}\r\n\r\n/** Clears all entries from sessionStorage. */\r\nexport function clearSession(): void {\r\n sessionStorage.clear();\r\n}\r\n\r\n/** Returns true if the key exists in sessionStorage. */\r\nexport function hasSession(key: string): boolean {\r\n return sessionStorage.getItem(key) !== null;\r\n}\r\n\r\n/** Returns all keys currently in sessionStorage. */\r\nexport function sessionKeys(): string[] {\r\n return Object.keys(sessionStorage);\r\n}\r\n\r\n// ── Cookies ──────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Sets a cookie.\r\n * @param days - Expiry in days. Omit or pass 0 for a session cookie.\r\n * @param path - Cookie path (default '/').\r\n */\r\nexport function setCookie(name: string, value: string, days?: number, path = '/'): void {\r\n let expires = '';\r\n if (days) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + days * 86_400_000);\r\n expires = `; expires=${date.toUTCString()}`;\r\n }\r\n document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}${expires}; path=${path}; SameSite=Lax`;\r\n}\r\n\r\n/** Returns the decoded cookie value, or null if not found. */\r\nexport function getCookie(name: string): string | null {\r\n const key = `${encodeURIComponent(name)}=`;\r\n for (const part of document.cookie.split(';')) {\r\n const trimmed = part.trimStart();\r\n if (trimmed.startsWith(key)) {\r\n return decodeURIComponent(trimmed.slice(key.length));\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Removes a cookie by setting its expiry to the past. */\r\nexport function removeCookie(name: string, path = '/'): void {\r\n document.cookie = `${encodeURIComponent(name)}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=${path}`;\r\n}\r\n\r\n/** Returns all current cookies as a key-value map (both decoded). */\r\nexport function getAllCookies(): Record<string, string> {\r\n return document.cookie\r\n .split(';')\r\n .reduce<Record<string, string>>((acc, part) => {\r\n const [k, ...rest] = part.trim().split('=');\r\n if (k) acc[decodeURIComponent(k)] = decodeURIComponent(rest.join('='));\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/** Returns true if the cookie exists. */\r\nexport function hasCookie(name: string): boolean {\r\n return getCookie(name) !== null;\r\n}\r\n","// ─── String Utilities ────────────────────────────────────────────────────────\r\n\r\n/** Returns true if the value is null, undefined, or an empty string. */\r\nexport function isEmpty(str: string | null | undefined): boolean {\r\n return str == null || str.length === 0;\r\n}\r\n\r\n/** Returns true if the value is null, undefined, empty, or whitespace only. */\r\nexport function isBlank(str: string | null | undefined): boolean {\r\n return str == null || str.trim().length === 0;\r\n}\r\n\r\n/** Capitalizes the first letter; lowercases the rest. */\r\nexport function capitalize(str: string): string {\r\n if (!str) return '';\r\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\r\n}\r\n\r\n/** Converts each word's first letter to uppercase. */\r\nexport function titleCase(str: string): string {\r\n return str.replace(/\\w\\S*/g, word => capitalize(word));\r\n}\r\n\r\n/** Converts a string to camelCase. */\r\nexport function camelCase(str: string): string {\r\n return str\r\n .replace(/[^a-zA-Z0-9]+(.)/g, (_, char: string) => char.toUpperCase())\r\n .replace(/^[A-Z]/, c => c.toLowerCase());\r\n}\r\n\r\n/** Converts a string to PascalCase. */\r\nexport function pascalCase(str: string): string {\r\n const cc = camelCase(str);\r\n return cc.charAt(0).toUpperCase() + cc.slice(1);\r\n}\r\n\r\n/** Converts a string to snake_case. */\r\nexport function snakeCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1_$2')\r\n .replace(/[\\s\\-]+/g, '_')\r\n .toLowerCase();\r\n}\r\n\r\n/** Converts a string to kebab-case. */\r\nexport function kebabCase(str: string): string {\r\n return str\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .replace(/[\\s_]+/g, '-')\r\n .toLowerCase();\r\n}\r\n\r\n/** Truncates a string to the given length, appending a suffix if cut. */\r\nexport function truncate(str: string, length: number, suffix = '...'): string {\r\n if (str.length <= length) return str;\r\n return str.slice(0, length - suffix.length) + suffix;\r\n}\r\n\r\n/** Removes all HTML tags from a string. */\r\nexport function stripHtml(str: string): string {\r\n return str.replace(/<[^>]*>/g, '');\r\n}\r\n\r\n/** Escapes HTML special characters. */\r\nexport function escapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\n/** Unescapes HTML entities back to characters. */\r\nexport function unescapeHtml(str: string): string {\r\n return str\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/"/g, '\"')\r\n .replace(/'/g, \"'\");\r\n}\r\n\r\n/** Converts a string to a URL-friendly slug. */\r\nexport function toSlug(str: string): string {\r\n return str\r\n .toLowerCase()\r\n .normalize('NFD')\r\n .replace(/[̀-ͯ]/g, '')\r\n .replace(/[^a-z0-9\\s-]/g, '')\r\n .trim()\r\n .replace(/[\\s_-]+/g, '-')\r\n .replace(/^-+|-+$/g, '');\r\n}\r\n\r\n/** Counts the number of words in a string. */\r\nexport function countWords(str: string): number {\r\n return str.trim().split(/\\s+/).filter(Boolean).length;\r\n}\r\n\r\n/** Extracts initials from a name (up to `maxLetters`). */\r\nexport function initials(name: string, maxLetters = 2): string {\r\n return name\r\n .split(/\\s+/)\r\n .slice(0, maxLetters)\r\n .map(w => w.charAt(0).toUpperCase())\r\n .join('');\r\n}\r\n\r\n/** Case-insensitive containment check. */\r\nexport function contains(str: string, search: string): boolean {\r\n return str.toLowerCase().includes(search.toLowerCase());\r\n}\r\n\r\n/**\r\n * Replaces `{{key}}` placeholders in a template with values from the map.\r\n * @example format('Hello {{name}}', { name: 'World' }) → 'Hello World'\r\n */\r\nexport function format(template: string, values: Record<string, unknown>): string {\r\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key: string) =>\r\n key in values ? String(values[key]) : `{{${key}}}`\r\n );\r\n}\r\n\r\n/** Repeats a string `times` times. */\r\nexport function repeat(str: string, times: number): string {\r\n return str.repeat(Math.max(0, times));\r\n}\r\n\r\n/** Reverses the characters of a string. */\r\nexport function reverseString(str: string): string {\r\n return [...str].reverse().join('');\r\n}\r\n\r\n/** Counts non-overlapping occurrences of `search` in `str`. */\r\nexport function countOccurrences(str: string, search: string): number {\r\n if (!search) return 0;\r\n return str.split(search).length - 1;\r\n}\r\n\r\n/** Removes characters not in `[a-zA-Z0-9]` plus anything in `preserve`. */\r\nexport function removeSpecialChars(str: string, preserve = ''): string {\r\n const escaped = preserve.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\r\n return str.replace(new RegExp(`[^a-zA-Z0-9${escaped}]`, 'g'), '');\r\n}\r\n\r\n/**\r\n * Masks part of a string, keeping `visibleChars` visible at the end.\r\n * @example mask('4111111111111234', 4) → '************1234'\r\n */\r\nexport function mask(str: string, visibleChars = 4, maskChar = '*'): string {\r\n if (str.length <= visibleChars) return str;\r\n return maskChar.repeat(str.length - visibleChars) + str.slice(-visibleChars);\r\n}\r\n\r\n/** Parses common truthy strings (\"true\", \"yes\", \"1\", \"on\") to boolean. */\r\nexport function toBoolean(str: string): boolean {\r\n return ['true', 'yes', '1', 'on'].includes(str.trim().toLowerCase());\r\n}\r\n\r\n/** Pads the start of a string. */\r\nexport function padStart(str: string, length: number, padChar = ' '): string {\r\n return str.padStart(length, padChar);\r\n}\r\n\r\n/** Pads the end of a string. */\r\nexport function padEnd(str: string, length: number, padChar = ' '): string {\r\n return str.padEnd(length, padChar);\r\n}\r\n\r\n/** Generates a random alphanumeric string of the given length. */\r\nexport function randomString(length: number): string {\r\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n return Array.from({ length }, () => chars.charAt(Math.floor(Math.random() * chars.length))).join('');\r\n}\r\n\r\n/** Removes all whitespace from a string. */\r\nexport function removeWhitespace(str: string): string {\r\n return str.replace(/\\s+/g, '');\r\n}\r\n\r\n/** Checks if a string is a palindrome (case- and space-insensitive). */\r\nexport function isPalindrome(str: string): boolean {\r\n const normalized = str.toLowerCase().replace(/\\s+/g, '');\r\n return normalized === [...normalized].reverse().join('');\r\n}\r\n\r\n/** Wraps a string at `width` characters, splitting on spaces where possible. */\r\nexport function wordWrap(str: string, width: number): string {\r\n const words = str.split(' ');\r\n const lines: string[] = [];\r\n let current = '';\r\n for (const word of words) {\r\n if ((current + (current ? ' ' : '') + word).length <= width) {\r\n current += (current ? ' ' : '') + word;\r\n } else {\r\n if (current) lines.push(current);\r\n current = word;\r\n }\r\n }\r\n if (current) lines.push(current);\r\n return lines.join('\\n');\r\n}\r\n","// ─── Validation Utilities ────────────────────────────────────────────────────\r\n\r\n/** Returns true if value is not null, undefined, empty string, or whitespace. */\r\nexport function isRequired(value: unknown): boolean {\r\n if (value == null) return false;\r\n if (typeof value === 'string') return value.trim().length > 0;\r\n if (Array.isArray(value)) return value.length > 0;\r\n return true;\r\n}\r\n\r\n/** RFC 5322-compliant email validation. */\r\nexport function isEmail(value: string): boolean {\r\n return /^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$/.test(value.trim());\r\n}\r\n\r\n/** Returns true if the string is a valid HTTP/HTTPS URL. */\r\nexport function isUrl(value: string): boolean {\r\n try {\r\n const url = new URL(value);\r\n return url.protocol === 'http:' || url.protocol === 'https:';\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Returns true if the string looks like a phone number.\r\n * Accepts formats: +1-800-555-5555, (800) 555 5555, 08001234567, etc.\r\n */\r\nexport function isPhone(value: string): boolean {\r\n return /^\\+?[\\d\\s\\-().]{7,20}$/.test(value.trim());\r\n}\r\n\r\n/**\r\n * Luhn algorithm — validates credit card numbers.\r\n * Works for Visa, MasterCard, Amex, Discover, etc.\r\n */\r\nexport function isCreditCard(value: string): boolean {\r\n const digits = value.replace(/\\D/g, '');\r\n if (digits.length < 13 || digits.length > 19) return false;\r\n let sum = 0;\r\n let isEven = false;\r\n for (let i = digits.length - 1; i >= 0; i--) {\r\n let digit = parseInt(digits[i], 10);\r\n if (isEven) {\r\n digit *= 2;\r\n if (digit > 9) digit -= 9;\r\n }\r\n sum += digit;\r\n isEven = !isEven;\r\n }\r\n return sum % 10 === 0;\r\n}\r\n\r\n/**\r\n * Validates postal / ZIP codes.\r\n * Supports: US (12345 / 12345-6789), UK (SW1A 1AA), CA (K1A 0B1),\r\n * DE/FR/AU/IN (5-digit numeric).\r\n */\r\nexport function isPostalCode(value: string, countryCode = 'US'): boolean {\r\n const patterns: Record<string, RegExp> = {\r\n US: /^\\d{5}(-\\d{4})?$/,\r\n UK: /^[A-Z]{1,2}\\d[A-Z\\d]?\\s?\\d[A-Z]{2}$/i,\r\n CA: /^[A-Z]\\d[A-Z]\\s?\\d[A-Z]\\d$/i,\r\n DE: /^\\d{5}$/,\r\n FR: /^\\d{5}$/,\r\n AU: /^\\d{4}$/,\r\n IN: /^\\d{6}$/,\r\n };\r\n const pattern = patterns[countryCode.toUpperCase()] ?? /^\\d{4,10}$/;\r\n return pattern.test(value.trim());\r\n}\r\n\r\n/** Returns true if the string contains only ASCII letters. */\r\nexport function isAlpha(value: string): boolean {\r\n return /^[a-zA-Z]+$/.test(value);\r\n}\r\n\r\n/** Returns true if the string contains only ASCII letters and digits. */\r\nexport function isAlphanumeric(value: string): boolean {\r\n return /^[a-zA-Z0-9]+$/.test(value);\r\n}\r\n\r\n/** Returns true if the string contains only digits (no decimal points). */\r\nexport function isNumeric(value: string): boolean {\r\n return /^\\d+$/.test(value.trim());\r\n}\r\n\r\n/** Returns true if the string represents a valid decimal number. */\r\nexport function isDecimal(value: string): boolean {\r\n return /^-?\\d+(\\.\\d+)?$/.test(value.trim());\r\n}\r\n\r\n/** Returns true if `value` is a positive number (> 0). */\r\nexport function isPositive(value: number): boolean {\r\n return value > 0;\r\n}\r\n\r\n/** Returns true if `value` is a negative number (< 0). */\r\nexport function isNegative(value: number): boolean {\r\n return value < 0;\r\n}\r\n\r\n/** Returns true if the string length is at least `min`. */\r\nexport function minLength(value: string, min: number): boolean {\r\n return value.length >= min;\r\n}\r\n\r\n/** Returns true if the string length does not exceed `max`. */\r\nexport function maxLength(value: string, max: number): boolean {\r\n return value.length <= max;\r\n}\r\n\r\n/** Returns true if the string length is within [min, max] (inclusive). */\r\nexport function lengthBetween(value: string, min: number, max: number): boolean {\r\n return value.length >= min && value.length <= max;\r\n}\r\n\r\n/** Returns true if `value` is at least `min`. */\r\nexport function minValue(value: number, min: number): boolean {\r\n return value >= min;\r\n}\r\n\r\n/** Returns true if `value` does not exceed `max`. */\r\nexport function maxValue(value: number, max: number): boolean {\r\n return value <= max;\r\n}\r\n\r\n/** Returns true if `value` is within [min, max] (inclusive). */\r\nexport function inRange(value: number, min: number, max: number): boolean {\r\n return value >= min && value <= max;\r\n}\r\n\r\n/** Returns true if the value is a valid Date or a parseable date string. */\r\nexport function isValidDate(value: unknown): boolean {\r\n if (value == null) return false;\r\n const d = new Date(value as string | number | Date);\r\n return !isNaN(d.getTime());\r\n}\r\n\r\n/** Returns true if the string is a valid dotted-decimal IPv4 address. */\r\nexport function isIPv4(value: string): boolean {\r\n return /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(value) &&\r\n value.split('.').every(octet => parseInt(octet, 10) <= 255);\r\n}\r\n\r\n/** Returns true if the string is a valid IPv6 address. */\r\nexport function isIPv6(value: string): boolean {\r\n return /^([\\da-f]{1,4}:){7}[\\da-f]{1,4}$/i.test(value) ||\r\n /^([\\da-f]{1,4}:)*::([\\da-f]{1,4}:)*[\\da-f]{1,4}$/i.test(value) ||\r\n value === '::';\r\n}\r\n\r\n/** Returns true if the string matches the given pattern (string or RegExp). */\r\nexport function matchesPattern(value: string, pattern: RegExp | string): boolean {\r\n const regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;\r\n return regex.test(value);\r\n}\r\n\r\n/** Returns true if the string is a valid MAC address (with : or - separator). */\r\nexport function isMACAddress(value: string): boolean {\r\n return /^([0-9A-Fa-f]{2}[:\\-]){5}[0-9A-Fa-f]{2}$/.test(value);\r\n}\r\n\r\n/** Returns true if the string is a valid CSS hex color (#RGB or #RRGGBB). */\r\nexport function isHexColor(value: string): boolean {\r\n return /^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/.test(value);\r\n}\r\n\r\nexport interface PasswordOptions {\r\n minLength?: number;\r\n requireUppercase?: boolean;\r\n requireLowercase?: boolean;\r\n requireNumber?: boolean;\r\n requireSpecial?: boolean;\r\n}\r\n\r\n/**\r\n * Returns true if the password meets the given strength requirements.\r\n * Default: min 8 chars, at least one uppercase, lowercase, number, and special character.\r\n */\r\nexport function isStrongPassword(value: string, options: PasswordOptions = {}): boolean {\r\n const {\r\n minLength = 8,\r\n requireUppercase = true,\r\n requireLowercase = true,\r\n requireNumber = true,\r\n requireSpecial = true,\r\n } = options;\r\n\r\n if (value.length < minLength) return false;\r\n if (requireUppercase && !/[A-Z]/.test(value)) return false;\r\n if (requireLowercase && !/[a-z]/.test(value)) return false;\r\n if (requireNumber && !/\\d/.test(value)) return false;\r\n if (requireSpecial && !/[^a-zA-Z0-9]/.test(value)) return false;\r\n return true;\r\n}\r\n\r\n/** Returns a password strength score: 0 (very weak) – 5 (very strong). */\r\nexport function passwordStrength(value: string): number {\r\n let score = 0;\r\n if (value.length >= 8) score++;\r\n if (value.length >= 12) score++;\r\n if (/[A-Z]/.test(value)) score++;\r\n if (/\\d/.test(value)) score++;\r\n if (/[^a-zA-Z0-9]/.test(value)) score++;\r\n return score;\r\n}\r\n\r\n/** Returns true if the two values are strictly equal (useful for confirm-password fields). */\r\nexport function isMatch(a: unknown, b: unknown): boolean {\r\n return a === b;\r\n}\r\n\r\n/** Returns true if the string is a valid JSON string. */\r\nexport function isJSON(value: string): boolean {\r\n try {\r\n JSON.parse(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\n/** Returns true if the string contains only printable ASCII characters. */\r\nexport function isASCII(value: string): boolean {\r\n return /^[\\x20-\\x7E]*$/.test(value);\r\n}\r\n\r\n/** Returns true if the number is a whole integer (no fractional part). */\r\nexport function isInteger(value: number): boolean {\r\n return Number.isInteger(value);\r\n}\r\n","/*\r\n * Public API Surface of osl-base-extended\r\n */\r\n\r\nexport * from './lib/osl-base-extended';\r\nexport * from './lib/core/base/base.component';\r\nexport * from './lib/core/http/httpbase';\r\nexport * from './lib/core/shared/components/dialog-wrapper/dialog-wrapper';\r\nexport * from './lib/core/shared/components/delete-confirmation/delete-confirmation';\r\nexport * from './lib/core/shared/form-structure/form-structure.module'\r\nexport * from './lib/core/shared/form-structure/dynamic-form/dynamic-form'\r\nexport * from './lib/core/shared/form-structure/setup/setup'\r\nexport * from './lib/core/shared/form-structure/grid/grid'\r\nexport * from './lib/core/shared/form-structure/form-grid/form-grid'\r\nexport * from './lib/core/shared/form-structure/autocomplete/autocomplete'\r\nexport * from './lib/core/shared/form-structure/input/input'\r\nexport * from './lib/core/shared/form-structure/select/select'\r\nexport * from './lib/core/shared/form-structure/button/button'\r\nexport * from './lib/core/shared/form-structure/checkbox/checkbox'\r\nexport * from './lib/core/shared/form-structure/datepicker/datepicker'\r\nexport * from './lib/core/shared/form-structure/radio/radio'\r\nexport * from './lib/core/shared/form-structure/file-upload/file-upload'\r\nexport * from './lib/core/shared/form-structure/textarea/textarea'\r\nexport * from './lib/core/shared/form-structure/searchbar/searchbar'\r\nexport * from './lib/core/shared/form-structure/slide-toggle/slide-toggle'\r\nexport * from './lib/core/shared/form-structure/autocomplete-lister/autocomplete-lister'\r\nexport * from './lib/core/shared/form-structure/report-grid/report-grid'\r\nexport * from './lib/core/shared/form-structure/report-form/report-form'\r\nexport * from './lib/core/shared/directives/skeleton/skeleton.directive'\r\nexport * from './lib/core/shared/directives/skeleton/skeleton.module'\r\nexport * from './lib/core/shared/directives/skeleton/skeleton-theme.service'\r\nexport * from './lib/core/util/index'\r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.OslSkeletonThemeService","i1","i2","i3","i4.OslSkeletonDirective","i3.OslSkeletonDirective","i1.OslSkeletonDirective","i2.OslSkeletonDirective","i4","i5.OslSkeletonDirective","i3.Oslinput","i4.Osltextarea","i5.OslSelect","i6.OslRadio","i7.OslSlideToggle","i8.OslAutocomplete","i9.OslFileUpload","i10.OslDatepicker","i11.OslCheckbox","i12.OslButton","debounceTime","distinctUntilChanged","i2.DynamicForm","i3.OslButton","i4.OslSearchbar","i5.OslGrid","i2.OslSetup","i1.DynamicForm","i2.OslReportGrid","average","isEmpty","isValidDate","inRange","isPositive","isNegative"],"mappings":"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"}
|