osl-base-extended 1.1.31 → 1.1.32

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 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 }\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';\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) 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.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.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 {\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged, switchMap } from 'rxjs';\r\nimport { baseComponent } from '../../../base/base.component';\r\nimport { AUTOCOMPLETE_LISTER_COMPONENT, oslListerData } from '../autocomplete-lister/autocomplete-lister-types';\r\nimport { HttpResponse } from '../../../http/httpbase';\r\n\r\n@Component({\r\n selector: 'osl-autocomplete',\r\n standalone: false,\r\n templateUrl: './autocomplete.html',\r\n styleUrl: './autocomplete.scss',\r\n})\r\nexport class OslAutocomplete extends baseComponent 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 private _model: any;\r\n private _object: any;\r\n @Input('model') set model(val:any){\r\n if(val){\r\n this._model = val;\r\n if(this.object){\r\n this.datasource = [this.object]\r\n \r\n this.filteredItems = [...this.datasource]\r\n this.syncInputFromModel()\r\n this.datasourceChange.emit(this.datasource)\r\n\r\n\r\n }\r\n }\r\n \r\n }\r\n\r\n get model(){\r\n return this._model\r\n }\r\n @Input('datasource') datasource:any[]=[];\r\n @Output() datasourceChange = new EventEmitter<any>();\r\n @Input('displayField') displayField: string = '';\r\n @Input('valueField') valueField: string = '';\r\n @Input('placeholder') placeholder: string = 'Type to search...';\r\n @Input('loading') loading: boolean = false;\r\n @Input('searchType') searchType: 'Local' | 'Api' = 'Local';\r\n @Input('methodName') methodName: string = '';\r\n @Input('configMethodName') configMethodName: string = '';\r\n @Input('service') service: any;\r\n @Input('object') set object(val:any){\r\n if(val){\r\n this._object = val;\r\n this.datasource = [val]\r\n this.filteredItems = [...this.datasource]\r\n this.datasourceChange.emit(this.datasource)\r\n\r\n }\r\n if(this.model){\r\n this.syncInputFromModel()\r\n\r\n }\r\n }\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n @Input('isLister') isLister: boolean = false;\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n private listerComponent = inject(AUTOCOMPLETE_LISTER_COMPONENT);\r\n inputControl = new FormControl('');\r\n\r\n inputValue: string = '';\r\n private _showDropdown: boolean = false;\r\n get showDropdown(): boolean { return this._showDropdown; }\r\n set showDropdown(val: boolean) {\r\n this._showDropdown = val;\r\n if (val) this.updateDropdownPosition();\r\n }\r\n dropdownStyle: { [key: string]: string } = {};\r\n filteredItems: any[] = [];\r\n touched: boolean = false;\r\n\r\n constructor(\r\n private elRef: ElementRef,\r\n public cdr: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n private updateDropdownPosition() {\r\n const wrapper = this.elRef.nativeElement.querySelector('.autocomplete-wrapper');\r\n if (!wrapper) return;\r\n const rect = wrapper.getBoundingClientRect();\r\n this.dropdownStyle = {\r\n 'position': 'fixed',\r\n 'top': `${rect.bottom + 5}px`,\r\n 'left': `${rect.left}px`,\r\n 'width': `${rect.width}px`,\r\n };\r\n this.cdr.markForCheck();\r\n }\r\n\r\n openLister() {\r\n const inputLister: oslListerData = {\r\n title: this.label,\r\n methodName: this.methodName,\r\n configMethodName: this.configMethodName,\r\n service: this.service,\r\n };\r\n const dialogRef = this.openDialog(\r\n undefined,\r\n undefined,\r\n undefined,\r\n '60vw',\r\n inputLister,\r\n this.listerComponent,\r\n );\r\n dialogRef.afterClosed().subscribe((selectedRow: any) => {\r\n if (selectedRow && selectedRow[this.valueField]) {\r\n this.datasource = [selectedRow];\r\n this.datasourceChange.emit(this.datasource)\r\n this.filteredItems = [...this.datasource];\r\n this.selectItem(selectedRow);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n if (this.searchType == 'Api' && this.methodName && this.service) {\r\n if(this.isLister){\r\n this.placeholder = 'Type to Search Or Press Enter';\r\n }else{\r\n this.placeholder = 'Type to Search';\r\n\r\n }\r\n this.inputControl.valueChanges\r\n .pipe(debounceTime(500), distinctUntilChanged())\r\n .subscribe(async (value) => {\r\n if(!value) return;\r\n const res:HttpResponse = await this.service[this.methodName](value);\r\n if(!res.isSuccessful) return\r\n this.datasource = res?.result && Array.isArray(res?.result) ? res?.result : res?.result?.data;\r\n this.datasourceChange.emit(this.datasource)\r\n\r\n this.filteredItems = this.datasource\r\n this.cdr.markForCheck();\r\n });\r\n\r\n if (this.object) {\r\n this.datasource = [this.object];\r\n this.datasourceChange.emit(this.datasource)\r\n this.filteredItems = [...this.datasource];\r\n\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n this.syncInputFromModel();\r\n }\r\n\r\n ngOnChanges() {\r\n this.filteredItems = [...this.datasource];\r\n this.syncInputFromModel();\r\n }\r\n\r\n private syncInputFromModel() {\r\n if (this.model !== null && this.model !== undefined) {\r\n const found = this.datasource.find((item) => this.getValue(item) === this.model);\r\n if (found) this.inputValue = this.getDisplay(found);\r\n this.inputControl.setValue(this.getDisplay(found));\r\n } else {\r\n this.inputValue = '';\r\n this.inputControl.setValue('');\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n getDisplay(item: any): string {\r\n return item && this.displayField ? item[this.displayField] : String(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 get isInvalid(): boolean {\r\n return this.touched && this.required && !this.model;\r\n }\r\n\r\n onInput(val: string) {\r\n this.model = null;\r\n if (this.searchType == 'Local') {\r\n this.inputValue = val;\r\n this.inputControl.setValue(val);\r\n this.showDropdown = true;\r\n\r\n this.filteredItems = this.datasource.filter((item) =>\r\n this.getDisplay(item)?.toLowerCase()?.includes(val?.toLowerCase()),\r\n );\r\n if (!val) {\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n }\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.loading) return;\r\n this.showDropdown = true;\r\n this.filteredItems = this.datasource.filter((item) =>\r\n this.getDisplay(item)?.toLowerCase()?.includes(this.inputValue?.toLowerCase()),\r\n );\r\n }\r\n onFocusOut() {\r\n if (this.inputValue && this.filteredItems.length == 1) {\r\n this.selectItem(this.filteredItems[0]);\r\n }\r\n if (!this.model) {\r\n this.clearValue();\r\n }\r\n }\r\n\r\n onBlur() {\r\n this.touched = true;\r\n }\r\n\r\n clearValue(event?: Event) {\r\n event?.stopPropagation();\r\n this.inputValue = '';\r\n this.inputControl.setValue('');\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n }\r\n\r\n selectItem(item: any) {\r\n this.inputValue = this.getDisplay(item);\r\n this.inputControl.setValue(this.getDisplay(item));\r\n\r\n this.model = this.getValue(item);\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n this.showDropdown = false;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (!this.elRef.nativeElement.contains(event.target)) {\r\n this.showDropdown = false;\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]=\"isInvalid\">\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 class=\"autocomplete-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.error]=\"isInvalid\" [class.autocomplete-wrapper--api]=\"searchType == 'Api'\">\r\n <input\r\n [value]=\"inputValue\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (focusout)=\"onFocusOut()\"\r\n [disabled]=\"disabled || loading\"\r\n [formControl]=\"inputControl\"\r\n [class.error]=\"isInvalid\"\r\n [placeholder]=\"loading ? 'Loading...' : placeholder\"\r\n autocomplete=\"off\"\r\n (keyup.enter)=\"searchType == 'Api' ? openLister() : null\"\r\n >\r\n @if(loading) {\r\n <span class=\"ac-spinner\"></span>\r\n } @else {\r\n @if(inputValue && !disabled) {\r\n <button type=\"button\" class=\"ac-clear\" [class.ac-clear--shifted]=\"searchType == 'Api'\" (mousedown)=\"clearValue($event)\" tabindex=\"-1\" title=\"Clear\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if(searchType == 'Api' && isLister && !disabled) {\r\n <button type=\"button\" class=\"ac-lister-btn\" (mousedown)=\"$event.preventDefault(); openLister()\" tabindex=\"-1\" title=\"Browse list or press Enter\">\r\n <!-- <img src=\"assets/enter (2).png\" alt=\"Enter\" class=\"ac-lister-img\"> -->\r\n <mat-icon>manage_search</mat-icon>\r\n </button>\r\n }\r\n }\r\n @if(showDropdown && !loading) {\r\n <div class=\"dropdown\" [ngStyle]=\"dropdownStyle\">\r\n @if(filteredItems.length > 0) {\r\n @for(item of filteredItems; track item) {\r\n <div class=\"dropdown-item\" (mousedown)=\"selectItem(item)\">{{getDisplay(item)}}</div>\r\n }\r\n } @else {\r\n @if(searchType == 'Local'){\r\n <div class=\"no-results\">No results found</div>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\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\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 &amp; 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) => boolean;\r\n maxDateIf?: (model: any) => boolean;\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';\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}\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 @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 </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\">\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}\n\nexport interface OslReportPageEvent { page: number; pageSize: number; }\nexport interface OslReportSortEvent { sorts: { key: string; asc: boolean }[]; }\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\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 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 processData(): void {\n let rows = this.getFilteredRows();\n\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\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 if (!this.excelFilterState[key]) 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 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.datasource) {\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: '',\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 CSV ───────────────────────────────────────────────────────────────\n\n exportCsv(): void {\n const cols = this.visibleCols;\n const header = cols.map(c => `\"${c.label}\"`).join(',');\n const filteredRows = this.getFilteredRows();\n const rows = filteredRows.map(row =>\n cols.map(col => `\"${String(this.getCellDisplay(row, col)).replace(/\"/g, '\"\"')}\"`).join(',')\n );\n const blob = new Blob([[header, ...rows].join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const a = Object.assign(document.createElement('a'), {\n href: URL.createObjectURL(blob), download: `${this.title || 'report'}.csv`,\n });\n a.click();\n URL.revokeObjectURL(a.href);\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)=\"$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)=\"exportCsv()\" title=\"Export to Excel (CSV)\">\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</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 <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 } from '@angular/core';\nimport { elements } from '../dynamic-form/dynamic-form';\nimport { OslReportColumn } 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\n selectedType: ReportGenerateType = 'grid';\n generating: boolean = false;\n resultDatasource: any[] = [];\n showResultView: boolean = false;\n\n constructor(public cd:ChangeDetectorRef){\n \n }\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 } \n\n }\n } finally {\n this.generating = false;\n }\n this.cd.markForCheck()\n }\n\n backToForm(): void {\n this.showResultView = false;\n this.resultDatasource = [];\n }\n\n reExportExcel(): void { this._exportCsv(this.resultDatasource); }\n reExportPdf(): void { this._exportPdf(this.resultDatasource); }\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 private _exportCsv(data: any[]): void {\n if (!data.length || !this.reportColumns.length) return;\n const cols = this.reportColumns;\n const header = cols.map(c => `\"${c.label}\"`).join(',');\n const rows = data.map(row =>\n cols.map(col => `\"${String(row[col.key] ?? '').replace(/\"/g, '\"\"')}\"`).join(',')\n );\n const blob = new Blob([[header, ...rows].join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const a = Object.assign(document.createElement('a'), {\n href: URL.createObjectURL(blob),\n download: `${this.title || 'report'}.csv`,\n });\n a.click();\n URL.revokeObjectURL(a.href);\n }\n\n private _exportPdf(data: any[]): void {\n if (!data.length || !this.reportColumns.length) return;\n const cols = this.reportColumns;\n const headerRow = cols.map(c => `<th>${c.label}</th>`).join('');\n const bodyRows = data.map(row =>\n `<tr>${cols.map(col => `<td>${String(row[col.key] ?? '')}</td>`).join('')}</tr>`\n ).join('');\n\n const w = window.open('', '_blank');\n if (!w) return;\n w.document.write(`<!DOCTYPE html><html><head><title>${this.title}</title>\n <style>\n body{font-family:Arial,sans-serif;padding:24px;font-size:13px;color:#111827}\n h2{color:#1e3a8a;margin:0 0 4px;font-size:20px;font-weight:700}\n .subtitle{color:#6b7280;font-size:12px;margin-bottom:20px}\n table{border-collapse:collapse;width:100%}\n th{background:#1e3a8a;color:#fff;padding:9px 12px;text-align:left;font-weight:600;font-size:12px}\n td{padding:8px 12px;border-bottom:1px solid #e5e7eb;font-size:12px}\n tr:nth-child(even) td{background:#f8fafc}\n @media print{@page{margin:.8cm}}\n </style>\n </head><body>\n <h2>${this.title}</h2>\n <p class=\"subtitle\">Generated on ${new Date().toLocaleString()}</p>\n <table><thead><tr>${headerRow}</tr></thead><tbody>${bodyRows}</tbody></table>\n <script>window.onload=function(){window.print();}<\\/script>\n </body></html>`);\n w.document.close();\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 <mat-icon class=\"orf-header__icon\">assessment</mat-icon>\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 <mat-icon>{{ typeIcon(type) }}</mat-icon>\n <span>{{ typeLabel(type) }}</span>\n </button>\n }\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"orf-divider\"></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 <mat-icon>{{ typeIcon(selectedType) }}</mat-icon>\n <span>Generate {{ typeLabel(selectedType) }}</span>\n <mat-icon class=\"orf-generate-btn__arrow\">arrow_forward</mat-icon>\n }\n </button>\n </div>\n\n </div>\n}\n\n<!-- ── Full-screen results view ─────────────────────────────────────────── -->\n@if (showResultView) {\n <!-- <div class=\"orf-results-view\"> -->\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 <mat-icon>arrow_back</mat-icon>\n <span>Back</span>\n </button>\n <div class=\"orf-results-header__sep\"></div>\n <mat-icon class=\"orf-results-header__report-icon\">assessment</mat-icon>\n <span class=\"orf-results-header__title\">{{ title }}</span>\n <span class=\"orf-results-badge\">\n <mat-icon>table_rows</mat-icon>\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 <mat-icon>table_chart</mat-icon>\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 <mat-icon>picture_as_pdf</mat-icon>\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 - 200px)\"\n [pageSize]=\"pageSize\"\n [exportable]=\"true\"\n [showAggregates]=\"true\"\n [striped]=\"true\"\n ></osl-report-grid>\n </div>\n\n <!-- </div> -->\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, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\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(/&amp;/g, '&')\r\n .replace(/&lt;/g, '<')\r\n .replace(/&gt;/g, '>')\r\n .replace(/&quot;/g, '\"')\r\n .replace(/&#039;/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","i3.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 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 }\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';\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) 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.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.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 {\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostListener,\r\n inject,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { debounceTime, distinctUntilChanged, switchMap } from 'rxjs';\r\nimport { baseComponent } from '../../../base/base.component';\r\nimport { AUTOCOMPLETE_LISTER_COMPONENT, oslListerData } from '../autocomplete-lister/autocomplete-lister-types';\r\nimport { HttpResponse } from '../../../http/httpbase';\r\n\r\n@Component({\r\n selector: 'osl-autocomplete',\r\n standalone: false,\r\n templateUrl: './autocomplete.html',\r\n styleUrl: './autocomplete.scss',\r\n})\r\nexport class OslAutocomplete extends baseComponent 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 private _model: any;\r\n private _object: any;\r\n @Input('model') set model(val:any){\r\n if(val){\r\n this._model = val;\r\n if(this.object){\r\n this.datasource = [this.object]\r\n \r\n this.filteredItems = [...this.datasource]\r\n this.syncInputFromModel()\r\n this.datasourceChange.emit(this.datasource)\r\n\r\n\r\n }\r\n }\r\n \r\n }\r\n\r\n get model(){\r\n return this._model\r\n }\r\n @Input('datasource') datasource:any[]=[];\r\n @Output() datasourceChange = new EventEmitter<any>();\r\n @Input('displayField') displayField: string = '';\r\n @Input('valueField') valueField: string = '';\r\n @Input('placeholder') placeholder: string = 'Type to search...';\r\n @Input('loading') loading: boolean = false;\r\n @Input('searchType') searchType: 'Local' | 'Api' = 'Local';\r\n @Input('methodName') methodName: string = '';\r\n @Input('configMethodName') configMethodName: string = '';\r\n @Input('service') service: any;\r\n @Input('object') set object(val:any){\r\n if(val){\r\n this._object = val;\r\n this.datasource = [val]\r\n this.filteredItems = [...this.datasource]\r\n this.datasourceChange.emit(this.datasource)\r\n\r\n }\r\n if(this.model){\r\n this.syncInputFromModel()\r\n\r\n }\r\n }\r\n @Input('skeletonLoading') skeletonLoading: boolean = false;\r\n @Input('skeletonTheme') skeletonTheme: 'light' | 'dark' = 'light';\r\n @Input('isLister') isLister: boolean = false;\r\n\r\n @Output() modelChange = new EventEmitter<any>();\r\n @Output() changeEv = new EventEmitter<any>();\r\n private listerComponent = inject(AUTOCOMPLETE_LISTER_COMPONENT);\r\n inputControl = new FormControl('');\r\n\r\n inputValue: string = '';\r\n private _showDropdown: boolean = false;\r\n get showDropdown(): boolean { return this._showDropdown; }\r\n set showDropdown(val: boolean) {\r\n this._showDropdown = val;\r\n if (val) this.updateDropdownPosition();\r\n }\r\n dropdownStyle: { [key: string]: string } = {};\r\n filteredItems: any[] = [];\r\n touched: boolean = false;\r\n\r\n constructor(\r\n private elRef: ElementRef,\r\n public cdr: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n private updateDropdownPosition() {\r\n const wrapper = this.elRef.nativeElement.querySelector('.autocomplete-wrapper');\r\n if (!wrapper) return;\r\n const rect = wrapper.getBoundingClientRect();\r\n this.dropdownStyle = {\r\n 'position': 'fixed',\r\n 'top': `${rect.bottom + 5}px`,\r\n 'left': `${rect.left}px`,\r\n 'width': `${rect.width}px`,\r\n };\r\n this.cdr.markForCheck();\r\n }\r\n\r\n openLister() {\r\n const inputLister: oslListerData = {\r\n title: this.label,\r\n methodName: this.methodName,\r\n configMethodName: this.configMethodName,\r\n service: this.service,\r\n };\r\n const dialogRef = this.openDialog(\r\n undefined,\r\n undefined,\r\n undefined,\r\n '60vw',\r\n inputLister,\r\n this.listerComponent,\r\n );\r\n dialogRef.afterClosed().subscribe((selectedRow: any) => {\r\n if (selectedRow && selectedRow[this.valueField]) {\r\n this.datasource = [selectedRow];\r\n this.datasourceChange.emit(this.datasource)\r\n this.filteredItems = [...this.datasource];\r\n this.selectItem(selectedRow);\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n if (this.searchType == 'Api' && this.methodName && this.service) {\r\n if(this.isLister){\r\n this.placeholder = 'Type to Search Or Press Enter';\r\n }else{\r\n this.placeholder = 'Type to Search';\r\n\r\n }\r\n this.inputControl.valueChanges\r\n .pipe(debounceTime(500), distinctUntilChanged())\r\n .subscribe(async (value) => {\r\n if(!value) return;\r\n const res:HttpResponse = await this.service[this.methodName](value);\r\n if(!res.isSuccessful) return\r\n this.datasource = res?.result && Array.isArray(res?.result) ? res?.result : res?.result?.data;\r\n this.datasourceChange.emit(this.datasource)\r\n\r\n this.filteredItems = this.datasource\r\n this.cdr.markForCheck();\r\n });\r\n\r\n if (this.object) {\r\n this.datasource = [this.object];\r\n this.datasourceChange.emit(this.datasource)\r\n this.filteredItems = [...this.datasource];\r\n\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n this.syncInputFromModel();\r\n }\r\n\r\n ngOnChanges() {\r\n this.filteredItems = [...this.datasource];\r\n this.syncInputFromModel();\r\n }\r\n\r\n private syncInputFromModel() {\r\n if (this.model !== null && this.model !== undefined) {\r\n const found = this.datasource.find((item) => this.getValue(item) === this.model);\r\n if (found) this.inputValue = this.getDisplay(found);\r\n this.inputControl.setValue(this.getDisplay(found));\r\n } else {\r\n this.inputValue = '';\r\n this.inputControl.setValue('');\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n getDisplay(item: any): string {\r\n return item && this.displayField ? item[this.displayField] : String(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 get isInvalid(): boolean {\r\n return this.touched && this.required && !this.model;\r\n }\r\n\r\n onInput(val: string) {\r\n this.model = null;\r\n if (this.searchType == 'Local') {\r\n this.inputValue = val;\r\n this.inputControl.setValue(val);\r\n this.showDropdown = true;\r\n\r\n this.filteredItems = this.datasource.filter((item) =>\r\n this.getDisplay(item)?.toLowerCase()?.includes(val?.toLowerCase()),\r\n );\r\n if (!val) {\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n }\r\n }\r\n }\r\n\r\n onFocus() {\r\n if (this.loading) return;\r\n this.showDropdown = true;\r\n this.filteredItems = this.datasource.filter((item) =>\r\n this.getDisplay(item)?.toLowerCase()?.includes(this.inputValue?.toLowerCase()),\r\n );\r\n }\r\n onFocusOut() {\r\n if (this.inputValue && this.filteredItems.length == 1) {\r\n this.selectItem(this.filteredItems[0]);\r\n }\r\n if (!this.model) {\r\n this.clearValue();\r\n }\r\n }\r\n\r\n onBlur() {\r\n this.touched = true;\r\n }\r\n\r\n clearValue(event?: Event) {\r\n event?.stopPropagation();\r\n this.inputValue = '';\r\n this.inputControl.setValue('');\r\n this.model = null;\r\n this.modelChange.emit(null);\r\n this.changeEv.emit(null);\r\n }\r\n\r\n selectItem(item: any) {\r\n this.inputValue = this.getDisplay(item);\r\n this.inputControl.setValue(this.getDisplay(item));\r\n\r\n this.model = this.getValue(item);\r\n this.modelChange.emit(this.model);\r\n this.changeEv.emit(this.model);\r\n this.showDropdown = false;\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent) {\r\n if (!this.elRef.nativeElement.contains(event.target)) {\r\n this.showDropdown = false;\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]=\"isInvalid\">\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 class=\"autocomplete-wrapper\" [oslSkeleton]=\"skeletonLoading\" [oslSkeletonTheme]=\"skeletonTheme\" [class.error]=\"isInvalid\" [class.autocomplete-wrapper--api]=\"searchType == 'Api'\">\r\n <input\r\n [value]=\"inputValue\"\r\n (input)=\"onInput($any($event.target).value)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n (focusout)=\"onFocusOut()\"\r\n [disabled]=\"disabled || loading\"\r\n [formControl]=\"inputControl\"\r\n [class.error]=\"isInvalid\"\r\n [placeholder]=\"loading ? 'Loading...' : placeholder\"\r\n autocomplete=\"off\"\r\n (keyup.enter)=\"searchType == 'Api' ? openLister() : null\"\r\n >\r\n @if(loading) {\r\n <span class=\"ac-spinner\"></span>\r\n } @else {\r\n @if(inputValue && !disabled) {\r\n <button type=\"button\" class=\"ac-clear\" [class.ac-clear--shifted]=\"searchType == 'Api'\" (mousedown)=\"clearValue($event)\" tabindex=\"-1\" title=\"Clear\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n @if(searchType == 'Api' && isLister && !disabled) {\r\n <button type=\"button\" class=\"ac-lister-btn\" (mousedown)=\"$event.preventDefault(); openLister()\" tabindex=\"-1\" title=\"Browse list or press Enter\">\r\n <!-- <img src=\"assets/enter (2).png\" alt=\"Enter\" class=\"ac-lister-img\"> -->\r\n <mat-icon>manage_search</mat-icon>\r\n </button>\r\n }\r\n }\r\n @if(showDropdown && !loading) {\r\n <div class=\"dropdown\" [ngStyle]=\"dropdownStyle\">\r\n @if(filteredItems.length > 0) {\r\n @for(item of filteredItems; track item) {\r\n <div class=\"dropdown-item\" (mousedown)=\"selectItem(item)\">{{getDisplay(item)}}</div>\r\n }\r\n } @else {\r\n @if(searchType == 'Local'){\r\n <div class=\"no-results\">No results found</div>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\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\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 &amp; 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';\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}\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 @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 </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\">\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}\n\nexport interface OslReportPageEvent { page: number; pageSize: number; }\nexport interface OslReportSortEvent { sorts: { key: string; asc: boolean }[]; }\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\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 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 processData(): void {\n let rows = this.getFilteredRows();\n\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\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 if (!this.excelFilterState[key]) 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 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.datasource) {\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: '',\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 CSV ───────────────────────────────────────────────────────────────\n\n exportCsv(): void {\n const cols = this.visibleCols;\n const header = cols.map(c => `\"${c.label}\"`).join(',');\n const filteredRows = this.getFilteredRows();\n const rows = filteredRows.map(row =>\n cols.map(col => `\"${String(this.getCellDisplay(row, col)).replace(/\"/g, '\"\"')}\"`).join(',')\n );\n const blob = new Blob([[header, ...rows].join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const a = Object.assign(document.createElement('a'), {\n href: URL.createObjectURL(blob), download: `${this.title || 'report'}.csv`,\n });\n a.click();\n URL.revokeObjectURL(a.href);\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)=\"$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)=\"exportCsv()\" title=\"Export to Excel (CSV)\">\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</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 <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 } from '@angular/core';\nimport { elements } from '../dynamic-form/dynamic-form';\nimport { OslReportColumn } 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\n selectedType: ReportGenerateType = 'grid';\n generating: boolean = false;\n resultDatasource: any[] = [];\n showResultView: boolean = false;\n\n constructor(public cd:ChangeDetectorRef){\n \n }\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 } \n\n }\n } finally {\n this.generating = false;\n }\n this.cd.markForCheck()\n }\n\n backToForm(): void {\n this.showResultView = false;\n this.resultDatasource = [];\n }\n\n reExportExcel(): void { this._exportCsv(this.resultDatasource); }\n reExportPdf(): void { this._exportPdf(this.resultDatasource); }\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 private _exportCsv(data: any[]): void {\n if (!data.length || !this.reportColumns.length) return;\n const cols = this.reportColumns;\n const header = cols.map(c => `\"${c.label}\"`).join(',');\n const rows = data.map(row =>\n cols.map(col => `\"${String(row[col.key] ?? '').replace(/\"/g, '\"\"')}\"`).join(',')\n );\n const blob = new Blob([[header, ...rows].join('\\n')], { type: 'text/csv;charset=utf-8;' });\n const a = Object.assign(document.createElement('a'), {\n href: URL.createObjectURL(blob),\n download: `${this.title || 'report'}.csv`,\n });\n a.click();\n URL.revokeObjectURL(a.href);\n }\n\n private _exportPdf(data: any[]): void {\n if (!data.length || !this.reportColumns.length) return;\n const cols = this.reportColumns;\n const headerRow = cols.map(c => `<th>${c.label}</th>`).join('');\n const bodyRows = data.map(row =>\n `<tr>${cols.map(col => `<td>${String(row[col.key] ?? '')}</td>`).join('')}</tr>`\n ).join('');\n\n const w = window.open('', '_blank');\n if (!w) return;\n w.document.write(`<!DOCTYPE html><html><head><title>${this.title}</title>\n <style>\n body{font-family:Arial,sans-serif;padding:24px;font-size:13px;color:#111827}\n h2{color:#1e3a8a;margin:0 0 4px;font-size:20px;font-weight:700}\n .subtitle{color:#6b7280;font-size:12px;margin-bottom:20px}\n table{border-collapse:collapse;width:100%}\n th{background:#1e3a8a;color:#fff;padding:9px 12px;text-align:left;font-weight:600;font-size:12px}\n td{padding:8px 12px;border-bottom:1px solid #e5e7eb;font-size:12px}\n tr:nth-child(even) td{background:#f8fafc}\n @media print{@page{margin:.8cm}}\n </style>\n </head><body>\n <h2>${this.title}</h2>\n <p class=\"subtitle\">Generated on ${new Date().toLocaleString()}</p>\n <table><thead><tr>${headerRow}</tr></thead><tbody>${bodyRows}</tbody></table>\n <script>window.onload=function(){window.print();}<\\/script>\n </body></html>`);\n w.document.close();\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 <mat-icon class=\"orf-header__icon\">assessment</mat-icon>\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 <mat-icon>{{ typeIcon(type) }}</mat-icon>\n <span>{{ typeLabel(type) }}</span>\n </button>\n }\n </div>\n </div>\n\n <!-- Divider -->\n <div class=\"orf-divider\"></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 <mat-icon>{{ typeIcon(selectedType) }}</mat-icon>\n <span>Generate {{ typeLabel(selectedType) }}</span>\n <mat-icon class=\"orf-generate-btn__arrow\">arrow_forward</mat-icon>\n }\n </button>\n </div>\n\n </div>\n}\n\n<!-- ── Full-screen results view ─────────────────────────────────────────── -->\n@if (showResultView) {\n <!-- <div class=\"orf-results-view\"> -->\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 <mat-icon>arrow_back</mat-icon>\n <span>Back</span>\n </button>\n <div class=\"orf-results-header__sep\"></div>\n <mat-icon class=\"orf-results-header__report-icon\">assessment</mat-icon>\n <span class=\"orf-results-header__title\">{{ title }}</span>\n <span class=\"orf-results-badge\">\n <mat-icon>table_rows</mat-icon>\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 <mat-icon>table_chart</mat-icon>\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 <mat-icon>picture_as_pdf</mat-icon>\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 - 200px)\"\n [pageSize]=\"pageSize\"\n [exportable]=\"true\"\n [showAggregates]=\"true\"\n [striped]=\"true\"\n ></osl-report-grid>\n </div>\n\n <!-- </div> -->\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, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\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(/&amp;/g, '&')\r\n .replace(/&lt;/g, '<')\r\n .replace(/&gt;/g, '>')\r\n .replace(/&quot;/g, '\"')\r\n .replace(/&#039;/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","i3.OslReportGrid","average","isEmpty","isValidDate","inRange","isPositive","isNegative"],"mappings":"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"}