cloud-ide-element 1.0.11 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cloud-ide-element.mjs +812 -122
- package/fesm2022/cloud-ide-element.mjs.map +1 -1
- package/index.d.ts +98 -15
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-ide-element.mjs","sources":["../../../projects/cloud-ide-element/src/lib/utils/pipes/capitalize/capitalize.pipe.ts","../../../projects/cloud-ide-element/src/lib/utils/services/elements/elements.service.ts","../../../projects/cloud-ide-element/src/lib/elements/input/input.component.ts","../../../projects/cloud-ide-element/src/lib/elements/input/input.component.html","../../../projects/cloud-ide-element/src/lib/elements/spinner/spinner.component.ts","../../../projects/cloud-ide-element/src/lib/elements/spinner/spinner.component.html","../../../projects/cloud-ide-element/src/lib/elements/button/cide-ele-button.component.ts","../../../projects/cloud-ide-element/src/lib/elements/button/cide-ele-button.component.html","../../../projects/cloud-ide-element/src/lib/elements/icon/icon.component.ts","../../../projects/cloud-ide-element/src/lib/elements/icon/icon.component.html","../../../projects/cloud-ide-element/src/lib/elements/select/select.component.ts","../../../projects/cloud-ide-element/src/lib/elements/select/select.component.html","../../../projects/cloud-ide-element/src/lib/elements/tab/cide-ele-tab.component.ts","../../../projects/cloud-ide-element/src/lib/elements/tab/cide-ele-tab.component.html","../../../projects/cloud-ide-element/src/lib/elements/file-input/file-input.component.ts","../../../projects/cloud-ide-element/src/lib/elements/file-input/file-input.component.html","../../../projects/cloud-ide-element/src/lib/elements/textarea/textarea.component.ts","../../../projects/cloud-ide-element/src/lib/elements/textarea/textarea.component.html","../../../projects/cloud-ide-element/src/lib/utils/directives/resizer/resizer.directive.ts","../../../projects/cloud-ide-element/src/lib/utils/directives/tooltip/tooltip.directive.ts","../../../projects/cloud-ide-element/src/lib/components/skeleton-loader/skeleton-loader.component.ts","../../../projects/cloud-ide-element/src/lib/components/skeleton-loader/skeleton-loader.component.html","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.types.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.component.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.component.html","../../../projects/cloud-ide-element/src/lib/services/dropdown-manager.service.ts","../../../projects/cloud-ide-element/src/lib/components/dropdown/dropdown.component.ts","../../../projects/cloud-ide-element/src/lib/services/confirmation.service.ts","../../../projects/cloud-ide-element/src/lib/services/notification.service.ts","../../../projects/cloud-ide-element/src/lib/components/confirmation-modal/confirmation-modal.component.ts","../../../projects/cloud-ide-element/src/lib/components/toast-notification/toast-notification.component.ts","../../../projects/cloud-ide-element/src/lib/components/global-notifications/global-notifications.component.ts","../../../projects/cloud-ide-element/src/lib/components/json-editor/json-editor.component.ts","../../../projects/cloud-ide-element/src/public-api.ts","../../../projects/cloud-ide-element/src/cloud-ide-element.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'capitalize',\r\n standalone: true\r\n})\r\nexport class CapitalizePipe implements PipeTransform {\r\n\r\n transform(\r\n value: string,\r\n capitalizationMethod: 'allUpperCase' | 'titleCase' | 'sentenceCase'\r\n ): string {\r\n if (value) {\r\n if (capitalizationMethod === 'allUpperCase') {\r\n return value.toUpperCase();\r\n } else if (capitalizationMethod === 'titleCase') {\r\n const splitString = value\r\n .split(' ')\r\n .map((s) => `${s[0].toUpperCase()}${s.slice(1)}`);\r\n return splitString.join(' ');\r\n } else if (capitalizationMethod === 'sentenceCase') {\r\n const splitString = value.split('.').map((s) => {\r\n const trimmedString = s.trim();\r\n if (trimmedString.length > 0) {\r\n return `${trimmedString[0].toUpperCase()}${trimmedString.slice(1)}`;\r\n }\r\n return '';\r\n });\r\n return splitString.join('. ');\r\n }\r\n }\r\n return '';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { GetElementDataRequest, ICoreSype } from 'cloud-ide-lms-model';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideElementsService {\r\n cide_element_data: { [key: string]: ICoreSype } = {};\r\n is_cide_element_data_updated: BehaviorSubject<boolean> = new BehaviorSubject(false);\r\n async getElementData(body: GetElementDataRequest): Promise<ICoreSype> {\r\n return new Promise<ICoreSype>((resolve) => {\r\n const cide_element_data = this.cide_element_data[body?.sype_key];\r\n if (cide_element_data) {\r\n resolve(cide_element_data);\r\n } else {\r\n const subscription = this.is_cide_element_data_updated?.subscribe({\r\n next: (is_cide_element_data_updated: boolean) => {\r\n if (is_cide_element_data_updated) {\r\n const cide_element_data = this.cide_element_data[body?.sype_key];\r\n if (cide_element_data) {\r\n subscription?.unsubscribe();\r\n resolve(cide_element_data);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n })\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef, inject } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\r\nimport { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';\r\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\r\nimport { autocapitalizeType, autocompleteType, controlType, elementStyleType, inputType, labelDirType, labelPlacementType, themeSize } from 'cloud-ide-lms-model';\r\n\r\n/** @description type to register error related to control */\r\nexport type ErrorValidationStatus = {\r\n maxlength?: string,\r\n minlength?: string,\r\n required?: string,\r\n}\r\nexport type ValidationStatus = {\r\n validation: ErrorValidationStatus,\r\n status: boolean\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-input',\r\n standalone: true,\r\n templateUrl: './input.component.html',\r\n styleUrl: './input.component.scss',\r\n imports: [\r\n // directives\r\n CommonModule,\r\n // for ngModel\r\n FormsModule\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideInputComponent),\r\n multi: true\r\n },\r\n /** @description to apply validations */\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: forwardRef(() => CideInputComponent),\r\n },\r\n CapitalizePipe\r\n ]\r\n})\r\n\r\nexport class CideInputComponent implements ControlValueAccessor, Validator, OnChanges, OnInit {\r\n\r\n // Modern Angular v20 dependency injection pattern\r\n public capitalizePipe = inject(CapitalizePipe);\r\n private elementService = inject(CideElementsService);\r\n\r\n constructor() {\r\n // Modern Angular v20 pattern: Use constructor for initialization only\r\n // Validate control\r\n this.onValidate();\r\n }\r\n /*=======Set custom controls inputs to set components=========*/\r\n\r\n /** \r\n * @description to se the visual of control like solid control offerd by material design or outline with a border\r\n * @options solid | outline | standard\r\n */\r\n @Input() fill: elementStyleType = 'outline';\r\n /** @description Lable of control (Title), Like Name, Email */\r\n @Input() label: string = \"\";\r\n /** @description to hide and show label */\r\n @Input() labelHide: boolean = false;\r\n /** @description is control Editable or Disabled */\r\n @Input() disabled: boolean = false;\r\n /** @description Is Clear Input Cross button is visible or not */\r\n @Input() clearInput: boolean = false;\r\n /** @description Position of Label 'floating' | 'fixed' */\r\n @Input() labelPlacement: labelPlacementType = \"fixed\";\r\n /** @description Lable direction from start of contrl or end of control */\r\n @Input() labelDir: labelDirType = \"start\";\r\n /** @description Place holder for control to display if there is no value */\r\n @Input() placeholder: string = \"\";\r\n /** @description it is to set leading icon, at the start of control */\r\n @Input() leadingIcon: string = \"\";\r\n /** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon */\r\n @Input() trailingIcon: string = \"\";\r\n /** @description to display below the control for suggestion, if there is any error then error will bw the first to shoe in place of help text */\r\n @Input() helperText: string = \"\";\r\n /** @description default true to collapse when there is no help text or error text, if false then element area in DOM will be reserved never detroy */\r\n @Input() helperTextCollapse: boolean = true;\r\n /** @description show and hide helper text its forecfull */\r\n @Input() hideHelperAndErrorText: boolean = false;\r\n /** @description if found any error in control the error thext will be used to display error message, if there is help text still error text is having higher priority then helptext */\r\n @Input() errorText: string = \"\";\r\n /** @description maxlength for control */\r\n @Input() maxlength: number = 0;\r\n /** @description minlength for control */\r\n @Input() minlength: number = 0;\r\n /** @description is control is required or not input type is true | false */\r\n @Input() required: boolean = false;\r\n /** @description Auto capatalization for the value and applicable to word or to complete sentance */\r\n @Input() autocapitalize: autocapitalizeType = \"off\";\r\n /** @description auto complete type to help reader what is the type of value */\r\n @Input() autocomplete: autocompleteType = \"off\";\r\n /** @description type of control */\r\n @Input() type: controlType = 'text';\r\n /** @description width of control, default width is 100% */\r\n @Input() width: string = '100%';\r\n /** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */\r\n @Input() id: string = '';\r\n /** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */\r\n @Input() ngModel: inputType = '';\r\n @Input() option: string[] = [\"anksuh\", \"bhure\"];\r\n /** @description min value for number type control */\r\n @Input() min: number = 0;\r\n /** @description max value for number type control */\r\n @Input() max: number = 0;\r\n /**\r\n * @description\r\n * Holds the size of the component like Small, Extra small, Large\r\n * by Default it takes small size\r\n * or the size set by the project setup service\r\n * or it will beset for individual component\r\n * \r\n * Size Appled \r\n * Component level then setup service then finally default md\r\n * Options: \"2xs\" | \"\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \r\n */\r\n @Input() size: themeSize = \"sm\";\r\n /** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */\r\n @Output() ngModelChange: EventEmitter<inputType> = new EventEmitter<inputType>();\r\n\r\n /*\r\n internal Properties for input\r\n */\r\n /** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */\r\n public isNgModel: boolean = this.ngModel ? true : false;\r\n /** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular */\r\n public isValid: boolean = true;\r\n /** @description when control is touched then the will maid true by the us to check it is touched or not, when we will set this true we will call the onTouched callback method of angualr to inform angular that somthis is changed and control is touched */\r\n public isTouched: boolean = false;\r\n /** @description we will take type of control in type but is may be not exactly which input's type so we need to get type and set actule type to our input, also when type is set password but in calse view in textt then inuut type need to change to text */\r\n public typeInternal: controlType = \"text\";\r\n /** @description if traling is set the it is assigned by it, but some case tarling icon not as it is set need tro be changed at runtime, like password visibility hide and show */\r\n public trailingIconInternal: string = \"\";\r\n\r\n /* \r\n Properties connected with trailingIconInternal \r\n */\r\n public isTrailingIconAllwedClick: boolean = false;\r\n\r\n // Properties connected with id\r\n public idRandom: string = this.randomString();\r\n\r\n // ==================================METHODS FOR CUSTOM FORM COMPONENT=============================\r\n // FOR ANGULAR CALLED BY UI\r\n\r\n /** \r\n * @description Function to call when the HTML Chnage to tell Angular somthing is changed.\r\n * @field value : inputType\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private onChange = (value: inputType) => { };\r\n\r\n /** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */\r\n onTouched = () => { };\r\n\r\n /** @description Function to call when the input is need to Validate to tell Angular somthing is changed (in case of some input dipendent validation). */\r\n onValidate = () => { };\r\n\r\n /**\r\n * @description\r\n * Method that performs synchronous validation against the provided control.\r\n * Exicuted by Angular\r\n *\r\n * @param control The control to validate against.\r\n *\r\n * @returns A map of validation errors if validation fails,\r\n * otherwise null.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n const validation_error = this.isControlValid(this.ngModel);\r\n if (validation_error?.status) {\r\n return validation_error;\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * @description\r\n * Registers a callback function to call when the validator inputs change.\r\n * Exicuted by Angular\r\n *\r\n * @param fn The callback function\r\n */\r\n registerOnValidatorChange?(fn: () => void): void {\r\n this.onValidate = fn;\r\n }\r\n\r\n /** @description when form control change from model side this method is implemented */\r\n writeValue(value: inputType): void {\r\n if (!this.isNgModel) {\r\n const ngModel = this.autoCapitalizeByOption(value, this.type);\r\n console.log('writeValue', this.ngModel, ngModel);\r\n this.ngModel = ngModel;\r\n }\r\n }\r\n /** @description Allows Angular to register a function to call when the model changes. */\r\n // Save the function as a property to call later here.\r\n registerOnChange(fn: (value: inputType) => void): void {\r\n this.onChange = fn;\r\n }\r\n /** @description Allows Angular to register a function to call when the input has been touched. */\r\n // Save the function as a property to call later here.\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n //==========================================================================\r\n\r\n /*\r\n Methods for input\r\n*/\r\n\r\n /** @description Detect wether input propertires canged or not */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes?.['value']) {\r\n this.isNgModel = true;\r\n this.ngModel = this.processValue(this.ngModel, this.type);\r\n }\r\n if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {\r\n this.isControlValid(this.ngModel);\r\n }\r\n\r\n // Ditect type change\r\n if (changes?.['type']) {\r\n this.detectTypeChange();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.id) {\r\n this.getControlData();\r\n }\r\n }\r\n\r\n /** @description custom method run when HTML changes, we call method registerd by angular to detect change */\r\n upDateValue(value: { target: { value: inputType } } | Event) {\r\n const target = value.target as HTMLInputElement | { value: inputType };\r\n this.isControlValid(target?.value);\r\n const updatedValue = this.processValue(target?.value, this.type);\r\n this.ngModel = updatedValue;\r\n this.ngModelChange?.emit(updatedValue);\r\n // console.log(target)\r\n this.onChange(updatedValue);\r\n }\r\n\r\n /**\r\n * @description method applicable in case of control type checkbox\r\n * \r\n * @param value boolean | string\r\n */\r\n updateValueCheckBox(value: string | boolean) {\r\n // Convert string to boolean\r\n this.ngModel = !this.ngModel;\r\n value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);\r\n this.ngModelChange?.emit(value);\r\n this.onChange(value);\r\n }\r\n\r\n /** @description clear the value */\r\n ClearInputValue() {\r\n if (this.type == \"text\") {\r\n this.upDateValue({ target: { value: \"\" } });\r\n }\r\n }\r\n\r\n /** @description when HTML is focuesd */\r\n focusControl() {\r\n this.isTouched = true;\r\n this.onTouched();\r\n this.onValidate();\r\n }\r\n\r\n /** @description If control value need to be processed, like UPPERCASE */\r\n processValue(value: inputType, type: controlType) {\r\n value = this.autoCapitalizeByOption(value, type);\r\n return value;\r\n }\r\n\r\n /** @description for capitalization */\r\n autoCapitalizeByOption(value: inputType, type: controlType) {\r\n if (type == 'text') {\r\n if (this.autocapitalize == \"on\") {\r\n return this.capitalizePipe?.transform(value as string, 'allUpperCase');\r\n }\r\n if (this.autocapitalize == \"words\") {\r\n return this.capitalizePipe?.transform(value as string, 'titleCase');\r\n }\r\n if (this.autocapitalize == \"sentences\") {\r\n return this.capitalizePipe?.transform(value as string, \"sentenceCase\");\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n /** @description It is used to return the value is valid or not */\r\n isValidValueAndType(value: inputType, type: controlType) {\r\n if (type == 'text') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /** @description to check control is valid or not */\r\n isControlValid(value: inputType): ValidationStatus {\r\n const validation_status: ValidationStatus = {\r\n validation: {},\r\n status: false\r\n };\r\n\r\n if (this.required) {\r\n if (!value) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `required!`;\r\n }\r\n }\r\n\r\n if (this.type == 'text') {\r\n if (typeof (value) == 'string') {\r\n if (this.maxlength > 0) {\r\n if (value?.length > this.maxlength) {\r\n validation_status.status = true;\r\n validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;\r\n }\r\n }\r\n if (this.minlength > 0) {\r\n if (value?.length < this.minlength) {\r\n validation_status.status = true;\r\n validation_status.validation.minlength = `minimum length is ${this.minlength}!`;\r\n }\r\n }\r\n } else {\r\n validation_status.status = true;\r\n validation_status.validation.required = `required!`;\r\n }\r\n }\r\n this.isValid = !validation_status.status;\r\n this.errorText = Object.values(validation_status.validation).at(0) || ''\r\n return validation_status;\r\n }\r\n\r\n /** @description Allows Angular to disable the input. */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n /** @description Method for trailing Icon Click */\r\n trailingIconClick() {\r\n if (this.type === 'password') {\r\n if (this.typeInternal === 'password') {\r\n this.typeInternal = 'text';\r\n this.trailingIconInternal = 'visibility';\r\n } else {\r\n this.typeInternal = 'password';\r\n this.trailingIconInternal = 'visibility_off';\r\n }\r\n }else {\r\n this.typeInternal = this.type;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Method to generate Random String\r\n * @param setupPrarameter { lenght: number, prefix: string }\r\n * default lenght is 10, prefox is \"\"\r\n * @returns string\r\n */\r\n randomString(setupPrarameter: { lenght: number, prefix: string } = { lenght: 10, prefix: \"\" }): string {\r\n //variable consisting alphabets in small and capital letter \r\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\r\n //loop to select a new character in each iteration \r\n let random_string = setupPrarameter?.prefix || \"\";\r\n for (let i = 0; i < setupPrarameter?.lenght; i++) {\r\n const rnum = Math.floor(Math.random() * characters.length);\r\n random_string += characters.substring(rnum, rnum + 1);\r\n }\r\n //return the generated string \r\n return random_string;\r\n }\r\n\r\n async getControlData() {\r\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\r\n if (cide_element_data) {\r\n this.label = cide_element_data?.sype_label as string;\r\n this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating') as labelPlacementType;\r\n this.type = (cide_element_data?.sype_type || 'text') as controlType;\r\n this.required = (cide_element_data?.sype_required || false) as boolean;\r\n this.size = (cide_element_data?.sype_size || 'md') as themeSize;\r\n this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false) as boolean;\r\n this.maxlength = (cide_element_data?.sype_max_length) as number;\r\n this.minlength = (cide_element_data?.sype_min_length) as number;\r\n this.leadingIcon = (cide_element_data?.sype_leading_icon) as string;\r\n this.labelHide = (cide_element_data?.sype_label_hide) as boolean;\r\n this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text) as boolean;\r\n this.detectTypeChange();\r\n // Validate control\r\n this.onValidate();\r\n }\r\n }\r\n\r\n /**\r\n * @description use to detact the change in type if changes done this method is ued to run\r\n */\r\n detectTypeChange() {\r\n if (this.type === 'password') {\r\n this.typeInternal = \"password\";\r\n this.trailingIconInternal = \"visibility_off\";\r\n this.isTrailingIconAllwedClick = true;\r\n } else {\r\n this.typeInternal = this.type;\r\n this.trailingIconInternal = this.trailingIcon;\r\n }\r\n }\r\n}\r\n","<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'tel'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n 'cide-element-input-number': (type === 'number')\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { spinnerType, themeSize } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-ele-spinner',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './spinner.component.html',\r\n styleUrl: './spinner.component.scss'\r\n})\r\nexport class CideSpinnerComponent {\r\n /**\r\n * @description\r\n * Holds the size of the component like Small, Extra small, Large\r\n * by Default it takes small size\r\n * or the size set by the project setup service\r\n * or it will beset for individual component\r\n * \r\n * Size Appled \r\n * Component level then setup service then finally default md\r\n * Options: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \r\n */\r\n @Input() size: themeSize = \"sm\";\r\n @Input() type: spinnerType = \"pill-spinner\";\r\n}\r\n","@if (type === \"spinner\") {\r\n<svg class=\"cide-spinner tw-m-auto\"\r\n [ngClass]=\"{'tw-max-w-6 tw-p-1': (size === 'xs'), 'tw-max-w-10 tw-p-2': (size === 'sm')}\" viewBox=\"0 0 24 24\">\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n</svg>\r\n}\r\n@else {\r\n<div class=\"cide-pill-loader tw-select-none\" [ngClass]=\"{'tw-h-4': (size === 'xs')}\">\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n</div>\r\n}","import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideElementsService } from '../../../public-api';\r\nimport { CideSpinnerComponent } from '../spinner/spinner.component';\r\nimport { NavigationExtras, Router } from '@angular/router';\r\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\r\n\r\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'text' | 'link' | 'success' | 'danger' | 'warning' | 'info' | 'ghost';\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\nexport type ButtonType = 'button' | 'submit' | 'reset';\r\nexport type ButtonShape = 'default' | 'rounded' | 'pill' | 'square';\r\nexport type ButtonElevation = 'none' | 'low' | 'medium' | 'high';\r\n\r\n/**\r\n * Advanced Angular button component that provides a comprehensive button implementation\r\n * with loading state, styling variants, animations, tooltips, and other features.\r\n * \r\n * This component uses proper Angular templating to avoid hydration issues (NG0500).\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'button[cideEleButton], a[cideEleButton]',\r\n standalone: true,\r\n imports: [CommonModule, CideSpinnerComponent],\r\n templateUrl: './cide-ele-button.component.html',\r\n styleUrls: ['./cide-ele-button.component.scss'],\r\n host: {\r\n 'class': 'cide-button tw-rounded-md tw-text-white tw-py-0.5 tw-select-none tw-justify-around tw-flex',\r\n '[class.cide-button-disabled]': 'disabled || loading',\r\n '[attr.disabled]': '(disabled || loading) ? true : null',\r\n '[class.primary]': 'variant === \"primary\"',\r\n '[class.secondary]': 'variant === \"secondary\"',\r\n '[class.outline]': 'variant === \"outline\"',\r\n '[class.text]': 'variant === \"text\"',\r\n '[class.link]': 'variant === \"link\"',\r\n '[class.success]': 'variant === \"success\"',\r\n '[class.danger]': 'variant === \"danger\"',\r\n '[class.warning]': 'variant === \"warning\"',\r\n '[class.info]': 'variant === \"info\"',\r\n '[class.xs]': 'size === \"xs\"',\r\n '[class.sm]': 'size === \"sm\"',\r\n '[class.md]': 'size === \"md\"',\r\n '[class.lg]': 'size === \"lg\"',\r\n '[class.xl]': 'size === \"xl\"',\r\n '[class.rounded]': 'shape === \"rounded\"',\r\n '[class.pill]': 'shape === \"pill\"',\r\n '[class.square]': 'shape === \"square\"',\r\n '[class.elevation-none]': 'elevation === \"none\"',\r\n '[class.elevation-low]': 'elevation === \"low\"',\r\n '[class.elevation-medium]': 'elevation === \"medium\"',\r\n '[class.elevation-high]': 'elevation === \"high\"',\r\n '[attr.type]': 'type',\r\n '[attr.aria-label]': 'ariaLabel',\r\n '[attr.aria-disabled]': 'disabled || loading',\r\n '[attr.data-testid]': 'testId',\r\n '[attr.title]': 'tooltip',\r\n '[class]': 'customClass'\r\n }\r\n})\r\n\r\nexport class CideEleButtonComponent implements OnInit, OnChanges, OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n private clickCount = 0;\r\n private clickDebouncer$ = new Subject<Event>();\r\n\r\n constructor(\r\n private elementService: CideElementsService,\r\n private router: Router,\r\n private renderer: Renderer2,\r\n private elementRef: ElementRef\r\n ) {\r\n // Setup debounced click handler to prevent double-clicks\r\n this.clickDebouncer$\r\n .pipe(\r\n debounceTime(300),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe({\r\n next: (event) => {\r\n this.handleClick(event);\r\n }\r\n });\r\n }\r\n \r\n // INPUTS\r\n /** \r\n * @description Label of button like Submit, Update, Add, etc. \r\n * Note: it is only used in case you did not set label between tags (via ng-content)\r\n */\r\n @Input() label: string = \"\";\r\n \r\n /** @description Button style variant */\r\n @Input() variant: ButtonVariant = 'primary';\r\n \r\n /** @description Button size */\r\n @Input() size: ButtonSize = 'md';\r\n \r\n /** @description Button HTML type attribute */\r\n @Input() type: ButtonType = 'button';\r\n \r\n /** @description Button shape */\r\n @Input() shape: ButtonShape = 'default';\r\n \r\n /** @description Button shadow elevation */\r\n @Input() elevation: ButtonElevation = 'medium';\r\n \r\n /** @description Button disabled state */\r\n @Input() disabled: boolean | null = false;\r\n \r\n /** @description Unique ID of control, used to differentiate elements */\r\n @Input() id: string = '';\r\n \r\n /** @description Enables loading state with spinner */\r\n @Input() loading: boolean = false;\r\n \r\n /** @description Makes button take full width of container */\r\n @Input() fullWidth: boolean = false;\r\n \r\n /** @description Icon to display on the left side of the button */\r\n @Input() leftIcon: string = '';\r\n \r\n /** @description Icon to display on the right side of the button */\r\n @Input() rightIcon: string = '';\r\n \r\n /** @description Additional CSS classes to apply */\r\n @Input() customClass: string = '';\r\n \r\n /** @description Tooltip text to display on hover */\r\n @Input() tooltip: string = '';\r\n \r\n /** @description Aria label for accessibility */\r\n @Input() ariaLabel: string = '';\r\n \r\n /** @description Test ID for automated testing */\r\n @Input() testId: string = '';\r\n \r\n /** @description Route to navigate to when clicked (for link buttons) */\r\n @Input() routerLink: string | unknown[] = '';\r\n \r\n /** @description Router navigation extras */\r\n @Input() routerExtras: NavigationExtras = {};\r\n \r\n /** @description Prevent multiple rapid clicks (debounce) */\r\n @Input() preventDoubleClick: boolean = true;\r\n \r\n /** @description Animation on click */\r\n @Input() animated: boolean = true;\r\n \r\n // OUTPUTS\r\n /**\r\n * @description Click event of button\r\n */\r\n @Output() btnClick: EventEmitter<Event> = new EventEmitter();\r\n \r\n /**\r\n * @description Double click event\r\n */\r\n @Output() doubleClick: EventEmitter<Event> = new EventEmitter();\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: Event): void {\r\n if (this.disabled || this.loading) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n \r\n if (this.animated) {\r\n this.addClickAnimation();\r\n }\r\n \r\n if (this.preventDoubleClick) {\r\n this.clickDebouncer$.next(event);\r\n } else {\r\n this.handleClick(event);\r\n }\r\n }\r\n \r\n private handleClick(event: Event): void {\r\n // Handle navigation for routerLink\r\n if (this.routerLink && this.routerLink.length) {\r\n event.preventDefault();\r\n this.router.navigate(\r\n Array.isArray(this.routerLink) ? this.routerLink : [this.routerLink],\r\n this.routerExtras\r\n );\r\n }\r\n \r\n // Handle double-click detection\r\n this.clickCount++;\r\n setTimeout(() => {\r\n if (this.clickCount === 2) {\r\n this.doubleClick.emit(event);\r\n }\r\n this.clickCount = 0;\r\n }, 300);\r\n \r\n // Emit standard click event\r\n this.btnClick.emit(event);\r\n }\r\n \r\n private addClickAnimation(): void {\r\n // Add ripple effect\r\n const ripple = this.renderer.createElement('span');\r\n this.renderer.addClass(ripple, 'ripple-effect');\r\n \r\n // Position the ripple at click position\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const size = Math.max(rect.width, rect.height);\r\n \r\n // Set ripple style\r\n this.renderer.setStyle(ripple, 'width', `${size}px`);\r\n this.renderer.setStyle(ripple, 'height', `${size}px`);\r\n this.renderer.setStyle(ripple, 'left', `${0}px`);\r\n this.renderer.setStyle(ripple, 'top', `${0}px`);\r\n \r\n // Add ripple to button\r\n this.renderer.appendChild(this.elementRef.nativeElement, ripple);\r\n \r\n // Modern ES2022+ pattern: Use Promise-based delay\r\n const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\r\n delay(600).then(() => {\r\n this.renderer.removeChild(this.elementRef.nativeElement, ripple);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.id) {\r\n this.getControlData();\r\n }\r\n \r\n // Set aria-label if not explicitly provided\r\n if (!this.ariaLabel && this.label) {\r\n this.ariaLabel = this.label;\r\n }\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n // Update aria-label when label changes\r\n if (changes['label'] && !this.ariaLabel) {\r\n this.ariaLabel = changes['label'].currentValue;\r\n }\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n async getControlData() {\r\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\r\n if (cide_element_data) {\r\n this.label = cide_element_data?.sype_label as string;\r\n }\r\n }\r\n}\r\n","<!-- Button content container -->\r\n<div class=\"tw-flex tw-items-center tw-justify-center cide-ele-btn-content tw-w-full\">\r\n <!-- Left icon -->\r\n @if (leftIcon) {\r\n <span class=\"tw-icon-container tw-mr-2\">\r\n <i class=\"tw-text-base material-symbols-outlined\">{{leftIcon}}</i>\r\n </span>\r\n }\r\n \r\n <!-- Loading spinner -->\r\n @if (loading) {\r\n <cide-ele-spinner\r\n class=\"tw-inline-block tw-my-1 tw-mr-2\" \r\n size=\"xs\"\r\n [ngClass]=\"{'cide-pill-disabled': (disabled || loading)}\">\r\n </cide-ele-spinner>\r\n }\r\n \r\n <!-- Button label or content -->\r\n @if (label) {\r\n <span>{{ label }}</span>\r\n } @else {\r\n <span class=\"tw-flex tw-items-center tw-justify-center\">\r\n <ng-content></ng-content>\r\n </span>\r\n }\r\n \r\n <!-- Right icon -->\r\n @if (rightIcon) {\r\n <span class=\"tw-icon-container tw-ml-2\">\r\n <i class=\"tw-text-base material-symbols-outlined\">{{rightIcon}}</i>\r\n </span>\r\n }\r\n \r\n <!-- Spacer for spinner when loading to maintain button width -->\r\n @if (loading) {\r\n <span class=\"tw-w-6 tw-p-1 tw-mr-2\"></span>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { iconType, themeSize } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-ele-icon',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './icon.component.html',\r\n styleUrl: './icon.component.css',\r\n host: {\r\n '[class.mpro-icon-field]': \"type === 'box'\"\r\n }\r\n})\r\nexport class CideIconComponent {\r\n @Input() size: themeSize = \"xs\";\r\n @Input() type: iconType = \"round\";\r\n @Input() toolTip: string = \"\";\r\n}\r\n","<button class=\"cide-icon tw-m-1 tw-inline-block tw-outline-none tw-relative\" [ngClass]=\"{\r\n 'tw-h-[35px] tw-w-[35px]': (size === 'lg'), \r\n 'tw-h-[27px] tw-w-[27px]': (size === 'md'), \r\n 'tw-h-[23px] tw-w-[23px]': (size === 'sm'), \r\n 'tw-h-[19px] tw-w-[19px] !tw-m-[2px]': (size === 'xs'), \r\n 'tw-h-[14px] tw-w-[14px] !tw-m-[1px] cide-icon-2xs': (size === '2xs'), \r\n 'tw-h-[11px] tw-w-[11px] !tw-m-[1px] cide-icon-3xs': (size === '3xs'), \r\n 'tw-rounded-2xl' : (type === 'round'), 'tw-rounded-[0.2rem]' : (type === 'box') , \r\n 'tw-h-[15px] tw-w-[15px] none-type !tw-m-0': (type === 'none'),\r\n 'cide-tooltip': (toolTip),\r\n }\">\r\n <span class=\"cide-tooltip-content\">{{toolTip}}</span>\r\n\r\n <span class=\"material-symbols-outlined tw-absolute tw-top-0 tw-left-0 tw-right-0 tw-bottom-0\"\r\n [ngClass]=\"{'tw-text-[25px] -tw-ml-[1.5px] -tw-mt-[1px]': (size === 'sm'), 'tw-text-[18px] -tw-ml-[0.5px] tw-mt-[0.5px]' : (size === 'xs'), 'tw-text-[15px] -tw-ml-[0.5px] tw-mt-[0px] tw-block' : (size === '2xs'), 'tw-text-[11px] -tw-ml-[0px] tw-mt-[0px] tw-block' : (size === '3xs')}\"><ng-content></ng-content></span>\r\n</button>","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef, ContentChildren, QueryList, AfterContentInit, ElementRef, ViewChild, OnDestroy } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType, selectSearchType } from 'cloud-ide-lms-model';\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'cide-ele-select-option',\n standalone: true,\n template: '<ng-content></ng-content>'\n})\nexport class CideSelectOptionComponent {\n @Input() value: string | number = '';\n @Input() disabled: boolean = false;\n\n get label(): string {\n return this.elementRef?.nativeElement?.textContent?.trim() || '';\n }\n\n constructor(private elementRef: ElementRef) { }\n}\n\n@Component({\n selector: 'cide-ele-select',\n standalone: true,\n templateUrl: './select.component.html',\n styleUrl: './select.component.scss',\n imports: [CommonModule, FormsModule, CideSelectOptionComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CideSelectComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: forwardRef(() => CideSelectComponent),\n }\n ]\n})\nexport class CideSelectComponent implements ControlValueAccessor, Validator, OnInit, OnChanges, AfterContentInit, OnDestroy {\n @ContentChildren(CideSelectOptionComponent) optionComponents!: QueryList<CideSelectOptionComponent>;\n @ViewChild('searchInput', { static: false }) searchInputRef!: ElementRef<HTMLInputElement>;\n @Input() label: string = '';\n @Input() labelHide: boolean = false;\n @Input() placeholder: string = 'Select an option';\n @Input() helperText: string = '';\n @Input() errorText: string = '';\n @Input() required: boolean = false;\n @Input() disabled: boolean = false;\n @Input() id: string = '';\n @Input() ngModel: string | number = '';\n @Input() size: themeSize = 'sm';\n @Input() fill: elementStyleType = 'outline';\n @Input() labelPlacement: labelPlacementType = 'fixed';\n @Input() labelDir: labelDirType = 'start';\n @Input() leadingIcon: string = '';\n @Input() trailingIcon: string = '';\n @Input() clearInput: boolean = false;\n @Input() options: SelectOption[] = [];\n @Input() multiple: boolean = false;\n @Input() searchable: boolean = false;\n @Input() showSearchInput: boolean = true;\n @Input() loading: boolean = false;\n\n @Output() ngModelChange = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('change') selectionChange = new EventEmitter<SelectOption>();\n @Output() searchChange = new EventEmitter<selectSearchType>();\n\n isOpen: boolean = false;\n isTouched = false;\n isValid = true;\n searchTerm: string = '';\n filteredOptions: SelectOption[] = [];\n dropdownPosition: 'bottom' | 'top' = 'bottom';\n private isDropdownInteraction = false;\n \n // Debug tracking properties\n private debugId = Math.random().toString(36).substr(2, 9);\n private timeoutIds: ReturnType<typeof setTimeout>[] = [];\n private interactionCount = 0;\n private maxInteractionCount = 10; // Prevent infinite loops\n\n constructor(private elementRef: ElementRef) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onChange = (value: string | number ) => { };\n onTouched = () => { };\n onValidate = () => { };\n\n ngOnInit(): void {\n this.filteredOptions = [...this.options];\n this.validateValue(this.ngModel);\n console.log(`🔍 SELECT [${this.debugId}] Initialized with ${this.options.length} options`);\n window.addEventListener('resize', this.onWindowResize.bind(this));\n }\n\n ngAfterContentInit(): void {\n if (this.options.length === 0 && this.optionComponents) {\n this.options = this.optionComponents.map(option => ({\n value: option.value,\n label: option.label,\n disabled: option.disabled\n }));\n this.filteredOptions = [...this.options];\n }\n console.log(`🔍 SELECT [${this.debugId}] After content init with ${this.options.length} options`);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['ngModel']) {\n this.validateValue(this.ngModel);\n if (!this.options.find(option => option?.value === this.ngModel)) {\n this.searchChange.emit({\n query: \"\",\n value: this.ngModel // emit raw value for external handlers\n });\n }\n }\n if (changes['options']) {\n this.filterOptions();\n }\n }\n\n writeValue(value: string | number ): void {\n this.ngModel = value;\n this.validateValue(value);\n }\n\n registerOnChange(fn: (value: string | number ) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n return this.validateValue(control.value);\n }\n\n validateValue(value: string | number ): ValidationErrors | null {\n if (this.required) {\n const isEmpty = (v: unknown) => v === null || v === undefined || v === '' || (typeof v === 'string' && v.trim() === '');\n if (isEmpty(value)) {\n this.isValid = false;\n return { required: 'This field is required' };\n }\n }\n this.isValid = true;\n return null;\n }\n\n toggleDropdown(): void {\n try {\n this.logDebug('toggleDropdown called', { disabled: this.disabled, isOpen: this.isOpen });\n if (!this.disabled) {\n this.isOpen = !this.isOpen;\n this.logDebug('Dropdown toggled', { newState: this.isOpen });\n if (this.isOpen) {\n this.calculateDropdownPosition();\n this.focusControl();\n this.searchTerm = '';\n this.filterOptions();\n this.logDebug('Dropdown opened, search term reset');\n } else {\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n this.logDebug('Dropdown closed, interaction flags reset');\n }\n } else {\n this.logDebug('Dropdown toggle blocked - component disabled');\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] toggleDropdown error:`, error);\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n }\n }\n\n // Cleanup method to prevent memory leaks\n ngOnDestroy(): void {\n this.clearTimeouts();\n window.removeEventListener('resize', this.onWindowResize.bind(this));\n this.logDebug('Component destroyed, timeouts cleared');\n }\n\n private onWindowResize(): void {\n if (this.isOpen) {\n this.calculateDropdownPosition();\n }\n }\n\n private calculateDropdownPosition(): void {\n try {\n const element = this.elementRef?.nativeElement;\n if (!element) {\n this.dropdownPosition = 'bottom';\n console.log('No element found, defaulting to bottom');\n return;\n }\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = Math.min(this.options.length * 40 + 100, 250);\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const buffer = 30;\n if (spaceBelow < (dropdownHeight + buffer) && spaceAbove > dropdownHeight) {\n this.dropdownPosition = 'top';\n } else {\n this.dropdownPosition = 'bottom';\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] calculateDropdownPosition error:`, error);\n this.dropdownPosition = 'bottom';\n }\n }\n\n selectOption(option: SelectOption): void {\n try {\n this.logDebug('selectOption called', { option, disabled: option.disabled, multiple: this.multiple });\n if (option.disabled) return;\n\n if (this.multiple) {\n // Parse current CSV value to array\n const currentCsv = this.ngModel as string || '';\n const current = currentCsv ? currentCsv.split(',').map(v => v.trim()).filter(Boolean) : [];\n const idx = current.findIndex(v => v.toString() === option.value.toString());\n \n if (idx >= 0) {\n current.splice(idx, 1);\n } else {\n current.push(option.value.toString());\n }\n \n // Convert back to CSV\n const newCsv = current.join(',');\n this.ngModel = newCsv;\n this.onChange(newCsv);\n this.ngModelChange.emit(newCsv);\n this.selectionChange.emit(option);\n this.validateValue(newCsv);\n this.isTouched = true;\n this.onTouched();\n // Do not close dropdown in multi-select mode\n } else {\n this.ngModel = option.value;\n this.onChange(option.value);\n this.ngModelChange.emit(option.value);\n this.selectionChange.emit(option);\n this.validateValue(option.value);\n this.isOpen = false;\n this.isTouched = true;\n this.onTouched();\n }\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] selectOption error:`, error);\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n }\n }\n\n onBlur(): void {\n try {\n this.logDebug('onBlur called', { isOpen: this.isOpen, isDropdownInteraction: this.isDropdownInteraction });\n this.isTouched = true;\n this.onTouched();\n this.interactionCount++;\n if (this.interactionCount > this.maxInteractionCount) {\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n return;\n }\n this.addTimeout(() => {\n try {\n if (!this.isDropdownInteraction && !this.multiple) {\n this.isOpen = false;\n this.searchTerm = '';\n this.filterOptions();\n }\n this.interactionCount = 0;\n } catch (error) {\n this.isOpen = false;\n this.interactionCount = 0;\n }\n }, 150);\n } catch {\n this.isOpen = false;\n this.interactionCount = 0;\n }\n }\n\n focusControl(): void {\n try {\n if (this.searchable && this.isOpen) {\n this.addTimeout(() => {\n try {\n if (this.searchInputRef && this.searchInputRef.nativeElement) {\n this.searchInputRef.nativeElement.focus();\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\n }\n }, 100);\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\n }\n }\n\n clearSelection(): void {\n this.ngModel = '';\n this.onChange('');\n this.ngModelChange.emit('');\n this.validateValue('');\n }\n\n getSelectedOptionLabel(): string {\n if (this.multiple) {\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return '';\n const values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n const labels = values\n .map(v => this.options.find(o => o.value.toString() === v)?.label)\n .filter((l): l is string => typeof l === 'string');\n return labels.join(', ');\n }\n const selectedOption = this.options.find(option => option.value === this.ngModel);\n return selectedOption ? selectedOption.label : '';\n }\n\n filterOptions(): void {\n try {\n if (!this.searchable || !this.searchTerm) {\n this.filteredOptions = [...this.options];\n } else {\n this.filteredOptions = this.options.filter(option =>\n option.label.toLowerCase().includes(this.searchTerm.toLowerCase())\n );\n }\n } catch {\n this.filteredOptions = [...this.options];\n }\n }\n\n onSearchInput(event: Event): void {\n try {\n this.searchTerm = (event.target as HTMLInputElement).value;\n this.filterOptions();\n this.searchChange.emit({\n query: this.searchTerm,\n value: ''\n });\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] onSearchInput error:`, error);\n }\n }\n\n onDropdownMouseDown(): void {\n this.isDropdownInteraction = true;\n }\n\n onDropdownMouseUp(): void {\n this.addTimeout(() => {\n this.isDropdownInteraction = false;\n }, 200);\n }\n\n isOptionSelected(option: SelectOption): boolean {\n if (this.multiple) {\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return false;\n const values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n return values.includes(option.value.toString());\n }\n return option.value === this.ngModel;\n }\n\n trackByValue(index: number, option: SelectOption): string | number {\n return option.value;\n }\n\n // Debug helpers\n private logDebug(message: string, data?: unknown): void {\n console.log(`🔍 SELECT [${this.debugId}] ${message}`, data || '');\n }\n\n private clearTimeouts(): void {\n this.timeoutIds.forEach(id => { clearTimeout(id); });\n this.timeoutIds = [];\n }\n\n private addTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout> {\n const timeoutId = setTimeout(() => {\n try {\n callback();\n // remove executed timeout from tracking\n this.timeoutIds = this.timeoutIds.filter(id => id !== timeoutId);\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] Timeout callback error:`, error);\n }\n }, delay);\n this.timeoutIds.push(timeoutId);\n return timeoutId;\n }\n} ","<div class=\"cide-select\" [ngClass]=\"{\n 'cide-element-size-xxs': (size === '2xs'),\n 'cide-element-size-xs': (size === 'xs'),\n 'cide-element-size-sm': (size === 'sm'),\n 'cide-element-size-md': (size === 'md'),\n 'cide-element-size-lg': (size === 'lg'),\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\n 'cide-element-input-label-start': (labelDir === 'start'),\n 'cide-element-input-label-end': (labelDir === 'end'),\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\n 'cide-element-input-label-less': (!label || labelHide),\n 'cide-element-style-outline': (fill === 'outline'),\n 'cide-element-style-solid': (fill === 'solid'),\n 'cide-element-style-standard': (fill === 'standard'),\n}\">\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-select-label\">{{ label }}</label>\n\n <div class=\"cide-element-select-wrapper tw-relative\">\n <!-- Leading Icon -->\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n </span>\n\n <!-- Select Button -->\n <button type=\"button\" [id]=\"id\" [disabled]=\"disabled\" (click)=\"toggleDropdown()\" (blur)=\"onBlur()\" [ngClass]=\"[\n ((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md'),\n (!leadingIcon ? 'tw-pl-1' : ''),\n (trailingIcon || clearInput || loading ? 'tw-pr-8' : ''),\n (!trailingIcon && !clearInput && !loading ? 'tw-pr-1' : ''),\n ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')),\n (labelHide ? '!tw-mt-0' : ''),\n 'cide-select-button tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 tw-outline-none tw-text-left tw-cursor-pointer'\n ]\" class=\"cide-select-button\">\n\n <span class=\"cide-select-value\" [ngClass]=\"{'tw-text-gray-400': !ngModel}\">\n {{ ngModel ? getSelectedOptionLabel() : placeholder }}\n </span>\n </button>\n\n\n <!-- Trailing Icon (Dropdown Arrow or Loading Spinner) -->\n <span class=\"tw-absolute tw-top-1/2 tw-right-0 tw-transform -tw-translate-y-1/2 tw-select-none tw-z-10\"\n *ngIf=\"!clearInput || !ngModel || loading\">\n <!-- Loading Spinner -->\n <span *ngIf=\"loading\" class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-text-gray-500\">\n <svg class=\"tw-animate-spin tw-h-4 tw-w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"tw-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </span>\n <!-- Dropdown Arrow -->\n <span *ngIf=\"!loading\" class=\"material-symbols-outlined tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center !tw-text-2xl tw-transition-transform tw-text-gray-500\"\n [ngClass]=\"{'tw-rotate-180': isOpen}\">\n expand_more\n </span>\n </span>\n\n <!-- Clear Button -->\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"clearSelection()\" type=\"button\">\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n </button>\n\n <!-- Dropdown Options -->\n <div\n class=\"cide-select-dropdown tw-absolute tw-left-0 tw-right-0 tw-z-50 tw-bg-white tw-border tw-border-gray-300 tw-rounded-md tw-shadow-lg tw-max-h-60 tw-overflow-y-auto\"\n *ngIf=\"isOpen\" [ngClass]=\"{\n 'tw-top-full tw-mt-1': dropdownPosition === 'bottom',\n 'tw-bottom-full tw-mb-1': dropdownPosition === 'top'\n }\">\n\n <!-- Search Input (if searchable and showSearchInput is true) -->\n <div *ngIf=\"searchable && showSearchInput\" class=\"tw-p-2 tw-border-b tw-border-gray-200\">\n <input type=\"text\" placeholder=\"Search options...\" [value]=\"searchTerm\" (input)=\"onSearchInput($event)\"\n (mousedown)=\"onDropdownMouseDown()\" (focus)=\"onDropdownMouseDown()\" (click)=\"$event.stopPropagation()\"\n class=\"tw-w-full tw-px-2 tw-py-1 tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-outline-none focus:tw-border-blue-500\">\n </div>\n\n <!-- Options List -->\n <div class=\"tw-py-1\">\n <!-- Loading State -->\n <div *ngIf=\"loading\" class=\"tw-px-3 tw-py-4 tw-text-center\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-space-x-2\">\n <svg class=\"tw-animate-spin tw-h-4 tw-w-4 tw-text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"tw-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"tw-text-sm tw-text-gray-500\">Loading...</span>\n </div>\n </div>\n\n <!-- Options -->\n <ng-container *ngIf=\"!loading\">\n <button type=\"button\" *ngFor=\"let option of filteredOptions; trackBy: trackByValue\"\n (mousedown)=\"onDropdownMouseDown()\" (click)=\"selectOption(option)\" (keyup.enter)=\"selectOption(option)\"\n (keyup.space)=\"selectOption(option)\" [disabled]=\"option.disabled\" [ngClass]=\"{\n 'cide-select-option tw-w-full tw-text-left tw-px-3 tw-py-2 tw-text-sm tw-cursor-pointer tw-transition-colors hover:tw-bg-gray-100 tw-border-none tw-bg-transparent tw-outline-none': true,\n 'tw-bg-blue-50 tw-text-blue-700': isOptionSelected(option),\n 'tw-text-gray-400 tw-cursor-not-allowed': option.disabled\n }\" class=\"cide-select-option\">\n {{ option.label }}\n </button>\n </ng-container>\n\n <!-- No options message -->\n <div *ngIf=\"!loading && filteredOptions.length === 0\" class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic\">\n {{ searchable && searchTerm ? 'No options found' : 'No options available' }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error/Helper Text -->\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-select-help-error-text\">\n {{ errorText || helperText }}\n </span>\n <span *ngIf=\"helperText && isValid\" class=\"cide-select-help-error-text\">\n {{ helperText }}\n </span>\n</div>","import { Component, Input, Output, EventEmitter, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from \"../icon/icon.component\";\r\n\r\nexport interface TabItem {\r\n id: string;\r\n label: string;\r\n disabled?: boolean;\r\n icon?: string;\r\n badge?: string | number;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-tab',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n templateUrl: './cide-ele-tab.component.html',\r\n styleUrls: ['./cide-ele-tab.component.scss']\r\n})\r\nexport class CideEleTabComponent implements OnInit {\r\n @Input() tabs: TabItem[] = [];\r\n @Input() activeTabId?: string;\r\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\r\n @Input() variant: 'default' | 'pills' | 'underline' = 'default';\r\n @Input() fullWidth = false;\r\n @Input() disabled = false;\r\n\r\n @Output() tabChange = new EventEmitter<TabItem>();\r\n\r\n activeTab = signal<string>('');\r\n\r\n ngOnInit() {\r\n // Set initial active tab\r\n if (this.activeTabId) {\r\n this.activeTab.set(this.activeTabId);\r\n } else if (this.tabs.length > 0) {\r\n const firstEnabledTab = this.tabs.find(tab => !tab.disabled);\r\n if (firstEnabledTab) {\r\n this.activeTab.set(firstEnabledTab.id);\r\n }\r\n }\r\n }\r\n\r\n onTabClick(tab: TabItem) {\r\n if (tab.disabled || this.disabled) return;\r\n \r\n this.activeTab.set(tab.id);\r\n this.tabChange.emit(tab);\r\n }\r\n\r\n isActive(tabId: string): boolean {\r\n return this.activeTab() === tabId;\r\n }\r\n\r\n getTabClasses(tab: TabItem): string {\r\n const baseClasses = 'cide-tab-item';\r\n const sizeClass = `cide-tab-${this.size}`;\r\n const variantClass = `cide-tab-${this.variant}`;\r\n const activeClass = this.isActive(tab.id) ? 'cide-tab-active' : '';\r\n const disabledClass = (tab.disabled || this.disabled) ? 'cide-tab-disabled' : '';\r\n \r\n return [baseClasses, sizeClass, variantClass, activeClass, disabledClass]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n getContainerClasses(): string {\r\n const baseClasses = 'cide-tab-container';\r\n const variantClass = `cide-tab-container-${this.variant}`;\r\n const fullWidthClass = this.fullWidth ? 'cide-tab-full-width' : '';\r\n \r\n return [baseClasses, variantClass, fullWidthClass]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n} ","<div [class]=\"getContainerClasses()\">\r\n @for (tab of tabs; track tab.id) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getTabClasses(tab)\"\r\n [disabled]=\"tab.disabled || disabled\"\r\n (click)=\"onTabClick(tab)\"\r\n [attr.aria-selected]=\"isActive(tab.id)\"\r\n [attr.aria-controls]=\"'panel-' + tab.id\"\r\n role=\"tab\">\r\n \r\n @if (tab.icon) {\r\n <cide-ele-icon class=\"cide-tab-icon\">{{ tab.icon }}</cide-ele-icon>\r\n }\r\n \r\n <span class=\"cide-tab-label\">{{ tab.label }}</span>\r\n \r\n @if (tab.badge) {\r\n <span class=\"cide-tab-badge\">{{ tab.badge }}</span>\r\n }\r\n </button>\r\n }\r\n</div> ","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output, forwardRef, OnDestroy } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'cide-ele-file-input',\r\n standalone: true,\r\n templateUrl: './file-input.component.html',\r\n styleUrl: './file-input.component.scss',\r\n imports: [CommonModule, FormsModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideEleFileInputComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CideEleFileInputComponent implements ControlValueAccessor, OnDestroy {\r\n @Input() label: string = 'Choose file';\r\n @Input() accept: string = '';\r\n @Input() multiple: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() helperText: string = '';\r\n @Input() errorText: string = '';\r\n @Input() showPreview: boolean = false;\r\n @Input() previewWidth: string = '200px';\r\n @Input() previewHeight: string = '200px';\r\n @Input() previewBoxMode: boolean = false;\r\n @Input() placeholderText: string = 'Click to select image';\r\n @Input() placeholderIcon: string = '📷';\r\n\r\n public id: string = Math.random().toString(36).substring(2, 10);\r\n\r\n @Output() fileChange = new EventEmitter<FileList | null>();\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n files: FileList | null = null;\r\n fileNames: string[] = [];\r\n previewUrls: string[] = [];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private onChange = (files: FileList | null) => {};\r\n private onTouched = () => {};\r\n\r\n writeValue(files: FileList | null): void {\r\n this.files = files;\r\n this.fileNames = files ? Array.from(files).map(f => f.name) : [];\r\n this.generatePreviews();\r\n }\r\n\r\n registerOnChange(fn: (files: FileList | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onFileSelected(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n this.files = input.files;\r\n this.fileNames = this.files ? Array.from(this.files).map(f => f.name) : [];\r\n this.generatePreviews();\r\n this.onChange(this.files);\r\n this.fileChange.emit(this.files);\r\n this.onTouched();\r\n }\r\n\r\n clearFiles() {\r\n this.files = null;\r\n this.fileNames = [];\r\n this.clearPreviews();\r\n this.onChange(null);\r\n this.fileChange.emit(null);\r\n }\r\n\r\n private generatePreviews() {\r\n // Clear existing previews\r\n this.clearPreviews();\r\n\r\n if (!this.showPreview || !this.files) {\r\n return;\r\n }\r\n\r\n Array.from(this.files).forEach(file => {\r\n if (this.isImageFile(file)) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n if (e.target?.result) {\r\n this.previewUrls.push(e.target.result as string);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n });\r\n }\r\n\r\n private clearPreviews() {\r\n // Revoke object URLs to prevent memory leaks\r\n this.previewUrls.forEach(url => {\r\n if (url.startsWith('blob:')) {\r\n URL.revokeObjectURL(url);\r\n }\r\n });\r\n this.previewUrls = [];\r\n }\r\n\r\n private isImageFile(file: File): boolean {\r\n return file.type.startsWith('image/');\r\n }\r\n\r\n isImagePreviewAvailable(): boolean {\r\n return this.showPreview && this.previewUrls.length > 0;\r\n }\r\n\r\n removePreview(index: number) {\r\n if (this.files && this.files.length > index) {\r\n // Create new FileList without the removed file\r\n const dt = new DataTransfer();\r\n Array.from(this.files).forEach((file, i) => {\r\n if (i !== index) {\r\n dt.items.add(file);\r\n }\r\n });\r\n \r\n this.files = dt.files;\r\n this.fileNames = Array.from(this.files).map(f => f.name);\r\n \r\n // Remove the preview URL\r\n if (this.previewUrls[index] && this.previewUrls[index].startsWith('blob:')) {\r\n URL.revokeObjectURL(this.previewUrls[index]);\r\n }\r\n this.previewUrls.splice(index, 1);\r\n \r\n this.onChange(this.files);\r\n this.fileChange.emit(this.files);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up preview URLs to prevent memory leaks\r\n this.clearPreviews();\r\n }\r\n\r\n triggerFileSelect() {\r\n const fileInput = document.getElementById('cide-file-input-' + this.id) as HTMLInputElement;\r\n if (fileInput && !this.disabled) {\r\n fileInput.click();\r\n }\r\n }\r\n\r\n isPreviewBoxMode(): boolean {\r\n return this.previewBoxMode && this.showPreview;\r\n }\r\n\r\n hasImages(): boolean {\r\n return this.previewUrls.length > 0;\r\n }\r\n} ","<div class=\"cide-file-input\">\r\n <!-- Label (shown when not in preview box mode or when preview box mode but no label override) -->\r\n <label *ngIf=\"label && !isPreviewBoxMode()\" class=\"cide-file-input-label\" [attr.for]=\"'cide-file-input-' + id\">{{ label }}</label>\r\n \r\n <!-- Preview Box Mode -->\r\n <div *ngIf=\"isPreviewBoxMode()\" class=\"cide-file-input-preview-box-container\">\r\n <!-- Hidden file input -->\r\n <input\r\n type=\"file\"\r\n [attr.id]=\"'cide-file-input-' + id\"\r\n [attr.accept]=\"accept\"\r\n [attr.multiple]=\"multiple ? true : null\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onFileSelected($event)\"\r\n class=\"cide-file-input-hidden\"\r\n />\r\n \r\n <!-- Preview Box -->\r\n <div \r\n class=\"cide-file-input-preview-box\"\r\n [class.cide-file-input-preview-box-disabled]=\"disabled\"\r\n [class.cide-file-input-preview-box-has-image]=\"hasImages()\"\r\n [style.width]=\"previewWidth\"\r\n [style.height]=\"previewHeight\"\r\n (click)=\"triggerFileSelect()\"\r\n [attr.title]=\"disabled ? 'File selection disabled' : placeholderText\">\r\n \r\n <!-- No Image State -->\r\n <div *ngIf=\"!hasImages()\" class=\"cide-file-input-preview-box-placeholder\">\r\n <div class=\"cide-file-input-preview-box-icon\">{{ placeholderIcon }}</div>\r\n <div class=\"cide-file-input-preview-box-text\">{{ placeholderText }}</div>\r\n </div>\r\n \r\n <!-- Image Preview State -->\r\n <div *ngIf=\"hasImages()\" class=\"cide-file-input-preview-box-content\">\r\n <img \r\n [src]=\"previewUrls[0]\" \r\n [alt]=\"fileNames[0] || 'Preview image'\"\r\n class=\"cide-file-input-preview-box-image\">\r\n <div class=\"cide-file-input-preview-box-overlay\">\r\n <div class=\"cide-file-input-preview-box-overlay-text\">Click to change</div>\r\n </div>\r\n <button \r\n *ngIf=\"!disabled\"\r\n type=\"button\" \r\n class=\"cide-file-input-preview-box-remove\"\r\n (click)=\"clearFiles(); $event.stopPropagation()\"\r\n title=\"Remove image\">\r\n ×\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <!-- File name display for preview box mode -->\r\n <div *ngIf=\"hasImages() && fileNames.length\" class=\"cide-file-input-preview-box-filename\">\r\n {{ fileNames[0] }}\r\n </div>\r\n </div>\r\n\r\n <!-- Standard Mode -->\r\n <div *ngIf=\"!isPreviewBoxMode()\" class=\"cide-file-input-wrapper\">\r\n <input\r\n type=\"file\"\r\n [attr.id]=\"'cide-file-input-' + id\"\r\n [attr.accept]=\"accept\"\r\n [attr.multiple]=\"multiple ? true : null\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onFileSelected($event)\"\r\n class=\"cide-file-input-element\"\r\n />\r\n <button *ngIf=\"fileNames.length\" type=\"button\" class=\"cide-file-input-clear\" (click)=\"clearFiles()\">\r\n Clear\r\n </button>\r\n </div>\r\n <div *ngIf=\"fileNames.length && !isPreviewBoxMode()\" class=\"cide-file-input-files\">\r\n <span *ngFor=\"let name of fileNames\">{{ name }}</span>\r\n </div>\r\n \r\n <!-- Image Preview Section (only for standard mode) -->\r\n <div *ngIf=\"isImagePreviewAvailable() && !isPreviewBoxMode()\" class=\"cide-file-input-preview\">\r\n <div class=\"cide-file-input-preview-label\">Preview:</div>\r\n <div class=\"cide-file-input-preview-container\">\r\n <div \r\n *ngFor=\"let previewUrl of previewUrls; let i = index\" \r\n class=\"cide-file-input-preview-item\"\r\n [style.width]=\"previewWidth\"\r\n [style.height]=\"previewHeight\">\r\n <button \r\n type=\"button\" \r\n class=\"cide-file-input-preview-remove\"\r\n (click)=\"removePreview(i)\"\r\n title=\"Remove image\">\r\n ×\r\n </button>\r\n <img \r\n [src]=\"previewUrl\" \r\n [alt]=\"fileNames[i] || 'Preview image'\"\r\n class=\"cide-file-input-preview-image\"\r\n loading=\"lazy\">\r\n <div class=\"cide-file-input-preview-filename\">{{ fileNames[i] }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"errorText\" class=\"cide-file-input-error\">{{ errorText }}</div>\r\n <div *ngIf=\"helperText && !errorText\" class=\"cide-file-input-helper\">{{ helperText }}</div>\r\n</div> ","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType } from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-ele-textarea',\n standalone: true,\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.scss',\n imports: [CommonModule, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CideTextareaComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: forwardRef(() => CideTextareaComponent),\n }\n ]\n})\nexport class CideTextareaComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {\n @Input() label: string = '';\n @Input() labelHide: boolean = false;\n @Input() placeholder: string = '';\n @Input() helperText: string = '';\n @Input() errorText: string = '';\n @Input() required: boolean = false;\n @Input() disabled: boolean = false;\n @Input() minlength: number = 0;\n @Input() maxlength: number = 0;\n @Input() rows: number | string = 3;\n @Input() id: string = '';\n @Input() ngModel: string = '';\n @Input() size: themeSize = 'sm';\n @Input() fill: elementStyleType = 'outline';\n @Input() labelPlacement: labelPlacementType = 'fixed';\n @Input() labelDir: labelDirType = 'start';\n @Input() leadingIcon: string = '';\n @Input() trailingIcon: string = '';\n @Input() clearInput: boolean = false;\n trailingIconInternal: string = '';\n isTrailingIconAllwedClick: boolean = false;\n @Output() ngModelChange = new EventEmitter<string>();\n\n isTouched = false;\n isValid = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onChange = (value: string) => {};\n onTouched = () => {};\n onValidate = () => {};\n\n ngOnInit(): void {\n this.validateValue(this.ngModel);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['ngModel']) {\n this.validateValue(this.ngModel);\n }\n }\n\n writeValue(value: string): void {\n this.ngModel = value;\n this.validateValue(value);\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n return this.validateValue(control.value);\n }\n\n validateValue(value: string): ValidationErrors | null {\n console.log('validateValue', value);\n this.isValid = true;\n return null;\n }\n\n onInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value;\n this.ngModel = value;\n this.onChange(value);\n this.ngModelChange.emit(value);\n this.validateValue(value);\n }\n\n onBlur() {\n this.isTouched = true;\n this.onTouched();\n }\n\n ClearInputValue() {\n this.ngModel = '';\n this.onChange('');\n this.ngModelChange.emit('');\n this.validateValue('');\n }\n\n trailingIconClick() {\n // For future extensibility (e.g., password visibility)\n // For now, just emit event or toggle icon if needed\n }\n} ","<div class=\"cide-textarea\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n}\">\r\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-textarea-label\">{{ label }}</label>\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n <!-- Trailing Icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n <!-- Textarea -->\r\n <textarea [id]=\"id\" [attr.placeholder]=\"placeholder\" [attr.rows]=\"rows\"\r\n [attr.minlength]=\"minlength > 0 ? minlength : null\" [attr.maxlength]=\"maxlength > 0 ? maxlength : null\"\r\n [disabled]=\"disabled\" [(ngModel)]=\"ngModel\" (input)=\"onInput($event)\" (blur)=\"onBlur()\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? '' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n class=\"cide-textarea-input tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-py-[1px] tw-outline-none\"></textarea>\r\n </div>\r\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-textarea-help-error-text\">{{ errorText || helperText\r\n }}</span>\r\n <span *ngIf=\"helperText && isValid\" class=\"cide-textarea-help-error-text\">{{ helperText }}</span>\r\n</div>","import { Directive, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, Renderer2 } from '@angular/core';\r\n\r\nexport type CideEleResizerDirection = 'horizontal' | 'vertical';\r\nexport type CideEleResizerDirectionTo = \"right-to-left\" | \"left-to-right\" | \"\";\r\n\r\n@Directive({\r\n selector: '[cideEleResizer]',\r\n standalone: true\r\n})\r\n\r\n/**\r\n<!-- Basic horizontal (left-right) layout -->\r\n<div class=\"panel-container\">\r\n <div class=\"left-panel\">\r\n Left Panel Content\r\n </div>\r\n\r\n <div cideEleResizer direction=\"horizontal\" [minPrevSize]=\"100\" [minNextSize]=\"100\">resize\r\n </div>\r\n\r\n <div class=\"right-panel\">\r\n Right Panel Content\r\n </div>\r\n</div>\r\n\r\n<!-- Basic vertical (top-bottom) layout -->\r\n<div class=\"panel-container-vertical\">\r\n <div class=\"top-panel\">\r\n Top Panel Content\r\n </div>\r\n\r\n <div cideEleResizer direction=\"vertical\" [minPrevSize]=\"50\" [minNextSize]=\"50\">resize\r\n </div>\r\n\r\n <div class=\"bottom-panel\">\r\n Bottom Panel Content\r\n </div>\r\n</div>\r\n\r\n<!-- Using with custom selectors -->\r\n<div class=\"complex-layout\">\r\n <div id=\"panel1\">Panel 1</div>\r\n <div id=\"panel2\">Panel 2</div>\r\n\r\n <div cideEleResizer direction=\"horizontal\" prevElementSelector=\"#panel1\" nextElementSelector=\"#panel2\"\r\n [usePercentage]=\"true\">resize\r\n </div>\r\n\r\n <div id=\"panel3\">Panel 3</div>\r\n</div>\r\n */\r\nexport class CideEleResizerDirective implements OnInit {\r\n @Input() direction: CideEleResizerDirection = 'horizontal';\r\n @Input() to: CideEleResizerDirectionTo = \"\";\r\n @Input() prevElementSelector = ''; // Selector for previous element\r\n @Input() nextElementSelector = ''; // Selector for next element\r\n @Input() parentElementSelector = ''; // Selector for parent element\r\n @Input() minPrevSize = 0; // Minimum size of previous element (px)\r\n @Input() minNextSize = 0; // Minimum size of next element (px)\r\n @Input() usePercentage = false; // Use percentage instead of pixels\r\n @Output() resizeStart = new EventEmitter<void>();\r\n @Output() resizing = new EventEmitter<{ prevSize: number, nextSize: number }>();\r\n @Output() resizeEnd = new EventEmitter<{ prevSize: number, nextSize: number }>();\r\n\r\n private isResizing = false;\r\n private startPosition = 0;\r\n private prevElement: HTMLElement | null = null;\r\n private nextElement: HTMLElement | null = null;\r\n private prevSize = 0;\r\n private nextSize = 0;\r\n private containerSize = 0;\r\n private startPrevSize = 0;\r\n private startNextSize = 0;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) { }\r\n\r\n ngOnInit() {\r\n // Set cursor style based on direction\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'cursor',\r\n this.direction === 'horizontal' ? 'ew-resize' : 'ns-resize'\r\n );\r\n\r\n // Add a class to help with styling\r\n this.renderer.addClass(this.el.nativeElement, 'panel-resizer');\r\n this.renderer.addClass(this.el.nativeElement, `panel-resizer-${this.direction}`);\r\n this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}`);\r\n if (this.to) {\r\n this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}-${this.to}`);\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n event.preventDefault();\r\n\r\n // Get the elements to resize\r\n this.prevElement = this.getPrevElement();\r\n this.nextElement = this.getNextElement();\r\n\r\n // if (!this.prevElement || !this.nextElement) {\r\n // console.error('Could not find elements to resize');\r\n // return;\r\n // }\r\n\r\n // Get container size\r\n\r\n const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\r\n if (parent) {\r\n console.log(parent.offsetWidth, \"parent.offsetWidth\")\r\n this.containerSize = this.direction === 'horizontal'\r\n ? parent.offsetWidth\r\n : parent.offsetHeight;\r\n }\r\n\r\n \r\n // Store initial positions and sizes\r\n this.startPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;\r\n if (this.prevElement) {\r\n console.log(this.prevElement.offsetWidth, \"this.prevElement.offsetWidth\")\r\n this.startPrevSize = this.direction === 'horizontal'\r\n ? this.prevElement.offsetWidth\r\n : this.prevElement.offsetHeight;\r\n }\r\n if (this.nextElement) {\r\n console.log(this.nextElement.offsetWidth, \"this.nextElement.offsetWidth\")\r\n this.startNextSize = this.direction === 'horizontal'\r\n ? this.nextElement.offsetWidth\r\n : this.nextElement.offsetHeight;\r\n }\r\n\r\n this.prevSize = this.startPrevSize;\r\n this.nextSize = this.startNextSize;\r\n\r\n this.isResizing = true;\r\n\r\n // Add event listeners\r\n document.addEventListener('mousemove', this.onMouseMove);\r\n document.addEventListener('mouseup', this.onMouseUp);\r\n\r\n // Disable text selection\r\n document.body.style.userSelect = 'none';\r\n\r\n // Emit resizeStart event\r\n this.resizeStart.emit();\r\n\r\n // Add visual feedback\r\n this.renderer.addClass(this.el.nativeElement, 'resizing');\r\n }\r\n\r\n private onMouseMove = (event: MouseEvent) => {\r\n if (!this.isResizing) return;\r\n\r\n // Calculate movement\r\n const currentPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;\r\n const delta = currentPosition - this.startPosition;\r\n\r\n // Calculate new sizes\r\n let newPrevSize = this.startPrevSize + delta;\r\n let newNextSize = this.startNextSize - delta;\r\n\r\n // Apply constraints\r\n if (newPrevSize < this.minPrevSize) {\r\n const diff = this.minPrevSize - newPrevSize;\r\n newPrevSize = this.minPrevSize;\r\n newNextSize = this.startNextSize - delta + diff;\r\n // skip if previsus size is equal to the minimum size, note above code is dark code which will not be executed\r\n return;\r\n }\r\n\r\n if (newNextSize < this.minNextSize) {\r\n const diff = this.minNextSize - newNextSize;\r\n newNextSize = this.minNextSize;\r\n newPrevSize = this.startPrevSize + delta - diff;\r\n // skip if next size is equal to the minimum size, note above code is dark code which will not be executed\r\n return;\r\n }\r\n\r\n // Update sizes\r\n this.prevSize = newPrevSize;\r\n this.nextSize = newNextSize;\r\n\r\n // Apply new sizes\r\n if (this.usePercentage) {\r\n const prevPercent = (newPrevSize / this.containerSize) * 100;\r\n const nextPercent = (newNextSize / this.containerSize) * 100;\r\n\r\n this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${prevPercent}%`);\r\n this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${nextPercent}%`);\r\n } else {\r\n this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${newPrevSize}px`);\r\n this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${newNextSize}px`);\r\n }\r\n\r\n // Emit resizing event\r\n this.resizing.emit({ prevSize: newPrevSize, nextSize: newNextSize });\r\n }\r\n\r\n private onMouseUp = () => {\r\n this.isResizing = false;\r\n\r\n // Remove event listeners\r\n document.removeEventListener('mousemove', this.onMouseMove);\r\n document.removeEventListener('mouseup', this.onMouseUp);\r\n\r\n // Restore text selection\r\n document.body.style.userSelect = '';\r\n\r\n // Emit resizeEnd event\r\n if (this.prevElement && this.nextElement) {\r\n this.resizeEnd.emit({ prevSize: this.prevSize, nextSize: this.nextSize });\r\n }\r\n\r\n // Remove visual feedback\r\n this.renderer.removeClass(this.el.nativeElement, 'resizing');\r\n }\r\n\r\n private getPrevElement(): HTMLElement | null {\r\n if (this.prevElementSelector) {\r\n const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\r\n return parent?.querySelector(this.prevElementSelector) || null;\r\n }\r\n return this.el.nativeElement.previousElementSibling as HTMLElement;\r\n }\r\n\r\n private getNextElement(): HTMLElement | null {\r\n if (this.nextElementSelector) {\r\n const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\r\n return parent?.querySelector(this.nextElementSelector) || null;\r\n }\r\n return this.el.nativeElement.nextElementSibling as HTMLElement;\r\n }\r\n\r\n private getSizeProperty(): string {\r\n return this.direction === 'horizontal' ? 'width' : 'height';\r\n }\r\n}","import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\n\r\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\r\nexport type TooltipType = 'default' | 'success' | 'warning' | 'error' | 'info' | 'light' | 'dark';\r\n\r\n@Directive({\r\n selector: '[cideEleTooltip]',\r\n standalone: true\r\n})\r\nexport class TooltipDirective implements OnInit, OnDestroy {\r\n @Input() cideEleTooltip: string = '';\r\n @Input() tooltipColor: string = '';\r\n @Input() tooltipBg: string = '';\r\n @Input() tooltipPlacement: TooltipPlacement = 'top';\r\n @Input() tooltipType: TooltipType = 'default';\r\n @Input() tooltipDelay: number = 300; // ms\r\n @Input() tooltipDir: TooltipPlacement = 'top'; // Alias for tooltipPlacement for backward compatibility\r\n @Input() tooltipShowArrow: boolean = false;\r\n @Input() tooltipMultiline: boolean = false;\r\n @Input() tooltipMaxWidth: string = '200px';\r\n @Input() tooltipInteractive: boolean = false;\r\n @Input() tooltipClass: string = '';\r\n \r\n private tooltipElement: HTMLElement | null = null;\r\n private visible = false;\r\n private showTimeout: number | null = null;\r\n private hideTimeout: number | null = null;\r\n private hideDelay = 150; // ms\r\n private interactiveMouseLeaveHandler: (() => void) | null = null;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {}\r\n\r\n ngOnInit(): void {\r\n // Use tooltipDir as fallback if provided and tooltipPlacement is default\r\n if (this.tooltipDir && this.tooltipPlacement === 'top') {\r\n this.tooltipPlacement = this.tooltipDir;\r\n }\r\n\r\n // If user hasn't provided custom colors and is using a predefined type,\r\n // we'll leave colors empty to use CSS class colors\r\n if (this.tooltipType !== 'default' && !this.tooltipColor && !this.tooltipBg) {\r\n this.tooltipColor = '';\r\n this.tooltipBg = '';\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter(): void {\r\n this.clearTimeouts();\r\n this.showTimeout = window.setTimeout(() => {\r\n this.show();\r\n }, this.tooltipDelay);\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.clearTimeouts();\r\n this.showTimeout = window.setTimeout(() => {\r\n this.show();\r\n }, this.tooltipDelay);\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave(): void {\r\n this.clearTimeouts();\r\n \r\n // Don't hide immediately if interactive\r\n if (!this.tooltipInteractive) {\r\n this.hide();\r\n } else {\r\n // For interactive tooltips, delay hiding to allow user to move to tooltip\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hide();\r\n }, this.hideDelay);\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.clearTimeouts();\r\n this.hide();\r\n }\r\n\r\n @HostListener('click')\r\n onClick(): void {\r\n if (this.visible && !this.tooltipInteractive) {\r\n this.hide();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearTimeouts();\r\n this.destroyTooltip();\r\n }\r\n\r\n private clearTimeouts(): void {\r\n if (this.showTimeout) {\r\n clearTimeout(this.showTimeout);\r\n this.showTimeout = null;\r\n }\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n }\r\n\r\n private show(): void {\r\n if (!this.cideEleTooltip || this.visible) return;\r\n \r\n this.createTooltip();\r\n this.styleTooltip();\r\n this.positionTooltip();\r\n \r\n // Add animation with requestAnimationFrame for smoother transition\r\n requestAnimationFrame(() => {\r\n if (this.tooltipElement) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-visible');\r\n \r\n // Show arrow if enabled\r\n if (this.tooltipShowArrow) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-arrow-visible');\r\n }\r\n }\r\n });\r\n \r\n this.visible = true;\r\n\r\n // Add mouseleave event listener if interactive\r\n if (this.tooltipInteractive && this.tooltipElement) {\r\n this.interactiveMouseLeaveHandler = () => {\r\n this.clearTimeouts();\r\n this.hide();\r\n };\r\n this.tooltipElement.addEventListener('mouseleave', this.interactiveMouseLeaveHandler);\r\n \r\n // Also add mouseenter to cancel any pending hide\r\n this.tooltipElement.addEventListener('mouseenter', () => {\r\n this.clearTimeouts();\r\n });\r\n }\r\n }\r\n\r\n private hide(): void {\r\n if (!this.visible || !this.tooltipElement) return;\r\n\r\n this.renderer.removeClass(this.tooltipElement, 'tooltip-visible');\r\n this.renderer.removeClass(this.tooltipElement, 'tooltip-arrow-visible');\r\n \r\n // Use timeout for smoother hide animation\r\n setTimeout(() => {\r\n if (!this.visible) { // Double-check in case tooltip was reshown\r\n this.destroyTooltip();\r\n }\r\n }, this.hideDelay);\r\n \r\n this.visible = false;\r\n }\r\n\r\n private createTooltip(): void {\r\n this.destroyTooltip();\r\n\r\n this.tooltipElement = this.renderer.createElement('div');\r\n this.renderer.addClass(this.tooltipElement, 'tooltip');\r\n \r\n // Add placement class for arrow\r\n this.renderer.addClass(this.tooltipElement, `tooltip-${this.tooltipPlacement}`);\r\n \r\n // Add type class if using a predefined type\r\n if (this.tooltipType !== 'default') {\r\n this.renderer.addClass(this.tooltipElement, `tooltip-${this.tooltipType}`);\r\n }\r\n \r\n // Add multiline class if enabled\r\n if (this.tooltipMultiline) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-multiline');\r\n }\r\n \r\n // Add interactive class if enabled\r\n if (this.tooltipInteractive) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-interactive');\r\n }\r\n \r\n // Add custom classes if provided\r\n if (this.tooltipClass) {\r\n const classes = this.tooltipClass.split(' ');\r\n classes.forEach(className => {\r\n if (className.trim()) {\r\n this.renderer.addClass(this.tooltipElement, className.trim());\r\n }\r\n });\r\n }\r\n\r\n // Create HTML content if multiline\r\n if (this.tooltipMultiline) {\r\n this.renderer.setProperty(this.tooltipElement, 'innerHTML', this.cideEleTooltip);\r\n } else {\r\n const textNode = this.renderer.createText(this.cideEleTooltip);\r\n this.renderer.appendChild(this.tooltipElement, textNode);\r\n }\r\n \r\n this.renderer.appendChild(document.body, this.tooltipElement);\r\n }\r\n\r\n private styleTooltip(): void {\r\n if (!this.tooltipElement) return;\r\n\r\n // Set custom CSS variables for the tooltip colors if provided\r\n if (this.tooltipColor) {\r\n this.renderer.setStyle(this.tooltipElement, '--tooltip-color', this.tooltipColor);\r\n }\r\n \r\n if (this.tooltipBg) {\r\n this.renderer.setStyle(this.tooltipElement, '--tooltip-bg', this.tooltipBg);\r\n }\r\n \r\n // Set custom max width if provided\r\n if (this.tooltipMaxWidth && this.tooltipMultiline) {\r\n this.renderer.setStyle(this.tooltipElement, '--tooltip-max-width', this.tooltipMaxWidth);\r\n }\r\n }\r\n\r\n private positionTooltip(): void {\r\n if (!this.tooltipElement) return;\r\n\r\n const hostRect = this.el.nativeElement.getBoundingClientRect();\r\n const tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n \r\n // Account for page scroll\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n \r\n let top = 0;\r\n let left = 0;\r\n \r\n // Calculate position based on placement\r\n switch (this.tooltipPlacement) {\r\n case 'top':\r\n top = hostRect.top + scrollTop - tooltipRect.height - 6;\r\n left = hostRect.left + scrollLeft + (hostRect.width / 2) - (tooltipRect.width / 2);\r\n break;\r\n case 'bottom':\r\n top = hostRect.bottom + scrollTop + 6;\r\n left = hostRect.left + scrollLeft + (hostRect.width / 2) - (tooltipRect.width / 2);\r\n break;\r\n case 'left':\r\n top = hostRect.top + scrollTop + (hostRect.height / 2) - (tooltipRect.height / 2);\r\n left = hostRect.left + scrollLeft - tooltipRect.width - 6;\r\n break;\r\n case 'right':\r\n top = hostRect.top + scrollTop + (hostRect.height / 2) - (tooltipRect.height / 2);\r\n left = hostRect.right + scrollLeft + 6;\r\n break;\r\n }\r\n \r\n // Adjust if tooltip would be outside viewport\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n // Top boundary check\r\n if (top < scrollTop + 4) {\r\n top = scrollTop + 4;\r\n } else if (top + tooltipRect.height > scrollTop + viewportHeight - 4) {\r\n top = scrollTop + viewportHeight - tooltipRect.height - 4;\r\n }\r\n \r\n // Left boundary check\r\n if (left < scrollLeft + 4) {\r\n left = scrollLeft + 4;\r\n } else if (left + tooltipRect.width > scrollLeft + viewportWidth - 4) {\r\n left = scrollLeft + viewportWidth - tooltipRect.width - 4;\r\n }\r\n \r\n this.renderer.setStyle(this.tooltipElement, 'position', 'absolute');\r\n this.renderer.setStyle(this.tooltipElement, 'top', `${top}px`);\r\n this.renderer.setStyle(this.tooltipElement, 'left', `${left}px`);\r\n }\r\n\r\n private destroyTooltip(): void {\r\n if (this.tooltipElement) {\r\n // Remove event listeners for interactive tooltips using the stored reference\r\n if (this.tooltipInteractive && this.interactiveMouseLeaveHandler) {\r\n this.tooltipElement.removeEventListener('mouseleave', this.interactiveMouseLeaveHandler);\r\n this.interactiveMouseLeaveHandler = null;\r\n }\r\n \r\n const parent = this.tooltipElement.parentNode;\r\n if (parent) {\r\n this.renderer.removeChild(parent, this.tooltipElement);\r\n }\r\n this.tooltipElement = null;\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'cide-ele-skeleton-loader',\r\n templateUrl: './skeleton-loader.component.html',\r\n standalone: true,\r\n imports: [CommonModule],\r\n styleUrls: ['./skeleton-loader.component.scss']\r\n})\r\nexport class CideEleSkeletonLoaderComponent {\r\n @Input() width: string = '100%';\r\n @Input() height: string = '1rem';\r\n @Input() borderRadius: string = '0.375rem'; // rounded-md\r\n @Input() count: number = 1;\r\n @Input() circle: boolean = false;\r\n @Input() animation: 'pulse' | 'wave' | 'none' = 'pulse';\r\n}\r\n","<ng-container *ngFor=\"let i of [].constructor(count)\">\r\n <div\r\n [ngClass]=\"[\r\n 'tw-bg-gray-200',\r\n animation === 'pulse' ? 'tw-animate-pulse' : '',\r\n circle ? 'tw-rounded-full' : 'tw-rounded-md'\r\n ]\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.borderRadius]=\"circle ? '50%' : borderRadius\"\r\n class=\"tw-mb-2\"\r\n ></div>\r\n</ng-container>\r\n","// Data Grid Configuration Types for CideEleDataGrid Component\n\nexport type ColumnType = 'text' | 'number' | 'date' | 'boolean' | 'status' | 'actions' | 'custom' | 'order';\nexport type ColumnWidth = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'auto' | string;\nexport type TextAlign = 'left' | 'center' | 'right';\n\nexport interface GridColumn {\n key: string;\n header: string;\n type: ColumnType;\n width?: ColumnWidth;\n sortable?: boolean;\n searchable?: boolean;\n truncate?: boolean;\n align?: TextAlign;\n renderer?: string; // For custom rendering\n valueGetter?: string; // Path to nested property (e.g., 'contact.email')\n formatter?: GridFormatter;\n actions?: GridAction[];\n statusConfig?: StatusConfig;\n}\n\nexport interface GridFormatter {\n type: 'date' | 'currency' | 'percentage' | 'custom';\n format?: string; // Date format, currency code, etc.\n customFunction?: string; // Name of custom formatter function\n}\n\nexport interface StatusConfig {\n activeValue: string | number | boolean;\n activeLabel: string;\n inactiveLabel: string;\n activeClass: string;\n inactiveClass: string;\n}\n\nexport interface GridAction {\n key: string;\n label: string;\n icon: string;\n variant: 'ghost' | 'primary' | 'outline' | 'danger';\n tooltip?: string;\n condition?: string; // Condition to show action (e.g., 'entity.isActive')\n onClick: string; // Function name to call\n}\n\nexport interface GridPaginationConfig {\n enabled: boolean;\n pageSize: number;\n pageSizeOptions: number[];\n showQuickJump: boolean;\n showPageInfo: boolean;\n showRefresh: boolean;\n}\n\nexport interface GridSearchConfig {\n enabled: boolean;\n placeholder: string;\n searchableColumns: string[]; // Column keys to search in\n debounceMs?: number;\n}\n\nexport interface GridExportConfig {\n enabled: boolean;\n formats: ('csv' | 'excel' | 'pdf')[];\n filename?: string;\n}\n\nexport interface GridLoadingConfig {\n useDefer: boolean;\n skeletonRows: number;\n showOverlay: boolean;\n}\n\nexport interface GridScrollConfig {\n enabled: boolean;\n maxHeight?: string; // e.g., '400px', '50vh', 'calc(100vh - 200px)'\n minHeight?: string; // e.g., '200px'\n stickyHeader?: boolean; // Keep header visible when scrolling\n virtualScroll?: boolean; // Enable virtual scrolling for large datasets\n rowHeight?: number; // Height of each row in pixels (for virtual scroll)\n}\n\nexport interface GridTreeConfig {\n enabled: boolean;\n primaryKey: string; // Primary key field name (e.g., '_id')\n foreignKey: string; // Foreign key field name (e.g., 'syme_id_syme')\n childrenKey?: string; // Children array field name (default: 'children')\n levelKey?: string; // Level field name (default: 'level')\n expandedKey?: string; // Expanded state field name (default: 'isExpanded')\n hasChildrenKey?: string; // Has children field name (default: 'hasChildren')\n}\n\nexport interface GridDragDropConfig {\n enabled: boolean;\n dragHandle?: string; // CSS selector for drag handle (default: 'tr')\n orderField?: string; // Field name for storing order (default: 'order')\n dragClass?: string; // CSS class to apply to dragged element\n dropClass?: string; // CSS class to apply to drop target\n}\n\nexport interface GridConfiguration<T = Record<string, unknown>> {\n // Basic Configuration\n id: string;\n title?: string;\n subtitle?: string;\n columns: GridColumn[];\n \n // Data Configuration\n data: T[];\n trackBy?: string; // Property to track items by (default: 'id' or '_id')\n \n // Feature Configuration\n pagination: GridPaginationConfig;\n search: GridSearchConfig;\n export?: GridExportConfig;\n loading: GridLoadingConfig;\n scroll?: GridScrollConfig;\n tree?: GridTreeConfig; // Tree structure configuration\n dragDrop?: GridDragDropConfig; // Drag and drop configuration\n \n // Styling Configuration\n responsive: boolean;\n striped?: boolean;\n bordered?: boolean;\n compact?: boolean;\n fullHeight?: boolean; // Enable full height mode for empty tables\n \n // Event Handlers (function names)\n onRowClick?: string;\n onSort?: string;\n onPageChange?: string;\n onSearch?: string;\n onRefresh?: string;\n onExport?: string;\n onRowReorder?: string; // Row reorder event handler\n \n // Custom Classes\n tableClass?: string;\n headerClass?: string;\n rowClass?: string;\n cellClass?: string;\n}\n\nexport interface GridState<T = Record<string, unknown>> {\n currentPage: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n searchQuery: string;\n sortColumn?: string;\n sortDirection?: 'asc' | 'desc';\n loading: boolean;\n isRefreshing: boolean;\n selectedRows: T[];\n}\n\nexport interface GridEvent<T = Record<string, unknown>> {\n type: 'rowClick' | 'sort' | 'pageChange' | 'search' | 'refresh' | 'export' | 'action' | 'rowReorder';\n data: T | T[] | string | number | null | {\n sourceItem: T;\n sourceIndex: number;\n targetItem: T;\n targetIndex: number;\n newOrder: T[];\n };\n column?: GridColumn;\n action?: GridAction;\n}\n\n// Default configurations\nexport const DEFAULT_GRID_CONFIG: Partial<GridConfiguration> = {\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n scroll: {\n enabled: false,\n maxHeight: '400px',\n minHeight: '200px',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 40\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: true,\n fullHeight: true\n};\n\n// Utility types for type safety\nexport type GridEventHandler<T = Record<string, unknown>> = (event: GridEvent<T>) => void;\nexport type GridCustomRenderer<T = Record<string, unknown>> = (value: unknown, row: T, column: GridColumn) => string;\nexport type GridCustomFormatter = (value: unknown, format?: string) => string; ","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges, SimpleChange, signal, computed, TemplateRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { \n GridConfiguration, \n GridColumn, \n GridEvent, \n GridAction,\n DEFAULT_GRID_CONFIG,\n ColumnWidth,\n StatusConfig\n} from './data-grid.types';\nimport { CideInputComponent } from '../../elements/input/input.component';\nimport { CideSelectComponent } from '../../elements/select/select.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { inputType } from 'cloud-ide-lms-model';\nimport { CideEleButtonComponent } from '../../../public-api';\n\n// Enhanced types for template support\nexport interface TemplateContext<T = Record<string, unknown>> {\n $implicit: unknown;\n row: T;\n value: unknown;\n column: GridColumn;\n}\n\nexport type TemplateRenderer<T = Record<string, unknown>> = TemplateRef<TemplateContext<T>>;\nexport type StringRenderer<T = Record<string, unknown>> = (value: unknown, row: T) => string;\nexport type Renderer<T = Record<string, unknown>> = StringRenderer<T> | TemplateRenderer<T>;\n\n@Component({\n selector: 'cide-ele-data-grid',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule,\n CideInputComponent,\n CideSelectComponent,\n CideIconComponent,\n CideEleButtonComponent\n ],\n templateUrl: './data-grid.component.html',\n styleUrls: ['./data-grid.component.scss']\n})\nexport class CideEleDataGridComponent<T = Record<string, unknown>> implements OnInit, OnChanges, OnDestroy {\n @Input() config!: GridConfiguration<T>;\n @Input() customRenderers: Record<string, StringRenderer<T>> = {};\n @Input() templateRenderers: Record<string, unknown> = {};\n @Input() customFormatters: Record<string, (value: unknown, format?: string) => string> = {};\n @Input() actionHandlers: Record<string, (data: T, action?: GridAction) => void> = {};\n @Input() serverSidePagination = false;\n @Input() totalServerItems = 0;\n @Input() currentServerPage = 1;\n @Input() currentServerPageSize = 10;\n @Input() dragDropEnabled = false;\n\n @Output() gridEvent = new EventEmitter<GridEvent<T>>();\n\n // Internal state using Angular Signals\n private internalData = signal<T[]>([]);\n private filteredData = signal<T[]>([]);\n \n // Grid state\n currentPage = signal(1);\n pageSize = signal(10);\n totalItems = signal(0);\n totalPages = signal(0);\n searchQuery = signal('');\n loading = signal(false);\n isRefreshing = signal(false);\n pageChangeLoading = signal(false);\n jumpToPage = 1;\n isDragOverRow: number | null = null;\n isDragging = signal(false);\n hasOrderChanged = signal(false);\n private originalOrderIds: string[] = []; // Store only IDs for order tracking\n private initialDataOrderIds: string[] = []; // Store only IDs for initial order\n private rowOrderMap = new Map<string, { oldPosition: number; newPosition: number }>();\n private localReorderedData: T[] = []; // Local data for visual reordering\n private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n private isDataUpdate = false;\n\n // Computed properties\n hasNextPage = computed(() => this.currentPage() < this.totalPages());\n hasPreviousPage = computed(() => this.currentPage() > 1);\n \n // Merged configuration with defaults\n mergedConfig = signal<GridConfiguration<T>>(this.config);\n\n ngOnInit() {\n this.initializeGrid();\n this.initializeOriginalOrder();\n }\n\n ngOnDestroy() {\n // Clean up search debounce timer\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config']) {\n // Store current search query to preserve it during re-initialization\n const currentSearchQuery = this.searchQuery();\n \n this.mergeConfigWithDefaults();\n \n // Check if this is a data-only update (same config except data)\n const isDataOnlyUpdate = this.isDataOnlyUpdate(changes['config']);\n \n if (isDataOnlyUpdate && this.serverSidePagination) {\n console.log('🔄 DataGrid: isDataOnlyUpdate', isDataOnlyUpdate);\n // For data-only updates, preserve search query and use updateDataOnly\n this.updateDataOnly(changes['config'].currentValue.data || []);\n if (currentSearchQuery) {\n // this.searchQuery.set(currentSearchQuery);\n }\n } else {\n // For full config changes, use initializeGrid\n this.initializeGrid();\n \n // Restore search query after initialization\n if (currentSearchQuery) {\n // this.searchQuery.set(currentSearchQuery);\n }\n }\n \n // Reinitialize original order when data changes\n this.initializeOriginalOrder();\n \n // Also refresh order tracking to ensure it's up to date\n this.refreshOrderTracking();\n }\n \n if (this.serverSidePagination) {\n if (changes['totalServerItems']) {\n // console.log('🔄 DataGrid: totalServerItems changed:', this.totalServerItems);\n this.totalItems.set(this.totalServerItems);\n this.updatePaginationState();\n }\n \n if (changes['currentServerPage']) {\n // console.log('🔄 DataGrid: currentServerPage changed:', this.currentServerPage);\n this.currentPage.set(this.currentServerPage);\n }\n \n if (changes['currentServerPageSize']) {\n // console.log('🔄 DataGrid: currentServerPageSize changed:', this.currentServerPageSize);\n this.pageSize.set(this.currentServerPageSize);\n this.updatePaginationState();\n }\n \n // Clear page change loading when server-side data is updated\n if (changes['config'] && this.pageChangeLoading()) {\n this.clearPageChangeLoading();\n }\n }\n }\n\n /**\n * Check if the config change is only a data update\n */\n private isDataOnlyUpdate(change: SimpleChange): boolean {\n if (change.firstChange || !change.previousValue || !change.currentValue) {\n return false;\n }\n \n const prev = change.previousValue;\n const curr = change.currentValue;\n \n // Check if all properties except 'data' are the same\n const prevWithoutData = { ...prev };\n const currWithoutData = { ...curr };\n delete prevWithoutData.data;\n delete currWithoutData.data;\n \n return JSON.stringify(prevWithoutData) === JSON.stringify(currWithoutData);\n }\n\n /**\n * Update only the data without triggering full grid re-initialization\n * This prevents the search input and other UI state from being reset\n */\n private updateDataOnly(data: T[]) {\n let processedData = data;\n \n // Transform to tree structure if tree config is enabled\n if (this.mergedConfig().tree?.enabled) {\n processedData = this.transformToTree(data);\n console.log('processedData', processedData);\n }\n \n this.internalData.set(processedData);\n console.log('processedData', processedData);\n // For server-side pagination, set filtered data directly\n if (this.serverSidePagination) {\n console.log('processedData', processedData);\n this.filteredData.set(processedData);\n } else {\n // For client-side pagination, apply filters\n this.applyFilters();\n }\n \n // Refresh order tracking when data changes\n this.refreshOrderTracking();\n \n this.clearPageChangeLoading();\n }\n\n private mergeConfigWithDefaults() {\n this.mergedConfig.set({\n ...DEFAULT_GRID_CONFIG,\n ...this.config,\n pagination: { ...DEFAULT_GRID_CONFIG.pagination!, ...this.config.pagination },\n search: { ...DEFAULT_GRID_CONFIG.search!, ...this.config.search },\n loading: { ...DEFAULT_GRID_CONFIG.loading!, ...this.config.loading },\n scroll: { ...DEFAULT_GRID_CONFIG.scroll!, ...this.config.scroll }\n } as GridConfiguration<T>);\n }\n\n private initializeGrid() {\n // Ensure we have valid data\n let data = this.config?.data || [];\n \n // Transform to tree structure if tree config is enabled\n if (this.mergedConfig().tree?.enabled) {\n data = this.transformToTree(data);\n }\n \n this.internalData.set(data);\n \n // Set pagination values based on mode\n if (this.serverSidePagination) {\n this.currentPage.set(this.currentServerPage);\n this.pageSize.set(this.currentServerPageSize);\n this.totalItems.set(this.totalServerItems);\n // For server-side pagination, set filtered data directly without applying filters\n this.filteredData.set(data);\n } else {\n // Client-side pagination\n const pageSize = this.mergedConfig().pagination?.pageSize || 10;\n this.pageSize.set(pageSize);\n this.totalItems.set(data.length);\n // For client-side pagination, apply filters\n this.applyFilters();\n }\n \n this.updatePaginationState();\n \n // Initialize original order for drag and drop\n this.initializeOriginalOrder();\n \n // Also refresh order tracking to ensure it's up to date\n this.refreshOrderTracking();\n }\n\n /**\n * Get the unique identifier for an item\n */\n private getItemId(item: T): string | null {\n if (item && typeof item === 'object') {\n const id = (item as Record<string, unknown>)['_id'];\n return id ? String(id) : null;\n }\n return null;\n }\n\n /**\n * Get the order value for an item from the config\n */\n private getItemOrder(item: T): number {\n const dragDropConfig = this.getDragDropConfig();\n if (dragDropConfig?.orderField) {\n const orderValue = this.getNestedValue(item, dragDropConfig.orderField);\n return typeof orderValue === 'number' ? orderValue : 0;\n }\n return 0;\n }\n\n /**\n * Initialize the original order for drag and drop\n */\n private initializeOriginalOrder(): void {\n if (this.isDragDropEnabled()) {\n // Get the full dataset from the config (not just displayedData)\n const fullData = this.mergedConfig().data || [];\n \n // Completely build the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Build the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1), // Use actual order or fallback to index\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n // Clear any existing local reordered data\n this.localReorderedData = [];\n \n console.log('🔍 Initial order tracking built from full dataset:', this.initialDataOrderIds.length, 'items');\n console.log('🔍 Initial order map created with actual order values:', Array.from(this.rowOrderMap.entries()));\n }\n }\n\n /**\n * Refresh order tracking with current data (called when data updates)\n */\n private refreshOrderTracking(): void {\n if (this.isDragDropEnabled()) {\n // Get the current full dataset\n const fullData = this.mergedConfig().data || [];\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1),\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n // Clear any local reordered data since data has changed\n this.localReorderedData = [];\n this.hasOrderChanged.set(false);\n \n console.log('🔍 Order tracking completely rebuilt with current data:', this.initialDataOrderIds.length, 'items');\n }\n }\n\n // ===== Data Processing =====\n \n private applyFilters() {\n let filtered = [...this.internalData()];\n \n // Apply search filter only for client-side pagination\n // For server-side pagination, search is handled by the server\n if (!this.serverSidePagination) {\n const query = this.searchQuery()?.toLowerCase();\n if (query && this.mergedConfig().search.enabled) {\n filtered = filtered.filter(item => \n this.mergedConfig().search.searchableColumns.some(columnKey => {\n const value = this.getNestedValue(item, columnKey);\n return String(value || '')?.toLowerCase()?.includes(query);\n })\n );\n }\n }\n \n // Flatten tree structure for display if tree is enabled\n if (this.mergedConfig().tree?.enabled) {\n filtered = this.flattenTreeForDisplay(filtered);\n }\n \n this.filteredData.set(filtered);\n \n // For server-side pagination, totalItems should always be totalServerItems\n // For client-side pagination, totalItems should be the filtered data length\n if (this.serverSidePagination) {\n this.totalItems.set(this.totalServerItems);\n } else {\n this.totalItems.set(filtered.length);\n }\n \n this.updatePaginationState();\n }\n\n /**\n * Transform flat data to tree structure based on foreign key relationships\n */\n private transformToTree(data: T[]): T[] {\n console.log('transformToTree - input data:', data.length, 'items');\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return data;\n\n const { primaryKey, foreignKey, childrenKey = 'children', levelKey = 'level', expandedKey = 'isExpanded', hasChildrenKey = 'hasChildren' } = treeConfig;\n \n // Always add level key to each row during processing\n \n // Create a map for quick lookup\n const itemMap = new Map<string, T>();\n const processedItems = new Set<string>();\n const rootItems: T[] = [];\n\n // First pass: create tree items with default properties and level key\n data.forEach(item => {\n const treeItem = {\n ...item,\n [levelKey]: 0,\n level: 0, // Always add 'level' property for consistent access\n [expandedKey]: false,\n [hasChildrenKey]: false,\n [childrenKey]: []\n } as T;\n itemMap.set(String(this.getNestedValue(item, primaryKey) || ''), treeItem);\n });\n\n // Multi-pass hierarchy building to handle items in any order\n let remainingItems = [...data];\n const maxIterations = data.length; // Prevent infinite loops\n let iteration = 0;\n\n while (remainingItems.length > 0 && iteration < maxIterations) {\n const itemsToProcess = [...remainingItems];\n remainingItems = [];\n \n console.log(`Iteration ${iteration + 1}: Processing ${itemsToProcess.length} items`);\n\n itemsToProcess.forEach(item => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const parentIdValue = this.getNestedValue(item, foreignKey);\n const parentId = parentIdValue !== null && parentIdValue !== undefined ? String(parentIdValue) : '';\n const treeItem = itemMap.get(itemId);\n \n // Skip if already processed\n if (processedItems.has(itemId)) {\n return;\n }\n\n if (treeItem && parentId && itemMap.has(parentId)) {\n // This is a child item - check if parent is processed or is a root\n const parent = itemMap.get(parentId)!;\n const parentParentId = this.getNestedValue(parent, foreignKey);\n const isParentRoot = !parentParentId || parentParentId === null || parentParentId === undefined;\n \n if (isParentRoot || processedItems.has(parentId)) {\n // Parent is processed or is root, we can process this child\n const parentChildren = this.getNestedValue(parent, childrenKey) as T[] || [];\n \n // Avoid adding duplicates\n const childExists = parentChildren.some(child => \n String(this.getNestedValue(child, primaryKey) || '') === itemId\n );\n \n if (!childExists) {\n // Calculate level based on parent - automatically set level key\n const parentLevel = this.getNestedValue(parent, 'level') as number || 0;\n const childLevel = parentLevel + 1;\n \n // Update child item with correct level\n const updatedTreeItem = {\n ...treeItem,\n [levelKey]: childLevel,\n level: childLevel // Always add 'level' property for consistent access\n } as T;\n itemMap.set(itemId, updatedTreeItem);\n \n // Add updated child to parent's children array\n parentChildren.push(updatedTreeItem);\n \n // Update parent properties\n const updatedParent = {\n ...parent,\n [childrenKey]: parentChildren,\n [hasChildrenKey]: true\n } as T;\n itemMap.set(parentId, updatedParent);\n \n processedItems.add(itemId);\n }\n } else {\n // Parent not processed yet, defer this item\n remainingItems.push(item);\n }\n } else if (treeItem) {\n // This is a root item - automatically set level to 0\n const updatedRootItem = {\n ...treeItem,\n [levelKey]: 0,\n level: 0 // Always add 'level' property for consistent access\n } as T;\n itemMap.set(itemId, updatedRootItem);\n \n if (!rootItems.some(rootItem => \n String(this.getNestedValue(rootItem, primaryKey) || '') === itemId\n )) {\n rootItems.push(updatedRootItem);\n processedItems.add(itemId);\n }\n }\n });\n\n iteration++;\n }\n\n // Handle any remaining unprocessed items as roots (orphaned items)\n remainingItems.forEach(item => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n if (!processedItems.has(itemId)) {\n const treeItem = itemMap.get(itemId);\n if (treeItem && !rootItems.includes(treeItem)) {\n console.log(`Adding orphaned item ${itemId} as root`);\n rootItems.push(treeItem);\n }\n }\n });\n\n // Final pass: Update hasChildren property for all items in the tree\n const updateHasChildren = (items: T[]) => {\n items.forEach((item, index) => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\n const hasChildren = children.length > 0;\n \n // Update the item with correct hasChildren property\n const updatedItem = {\n ...item,\n [hasChildrenKey]: hasChildren\n } as T;\n \n // Update in the map\n itemMap.set(itemId, updatedItem);\n \n // Update the item in the array\n items[index] = updatedItem;\n \n // Recursively update children\n if (children.length > 0) {\n updateHasChildren(children);\n }\n });\n };\n\n // Get updated root items from the map to ensure we have the latest versions\n const updatedRootItems = rootItems.map(rootItem => {\n const rootId = String(this.getNestedValue(rootItem, primaryKey) || '');\n return itemMap.get(rootId) || rootItem;\n });\n \n // Update all root items and their descendants\n updateHasChildren(updatedRootItems);\n \n console.log('transformToTree - root items:', updatedRootItems.length);\n console.log('CC - processed items:', processedItems.size);\n console.log('transformToTree - sample root item with level:', updatedRootItems[0]);\n return updatedRootItems;\n }\n\n /**\n * Recursively calculate item level in hierarchy for unlimited depth support\n */\n private calculateItemLevel(item: T, itemMap: Map<string, T>, primaryKey: string, foreignKey: string, levelKey: string): number {\n // Check if level is already set correctly\n const currentLevel = this.getNestedValue(item, levelKey) as number;\n if (currentLevel !== undefined && currentLevel > 0) {\n return currentLevel;\n }\n\n // Get parent information\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const parentIdValue = this.getNestedValue(item, foreignKey);\n const parentId = parentIdValue !== null && parentIdValue !== undefined ? String(parentIdValue) : '';\n \n // If no parent, this is a root item (level 0)\n if (!parentId || !itemMap.has(parentId)) {\n return 0;\n }\n \n // Recursively calculate parent level and add 1\n const parent = itemMap.get(parentId)!;\n const parentLevel = this.calculateItemLevel(parent, itemMap, primaryKey, foreignKey, levelKey);\n \n // Update the item's level in the map\n const updatedItem = {\n ...item,\n [levelKey]: parentLevel + 1\n } as T;\n itemMap.set(itemId, updatedItem);\n \n return parentLevel + 1;\n }\n\n /**\n * Flatten tree structure for display, respecting expansion state with unlimited nesting\n */\n private flattenTreeForDisplay(treeItems: T[]): T[] {\n const result: T[] = [];\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return treeItems;\n \n const { childrenKey = 'children', expandedKey = 'isExpanded' } = treeConfig;\n \n const flatten = (items: T[], currentLevel: number = 0) => {\n items.forEach(item => {\n result.push(item);\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\n const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n \n if (children.length > 0 && isExpanded) {\n console.log(`Flattening children for item at level ${currentLevel}, children count: ${children.length}`);\n flatten(children, currentLevel + 1);\n }\n });\n };\n \n flatten(treeItems);\n console.log('flattenTreeForDisplay - result:', result.length, 'items');\n return result;\n }\n\n /**\n * Toggle expand/collapse state of a tree item with unlimited nesting support\n */\n private toggleTreeExpand(item: T): void {\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return;\n \n const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\n const currentExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n \n console.log(`toggleTreeExpand - item: ${itemId}, current expanded: ${currentExpanded}`);\n \n // Update the expanded state\n const updatedItem = {\n ...item,\n [expandedKey]: !currentExpanded\n } as T;\n \n // Update the item in the tree structure recursively\n const updateItemInTree = (treeData: T[]): T[] => {\n return treeData.map(treeItem => {\n const treeItemId = String(this.getNestedValue(treeItem, primaryKey) || '');\n \n if (treeItemId === itemId) {\n console.log(`Found item to update: ${itemId}, new expanded state: ${!currentExpanded}`);\n return updatedItem;\n }\n \n // Check children recursively\n const children = this.getNestedValue(treeItem, 'children') as T[] || [];\n if (children.length > 0) {\n const updatedChildren = updateItemInTree(children);\n return {\n ...treeItem,\n children: updatedChildren\n } as T;\n }\n \n return treeItem;\n });\n };\n \n // Update the internal data\n const updatedData = updateItemInTree([...this.internalData()]);\n this.internalData.set(updatedData);\n \n // Re-apply filters to update the display\n this.applyFilters();\n }\n\n private updatePaginationState() {\n const total = Math.ceil(this.totalItems() / this.pageSize());\n this.totalPages.set(total);\n \n // Ensure current page is within bounds\n if (total === 0) {\n this.currentPage.set(1);\n } else if (this.currentPage() > total) {\n this.currentPage.set(total);\n }\n }\n\n // ===== Pagination Methods =====\n \n onPageChange(page: number | string) {\n console.log('🔄 DataGrid: onPageChange called with page:', page);\n const pageNum = typeof page === 'string' ? parseInt(page, 10) : page;\n console.log('🔄 DataGrid: Parsed page number:', pageNum, 'Total pages:', this.totalPages());\n \n if (pageNum >= 1 && pageNum <= this.totalPages()) {\n // Set page change loading state\n this.pageChangeLoading.set(true);\n console.log('🔄 DataGrid: Set page change loading to true');\n \n this.currentPage.set(pageNum);\n \n if (this.serverSidePagination) {\n const pageData = { page: pageNum, pageSize: this.pageSize() };\n console.log('🔄 DataGrid: Emitting pageChange event for server-side pagination:', pageData);\n // Emit page data object for server-side pagination\n this.emitEvent('pageChange', pageData as unknown as T);\n // Don't clear loading state here - let the parent component handle it\n // The loading state will be cleared when new data arrives via ngOnChanges\n } else {\n console.log('🔄 DataGrid: Emitting pageChange event for client-side pagination:', pageNum);\n // Emit simple page number for client-side pagination\n this.emitEvent('pageChange', pageNum);\n // Clear loading state for client-side pagination\n this.clearPageChangeLoading();\n }\n } else {\n console.log('🔄 DataGrid: Page number out of range, not emitting event');\n }\n }\n\n onPageSizeChange() {\n // Set page change loading state\n this.pageChangeLoading.set(true);\n \n this.currentPage.set(1);\n this.updatePaginationState();\n \n if (this.serverSidePagination) {\n // Emit page data object for server-side pagination\n this.emitEvent('pageChange', { page: 1, pageSize: this.pageSize() } as unknown as T);\n // Don't clear loading state here - let the parent component handle it\n // The loading state will be cleared when new data arrives via ngOnChanges\n } else {\n // Emit simple page number for client-side pagination\n this.emitEvent('pageChange', 1);\n // Clear loading state for client-side pagination\n this.clearPageChangeLoading();\n }\n }\n\n updatePageSize(value: string | number) {\n this.pageSize.set(+value);\n this.onPageSizeChange();\n }\n\n previousPage() {\n if (this.hasPreviousPage()) {\n this.onPageChange(this.currentPage() - 1);\n }\n }\n\n nextPage() {\n if (this.hasNextPage()) {\n this.onPageChange(this.currentPage() + 1);\n }\n }\n\n onJumpToPage() {\n if (this.jumpToPage >= 1 && this.jumpToPage <= this.totalPages()) {\n this.onPageChange(this.jumpToPage);\n }\n }\n\n getEnhancedPageNumbers(): (number | string)[] {\n const total = this.totalPages();\n const current = this.currentPage();\n const pages: (number | string)[] = [];\n \n if (total <= 7) {\n for (let i = 1; i <= total; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n \n if (current <= 4) {\n for (let i = 2; i <= 5; i++) {\n pages.push(i);\n }\n pages.push('...');\n pages.push(total);\n } else if (current >= total - 3) {\n pages.push('...');\n for (let i = total - 4; i <= total; i++) {\n pages.push(i);\n }\n } else {\n pages.push('...');\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push('...');\n pages.push(total);\n }\n }\n \n return pages;\n }\n\n // ===== Search Methods =====\n \n updateSearchQuery(value: inputType) {\n console.log('updateSearchQuery', value);\n const searchValue = value as string;\n this.searchQuery.set(searchValue);\n \n // Clear any existing debounce timer\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n \n // Apply debounce for search\n const debounceMs = this.mergedConfig().search.debounceMs || 300;\n this.searchDebounceTimer = setTimeout(() => {\n // Only emit search event for server-side pagination\n // Don't trigger any client-side filtering that might cause re-renders\n if (this.serverSidePagination) {\n this.currentPage.set(1);\n this.emitEvent('search', searchValue);\n } else {\n this.onSearch();\n }\n }, debounceMs);\n }\n \n onSearch() {\n this.currentPage.set(1);\n \n if (this.serverSidePagination) {\n // For server-side pagination, only emit the search event\n // Don't apply client-side filters as the server will handle the search\n this.emitEvent('search', this.searchQuery());\n } else {\n // For client-side pagination, apply filters locally\n this.applyFilters();\n this.emitEvent('search', this.searchQuery());\n }\n }\n\n // ===== Action Methods =====\n \n onRefresh() {\n this.isRefreshing.set(true);\n this.emitEvent('refresh', null);\n \n // The parent component should handle the actual refresh and call setRefreshing(false) when done\n // We don't auto-reset here to allow the parent to control the refresh state\n }\n\n // Method to allow parent components to control the refreshing state\n setRefreshing(isRefreshing: boolean) {\n this.isRefreshing.set(isRefreshing);\n }\n\n // Method to clear page change loading state when new data is received\n clearPageChangeLoading() {\n this.pageChangeLoading.set(false);\n }\n\n // ===== Tree View Helper Methods =====\n \n /**\n * Check if tree view is enabled\n */\n isTreeEnabled(): boolean {\n const enabled = this.mergedConfig().tree?.enabled || false;\n return enabled;\n }\n\n /**\n * Get tree configuration\n */\n getTreeConfig() {\n return this.mergedConfig().tree;\n }\n\n /**\n * Check if an item has children\n */\n hasChildren(item: T): boolean {\n const treeConfig = this.getTreeConfig();\n if (!treeConfig) return false;\n \n const { hasChildrenKey = 'hasChildren', childrenKey = 'children' } = treeConfig;\n \n // Check hasChildren property first\n const hasChildren = this.getNestedValue(item, hasChildrenKey) as boolean;\n if (hasChildren !== undefined) {\n return hasChildren;\n }\n \n // Fallback to checking children array\n const children = this.getNestedValue(item, childrenKey) as T[];\n return children && children.length > 0;\n }\n\n /**\n * Get item level in tree\n */\n getItemLevel(item: T): number {\n // Always try to get level from standard 'level' property first (set by transformToTree)\n let level = this.getNestedValue(item, 'level') as number;\n \n // If not found, try tree config level key\n if (level === undefined || level === null) {\n const treeConfig = this.getTreeConfig();\n if (treeConfig) {\n const { levelKey = 'level' } = treeConfig;\n level = this.getNestedValue(item, levelKey) as number || 0;\n } else {\n level = 0;\n }\n }\n \n return level;\n }\n\n /**\n * Check if item is expanded\n */\n isItemExpanded(item: T): boolean {\n const treeConfig = this.getTreeConfig();\n if (!treeConfig) return false;\n \n const { expandedKey = 'isExpanded' } = treeConfig;\n return this.getNestedValue(item, expandedKey) as boolean || false;\n }\n\n /**\n * Get tree indent style\n */\n getTreeIndentStyle(item: T): string {\n const level = this.getItemLevel(item);\n \n // Specific padding progression: Level 1=12px, Level 2=22px, Level 3=32px, Level 4=52px\n const basePadding = 12; // Base cell padding (replaces tw-px-3)\n let levelPadding = 0;\n \n switch (level) {\n case 0: // Level 1 (root)\n levelPadding = 0;\n break;\n case 1: // Level 2\n levelPadding = 10;\n break;\n case 2: // Level 3\n levelPadding = 20;\n break;\n case 3: // Level 4\n levelPadding = 40;\n break;\n default: // Level 5+\n levelPadding = 40 + ((level - 3) * 20); // Continue with 20px increments\n break;\n }\n \n const totalPadding = `${basePadding + levelPadding}px`;\n return totalPadding;\n }\n\n /**\n * Get tree level background class for visual distinction\n */\n getTreeLevelClass(item: T): string {\n const level = this.getItemLevel(item);\n if (level === 0) return 'tree-level-0'; // Root level\n if (level === 1) return 'tree-level-1'; // First child level \n if (level === 2) return 'tree-level-2'; // Second child level\n return 'tree-level-deep'; // Deep nesting (3+ levels)\n }\n\n // ===== Drag and Drop Helper Methods =====\n \n /**\n * Check if drag and drop is enabled\n */\n isDragDropEnabled(): boolean {\n return this.dragDropEnabled || this.mergedConfig().dragDrop?.enabled || false;\n }\n\n /**\n * Get drag and drop configuration\n */\n getDragDropConfig() {\n return this.mergedConfig().dragDrop;\n }\n\n /**\n * Handle drag start event\n */\n onDragStart(event: DragEvent, item: T, index: number): void {\n if (!this.isDragDropEnabled()) return;\n \n this.isDragging.set(true);\n \n // Store the current order IDs when drag starts for comparison\n this.originalOrderIds = this.displayedData.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\n console.log('🔍 Drag started, current order IDs stored:', this.originalOrderIds);\n \n const dragConfig = this.getDragDropConfig();\n const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\n \n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', JSON.stringify({ item, index }));\n }\n \n // Find the closest tr element and apply drag styles\n const rowElement = (event.target as HTMLElement).closest('tr');\n if (rowElement) {\n dragClass.split(' ').forEach(cls => rowElement.classList.add(cls));\n // Add additional visual feedback\n rowElement.style.transform = 'scale(1.02)';\n rowElement.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)';\n rowElement.style.zIndex = '1000';\n }\n }\n\n /**\n * Handle drag over event\n */\n onDragOver(event: DragEvent): void {\n if (!this.isDragDropEnabled()) return;\n \n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n \n // Find the row index from the closest tr element\n const rowElement = (event.target as HTMLElement).closest('tr');\n if (rowElement) {\n const tbody = rowElement.closest('tbody');\n if (tbody) {\n const rowIndex = Array.from(tbody.children).indexOf(rowElement);\n this.isDragOverRow = rowIndex;\n }\n }\n }\n\n /**\n * Handle drag leave event\n */\n onDragLeave(event: DragEvent): void {\n console.log('onDragLeave', event);\n if (!this.isDragDropEnabled()) return;\n \n // Clear drag over row tracking\n this.isDragOverRow = null;\n }\n\n /**\n * Handle drop event\n */\n onDrop(event: DragEvent, targetItem: T, targetIndex: number): void {\n if (!this.isDragDropEnabled()) return;\n \n event.preventDefault();\n \n // Clear drag over row tracking\n this.isDragOverRow = null;\n \n try {\n const data = JSON.parse(event.dataTransfer!.getData('text/plain'));\n const sourceItem = data.item as T;\n const sourceIndex = data.index as number;\n \n if (sourceIndex !== targetIndex) {\n const newOrder = this.getNewOrder(sourceIndex, targetIndex);\n console.log('🔍 Drop completed, updating local order only:', { sourceItem, sourceIndex, targetItem, targetIndex, newOrder });\n \n // Update the row order map with new positions (LOCAL ONLY)\n this.updateRowOrderMap(newOrder);\n \n // Update local data for visual reordering (LOCAL ONLY)\n this.updateLocalDataOrder(newOrder);\n \n // Check if any row has changed position\n const hasActuallyChanged = this.checkIfOrderChanged();\n this.hasOrderChanged.set(hasActuallyChanged);\n console.log('🔍 Local order changed:', hasActuallyChanged);\n \n // IMPORTANT: DO NOT emit reorder event here - only store locally\n // External components will be updated only when \"Save Order\" is clicked\n console.log('🔍 Order change stored locally - external components not updated until save');\n } else {\n console.log('Source and target index are the same, skipping reorder');\n }\n } catch (error) {\n console.error('Error parsing drag data:', error);\n }\n }\n\n /**\n * Handle drag end event\n */\n onDragEnd(event: DragEvent): void {\n if (!this.isDragDropEnabled()) return;\n \n this.isDragging.set(false);\n \n // Check if order has changed after drag ends\n const hasActuallyChanged = this.checkIfOrderChanged();\n this.hasOrderChanged.set(hasActuallyChanged);\n \n const dragConfig = this.getDragDropConfig();\n const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\n \n // Clear drag over row tracking\n this.isDragOverRow = null;\n \n // Find the closest tr element and remove drag styles\n const rowElement = (event.target as HTMLElement).closest('tr');\n if (rowElement) {\n dragClass.split(' ').forEach(cls => rowElement.classList.remove(cls));\n // Remove additional visual feedback\n rowElement.style.transform = '';\n rowElement.style.boxShadow = '';\n rowElement.style.zIndex = '';\n }\n }\n\n /**\n * Calculate new order after reordering\n */\n private getNewOrder(sourceIndex: number, targetIndex: number): T[] {\n const data = [...this.displayedData];\n const [movedItem] = data.splice(sourceIndex, 1);\n data.splice(targetIndex, 0, movedItem);\n return data;\n }\n\n /**\n * Get the current order number for a specific item\n */\n getCurrentOrderNumber(item: T): number {\n const itemId = this.getItemId(item);\n if (itemId && this.rowOrderMap.has(itemId)) {\n return this.rowOrderMap.get(itemId)!.newPosition;\n }\n \n // Fallback to actual order field value from config\n const actualOrder = this.getItemOrder(item);\n if (actualOrder > 0) {\n return actualOrder;\n }\n \n // Final fallback to index-based calculation\n const currentIndex = this.displayedData.findIndex(currentItem => {\n if (item && currentItem && typeof item === 'object' && typeof currentItem === 'object') {\n const itemId = (item as Record<string, unknown>)['_id'];\n const currentItemId = (currentItem as Record<string, unknown>)['_id'];\n return itemId && currentItemId && itemId === currentItemId;\n }\n return item === currentItem;\n });\n return currentIndex >= 0 ? currentIndex + 1 : 0;\n }\n\n /**\n * Update the row order map with new positions after reordering\n */\n private updateRowOrderMap(newOrder: T[]): void {\n newOrder.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId && this.rowOrderMap.has(itemId)) {\n const currentEntry = this.rowOrderMap.get(itemId)!;\n // Calculate new order value based on position and original order field\n const dragDropConfig = this.getDragDropConfig();\n if (dragDropConfig?.orderField) {\n // Use the order field from config to calculate new order values\n const baseOrder = Math.min(...this.displayedData.map(item => this.getItemOrder(item)));\n const newOrderValue = baseOrder + index;\n currentEntry.newPosition = newOrderValue;\n } else {\n // Fallback to index-based position\n currentEntry.newPosition = index + 1;\n }\n this.rowOrderMap.set(itemId, currentEntry);\n }\n });\n \n console.log('🔍 Row order map updated with new order values:', Array.from(this.rowOrderMap.entries()));\n }\n\n /**\n * Check if any row has changed position by comparing old vs new positions\n */\n private checkIfOrderChanged(): boolean {\n for (const [itemId, orderInfo] of this.rowOrderMap) {\n if (orderInfo.oldPosition !== orderInfo.newPosition) {\n console.log('🔍 Order change detected for item:', itemId, orderInfo);\n return true;\n }\n }\n console.log('🔍 No order change detected');\n return false;\n }\n\n /**\n * Reset the row order map to original positions (for reset action)\n */\n private resetRowOrderMap(): void {\n // Get the current full dataset from the config (not cached data)\n const fullData = this.mergedConfig().data || [];\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1),\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n // Clear any local reordered data\n this.localReorderedData = [];\n this.hasOrderChanged.set(false);\n \n console.log('🔍 Row order map completely rebuilt from current data:', this.initialDataOrderIds.length, 'items');\n }\n\n /**\n * Update the row order map baseline to current positions (for save action)\n */\n private updateRowOrderMapBaseline(): void {\n // Get the current full dataset from the config\n const fullData = this.mergedConfig().data || [];\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1),\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n console.log('🔍 Row order map baseline completely rebuilt from current data:', this.initialDataOrderIds.length, 'items');\n }\n\n /**\n * Get the current order array from the row order map\n */\n private getCurrentOrderFromMap(): T[] {\n const orderedItems: Array<{ item: T; newPosition: number }> = [];\n \n // Get the full dataset from the config (not just displayedData)\n const fullData = this.mergedConfig().data || [];\n \n // Collect all items with their new positions from the full dataset\n this.rowOrderMap.forEach((orderInfo, itemId) => {\n const item = fullData.find(dataItem => this.getItemId(dataItem) === itemId);\n if (item) {\n orderedItems.push({ item, newPosition: orderInfo.newPosition });\n }\n });\n \n // Sort by new position and return items in order\n return orderedItems\n .sort((a, b) => a.newPosition - b.newPosition)\n .map(orderedItem => orderedItem.item);\n }\n\n /**\n * Update local data order for visual reordering (LOCAL ONLY)\n */\n private updateLocalDataOrder(newOrder: T[]): void {\n // Store the reordered data locally for visual display\n this.localReorderedData = [...newOrder];\n console.log('🔍 Local data order updated for visual display:', this.localReorderedData.length, 'items');\n }\n\n /**\n * Check if the current order has changed from the initial order\n */\n private checkOrderChanged(currentOrder: T[]): boolean {\n if (this.initialDataOrderIds.length !== currentOrder.length) {\n return true;\n }\n \n // Create arrays of IDs to compare order\n const currentIds = currentOrder.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\n \n // Compare the sequences\n for (let i = 0; i < this.initialDataOrderIds.length; i++) {\n if (this.initialDataOrderIds[i] !== currentIds[i]) {\n console.log('🔍 Order changed detected:', {\n position: i,\n initial: this.initialDataOrderIds[i],\n current: currentIds[i]\n });\n return true;\n }\n }\n \n console.log('🔍 No order change detected');\n return false;\n }\n\n onRowClick(item: T) {\n if (this.mergedConfig().onRowClick) {\n this.emitEvent('rowClick', item);\n }\n }\n\n onActionClick(item: T, action: GridAction) {\n // Handle tree expand/collapse actions\n if (action.key === 'toggle-expand' && this.mergedConfig().tree?.enabled) {\n this.toggleTreeExpand(item);\n }\n \n // Handle order management actions\n if (action.key === 'reset-order') {\n this.hasOrderChanged.set(false);\n // Reset the row order map to current positions (LOCAL ONLY)\n this.resetRowOrderMap();\n // Clear local reordered data to revert to original display\n this.localReorderedData = [];\n console.log('🔍 Reset clicked, row order map reset locally, visual display reverted');\n } else if (action.key === 'save-order') {\n this.hasOrderChanged.set(false);\n // Update the row order map to current positions as new baseline\n this.updateRowOrderMapBaseline();\n // Clear local reordered data as it's now the baseline\n this.localReorderedData = [];\n console.log('🔍 Save clicked, row order map updated to new baseline, local data cleared');\n \n // NOW emit the reorder event to update external components\n const currentOrder = this.getCurrentOrderFromMap();\n if (currentOrder.length > 0) {\n console.log('🔍 Emitting rowReorder event to update external components:', currentOrder);\n // Use the expected GridEvent structure for rowReorder\n this.emitEvent('rowReorder', {\n sourceItem: currentOrder[0], // First item as source\n sourceIndex: 0, // First position as source\n targetItem: currentOrder[currentOrder.length - 1], // Last item as target\n targetIndex: currentOrder.length - 1, // Last position as target\n newOrder: currentOrder // The complete new order\n });\n }\n }\n \n if (this.actionHandlers[action.onClick]) {\n this.actionHandlers[action.onClick](item, action);\n }\n this.emitEvent('action', item, undefined, action);\n }\n\n // ===== Utility Methods =====\n \n private emitEvent(type: GridEvent<T>['type'], data: GridEvent<T>['data'], column?: GridColumn, action?: GridAction) {\n this.gridEvent.emit({ type, data, column, action } as GridEvent<T>);\n }\n\n /**\n * Get nested value from an object\n * @param obj - The object to get the nested value from\n * @param path - The path to the nested value (e.g., 'contact.email')\n * @returns The nested value or undefined if not found\n * @example\n * const obj = { contact: { email: 'test@example.com' } };\n * const value = getNestedValue(obj, 'contact.email');\n * // value === 'test@example.com'\n */\n getNestedValue(obj: T, path: string): unknown {\n return path.split('.').reduce((current: unknown, key: string) => {\n return current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined;\n }, obj);\n }\n\n formatValue(value: unknown, column: GridColumn): string {\n if (column.formatter) {\n if (column.formatter.type === 'custom' && column.formatter.customFunction) {\n const formatter = this.customFormatters[column.formatter.customFunction];\n if (formatter) {\n return formatter(value, column.formatter.format);\n }\n }\n \n // Built-in formatters\n switch (column.formatter.type) {\n case 'date':\n return this.formatDate(value);\n case 'currency':\n return this.formatCurrency(value, column.formatter.format);\n case 'percentage':\n return this.formatPercentage(value);\n default:\n return String(value || '');\n }\n }\n \n return String(value || '');\n }\n\n private formatDate(value: unknown): string {\n if (!value) return 'N/A';\n const date = new Date(value as string);\n return isNaN(date.getTime()) ? 'Invalid Date' : date.toLocaleDateString();\n }\n\n private formatCurrency(value: unknown, currency = 'USD'): string {\n if (value === null || value === undefined) return 'N/A';\n const num = Number(value);\n return isNaN(num) ? 'N/A' : new Intl.NumberFormat('en-US', { \n style: 'currency', \n currency \n }).format(num);\n }\n\n private formatPercentage(value: unknown): string {\n if (value === null || value === undefined) return 'N/A';\n const num = Number(value);\n return isNaN(num) ? 'N/A' : `${num}%`;\n }\n\n renderCustomCell(value: unknown, row: T, column: GridColumn): string {\n if (column.renderer && this.customRenderers[column.renderer]) {\n return this.customRenderers[column.renderer](value, row);\n }\n return this.formatValue(value, column);\n }\n\n // Enhanced renderer methods for template support\n isTemplateRenderer(rendererKey: string): boolean {\n return !!this.templateRenderers[rendererKey];\n }\n\n isStringRenderer(rendererKey: string): boolean {\n return !!this.customRenderers[rendererKey];\n }\n\n getTemplateRenderer(rendererKey: string): TemplateRenderer<T> | null {\n return this.templateRenderers[rendererKey] as TemplateRenderer<T> | null;\n }\n\n getStringRenderer(rendererKey: string): StringRenderer<T> | null {\n return this.customRenderers[rendererKey] || null;\n }\n\n getTemplateContext(value: unknown, row: T, column: GridColumn): TemplateContext<T> {\n return {\n $implicit: value,\n row,\n value,\n column\n };\n }\n\n getColumnWidthClass(width?: ColumnWidth): string {\n if (!width || width === 'auto') return '';\n \n const widthMap = {\n 'xs': 'tw-w-16',\n 'sm': 'tw-w-24',\n 'md': 'tw-w-32',\n 'lg': 'tw-w-48',\n 'xl': 'tw-w-64'\n };\n \n return widthMap[width as keyof typeof widthMap] || `tw-w-[${width}]`;\n }\n\n getColumnMaxWidthClass(width?: ColumnWidth): string {\n if (!width || width === 'auto') return 'tw-max-w-xs';\n \n const maxWidthMap = {\n 'xs': 'tw-max-w-16',\n 'sm': 'tw-max-w-24',\n 'md': 'tw-max-w-32',\n 'lg': 'tw-max-w-48',\n 'xl': 'tw-max-w-64'\n };\n \n return maxWidthMap[width as keyof typeof maxWidthMap] || `tw-max-w-[${width}]`;\n }\n\n getStatusClass(value: unknown, statusConfig?: StatusConfig): string {\n if (!statusConfig) return '';\n return value === statusConfig.activeValue ? statusConfig.activeClass : statusConfig.inactiveClass;\n }\n\n getStatusText(value: unknown, statusConfig?: StatusConfig): string {\n if (!statusConfig) return String(value || '');\n return value === statusConfig.activeValue ? statusConfig.activeLabel : statusConfig.inactiveLabel;\n }\n\n getItemRangeText(): string {\n const total = this.totalItems();\n \n if (this.serverSidePagination) {\n // For server-side pagination, calculate based on actual displayed data\n const displayedCount = this.displayedData.length;\n const start = (this.currentPage() - 1) * this.pageSize() + 1;\n const end = start + displayedCount - 1;\n return `${start}-${end} of ${total}`;\n } else {\n // For client-side pagination, use the original logic\n const start = (this.currentPage() - 1) * this.pageSize() + 1;\n const end = Math.min(this.currentPage() * this.pageSize(), total);\n return `${start}-${end} of ${total}`;\n }\n }\n\n getPageSizeOptions() {\n return this.mergedConfig().pagination.pageSizeOptions.map(size => ({\n value: size,\n label: size.toString()\n }));\n }\n\n trackByFn(index: number, item: T): unknown {\n const trackBy = this.mergedConfig().trackBy || '_id';\n return this.getNestedValue(item, trackBy) || index;\n }\n\n getSkeletonArray(): number[] {\n return Array.from({ length: this.loadingConfig.skeletonRows }, (_, i) => i);\n }\n\n // ===== Template Helper Methods =====\n \n get displayedData(): T[] {\n // If we have local reordered data (from drag & drop), use that for visual display\n if (this.localReorderedData.length > 0 && this.hasOrderChanged()) {\n console.log('🔍 Using local reordered data for display:', this.localReorderedData.length, 'items');\n return this.localReorderedData;\n }\n \n const data = this.filteredData();\n \n // For server-side pagination, the server already provides the correct page of data\n // For client-side pagination, we need to slice the data\n if (this.serverSidePagination) {\n return data;\n } else {\n const start = (this.currentPage() - 1) * this.pageSize();\n const end = start + this.pageSize();\n return data.slice(start, end);\n }\n }\n\n get columns(): GridColumn[] {\n const baseColumns = this.mergedConfig().columns || [];\n return baseColumns;\n }\n\n get paginationConfig() {\n return this.mergedConfig().pagination;\n }\n\n get searchConfig() {\n return this.mergedConfig().search;\n }\n\n get loadingConfig() {\n return this.mergedConfig().loading;\n }\n\n get scrollConfig() {\n return this.mergedConfig().scroll;\n }\n} "," <!-- Data Grid Component -->\n <div class=\"data-grid-container tw-bg-white tw-shadow tw-rounded-lg tw-overflow-visible tw-flex tw-flex-col\" \n [ngClass]=\"[\n mergedConfig().tableClass || '',\n mergedConfig().fullHeight ? 'tw-h-full' : '',\n isDragDropEnabled() ? 'drag-drop-enabled' : '',\n isTreeEnabled() ? 'tree-enabled' : ''\n ]\">\n \n <!-- Header Section -->\n @if (mergedConfig().title || mergedConfig().subtitle) {\n <div class=\"tw-px-3 tw-py-2 tw-border-b tw-border-gray-200\">\n @if (mergedConfig().title) {\n <h3 class=\"tw-text-base tw-font-semibold tw-text-gray-900\">\n {{ mergedConfig().title }}\n </h3>\n }\n @if (mergedConfig().subtitle) {\n <p class=\"tw-text-sm tw-text-gray-600 tw-mt-0.5\">\n {{ mergedConfig().subtitle }}\n </p>\n }\n </div>\n }\n\n <!-- Search Section -->\n @if (searchConfig.enabled) {\n <div class=\"tw-px-3 tw-py-2 tw-border-b tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <!-- Search Input -->\n <div class=\"tw-max-w-md\">\n <cide-ele-input [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\" id=\"search-input\" type=\"text\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"updateSearchQuery($event)\"\n [placeholder]=\"searchConfig.placeholder\"\n [disabled]=\"loading() || isRefreshing()\"\n leadingIcon=\"search\"\n fill=\"outline\">\n </cide-ele-input>\n </div>\n \n <!-- Drag Order Actions -->\n @if (isDragDropEnabled() && (isDragging() || hasOrderChanged())) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <button cideEleButton \n variant=\"outline\" \n size=\"sm\" \n (click)=\"onActionClick(null, { key: 'reset-order', label: 'Reset Order', icon: 'undo', variant: 'outline', onClick: 'resetOrder' })\"\n class=\"tw-text-blue-700 tw-border-blue-300 hover:tw-bg-blue-100\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">undo</cide-ele-icon>\n Reset Order\n </button>\n <button cideEleButton \n variant=\"primary\" \n size=\"sm\" \n (click)=\"onActionClick(null, { key: 'save-order', label: 'Save Order', icon: 'save', variant: 'primary', onClick: 'saveOrder' })\"\n class=\"tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">save</cide-ele-icon>\n Save Order\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Table Section -->\n <div class=\"tw-overflow-x-auto tw-relative\"\n [ngClass]=\"{\n 'tw-flex-1 tw-min-h-0': mergedConfig().fullHeight,\n 'tw-overflow-y-auto': scrollConfig?.enabled,\n 'tw-max-h-full': scrollConfig?.enabled\n }\"\n [style.maxHeight]=\"scrollConfig?.enabled ? scrollConfig?.maxHeight : null\"\n [style.minHeight]=\"scrollConfig?.enabled ? scrollConfig?.minHeight : null\">\n <table class=\"tw-min-w-full tw-divide-y tw-divide-gray-200 tw-h-full tw-table-fixed\"\n [class.empty-table]=\"displayedData.length === 0\"\n [ngClass]=\"{\n 'tw-table-striped': mergedConfig().striped,\n 'tw-border': mergedConfig().bordered,\n 'tw-table-sm': mergedConfig().compact\n }\"\n style=\"table-layout: fixed;\">\n \n <!-- Table Header -->\n <thead class=\"tw-bg-gray-50\" \n [ngClass]=\"[\n mergedConfig().headerClass || '',\n scrollConfig?.enabled && scrollConfig?.stickyHeader ? 'tw-sticky tw-top-0 tw-z-10' : ''\n ]\">\n <tr>\n @for (column of columns; track column.key) {\n <th\n class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wider tw-truncate\"\n [ngClass]=\"[\n getColumnWidthClass(column.width),\n getColumnMaxWidthClass(column.width),\n column.align === 'center' ? 'tw-text-center' : '',\n column.align === 'right' ? 'tw-text-right' : ''\n ]\"\n [title]=\"column.header\">\n {{ column.header }}\n </th>\n }\n </tr>\n </thead>\n\n <!-- Table Body -->\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-gray-200\">\n @if (loading() || isRefreshing() || pageChangeLoading()) {\n <!-- Skeleton Loading Rows -->\n @for (skeletonItem of getSkeletonArray(); track $index) {\n <tr class=\"tw-animate-pulse tw-border-b tw-border-gray-200\">\n @for (column of columns; track column.key) {\n <td class=\"tw-px-3 tw-py-2 tw-whitespace-nowrap\"\n [ngClass]=\"[\n getColumnWidthClass(column.width),\n getColumnMaxWidthClass(column.width)\n ]\">\n <div class=\"tw-h-2 tw-bg-gray-200 tw-rounded tw-w-3/4\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (item of displayedData; track trackByFn($index, item)) {\n <tr class=\"tw-group hover:tw-bg-gray-50 tw-border-b-2 tw-border-gray-200\"\n [ngClass]=\"[\n mergedConfig().rowClass || '',\n isRefreshing() ? 'tw-opacity-60 tw-pointer-events-none' : '',\n isDragDropEnabled() ? 'tw-cursor-move tw-border-2 tw-border-transparent' : '',\n !isDragDropEnabled() ? 'tw-transition-colors tw-duration-150' : '',\n isTreeEnabled() ? getTreeLevelClass(item) : ''\n ]\"\n [style.border-color]=\"isDragOverRow === $index ? '#3b82f6' : 'transparent'\"\n [style.background-color]=\"isDragOverRow === $index ? '#eff6ff' : ''\"\n (click)=\"onRowClick(item)\"\n (keydown.enter)=\"onRowClick(item)\"\n (keydown.space)=\"onRowClick(item)\"\n [class.tw-cursor-pointer]=\"mergedConfig().onRowClick && !isDragDropEnabled()\"\n [tabindex]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 0 : -1\"\n [attr.role]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'button' : null\"\n [attr.aria-label]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'Select row' : null\"\n [draggable]=\"isDragDropEnabled()\"\n (dragstart)=\"onDragStart($event, item, $index)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item, $index)\"\n (dragend)=\"onDragEnd($event)\">\n \n @for (column of columns; track column.key) {\n <td class=\"tw-pr-3 tw-py-1 tw-relative\"\n [ngClass]=\"[\n getColumnWidthClass(column.width),\n getColumnMaxWidthClass(column.width),\n mergedConfig().cellClass || '',\n column.align === 'center' ? 'tw-text-center' : '',\n column.align === 'right' ? 'tw-text-right' : '',\n column.truncate !== false ? 'tw-whitespace-nowrap' : 'tw-whitespace-normal'\n ]\"\n [style.paddingLeft]=\"isTreeEnabled() && $index === 0 ? getTreeIndentStyle(item) : '12px'\"\n [style.maxWidth]=\"getColumnMaxWidthClass(column.width) === 'tw-max-w-xs' ? '200px' : getColumnMaxWidthClass(column.width) === 'tw-max-w-sm' ? '300px' : getColumnMaxWidthClass(column.width) === 'tw-max-w-md' ? '400px' : 'none'\"\n [style.minWidth]=\"isTreeEnabled() && $index === 0 ? '150px' : '100px'\">\n <!-- Tree Expand/Collapse Button (only for first column when tree is enabled) -->\n @if (isTreeEnabled() && $index === 0) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Tree Indentation -->\n <div class=\"tw-flex tw-items-center\">\n @if (hasChildren(item)) {\n <button \n variant=\"outline\"\n size=\"xs\"\n type=\"button\"\n (click)=\"onActionClick(item, { key: 'toggle-expand', label: 'Toggle', icon: '', variant: 'ghost', onClick: 'toggle-expand' }); $event.stopPropagation()\"\n class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-text-gray-500 hover:tw-text-gray-700 tw-rounded\"\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\n [title]=\"isItemExpanded(item) ? 'Collapse' : 'Expand'\">\n <cide-ele-icon \n class=\"tw-w-3 tw-h-3\"\n [class.tw-transition-transform]=\"!isDragDropEnabled()\"\n [class.tw-rotate-90]=\"isItemExpanded(item)\"\n size=\"xs\">\n chevron_right\n </cide-ele-icon>\n </button>\n } @else {\n <div class=\"tw-w-8 tw-h-5 tw-flex tw-items-center tw-justify-center\">\n <!-- <div class=\"tw-w-1 tw-h-1 tw-bg-gray-300 tw-rounded-full\"></div> -->\n </div>\n }\n </div>\n \n <!-- Cell Content -->\n <div class=\"tw-flex-1 tw-w-full\">\n @if (column.type === 'text') {\n <p class=\"tw-text-sm tw-text-gray-900\"\n [class.tw-truncate]=\"column.truncate\"\n [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </p>\n } @else if (column.type === 'number') {\n <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'date') {\n <span class=\"tw-text-sm tw-text-gray-600\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'boolean') {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\n </span>\n } @else if (column.type === 'status' && column.statusConfig) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\n {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\n </span>\n } @else if (column.type === 'actions' && column.actions) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @for (action of column.actions; track action.key) {\n <button\n cideEleButton\n [variant]=\"action.variant || 'ghost'\"\n size=\"xs\"\n type=\"button\"\n (click)=\"onActionClick(item, action); $event.stopPropagation()\"\n [title]=\"action.tooltip || action.label\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\n [ngClass]=\"{\n 'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\n 'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\n 'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\n 'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\n }\">\n @if (action.icon) {\n <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 12l-5-5h10l-5 5z\"/>\n </svg>\n }\n {{ action.label }}\n </button>\n }\n </div>\n } @else if (column.type === 'custom') {\n <!-- Template Renderer -->\n @if (column.renderer && isTemplateRenderer(column.renderer)) {\n <ng-container \n *ngTemplateOutlet=\"getTemplateRenderer(column.renderer)!; \n context: getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </ng-container>\n }\n <!-- String Renderer -->\n @else if (column.renderer && isStringRenderer(column.renderer)) {\n <div [innerHTML]=\"renderCustomCell(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </div>\n }\n <!-- Default rendering -->\n @else {\n <div [innerHTML]=\"renderCustomCell(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </div>\n }\n }\n </div>\n </div>\n } @else {\n <!-- Regular cell content (non-tree or non-first column) -->\n @if (column.type === 'text') {\n <p class=\"tw-text-sm tw-text-gray-900\"\n [class.tw-truncate]=\"column.truncate\"\n [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </p>\n } @else if (column.type === 'number') {\n <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'date') {\n <span class=\"tw-text-sm tw-text-gray-600\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'boolean') {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\n </span>\n } @else if (column.type === 'status' && column.statusConfig) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\n {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\n </span>\n } @else if (column.type === 'actions' && column.actions) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @for (action of column.actions; track action.key) {\n <button\n cideEleButton\n [variant]=\"action.variant || 'ghost'\"\n size=\"xs\"\n type=\"button\"\n (click)=\"onActionClick(item, action); $event.stopPropagation()\"\n [title]=\"action.tooltip || action.label\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\n [ngClass]=\"{\n 'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\n 'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\n 'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\n 'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\n }\">\n @if (action.icon) {\n <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 12l-5-5h10l-5 5z\"/>\n </svg>\n }\n {{ action.label }}\n </button>\n }\n </div>\n } @else if (column.type === 'custom') {\n <!-- Template Renderer -->\n @if (column.renderer && isTemplateRenderer(column.renderer)) {\n <ng-container \n *ngTemplateOutlet=\"getTemplateRenderer(column.renderer)!; \n context: getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </ng-container>\n }\n <!-- String Renderer -->\n @else if (column.renderer && isStringRenderer(column.renderer)) {\n <div [innerHTML]=\"renderCustomCell(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </div>\n }\n <!-- Default rendering -->\n @else {\n <div [innerHTML]=\"renderCustomCell(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </div>\n }\n }\n }\n </td>\n }\n </tr>\n }\n \n <!-- Empty State -->\n @if (displayedData.length === 0) {\n <tr class=\"tw-h-full\">\n <td [attr.colspan]=\"columns.length\" class=\"tw-px-6 tw-py-22 tw-text-center tw-h-full tw-align-middle\">\n <div class=\"tw-text-gray-500 tw-flex tw-flex-col tw-items-center tw-justify-center tw-min-h-[300px]\">\n <svg class=\"tw-mx-auto tw-h-12 tw-w-12 tw-text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"></path>\n </svg>\n <h3 class=\"tw-mt-2 tw-text-sm tw-font-medium tw-text-gray-900\">No data found</h3>\n <p class=\"tw-mt-1 tw-text-sm tw-text-gray-500\">\n @if (searchQuery()) {\n No results match your search criteria.\n } @else {\n There are no items to display.\n }\n </p>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination Section -->\n @if (paginationConfig.enabled && totalItems() > 0) {\n <div class=\"tw-px-3 tw-py-2 tw-border-t tw-border-gray-200 tw-bg-white tw-relative tw-z-20\"\n [class.tw-opacity-60]=\"isRefreshing()\">\n \n <!-- Results Info and Page Size -->\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-2 sm:tw-space-y-0\">\n \n <!-- Results Info -->\n @if (paginationConfig.showPageInfo) {\n <div class=\"tw-flex tw-items-center tw-space-x-4\">\n <p class=\"tw-text-sm tw-text-gray-700\">\n Showing {{ getItemRangeText() }} results\n </p>\n \n <!-- Page Size Selector -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <span class=\"tw-text-sm tw-text-gray-700\">Per page:</span>\n <div class=\"tw-w-20 tw-relative\">\n <cide-ele-select\n [labelHide]=\"true\"\n [ngModel]=\"pageSize()\"\n (ngModelChange)=\"updatePageSize($event)\"\n [options]=\"getPageSizeOptions()\"\n [disabled]=\"isRefreshing()\"\n fill=\"outline\"\n size=\"sm\"\n class=\"tw-z-30\">\n </cide-ele-select>\n </div>\n </div>\n </div>\n }\n\n <!-- Pagination Controls -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n \n <!-- Previous/Next and Page Numbers -->\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\n \n <!-- First Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onPageChange(1)\"\n [disabled]=\"currentPage() === 1 || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n ««\n </button>\n \n <!-- Previous Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"previousPage()\"\n [disabled]=\"!hasPreviousPage() || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n ‹\n </button>\n \n <!-- Page Numbers -->\n @for (page of getEnhancedPageNumbers(); track page) {\n @if (page === '...') {\n <span class=\"tw-px-2 tw-py-2 tw-text-sm tw-text-gray-500\">...</span>\n } @else {\n <button\n cideEleButton\n [variant]=\"currentPage() === page ? 'primary' : 'outline'\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onPageChange(page)\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-sm tw-border tw-rounded-md tw-transition-colors\"\n [ngClass]=\"{\n 'tw-bg-blue-600 tw-text-white tw-border-blue-600': currentPage() === page,\n 'tw-bg-white tw-text-gray-700 tw-border-gray-300 hover:tw-bg-gray-50': currentPage() !== page\n }\">\n {{ page }}\n </button>\n }\n }\n \n <!-- Next Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"nextPage()\"\n [disabled]=\"!hasNextPage() || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n ›\n </button>\n \n <!-- Last Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onPageChange(totalPages())\"\n [disabled]=\"currentPage() === totalPages() || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n »»\n </button>\n \n </div>\n\n <!-- Quick Jump and Refresh -->\n @if (paginationConfig.showQuickJump || paginationConfig.showRefresh) {\n <div class=\"tw-flex tw-items-center tw-space-x-2 tw-border-l tw-border-gray-200 tw-pl-3\">\n \n <!-- Quick Jump -->\n @if (paginationConfig.showQuickJump) {\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\n <span class=\"tw-text-sm tw-text-gray-700\">Go to:</span>\n <div class=\"tw-w-20\">\n <cide-ele-input id=\"jump-to-page-input\" type=\"number\" [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\"\n [(ngModel)]=\"jumpToPage\" [min]=\"1\" [max]=\"totalPages()\"\n [disabled]=\"isRefreshing()\"\n (keydown.enter)=\"onJumpToPage()\">\n </cide-ele-input>\n </div>\n <button\n cideEleButton\n variant=\"outline\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onJumpToPage()\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-sm tw-bg-gray-100 tw-text-gray-700 tw-border tw-border-gray-300 tw-rounded-md hover:tw-bg-gray-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n Go\n </button>\n </div>\n }\n \n <!-- Refresh Button -->\n @if (paginationConfig.showRefresh) {\n <button\n cideEleButton\n variant=\"outline\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onRefresh()\"\n [disabled]=\"isRefreshing()\"\n class=\"!tw-w-10 !tw-h-8 tw-flex tw-items-center tw-justify-center tw-text-gray-600 tw-bg-gray-100 tw-border tw-border-gray-300 tw-rounded-md hover:tw-bg-gray-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n @if (isRefreshing()) {\n <svg class=\"tw-animate-spin tw-h-4 tw-w-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"tw-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n } @else {\n <svg class=\"tw-h-4 tw-w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"></path>\n </svg>\n }\n </button>\n }\n </div>\n }\n \n </div>\n </div>\n </div>\n }\n</div>\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport interface DropdownInstance {\r\n id: string;\r\n close: () => void;\r\n element?: Element;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DropdownManagerService {\r\n private activeDropdowns = signal<Map<string, DropdownInstance>>(new Map());\r\n private documentClickListener?: (event: Event) => void;\r\n private escapeKeyListener?: (event: KeyboardEvent) => void;\r\n\r\n constructor() {\r\n this.initializeGlobalListeners();\r\n }\r\n\r\n private initializeGlobalListeners(): void {\r\n // Global document click listener\r\n this.documentClickListener = (event: Event) => {\r\n this.handleDocumentClick(event);\r\n };\r\n\r\n // Global escape key listener\r\n this.escapeKeyListener = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n this.closeAllDropdowns();\r\n }\r\n };\r\n\r\n // Add listeners\r\n document.addEventListener('click', this.documentClickListener, true);\r\n document.addEventListener('keydown', this.escapeKeyListener, true);\r\n }\r\n\r\n registerDropdown(dropdown: DropdownInstance): void {\r\n // Close any existing dropdowns before opening a new one\r\n this.closeAllDropdowns();\r\n \r\n this.activeDropdowns.update(map => {\r\n const newMap = new Map(map);\r\n newMap.set(dropdown.id, dropdown);\r\n return newMap;\r\n });\r\n }\r\n\r\n unregisterDropdown(id: string): void {\r\n this.activeDropdowns.update(map => {\r\n const newMap = new Map(map);\r\n newMap.delete(id);\r\n return newMap;\r\n });\r\n }\r\n\r\n closeAllDropdowns(): void {\r\n const dropdowns = this.activeDropdowns();\r\n dropdowns.forEach(dropdown => {\r\n dropdown.close();\r\n });\r\n this.activeDropdowns.set(new Map());\r\n }\r\n\r\n closeDropdown(id: string): void {\r\n const dropdowns = this.activeDropdowns();\r\n const dropdown = dropdowns.get(id);\r\n if (dropdown) {\r\n dropdown.close();\r\n this.unregisterDropdown(id);\r\n }\r\n }\r\n\r\n isDropdownOpen(id: string): boolean {\r\n return this.activeDropdowns().has(id);\r\n }\r\n\r\n private handleDocumentClick(event: Event): void {\r\n const dropdowns = this.activeDropdowns();\r\n \r\n if (dropdowns.size === 0) {\r\n return;\r\n }\r\n\r\n // Check if click is inside any open dropdown\r\n const target = event.target as Element;\r\n let isClickInsideDropdown = false;\r\n\r\n dropdowns.forEach(dropdown => {\r\n if (dropdown.element && dropdown.element.contains(target)) {\r\n isClickInsideDropdown = true;\r\n }\r\n });\r\n\r\n // If click is outside all dropdowns, close them\r\n if (!isClickInsideDropdown) {\r\n this.closeAllDropdowns();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up global listeners\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n }\r\n if (this.escapeKeyListener) {\r\n document.removeEventListener('keydown', this.escapeKeyListener, true);\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, signal, viewChild, TemplateRef, ElementRef, HostListener, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { DropdownManagerService, DropdownInstance } from '../../services/dropdown-manager.service';\n\nexport interface DropdownItem {\n id: string;\n label: string;\n icon?: string;\n iconColor?: string;\n textColor?: string;\n hoverBgColor?: string;\n disabled?: boolean;\n divider?: boolean;\n}\n\nexport interface DropdownConfig {\n triggerIcon?: string;\n triggerSize?: 'xs' | 'sm' | 'md' | 'lg';\n triggerColor?: string;\n triggerHoverColor?: string;\n triggerHoverBgColor?: string;\n menuWidth?: string;\n menuPosition?: 'left' | 'right' | 'auto';\n showArrow?: boolean;\n forcePosition?: 'top' | 'bottom' | 'left' | 'right';\n offsetX?: number;\n offsetY?: number;\n}\n\nexport interface DropdownPosition {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'right';\n spaceAvailable: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n}\n\n@Component({\n selector: 'cide-ele-dropdown',\n standalone: true,\n imports: [CommonModule, CideIconComponent],\n template: `\n <div class=\"tw-relative\" #dropdownContainer>\n <!-- Trigger Button -->\n <button \n type=\"button\" \n class=\"dropdown-trigger tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-text-gray-400 hover:tw-text-gray-600 hover:tw-bg-gray-100 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-offset-2 focus:tw-ring-blue-500 tw-transition-all tw-duration-150\"\n [class]=\"getTriggerClasses()\"\n (click)=\"toggleDropdown($event)\"\n [title]=\"config.triggerIcon === 'more_vert' ? 'More actions' : 'Options'\">\n \n <!-- Custom Trigger Template -->\n @if (triggerTemplate) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate; context: { $implicit: isOpen() }\">\n </ng-container>\n } @else {\n <!-- Default Trigger -->\n <cide-ele-icon \n [class]=\"getTriggerIconClasses()\"\n [size]=\"config.triggerSize || 'sm'\">\n {{ config.triggerIcon || 'more_vert' }}\n </cide-ele-icon>\n }\n </button>\n \n <!-- Dropdown Menu -->\n @if (isOpen()) {\n <div \n #dropdownMenu\n class=\"dropdown-menu tw-absolute tw-z-50 tw-bg-white tw-shadow-lg tw-border tw-border-gray-200 tw-rounded-md tw-text-black\"\n [class]=\"getMenuClasses()\"\n [style]=\"getMenuStyles()\"\n role=\"menu\">\n \n <!-- Custom Menu Template -->\n @if (menuTemplate) {\n <ng-container *ngTemplateOutlet=\"menuTemplate; context: { $implicit: items }\">\n </ng-container>\n } @else {\n <!-- Default Menu -->\n <div class=\"tw-py-1\" role=\"none\">\n @for (item of items; track item.id) {\n <button \n type=\"button\"\n class=\"tw-flex tw-items-center tw-w-full tw-px-3 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-100 hover:tw-text-gray-900 tw-transition-colors tw-duration-150\"\n [disabled]=\"item.disabled\"\n (click)=\"onItemClick(item, $event)\"\n [attr.data-item-id]=\"item.id\">\n \n <!-- Item Icon -->\n @if (item.icon) {\n <cide-ele-icon \n class=\"tw-w-4 tw-h-4 tw-mr-2\"\n [class]=\"item.iconColor || 'tw-text-gray-400'\"\n size=\"xs\">\n {{ item.icon }}\n </cide-ele-icon>\n }\n \n <!-- Item Label -->\n <span [class]=\"item.textColor || 'tw-text-gray-700'\">\n {{ item.label }}\n </span>\n </button>\n }\n </div>\n }\n </div>\n }\n `,\n styles: [`\n .dropdown-menu {\n transform-origin: top right;\n }\n `]\n})\nexport class CideEleDropdownComponent implements OnInit, OnDestroy {\n private destroyRef = inject(DestroyRef);\n private dropdownManager = inject(DropdownManagerService);\n private dropdownId = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\n\n // ViewChild for container reference\n dropdownContainer = viewChild.required<ElementRef>('dropdownContainer');\n dropdownMenu = viewChild<ElementRef>('dropdownMenu');\n\n // Inputs\n @Input() set items(value: DropdownItem[]) {\n this._items = value;\n }\n get items(): DropdownItem[] {\n return this._items;\n }\n private _items: DropdownItem[] = [];\n\n @Input() config: DropdownConfig = {};\n @Input() triggerTemplate?: TemplateRef<{ $implicit: boolean }>;\n @Input() menuTemplate?: TemplateRef<{ $implicit: DropdownItem[] }>;\n\n // Outputs\n @Output() itemClick = new EventEmitter<DropdownItem>();\n @Output() dropdownToggle = new EventEmitter<boolean>();\n\n // Signals\n isOpen = signal(false);\n currentPosition = signal<DropdownPosition>({\n vertical: 'bottom',\n horizontal: 'right',\n spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\n });\n\n ngOnInit(): void {\n // Setup cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n });\n }\n\n ngOnDestroy(): void {\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n }\n\n // Methods\n getTriggerClasses(): string {\n const baseClasses = 'tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-transition-all tw-duration-150 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-offset-2 focus:tw-ring-blue-500';\n\n const colorClasses = this.config?.triggerColor || 'tw-text-gray-400';\n const hoverColorClasses = this.config?.triggerHoverColor || 'hover:tw-text-gray-600';\n const hoverBgClasses = this.config?.triggerHoverBgColor || 'hover:tw-bg-gray-100';\n\n return `${baseClasses} ${colorClasses} ${hoverColorClasses} ${hoverBgClasses}`;\n }\n\n getTriggerIconClasses(): string {\n return this.config?.triggerColor || 'tw-text-gray-400';\n }\n\n getMenuClasses(): string {\n const baseClasses = 'tw-absolute tw-z-50 tw-rounded-md tw-bg-white tw-shadow-lg tw-ring-1 tw-ring-black tw-ring-opacity-5 focus:tw-outline-none tw-transition-all tw-duration-150';\n const widthClass = this.config?.menuWidth || 'tw-w-44';\n \n return `${baseClasses} ${widthClass}`;\n }\n\n getMenuStyles(): string {\n const position = this.currentPosition();\n const offsetX = this.config?.offsetX || 0;\n const offsetY = this.config?.offsetY || 4;\n \n let styles = 'position: absolute; z-index: 9999;';\n \n // Vertical positioning\n if (position.vertical === 'bottom') {\n styles += `top: calc(100% + ${offsetY}px);`;\n } else {\n styles += `bottom: calc(100% + ${offsetY}px);`;\n }\n \n // Horizontal positioning\n if (position.horizontal === 'right') {\n styles += `right: ${offsetX}px;`;\n } else {\n styles += `left: ${offsetX}px;`;\n }\n \n return styles;\n }\n\n calculatePosition(): DropdownPosition {\n const container = this.dropdownContainer();\n if (!container) {\n return {\n vertical: 'bottom',\n horizontal: 'right',\n spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\n };\n }\n\n const rect = container.nativeElement.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n // Calculate available space in each direction\n const spaceAvailable = {\n top: rect.top,\n bottom: viewport.height - rect.bottom,\n left: rect.left,\n right: viewport.width - rect.right\n };\n\n // Estimated dropdown menu dimensions (adjust based on your needs)\n const menuWidth = this.getMenuWidth();\n const menuHeight = this.getEstimatedMenuHeight();\n\n // Determine vertical position\n let vertical: 'top' | 'bottom' = 'bottom';\n if (this.config?.forcePosition === 'top' || this.config?.forcePosition === 'bottom') {\n vertical = this.config.forcePosition;\n } else {\n // Check if there's enough space below\n if (spaceAvailable.bottom < menuHeight && spaceAvailable.top > menuHeight) {\n vertical = 'top';\n }\n }\n\n // Determine horizontal position \n let horizontal: 'left' | 'right' = 'right';\n if (this.config?.forcePosition === 'left' || this.config?.forcePosition === 'right') {\n horizontal = this.config.forcePosition;\n } else if (this.config?.menuPosition === 'left') {\n horizontal = 'left';\n } else if (this.config?.menuPosition === 'auto') {\n // Auto-detect best horizontal position\n if (spaceAvailable.right < menuWidth && spaceAvailable.left > menuWidth) {\n horizontal = 'left';\n }\n }\n\n return {\n vertical,\n horizontal,\n spaceAvailable\n };\n }\n\n private getMenuWidth(): number {\n // Parse width from config or use default\n const configWidth = this.config?.menuWidth || 'tw-w-44';\n if (configWidth.includes('tw-w-')) {\n const widthMap: { [key: string]: number } = {\n 'tw-w-32': 128, 'tw-w-36': 144, 'tw-w-40': 160,\n 'tw-w-44': 176, 'tw-w-48': 192, 'tw-w-52': 208,\n 'tw-w-56': 224, 'tw-w-60': 240, 'tw-w-64': 256\n };\n return widthMap[configWidth] || 176;\n }\n return 176; // Default width\n }\n\n private getEstimatedMenuHeight(): number {\n // Estimate height based on number of items\n const itemHeight = 40; // Approximate height per item\n const padding = 8; // Top and bottom padding\n return (this.items.length * itemHeight) + padding;\n }\n\n toggleDropdown(event: Event): void {\n console.log('🔵 toggleDropdown called');\n event.stopPropagation();\n \n if (!this.isOpen()) {\n this.openDropdown();\n } else {\n this.closeDropdown();\n }\n }\n\n private openDropdown(): void {\n // Calculate position before opening\n const newPosition = this.calculatePosition();\n this.currentPosition.set(newPosition);\n \n this.isOpen.set(true);\n \n // Register with dropdown manager\n const dropdownInstance: DropdownInstance = {\n id: this.dropdownId,\n close: () => this.closeDropdown(),\n element: this.dropdownContainer().nativeElement\n };\n \n this.dropdownManager.registerDropdown(dropdownInstance);\n \n console.log('🔵 Dropdown opened:', this.dropdownId);\n console.log('🔵 Position:', this.currentPosition());\n this.dropdownToggle.emit(true);\n }\n\n testMouseDown(item: DropdownItem): void {\n console.log('🔵 Mouse down detected: ' + item.label);\n // Don't close dropdown on mousedown\n }\n\n onItemClick(item: DropdownItem, event: Event): void {\n console.log('🔵 Dropdown onItemClick called with:', item);\n\n // Simple event handling\n event.stopPropagation();\n\n if (item.disabled || item.divider) {\n console.log('🔵 Item is disabled or divider, returning');\n return;\n }\n\n console.log('🔵 Emitting itemClick event');\n this.itemClick.emit(item);\n\n // Close dropdown after a small delay to ensure click is processed\n setTimeout(() => {\n this.closeDropdown();\n }, 50);\n }\n\n closeDropdown(): void {\n console.log('🔵 closeDropdown called, setting isOpen to false');\n this.isOpen.set(false);\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n this.dropdownToggle.emit(false);\n }\n\n getItemClasses(item: DropdownItem): string {\n if (item.divider) {\n return 'tw-border-t tw-border-gray-200 tw-my-1';\n }\n\n const baseClasses = 'tw-flex tw-items-center tw-w-full tw-px-3 tw-py-2 tw-text-sm tw-transition-colors tw-duration-150';\n\n if (item.disabled) {\n return `${baseClasses} tw-text-gray-400 tw-cursor-not-allowed`;\n }\n\n const textColor = item.textColor || 'tw-text-gray-700';\n const hoverBg = item.hoverBgColor || 'hover:tw-bg-gray-100';\n const hoverText = item.textColor || 'hover:tw-text-gray-900';\n\n return `${baseClasses} ${textColor} ${hoverBg} ${hoverText}`;\n }\n\n // Host listeners for window events (position recalculation only)\n // Note: Click outside and escape key handling is now managed by DropdownManagerService\n\n @HostListener('window:resize')\n onWindowResize(): void {\n if (this.isOpen()) {\n // Recalculate position on window resize\n const newPosition = this.calculatePosition();\n this.currentPosition.set(newPosition);\n }\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n if (this.isOpen()) {\n // Recalculate position on scroll\n const newPosition = this.calculatePosition();\n this.currentPosition.set(newPosition);\n }\n }\n} ","import { Injectable, signal, computed, TemplateRef } from '@angular/core';\r\n\r\nexport interface ConfirmationRequest<T = unknown> {\r\n id: string;\r\n title: string;\r\n message: string;\r\n type: 'danger' | 'warning' | 'info' | 'success';\r\n icon?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n customTemplate?: TemplateRef<unknown>;\r\n customData?: T;\r\n resolve: (value: boolean | T) => void;\r\n reject: (reason?: unknown) => void;\r\n}\r\n\r\nexport interface ConfirmationOptions<T = unknown> {\r\n title: string;\r\n message: string;\r\n type?: 'danger' | 'warning' | 'info' | 'success';\r\n icon?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n customTemplate?: TemplateRef<unknown>;\r\n customData?: T;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConfirmationService {\r\n private confirmationQueue = signal<ConfirmationRequest<unknown>[]>([]);\r\n private currentRequest = signal<ConfirmationRequest<unknown> | null>(null);\r\n \r\n // Computed signals\r\n hasActiveConfirmation = computed(() => this.currentRequest() !== null);\r\n queueLength = computed(() => this.confirmationQueue().length);\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Ask for confirmation with a simple yes/no dialog\r\n */\r\n ask(options: ConfirmationOptions<unknown>): Promise<boolean> {\r\n return new Promise<boolean>((resolve, reject) => {\r\n const request: ConfirmationRequest<unknown> = {\r\n id: this.generateId(),\r\n title: options.title,\r\n message: options.message,\r\n type: options.type || 'warning',\r\n icon: options.icon || this.getDefaultIcon(options.type || 'warning'),\r\n confirmText: options.confirmText || 'Confirm',\r\n cancelText: options.cancelText || 'Cancel',\r\n resolve: (value: boolean | unknown) => resolve(value as boolean),\r\n reject\r\n };\r\n\r\n this.addToQueue(request);\r\n });\r\n }\r\n\r\n /**\r\n * Ask for confirmation with custom template and return custom data\r\n */\r\n askWithTemplate<T = unknown>(options: ConfirmationOptions<T> & { customTemplate: TemplateRef<unknown> }): Promise<T> {\r\n return new Promise<T>((resolve, reject) => {\r\n const request: ConfirmationRequest<T> = {\r\n id: this.generateId(),\r\n title: options.title,\r\n message: options.message,\r\n type: options.type || 'info',\r\n icon: options.icon || this.getDefaultIcon(options.type || 'info'),\r\n confirmText: options.confirmText || 'Confirm',\r\n cancelText: options.cancelText || 'Cancel',\r\n customTemplate: options.customTemplate,\r\n customData: options.customData,\r\n resolve: (value: boolean | T) => resolve(value as T),\r\n reject\r\n };\r\n\r\n // Cast to unknown for queue compatibility\r\n this.addToQueue(request as ConfirmationRequest<unknown>);\r\n });\r\n }\r\n\r\n /**\r\n * Quick confirmation for dangerous actions\r\n */\r\n confirmDelete(itemName?: string): Promise<boolean> {\r\n return this.ask({\r\n title: 'Confirm Delete',\r\n message: itemName ? `Are you sure you want to delete \"${itemName}\"? This action cannot be undone.` : 'Are you sure you want to delete this item? This action cannot be undone.',\r\n type: 'danger',\r\n icon: 'delete_forever',\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel'\r\n });\r\n }\r\n\r\n /**\r\n * Quick confirmation for permanent actions\r\n */\r\n confirmPermanentAction(action: string, itemName?: string): Promise<boolean> {\r\n return this.ask({\r\n title: `Confirm ${action}`,\r\n message: itemName ? `Are you sure you want to ${action.toLowerCase()} \"${itemName}\"? This action cannot be undone.` : `Are you sure you want to ${action.toLowerCase()}? This action cannot be undone.`,\r\n type: 'danger',\r\n icon: 'warning',\r\n confirmText: action,\r\n cancelText: 'Cancel'\r\n });\r\n }\r\n\r\n /**\r\n * Quick confirmation for safe actions\r\n */\r\n confirmSafeAction(action: string, itemName?: string): Promise<boolean> {\r\n return this.ask({\r\n title: `Confirm ${action}`,\r\n message: itemName ? `Are you sure you want to ${action.toLowerCase()} \"${itemName}\"?` : `Are you sure you want to ${action.toLowerCase()}?`,\r\n type: 'info',\r\n icon: 'info',\r\n confirmText: action,\r\n cancelText: 'Cancel'\r\n });\r\n }\r\n\r\n // Internal methods\r\n private addToQueue(request: ConfirmationRequest<unknown>): void {\r\n this.confirmationQueue.update(queue => [...queue, request]);\r\n this.processQueue();\r\n }\r\n\r\n private processQueue(): void {\r\n if (this.currentRequest() || this.confirmationQueue().length === 0) {\r\n return;\r\n }\r\n\r\n const nextRequest = this.confirmationQueue()[0];\r\n this.currentRequest.set(nextRequest);\r\n }\r\n\r\n confirmCurrentRequest(data?: unknown): void {\r\n const request = this.currentRequest();\r\n if (!request) return;\r\n\r\n request.resolve(data !== undefined ? data : true);\r\n this.removeCurrentRequest();\r\n }\r\n\r\n cancelCurrentRequest(): void {\r\n const request = this.currentRequest();\r\n if (!request) return;\r\n\r\n request.reject(new Error('User cancelled'));\r\n this.removeCurrentRequest();\r\n }\r\n\r\n private removeCurrentRequest(): void {\r\n this.confirmationQueue.update(queue => queue.slice(1));\r\n this.currentRequest.set(null);\r\n \r\n // Process next request if any\r\n setTimeout(() => this.processQueue(), 100);\r\n }\r\n\r\n private generateId(): string {\r\n return `confirmation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private getDefaultIcon(type: 'danger' | 'warning' | 'info' | 'success'): string {\r\n const iconMap = {\r\n danger: 'error',\r\n warning: 'warning',\r\n info: 'info',\r\n success: 'check_circle'\r\n };\r\n return iconMap[type];\r\n }\r\n\r\n // Public getters for components\r\n getCurrentRequest() {\r\n return this.currentRequest;\r\n }\r\n\r\n getHasActiveConfirmation() {\r\n return this.hasActiveConfirmation;\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface NotificationOptions {\r\n message: string;\r\n type?: 'success' | 'error' | 'warning' | 'info';\r\n duration?: number;\r\n showUndo?: boolean;\r\n undoAction?: () => void;\r\n undoText?: string;\r\n icon?: string;\r\n title?: string;\r\n}\r\n\r\nexport interface NotificationItem {\r\n id: string;\r\n message: string;\r\n type: 'success' | 'error' | 'warning' | 'info';\r\n duration: number;\r\n showUndo: boolean;\r\n undoAction?: () => void;\r\n undoText: string;\r\n icon: string;\r\n title?: string;\r\n timestamp: number;\r\n isVisible: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n private notifications = signal<NotificationItem[]>([]);\r\n private maxNotifications = 5; // Maximum notifications to show at once\r\n\r\n // Computed signals\r\n activeNotifications = computed(() => \r\n this.notifications().filter(n => n.isVisible)\r\n );\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Show a success notification\r\n */\r\n success(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'success',\r\n icon: 'check_circle',\r\n duration: 3000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show an error notification\r\n */\r\n error(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'error',\r\n icon: 'error',\r\n duration: 5000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show a warning notification\r\n */\r\n warning(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'warning',\r\n icon: 'warning',\r\n duration: 4000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show an info notification\r\n */\r\n info(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'info',\r\n icon: 'info',\r\n duration: 3000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show a notification with undo functionality\r\n */\r\n showWithUndo(\r\n message: string, \r\n undoAction: () => void, \r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.show({\r\n message,\r\n type: 'info',\r\n icon: 'info',\r\n duration: 8000,\r\n showUndo: true,\r\n undoAction,\r\n undoText: 'Undo',\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show a notification for reversible destructive actions\r\n */\r\n showReversibleAction(\r\n action: string,\r\n itemName: string,\r\n undoAction: () => void,\r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.showWithUndo(\r\n `${action} \"${itemName}\"`,\r\n undoAction,\r\n {\r\n type: 'warning',\r\n icon: 'delete',\r\n title: `${action} completed`,\r\n ...options\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Show a notification for background tasks\r\n */\r\n showBackgroundTask(\r\n taskName: string,\r\n isComplete: boolean = true,\r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.show({\r\n message: isComplete ? `${taskName} completed successfully` : `${taskName} in progress...`,\r\n type: isComplete ? 'success' : 'info',\r\n icon: isComplete ? 'check_circle' : 'sync',\r\n duration: isComplete ? 3000 : 0, // Don't auto-dismiss for in-progress tasks\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Core show method\r\n */\r\n private show(options: NotificationOptions): string {\r\n const notification: NotificationItem = {\r\n id: this.generateId(),\r\n message: options.message,\r\n type: options.type || 'info',\r\n duration: options.duration || 3000,\r\n showUndo: options.showUndo || false,\r\n undoAction: options.undoAction,\r\n undoText: options.undoText || 'Undo',\r\n icon: options.icon || this.getDefaultIcon(options.type || 'info'),\r\n title: options.title,\r\n timestamp: Date.now(),\r\n isVisible: true\r\n };\r\n\r\n this.addNotification(notification);\r\n return notification.id;\r\n }\r\n\r\n /**\r\n * Remove a specific notification\r\n */\r\n remove(id: string): void {\r\n this.notifications.update(notifications => \r\n notifications.map(n => \r\n n.id === id ? { ...n, isVisible: false } : n\r\n )\r\n );\r\n\r\n // Remove from array after animation\r\n setTimeout(() => {\r\n this.notifications.update(notifications => \r\n notifications.filter(n => n.id !== id)\r\n );\r\n }, 300);\r\n }\r\n\r\n /**\r\n * Remove all notifications\r\n */\r\n clearAll(): void {\r\n this.notifications.update(notifications => \r\n notifications.map(n => ({ ...n, isVisible: false }))\r\n );\r\n\r\n setTimeout(() => {\r\n this.notifications.set([]);\r\n }, 300);\r\n }\r\n\r\n /**\r\n * Execute undo action for a notification\r\n */\r\n executeUndo(id: string): void {\r\n const notification = this.notifications().find(n => n.id === id);\r\n if (notification && notification.undoAction) {\r\n notification.undoAction();\r\n this.remove(id);\r\n }\r\n }\r\n\r\n // Internal methods\r\n private addNotification(notification: NotificationItem): void {\r\n this.notifications.update(notifications => {\r\n const newNotifications = [...notifications, notification];\r\n \r\n // Limit the number of visible notifications\r\n if (newNotifications.length > this.maxNotifications) {\r\n // Remove oldest notifications\r\n const toRemove = newNotifications.length - this.maxNotifications;\r\n for (let i = 0; i < toRemove; i++) {\r\n if (newNotifications[i]) {\r\n newNotifications[i] = { ...newNotifications[i], isVisible: false };\r\n }\r\n }\r\n }\r\n \r\n return newNotifications;\r\n });\r\n\r\n // Auto-remove after duration (if not 0)\r\n if (notification.duration > 0) {\r\n setTimeout(() => {\r\n this.remove(notification.id);\r\n }, notification.duration);\r\n }\r\n }\r\n\r\n private generateId(): string {\r\n return `notification-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private getDefaultIcon(type: 'success' | 'error' | 'warning' | 'info'): string {\r\n const iconMap = {\r\n success: 'check_circle',\r\n error: 'error',\r\n warning: 'warning',\r\n info: 'info'\r\n };\r\n return iconMap[type];\r\n }\r\n\r\n // Public getters for components\r\n getNotifications() {\r\n return this.notifications;\r\n }\r\n\r\n getActiveNotifications() {\r\n return this.activeNotifications;\r\n }\r\n}\r\n\r\n","import { Component, signal, computed, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { ConfirmationService } from '../../services/confirmation.service';\r\n\r\n@Component({\r\n selector: 'cide-ele-confirmation-modal',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n template: `\r\n <!-- Backdrop -->\r\n <div \r\n *ngIf=\"hasActiveConfirmation()\"\r\n class=\"confirmation-backdrop\"\r\n (click)=\"onBackdropClick($event)\"\r\n [@backdropAnimation]>\r\n </div>\r\n\r\n <!-- Modal -->\r\n <div \r\n *ngIf=\"hasActiveConfirmation()\"\r\n class=\"confirmation-modal\"\r\n [@modalAnimation]>\r\n \r\n <!-- Modal Header -->\r\n <div class=\"modal-header\" [class]=\"getHeaderClass()\">\r\n <div class=\"header-content\">\r\n <div class=\"icon-container\" [class]=\"getIconClass()\">\r\n <cide-ele-icon \r\n size=\"lg\">\r\n {{ currentRequest()?.icon || 'info' }}\r\n </cide-ele-icon>\r\n </div>\r\n <h2 class=\"modal-title\">{{ currentRequest()?.title }}</h2>\r\n </div>\r\n </div>\r\n\r\n <!-- Modal Body -->\r\n <div class=\"modal-body\">\r\n <p class=\"modal-message\">{{ currentRequest()?.message }}</p>\r\n \r\n <!-- Custom Template Slot -->\r\n <div *ngIf=\"currentRequest()?.customTemplate\" class=\"custom-content\">\r\n <ng-container \r\n *ngTemplateOutlet=\"currentRequest()?.customTemplate!; context: { $implicit: customData }\">\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Modal Footer -->\r\n <div class=\"modal-footer\">\r\n <button \r\n type=\"button\"\r\n class=\"btn btn-secondary\"\r\n (click)=\"onCancel()\">\r\n {{ currentRequest()?.cancelText || 'Cancel' }}\r\n </button>\r\n \r\n <button \r\n type=\"button\"\r\n class=\"btn\"\r\n [class]=\"getConfirmButtonClass()\"\r\n (click)=\"onConfirm()\">\r\n {{ currentRequest()?.confirmText || 'Confirm' }}\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .confirmation-backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n backdrop-filter: blur(4px);\r\n z-index: 10000;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n .confirmation-modal {\r\n background: white;\r\n border-radius: 12px;\r\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\r\n max-width: 480px;\r\n width: 90%;\r\n max-height: 90vh;\r\n overflow: hidden;\r\n z-index: 10001;\r\n position: relative;\r\n }\r\n\r\n .modal-header {\r\n padding: 24px 24px 16px;\r\n border-bottom: 1px solid #e5e7eb;\r\n }\r\n\r\n .header-content {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n }\r\n\r\n .icon-container {\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n }\r\n\r\n .icon-container.danger {\r\n background-color: #fef2f2;\r\n color: #dc2626;\r\n }\r\n\r\n .icon-container.warning {\r\n background-color: #fffbeb;\r\n color: #d97706;\r\n }\r\n\r\n .icon-container.info {\r\n background-color: #eff6ff;\r\n color: #2563eb;\r\n }\r\n\r\n .icon-container.success {\r\n background-color: #f0fdf4;\r\n color: #16a34a;\r\n }\r\n\r\n .modal-title {\r\n margin: 0;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: #111827;\r\n line-height: 1.4;\r\n }\r\n\r\n .modal-body {\r\n padding: 16px 24px 24px;\r\n }\r\n\r\n .modal-message {\r\n margin: 0 0 16px 0;\r\n font-size: 16px;\r\n line-height: 1.5;\r\n color: #6b7280;\r\n }\r\n\r\n .custom-content {\r\n margin-top: 16px;\r\n padding-top: 16px;\r\n border-top: 1px solid #f3f4f6;\r\n }\r\n\r\n .modal-footer {\r\n padding: 16px 24px 24px;\r\n display: flex;\r\n gap: 12px;\r\n justify-content: flex-end;\r\n border-top: 1px solid #e5e7eb;\r\n }\r\n\r\n .btn {\r\n padding: 10px 20px;\r\n border-radius: 8px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n border: none;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n min-width: 80px;\r\n }\r\n\r\n .btn:hover {\r\n transform: translateY(-1px);\r\n }\r\n\r\n .btn:active {\r\n transform: translateY(0);\r\n }\r\n\r\n .btn-secondary {\r\n background-color: #f9fafb;\r\n color: #374151;\r\n border: 1px solid #d1d5db;\r\n }\r\n\r\n .btn-secondary:hover {\r\n background-color: #f3f4f6;\r\n border-color: #9ca3af;\r\n }\r\n\r\n .btn-primary {\r\n background-color: #2563eb;\r\n color: white;\r\n }\r\n\r\n .btn-primary:hover {\r\n background-color: #1d4ed8;\r\n }\r\n\r\n .btn-danger {\r\n background-color: #dc2626;\r\n color: white;\r\n }\r\n\r\n .btn-danger:hover {\r\n background-color: #b91c1c;\r\n }\r\n\r\n .btn-warning {\r\n background-color: #d97706;\r\n color: white;\r\n }\r\n\r\n .btn-warning:hover {\r\n background-color: #b45309;\r\n }\r\n\r\n .btn-success {\r\n background-color: #16a34a;\r\n color: white;\r\n }\r\n\r\n .btn-success:hover {\r\n background-color: #15803d;\r\n }\r\n\r\n /* Responsive Design */\r\n @media (max-width: 640px) {\r\n .confirmation-modal {\r\n width: 95%;\r\n margin: 20px;\r\n }\r\n\r\n .modal-header {\r\n padding: 20px 20px 12px;\r\n }\r\n\r\n .modal-body {\r\n padding: 12px 20px 20px;\r\n }\r\n\r\n .modal-footer {\r\n padding: 12px 20px 20px;\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .btn {\r\n width: 100%;\r\n justify-content: center;\r\n }\r\n\r\n .header-content {\r\n flex-direction: column;\r\n text-align: center;\r\n gap: 12px;\r\n }\r\n\r\n .modal-title {\r\n font-size: 18px;\r\n }\r\n }\r\n\r\n /* Focus styles for accessibility */\r\n .btn:focus {\r\n outline: 2px solid #2563eb;\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Animation classes */\r\n .modal-enter {\r\n opacity: 0;\r\n transform: scale(0.95) translateY(-10px);\r\n }\r\n\r\n .modal-enter-active {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n transition: all 0.2s ease-out;\r\n }\r\n\r\n .modal-exit {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n }\r\n\r\n .modal-exit-active {\r\n opacity: 0;\r\n transform: scale(0.95) translateY(-10px);\r\n transition: all 0.15s ease-in;\r\n }\r\n `],\r\n animations: [\r\n // Add animations here if needed\r\n ]\r\n})\r\nexport class CideEleConfirmationModalComponent {\r\n private confirmationService = inject(ConfirmationService);\r\n\r\n // Signals\r\n hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;\r\n currentRequest = this.confirmationService.getCurrentRequest();\r\n customData = signal<unknown>(null);\r\n\r\n // Computed\r\n getHeaderClass = computed(() => {\r\n const request = this.currentRequest();\r\n return request ? `header-${request.type}` : '';\r\n });\r\n\r\n getIconClass = computed(() => {\r\n const request = this.currentRequest();\r\n return request ? request.type : 'info';\r\n });\r\n\r\n getConfirmButtonClass = computed(() => {\r\n const request = this.currentRequest();\r\n if (!request) return 'btn-primary';\r\n \r\n const classMap = {\r\n danger: 'btn-danger',\r\n warning: 'btn-warning',\r\n info: 'btn-primary',\r\n success: 'btn-success'\r\n };\r\n \r\n return classMap[request.type] || 'btn-primary';\r\n });\r\n\r\n onBackdropClick(event: Event): void {\r\n // Only close if clicking the backdrop itself, not its children\r\n if (event.target === event.currentTarget) {\r\n this.onCancel();\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.confirmationService.cancelCurrentRequest();\r\n }\r\n\r\n onConfirm(): void {\r\n // If there's custom data, pass it to the confirmation\r\n const data = this.customData();\r\n this.confirmationService.confirmCurrentRequest(data);\r\n this.customData.set(null); // Reset custom data\r\n }\r\n\r\n // Method to update custom data (called by custom templates)\r\n updateCustomData(data: unknown): void {\r\n this.customData.set(data);\r\n }\r\n}\r\n","import { Component, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { NotificationService, NotificationItem } from '../../services/notification.service';\n\n@Component({\n selector: 'cide-ele-toast-notification',\n standalone: true,\n imports: [CommonModule, CideIconComponent],\n template: `\n <!-- Toast Container -->\n <div class=\"toast-container\">\n <div \n *ngFor=\"let notification of activeNotifications(); trackBy: trackByNotification\"\n class=\"toast-notification\"\n [class]=\"getToastClass(notification)\"\n [@toastAnimation]>\n \n <!-- Toast Content -->\n <div class=\"toast-content\">\n <!-- Icon -->\n <div class=\"toast-icon\" [class]=\"getIconClass(notification.type)\">\n <cide-ele-icon size=\"sm\">\n {{ notification.icon }}\n </cide-ele-icon>\n </div>\n \n <!-- Text Content -->\n <div class=\"toast-text\">\n <div *ngIf=\"notification.title\" class=\"toast-title\">\n {{ notification.title }}\n </div>\n <div class=\"toast-message\">\n {{ notification.message }}\n </div>\n </div>\n \n <!-- Close Button -->\n <button \n type=\"button\"\n class=\"toast-close\"\n (click)=\"removeNotification(notification.id)\"\n aria-label=\"Close notification\">\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n </button>\n </div>\n \n <!-- Undo Button -->\n <div *ngIf=\"notification.showUndo\" class=\"toast-actions\">\n <button \n type=\"button\"\n class=\"toast-undo-btn\"\n (click)=\"executeUndo(notification.id)\">\n {{ notification.undoText }}\n </button>\n </div>\n \n <!-- Progress Bar -->\n <div \n *ngIf=\"notification.duration > 0\"\n class=\"toast-progress\"\n [style.animation-duration]=\"notification.duration + 'ms'\">\n </div>\n </div>\n </div>\n `,\n styles: [`\n .toast-container {\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 9990;\n display: flex;\n flex-direction: column;\n gap: 12px;\n max-width: 400px;\n width: 100%;\n }\n\n .toast-notification {\n background: white;\n border-radius: 8px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n border: 1px solid #e5e7eb;\n overflow: hidden;\n position: relative;\n animation: slideInRight 0.3s ease-out;\n }\n\n .toast-notification.success {\n border-left: 4px solid #16a34a;\n }\n\n .toast-notification.error {\n border-left: 4px solid #dc2626;\n }\n\n .toast-notification.warning {\n border-left: 4px solid #d97706;\n }\n\n .toast-notification.info {\n border-left: 4px solid #2563eb;\n }\n\n .toast-content {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n }\n\n .toast-icon {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .toast-icon.success {\n background-color: #f0fdf4;\n color: #16a34a;\n }\n\n .toast-icon.error {\n background-color: #fef2f2;\n color: #dc2626;\n }\n\n .toast-icon.warning {\n background-color: #fffbeb;\n color: #d97706;\n }\n\n .toast-icon.info {\n background-color: #eff6ff;\n color: #2563eb;\n }\n\n .toast-text {\n flex: 1;\n min-width: 0;\n }\n\n .toast-title {\n font-size: 14px;\n font-weight: 600;\n color: #111827;\n margin-bottom: 4px;\n line-height: 1.4;\n }\n\n .toast-message {\n font-size: 14px;\n color: #6b7280;\n line-height: 1.4;\n }\n\n .toast-close {\n background: none;\n border: none;\n color: #9ca3af;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n flex-shrink: 0;\n }\n\n .toast-close:hover {\n background-color: #f3f4f6;\n color: #6b7280;\n }\n\n .toast-actions {\n padding: 0 16px 16px;\n display: flex;\n justify-content: flex-end;\n }\n\n .toast-undo-btn {\n background: none;\n border: none;\n color: #2563eb;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n padding: 8px 12px;\n border-radius: 6px;\n transition: all 0.2s ease;\n }\n\n .toast-undo-btn:hover {\n background-color: #eff6ff;\n }\n\n .toast-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 3px;\n background-color: #e5e7eb;\n animation: progressShrink linear forwards;\n }\n\n .toast-notification.success .toast-progress {\n background-color: #16a34a;\n }\n\n .toast-notification.error .toast-progress {\n background-color: #dc2626;\n }\n\n .toast-notification.warning .toast-progress {\n background-color: #d97706;\n }\n\n .toast-notification.info .toast-progress {\n background-color: #2563eb;\n }\n\n /* Animations */\n @keyframes slideInRight {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n }\n\n @keyframes slideOutRight {\n from {\n transform: translateX(0);\n opacity: 1;\n }\n to {\n transform: translateX(100%);\n opacity: 0;\n }\n }\n\n @keyframes progressShrink {\n from {\n width: 100%;\n }\n to {\n width: 0%;\n }\n }\n\n /* Responsive Design */\n @media (max-width: 640px) {\n .toast-container {\n top: 10px;\n right: 10px;\n left: 10px;\n max-width: none;\n }\n\n .toast-notification {\n border-radius: 6px;\n }\n\n .toast-content {\n padding: 12px;\n }\n\n .toast-actions {\n padding: 0 12px 12px;\n }\n }\n\n /* Focus styles for accessibility */\n .toast-close:focus,\n .toast-undo-btn:focus {\n outline: 2px solid #2563eb;\n outline-offset: 2px;\n }\n `],\n animations: [\n // Add animations here if needed\n ]\n})\nexport class CideEleToastNotificationComponent {\n private notificationService = inject(NotificationService);\n\n // Signals\n activeNotifications = this.notificationService.getActiveNotifications();\n\n // Methods\n getToastClass(notification: NotificationItem): string {\n return `toast-${notification.type}`;\n }\n\n getIconClass(type: string): string {\n return `toast-icon ${type}`;\n }\n\n removeNotification(id: string): void {\n this.notificationService.remove(id);\n }\n\n executeUndo(id: string): void {\n this.notificationService.executeUndo(id);\n }\n\n trackByNotification(index: number, notification: NotificationItem): string {\n return notification.id;\n }\n}\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideEleConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';\r\nimport { CideEleToastNotificationComponent } from '../toast-notification/toast-notification.component';\r\n\r\n@Component({\r\n selector: 'cide-ele-global-notifications',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideEleConfirmationModalComponent,\r\n CideEleToastNotificationComponent\r\n ],\r\n template: `\r\n <!-- Global Confirmation Modal -->\r\n <cide-ele-confirmation-modal></cide-ele-confirmation-modal>\r\n \r\n <!-- Global Toast Notifications -->\r\n <cide-ele-toast-notification></cide-ele-toast-notification>\r\n `,\r\n styles: [`\r\n /* Global styles for notifications */\r\n :host {\r\n display: contents;\r\n }\r\n `]\r\n})\r\nexport class CideEleGlobalNotificationsComponent {\r\n // This component serves as a container for global notifications\r\n // It doesn't need any logic as the services handle everything\r\n}\r\n\r\n","import { Component, Input, Output, EventEmitter, OnInit, ElementRef, signal, computed, inject, DestroyRef, forwardRef, viewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface JsonEditorConfig {\r\n /** Enable syntax highlighting */\r\n syntaxHighlighting?: boolean;\r\n /** Enable line numbers */\r\n showLineNumbers?: boolean;\r\n /** Enable auto-formatting */\r\n autoFormat?: boolean;\r\n /** Enable validation */\r\n validateOnChange?: boolean;\r\n /** Theme for the editor */\r\n theme?: 'light' | 'dark';\r\n /** Minimum height in pixels */\r\n minHeight?: number;\r\n /** Maximum height in pixels */\r\n maxHeight?: number;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Read-only mode */\r\n readOnly?: boolean;\r\n /** Show error messages */\r\n showErrors?: boolean;\r\n}\r\n\r\nexport interface JsonEditorError {\r\n line: number;\r\n column: number;\r\n message: string;\r\n type: 'syntax' | 'validation';\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-json-editor',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div class=\"tw-relative tw-w-full\" [class]=\"containerClass()\">\r\n <!-- Label -->\r\n @if (label) {\r\n <label \r\n [for]=\"editorId\" \r\n class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\"\r\n [class.tw-text-red-600]=\"hasErrors()\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"tw-text-red-500 tw-ml-1\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <!-- Editor Container -->\r\n <div \r\n class=\"tw-relative tw-border tw-rounded-md tw-bg-white tw-overflow-hidden\"\r\n [class.tw-border-red-300]=\"hasErrors()\"\r\n [class.tw-border-gray-300]=\"!hasErrors()\"\r\n [class.tw-focus-within:tw-border-blue-500]=\"!hasErrors()\"\r\n [class.tw-focus-within:tw-ring-1]=\"!hasErrors()\"\r\n [class.tw-focus-within:tw-ring-blue-500]=\"!hasErrors()\"\r\n [class.tw-opacity-50]=\"disabled()\"\r\n [class.tw-cursor-not-allowed]=\"disabled()\">\r\n \r\n <!-- Line Numbers -->\r\n @if (configSignal().showLineNumbers) {\r\n <div \r\n class=\"tw-absolute tw-left-0 tw-top-0 tw-bottom-0 tw-w-12 tw-bg-gray-50 tw-border-r tw-border-gray-200 tw-text-xs tw-text-gray-500 tw-font-mono tw-select-none tw-overflow-hidden\"\r\n [class.tw-bg-gray-800]=\"configSignal().theme === 'dark'\"\r\n [class.tw-border-gray-600]=\"configSignal().theme === 'dark'\"\r\n [class.tw-text-gray-400]=\"configSignal().theme === 'dark'\">\r\n @for (line of lineNumbers(); track line) {\r\n <div \r\n class=\"tw-px-2 tw-py-1 tw-text-right\"\r\n [class.tw-bg-red-100]=\"hasErrorOnLine(line)\"\r\n [class.tw-text-red-600]=\"hasErrorOnLine(line)\"\r\n [class.tw-bg-red-900]=\"configSignal().theme === 'dark' && hasErrorOnLine(line)\"\r\n [class.tw-text-red-400]=\"configSignal().theme === 'dark' && hasErrorOnLine(line)\">\r\n {{ line }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Textarea -->\r\n <textarea\r\n #jsonTextarea\r\n [id]=\"editorId\"\r\n [value]=\"jsonString()\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n [placeholder]=\"configSignal().placeholder || 'Enter JSON configuration...'\"\r\n [readonly]=\"configSignal().readOnly || disabled()\"\r\n [disabled]=\"disabled()\"\r\n class=\"tw-w-full tw-p-3 tw-text-sm tw-font-mono tw-leading-relaxed tw-resize-none tw-outline-none tw-bg-transparent\"\r\n [class.tw-pl-12]=\"configSignal().showLineNumbers\"\r\n [class.tw-text-gray-900]=\"configSignal().theme === 'light'\"\r\n [class.tw-text-gray-100]=\"configSignal().theme === 'dark'\"\r\n [class.tw-bg-gray-900]=\"configSignal().theme === 'dark'\"\r\n [style.min-height.px]=\"configSignal().minHeight || 120\"\r\n [style.max-height.px]=\"configSignal().maxHeight || 400\"\r\n [attr.aria-describedby]=\"errorId()\"\r\n [attr.aria-invalid]=\"hasErrors()\">\r\n </textarea>\r\n\r\n <!-- Format Button -->\r\n @if (!configSignal().readOnly && !disabled()) {\r\n <button\r\n type=\"button\"\r\n (click)=\"formatJson()\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-p-1 tw-text-gray-400 hover:tw-text-gray-600 tw-rounded tw-transition-colors\"\r\n [class.tw-text-gray-500]=\"configSignal().theme === 'dark'\"\r\n [class.hover:tw-text-gray-300]=\"configSignal().theme === 'dark'\"\r\n title=\"Format JSON\">\r\n <svg class=\"tw-w-4 tw-h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h7\"></path>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Helper Text -->\r\n @if (helperText && !hasErrors()) {\r\n <p class=\"tw-mt-1 tw-text-xs tw-text-gray-500\">{{ helperText }}</p>\r\n }\r\n\r\n <!-- Error Messages -->\r\n @if (configSignal().showErrors && hasErrors()) {\r\n <div [id]=\"errorId()\" class=\"tw-mt-1 tw-space-y-1\">\r\n @for (error of errors(); track error.line + '-' + error.column) {\r\n <p class=\"tw-text-xs tw-text-red-600 tw-flex tw-items-start tw-gap-1\">\r\n <svg class=\"tw-w-3 tw-h-3 tw-mt-0.5 tw-flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"></path>\r\n </svg>\r\n <span>\r\n Line {{ error.line }}, Column {{ error.column }}: {{ error.message }}\r\n </span>\r\n </p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Character Count -->\r\n @if (showCharacterCount) {\r\n <p class=\"tw-mt-1 tw-text-xs tw-text-gray-400 tw-text-right\">\r\n {{ jsonString().length }} characters\r\n </p>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n }\r\n \r\n textarea {\r\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\r\n tab-size: 2;\r\n }\r\n \r\n textarea:focus {\r\n box-shadow: none;\r\n }\r\n \r\n .tw-cursor-not-allowed {\r\n cursor: not-allowed;\r\n }\r\n `],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideEleJsonEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CideEleJsonEditorComponent implements OnInit, ControlValueAccessor {\r\n // Inputs\r\n @Input() label?: string;\r\n @Input() helperText?: string;\r\n @Input() required = false;\r\n @Input() disabled = signal(false);\r\n @Input() showCharacterCount = false;\r\n @Input() config: JsonEditorConfig = {};\r\n configSignal = signal<JsonEditorConfig>({});\r\n\r\n // Outputs\r\n @Output() valueChange = new EventEmitter<string>();\r\n @Output() objectChange = new EventEmitter<object | null>();\r\n @Output() errorsChange = new EventEmitter<JsonEditorError[]>();\r\n @Output() validChange = new EventEmitter<boolean>();\r\n\r\n // ViewChild\r\n jsonTextarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('jsonTextarea');\r\n\r\n // Dependency injection\r\n private destroyRef = inject(DestroyRef);\r\n\r\n // Internal state\r\n jsonString = signal('');\r\n jsonObject = signal<object | null>(null);\r\n errors = signal<JsonEditorError[]>([]);\r\n editorId = `json-editor-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n // Computed values\r\n hasErrors = computed(() => this.errors().length > 0);\r\n isValid = computed(() => !this.hasErrors() && this.jsonObject() !== null);\r\n lineNumbers = computed(() => {\r\n const lines = this.jsonString().split('\\n');\r\n return Array.from({ length: Math.max(lines.length, 1) }, (_, i) => i + 1);\r\n });\r\n containerClass = computed(() => {\r\n const classes = ['tw-w-full'];\r\n if (this.disabled()) {\r\n classes.push('tw-opacity-50');\r\n }\r\n return classes.join(' ');\r\n });\r\n\r\n // Default configuration\r\n private defaultConfig: JsonEditorConfig = {\r\n syntaxHighlighting: true,\r\n showLineNumbers: true,\r\n autoFormat: true,\r\n validateOnChange: true,\r\n theme: 'light',\r\n minHeight: 120,\r\n maxHeight: 400,\r\n placeholder: 'Enter JSON configuration...',\r\n readOnly: false,\r\n showErrors: true\r\n };\r\n\r\n ngOnInit(): void {\r\n // Merge default config with input config\r\n const mergedConfig = { ...this.defaultConfig, ...this.config };\r\n this.configSignal.set(mergedConfig);\r\n \r\n // Initial validation\r\n if (mergedConfig.validateOnChange && this.jsonString()) {\r\n this.validateJson();\r\n }\r\n }\r\n\r\n /**\r\n * Handle input changes\r\n */\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLTextAreaElement;\r\n const value = target.value;\r\n \r\n this.jsonString.set(value);\r\n this.valueChange.emit(value);\r\n \r\n // Call ControlValueAccessor onChange callback\r\n this.onChange(value);\r\n \r\n if (this.configSignal().validateOnChange) {\r\n this.validateJson();\r\n }\r\n \r\n this.parseJson(value);\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n // Call ControlValueAccessor onTouched callback\r\n this.onTouched();\r\n \r\n if (this.configSignal().autoFormat && this.isValid()) {\r\n this.formatJson();\r\n }\r\n }\r\n\r\n /**\r\n * Parse JSON string and emit object\r\n */\r\n private parseJson(jsonStr: string): void {\r\n if (!jsonStr.trim()) {\r\n this.jsonObject.set(null);\r\n this.objectChange.emit(null);\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(jsonStr);\r\n this.jsonObject.set(parsed);\r\n this.objectChange.emit(parsed);\r\n } catch (error) {\r\n // Error will be handled by validateJson\r\n this.jsonObject.set(null);\r\n this.objectChange.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Validate JSON and update errors\r\n */\r\n private validateJson(): void {\r\n const jsonStr = this.jsonString();\r\n const newErrors: JsonEditorError[] = [];\r\n\r\n if (!jsonStr.trim()) {\r\n this.errors.set(newErrors);\r\n this.errorsChange.emit(newErrors);\r\n this.validChange.emit(true);\r\n return;\r\n }\r\n\r\n try {\r\n JSON.parse(jsonStr);\r\n // JSON is valid\r\n this.errors.set(newErrors);\r\n this.errorsChange.emit(newErrors);\r\n this.validChange.emit(true);\r\n } catch (error) {\r\n // Parse error - extract line and column information\r\n const errorMessage = (error as Error).message;\r\n const lineMatch = errorMessage.match(/position (\\d+)/);\r\n \r\n if (lineMatch) {\r\n const position = parseInt(lineMatch[1]);\r\n const lines = jsonStr.substring(0, position).split('\\n');\r\n const line = lines.length;\r\n const column = lines[lines.length - 1].length + 1;\r\n \r\n newErrors.push({\r\n line,\r\n column,\r\n message: 'Invalid JSON syntax',\r\n type: 'syntax'\r\n });\r\n } else {\r\n newErrors.push({\r\n line: 1,\r\n column: 1,\r\n message: 'Invalid JSON format',\r\n type: 'syntax'\r\n });\r\n }\r\n \r\n this.errors.set(newErrors);\r\n this.errorsChange.emit(newErrors);\r\n this.validChange.emit(false);\r\n }\r\n }\r\n\r\n /**\r\n * Format JSON with proper indentation\r\n */\r\n formatJson(): void {\r\n if (!this.jsonString().trim()) {\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(this.jsonString());\r\n const formatted = JSON.stringify(parsed, null, 2);\r\n this.jsonString.set(formatted);\r\n this.valueChange.emit(formatted);\r\n this.jsonObject.set(parsed);\r\n this.objectChange.emit(parsed);\r\n this.errors.set([]);\r\n this.errorsChange.emit([]);\r\n this.validChange.emit(true);\r\n } catch (error) {\r\n // Don't format if JSON is invalid\r\n console.warn('Cannot format invalid JSON');\r\n }\r\n }\r\n\r\n /**\r\n * Check if there's an error on a specific line\r\n */\r\n hasErrorOnLine(line: number): boolean {\r\n return this.errors().some(error => error.line === line);\r\n }\r\n\r\n /**\r\n * Get error ID for accessibility\r\n */\r\n errorId(): string {\r\n return `${this.editorId}-errors`;\r\n }\r\n\r\n /**\r\n * Focus the editor\r\n */\r\n focus(): void {\r\n this.jsonTextarea().nativeElement.focus();\r\n }\r\n\r\n /**\r\n * Clear the editor\r\n */\r\n clear(): void {\r\n this.jsonString.set('');\r\n this.jsonObject.set(null);\r\n this.errors.set([]);\r\n this.valueChange.emit('');\r\n this.objectChange.emit(null);\r\n this.errorsChange.emit([]);\r\n this.validChange.emit(true);\r\n }\r\n\r\n /**\r\n * Get current JSON object\r\n */\r\n getValue(): object | null {\r\n return this.jsonObject();\r\n }\r\n\r\n /**\r\n * Get current JSON string\r\n */\r\n getStringValue(): string {\r\n return this.jsonString();\r\n }\r\n\r\n /**\r\n * Check if JSON is valid\r\n */\r\n isValidJson(): boolean {\r\n return this.isValid();\r\n }\r\n\r\n /**\r\n * Get validation errors\r\n */\r\n getErrors(): JsonEditorError[] {\r\n return this.errors();\r\n }\r\n\r\n // ControlValueAccessor methods\r\n writeValue(value: string | object | null | undefined): void {\r\n if (value === null || value === undefined) {\r\n this.jsonString.set('');\r\n this.jsonObject.set(null);\r\n } else if (typeof value === 'string') {\r\n this.jsonString.set(value);\r\n this.parseJson(value);\r\n } else if (typeof value === 'object') {\r\n this.jsonObject.set(value);\r\n this.jsonString.set(JSON.stringify(value, null, 2));\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n private onChange: (value: string) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n} ","/*\n * Public API Surface of cloud-ide-element\n * Here we can add what need to be exported from library\n */\n\nexport * from './lib/elements/input/input.component';\nexport * from './lib/elements/button/cide-ele-button.component';\nexport * from './lib/elements/spinner/spinner.component';\nexport * from './lib/elements/icon/icon.component';\nexport * from './lib/elements/select/select.component';\nexport * from './lib/elements/tab/cide-ele-tab.component';\nexport * from './lib/elements/file-input/file-input.component';\nexport * from './lib/elements/textarea/textarea.component';\nexport * from './lib/utils/services/elements/elements.service';\nexport * from './lib/utils/directives/resizer/resizer.directive';\nexport * from './lib/utils/directives/tooltip/tooltip.directive';\nexport * from './lib/components/skeleton-loader/skeleton-loader.component';\n\n// Data Grid Component and Types\nexport * from './lib/components/data-grid/data-grid.component';\nexport * from './lib/components/data-grid/data-grid.types';\n\n// Dropdown Component and Service\nexport * from './lib/components/dropdown/dropdown.component';\nexport * from './lib/services/dropdown-manager.service';\n\n// Confirmation and Notification System\nexport * from './lib/services/confirmation.service';\nexport * from './lib/services/notification.service';\nexport * from './lib/components/confirmation-modal/confirmation-modal.component';\nexport * from './lib/components/toast-notification/toast-notification.component';\nexport * from './lib/components/global-notifications/global-notifications.component';\n\n// JSON Editor Component\nexport * from './lib/components/json-editor/json-editor.component';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CideElementsService","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cloud-ide-element.mjs","sources":["../../../projects/cloud-ide-element/src/lib/utils/pipes/capitalize/capitalize.pipe.ts","../../../projects/cloud-ide-element/src/lib/utils/services/elements/elements.service.ts","../../../projects/cloud-ide-element/src/lib/services/portal.service.ts","../../../projects/cloud-ide-element/src/lib/elements/input/input.component.ts","../../../projects/cloud-ide-element/src/lib/elements/input/input.component.html","../../../projects/cloud-ide-element/src/lib/elements/spinner/spinner.component.ts","../../../projects/cloud-ide-element/src/lib/elements/spinner/spinner.component.html","../../../projects/cloud-ide-element/src/lib/elements/button/cide-ele-button.component.ts","../../../projects/cloud-ide-element/src/lib/elements/button/cide-ele-button.component.html","../../../projects/cloud-ide-element/src/lib/elements/icon/icon.component.ts","../../../projects/cloud-ide-element/src/lib/elements/icon/icon.component.html","../../../projects/cloud-ide-element/src/lib/elements/select/select.component.ts","../../../projects/cloud-ide-element/src/lib/elements/select/select.component.html","../../../projects/cloud-ide-element/src/lib/elements/tab/cide-ele-tab.component.ts","../../../projects/cloud-ide-element/src/lib/elements/tab/cide-ele-tab.component.html","../../../projects/cloud-ide-element/src/lib/elements/file-input/file-input.component.ts","../../../projects/cloud-ide-element/src/lib/elements/file-input/file-input.component.html","../../../projects/cloud-ide-element/src/lib/elements/textarea/textarea.component.ts","../../../projects/cloud-ide-element/src/lib/elements/textarea/textarea.component.html","../../../projects/cloud-ide-element/src/lib/utils/directives/resizer/resizer.directive.ts","../../../projects/cloud-ide-element/src/lib/utils/directives/tooltip/tooltip.directive.ts","../../../projects/cloud-ide-element/src/lib/components/skeleton-loader/skeleton-loader.component.ts","../../../projects/cloud-ide-element/src/lib/components/skeleton-loader/skeleton-loader.component.html","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.types.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.component.ts","../../../projects/cloud-ide-element/src/lib/components/data-grid/data-grid.component.html","../../../projects/cloud-ide-element/src/lib/services/dropdown-manager.service.ts","../../../projects/cloud-ide-element/src/lib/components/dropdown/dropdown.component.ts","../../../projects/cloud-ide-element/src/lib/services/confirmation.service.ts","../../../projects/cloud-ide-element/src/lib/services/notification.service.ts","../../../projects/cloud-ide-element/src/lib/components/confirmation-modal/confirmation-modal.component.ts","../../../projects/cloud-ide-element/src/lib/components/toast-notification/toast-notification.component.ts","../../../projects/cloud-ide-element/src/lib/components/global-notifications/global-notifications.component.ts","../../../projects/cloud-ide-element/src/lib/components/json-editor/json-editor.component.ts","../../../projects/cloud-ide-element/src/public-api.ts","../../../projects/cloud-ide-element/src/cloud-ide-element.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'capitalize',\r\n standalone: true\r\n})\r\nexport class CapitalizePipe implements PipeTransform {\r\n\r\n transform(\r\n value: string,\r\n capitalizationMethod: 'allUpperCase' | 'titleCase' | 'sentenceCase'\r\n ): string {\r\n if (value) {\r\n if (capitalizationMethod === 'allUpperCase') {\r\n return value.toUpperCase();\r\n } else if (capitalizationMethod === 'titleCase') {\r\n const splitString = value\r\n .split(' ')\r\n .map((s) => `${s[0].toUpperCase()}${s.slice(1)}`);\r\n return splitString.join(' ');\r\n } else if (capitalizationMethod === 'sentenceCase') {\r\n const splitString = value.split('.').map((s) => {\r\n const trimmedString = s.trim();\r\n if (trimmedString.length > 0) {\r\n return `${trimmedString[0].toUpperCase()}${trimmedString.slice(1)}`;\r\n }\r\n return '';\r\n });\r\n return splitString.join('. ');\r\n }\r\n }\r\n return '';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { GetElementDataRequest, ICoreSype } from 'cloud-ide-lms-model';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideElementsService {\r\n cide_element_data: { [key: string]: ICoreSype } = {};\r\n is_cide_element_data_updated: BehaviorSubject<boolean> = new BehaviorSubject(false);\r\n async getElementData(body: GetElementDataRequest): Promise<ICoreSype> {\r\n return new Promise<ICoreSype>((resolve) => {\r\n const cide_element_data = this.cide_element_data[body?.sype_key];\r\n if (cide_element_data) {\r\n resolve(cide_element_data);\r\n } else {\r\n const subscription = this.is_cide_element_data_updated?.subscribe({\r\n next: (is_cide_element_data_updated: boolean) => {\r\n if (is_cide_element_data_updated) {\r\n const cide_element_data = this.cide_element_data[body?.sype_key];\r\n if (cide_element_data) {\r\n subscription?.unsubscribe();\r\n resolve(cide_element_data);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n })\r\n }\r\n}\r\n","import { Injectable, TemplateRef, ViewContainerRef, EmbeddedViewRef } from '@angular/core';\r\n\r\nexport interface PortalPosition {\r\n top: number;\r\n left: number;\r\n maxHeight?: number;\r\n maxWidth?: number;\r\n minWidth?: number;\r\n}\r\n\r\nexport interface PortalConfig {\r\n triggerElement: HTMLElement;\r\n content: string;\r\n className?: string;\r\n position?: 'bottom' | 'top' | 'auto';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n offsetX?: number;\r\n offsetY?: number;\r\n maxHeight?: number;\r\n minWidth?: number;\r\n closeOnClickOutside?: boolean;\r\n closeOnEscape?: boolean;\r\n}\r\n\r\nexport interface TemplatePortalConfig {\r\n triggerElement: HTMLElement;\r\n template: TemplateRef<any>;\r\n viewContainerRef: ViewContainerRef;\r\n context?: any;\r\n className?: string;\r\n position?: 'bottom' | 'top' | 'auto';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n offsetX?: number;\r\n offsetY?: number;\r\n maxHeight?: number;\r\n minWidth?: number;\r\n closeOnClickOutside?: boolean;\r\n closeOnEscape?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PortalService {\r\n private portals = new Map<string, HTMLElement>();\r\n private templatePortals = new Map<string, { element: HTMLElement; viewRef: EmbeddedViewRef<any> }>();\r\n private boundClickOutsideHandler: (event: Event) => void;\r\n private boundEscapeHandler: (event: KeyboardEvent) => void;\r\n private closeCallbacks = new Map<string, () => void>();\r\n\r\n constructor() {\r\n this.boundClickOutsideHandler = this.handleClickOutside.bind(this);\r\n this.boundEscapeHandler = this.handleEscape.bind(this);\r\n }\r\n\r\n /**\r\n * Create a portal with the given configuration\r\n */\r\n createPortal(id: string, config: PortalConfig): HTMLElement {\r\n // Clean up any existing portal with the same ID\r\n this.destroyPortal(id);\r\n\r\n // Calculate position\r\n const position = this.calculatePosition(config);\r\n\r\n // Create portal element\r\n const portal = document.createElement('div');\r\n portal.id = `portal-${id}`;\r\n portal.className = `cide-portal ${config.className || ''}`;\r\n portal.style.position = 'fixed';\r\n portal.style.top = `${position.top}px`;\r\n portal.style.left = `${position.left}px`;\r\n portal.style.zIndex = '9999';\r\n \r\n if (position.maxHeight) {\r\n portal.style.maxHeight = `${position.maxHeight}px`;\r\n portal.style.overflowY = 'auto';\r\n }\r\n \r\n if (position.maxWidth) {\r\n portal.style.maxWidth = `${position.maxWidth}px`;\r\n }\r\n \r\n if (position.minWidth) {\r\n portal.style.minWidth = `${position.minWidth}px`;\r\n }\r\n\r\n // Set content\r\n portal.innerHTML = config.content;\r\n\r\n // Append to body\r\n document.body.appendChild(portal);\r\n\r\n // Store portal reference\r\n this.portals.set(id, portal);\r\n\r\n // Set up event listeners if needed\r\n if (config.closeOnClickOutside || config.closeOnEscape) {\r\n this.setupEventListeners(id, config);\r\n }\r\n\r\n // Adjust position if portal goes outside viewport\r\n this.adjustPosition(portal, config.triggerElement);\r\n\r\n return portal;\r\n }\r\n\r\n /**\r\n * Create a template-based portal with Angular template\r\n */\r\n createTemplatePortal(id: string, config: TemplatePortalConfig): HTMLElement {\r\n // Clean up any existing portal with the same ID\r\n this.destroyPortal(id);\r\n\r\n // Calculate position\r\n const position = this.calculatePosition({\r\n triggerElement: config.triggerElement,\r\n content: '', // Not used for template portals\r\n position: config.position,\r\n align: config.align,\r\n offsetX: config.offsetX,\r\n offsetY: config.offsetY,\r\n maxHeight: config.maxHeight,\r\n minWidth: config.minWidth\r\n });\r\n\r\n // Create the view from template\r\n const viewRef = config.viewContainerRef.createEmbeddedView(config.template, config.context);\r\n viewRef.detectChanges();\r\n\r\n // Create portal container element\r\n const portal = document.createElement('div');\r\n portal.id = `portal-${id}`;\r\n portal.className = `cide-portal ${config.className || ''}`;\r\n portal.style.position = 'fixed';\r\n portal.style.top = `${position.top}px`;\r\n portal.style.left = `${position.left}px`;\r\n portal.style.zIndex = '9999';\r\n \r\n if (position.maxHeight) {\r\n portal.style.maxHeight = `${position.maxHeight}px`;\r\n portal.style.overflowY = 'auto';\r\n }\r\n \r\n if (position.maxWidth) {\r\n portal.style.maxWidth = `${position.maxWidth}px`;\r\n }\r\n \r\n if (position.minWidth) {\r\n portal.style.minWidth = `${position.minWidth}px`;\r\n }\r\n\r\n // Append template nodes to portal\r\n viewRef.rootNodes.forEach(node => {\r\n portal.appendChild(node);\r\n });\r\n\r\n // Append to body\r\n document.body.appendChild(portal);\r\n\r\n // Store template portal reference\r\n this.templatePortals.set(id, { element: portal, viewRef });\r\n\r\n // Set up event listeners if needed\r\n if (config.closeOnClickOutside || config.closeOnEscape) {\r\n this.setupEventListeners(id, {\r\n triggerElement: config.triggerElement,\r\n content: '',\r\n closeOnClickOutside: config.closeOnClickOutside,\r\n closeOnEscape: config.closeOnEscape\r\n });\r\n }\r\n\r\n // Adjust position if portal goes outside viewport\r\n this.adjustPosition(portal, config.triggerElement);\r\n\r\n return portal;\r\n }\r\n\r\n /**\r\n * Update portal content\r\n */\r\n updatePortal(id: string, content: string): void {\r\n const portal = this.portals.get(id);\r\n if (portal) {\r\n portal.innerHTML = content;\r\n }\r\n }\r\n\r\n /**\r\n * Update portal position\r\n */\r\n updatePortalPosition(id: string, config: PortalConfig): void {\r\n const portal = this.portals.get(id);\r\n if (portal) {\r\n const position = this.calculatePosition(config);\r\n portal.style.top = `${position.top}px`;\r\n portal.style.left = `${position.left}px`;\r\n this.adjustPosition(portal, config.triggerElement);\r\n }\r\n }\r\n\r\n /**\r\n * Destroy a portal\r\n */\r\n destroyPortal(id: string): void {\r\n // Handle regular portals\r\n const portal = this.portals.get(id);\r\n if (portal && portal.parentNode) {\r\n portal.parentNode.removeChild(portal);\r\n this.portals.delete(id);\r\n this.closeCallbacks.delete(id);\r\n return;\r\n }\r\n\r\n // Handle template portals\r\n const templatePortal = this.templatePortals.get(id);\r\n if (templatePortal) {\r\n if (templatePortal.element && templatePortal.element.parentNode) {\r\n templatePortal.element.parentNode.removeChild(templatePortal.element);\r\n }\r\n templatePortal.viewRef.destroy();\r\n this.templatePortals.delete(id);\r\n this.closeCallbacks.delete(id);\r\n }\r\n }\r\n\r\n /**\r\n * Destroy all portals\r\n */\r\n destroyAllPortals(): void {\r\n this.portals.forEach((_, id) => this.destroyPortal(id));\r\n this.templatePortals.forEach((_, id) => this.destroyPortal(id));\r\n }\r\n\r\n /**\r\n * Register a close callback for a portal\r\n */\r\n registerCloseCallback(id: string, callback: () => void): void {\r\n this.closeCallbacks.set(id, callback);\r\n }\r\n\r\n /**\r\n * Get portal element by ID\r\n */\r\n getPortal(id: string): HTMLElement | undefined {\r\n const portal = this.portals.get(id);\r\n if (portal) return portal;\r\n \r\n const templatePortal = this.templatePortals.get(id);\r\n return templatePortal?.element;\r\n }\r\n\r\n /**\r\n * Check if portal exists\r\n */\r\n hasPortal(id: string): boolean {\r\n return this.portals.has(id) || this.templatePortals.has(id);\r\n }\r\n\r\n private calculatePosition(config: PortalConfig): PortalPosition {\r\n const rect = config.triggerElement.getBoundingClientRect();\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n };\r\n\r\n const offsetX = config.offsetX || 0;\r\n const offsetY = config.offsetY || 4;\r\n const estimatedHeight = config.maxHeight || 300;\r\n const estimatedWidth = config.minWidth || rect.width;\r\n\r\n let top = rect.bottom + window.scrollY + offsetY;\r\n let left = rect.left + window.scrollX + offsetX;\r\n\r\n // Auto-detect position if needed\r\n if (config.position === 'auto' || !config.position) {\r\n const spaceBelow = viewport.height - rect.bottom;\r\n const spaceAbove = rect.top;\r\n \r\n if (spaceBelow < estimatedHeight && spaceAbove > estimatedHeight) {\r\n // Open upward\r\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\r\n }\r\n } else if (config.position === 'top') {\r\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\r\n }\r\n\r\n // Auto-detect horizontal alignment\r\n if (config.align === 'auto' || !config.align) {\r\n const spaceRight = viewport.width - rect.left;\r\n const spaceLeft = rect.right;\r\n \r\n if (spaceRight < estimatedWidth && spaceLeft > estimatedWidth) {\r\n // Align to right edge of trigger\r\n left = rect.right + window.scrollX - estimatedWidth;\r\n }\r\n } else if (config.align === 'right') {\r\n left = rect.right + window.scrollX - estimatedWidth;\r\n } else if (config.align === 'center') {\r\n left = rect.left + window.scrollX + (rect.width / 2) - (estimatedWidth / 2);\r\n }\r\n\r\n return {\r\n top,\r\n left,\r\n maxHeight: config.maxHeight,\r\n minWidth: config.minWidth\r\n };\r\n }\r\n\r\n private adjustPosition(portal: HTMLElement, triggerElement: HTMLElement): void {\r\n const portalRect = portal.getBoundingClientRect();\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n };\r\n\r\n let adjustedLeft = parseInt(portal.style.left);\r\n let adjustedTop = parseInt(portal.style.top);\r\n\r\n // Adjust horizontal position if portal goes outside viewport\r\n if (portalRect.right > viewport.width) {\r\n const triggerRect = triggerElement.getBoundingClientRect();\r\n adjustedLeft = triggerRect.right + window.scrollX - portalRect.width;\r\n }\r\n if (portalRect.left < 0) {\r\n adjustedLeft = window.scrollX + 4; // Small margin from edge\r\n }\r\n\r\n // Adjust vertical position if portal goes outside viewport\r\n if (portalRect.bottom > viewport.height) {\r\n const triggerRect = triggerElement.getBoundingClientRect();\r\n adjustedTop = triggerRect.top + window.scrollY - portalRect.height - 4;\r\n }\r\n if (portalRect.top < 0) {\r\n adjustedTop = window.scrollY + 4; // Small margin from top\r\n }\r\n\r\n portal.style.left = `${adjustedLeft}px`;\r\n portal.style.top = `${adjustedTop}px`;\r\n }\r\n\r\n private setupEventListeners(id: string, config: PortalConfig): void {\r\n // Set up event listeners only once\r\n if (this.portals.size === 1) {\r\n if (config.closeOnClickOutside) {\r\n document.addEventListener('click', this.boundClickOutsideHandler);\r\n }\r\n if (config.closeOnEscape) {\r\n document.addEventListener('keydown', this.boundEscapeHandler);\r\n }\r\n }\r\n }\r\n\r\n private cleanupEventListeners(): void {\r\n // Clean up event listeners when no portals exist\r\n if (this.portals.size === 0) {\r\n document.removeEventListener('click', this.boundClickOutsideHandler);\r\n document.removeEventListener('keydown', this.boundEscapeHandler);\r\n }\r\n }\r\n\r\n private handleClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n \r\n // Handle regular portals\r\n this.portals.forEach((portal, id) => {\r\n const callback = this.closeCallbacks.get(id);\r\n if (callback && !portal.contains(target)) {\r\n // Check if click is on trigger element\r\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\r\n if (!triggerElement || !triggerElement.contains(target)) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n // Handle template portals\r\n this.templatePortals.forEach((templatePortal, id) => {\r\n const callback = this.closeCallbacks.get(id);\r\n if (callback && !templatePortal.element.contains(target)) {\r\n // Check if click is on trigger element\r\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\r\n if (!triggerElement || !triggerElement.contains(target)) {\r\n callback();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private handleEscape(event: KeyboardEvent): void {\r\n if (event.key === 'Escape') {\r\n // Close the most recently opened portal\r\n const portalIds = Array.from(this.portals.keys());\r\n const templatePortalIds = Array.from(this.templatePortals.keys());\r\n const allPortalIds = [...portalIds, ...templatePortalIds];\r\n const lastPortalId = allPortalIds[allPortalIds.length - 1];\r\n \r\n if (lastPortalId) {\r\n const callback = this.closeCallbacks.get(lastPortalId);\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, forwardRef, inject, ViewChild, TemplateRef, ViewContainerRef, EmbeddedViewRef } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\r\nimport { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';\r\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\r\nimport { autocapitalizeType, autocompleteType, controlType, elementStyleType, inputType, labelDirType, labelPlacementType, themeSize } from 'cloud-ide-lms-model';\r\nimport { PortalService } from '../../services/portal.service';\r\n\r\n/** @description type to register error related to control */\r\nexport type ErrorValidationStatus = {\r\n maxlength?: string,\r\n minlength?: string,\r\n required?: string,\r\n}\r\nexport type ValidationStatus = {\r\n validation: ErrorValidationStatus,\r\n status: boolean\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-input',\r\n standalone: true,\r\n templateUrl: './input.component.html',\r\n styleUrl: './input.component.scss',\r\n imports: [\r\n // directives\r\n CommonModule,\r\n // for ngModel\r\n FormsModule\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideInputComponent),\r\n multi: true\r\n },\r\n /** @description to apply validations */\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: forwardRef(() => CideInputComponent),\r\n },\r\n CapitalizePipe\r\n ]\r\n})\r\n\r\nexport class CideInputComponent implements ControlValueAccessor, Validator, OnChanges, OnInit, OnDestroy {\r\n\r\n // Modern Angular v20 dependency injection pattern\r\n public capitalizePipe = inject(CapitalizePipe);\r\n private elementService = inject(CideElementsService);\r\n\r\n constructor() {\r\n // Modern Angular v20 pattern: Use constructor for initialization only\r\n // Validate control\r\n this.onValidate();\r\n }\r\n /*=======Set custom controls inputs to set components=========*/\r\n\r\n /** \r\n * @description to se the visual of control like solid control offerd by material design or outline with a border\r\n * @options solid | outline | standard\r\n */\r\n @Input() fill: elementStyleType = 'outline';\r\n /** @description Lable of control (Title), Like Name, Email */\r\n @Input() label: string = \"\";\r\n /** @description to hide and show label */\r\n @Input() labelHide: boolean = false;\r\n /** @description is control Editable or Disabled */\r\n @Input() disabled: boolean = false;\r\n /** @description Is Clear Input Cross button is visible or not */\r\n @Input() clearInput: boolean = false;\r\n /** @description Position of Label 'floating' | 'fixed' */\r\n @Input() labelPlacement: labelPlacementType = \"fixed\";\r\n /** @description Lable direction from start of contrl or end of control */\r\n @Input() labelDir: labelDirType = \"start\";\r\n /** @description Place holder for control to display if there is no value */\r\n @Input() placeholder: string = \"\";\r\n /** @description it is to set leading icon, at the start of control */\r\n @Input() leadingIcon: string = \"\";\r\n /** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon */\r\n @Input() trailingIcon: string = \"\";\r\n /** @description to display below the control for suggestion, if there is any error then error will bw the first to shoe in place of help text */\r\n @Input() helperText: string = \"\";\r\n /** @description default true to collapse when there is no help text or error text, if false then element area in DOM will be reserved never detroy */\r\n @Input() helperTextCollapse: boolean = true;\r\n /** @description show and hide helper text its forecfull */\r\n @Input() hideHelperAndErrorText: boolean = false;\r\n /** @description if found any error in control the error thext will be used to display error message, if there is help text still error text is having higher priority then helptext */\r\n @Input() errorText: string = \"\";\r\n /** @description maxlength for control */\r\n @Input() maxlength: number = 0;\r\n /** @description minlength for control */\r\n @Input() minlength: number = 0;\r\n /** @description is control is required or not input type is true | false */\r\n @Input() required: boolean = false;\r\n /** @description Auto capatalization for the value and applicable to word or to complete sentance */\r\n @Input() autocapitalize: autocapitalizeType = \"off\";\r\n /** @description auto complete type to help reader what is the type of value */\r\n @Input() autocomplete: autocompleteType = \"off\";\r\n /** @description type of control */\r\n @Input() type: controlType = 'text';\r\n /** @description width of control, default width is 100% */\r\n @Input() width: string = '100%';\r\n /** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */\r\n @Input() id: string = '';\r\n /** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */\r\n @Input() ngModel: inputType = '';\r\n @Input() option: string[] = [\"anksuh\", \"bhure\"];\r\n /** @description min value for number type control or min date for date type control */\r\n @Input() min: number | string = 0;\r\n /** @description max value for number type control or max date for date type control */\r\n @Input() max: number | string = 0;\r\n /**\r\n * @description\r\n * Holds the size of the component like Small, Extra small, Large\r\n * by Default it takes small size\r\n * or the size set by the project setup service\r\n * or it will beset for individual component\r\n * \r\n * Size Appled \r\n * Component level then setup service then finally default md\r\n * Options: \"2xs\" | \"\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \r\n */\r\n @Input() size: themeSize = \"sm\";\r\n /** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */\r\n @Output() ngModelChange: EventEmitter<inputType> = new EventEmitter<inputType>();\r\n\r\n /*\r\n internal Properties for input\r\n */\r\n /** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */\r\n public isNgModel: boolean = this.ngModel ? true : false;\r\n /** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular */\r\n public isValid: boolean = true;\r\n /** @description when control is touched then the will maid true by the us to check it is touched or not, when we will set this true we will call the onTouched callback method of angualr to inform angular that somthis is changed and control is touched */\r\n public isTouched: boolean = false;\r\n /** @description we will take type of control in type but is may be not exactly which input's type so we need to get type and set actule type to our input, also when type is set password but in calse view in textt then inuut type need to change to text */\r\n public typeInternal: controlType = \"text\";\r\n /** @description if traling is set the it is assigned by it, but some case tarling icon not as it is set need tro be changed at runtime, like password visibility hide and show */\r\n public trailingIconInternal: string = \"\";\r\n\r\n /* \r\n Properties connected with trailingIconInternal \r\n */\r\n public isTrailingIconAllwedClick: boolean = false;\r\n\r\n // Properties connected with id\r\n public idRandom: string = this.randomString();\r\n\r\n // Date picker properties\r\n public showDatePicker: boolean = false;\r\n public showMonthYearSelector: boolean = false;\r\n public currentMonth: number = new Date().getMonth();\r\n public currentYear: number = new Date().getFullYear();\r\n public selectedDate: Date | null = null;\r\n public calendarDays: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }[] = [];\r\n public monthNames: string[] = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December'\r\n ];\r\n public shortMonthNames: string[] = [\r\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\r\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\r\n ];\r\n private portalService = inject(PortalService);\r\n private datePickerPortalId = `date-picker-${this.randomString()}`;\r\n private viewContainerRef = inject(ViewContainerRef);\r\n \r\n // ViewChild for date picker template\r\n @ViewChild('datePickerTemplate', { static: true }) datePickerTemplate!: TemplateRef<any>;\r\n private datePickerViewRef: EmbeddedViewRef<any> | null = null;\r\n\r\n // ==================================METHODS FOR CUSTOM FORM COMPONENT=============================\r\n // FOR ANGULAR CALLED BY UI\r\n\r\n /** \r\n * @description Function to call when the HTML Chnage to tell Angular somthing is changed.\r\n * @field value : inputType\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private onChange = (value: inputType) => { };\r\n\r\n /** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */\r\n onTouched = () => { };\r\n\r\n /** @description Function to call when the input is need to Validate to tell Angular somthing is changed (in case of some input dipendent validation). */\r\n onValidate = () => { };\r\n\r\n /**\r\n * @description\r\n * Method that performs synchronous validation against the provided control.\r\n * Exicuted by Angular\r\n *\r\n * @param control The control to validate against.\r\n *\r\n * @returns A map of validation errors if validation fails,\r\n * otherwise null.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n const validation_error = this.isControlValid(this.ngModel);\r\n if (validation_error?.status) {\r\n return validation_error;\r\n } else {\r\n return null;\r\n }\r\n }\r\n /**\r\n * @description\r\n * Registers a callback function to call when the validator inputs change.\r\n * Exicuted by Angular\r\n *\r\n * @param fn The callback function\r\n */\r\n registerOnValidatorChange?(fn: () => void): void {\r\n this.onValidate = fn;\r\n }\r\n\r\n /** @description when form control change from model side this method is implemented */\r\n writeValue(value: inputType): void {\r\n if (!this.isNgModel) {\r\n const ngModel = this.autoCapitalizeByOption(value, this.type);\r\n console.log('writeValue', this.ngModel, ngModel);\r\n this.ngModel = ngModel;\r\n }\r\n }\r\n /** @description Allows Angular to register a function to call when the model changes. */\r\n // Save the function as a property to call later here.\r\n registerOnChange(fn: (value: inputType) => void): void {\r\n this.onChange = fn;\r\n }\r\n /** @description Allows Angular to register a function to call when the input has been touched. */\r\n // Save the function as a property to call later here.\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n //==========================================================================\r\n\r\n /*\r\n Methods for input\r\n*/\r\n\r\n /** @description Detect wether input propertires canged or not */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes?.['value']) {\r\n this.isNgModel = true;\r\n this.ngModel = this.processValue(this.ngModel, this.type);\r\n }\r\n if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {\r\n this.isControlValid(this.ngModel);\r\n }\r\n\r\n // Ditect type change\r\n if (changes?.['type']) {\r\n this.detectTypeChange();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.id) {\r\n this.getControlData();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up date picker portal\r\n this.portalService.destroyPortal(this.datePickerPortalId);\r\n }\r\n\r\n /** @description custom method run when HTML changes, we call method registerd by angular to detect change */\r\n upDateValue(value: { target: { value: inputType } } | Event) {\r\n const target = value.target as HTMLInputElement | { value: inputType };\r\n this.isControlValid(target?.value);\r\n const updatedValue = this.processValue(target?.value, this.type);\r\n this.ngModel = updatedValue;\r\n this.ngModelChange?.emit(updatedValue);\r\n // console.log(target)\r\n this.onChange(updatedValue);\r\n }\r\n\r\n /**\r\n * @description method applicable in case of control type checkbox\r\n * \r\n * @param value boolean | string\r\n */\r\n updateValueCheckBox(value: string | boolean) {\r\n // Convert string to boolean\r\n this.ngModel = !this.ngModel;\r\n value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);\r\n this.ngModelChange?.emit(value);\r\n this.onChange(value);\r\n }\r\n\r\n /** @description clear the value */\r\n ClearInputValue() {\r\n if (this.type == \"text\") {\r\n this.upDateValue({ target: { value: \"\" } });\r\n }\r\n }\r\n\r\n /** @description when HTML is focuesd */\r\n focusControl() {\r\n this.isTouched = true;\r\n this.onTouched();\r\n this.onValidate();\r\n }\r\n\r\n /** @description If control value need to be processed, like UPPERCASE */\r\n processValue(value: inputType, type: controlType) {\r\n value = this.autoCapitalizeByOption(value, type);\r\n if (type === 'date' && typeof value === 'string' && value) {\r\n // Ensure date is in YYYY-MM-DD format\r\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n if (dateRegex.test(value) && !isNaN(Date.parse(value))) {\r\n return value; // Already in correct format\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n /** @description for capitalization */\r\n autoCapitalizeByOption(value: inputType, type: controlType) {\r\n if (type == 'text') {\r\n if (this.autocapitalize == \"on\") {\r\n return this.capitalizePipe?.transform(value as string, 'allUpperCase');\r\n }\r\n if (this.autocapitalize == \"words\") {\r\n return this.capitalizePipe?.transform(value as string, 'titleCase');\r\n }\r\n if (this.autocapitalize == \"sentences\") {\r\n return this.capitalizePipe?.transform(value as string, \"sentenceCase\");\r\n }\r\n }\r\n return value;\r\n }\r\n\r\n /** @description It is used to return the value is valid or not */\r\n isValidValueAndType(value: inputType, type: controlType) {\r\n if (type == 'text') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else if (type == 'date') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n // Validate date format (YYYY-MM-DD)\r\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n return dateRegex.test(value) && !isNaN(Date.parse(value));\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /** @description to check control is valid or not */\r\n isControlValid(value: inputType): ValidationStatus {\r\n const validation_status: ValidationStatus = {\r\n validation: {},\r\n status: false\r\n };\r\n\r\n if (this.required) {\r\n if (!value) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `required!`;\r\n }\r\n }\r\n\r\n if (this.type == 'text') {\r\n if (typeof (value) == 'string') {\r\n if (this.maxlength > 0) {\r\n if (value?.length > this.maxlength) {\r\n validation_status.status = true;\r\n validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;\r\n }\r\n }\r\n if (this.minlength > 0) {\r\n if (value?.length < this.minlength) {\r\n validation_status.status = true;\r\n validation_status.validation.minlength = `minimum length is ${this.minlength}!`;\r\n }\r\n }\r\n } else {\r\n validation_status.status = true;\r\n validation_status.validation.required = `required!`;\r\n }\r\n } else if (this.type == 'date') {\r\n if (typeof (value) == 'string' && value) {\r\n // Validate date format and parse\r\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\r\n if (!dateRegex.test(value)) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Invalid date format (YYYY-MM-DD)!`;\r\n } else {\r\n const parsedDate = Date.parse(value);\r\n if (isNaN(parsedDate)) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Invalid date!`;\r\n } else {\r\n // Validate min date\r\n if (this.min && typeof this.min === 'string') {\r\n const minDate = Date.parse(this.min);\r\n if (!isNaN(minDate) && parsedDate < minDate) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Date must be after ${this.min}!`;\r\n }\r\n }\r\n // Validate max date\r\n if (this.max && typeof this.max === 'string') {\r\n const maxDate = Date.parse(this.max);\r\n if (!isNaN(maxDate) && parsedDate > maxDate) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Date must be before ${this.max}!`;\r\n }\r\n }\r\n }\r\n }\r\n } else if (this.required && !value) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Date is required!`;\r\n }\r\n }\r\n this.isValid = !validation_status.status;\r\n this.errorText = Object.values(validation_status.validation).at(0) || ''\r\n return validation_status;\r\n }\r\n\r\n /** @description Allows Angular to disable the input. */\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n /** @description Method for trailing Icon Click */\r\n trailingIconClick() {\r\n if (this.type === 'password') {\r\n if (this.typeInternal === 'password') {\r\n this.typeInternal = 'text';\r\n this.trailingIconInternal = 'visibility';\r\n } else {\r\n this.typeInternal = 'password';\r\n this.trailingIconInternal = 'visibility_off';\r\n }\r\n } else if (this.type === 'date') {\r\n // Toggle custom date picker using portal service\r\n this.showDatePicker = !this.showDatePicker;\r\n if (this.showDatePicker) {\r\n this.initializeDatePicker();\r\n this.createDatePickerUsingPortal();\r\n } else {\r\n this.closeDatePicker();\r\n }\r\n } else {\r\n this.typeInternal = this.type;\r\n }\r\n }\r\n\r\n /**\r\n * Method to generate Random String\r\n * @param setupPrarameter { lenght: number, prefix: string }\r\n * default lenght is 10, prefox is \"\"\r\n * @returns string\r\n */\r\n randomString(setupPrarameter: { lenght: number, prefix: string } = { lenght: 10, prefix: \"\" }): string {\r\n //variable consisting alphabets in small and capital letter \r\n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\r\n //loop to select a new character in each iteration \r\n let random_string = setupPrarameter?.prefix || \"\";\r\n for (let i = 0; i < setupPrarameter?.lenght; i++) {\r\n const rnum = Math.floor(Math.random() * characters.length);\r\n random_string += characters.substring(rnum, rnum + 1);\r\n }\r\n //return the generated string \r\n return random_string;\r\n }\r\n\r\n async getControlData() {\r\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\r\n if (cide_element_data) {\r\n this.label = cide_element_data?.sype_label as string;\r\n this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating') as labelPlacementType;\r\n this.type = (cide_element_data?.sype_type || 'text') as controlType;\r\n this.required = (cide_element_data?.sype_required || false) as boolean;\r\n this.size = (cide_element_data?.sype_size || 'md') as themeSize;\r\n this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false) as boolean;\r\n this.maxlength = (cide_element_data?.sype_max_length) as number;\r\n this.minlength = (cide_element_data?.sype_min_length) as number;\r\n this.leadingIcon = (cide_element_data?.sype_leading_icon) as string;\r\n this.labelHide = (cide_element_data?.sype_label_hide) as boolean;\r\n this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text) as boolean;\r\n this.detectTypeChange();\r\n // Validate control\r\n this.onValidate();\r\n }\r\n }\r\n\r\n /**\r\n * @description use to detact the change in type if changes done this method is ued to run\r\n */\r\n detectTypeChange() {\r\n if (this.type === 'password') {\r\n this.typeInternal = \"password\";\r\n this.trailingIconInternal = \"visibility_off\";\r\n this.isTrailingIconAllwedClick = true;\r\n } else if (this.type === 'date') {\r\n this.typeInternal = \"date\";\r\n // Set default calendar icon if no trailing icon specified\r\n this.trailingIconInternal = this.trailingIcon || \"calendar_today\";\r\n this.isTrailingIconAllwedClick = true; // Allow clicking calendar icon\r\n } else {\r\n this.typeInternal = this.type;\r\n this.trailingIconInternal = this.trailingIcon;\r\n }\r\n }\r\n\r\n /**\r\n * @description Format date to YYYY-MM-DD format (for form submission)\r\n */\r\n formatDate(date: Date | string): string {\r\n if (typeof date === 'string') {\r\n date = new Date(date);\r\n }\r\n if (date instanceof Date && !isNaN(date.getTime())) {\r\n const year = date.getFullYear();\r\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\r\n const day = date.getDate().toString().padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * @description Format date for display as \"DD/MMM/YYYY\" (e.g., \"20/Jun/2025\")\r\n */\r\n formatDateForDisplay(date: Date | string): string {\r\n if (typeof date === 'string') {\r\n date = new Date(date);\r\n }\r\n if (date instanceof Date && !isNaN(date.getTime())) {\r\n const day = date.getDate().toString().padStart(2, '0');\r\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\r\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n const month = monthNames[date.getMonth()];\r\n const year = date.getFullYear();\r\n return `${day}/${month}/${year}`;\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * @description Get display value for date input\r\n */\r\n getDateDisplayValue(): string {\r\n if (this.ngModel && typeof this.ngModel === 'string') {\r\n return this.formatDateForDisplay(this.ngModel);\r\n }\r\n return '';\r\n }\r\n\r\n /**\r\n * @description Initialize date picker with current values\r\n */\r\n initializeDatePicker(): void {\r\n // Set selected date from current value\r\n if (this.ngModel && typeof this.ngModel === 'string') {\r\n this.selectedDate = new Date(this.ngModel);\r\n if (!isNaN(this.selectedDate.getTime())) {\r\n this.currentMonth = this.selectedDate.getMonth();\r\n this.currentYear = this.selectedDate.getFullYear();\r\n }\r\n } else {\r\n this.selectedDate = null;\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n /**\r\n * @description Generate calendar days for current month\r\n */\r\n generateCalendar(): void {\r\n const firstDay = new Date(this.currentYear, this.currentMonth, 1);\r\n const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0);\r\n const startDate = new Date(firstDay);\r\n startDate.setDate(startDate.getDate() - firstDay.getDay()); // Start from Sunday\r\n\r\n const today = new Date();\r\n this.calendarDays = [];\r\n\r\n // Generate 42 days (6 weeks)\r\n for (let i = 0; i < 42; i++) {\r\n const currentDate = new Date(startDate);\r\n currentDate.setDate(startDate.getDate() + i);\r\n\r\n const isCurrentMonth = currentDate.getMonth() === this.currentMonth;\r\n const isSelected = this.selectedDate ? \r\n currentDate.toDateString() === this.selectedDate.toDateString() : false;\r\n const isToday = currentDate.toDateString() === today.toDateString();\r\n\r\n this.calendarDays.push({\r\n day: currentDate.getDate(),\r\n isCurrentMonth,\r\n isSelected,\r\n isToday,\r\n date: new Date(currentDate)\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @description Create date picker using template-based portal service\r\n */\r\n private createDatePickerUsingPortal(): void {\r\n // Reset to calendar view when opening\r\n this.showMonthYearSelector = false;\r\n\r\n // Get input element\r\n const inputElement = document.getElementById(this.id);\r\n if (!inputElement) return;\r\n\r\n // Create template portal configuration\r\n const portalConfig = {\r\n triggerElement: inputElement,\r\n template: this.datePickerTemplate,\r\n viewContainerRef: this.viewContainerRef,\r\n context: {}, // Template can access component properties directly\r\n className: 'cide-date-picker-portal',\r\n position: 'bottom' as const,\r\n align: 'left' as const,\r\n offsetY: 4,\r\n minWidth: 320,\r\n maxHeight: 400,\r\n closeOnClickOutside: true,\r\n closeOnEscape: true\r\n };\r\n\r\n // Create the template portal\r\n this.portalService.createTemplatePortal(this.datePickerPortalId, portalConfig);\r\n\r\n // Register close callback\r\n this.portalService.registerCloseCallback(this.datePickerPortalId, () => {\r\n this.closeDatePicker();\r\n });\r\n\r\n // Set data attribute for click outside detection\r\n inputElement.setAttribute('data-portal-trigger', this.datePickerPortalId);\r\n }\r\n\r\n /**\r\n * @description Close date picker\r\n */\r\n closeDatePicker(): void {\r\n this.showDatePicker = false;\r\n this.showMonthYearSelector = false;\r\n this.portalService.destroyPortal(this.datePickerPortalId);\r\n }\r\n\r\n /**\r\n * @description Navigate to previous month\r\n */\r\n previousMonth(): void {\r\n if (this.currentMonth === 0) {\r\n this.currentMonth = 11;\r\n this.currentYear--;\r\n } else {\r\n this.currentMonth--;\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n /**\r\n * @description Navigate to next month\r\n */\r\n nextMonth(): void {\r\n if (this.currentMonth === 11) {\r\n this.currentMonth = 0;\r\n this.currentYear++;\r\n } else {\r\n this.currentMonth++;\r\n }\r\n this.generateCalendar();\r\n }\r\n\r\n /**\r\n * @description Navigate to previous year\r\n */\r\n previousYear(): void {\r\n this.currentYear--;\r\n }\r\n\r\n /**\r\n * @description Navigate to next year\r\n */\r\n nextYear(): void {\r\n this.currentYear++;\r\n }\r\n\r\n /**\r\n * @description Toggle between calendar and month/year selector\r\n */\r\n toggleMonthYearSelector(): void {\r\n this.showMonthYearSelector = !this.showMonthYearSelector;\r\n }\r\n\r\n /**\r\n * @description Select a month from the month selector\r\n */\r\n selectMonth(monthIndex: number): void {\r\n this.currentMonth = monthIndex;\r\n this.generateCalendar();\r\n this.showMonthYearSelector = false; // Return to calendar view\r\n }\r\n\r\n /**\r\n * @description Select a date from the calendar\r\n */\r\n selectDate(dayInfo: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }): void {\r\n if (!dayInfo.isCurrentMonth) return;\r\n\r\n // Set the selected date\r\n this.selectedDate = dayInfo.date;\r\n \r\n // Update the input value\r\n const formattedDate = dayInfo.date.toISOString().split('T')[0]; // YYYY-MM-DD format\r\n this.ngModel = formattedDate;\r\n this.ngModelChange?.emit(formattedDate);\r\n this.onChange(formattedDate);\r\n \r\n // Regenerate calendar to update selection\r\n this.generateCalendar();\r\n \r\n // Close date picker\r\n this.closeDatePicker();\r\n }\r\n\r\n\r\n\r\n\r\n\r\n}\r\n","<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD | DATE------------------------------------------>\r\n @if (type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'tel' || type === 'date') {\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n 'cide-element-input-number': (type === 'number')\r\n }\">\r\n <!-- label -->\r\n @if (label && !labelHide) {\r\n <label [for]=\"id\" class=\"cide-input-label\">{{label}}</label>\r\n }\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n @if (leadingIcon) {\r\n <span class=\"cide-input-leading-icon-wrapper\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n }\r\n\r\n <!-- Trailing icon -->\r\n @if (trailingIconInternal) {\r\n <span class=\"tw-absolute cide-input-trailing-icon tw-select-none tw-right-0\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n }\r\n\r\n <!-- Clear -->\r\n @if (clearInput && ngModel) {\r\n <button class=\"cide-input-clear\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n }\r\n\r\n <!-- Date Input Wrapper -->\r\n @if (type === 'date') {\r\n <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\r\n <!-- Date Input (read-only to prevent manual input) -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [value]=\"getDateDisplayValue()\" type=\"text\" readonly (focus)=\"focusControl()\" (click)=\"trailingIconClick()\"\r\n [autocomplete]=\"autocomplete\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none tw-cursor-pointer\" />\r\n \r\n <!-- Placeholder overlay for empty date -->\r\n @if (!ngModel && placeholder) {\r\n <div class=\"cide-input-date-overlay\">\r\n {{placeholder}}\r\n </div>\r\n }\r\n\r\n <!-- Date picker is now rendered as a portal appended to body -->\r\n </div>\r\n }\r\n\r\n <!-- Regular Input (non-date) -->\r\n @if (type !== 'date') {\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n }\r\n </div>\r\n <!-- error text / helper text -->\r\n @if ((errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText) {\r\n <span class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}\r\n </span>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n @if (type === 'checkbox') {\r\n <div class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n @if (!labelHide) {\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\">{{label}}</span>\r\n }\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n @if (type === 'select') {\r\n <div>sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n\r\n<!-- Date Picker Template -->\r\n<ng-template #datePickerTemplate>\r\n <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4\">\r\n <!-- Date Picker Header -->\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-4\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\r\n (click)=\"previousMonth()\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">chevron_left</span>\r\n </button>\r\n \r\n <button \r\n type=\"button\" \r\n class=\"tw-text-lg tw-font-semibold tw-text-gray-800 hover:tw-bg-gray-100 tw-px-3 tw-py-1 tw-rounded-md tw-transition-colors\"\r\n (click)=\"toggleMonthYearSelector()\">\r\n {{ monthNames[currentMonth] }} {{ currentYear }}\r\n </button>\r\n \r\n <button \r\n type=\"button\" \r\n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\r\n (click)=\"nextMonth()\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">chevron_right</span>\r\n </button>\r\n </div>\r\n\r\n <!-- Month/Year Selector -->\r\n @if (showMonthYearSelector) {\r\n <div class=\"tw-mb-4\">\r\n <!-- Year Navigation -->\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\r\n (click)=\"previousYear()\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">keyboard_double_arrow_left</span>\r\n </button>\r\n <span class=\"tw-text-lg tw-font-semibold tw-text-gray-800\">{{ currentYear }}</span>\r\n <button \r\n type=\"button\" \r\n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\r\n (click)=\"nextYear()\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">keyboard_double_arrow_right</span>\r\n </button>\r\n </div>\r\n \r\n <!-- Month Grid -->\r\n <div class=\"tw-grid tw-grid-cols-3 tw-gap-2 tw-mb-3\">\r\n @for (monthName of shortMonthNames; track $index) {\r\n <button \r\n type=\"button\"\r\n class=\"tw-px-3 tw-py-2 tw-text-sm tw-rounded-md tw-transition-colors tw-text-center\"\r\n [class.tw-bg-blue-500]=\"$index === currentMonth\"\r\n [class.tw-text-white]=\"$index === currentMonth\"\r\n [class.tw-text-gray-700]=\"$index !== currentMonth\"\r\n [class.hover:tw-bg-blue-50]=\"$index !== currentMonth\"\r\n (click)=\"selectMonth($index)\">\r\n {{ monthName }}\r\n </button>\r\n }\r\n </div>\r\n \r\n <!-- Back to Calendar Button -->\r\n <div class=\"tw-text-center\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-px-3 tw-py-1 tw-text-sm tw-text-blue-600 hover:tw-bg-blue-50 tw-rounded-md tw-transition-colors\"\r\n (click)=\"toggleMonthYearSelector()\">\r\n Back to Calendar\r\n </button>\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Calendar View -->\r\n <div>\r\n <!-- Days of Week Header -->\r\n <div class=\"tw-grid tw-grid-cols-7 tw-gap-1 tw-mb-2\">\r\n @for (dayName of ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; track dayName) {\r\n <div class=\"tw-text-center tw-text-xs tw-font-medium tw-text-gray-500 tw-py-2\">\r\n {{ dayName }}\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Calendar Days -->\r\n <div class=\"tw-grid tw-grid-cols-7 tw-gap-1\">\r\n @for (dayInfo of calendarDays; track dayInfo.date.getTime()) {\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-text-sm tw-rounded-md tw-transition-colors tw-flex tw-items-center tw-justify-center\"\r\n [class.tw-text-gray-400]=\"!dayInfo.isCurrentMonth\"\r\n [class.tw-text-gray-900]=\"dayInfo.isCurrentMonth\"\r\n [class.tw-bg-blue-500]=\"dayInfo.isSelected\"\r\n [class.tw-text-white]=\"dayInfo.isSelected\"\r\n [class.tw-bg-blue-100]=\"dayInfo.isToday && !dayInfo.isSelected\"\r\n [class.tw-text-blue-800]=\"dayInfo.isToday && !dayInfo.isSelected\"\r\n [class.hover:tw-bg-blue-50]=\"dayInfo.isCurrentMonth && !dayInfo.isSelected\"\r\n (click)=\"selectDate(dayInfo)\">\r\n {{ dayInfo.day }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Date Picker Footer -->\r\n <div class=\"tw-flex tw-justify-between tw-mt-4 tw-pt-3 tw-border-t tw-border-gray-200\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-px-3 tw-py-1 tw-text-sm tw-text-gray-600 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors\"\r\n (click)=\"closeDatePicker()\">\r\n Cancel\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"tw-px-3 tw-py-1 tw-text-sm tw-bg-blue-500 tw-text-white hover:tw-bg-blue-600 tw-rounded-md tw-transition-colors\"\r\n (click)=\"closeDatePicker()\">\r\n Done\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { spinnerType, themeSize } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-ele-spinner',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './spinner.component.html',\r\n styleUrl: './spinner.component.scss'\r\n})\r\nexport class CideSpinnerComponent {\r\n /**\r\n * @description\r\n * Holds the size of the component like Small, Extra small, Large\r\n * by Default it takes small size\r\n * or the size set by the project setup service\r\n * or it will beset for individual component\r\n * \r\n * Size Appled \r\n * Component level then setup service then finally default md\r\n * Options: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \r\n */\r\n @Input() size: themeSize = \"sm\";\r\n @Input() type: spinnerType = \"pill-spinner\";\r\n}\r\n","@if (type === \"spinner\") {\r\n<svg class=\"cide-spinner tw-m-auto\"\r\n [ngClass]=\"{'tw-max-w-6 tw-p-1': (size === 'xs'), 'tw-max-w-10 tw-p-2': (size === 'sm')}\" viewBox=\"0 0 24 24\">\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n <circle class=\"cide-spinner__value\" cx=\"12\" cy=\"12\" r=\"10\" />\r\n</svg>\r\n}\r\n@else {\r\n<div class=\"cide-pill-loader tw-select-none\" [ngClass]=\"{'tw-h-4': (size === 'xs')}\">\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n <div class=\"cide-pill\" [ngClass]=\"{'tw-w-1 cide-pill-xs': (size === 'xs')}\"></div>\r\n</div>\r\n}","import { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideElementsService } from '../../../public-api';\r\nimport { CideSpinnerComponent } from '../spinner/spinner.component';\r\nimport { NavigationExtras, Router } from '@angular/router';\r\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\r\n\r\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'text' | 'link' | 'success' | 'danger' | 'warning' | 'info' | 'ghost';\r\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\nexport type ButtonType = 'button' | 'submit' | 'reset';\r\nexport type ButtonShape = 'default' | 'rounded' | 'pill' | 'square';\r\nexport type ButtonElevation = 'none' | 'low' | 'medium' | 'high';\r\n\r\n/**\r\n * Advanced Angular button component that provides a comprehensive button implementation\r\n * with loading state, styling variants, animations, tooltips, and other features.\r\n * \r\n * This component uses proper Angular templating to avoid hydration issues (NG0500).\r\n */\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'button[cideEleButton], a[cideEleButton]',\r\n standalone: true,\r\n imports: [CommonModule, CideSpinnerComponent],\r\n templateUrl: './cide-ele-button.component.html',\r\n styleUrls: ['./cide-ele-button.component.scss'],\r\n host: {\r\n 'class': 'cide-button tw-rounded-md tw-text-white tw-py-0.5 tw-select-none tw-justify-around tw-flex',\r\n '[class.cide-button-disabled]': 'disabled || loading',\r\n '[attr.disabled]': '(disabled || loading) ? true : null',\r\n '[class.primary]': 'variant === \"primary\"',\r\n '[class.secondary]': 'variant === \"secondary\"',\r\n '[class.outline]': 'variant === \"outline\"',\r\n '[class.text]': 'variant === \"text\"',\r\n '[class.link]': 'variant === \"link\"',\r\n '[class.success]': 'variant === \"success\"',\r\n '[class.danger]': 'variant === \"danger\"',\r\n '[class.warning]': 'variant === \"warning\"',\r\n '[class.info]': 'variant === \"info\"',\r\n '[class.xs]': 'size === \"xs\"',\r\n '[class.sm]': 'size === \"sm\"',\r\n '[class.md]': 'size === \"md\"',\r\n '[class.lg]': 'size === \"lg\"',\r\n '[class.xl]': 'size === \"xl\"',\r\n '[class.rounded]': 'shape === \"rounded\"',\r\n '[class.pill]': 'shape === \"pill\"',\r\n '[class.square]': 'shape === \"square\"',\r\n '[class.elevation-none]': 'elevation === \"none\"',\r\n '[class.elevation-low]': 'elevation === \"low\"',\r\n '[class.elevation-medium]': 'elevation === \"medium\"',\r\n '[class.elevation-high]': 'elevation === \"high\"',\r\n '[attr.type]': 'type',\r\n '[attr.aria-label]': 'ariaLabel',\r\n '[attr.aria-disabled]': 'disabled || loading',\r\n '[attr.data-testid]': 'testId',\r\n '[attr.title]': 'tooltip',\r\n '[class]': 'customClass'\r\n }\r\n})\r\n\r\nexport class CideEleButtonComponent implements OnInit, OnChanges, OnDestroy {\r\n private destroy$ = new Subject<void>();\r\n private clickCount = 0;\r\n private clickDebouncer$ = new Subject<Event>();\r\n\r\n constructor(\r\n private elementService: CideElementsService,\r\n private router: Router,\r\n private renderer: Renderer2,\r\n private elementRef: ElementRef\r\n ) {\r\n // Setup debounced click handler to prevent double-clicks\r\n this.clickDebouncer$\r\n .pipe(\r\n debounceTime(300),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe({\r\n next: (event) => {\r\n this.handleClick(event);\r\n }\r\n });\r\n }\r\n \r\n // INPUTS\r\n /** \r\n * @description Label of button like Submit, Update, Add, etc. \r\n * Note: it is only used in case you did not set label between tags (via ng-content)\r\n */\r\n @Input() label: string = \"\";\r\n \r\n /** @description Button style variant */\r\n @Input() variant: ButtonVariant = 'primary';\r\n \r\n /** @description Button size */\r\n @Input() size: ButtonSize = 'md';\r\n \r\n /** @description Button HTML type attribute */\r\n @Input() type: ButtonType = 'button';\r\n \r\n /** @description Button shape */\r\n @Input() shape: ButtonShape = 'default';\r\n \r\n /** @description Button shadow elevation */\r\n @Input() elevation: ButtonElevation = 'medium';\r\n \r\n /** @description Button disabled state */\r\n @Input() disabled: boolean | null = false;\r\n \r\n /** @description Unique ID of control, used to differentiate elements */\r\n @Input() id: string = '';\r\n \r\n /** @description Enables loading state with spinner */\r\n @Input() loading: boolean = false;\r\n \r\n /** @description Makes button take full width of container */\r\n @Input() fullWidth: boolean = false;\r\n \r\n /** @description Icon to display on the left side of the button */\r\n @Input() leftIcon: string = '';\r\n \r\n /** @description Icon to display on the right side of the button */\r\n @Input() rightIcon: string = '';\r\n \r\n /** @description Additional CSS classes to apply */\r\n @Input() customClass: string = '';\r\n \r\n /** @description Tooltip text to display on hover */\r\n @Input() tooltip: string = '';\r\n \r\n /** @description Aria label for accessibility */\r\n @Input() ariaLabel: string = '';\r\n \r\n /** @description Test ID for automated testing */\r\n @Input() testId: string = '';\r\n \r\n /** @description Route to navigate to when clicked (for link buttons) */\r\n @Input() routerLink: string | unknown[] = '';\r\n \r\n /** @description Router navigation extras */\r\n @Input() routerExtras: NavigationExtras = {};\r\n \r\n /** @description Prevent multiple rapid clicks (debounce) */\r\n @Input() preventDoubleClick: boolean = true;\r\n \r\n /** @description Animation on click */\r\n @Input() animated: boolean = true;\r\n \r\n // OUTPUTS\r\n /**\r\n * @description Click event of button\r\n */\r\n @Output() btnClick: EventEmitter<Event> = new EventEmitter();\r\n \r\n /**\r\n * @description Double click event\r\n */\r\n @Output() doubleClick: EventEmitter<Event> = new EventEmitter();\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(event: Event): void {\r\n if (this.disabled || this.loading) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n return;\r\n }\r\n \r\n if (this.animated) {\r\n this.addClickAnimation();\r\n }\r\n \r\n if (this.preventDoubleClick) {\r\n this.clickDebouncer$.next(event);\r\n } else {\r\n this.handleClick(event);\r\n }\r\n }\r\n \r\n private handleClick(event: Event): void {\r\n // Handle navigation for routerLink\r\n if (this.routerLink && this.routerLink.length) {\r\n event.preventDefault();\r\n this.router.navigate(\r\n Array.isArray(this.routerLink) ? this.routerLink : [this.routerLink],\r\n this.routerExtras\r\n );\r\n }\r\n \r\n // Handle double-click detection\r\n this.clickCount++;\r\n setTimeout(() => {\r\n if (this.clickCount === 2) {\r\n this.doubleClick.emit(event);\r\n }\r\n this.clickCount = 0;\r\n }, 300);\r\n \r\n // Emit standard click event\r\n this.btnClick.emit(event);\r\n }\r\n \r\n private addClickAnimation(): void {\r\n // Add ripple effect\r\n const ripple = this.renderer.createElement('span');\r\n this.renderer.addClass(ripple, 'ripple-effect');\r\n \r\n // Position the ripple at click position\r\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\r\n const size = Math.max(rect.width, rect.height);\r\n \r\n // Set ripple style\r\n this.renderer.setStyle(ripple, 'width', `${size}px`);\r\n this.renderer.setStyle(ripple, 'height', `${size}px`);\r\n this.renderer.setStyle(ripple, 'left', `${0}px`);\r\n this.renderer.setStyle(ripple, 'top', `${0}px`);\r\n \r\n // Add ripple to button\r\n this.renderer.appendChild(this.elementRef.nativeElement, ripple);\r\n \r\n // Modern ES2022+ pattern: Use Promise-based delay\r\n const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\r\n delay(600).then(() => {\r\n this.renderer.removeChild(this.elementRef.nativeElement, ripple);\r\n });\r\n }\r\n\r\n ngOnInit(): void {\r\n if (this.id) {\r\n this.getControlData();\r\n }\r\n \r\n // Set aria-label if not explicitly provided\r\n if (!this.ariaLabel && this.label) {\r\n this.ariaLabel = this.label;\r\n }\r\n }\r\n \r\n ngOnChanges(changes: SimpleChanges): void {\r\n // Update aria-label when label changes\r\n if (changes['label'] && !this.ariaLabel) {\r\n this.ariaLabel = changes['label'].currentValue;\r\n }\r\n }\r\n \r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n async getControlData() {\r\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\r\n if (cide_element_data) {\r\n this.label = cide_element_data?.sype_label as string;\r\n }\r\n }\r\n}\r\n","<!-- Button content container -->\r\n<div class=\"tw-flex tw-items-center tw-justify-center cide-ele-btn-content tw-w-full\">\r\n <!-- Left icon -->\r\n @if (leftIcon) {\r\n <span class=\"tw-icon-container tw-mr-2\">\r\n <i class=\"tw-text-base material-symbols-outlined\">{{leftIcon}}</i>\r\n </span>\r\n }\r\n \r\n <!-- Loading spinner -->\r\n @if (loading) {\r\n <cide-ele-spinner\r\n class=\"tw-inline-block tw-my-1 tw-mr-2\" \r\n size=\"xs\"\r\n [ngClass]=\"{'cide-pill-disabled': (disabled || loading)}\">\r\n </cide-ele-spinner>\r\n }\r\n \r\n <!-- Button label or content -->\r\n @if (label) {\r\n <span>{{ label }}</span>\r\n } @else {\r\n <span class=\"tw-flex tw-items-center tw-justify-center\">\r\n <ng-content></ng-content>\r\n </span>\r\n }\r\n \r\n <!-- Right icon -->\r\n @if (rightIcon) {\r\n <span class=\"tw-icon-container tw-ml-2\">\r\n <i class=\"tw-text-base material-symbols-outlined\">{{rightIcon}}</i>\r\n </span>\r\n }\r\n \r\n <!-- Spacer for spinner when loading to maintain button width -->\r\n @if (loading) {\r\n <span class=\"tw-w-6 tw-p-1 tw-mr-2\"></span>\r\n }\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { iconType, themeSize } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-ele-icon',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './icon.component.html',\r\n styleUrl: './icon.component.css',\r\n host: {\r\n '[class.mpro-icon-field]': \"type === 'box'\"\r\n }\r\n})\r\nexport class CideIconComponent {\r\n @Input() size: themeSize = \"xs\";\r\n @Input() type: iconType = \"round\";\r\n @Input() toolTip: string = \"\";\r\n}\r\n","<button class=\"cide-icon tw-m-1 tw-inline-block tw-outline-none tw-relative\" [ngClass]=\"{\r\n 'tw-h-[35px] tw-w-[35px]': (size === 'lg'), \r\n 'tw-h-[27px] tw-w-[27px]': (size === 'md'), \r\n 'tw-h-[23px] tw-w-[23px]': (size === 'sm'), \r\n 'tw-h-[19px] tw-w-[19px] !tw-m-[2px]': (size === 'xs'), \r\n 'tw-h-[14px] tw-w-[14px] !tw-m-[1px] cide-icon-2xs': (size === '2xs'), \r\n 'tw-h-[11px] tw-w-[11px] !tw-m-[1px] cide-icon-3xs': (size === '3xs'), \r\n 'tw-rounded-2xl' : (type === 'round'), 'tw-rounded-[0.2rem]' : (type === 'box') , \r\n 'tw-h-[15px] tw-w-[15px] none-type !tw-m-0': (type === 'none'),\r\n 'cide-tooltip': (toolTip),\r\n }\">\r\n <span class=\"cide-tooltip-content\">{{toolTip}}</span>\r\n\r\n <span class=\"material-symbols-outlined tw-absolute tw-top-0 tw-left-0 tw-right-0 tw-bottom-0\"\r\n [ngClass]=\"{'tw-text-[25px] -tw-ml-[1.5px] -tw-mt-[1px]': (size === 'sm'), 'tw-text-[18px] -tw-ml-[0.5px] tw-mt-[0.5px]' : (size === 'xs'), 'tw-text-[15px] -tw-ml-[0.5px] tw-mt-[0px] tw-block' : (size === '2xs'), 'tw-text-[11px] -tw-ml-[0px] tw-mt-[0px] tw-block' : (size === '3xs')}\"><ng-content></ng-content></span>\r\n</button>","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef, ContentChildren, QueryList, AfterContentInit, ElementRef, ViewChild, OnDestroy } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType, selectSearchType } from 'cloud-ide-lms-model';\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\n@Component({\n selector: 'cide-ele-select-option',\n standalone: true,\n template: '<ng-content></ng-content>'\n})\nexport class CideSelectOptionComponent {\n @Input() value: string | number = '';\n @Input() disabled: boolean = false;\n\n get label(): string {\n return this.elementRef?.nativeElement?.textContent?.trim() || '';\n }\n\n constructor(private elementRef: ElementRef) { }\n}\n\n@Component({\n selector: 'cide-ele-select',\n standalone: true,\n templateUrl: './select.component.html',\n styleUrl: './select.component.scss',\n imports: [CommonModule, FormsModule, CideSelectOptionComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CideSelectComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: forwardRef(() => CideSelectComponent),\n }\n ]\n})\nexport class CideSelectComponent implements ControlValueAccessor, Validator, OnInit, OnChanges, AfterContentInit, OnDestroy {\n @ContentChildren(CideSelectOptionComponent) optionComponents!: QueryList<CideSelectOptionComponent>;\n @ViewChild('searchInput', { static: false }) searchInputRef!: ElementRef<HTMLInputElement>;\n @Input() label: string = '';\n @Input() labelHide: boolean = false;\n @Input() placeholder: string = 'Select an option';\n @Input() helperText: string = '';\n @Input() errorText: string = '';\n @Input() required: boolean = false;\n @Input() disabled: boolean = false;\n @Input() id: string = '';\n @Input() ngModel: string | number = '';\n @Input() size: themeSize = 'sm';\n @Input() fill: elementStyleType = 'outline';\n @Input() labelPlacement: labelPlacementType = 'fixed';\n @Input() labelDir: labelDirType = 'start';\n @Input() leadingIcon: string = '';\n @Input() trailingIcon: string = '';\n @Input() clearInput: boolean = false;\n @Input() options: SelectOption[] = [];\n @Input() multiple: boolean = false;\n @Input() searchable: boolean = false;\n @Input() showSearchInput: boolean = true;\n @Input() loading: boolean = false;\n\n @Output() ngModelChange = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('change') selectionChange = new EventEmitter<SelectOption>();\n @Output() searchChange = new EventEmitter<selectSearchType>();\n\n isOpen: boolean = false;\n isTouched = false;\n isValid = true;\n searchTerm: string = '';\n filteredOptions: SelectOption[] = [];\n dropdownPosition: 'bottom' | 'top' = 'bottom';\n private isDropdownInteraction = false;\n \n // Debug tracking properties\n private debugId = Math.random().toString(36).substr(2, 9);\n private timeoutIds: ReturnType<typeof setTimeout>[] = [];\n private interactionCount = 0;\n private maxInteractionCount = 10; // Prevent infinite loops\n\n constructor(private elementRef: ElementRef) {}\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onChange = (value: string | number ) => { };\n onTouched = () => { };\n onValidate = () => { };\n\n ngOnInit(): void {\n this.filteredOptions = [...this.options];\n this.validateValue(this.ngModel);\n console.log(`🔍 SELECT [${this.debugId}] Initialized with ${this.options.length} options`);\n window.addEventListener('resize', this.onWindowResize.bind(this));\n }\n\n ngAfterContentInit(): void {\n if (this.options.length === 0 && this.optionComponents) {\n this.options = this.optionComponents.map(option => ({\n value: option.value,\n label: option.label,\n disabled: option.disabled\n }));\n this.filteredOptions = [...this.options];\n }\n console.log(`🔍 SELECT [${this.debugId}] After content init with ${this.options.length} options`);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['ngModel']) {\n this.validateValue(this.ngModel);\n if (!this.options.find(option => option?.value === this.ngModel)) {\n this.searchChange.emit({\n query: \"\",\n value: this.ngModel // emit raw value for external handlers\n });\n }\n }\n if (changes['options']) {\n this.filterOptions();\n }\n }\n\n writeValue(value: string | number ): void {\n this.ngModel = value;\n this.validateValue(value);\n }\n\n registerOnChange(fn: (value: string | number ) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n return this.validateValue(control.value);\n }\n\n validateValue(value: string | number ): ValidationErrors | null {\n if (this.required) {\n const isEmpty = (v: unknown) => v === null || v === undefined || v === '' || (typeof v === 'string' && v.trim() === '');\n if (isEmpty(value)) {\n this.isValid = false;\n return { required: 'This field is required' };\n }\n }\n this.isValid = true;\n return null;\n }\n\n toggleDropdown(): void {\n try {\n this.logDebug('toggleDropdown called', { disabled: this.disabled, isOpen: this.isOpen });\n if (!this.disabled) {\n this.isOpen = !this.isOpen;\n this.logDebug('Dropdown toggled', { newState: this.isOpen });\n if (this.isOpen) {\n this.calculateDropdownPosition();\n this.focusControl();\n this.searchTerm = '';\n this.filterOptions();\n this.logDebug('Dropdown opened, search term reset');\n } else {\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n this.logDebug('Dropdown closed, interaction flags reset');\n }\n } else {\n this.logDebug('Dropdown toggle blocked - component disabled');\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] toggleDropdown error:`, error);\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n }\n }\n\n // Cleanup method to prevent memory leaks\n ngOnDestroy(): void {\n this.clearTimeouts();\n window.removeEventListener('resize', this.onWindowResize.bind(this));\n this.logDebug('Component destroyed, timeouts cleared');\n }\n\n private onWindowResize(): void {\n if (this.isOpen) {\n this.calculateDropdownPosition();\n }\n }\n\n private calculateDropdownPosition(): void {\n try {\n const element = this.elementRef?.nativeElement;\n if (!element) {\n this.dropdownPosition = 'bottom';\n console.log('No element found, defaulting to bottom');\n return;\n }\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const dropdownHeight = Math.min(this.options.length * 40 + 100, 250);\n const spaceBelow = viewportHeight - rect.bottom;\n const spaceAbove = rect.top;\n const buffer = 30;\n if (spaceBelow < (dropdownHeight + buffer) && spaceAbove > dropdownHeight) {\n this.dropdownPosition = 'top';\n } else {\n this.dropdownPosition = 'bottom';\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] calculateDropdownPosition error:`, error);\n this.dropdownPosition = 'bottom';\n }\n }\n\n selectOption(option: SelectOption): void {\n try {\n this.logDebug('selectOption called', { option, disabled: option.disabled, multiple: this.multiple });\n if (option.disabled) return;\n\n if (this.multiple) {\n // Parse current CSV value to array\n const currentCsv = this.ngModel as string || '';\n const current = currentCsv ? currentCsv.split(',').map(v => v.trim()).filter(Boolean) : [];\n const idx = current.findIndex(v => v.toString() === option.value.toString());\n \n if (idx >= 0) {\n current.splice(idx, 1);\n } else {\n current.push(option.value.toString());\n }\n \n // Convert back to CSV\n const newCsv = current.join(',');\n this.ngModel = newCsv;\n this.onChange(newCsv);\n this.ngModelChange.emit(newCsv);\n this.selectionChange.emit(option);\n this.validateValue(newCsv);\n this.isTouched = true;\n this.onTouched();\n // Do not close dropdown in multi-select mode\n } else {\n this.ngModel = option.value;\n this.onChange(option.value);\n this.ngModelChange.emit(option.value);\n this.selectionChange.emit(option);\n this.validateValue(option.value);\n this.isOpen = false;\n this.isTouched = true;\n this.onTouched();\n }\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] selectOption error:`, error);\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n }\n }\n\n onBlur(): void {\n try {\n this.logDebug('onBlur called', { isOpen: this.isOpen, isDropdownInteraction: this.isDropdownInteraction });\n this.isTouched = true;\n this.onTouched();\n this.interactionCount++;\n if (this.interactionCount > this.maxInteractionCount) {\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n return;\n }\n this.addTimeout(() => {\n try {\n if (!this.isDropdownInteraction && !this.multiple) {\n this.isOpen = false;\n this.searchTerm = '';\n this.filterOptions();\n }\n this.interactionCount = 0;\n } catch (error) {\n this.isOpen = false;\n this.interactionCount = 0;\n }\n }, 150);\n } catch {\n this.isOpen = false;\n this.interactionCount = 0;\n }\n }\n\n focusControl(): void {\n try {\n if (this.searchable && this.isOpen) {\n this.addTimeout(() => {\n try {\n if (this.searchInputRef && this.searchInputRef.nativeElement) {\n this.searchInputRef.nativeElement.focus();\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\n }\n }, 100);\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\n }\n }\n\n clearSelection(): void {\n this.ngModel = '';\n this.onChange('');\n this.ngModelChange.emit('');\n this.validateValue('');\n }\n\n getSelectedOptionLabel(): string {\n if (this.multiple) {\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return '';\n const values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n const labels = values\n .map(v => this.options.find(o => o.value.toString() === v)?.label)\n .filter((l): l is string => typeof l === 'string');\n return labels.join(', ');\n }\n const selectedOption = this.options.find(option => option.value === this.ngModel);\n return selectedOption ? selectedOption.label : '';\n }\n\n filterOptions(): void {\n try {\n if (!this.searchable || !this.searchTerm) {\n this.filteredOptions = [...this.options];\n } else {\n this.filteredOptions = this.options.filter(option =>\n option.label.toLowerCase().includes(this.searchTerm.toLowerCase())\n );\n }\n } catch {\n this.filteredOptions = [...this.options];\n }\n }\n\n onSearchInput(event: Event): void {\n try {\n this.searchTerm = (event.target as HTMLInputElement).value;\n this.filterOptions();\n this.searchChange.emit({\n query: this.searchTerm,\n value: ''\n });\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] onSearchInput error:`, error);\n }\n }\n\n onDropdownMouseDown(): void {\n this.isDropdownInteraction = true;\n }\n\n onDropdownMouseUp(): void {\n this.addTimeout(() => {\n this.isDropdownInteraction = false;\n }, 200);\n }\n\n isOptionSelected(option: SelectOption): boolean {\n if (this.multiple) {\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return false;\n const values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n return values.includes(option.value.toString());\n }\n return option.value === this.ngModel;\n }\n\n trackByValue(index: number, option: SelectOption): string | number {\n return option.value;\n }\n\n // Debug helpers\n private logDebug(message: string, data?: unknown): void {\n console.log(`🔍 SELECT [${this.debugId}] ${message}`, data || '');\n }\n\n private clearTimeouts(): void {\n this.timeoutIds.forEach(id => { clearTimeout(id); });\n this.timeoutIds = [];\n }\n\n private addTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout> {\n const timeoutId = setTimeout(() => {\n try {\n callback();\n // remove executed timeout from tracking\n this.timeoutIds = this.timeoutIds.filter(id => id !== timeoutId);\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] Timeout callback error:`, error);\n }\n }, delay);\n this.timeoutIds.push(timeoutId);\n return timeoutId;\n }\n} ","<div class=\"cide-select\" [ngClass]=\"{\n 'cide-element-size-xxs': (size === '2xs'),\n 'cide-element-size-xs': (size === 'xs'),\n 'cide-element-size-sm': (size === 'sm'),\n 'cide-element-size-md': (size === 'md'),\n 'cide-element-size-lg': (size === 'lg'),\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\n 'cide-element-input-label-start': (labelDir === 'start'),\n 'cide-element-input-label-end': (labelDir === 'end'),\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\n 'cide-element-input-label-less': (!label || labelHide),\n 'cide-element-style-outline': (fill === 'outline'),\n 'cide-element-style-solid': (fill === 'solid'),\n 'cide-element-style-standard': (fill === 'standard'),\n}\">\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-select-label\">{{ label }}</label>\n\n <div class=\"cide-element-select-wrapper tw-relative\">\n <!-- Leading Icon -->\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n </span>\n\n <!-- Select Button -->\n <button type=\"button\" [id]=\"id\" [disabled]=\"disabled\" (click)=\"toggleDropdown()\" (blur)=\"onBlur()\" [ngClass]=\"[\n ((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md'),\n (!leadingIcon ? 'tw-pl-1' : ''),\n (trailingIcon || clearInput || loading ? 'tw-pr-8' : ''),\n (!trailingIcon && !clearInput && !loading ? 'tw-pr-1' : ''),\n ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')),\n (labelHide ? '!tw-mt-0' : ''),\n 'cide-select-button tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 tw-outline-none tw-text-left tw-cursor-pointer'\n ]\" class=\"cide-select-button\">\n\n <span class=\"cide-select-value\" [ngClass]=\"{'tw-text-gray-400': !ngModel}\">\n {{ ngModel ? getSelectedOptionLabel() : placeholder }}\n </span>\n </button>\n\n\n <!-- Trailing Icon (Dropdown Arrow or Loading Spinner) -->\n <span class=\"tw-absolute tw-top-1/2 tw-right-0 tw-transform -tw-translate-y-1/2 tw-select-none tw-z-10\"\n *ngIf=\"!clearInput || !ngModel || loading\">\n <!-- Loading Spinner -->\n <span *ngIf=\"loading\" class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-text-gray-500\">\n <svg class=\"tw-animate-spin tw-h-4 tw-w-4\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"tw-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </span>\n <!-- Dropdown Arrow -->\n <span *ngIf=\"!loading\" class=\"material-symbols-outlined tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center !tw-text-2xl tw-transition-transform tw-text-gray-500\"\n [ngClass]=\"{'tw-rotate-180': isOpen}\">\n expand_more\n </span>\n </span>\n\n <!-- Clear Button -->\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"clearSelection()\" type=\"button\">\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n </button>\n\n <!-- Dropdown Options -->\n <div\n class=\"cide-select-dropdown tw-absolute tw-left-0 tw-right-0 tw-z-50 tw-bg-white tw-border tw-border-gray-300 tw-rounded-md tw-shadow-lg tw-max-h-60 tw-overflow-y-auto\"\n *ngIf=\"isOpen\" [ngClass]=\"{\n 'tw-top-full tw-mt-1': dropdownPosition === 'bottom',\n 'tw-bottom-full tw-mb-1': dropdownPosition === 'top'\n }\">\n\n <!-- Search Input (if searchable and showSearchInput is true) -->\n <div *ngIf=\"searchable && showSearchInput\" class=\"tw-p-2 tw-border-b tw-border-gray-200\">\n <input type=\"text\" placeholder=\"Search options...\" [value]=\"searchTerm\" (input)=\"onSearchInput($event)\"\n (mousedown)=\"onDropdownMouseDown()\" (focus)=\"onDropdownMouseDown()\" (click)=\"$event.stopPropagation()\"\n class=\"tw-w-full tw-px-2 tw-py-1 tw-text-sm tw-border tw-border-gray-300 tw-rounded tw-outline-none focus:tw-border-blue-500\">\n </div>\n\n <!-- Options List -->\n <div class=\"tw-py-1\">\n <!-- Loading State -->\n <div *ngIf=\"loading\" class=\"tw-px-3 tw-py-4 tw-text-center\">\n <div class=\"tw-flex tw-items-center tw-justify-center tw-space-x-2\">\n <svg class=\"tw-animate-spin tw-h-4 tw-w-4 tw-text-gray-500\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"tw-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n <span class=\"tw-text-sm tw-text-gray-500\">Loading...</span>\n </div>\n </div>\n\n <!-- Options -->\n <ng-container *ngIf=\"!loading\">\n <button type=\"button\" *ngFor=\"let option of filteredOptions; trackBy: trackByValue\"\n (mousedown)=\"onDropdownMouseDown()\" (click)=\"selectOption(option)\" (keyup.enter)=\"selectOption(option)\"\n (keyup.space)=\"selectOption(option)\" [disabled]=\"option.disabled\" [ngClass]=\"{\n 'cide-select-option tw-w-full tw-text-left tw-px-3 tw-py-2 tw-text-sm tw-cursor-pointer tw-transition-colors hover:tw-bg-gray-100 tw-border-none tw-bg-transparent tw-outline-none': true,\n 'tw-bg-blue-50 tw-text-blue-700': isOptionSelected(option),\n 'tw-text-gray-400 tw-cursor-not-allowed': option.disabled\n }\" class=\"cide-select-option\">\n {{ option.label }}\n </button>\n </ng-container>\n\n <!-- No options message -->\n <div *ngIf=\"!loading && filteredOptions.length === 0\" class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic\">\n {{ searchable && searchTerm ? 'No options found' : 'No options available' }}\n </div>\n </div>\n </div>\n </div>\n\n <!-- Error/Helper Text -->\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-select-help-error-text\">\n {{ errorText || helperText }}\n </span>\n <span *ngIf=\"helperText && isValid\" class=\"cide-select-help-error-text\">\n {{ helperText }}\n </span>\n</div>","import { Component, Input, Output, EventEmitter, signal, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from \"../icon/icon.component\";\r\n\r\nexport interface TabItem {\r\n id: string;\r\n label: string;\r\n disabled?: boolean;\r\n icon?: string;\r\n badge?: string | number;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-tab',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n templateUrl: './cide-ele-tab.component.html',\r\n styleUrls: ['./cide-ele-tab.component.scss']\r\n})\r\nexport class CideEleTabComponent implements OnInit {\r\n @Input() tabs: TabItem[] = [];\r\n @Input() activeTabId?: string;\r\n @Input() size: 'sm' | 'md' | 'lg' = 'md';\r\n @Input() variant: 'default' | 'pills' | 'underline' = 'default';\r\n @Input() fullWidth = false;\r\n @Input() disabled = false;\r\n\r\n @Output() tabChange = new EventEmitter<TabItem>();\r\n\r\n activeTab = signal<string>('');\r\n\r\n ngOnInit() {\r\n // Set initial active tab\r\n if (this.activeTabId) {\r\n this.activeTab.set(this.activeTabId);\r\n } else if (this.tabs.length > 0) {\r\n const firstEnabledTab = this.tabs.find(tab => !tab.disabled);\r\n if (firstEnabledTab) {\r\n this.activeTab.set(firstEnabledTab.id);\r\n }\r\n }\r\n }\r\n\r\n onTabClick(tab: TabItem) {\r\n if (tab.disabled || this.disabled) return;\r\n \r\n this.activeTab.set(tab.id);\r\n this.tabChange.emit(tab);\r\n }\r\n\r\n isActive(tabId: string): boolean {\r\n return this.activeTab() === tabId;\r\n }\r\n\r\n getTabClasses(tab: TabItem): string {\r\n const baseClasses = 'cide-tab-item';\r\n const sizeClass = `cide-tab-${this.size}`;\r\n const variantClass = `cide-tab-${this.variant}`;\r\n const activeClass = this.isActive(tab.id) ? 'cide-tab-active' : '';\r\n const disabledClass = (tab.disabled || this.disabled) ? 'cide-tab-disabled' : '';\r\n \r\n return [baseClasses, sizeClass, variantClass, activeClass, disabledClass]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n\r\n getContainerClasses(): string {\r\n const baseClasses = 'cide-tab-container';\r\n const variantClass = `cide-tab-container-${this.variant}`;\r\n const fullWidthClass = this.fullWidth ? 'cide-tab-full-width' : '';\r\n \r\n return [baseClasses, variantClass, fullWidthClass]\r\n .filter(Boolean)\r\n .join(' ');\r\n }\r\n} ","<div [class]=\"getContainerClasses()\">\r\n @for (tab of tabs; track tab.id) {\r\n <button\r\n type=\"button\"\r\n [class]=\"getTabClasses(tab)\"\r\n [disabled]=\"tab.disabled || disabled\"\r\n (click)=\"onTabClick(tab)\"\r\n [attr.aria-selected]=\"isActive(tab.id)\"\r\n [attr.aria-controls]=\"'panel-' + tab.id\"\r\n role=\"tab\">\r\n \r\n @if (tab.icon) {\r\n <cide-ele-icon class=\"cide-tab-icon\">{{ tab.icon }}</cide-ele-icon>\r\n }\r\n \r\n <span class=\"cide-tab-label\">{{ tab.label }}</span>\r\n \r\n @if (tab.badge) {\r\n <span class=\"cide-tab-badge\">{{ tab.badge }}</span>\r\n }\r\n </button>\r\n }\r\n</div> ","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, forwardRef, OnDestroy } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'cide-ele-file-input',\n standalone: true,\n templateUrl: './file-input.component.html',\n styleUrl: './file-input.component.scss',\n imports: [CommonModule, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CideEleFileInputComponent),\n multi: true\n }\n ]\n})\nexport class CideEleFileInputComponent implements ControlValueAccessor, OnDestroy {\n @Input() label: string = 'Choose file';\n @Input() accept: string = '';\n @Input() multiple: boolean = false;\n @Input() disabled: boolean = false;\n @Input() helperText: string = '';\n @Input() errorText: string = '';\n @Input() showPreview: boolean = false;\n @Input() previewWidth: string = '200px';\n @Input() previewHeight: string = '200px';\n @Input() previewBoxMode: boolean = false;\n @Input() placeholderText: string = 'Click to select image';\n @Input() placeholderIcon: string = '📷';\n\n public id: string = Math.random().toString(36).substring(2, 10);\n\n @Output() fileChange = new EventEmitter<FileList | null>();\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n files: FileList | null = null;\n fileNames: string[] = [];\n previewUrls: string[] = [];\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private onChange = (files: FileList | null) => {};\n private onTouched = () => {};\n\n writeValue(files: FileList | null): void {\n this.files = files;\n this.fileNames = files ? Array.from(files).map(f => f.name) : [];\n this.generatePreviews();\n }\n\n registerOnChange(fn: (files: FileList | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onFileSelected(event: Event) {\n const input = event.target as HTMLInputElement;\n this.files = input.files;\n this.fileNames = this.files ? Array.from(this.files).map(f => f.name) : [];\n this.generatePreviews();\n this.onChange(this.files);\n this.fileChange.emit(this.files);\n this.onTouched();\n }\n\n clearFiles() {\n this.files = null;\n this.fileNames = [];\n this.clearPreviews();\n this.onChange(null);\n this.fileChange.emit(null);\n }\n\n private generatePreviews() {\n // Clear existing previews\n this.clearPreviews();\n\n if (!this.showPreview || !this.files) {\n return;\n }\n\n Array.from(this.files).forEach(file => {\n if (this.isImageFile(file)) {\n const reader = new FileReader();\n reader.onload = (e) => {\n if (e.target?.result) {\n this.previewUrls.push(e.target.result as string);\n }\n };\n reader.readAsDataURL(file);\n }\n });\n }\n\n private clearPreviews() {\n // Revoke object URLs to prevent memory leaks\n this.previewUrls.forEach(url => {\n if (url.startsWith('blob:')) {\n URL.revokeObjectURL(url);\n }\n });\n this.previewUrls = [];\n }\n\n private isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n }\n\n isImagePreviewAvailable(): boolean {\n return this.showPreview && this.previewUrls.length > 0;\n }\n\n removePreview(index: number) {\n if (this.files && this.files.length > index) {\n // Create new FileList without the removed file\n const dt = new DataTransfer();\n Array.from(this.files).forEach((file, i) => {\n if (i !== index) {\n dt.items.add(file);\n }\n });\n \n this.files = dt.files;\n this.fileNames = Array.from(this.files).map(f => f.name);\n \n // Remove the preview URL\n if (this.previewUrls[index] && this.previewUrls[index].startsWith('blob:')) {\n URL.revokeObjectURL(this.previewUrls[index]);\n }\n this.previewUrls.splice(index, 1);\n \n this.onChange(this.files);\n this.fileChange.emit(this.files);\n }\n }\n\n ngOnDestroy() {\n // Clean up preview URLs to prevent memory leaks\n this.clearPreviews();\n }\n\n triggerFileSelect() {\n const fileInput = document.getElementById('cide-file-input-' + this.id) as HTMLInputElement;\n if (fileInput && !this.disabled) {\n fileInput.click();\n }\n }\n\n isPreviewBoxMode(): boolean {\n return this.previewBoxMode && this.showPreview;\n }\n\n hasImages(): boolean {\n return this.previewUrls.length > 0;\n }\n} ","<div class=\"cide-file-input\">\n <!-- Label (shown when not in preview box mode or when preview box mode but no label override) -->\n <label *ngIf=\"label && !isPreviewBoxMode()\" class=\"cide-file-input-label\" [attr.for]=\"'cide-file-input-' + id\">{{ label }}</label>\n \n <!-- Preview Box Mode -->\n <div *ngIf=\"isPreviewBoxMode()\" class=\"cide-file-input-preview-box-container\">\n <!-- Hidden file input -->\n <input\n type=\"file\"\n [attr.id]=\"'cide-file-input-' + id\"\n [attr.accept]=\"accept\"\n [attr.multiple]=\"multiple ? true : null\"\n [disabled]=\"disabled\"\n (change)=\"onFileSelected($event)\"\n class=\"cide-file-input-hidden\"\n />\n \n <!-- Preview Box -->\n <div \n class=\"cide-file-input-preview-box\"\n [class.cide-file-input-preview-box-disabled]=\"disabled\"\n [class.cide-file-input-preview-box-has-image]=\"hasImages()\"\n [style.width]=\"previewWidth\"\n [style.height]=\"previewHeight\"\n (click)=\"triggerFileSelect()\"\n [attr.title]=\"disabled ? 'File selection disabled' : placeholderText\">\n \n <!-- No Image State -->\n <div *ngIf=\"!hasImages()\" class=\"cide-file-input-preview-box-placeholder\">\n <div class=\"cide-file-input-preview-box-icon\">{{ placeholderIcon }}</div>\n <div class=\"cide-file-input-preview-box-text\">{{ placeholderText }}</div>\n </div>\n \n <!-- Image Preview State -->\n <div *ngIf=\"hasImages()\" class=\"cide-file-input-preview-box-content\">\n <img \n [src]=\"previewUrls[0]\" \n [alt]=\"fileNames[0] || 'Preview image'\"\n class=\"cide-file-input-preview-box-image\">\n <div class=\"cide-file-input-preview-box-overlay\">\n <div class=\"cide-file-input-preview-box-overlay-text\">Click to change</div>\n </div>\n <button \n *ngIf=\"!disabled\"\n type=\"button\" \n class=\"cide-file-input-preview-box-remove\"\n (click)=\"clearFiles(); $event.stopPropagation()\"\n title=\"Remove image\">\n ×\n </button>\n </div>\n </div>\n \n <!-- File name display for preview box mode -->\n <div *ngIf=\"hasImages() && fileNames.length\" class=\"cide-file-input-preview-box-filename\">\n {{ fileNames[0] }}\n </div>\n </div>\n\n <!-- Standard Mode -->\n <div *ngIf=\"!isPreviewBoxMode()\" class=\"cide-file-input-wrapper\">\n <input\n type=\"file\"\n [attr.id]=\"'cide-file-input-' + id\"\n [attr.accept]=\"accept\"\n [attr.multiple]=\"multiple ? true : null\"\n [disabled]=\"disabled\"\n (change)=\"onFileSelected($event)\"\n class=\"cide-file-input-element\"\n />\n <button *ngIf=\"fileNames.length\" type=\"button\" class=\"cide-file-input-clear\" (click)=\"clearFiles()\">\n Clear\n </button>\n </div>\n <div *ngIf=\"fileNames.length && !isPreviewBoxMode()\" class=\"cide-file-input-files\">\n <span *ngFor=\"let name of fileNames\">{{ name }}</span>\n </div>\n \n <!-- Image Preview Section (only for standard mode) -->\n <div *ngIf=\"isImagePreviewAvailable() && !isPreviewBoxMode()\" class=\"cide-file-input-preview\">\n <div class=\"cide-file-input-preview-label\">Preview:</div>\n <div class=\"cide-file-input-preview-container\">\n <div \n *ngFor=\"let previewUrl of previewUrls; let i = index\" \n class=\"cide-file-input-preview-item\"\n [style.width]=\"previewWidth\"\n [style.height]=\"previewHeight\">\n <button \n type=\"button\" \n class=\"cide-file-input-preview-remove\"\n (click)=\"removePreview(i)\"\n title=\"Remove image\">\n ×\n </button>\n <img \n [src]=\"previewUrl\" \n [alt]=\"fileNames[i] || 'Preview image'\"\n class=\"cide-file-input-preview-image\"\n loading=\"lazy\">\n <div class=\"cide-file-input-preview-filename\">{{ fileNames[i] }}</div>\n </div>\n </div>\n </div>\n \n <div *ngIf=\"errorText\" class=\"cide-file-input-error\">{{ errorText }}</div>\n <div *ngIf=\"helperText && !errorText\" class=\"cide-file-input-helper\">{{ helperText }}</div>\n</div> ","import { CommonModule } from '@angular/common';\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType } from 'cloud-ide-lms-model';\n\n@Component({\n selector: 'cide-ele-textarea',\n standalone: true,\n templateUrl: './textarea.component.html',\n styleUrl: './textarea.component.scss',\n imports: [CommonModule, FormsModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CideTextareaComponent),\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: forwardRef(() => CideTextareaComponent),\n }\n ]\n})\nexport class CideTextareaComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {\n @Input() label: string = '';\n @Input() labelHide: boolean = false;\n @Input() placeholder: string = '';\n @Input() helperText: string = '';\n @Input() errorText: string = '';\n @Input() required: boolean = false;\n @Input() disabled: boolean = false;\n @Input() minlength: number = 0;\n @Input() maxlength: number = 0;\n @Input() rows: number | string = 3;\n @Input() id: string = '';\n @Input() ngModel: string = '';\n @Input() size: themeSize = 'sm';\n @Input() fill: elementStyleType = 'outline';\n @Input() labelPlacement: labelPlacementType = 'fixed';\n @Input() labelDir: labelDirType = 'start';\n @Input() leadingIcon: string = '';\n @Input() trailingIcon: string = '';\n @Input() clearInput: boolean = false;\n trailingIconInternal: string = '';\n isTrailingIconAllwedClick: boolean = false;\n @Output() ngModelChange = new EventEmitter<string>();\n\n isTouched = false;\n isValid = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n onChange = (value: string) => {};\n onTouched = () => {};\n onValidate = () => {};\n\n ngOnInit(): void {\n this.validateValue(this.ngModel);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['ngModel']) {\n this.validateValue(this.ngModel);\n }\n }\n\n writeValue(value: string): void {\n this.ngModel = value;\n this.validateValue(value);\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n validate(control: AbstractControl): ValidationErrors | null {\n return this.validateValue(control.value);\n }\n\n validateValue(value: string): ValidationErrors | null {\n console.log('validateValue', value);\n this.isValid = true;\n return null;\n }\n\n onInput(event: Event) {\n const value = (event.target as HTMLTextAreaElement).value;\n this.ngModel = value;\n this.onChange(value);\n this.ngModelChange.emit(value);\n this.validateValue(value);\n }\n\n onBlur() {\n this.isTouched = true;\n this.onTouched();\n }\n\n ClearInputValue() {\n this.ngModel = '';\n this.onChange('');\n this.ngModelChange.emit('');\n this.validateValue('');\n }\n\n trailingIconClick() {\n // For future extensibility (e.g., password visibility)\n // For now, just emit event or toggle icon if needed\n }\n} ","<div class=\"cide-textarea\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n}\">\r\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-textarea-label\">{{ label }}</label>\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n <!-- Trailing Icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n <!-- Textarea -->\r\n <textarea [id]=\"id\" [attr.placeholder]=\"placeholder\" [attr.rows]=\"rows\"\r\n [attr.minlength]=\"minlength > 0 ? minlength : null\" [attr.maxlength]=\"maxlength > 0 ? maxlength : null\"\r\n [disabled]=\"disabled\" [(ngModel)]=\"ngModel\" (input)=\"onInput($event)\" (blur)=\"onBlur()\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? '' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n class=\"cide-textarea-input tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-py-[1px] tw-outline-none\"></textarea>\r\n </div>\r\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-textarea-help-error-text\">{{ errorText || helperText\r\n }}</span>\r\n <span *ngIf=\"helperText && isValid\" class=\"cide-textarea-help-error-text\">{{ helperText }}</span>\r\n</div>","import { Directive, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, Renderer2 } from '@angular/core';\r\n\r\nexport type CideEleResizerDirection = 'horizontal' | 'vertical';\r\nexport type CideEleResizerDirectionTo = \"right-to-left\" | \"left-to-right\" | \"\";\r\n\r\n@Directive({\r\n selector: '[cideEleResizer]',\r\n standalone: true\r\n})\r\n\r\n/**\r\n<!-- Basic horizontal (left-right) layout -->\r\n<div class=\"panel-container\">\r\n <div class=\"left-panel\">\r\n Left Panel Content\r\n </div>\r\n\r\n <div cideEleResizer direction=\"horizontal\" [minPrevSize]=\"100\" [minNextSize]=\"100\">resize\r\n </div>\r\n\r\n <div class=\"right-panel\">\r\n Right Panel Content\r\n </div>\r\n</div>\r\n\r\n<!-- Basic vertical (top-bottom) layout -->\r\n<div class=\"panel-container-vertical\">\r\n <div class=\"top-panel\">\r\n Top Panel Content\r\n </div>\r\n\r\n <div cideEleResizer direction=\"vertical\" [minPrevSize]=\"50\" [minNextSize]=\"50\">resize\r\n </div>\r\n\r\n <div class=\"bottom-panel\">\r\n Bottom Panel Content\r\n </div>\r\n</div>\r\n\r\n<!-- Using with custom selectors -->\r\n<div class=\"complex-layout\">\r\n <div id=\"panel1\">Panel 1</div>\r\n <div id=\"panel2\">Panel 2</div>\r\n\r\n <div cideEleResizer direction=\"horizontal\" prevElementSelector=\"#panel1\" nextElementSelector=\"#panel2\"\r\n [usePercentage]=\"true\">resize\r\n </div>\r\n\r\n <div id=\"panel3\">Panel 3</div>\r\n</div>\r\n */\r\nexport class CideEleResizerDirective implements OnInit {\r\n @Input() direction: CideEleResizerDirection = 'horizontal';\r\n @Input() to: CideEleResizerDirectionTo = \"\";\r\n @Input() prevElementSelector = ''; // Selector for previous element\r\n @Input() nextElementSelector = ''; // Selector for next element\r\n @Input() parentElementSelector = ''; // Selector for parent element\r\n @Input() minPrevSize = 0; // Minimum size of previous element (px)\r\n @Input() minNextSize = 0; // Minimum size of next element (px)\r\n @Input() usePercentage = false; // Use percentage instead of pixels\r\n @Output() resizeStart = new EventEmitter<void>();\r\n @Output() resizing = new EventEmitter<{ prevSize: number, nextSize: number }>();\r\n @Output() resizeEnd = new EventEmitter<{ prevSize: number, nextSize: number }>();\r\n\r\n private isResizing = false;\r\n private startPosition = 0;\r\n private prevElement: HTMLElement | null = null;\r\n private nextElement: HTMLElement | null = null;\r\n private prevSize = 0;\r\n private nextSize = 0;\r\n private containerSize = 0;\r\n private startPrevSize = 0;\r\n private startNextSize = 0;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) { }\r\n\r\n ngOnInit() {\r\n // Set cursor style based on direction\r\n this.renderer.setStyle(\r\n this.el.nativeElement,\r\n 'cursor',\r\n this.direction === 'horizontal' ? 'ew-resize' : 'ns-resize'\r\n );\r\n\r\n // Add a class to help with styling\r\n this.renderer.addClass(this.el.nativeElement, 'panel-resizer');\r\n this.renderer.addClass(this.el.nativeElement, `panel-resizer-${this.direction}`);\r\n this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}`);\r\n if (this.to) {\r\n this.renderer.addClass(this.el.nativeElement, `cide-lyt-devider-${this.direction}-${this.to}`);\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent) {\r\n event.preventDefault();\r\n\r\n // Get the elements to resize\r\n this.prevElement = this.getPrevElement();\r\n this.nextElement = this.getNextElement();\r\n\r\n // if (!this.prevElement || !this.nextElement) {\r\n // console.error('Could not find elements to resize');\r\n // return;\r\n // }\r\n\r\n // Get container size\r\n\r\n const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\r\n if (parent) {\r\n console.log(parent.offsetWidth, \"parent.offsetWidth\")\r\n this.containerSize = this.direction === 'horizontal'\r\n ? parent.offsetWidth\r\n : parent.offsetHeight;\r\n }\r\n\r\n \r\n // Store initial positions and sizes\r\n this.startPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;\r\n if (this.prevElement) {\r\n console.log(this.prevElement.offsetWidth, \"this.prevElement.offsetWidth\")\r\n this.startPrevSize = this.direction === 'horizontal'\r\n ? this.prevElement.offsetWidth\r\n : this.prevElement.offsetHeight;\r\n }\r\n if (this.nextElement) {\r\n console.log(this.nextElement.offsetWidth, \"this.nextElement.offsetWidth\")\r\n this.startNextSize = this.direction === 'horizontal'\r\n ? this.nextElement.offsetWidth\r\n : this.nextElement.offsetHeight;\r\n }\r\n\r\n this.prevSize = this.startPrevSize;\r\n this.nextSize = this.startNextSize;\r\n\r\n this.isResizing = true;\r\n\r\n // Add event listeners\r\n document.addEventListener('mousemove', this.onMouseMove);\r\n document.addEventListener('mouseup', this.onMouseUp);\r\n\r\n // Disable text selection\r\n document.body.style.userSelect = 'none';\r\n\r\n // Emit resizeStart event\r\n this.resizeStart.emit();\r\n\r\n // Add visual feedback\r\n this.renderer.addClass(this.el.nativeElement, 'resizing');\r\n }\r\n\r\n private onMouseMove = (event: MouseEvent) => {\r\n if (!this.isResizing) return;\r\n\r\n // Calculate movement\r\n const currentPosition = this.direction === 'horizontal' ? event.clientX : event.clientY;\r\n const delta = currentPosition - this.startPosition;\r\n\r\n // Calculate new sizes\r\n let newPrevSize = this.startPrevSize + delta;\r\n let newNextSize = this.startNextSize - delta;\r\n\r\n // Apply constraints\r\n if (newPrevSize < this.minPrevSize) {\r\n const diff = this.minPrevSize - newPrevSize;\r\n newPrevSize = this.minPrevSize;\r\n newNextSize = this.startNextSize - delta + diff;\r\n // skip if previsus size is equal to the minimum size, note above code is dark code which will not be executed\r\n return;\r\n }\r\n\r\n if (newNextSize < this.minNextSize) {\r\n const diff = this.minNextSize - newNextSize;\r\n newNextSize = this.minNextSize;\r\n newPrevSize = this.startPrevSize + delta - diff;\r\n // skip if next size is equal to the minimum size, note above code is dark code which will not be executed\r\n return;\r\n }\r\n\r\n // Update sizes\r\n this.prevSize = newPrevSize;\r\n this.nextSize = newNextSize;\r\n\r\n // Apply new sizes\r\n if (this.usePercentage) {\r\n const prevPercent = (newPrevSize / this.containerSize) * 100;\r\n const nextPercent = (newNextSize / this.containerSize) * 100;\r\n\r\n this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${prevPercent}%`);\r\n this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${nextPercent}%`);\r\n } else {\r\n this.renderer.setStyle(this.prevElement, this.getSizeProperty(), `${newPrevSize}px`);\r\n this.renderer.setStyle(this.nextElement, this.getSizeProperty(), `${newNextSize}px`);\r\n }\r\n\r\n // Emit resizing event\r\n this.resizing.emit({ prevSize: newPrevSize, nextSize: newNextSize });\r\n }\r\n\r\n private onMouseUp = () => {\r\n this.isResizing = false;\r\n\r\n // Remove event listeners\r\n document.removeEventListener('mousemove', this.onMouseMove);\r\n document.removeEventListener('mouseup', this.onMouseUp);\r\n\r\n // Restore text selection\r\n document.body.style.userSelect = '';\r\n\r\n // Emit resizeEnd event\r\n if (this.prevElement && this.nextElement) {\r\n this.resizeEnd.emit({ prevSize: this.prevSize, nextSize: this.nextSize });\r\n }\r\n\r\n // Remove visual feedback\r\n this.renderer.removeClass(this.el.nativeElement, 'resizing');\r\n }\r\n\r\n private getPrevElement(): HTMLElement | null {\r\n if (this.prevElementSelector) {\r\n const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\r\n return parent?.querySelector(this.prevElementSelector) || null;\r\n }\r\n return this.el.nativeElement.previousElementSibling as HTMLElement;\r\n }\r\n\r\n private getNextElement(): HTMLElement | null {\r\n if (this.nextElementSelector) {\r\n const parent = this.parentElementSelector ? document.querySelector(this.parentElementSelector) : this.el.nativeElement.parentElement;\r\n return parent?.querySelector(this.nextElementSelector) || null;\r\n }\r\n return this.el.nativeElement.nextElementSibling as HTMLElement;\r\n }\r\n\r\n private getSizeProperty(): string {\r\n return this.direction === 'horizontal' ? 'width' : 'height';\r\n }\r\n}","import { Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, Renderer2 } from '@angular/core';\r\n\r\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\r\nexport type TooltipType = 'default' | 'success' | 'warning' | 'error' | 'info' | 'light' | 'dark';\r\n\r\n@Directive({\r\n selector: '[cideEleTooltip]',\r\n standalone: true\r\n})\r\nexport class TooltipDirective implements OnInit, OnDestroy {\r\n @Input() cideEleTooltip: string = '';\r\n @Input() tooltipColor: string = '';\r\n @Input() tooltipBg: string = '';\r\n @Input() tooltipPlacement: TooltipPlacement = 'top';\r\n @Input() tooltipType: TooltipType = 'default';\r\n @Input() tooltipDelay: number = 300; // ms\r\n @Input() tooltipDir: TooltipPlacement = 'top'; // Alias for tooltipPlacement for backward compatibility\r\n @Input() tooltipShowArrow: boolean = false;\r\n @Input() tooltipMultiline: boolean = false;\r\n @Input() tooltipMaxWidth: string = '200px';\r\n @Input() tooltipInteractive: boolean = false;\r\n @Input() tooltipClass: string = '';\r\n \r\n private tooltipElement: HTMLElement | null = null;\r\n private visible = false;\r\n private showTimeout: number | null = null;\r\n private hideTimeout: number | null = null;\r\n private hideDelay = 150; // ms\r\n private interactiveMouseLeaveHandler: (() => void) | null = null;\r\n\r\n constructor(private el: ElementRef, private renderer: Renderer2) {}\r\n\r\n ngOnInit(): void {\r\n // Use tooltipDir as fallback if provided and tooltipPlacement is default\r\n if (this.tooltipDir && this.tooltipPlacement === 'top') {\r\n this.tooltipPlacement = this.tooltipDir;\r\n }\r\n\r\n // If user hasn't provided custom colors and is using a predefined type,\r\n // we'll leave colors empty to use CSS class colors\r\n if (this.tooltipType !== 'default' && !this.tooltipColor && !this.tooltipBg) {\r\n this.tooltipColor = '';\r\n this.tooltipBg = '';\r\n }\r\n }\r\n\r\n @HostListener('mouseenter')\r\n onMouseEnter(): void {\r\n this.clearTimeouts();\r\n this.showTimeout = window.setTimeout(() => {\r\n this.show();\r\n }, this.tooltipDelay);\r\n }\r\n\r\n @HostListener('focus')\r\n onFocus(): void {\r\n this.clearTimeouts();\r\n this.showTimeout = window.setTimeout(() => {\r\n this.show();\r\n }, this.tooltipDelay);\r\n }\r\n\r\n @HostListener('mouseleave')\r\n onMouseLeave(): void {\r\n this.clearTimeouts();\r\n \r\n // Don't hide immediately if interactive\r\n if (!this.tooltipInteractive) {\r\n this.hide();\r\n } else {\r\n // For interactive tooltips, delay hiding to allow user to move to tooltip\r\n this.hideTimeout = window.setTimeout(() => {\r\n this.hide();\r\n }, this.hideDelay);\r\n }\r\n }\r\n\r\n @HostListener('blur')\r\n onBlur(): void {\r\n this.clearTimeouts();\r\n this.hide();\r\n }\r\n\r\n @HostListener('click')\r\n onClick(): void {\r\n if (this.visible && !this.tooltipInteractive) {\r\n this.hide();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearTimeouts();\r\n this.destroyTooltip();\r\n }\r\n\r\n private clearTimeouts(): void {\r\n if (this.showTimeout) {\r\n clearTimeout(this.showTimeout);\r\n this.showTimeout = null;\r\n }\r\n if (this.hideTimeout) {\r\n clearTimeout(this.hideTimeout);\r\n this.hideTimeout = null;\r\n }\r\n }\r\n\r\n private show(): void {\r\n if (!this.cideEleTooltip || this.visible) return;\r\n \r\n this.createTooltip();\r\n this.styleTooltip();\r\n this.positionTooltip();\r\n \r\n // Add animation with requestAnimationFrame for smoother transition\r\n requestAnimationFrame(() => {\r\n if (this.tooltipElement) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-visible');\r\n \r\n // Show arrow if enabled\r\n if (this.tooltipShowArrow) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-arrow-visible');\r\n }\r\n }\r\n });\r\n \r\n this.visible = true;\r\n\r\n // Add mouseleave event listener if interactive\r\n if (this.tooltipInteractive && this.tooltipElement) {\r\n this.interactiveMouseLeaveHandler = () => {\r\n this.clearTimeouts();\r\n this.hide();\r\n };\r\n this.tooltipElement.addEventListener('mouseleave', this.interactiveMouseLeaveHandler);\r\n \r\n // Also add mouseenter to cancel any pending hide\r\n this.tooltipElement.addEventListener('mouseenter', () => {\r\n this.clearTimeouts();\r\n });\r\n }\r\n }\r\n\r\n private hide(): void {\r\n if (!this.visible || !this.tooltipElement) return;\r\n\r\n this.renderer.removeClass(this.tooltipElement, 'tooltip-visible');\r\n this.renderer.removeClass(this.tooltipElement, 'tooltip-arrow-visible');\r\n \r\n // Use timeout for smoother hide animation\r\n setTimeout(() => {\r\n if (!this.visible) { // Double-check in case tooltip was reshown\r\n this.destroyTooltip();\r\n }\r\n }, this.hideDelay);\r\n \r\n this.visible = false;\r\n }\r\n\r\n private createTooltip(): void {\r\n this.destroyTooltip();\r\n\r\n this.tooltipElement = this.renderer.createElement('div');\r\n this.renderer.addClass(this.tooltipElement, 'tooltip');\r\n \r\n // Add placement class for arrow\r\n this.renderer.addClass(this.tooltipElement, `tooltip-${this.tooltipPlacement}`);\r\n \r\n // Add type class if using a predefined type\r\n if (this.tooltipType !== 'default') {\r\n this.renderer.addClass(this.tooltipElement, `tooltip-${this.tooltipType}`);\r\n }\r\n \r\n // Add multiline class if enabled\r\n if (this.tooltipMultiline) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-multiline');\r\n }\r\n \r\n // Add interactive class if enabled\r\n if (this.tooltipInteractive) {\r\n this.renderer.addClass(this.tooltipElement, 'tooltip-interactive');\r\n }\r\n \r\n // Add custom classes if provided\r\n if (this.tooltipClass) {\r\n const classes = this.tooltipClass.split(' ');\r\n classes.forEach(className => {\r\n if (className.trim()) {\r\n this.renderer.addClass(this.tooltipElement, className.trim());\r\n }\r\n });\r\n }\r\n\r\n // Create HTML content if multiline\r\n if (this.tooltipMultiline) {\r\n this.renderer.setProperty(this.tooltipElement, 'innerHTML', this.cideEleTooltip);\r\n } else {\r\n const textNode = this.renderer.createText(this.cideEleTooltip);\r\n this.renderer.appendChild(this.tooltipElement, textNode);\r\n }\r\n \r\n this.renderer.appendChild(document.body, this.tooltipElement);\r\n }\r\n\r\n private styleTooltip(): void {\r\n if (!this.tooltipElement) return;\r\n\r\n // Set custom CSS variables for the tooltip colors if provided\r\n if (this.tooltipColor) {\r\n this.renderer.setStyle(this.tooltipElement, '--tooltip-color', this.tooltipColor);\r\n }\r\n \r\n if (this.tooltipBg) {\r\n this.renderer.setStyle(this.tooltipElement, '--tooltip-bg', this.tooltipBg);\r\n }\r\n \r\n // Set custom max width if provided\r\n if (this.tooltipMaxWidth && this.tooltipMultiline) {\r\n this.renderer.setStyle(this.tooltipElement, '--tooltip-max-width', this.tooltipMaxWidth);\r\n }\r\n }\r\n\r\n private positionTooltip(): void {\r\n if (!this.tooltipElement) return;\r\n\r\n const hostRect = this.el.nativeElement.getBoundingClientRect();\r\n const tooltipRect = this.tooltipElement.getBoundingClientRect();\r\n \r\n // Account for page scroll\r\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\r\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\r\n \r\n let top = 0;\r\n let left = 0;\r\n \r\n // Calculate position based on placement\r\n switch (this.tooltipPlacement) {\r\n case 'top':\r\n top = hostRect.top + scrollTop - tooltipRect.height - 6;\r\n left = hostRect.left + scrollLeft + (hostRect.width / 2) - (tooltipRect.width / 2);\r\n break;\r\n case 'bottom':\r\n top = hostRect.bottom + scrollTop + 6;\r\n left = hostRect.left + scrollLeft + (hostRect.width / 2) - (tooltipRect.width / 2);\r\n break;\r\n case 'left':\r\n top = hostRect.top + scrollTop + (hostRect.height / 2) - (tooltipRect.height / 2);\r\n left = hostRect.left + scrollLeft - tooltipRect.width - 6;\r\n break;\r\n case 'right':\r\n top = hostRect.top + scrollTop + (hostRect.height / 2) - (tooltipRect.height / 2);\r\n left = hostRect.right + scrollLeft + 6;\r\n break;\r\n }\r\n \r\n // Adjust if tooltip would be outside viewport\r\n const viewportWidth = window.innerWidth;\r\n const viewportHeight = window.innerHeight;\r\n \r\n // Top boundary check\r\n if (top < scrollTop + 4) {\r\n top = scrollTop + 4;\r\n } else if (top + tooltipRect.height > scrollTop + viewportHeight - 4) {\r\n top = scrollTop + viewportHeight - tooltipRect.height - 4;\r\n }\r\n \r\n // Left boundary check\r\n if (left < scrollLeft + 4) {\r\n left = scrollLeft + 4;\r\n } else if (left + tooltipRect.width > scrollLeft + viewportWidth - 4) {\r\n left = scrollLeft + viewportWidth - tooltipRect.width - 4;\r\n }\r\n \r\n this.renderer.setStyle(this.tooltipElement, 'position', 'absolute');\r\n this.renderer.setStyle(this.tooltipElement, 'top', `${top}px`);\r\n this.renderer.setStyle(this.tooltipElement, 'left', `${left}px`);\r\n }\r\n\r\n private destroyTooltip(): void {\r\n if (this.tooltipElement) {\r\n // Remove event listeners for interactive tooltips using the stored reference\r\n if (this.tooltipInteractive && this.interactiveMouseLeaveHandler) {\r\n this.tooltipElement.removeEventListener('mouseleave', this.interactiveMouseLeaveHandler);\r\n this.interactiveMouseLeaveHandler = null;\r\n }\r\n \r\n const parent = this.tooltipElement.parentNode;\r\n if (parent) {\r\n this.renderer.removeChild(parent, this.tooltipElement);\r\n }\r\n this.tooltipElement = null;\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'cide-ele-skeleton-loader',\r\n templateUrl: './skeleton-loader.component.html',\r\n standalone: true,\r\n imports: [CommonModule],\r\n styleUrls: ['./skeleton-loader.component.scss']\r\n})\r\nexport class CideEleSkeletonLoaderComponent {\r\n @Input() width: string = '100%';\r\n @Input() height: string = '1rem';\r\n @Input() borderRadius: string = '0.375rem'; // rounded-md\r\n @Input() count: number = 1;\r\n @Input() circle: boolean = false;\r\n @Input() animation: 'pulse' | 'wave' | 'none' = 'pulse';\r\n}\r\n","<ng-container *ngFor=\"let i of [].constructor(count)\">\r\n <div\r\n [ngClass]=\"[\r\n 'tw-bg-gray-200',\r\n animation === 'pulse' ? 'tw-animate-pulse' : '',\r\n circle ? 'tw-rounded-full' : 'tw-rounded-md'\r\n ]\"\r\n [style.width]=\"width\"\r\n [style.height]=\"height\"\r\n [style.borderRadius]=\"circle ? '50%' : borderRadius\"\r\n class=\"tw-mb-2\"\r\n ></div>\r\n</ng-container>\r\n","// Data Grid Configuration Types for CideEleDataGrid Component\n\nexport type ColumnType = 'text' | 'number' | 'date' | 'boolean' | 'status' | 'actions' | 'custom' | 'order';\nexport type ColumnWidth = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'auto' | string;\nexport type TextAlign = 'left' | 'center' | 'right';\n\nexport interface GridColumn {\n key: string;\n header: string;\n type: ColumnType;\n width?: ColumnWidth;\n sortable?: boolean;\n searchable?: boolean;\n truncate?: boolean;\n align?: TextAlign;\n renderer?: string; // For custom rendering\n valueGetter?: string; // Path to nested property (e.g., 'contact.email')\n formatter?: GridFormatter;\n actions?: GridAction[];\n statusConfig?: StatusConfig;\n}\n\nexport interface GridFormatter {\n type: 'date' | 'currency' | 'percentage' | 'custom';\n format?: string; // Date format, currency code, etc.\n customFunction?: string; // Name of custom formatter function\n}\n\nexport interface StatusConfig {\n activeValue: string | number | boolean;\n activeLabel: string;\n inactiveLabel: string;\n activeClass: string;\n inactiveClass: string;\n}\n\nexport interface GridAction {\n key: string;\n label: string;\n icon: string;\n variant: 'ghost' | 'primary' | 'outline' | 'danger';\n tooltip?: string;\n condition?: string; // Condition to show action (e.g., 'entity.isActive')\n onClick: string; // Function name to call\n}\n\nexport interface GridPaginationConfig {\n enabled: boolean;\n pageSize: number;\n pageSizeOptions: number[];\n showQuickJump: boolean;\n showPageInfo: boolean;\n showRefresh: boolean;\n}\n\nexport interface GridSearchConfig {\n enabled: boolean;\n placeholder: string;\n searchableColumns: string[]; // Column keys to search in\n debounceMs?: number;\n}\n\nexport interface GridExportConfig {\n enabled: boolean;\n formats: ('csv' | 'excel' | 'pdf')[];\n filename?: string;\n}\n\nexport interface GridLoadingConfig {\n useDefer: boolean;\n skeletonRows: number;\n showOverlay: boolean;\n}\n\nexport interface GridScrollConfig {\n enabled: boolean;\n maxHeight?: string; // e.g., '400px', '50vh', 'calc(100vh - 200px)'\n minHeight?: string; // e.g., '200px'\n stickyHeader?: boolean; // Keep header visible when scrolling\n virtualScroll?: boolean; // Enable virtual scrolling for large datasets\n rowHeight?: number; // Height of each row in pixels (for virtual scroll)\n}\n\nexport interface GridTreeConfig {\n enabled: boolean;\n primaryKey: string; // Primary key field name (e.g., '_id')\n foreignKey: string; // Foreign key field name (e.g., 'syme_id_syme')\n childrenKey?: string; // Children array field name (default: 'children')\n levelKey?: string; // Level field name (default: 'level')\n expandedKey?: string; // Expanded state field name (default: 'isExpanded')\n hasChildrenKey?: string; // Has children field name (default: 'hasChildren')\n}\n\nexport interface GridDragDropConfig {\n enabled: boolean;\n dragHandle?: string; // CSS selector for drag handle (default: 'tr')\n orderField?: string; // Field name for storing order (default: 'order')\n dragClass?: string; // CSS class to apply to dragged element\n dropClass?: string; // CSS class to apply to drop target\n}\n\nexport interface GridConfiguration<T = Record<string, unknown>> {\n // Basic Configuration\n id: string;\n title?: string;\n subtitle?: string;\n columns: GridColumn[];\n \n // Data Configuration\n data: T[];\n trackBy?: string; // Property to track items by (default: 'id' or '_id')\n \n // Feature Configuration\n pagination: GridPaginationConfig;\n search: GridSearchConfig;\n export?: GridExportConfig;\n loading: GridLoadingConfig;\n scroll?: GridScrollConfig;\n tree?: GridTreeConfig; // Tree structure configuration\n dragDrop?: GridDragDropConfig; // Drag and drop configuration\n \n // Styling Configuration\n responsive: boolean;\n striped?: boolean;\n bordered?: boolean;\n compact?: boolean;\n fullHeight?: boolean; // Enable full height mode for empty tables\n \n // Event Handlers (function names)\n onRowClick?: string;\n onSort?: string;\n onPageChange?: string;\n onSearch?: string;\n onRefresh?: string;\n onExport?: string;\n onRowReorder?: string; // Row reorder event handler\n \n // Custom Classes\n tableClass?: string;\n headerClass?: string;\n rowClass?: string;\n cellClass?: string;\n}\n\nexport interface GridState<T = Record<string, unknown>> {\n currentPage: number;\n pageSize: number;\n totalItems: number;\n totalPages: number;\n searchQuery: string;\n sortColumn?: string;\n sortDirection?: 'asc' | 'desc';\n loading: boolean;\n isRefreshing: boolean;\n selectedRows: T[];\n}\n\nexport interface GridEvent<T = Record<string, unknown>> {\n type: 'rowClick' | 'sort' | 'pageChange' | 'search' | 'refresh' | 'export' | 'action' | 'rowReorder';\n data: T | T[] | string | number | null | {\n sourceItem: T;\n sourceIndex: number;\n targetItem: T;\n targetIndex: number;\n newOrder: T[];\n };\n column?: GridColumn;\n action?: GridAction;\n}\n\n// Default configurations\nexport const DEFAULT_GRID_CONFIG: Partial<GridConfiguration> = {\n pagination: {\n enabled: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50, 100],\n showQuickJump: true,\n showPageInfo: true,\n showRefresh: true\n },\n search: {\n enabled: true,\n placeholder: 'Search...',\n searchableColumns: [],\n debounceMs: 300\n },\n loading: {\n useDefer: true,\n skeletonRows: 5,\n showOverlay: false\n },\n scroll: {\n enabled: false,\n maxHeight: '400px',\n minHeight: '200px',\n stickyHeader: true,\n virtualScroll: false,\n rowHeight: 40\n },\n responsive: true,\n striped: false,\n bordered: true,\n compact: true,\n fullHeight: true\n};\n\n// Utility types for type safety\nexport type GridEventHandler<T = Record<string, unknown>> = (event: GridEvent<T>) => void;\nexport type GridCustomRenderer<T = Record<string, unknown>> = (value: unknown, row: T, column: GridColumn) => string;\nexport type GridCustomFormatter = (value: unknown, format?: string) => string; ","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges, SimpleChange, signal, computed, TemplateRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { \n GridConfiguration, \n GridColumn, \n GridEvent, \n GridAction,\n DEFAULT_GRID_CONFIG,\n ColumnWidth,\n StatusConfig\n} from './data-grid.types';\nimport { CideInputComponent } from '../../elements/input/input.component';\nimport { CideSelectComponent } from '../../elements/select/select.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { inputType } from 'cloud-ide-lms-model';\nimport { CideEleButtonComponent } from '../../../public-api';\n\n// Enhanced types for template support\nexport interface TemplateContext<T = Record<string, unknown>> {\n $implicit: unknown;\n row: T;\n value: unknown;\n column: GridColumn;\n}\n\nexport type TemplateRenderer<T = Record<string, unknown>> = TemplateRef<TemplateContext<T>>;\n\n@Component({\n selector: 'cide-ele-data-grid',\n standalone: true,\n imports: [\n CommonModule, \n FormsModule,\n CideInputComponent,\n CideSelectComponent,\n CideIconComponent,\n CideEleButtonComponent\n ],\n templateUrl: './data-grid.component.html',\n styleUrls: ['./data-grid.component.scss']\n})\nexport class CideEleDataGridComponent<T = Record<string, unknown>> implements OnInit, OnChanges, OnDestroy {\n @Input() config!: GridConfiguration<T>;\n @Input() templateRenderers: Record<string, unknown> = {};\n @Input() customFormatters: Record<string, (value: unknown, format?: string) => string> = {};\n @Input() actionHandlers: Record<string, (data: T, action?: GridAction) => void> = {};\n @Input() serverSidePagination = false;\n @Input() totalServerItems = 0;\n @Input() currentServerPage = 1;\n @Input() currentServerPageSize = 10;\n @Input() dragDropEnabled = false;\n\n @Output() gridEvent = new EventEmitter<GridEvent<T>>();\n\n // Internal state using Angular Signals\n private internalData = signal<T[]>([]);\n private filteredData = signal<T[]>([]);\n \n // Grid state\n currentPage = signal(1);\n pageSize = signal(10);\n totalItems = signal(0);\n totalPages = signal(0);\n searchQuery = signal('');\n loading = signal(false);\n isRefreshing = signal(false);\n pageChangeLoading = signal(false);\n jumpToPage = 1;\n isDragOverRow: number | null = null;\n isDragging = signal(false);\n hasOrderChanged = signal(false);\n private originalOrderIds: string[] = []; // Store only IDs for order tracking\n private initialDataOrderIds: string[] = []; // Store only IDs for initial order\n private rowOrderMap = new Map<string, { oldPosition: number; newPosition: number }>();\n private localReorderedData: T[] = []; // Local data for visual reordering\n private searchDebounceTimer?: ReturnType<typeof setTimeout>;\n private isDataUpdate = false;\n\n // Computed properties\n hasNextPage = computed(() => this.currentPage() < this.totalPages());\n hasPreviousPage = computed(() => this.currentPage() > 1);\n \n // Merged configuration with defaults\n mergedConfig = signal<GridConfiguration<T>>(this.config);\n\n ngOnInit() {\n this.initializeGrid();\n this.initializeOriginalOrder();\n }\n\n ngOnDestroy() {\n // Clean up search debounce timer\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config']) {\n // Store current search query to preserve it during re-initialization\n const currentSearchQuery = this.searchQuery();\n \n this.mergeConfigWithDefaults();\n \n // Check if this is a data-only update (same config except data)\n const isDataOnlyUpdate = this.isDataOnlyUpdate(changes['config']);\n \n if (isDataOnlyUpdate && this.serverSidePagination) {\n console.log('🔄 DataGrid: isDataOnlyUpdate', isDataOnlyUpdate);\n // For data-only updates, preserve search query and use updateDataOnly\n this.updateDataOnly(changes['config'].currentValue.data || []);\n if (currentSearchQuery) {\n // this.searchQuery.set(currentSearchQuery);\n }\n } else {\n // For full config changes, use initializeGrid\n this.initializeGrid();\n \n // Restore search query after initialization\n if (currentSearchQuery) {\n // this.searchQuery.set(currentSearchQuery);\n }\n }\n \n // Reinitialize original order when data changes\n this.initializeOriginalOrder();\n \n // Also refresh order tracking to ensure it's up to date\n this.refreshOrderTracking();\n }\n \n if (this.serverSidePagination) {\n if (changes['totalServerItems']) {\n // console.log('🔄 DataGrid: totalServerItems changed:', this.totalServerItems);\n this.totalItems.set(this.totalServerItems);\n this.updatePaginationState();\n }\n \n if (changes['currentServerPage']) {\n // console.log('🔄 DataGrid: currentServerPage changed:', this.currentServerPage);\n this.currentPage.set(this.currentServerPage);\n }\n \n if (changes['currentServerPageSize']) {\n // console.log('🔄 DataGrid: currentServerPageSize changed:', this.currentServerPageSize);\n this.pageSize.set(this.currentServerPageSize);\n this.updatePaginationState();\n }\n \n // Clear page change loading when server-side data is updated\n if (changes['config'] && this.pageChangeLoading()) {\n this.clearPageChangeLoading();\n }\n }\n }\n\n /**\n * Check if the config change is only a data update\n */\n private isDataOnlyUpdate(change: SimpleChange): boolean {\n if (change.firstChange || !change.previousValue || !change.currentValue) {\n return false;\n }\n \n const prev = change.previousValue;\n const curr = change.currentValue;\n \n // Check if all properties except 'data' are the same\n const prevWithoutData = { ...prev };\n const currWithoutData = { ...curr };\n delete prevWithoutData.data;\n delete currWithoutData.data;\n \n return JSON.stringify(prevWithoutData) === JSON.stringify(currWithoutData);\n }\n\n /**\n * Update only the data without triggering full grid re-initialization\n * This prevents the search input and other UI state from being reset\n */\n private updateDataOnly(data: T[]) {\n let processedData = data;\n \n // Transform to tree structure if tree config is enabled\n if (this.mergedConfig().tree?.enabled) {\n processedData = this.transformToTree(data);\n console.log('processedData', processedData);\n }\n \n this.internalData.set(processedData);\n console.log('processedData', processedData);\n // For server-side pagination, set filtered data directly\n if (this.serverSidePagination) {\n console.log('processedData', processedData);\n this.filteredData.set(processedData);\n } else {\n // For client-side pagination, apply filters\n this.applyFilters();\n }\n \n // Refresh order tracking when data changes\n this.refreshOrderTracking();\n \n this.clearPageChangeLoading();\n }\n\n private mergeConfigWithDefaults() {\n this.mergedConfig.set({\n ...DEFAULT_GRID_CONFIG,\n ...this.config,\n pagination: { ...DEFAULT_GRID_CONFIG.pagination!, ...this.config.pagination },\n search: { ...DEFAULT_GRID_CONFIG.search!, ...this.config.search },\n loading: { ...DEFAULT_GRID_CONFIG.loading!, ...this.config.loading },\n scroll: { ...DEFAULT_GRID_CONFIG.scroll!, ...this.config.scroll }\n } as GridConfiguration<T>);\n }\n\n private initializeGrid() {\n // Ensure we have valid data\n let data = this.config?.data || [];\n \n // Transform to tree structure if tree config is enabled\n if (this.mergedConfig().tree?.enabled) {\n data = this.transformToTree(data);\n }\n \n this.internalData.set(data);\n \n // Set pagination values based on mode\n if (this.serverSidePagination) {\n this.currentPage.set(this.currentServerPage);\n this.pageSize.set(this.currentServerPageSize);\n this.totalItems.set(this.totalServerItems);\n // For server-side pagination, set filtered data directly without applying filters\n this.filteredData.set(data);\n } else {\n // Client-side pagination\n const pageSize = this.mergedConfig().pagination?.pageSize || 10;\n this.pageSize.set(pageSize);\n this.totalItems.set(data.length);\n // For client-side pagination, apply filters\n this.applyFilters();\n }\n \n this.updatePaginationState();\n \n // Initialize original order for drag and drop\n this.initializeOriginalOrder();\n \n // Also refresh order tracking to ensure it's up to date\n this.refreshOrderTracking();\n }\n\n /**\n * Get the unique identifier for an item\n */\n private getItemId(item: T): string | null {\n if (item && typeof item === 'object') {\n const id = (item as Record<string, unknown>)['_id'];\n return id ? String(id) : null;\n }\n return null;\n }\n\n /**\n * Get the order value for an item from the config\n */\n private getItemOrder(item: T): number {\n const dragDropConfig = this.getDragDropConfig();\n if (dragDropConfig?.orderField) {\n const orderValue = this.getNestedValue(item, dragDropConfig.orderField);\n return typeof orderValue === 'number' ? orderValue : 0;\n }\n return 0;\n }\n\n /**\n * Initialize the original order for drag and drop\n */\n private initializeOriginalOrder(): void {\n if (this.isDragDropEnabled()) {\n // Get the full dataset from the config (not just displayedData)\n const fullData = this.mergedConfig().data || [];\n \n // Completely build the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Build the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1), // Use actual order or fallback to index\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n // Clear any existing local reordered data\n this.localReorderedData = [];\n \n console.log('🔍 Initial order tracking built from full dataset:', this.initialDataOrderIds.length, 'items');\n console.log('🔍 Initial order map created with actual order values:', Array.from(this.rowOrderMap.entries()));\n }\n }\n\n /**\n * Refresh order tracking with current data (called when data updates)\n */\n private refreshOrderTracking(): void {\n if (this.isDragDropEnabled()) {\n // Get the current full dataset\n const fullData = this.mergedConfig().data || [];\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1),\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n // Clear any local reordered data since data has changed\n this.localReorderedData = [];\n this.hasOrderChanged.set(false);\n \n console.log('🔍 Order tracking completely rebuilt with current data:', this.initialDataOrderIds.length, 'items');\n }\n }\n\n // ===== Data Processing =====\n \n private applyFilters() {\n let filtered = [...this.internalData()];\n \n // Apply search filter only for client-side pagination\n // For server-side pagination, search is handled by the server\n if (!this.serverSidePagination) {\n const query = this.searchQuery()?.toLowerCase();\n if (query && this.mergedConfig().search.enabled) {\n filtered = filtered.filter(item => \n this.mergedConfig().search.searchableColumns.some(columnKey => {\n const value = this.getNestedValue(item, columnKey);\n return String(value || '')?.toLowerCase()?.includes(query);\n })\n );\n }\n }\n \n // Flatten tree structure for display if tree is enabled\n if (this.mergedConfig().tree?.enabled) {\n filtered = this.flattenTreeForDisplay(filtered);\n }\n \n this.filteredData.set(filtered);\n \n // For server-side pagination, totalItems should always be totalServerItems\n // For client-side pagination, totalItems should be the filtered data length\n if (this.serverSidePagination) {\n this.totalItems.set(this.totalServerItems);\n } else {\n this.totalItems.set(filtered.length);\n }\n \n this.updatePaginationState();\n }\n\n /**\n * Transform flat data to tree structure based on foreign key relationships\n */\n private transformToTree(data: T[]): T[] {\n console.log('transformToTree - input data:', data.length, 'items');\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return data;\n\n const { primaryKey, foreignKey, childrenKey = 'children', levelKey = 'level', expandedKey = 'isExpanded', hasChildrenKey = 'hasChildren' } = treeConfig;\n \n // Always add level key to each row during processing\n \n // Create a map for quick lookup\n const itemMap = new Map<string, T>();\n const processedItems = new Set<string>();\n const rootItems: T[] = [];\n\n // First pass: create tree items with default properties and level key\n data.forEach(item => {\n const treeItem = {\n ...item,\n [levelKey]: 0,\n level: 0, // Always add 'level' property for consistent access\n [expandedKey]: false,\n [hasChildrenKey]: false,\n [childrenKey]: []\n } as T;\n itemMap.set(String(this.getNestedValue(item, primaryKey) || ''), treeItem);\n });\n\n // Multi-pass hierarchy building to handle items in any order\n let remainingItems = [...data];\n const maxIterations = data.length; // Prevent infinite loops\n let iteration = 0;\n\n while (remainingItems.length > 0 && iteration < maxIterations) {\n const itemsToProcess = [...remainingItems];\n remainingItems = [];\n \n console.log(`Iteration ${iteration + 1}: Processing ${itemsToProcess.length} items`);\n\n itemsToProcess.forEach(item => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const parentIdValue = this.getNestedValue(item, foreignKey);\n const parentId = parentIdValue !== null && parentIdValue !== undefined ? String(parentIdValue) : '';\n const treeItem = itemMap.get(itemId);\n \n // Skip if already processed\n if (processedItems.has(itemId)) {\n return;\n }\n\n if (treeItem && parentId && itemMap.has(parentId)) {\n // This is a child item - check if parent is processed or is a root\n const parent = itemMap.get(parentId)!;\n const parentParentId = this.getNestedValue(parent, foreignKey);\n const isParentRoot = !parentParentId || parentParentId === null || parentParentId === undefined;\n \n if (isParentRoot || processedItems.has(parentId)) {\n // Parent is processed or is root, we can process this child\n const parentChildren = this.getNestedValue(parent, childrenKey) as T[] || [];\n \n // Avoid adding duplicates\n const childExists = parentChildren.some(child => \n String(this.getNestedValue(child, primaryKey) || '') === itemId\n );\n \n if (!childExists) {\n // Calculate level based on parent - automatically set level key\n const parentLevel = this.getNestedValue(parent, 'level') as number || 0;\n const childLevel = parentLevel + 1;\n \n // Update child item with correct level\n const updatedTreeItem = {\n ...treeItem,\n [levelKey]: childLevel,\n level: childLevel // Always add 'level' property for consistent access\n } as T;\n itemMap.set(itemId, updatedTreeItem);\n \n // Add updated child to parent's children array\n parentChildren.push(updatedTreeItem);\n \n // Update parent properties\n const updatedParent = {\n ...parent,\n [childrenKey]: parentChildren,\n [hasChildrenKey]: true\n } as T;\n itemMap.set(parentId, updatedParent);\n \n processedItems.add(itemId);\n }\n } else {\n // Parent not processed yet, defer this item\n remainingItems.push(item);\n }\n } else if (treeItem) {\n // This is a root item - automatically set level to 0\n const updatedRootItem = {\n ...treeItem,\n [levelKey]: 0,\n level: 0 // Always add 'level' property for consistent access\n } as T;\n itemMap.set(itemId, updatedRootItem);\n \n if (!rootItems.some(rootItem => \n String(this.getNestedValue(rootItem, primaryKey) || '') === itemId\n )) {\n rootItems.push(updatedRootItem);\n processedItems.add(itemId);\n }\n }\n });\n\n iteration++;\n }\n\n // Handle any remaining unprocessed items as roots (orphaned items)\n remainingItems.forEach(item => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n if (!processedItems.has(itemId)) {\n const treeItem = itemMap.get(itemId);\n if (treeItem && !rootItems.includes(treeItem)) {\n console.log(`Adding orphaned item ${itemId} as root`);\n rootItems.push(treeItem);\n }\n }\n });\n\n // Final pass: Update hasChildren property for all items in the tree\n const updateHasChildren = (items: T[]) => {\n items.forEach((item, index) => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\n const hasChildren = children.length > 0;\n \n // Update the item with correct hasChildren property\n const updatedItem = {\n ...item,\n [hasChildrenKey]: hasChildren\n } as T;\n \n // Update in the map\n itemMap.set(itemId, updatedItem);\n \n // Update the item in the array\n items[index] = updatedItem;\n \n // Recursively update children\n if (children.length > 0) {\n updateHasChildren(children);\n }\n });\n };\n\n // Get updated root items from the map to ensure we have the latest versions\n const updatedRootItems = rootItems.map(rootItem => {\n const rootId = String(this.getNestedValue(rootItem, primaryKey) || '');\n return itemMap.get(rootId) || rootItem;\n });\n \n // Update all root items and their descendants\n updateHasChildren(updatedRootItems);\n \n console.log('transformToTree - root items:', updatedRootItems.length);\n console.log('CC - processed items:', processedItems.size);\n console.log('transformToTree - sample root item with level:', updatedRootItems[0]);\n return updatedRootItems;\n }\n\n /**\n * Recursively calculate item level in hierarchy for unlimited depth support\n */\n private calculateItemLevel(item: T, itemMap: Map<string, T>, primaryKey: string, foreignKey: string, levelKey: string): number {\n // Check if level is already set correctly\n const currentLevel = this.getNestedValue(item, levelKey) as number;\n if (currentLevel !== undefined && currentLevel > 0) {\n return currentLevel;\n }\n\n // Get parent information\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const parentIdValue = this.getNestedValue(item, foreignKey);\n const parentId = parentIdValue !== null && parentIdValue !== undefined ? String(parentIdValue) : '';\n \n // If no parent, this is a root item (level 0)\n if (!parentId || !itemMap.has(parentId)) {\n return 0;\n }\n \n // Recursively calculate parent level and add 1\n const parent = itemMap.get(parentId)!;\n const parentLevel = this.calculateItemLevel(parent, itemMap, primaryKey, foreignKey, levelKey);\n \n // Update the item's level in the map\n const updatedItem = {\n ...item,\n [levelKey]: parentLevel + 1\n } as T;\n itemMap.set(itemId, updatedItem);\n \n return parentLevel + 1;\n }\n\n /**\n * Flatten tree structure for display, respecting expansion state with unlimited nesting\n */\n private flattenTreeForDisplay(treeItems: T[]): T[] {\n const result: T[] = [];\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return treeItems;\n \n const { childrenKey = 'children', expandedKey = 'isExpanded' } = treeConfig;\n \n const flatten = (items: T[], currentLevel: number = 0) => {\n items.forEach(item => {\n result.push(item);\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\n const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n \n if (children.length > 0 && isExpanded) {\n console.log(`Flattening children for item at level ${currentLevel}, children count: ${children.length}`);\n flatten(children, currentLevel + 1);\n }\n });\n };\n \n flatten(treeItems);\n console.log('flattenTreeForDisplay - result:', result.length, 'items');\n return result;\n }\n\n /**\n * Toggle expand/collapse state of a tree item with unlimited nesting support\n */\n private toggleTreeExpand(item: T): void {\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return;\n \n const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\n const currentExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n \n console.log(`toggleTreeExpand - item: ${itemId}, current expanded: ${currentExpanded}`);\n \n // Update the expanded state\n const updatedItem = {\n ...item,\n [expandedKey]: !currentExpanded\n } as T;\n \n // Update the item in the tree structure recursively\n const updateItemInTree = (treeData: T[]): T[] => {\n return treeData.map(treeItem => {\n const treeItemId = String(this.getNestedValue(treeItem, primaryKey) || '');\n \n if (treeItemId === itemId) {\n console.log(`Found item to update: ${itemId}, new expanded state: ${!currentExpanded}`);\n return updatedItem;\n }\n \n // Check children recursively\n const children = this.getNestedValue(treeItem, 'children') as T[] || [];\n if (children.length > 0) {\n const updatedChildren = updateItemInTree(children);\n return {\n ...treeItem,\n children: updatedChildren\n } as T;\n }\n \n return treeItem;\n });\n };\n \n // Update the internal data\n const updatedData = updateItemInTree([...this.internalData()]);\n this.internalData.set(updatedData);\n \n // Re-apply filters to update the display\n this.applyFilters();\n }\n\n private updatePaginationState() {\n const total = Math.ceil(this.totalItems() / this.pageSize());\n this.totalPages.set(total);\n \n // Ensure current page is within bounds\n if (total === 0) {\n this.currentPage.set(1);\n } else if (this.currentPage() > total) {\n this.currentPage.set(total);\n }\n }\n\n // ===== Pagination Methods =====\n \n onPageChange(page: number | string) {\n console.log('🔄 DataGrid: onPageChange called with page:', page);\n const pageNum = typeof page === 'string' ? parseInt(page, 10) : page;\n console.log('🔄 DataGrid: Parsed page number:', pageNum, 'Total pages:', this.totalPages());\n \n if (pageNum >= 1 && pageNum <= this.totalPages()) {\n // Set page change loading state\n this.pageChangeLoading.set(true);\n console.log('🔄 DataGrid: Set page change loading to true');\n \n this.currentPage.set(pageNum);\n \n if (this.serverSidePagination) {\n const pageData = { page: pageNum, pageSize: this.pageSize() };\n console.log('🔄 DataGrid: Emitting pageChange event for server-side pagination:', pageData);\n // Emit page data object for server-side pagination\n this.emitEvent('pageChange', pageData as unknown as T);\n // Don't clear loading state here - let the parent component handle it\n // The loading state will be cleared when new data arrives via ngOnChanges\n } else {\n console.log('🔄 DataGrid: Emitting pageChange event for client-side pagination:', pageNum);\n // Emit simple page number for client-side pagination\n this.emitEvent('pageChange', pageNum);\n // Clear loading state for client-side pagination\n this.clearPageChangeLoading();\n }\n } else {\n console.log('🔄 DataGrid: Page number out of range, not emitting event');\n }\n }\n\n onPageSizeChange() {\n // Set page change loading state\n this.pageChangeLoading.set(true);\n \n this.currentPage.set(1);\n this.updatePaginationState();\n \n if (this.serverSidePagination) {\n // Emit page data object for server-side pagination\n this.emitEvent('pageChange', { page: 1, pageSize: this.pageSize() } as unknown as T);\n // Don't clear loading state here - let the parent component handle it\n // The loading state will be cleared when new data arrives via ngOnChanges\n } else {\n // Emit simple page number for client-side pagination\n this.emitEvent('pageChange', 1);\n // Clear loading state for client-side pagination\n this.clearPageChangeLoading();\n }\n }\n\n updatePageSize(value: string | number) {\n this.pageSize.set(+value);\n this.onPageSizeChange();\n }\n\n previousPage() {\n if (this.hasPreviousPage()) {\n this.onPageChange(this.currentPage() - 1);\n }\n }\n\n nextPage() {\n if (this.hasNextPage()) {\n this.onPageChange(this.currentPage() + 1);\n }\n }\n\n onJumpToPage() {\n if (this.jumpToPage >= 1 && this.jumpToPage <= this.totalPages()) {\n this.onPageChange(this.jumpToPage);\n }\n }\n\n getEnhancedPageNumbers(): (number | string)[] {\n const total = this.totalPages();\n const current = this.currentPage();\n const pages: (number | string)[] = [];\n \n if (total <= 7) {\n for (let i = 1; i <= total; i++) {\n pages.push(i);\n }\n } else {\n pages.push(1);\n \n if (current <= 4) {\n for (let i = 2; i <= 5; i++) {\n pages.push(i);\n }\n pages.push('...');\n pages.push(total);\n } else if (current >= total - 3) {\n pages.push('...');\n for (let i = total - 4; i <= total; i++) {\n pages.push(i);\n }\n } else {\n pages.push('...');\n for (let i = current - 1; i <= current + 1; i++) {\n pages.push(i);\n }\n pages.push('...');\n pages.push(total);\n }\n }\n \n return pages;\n }\n\n // ===== Search Methods =====\n \n updateSearchQuery(value: inputType) {\n console.log('updateSearchQuery', value);\n const searchValue = value as string;\n this.searchQuery.set(searchValue);\n \n // Clear any existing debounce timer\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n \n // Apply debounce for search\n const debounceMs = this.mergedConfig().search.debounceMs || 300;\n this.searchDebounceTimer = setTimeout(() => {\n // Only emit search event for server-side pagination\n // Don't trigger any client-side filtering that might cause re-renders\n if (this.serverSidePagination) {\n this.currentPage.set(1);\n this.emitEvent('search', searchValue);\n } else {\n this.onSearch();\n }\n }, debounceMs);\n }\n \n onSearch() {\n this.currentPage.set(1);\n \n if (this.serverSidePagination) {\n // For server-side pagination, only emit the search event\n // Don't apply client-side filters as the server will handle the search\n this.emitEvent('search', this.searchQuery());\n } else {\n // For client-side pagination, apply filters locally\n this.applyFilters();\n this.emitEvent('search', this.searchQuery());\n }\n }\n\n // ===== Action Methods =====\n \n onRefresh() {\n this.isRefreshing.set(true);\n this.emitEvent('refresh', null);\n \n // The parent component should handle the actual refresh and call setRefreshing(false) when done\n // We don't auto-reset here to allow the parent to control the refresh state\n }\n\n // Method to allow parent components to control the refreshing state\n setRefreshing(isRefreshing: boolean) {\n this.isRefreshing.set(isRefreshing);\n }\n\n // Method to clear page change loading state when new data is received\n clearPageChangeLoading() {\n this.pageChangeLoading.set(false);\n }\n\n // ===== Tree View Helper Methods =====\n \n /**\n * Check if tree view is enabled\n */\n isTreeEnabled(): boolean {\n const enabled = this.mergedConfig().tree?.enabled || false;\n return enabled;\n }\n\n /**\n * Get tree configuration\n */\n getTreeConfig() {\n return this.mergedConfig().tree;\n }\n\n /**\n * Check if an item has children\n */\n hasChildren(item: T): boolean {\n const treeConfig = this.getTreeConfig();\n if (!treeConfig) return false;\n \n const { hasChildrenKey = 'hasChildren', childrenKey = 'children' } = treeConfig;\n \n // Check hasChildren property first\n const hasChildren = this.getNestedValue(item, hasChildrenKey) as boolean;\n if (hasChildren !== undefined) {\n return hasChildren;\n }\n \n // Fallback to checking children array\n const children = this.getNestedValue(item, childrenKey) as T[];\n return children && children.length > 0;\n }\n\n /**\n * Get item level in tree\n */\n getItemLevel(item: T): number {\n // Always try to get level from standard 'level' property first (set by transformToTree)\n let level = this.getNestedValue(item, 'level') as number;\n \n // If not found, try tree config level key\n if (level === undefined || level === null) {\n const treeConfig = this.getTreeConfig();\n if (treeConfig) {\n const { levelKey = 'level' } = treeConfig;\n level = this.getNestedValue(item, levelKey) as number || 0;\n } else {\n level = 0;\n }\n }\n \n return level;\n }\n\n /**\n * Check if item is expanded\n */\n isItemExpanded(item: T): boolean {\n const treeConfig = this.getTreeConfig();\n if (!treeConfig) return false;\n \n const { expandedKey = 'isExpanded' } = treeConfig;\n return this.getNestedValue(item, expandedKey) as boolean || false;\n }\n\n /**\n * Get tree indent style\n */\n getTreeIndentStyle(item: T): string {\n const level = this.getItemLevel(item);\n \n // Specific padding progression: Level 1=12px, Level 2=22px, Level 3=32px, Level 4=52px\n const basePadding = 12; // Base cell padding (replaces tw-px-3)\n let levelPadding = 0;\n \n switch (level) {\n case 0: // Level 1 (root)\n levelPadding = 0;\n break;\n case 1: // Level 2\n levelPadding = 10;\n break;\n case 2: // Level 3\n levelPadding = 20;\n break;\n case 3: // Level 4\n levelPadding = 40;\n break;\n default: // Level 5+\n levelPadding = 40 + ((level - 3) * 20); // Continue with 20px increments\n break;\n }\n \n const totalPadding = `${basePadding + levelPadding}px`;\n return totalPadding;\n }\n\n /**\n * Get tree level background class for visual distinction\n */\n getTreeLevelClass(item: T): string {\n const level = this.getItemLevel(item);\n if (level === 0) return 'tree-level-0'; // Root level\n if (level === 1) return 'tree-level-1'; // First child level \n if (level === 2) return 'tree-level-2'; // Second child level\n return 'tree-level-deep'; // Deep nesting (3+ levels)\n }\n\n // ===== Drag and Drop Helper Methods =====\n \n /**\n * Check if drag and drop is enabled\n */\n isDragDropEnabled(): boolean {\n return this.dragDropEnabled || this.mergedConfig().dragDrop?.enabled || false;\n }\n\n /**\n * Get drag and drop configuration\n */\n getDragDropConfig() {\n return this.mergedConfig().dragDrop;\n }\n\n /**\n * Handle drag start event\n */\n onDragStart(event: DragEvent, item: T, index: number): void {\n if (!this.isDragDropEnabled()) return;\n \n this.isDragging.set(true);\n \n // Store the current order IDs when drag starts for comparison\n this.originalOrderIds = this.displayedData.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\n console.log('🔍 Drag started, current order IDs stored:', this.originalOrderIds);\n \n const dragConfig = this.getDragDropConfig();\n const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\n \n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n event.dataTransfer.setData('text/plain', JSON.stringify({ item, index }));\n }\n \n // Find the closest tr element and apply drag styles\n const rowElement = (event.target as HTMLElement).closest('tr');\n if (rowElement) {\n dragClass.split(' ').forEach(cls => rowElement.classList.add(cls));\n // Add additional visual feedback\n rowElement.style.transform = 'scale(1.02)';\n rowElement.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)';\n rowElement.style.zIndex = '1000';\n }\n }\n\n /**\n * Handle drag over event\n */\n onDragOver(event: DragEvent): void {\n if (!this.isDragDropEnabled()) return;\n \n event.preventDefault();\n event.dataTransfer!.dropEffect = 'move';\n \n // Find the row index from the closest tr element\n const rowElement = (event.target as HTMLElement).closest('tr');\n if (rowElement) {\n const tbody = rowElement.closest('tbody');\n if (tbody) {\n const rowIndex = Array.from(tbody.children).indexOf(rowElement);\n this.isDragOverRow = rowIndex;\n }\n }\n }\n\n /**\n * Handle drag leave event\n */\n onDragLeave(event: DragEvent): void {\n console.log('onDragLeave', event);\n if (!this.isDragDropEnabled()) return;\n \n // Clear drag over row tracking\n this.isDragOverRow = null;\n }\n\n /**\n * Handle drop event\n */\n onDrop(event: DragEvent, targetItem: T, targetIndex: number): void {\n if (!this.isDragDropEnabled()) return;\n \n event.preventDefault();\n \n // Clear drag over row tracking\n this.isDragOverRow = null;\n \n try {\n const data = JSON.parse(event.dataTransfer!.getData('text/plain'));\n const sourceItem = data.item as T;\n const sourceIndex = data.index as number;\n \n if (sourceIndex !== targetIndex) {\n const newOrder = this.getNewOrder(sourceIndex, targetIndex);\n console.log('🔍 Drop completed, updating local order only:', { sourceItem, sourceIndex, targetItem, targetIndex, newOrder });\n \n // Update the row order map with new positions (LOCAL ONLY)\n this.updateRowOrderMap(newOrder);\n \n // Update local data for visual reordering (LOCAL ONLY)\n this.updateLocalDataOrder(newOrder);\n \n // Check if any row has changed position\n const hasActuallyChanged = this.checkIfOrderChanged();\n this.hasOrderChanged.set(hasActuallyChanged);\n console.log('🔍 Local order changed:', hasActuallyChanged);\n \n // IMPORTANT: DO NOT emit reorder event here - only store locally\n // External components will be updated only when \"Save Order\" is clicked\n console.log('🔍 Order change stored locally - external components not updated until save');\n } else {\n console.log('Source and target index are the same, skipping reorder');\n }\n } catch (error) {\n console.error('Error parsing drag data:', error);\n }\n }\n\n /**\n * Handle drag end event\n */\n onDragEnd(event: DragEvent): void {\n if (!this.isDragDropEnabled()) return;\n \n this.isDragging.set(false);\n \n // Check if order has changed after drag ends\n const hasActuallyChanged = this.checkIfOrderChanged();\n this.hasOrderChanged.set(hasActuallyChanged);\n \n const dragConfig = this.getDragDropConfig();\n const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\n \n // Clear drag over row tracking\n this.isDragOverRow = null;\n \n // Find the closest tr element and remove drag styles\n const rowElement = (event.target as HTMLElement).closest('tr');\n if (rowElement) {\n dragClass.split(' ').forEach(cls => rowElement.classList.remove(cls));\n // Remove additional visual feedback\n rowElement.style.transform = '';\n rowElement.style.boxShadow = '';\n rowElement.style.zIndex = '';\n }\n }\n\n /**\n * Calculate new order after reordering\n */\n private getNewOrder(sourceIndex: number, targetIndex: number): T[] {\n const data = [...this.displayedData];\n const [movedItem] = data.splice(sourceIndex, 1);\n data.splice(targetIndex, 0, movedItem);\n return data;\n }\n\n /**\n * Get the current order number for a specific item\n */\n getCurrentOrderNumber(item: T): number {\n const itemId = this.getItemId(item);\n if (itemId && this.rowOrderMap.has(itemId)) {\n return this.rowOrderMap.get(itemId)!.newPosition;\n }\n \n // Fallback to actual order field value from config\n const actualOrder = this.getItemOrder(item);\n if (actualOrder > 0) {\n return actualOrder;\n }\n \n // Final fallback to index-based calculation\n const currentIndex = this.displayedData.findIndex(currentItem => {\n if (item && currentItem && typeof item === 'object' && typeof currentItem === 'object') {\n const itemId = (item as Record<string, unknown>)['_id'];\n const currentItemId = (currentItem as Record<string, unknown>)['_id'];\n return itemId && currentItemId && itemId === currentItemId;\n }\n return item === currentItem;\n });\n return currentIndex >= 0 ? currentIndex + 1 : 0;\n }\n\n /**\n * Update the row order map with new positions after reordering\n */\n private updateRowOrderMap(newOrder: T[]): void {\n newOrder.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId && this.rowOrderMap.has(itemId)) {\n const currentEntry = this.rowOrderMap.get(itemId)!;\n // Calculate new order value based on position and original order field\n const dragDropConfig = this.getDragDropConfig();\n if (dragDropConfig?.orderField) {\n // Use the order field from config to calculate new order values\n const baseOrder = Math.min(...this.displayedData.map(item => this.getItemOrder(item)));\n const newOrderValue = baseOrder + index;\n currentEntry.newPosition = newOrderValue;\n } else {\n // Fallback to index-based position\n currentEntry.newPosition = index + 1;\n }\n this.rowOrderMap.set(itemId, currentEntry);\n }\n });\n \n console.log('🔍 Row order map updated with new order values:', Array.from(this.rowOrderMap.entries()));\n }\n\n /**\n * Check if any row has changed position by comparing old vs new positions\n */\n private checkIfOrderChanged(): boolean {\n for (const [itemId, orderInfo] of this.rowOrderMap) {\n if (orderInfo.oldPosition !== orderInfo.newPosition) {\n console.log('🔍 Order change detected for item:', itemId, orderInfo);\n return true;\n }\n }\n console.log('🔍 No order change detected');\n return false;\n }\n\n /**\n * Reset the row order map to original positions (for reset action)\n */\n private resetRowOrderMap(): void {\n // Get the current full dataset from the config (not cached data)\n const fullData = this.mergedConfig().data || [];\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1),\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n // Clear any local reordered data\n this.localReorderedData = [];\n this.hasOrderChanged.set(false);\n \n console.log('🔍 Row order map completely rebuilt from current data:', this.initialDataOrderIds.length, 'items');\n }\n\n /**\n * Update the row order map baseline to current positions (for save action)\n */\n private updateRowOrderMapBaseline(): void {\n // Get the current full dataset from the config\n const fullData = this.mergedConfig().data || [];\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with current data\n fullData.forEach((item, index) => {\n const itemId = this.getItemId(item);\n if (itemId) {\n const actualOrder = this.getItemOrder(item);\n this.initialDataOrderIds.push(itemId);\n this.rowOrderMap.set(itemId, {\n oldPosition: actualOrder || (index + 1),\n newPosition: actualOrder || (index + 1)\n });\n }\n });\n \n console.log('🔍 Row order map baseline completely rebuilt from current data:', this.initialDataOrderIds.length, 'items');\n }\n\n /**\n * Get the current order array from the row order map\n */\n private getCurrentOrderFromMap(): T[] {\n const orderedItems: Array<{ item: T; newPosition: number }> = [];\n \n // Get the full dataset from the config (not just displayedData)\n const fullData = this.mergedConfig().data || [];\n \n // Collect all items with their new positions from the full dataset\n this.rowOrderMap.forEach((orderInfo, itemId) => {\n const item = fullData.find(dataItem => this.getItemId(dataItem) === itemId);\n if (item) {\n orderedItems.push({ item, newPosition: orderInfo.newPosition });\n }\n });\n \n // Sort by new position and return items in order\n return orderedItems\n .sort((a, b) => a.newPosition - b.newPosition)\n .map(orderedItem => orderedItem.item);\n }\n\n /**\n * Update local data order for visual reordering (LOCAL ONLY)\n */\n private updateLocalDataOrder(newOrder: T[]): void {\n // Store the reordered data locally for visual display\n this.localReorderedData = [...newOrder];\n console.log('🔍 Local data order updated for visual display:', this.localReorderedData.length, 'items');\n }\n\n /**\n * Check if the current order has changed from the initial order\n */\n private checkOrderChanged(currentOrder: T[]): boolean {\n if (this.initialDataOrderIds.length !== currentOrder.length) {\n return true;\n }\n \n // Create arrays of IDs to compare order\n const currentIds = currentOrder.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\n \n // Compare the sequences\n for (let i = 0; i < this.initialDataOrderIds.length; i++) {\n if (this.initialDataOrderIds[i] !== currentIds[i]) {\n console.log('🔍 Order changed detected:', {\n position: i,\n initial: this.initialDataOrderIds[i],\n current: currentIds[i]\n });\n return true;\n }\n }\n \n console.log('🔍 No order change detected');\n return false;\n }\n\n onRowClick(item: T) {\n if (this.mergedConfig().onRowClick) {\n this.emitEvent('rowClick', item);\n }\n }\n\n onActionClick(item: T, action: GridAction) {\n // Handle tree expand/collapse actions\n if (action.key === 'toggle-expand' && this.mergedConfig().tree?.enabled) {\n this.toggleTreeExpand(item);\n }\n \n // Handle order management actions\n if (action.key === 'reset-order') {\n this.hasOrderChanged.set(false);\n // Reset the row order map to current positions (LOCAL ONLY)\n this.resetRowOrderMap();\n // Clear local reordered data to revert to original display\n this.localReorderedData = [];\n console.log('🔍 Reset clicked, row order map reset locally, visual display reverted');\n } else if (action.key === 'save-order') {\n this.hasOrderChanged.set(false);\n // Update the row order map to current positions as new baseline\n this.updateRowOrderMapBaseline();\n // Clear local reordered data as it's now the baseline\n this.localReorderedData = [];\n console.log('🔍 Save clicked, row order map updated to new baseline, local data cleared');\n \n // NOW emit the reorder event to update external components\n const currentOrder = this.getCurrentOrderFromMap();\n if (currentOrder.length > 0) {\n console.log('🔍 Emitting rowReorder event to update external components:', currentOrder);\n // Use the expected GridEvent structure for rowReorder\n this.emitEvent('rowReorder', {\n sourceItem: currentOrder[0], // First item as source\n sourceIndex: 0, // First position as source\n targetItem: currentOrder[currentOrder.length - 1], // Last item as target\n targetIndex: currentOrder.length - 1, // Last position as target\n newOrder: currentOrder // The complete new order\n });\n }\n }\n \n if (this.actionHandlers[action.onClick]) {\n this.actionHandlers[action.onClick](item, action);\n }\n this.emitEvent('action', item, undefined, action);\n }\n\n // ===== Utility Methods =====\n \n private emitEvent(type: GridEvent<T>['type'], data: GridEvent<T>['data'], column?: GridColumn, action?: GridAction) {\n this.gridEvent.emit({ type, data, column, action } as GridEvent<T>);\n }\n\n /**\n * Get nested value from an object\n * @param obj - The object to get the nested value from\n * @param path - The path to the nested value (e.g., 'contact.email')\n * @returns The nested value or undefined if not found\n * @example\n * const obj = { contact: { email: 'test@example.com' } };\n * const value = getNestedValue(obj, 'contact.email');\n * // value === 'test@example.com'\n */\n getNestedValue(obj: T, path: string): unknown {\n return path.split('.').reduce((current: unknown, key: string) => {\n return current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined;\n }, obj);\n }\n\n formatValue(value: unknown, column: GridColumn): string {\n if (column.formatter) {\n if (column.formatter.type === 'custom' && column.formatter.customFunction) {\n const formatter = this.customFormatters[column.formatter.customFunction];\n if (formatter) {\n return formatter(value, column.formatter.format);\n }\n }\n \n // Built-in formatters\n switch (column.formatter.type) {\n case 'date':\n return this.formatDate(value);\n case 'currency':\n return this.formatCurrency(value, column.formatter.format);\n case 'percentage':\n return this.formatPercentage(value);\n default:\n return String(value || '');\n }\n }\n \n return String(value || '');\n }\n\n private formatDate(value: unknown): string {\n if (!value) return 'N/A';\n const date = new Date(value as string);\n return isNaN(date.getTime()) ? 'Invalid Date' : date.toLocaleDateString();\n }\n\n private formatCurrency(value: unknown, currency = 'USD'): string {\n if (value === null || value === undefined) return 'N/A';\n const num = Number(value);\n return isNaN(num) ? 'N/A' : new Intl.NumberFormat('en-US', { \n style: 'currency', \n currency \n }).format(num);\n }\n\n private formatPercentage(value: unknown): string {\n if (value === null || value === undefined) return 'N/A';\n const num = Number(value);\n return isNaN(num) ? 'N/A' : `${num}%`;\n }\n\n // Template renderer methods\n isTemplateRenderer(rendererKey: string): boolean {\n return !!this.templateRenderers[rendererKey];\n }\n\n getTemplateRenderer(rendererKey: string): TemplateRenderer<T> | null {\n return this.templateRenderers[rendererKey] as TemplateRenderer<T> | null;\n }\n\n getTemplateContext(value: unknown, row: T, column: GridColumn): TemplateContext<T> {\n return {\n $implicit: value,\n row,\n value,\n column\n };\n }\n\n getColumnWidthClass(width?: ColumnWidth): string {\n if (!width || width === 'auto') return '';\n \n const widthMap = {\n 'xs': 'tw-w-16',\n 'sm': 'tw-w-24',\n 'md': 'tw-w-32',\n 'lg': 'tw-w-48',\n 'xl': 'tw-w-64'\n };\n \n return widthMap[width as keyof typeof widthMap] || `tw-w-[${width}]`;\n }\n\n getColumnMaxWidthClass(width?: ColumnWidth): string {\n if (!width || width === 'auto') return 'tw-max-w-xs';\n \n const maxWidthMap = {\n 'xs': 'tw-max-w-16',\n 'sm': 'tw-max-w-24',\n 'md': 'tw-max-w-32',\n 'lg': 'tw-max-w-48',\n 'xl': 'tw-max-w-64'\n };\n \n return maxWidthMap[width as keyof typeof maxWidthMap] || `tw-max-w-[${width}]`;\n }\n\n getStatusClass(value: unknown, statusConfig?: StatusConfig): string {\n if (!statusConfig) return '';\n return value === statusConfig.activeValue ? statusConfig.activeClass : statusConfig.inactiveClass;\n }\n\n getStatusText(value: unknown, statusConfig?: StatusConfig): string {\n if (!statusConfig) return String(value || '');\n return value === statusConfig.activeValue ? statusConfig.activeLabel : statusConfig.inactiveLabel;\n }\n\n getItemRangeText(): string {\n const total = this.totalItems();\n \n if (this.serverSidePagination) {\n // For server-side pagination, calculate based on actual displayed data\n const displayedCount = this.displayedData.length;\n const start = (this.currentPage() - 1) * this.pageSize() + 1;\n const end = start + displayedCount - 1;\n return `${start}-${end} of ${total}`;\n } else {\n // For client-side pagination, use the original logic\n const start = (this.currentPage() - 1) * this.pageSize() + 1;\n const end = Math.min(this.currentPage() * this.pageSize(), total);\n return `${start}-${end} of ${total}`;\n }\n }\n\n getPageSizeOptions() {\n return this.mergedConfig().pagination.pageSizeOptions.map(size => ({\n value: size,\n label: size.toString()\n }));\n }\n\n trackByFn(index: number, item: T): unknown {\n const trackBy = this.mergedConfig().trackBy || '_id';\n return this.getNestedValue(item, trackBy) || index;\n }\n\n getSkeletonArray(): number[] {\n return Array.from({ length: this.loadingConfig.skeletonRows }, (_, i) => i);\n }\n\n // ===== Template Helper Methods =====\n \n get displayedData(): T[] {\n // If we have local reordered data (from drag & drop), use that for visual display\n if (this.localReorderedData.length > 0 && this.hasOrderChanged()) {\n console.log('🔍 Using local reordered data for display:', this.localReorderedData.length, 'items');\n return this.localReorderedData;\n }\n \n const data = this.filteredData();\n \n // For server-side pagination, the server already provides the correct page of data\n // For client-side pagination, we need to slice the data\n if (this.serverSidePagination) {\n return data;\n } else {\n const start = (this.currentPage() - 1) * this.pageSize();\n const end = start + this.pageSize();\n return data.slice(start, end);\n }\n }\n\n get columns(): GridColumn[] {\n const baseColumns = this.mergedConfig().columns || [];\n return baseColumns;\n }\n\n get paginationConfig() {\n return this.mergedConfig().pagination;\n }\n\n get searchConfig() {\n return this.mergedConfig().search;\n }\n\n get loadingConfig() {\n return this.mergedConfig().loading;\n }\n\n get scrollConfig() {\n return this.mergedConfig().scroll;\n }\n} "," <!-- Data Grid Component -->\n <div class=\"data-grid-container tw-bg-white tw-shadow tw-rounded-lg tw-overflow-visible tw-flex tw-flex-col\" \n [ngClass]=\"[\n mergedConfig().tableClass || '',\n mergedConfig().fullHeight ? 'tw-h-full' : '',\n isDragDropEnabled() ? 'drag-drop-enabled' : '',\n isTreeEnabled() ? 'tree-enabled' : ''\n ]\">\n \n <!-- Header Section -->\n @if (mergedConfig().title || mergedConfig().subtitle) {\n <div class=\"tw-px-3 tw-py-2 tw-border-b tw-border-gray-200\">\n @if (mergedConfig().title) {\n <h3 class=\"tw-text-base tw-font-semibold tw-text-gray-900\">\n {{ mergedConfig().title }}\n </h3>\n }\n @if (mergedConfig().subtitle) {\n <p class=\"tw-text-sm tw-text-gray-600 tw-mt-0.5\">\n {{ mergedConfig().subtitle }}\n </p>\n }\n </div>\n }\n\n <!-- Search Section -->\n @if (searchConfig.enabled) {\n <div class=\"tw-px-3 tw-py-2 tw-border-b tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <!-- Search Input -->\n <div class=\"tw-max-w-md\">\n <cide-ele-input [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\" id=\"search-input\" type=\"text\"\n [ngModel]=\"searchQuery()\"\n (ngModelChange)=\"updateSearchQuery($event)\"\n [placeholder]=\"searchConfig.placeholder\"\n [disabled]=\"loading() || isRefreshing()\"\n leadingIcon=\"search\"\n fill=\"outline\">\n </cide-ele-input>\n </div>\n \n <!-- Drag Order Actions -->\n @if (isDragDropEnabled() && (isDragging() || hasOrderChanged())) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <button cideEleButton \n variant=\"outline\" \n size=\"sm\" \n (click)=\"onActionClick(null, { key: 'reset-order', label: 'Reset Order', icon: 'undo', variant: 'outline', onClick: 'resetOrder' })\"\n class=\"tw-text-blue-700 tw-border-blue-300 hover:tw-bg-blue-100\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">undo</cide-ele-icon>\n Reset Order\n </button>\n <button cideEleButton \n variant=\"primary\" \n size=\"sm\" \n (click)=\"onActionClick(null, { key: 'save-order', label: 'Save Order', icon: 'save', variant: 'primary', onClick: 'saveOrder' })\"\n class=\"tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white\">\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">save</cide-ele-icon>\n Save Order\n </button>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Table Section -->\n <div class=\"tw-overflow-x-auto tw-relative\"\n [ngClass]=\"{\n 'tw-flex-1 tw-min-h-0': mergedConfig().fullHeight,\n 'tw-overflow-y-auto': scrollConfig?.enabled,\n 'tw-max-h-full': scrollConfig?.enabled\n }\"\n [style.maxHeight]=\"scrollConfig?.enabled ? scrollConfig?.maxHeight : null\"\n [style.minHeight]=\"scrollConfig?.enabled ? scrollConfig?.minHeight : null\">\n <table class=\"tw-min-w-full tw-divide-y tw-divide-gray-200 tw-h-full tw-table-fixed\"\n [class.empty-table]=\"displayedData.length === 0\"\n [ngClass]=\"{\n 'tw-table-striped': mergedConfig().striped,\n 'tw-border': mergedConfig().bordered,\n 'tw-table-sm': mergedConfig().compact\n }\"\n style=\"table-layout: fixed;\">\n \n <!-- Table Header -->\n <thead class=\"tw-bg-gray-50\" \n [ngClass]=\"[\n mergedConfig().headerClass || '',\n scrollConfig?.enabled && scrollConfig?.stickyHeader ? 'tw-sticky tw-top-0 tw-z-10' : ''\n ]\">\n <tr>\n @for (column of columns; track column.key) {\n <th\n class=\"tw-px-3 tw-py-2 tw-text-left tw-text-xs tw-font-medium tw-text-gray-500 tw-uppercase tw-tracking-wider tw-truncate\"\n [ngClass]=\"[\n getColumnWidthClass(column.width),\n getColumnMaxWidthClass(column.width),\n column.align === 'center' ? 'tw-text-center' : '',\n column.align === 'right' ? 'tw-text-right' : ''\n ]\"\n [title]=\"column.header\">\n {{ column.header }}\n </th>\n }\n </tr>\n </thead>\n\n <!-- Table Body -->\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-gray-200\">\n @if (loading() || isRefreshing() || pageChangeLoading()) {\n <!-- Skeleton Loading Rows -->\n @for (skeletonItem of getSkeletonArray(); track $index) {\n <tr class=\"tw-animate-pulse tw-border-b tw-border-gray-200\">\n @for (column of columns; track column.key) {\n <td class=\"tw-px-3 tw-py-2 tw-whitespace-nowrap\"\n [ngClass]=\"[\n getColumnWidthClass(column.width),\n getColumnMaxWidthClass(column.width)\n ]\">\n <div class=\"tw-h-2 tw-bg-gray-200 tw-rounded tw-w-3/4\"></div>\n </td>\n }\n </tr>\n }\n } @else {\n @for (item of displayedData; track trackByFn($index, item)) {\n <tr class=\"tw-group hover:tw-bg-gray-50 tw-border-b-2 tw-border-gray-200\"\n [ngClass]=\"[\n mergedConfig().rowClass || '',\n isRefreshing() ? 'tw-opacity-60 tw-pointer-events-none' : '',\n isDragDropEnabled() ? 'tw-cursor-move tw-border-2 tw-border-transparent' : '',\n !isDragDropEnabled() ? 'tw-transition-colors tw-duration-150' : '',\n isTreeEnabled() ? getTreeLevelClass(item) : ''\n ]\"\n [style.border-color]=\"isDragOverRow === $index ? '#3b82f6' : 'transparent'\"\n [style.background-color]=\"isDragOverRow === $index ? '#eff6ff' : ''\"\n (click)=\"onRowClick(item)\"\n (keydown.enter)=\"onRowClick(item)\"\n (keydown.space)=\"onRowClick(item)\"\n [class.tw-cursor-pointer]=\"mergedConfig().onRowClick && !isDragDropEnabled()\"\n [tabindex]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 0 : -1\"\n [attr.role]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'button' : null\"\n [attr.aria-label]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'Select row' : null\"\n [draggable]=\"isDragDropEnabled()\"\n (dragstart)=\"onDragStart($event, item, $index)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event, item, $index)\"\n (dragend)=\"onDragEnd($event)\">\n \n @for (column of columns; track column.key) {\n <td class=\"tw-pr-3 tw-py-1 tw-relative\"\n [ngClass]=\"[\n getColumnWidthClass(column.width),\n getColumnMaxWidthClass(column.width),\n mergedConfig().cellClass || '',\n column.align === 'center' ? 'tw-text-center' : '',\n column.align === 'right' ? 'tw-text-right' : '',\n column.truncate !== false ? 'tw-whitespace-nowrap' : 'tw-whitespace-normal'\n ]\"\n [style.paddingLeft]=\"isTreeEnabled() && $index === 0 ? getTreeIndentStyle(item) : '12px'\"\n [style.maxWidth]=\"getColumnMaxWidthClass(column.width) === 'tw-max-w-xs' ? '200px' : getColumnMaxWidthClass(column.width) === 'tw-max-w-sm' ? '300px' : getColumnMaxWidthClass(column.width) === 'tw-max-w-md' ? '400px' : 'none'\"\n [style.minWidth]=\"isTreeEnabled() && $index === 0 ? '150px' : '100px'\">\n <!-- Tree Expand/Collapse Button (only for first column when tree is enabled) -->\n @if (isTreeEnabled() && $index === 0) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <!-- Tree Indentation -->\n <div class=\"tw-flex tw-items-center\">\n @if (hasChildren(item)) {\n <button \n variant=\"outline\"\n size=\"xs\"\n type=\"button\"\n (click)=\"onActionClick(item, { key: 'toggle-expand', label: 'Toggle', icon: '', variant: 'ghost', onClick: 'toggle-expand' }); $event.stopPropagation()\"\n class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-text-gray-500 hover:tw-text-gray-700 tw-rounded\"\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\n [title]=\"isItemExpanded(item) ? 'Collapse' : 'Expand'\">\n <cide-ele-icon \n class=\"tw-w-3 tw-h-3\"\n [class.tw-transition-transform]=\"!isDragDropEnabled()\"\n [class.tw-rotate-90]=\"isItemExpanded(item)\"\n size=\"xs\">\n chevron_right\n </cide-ele-icon>\n </button>\n } @else {\n <div class=\"tw-w-8 tw-h-5 tw-flex tw-items-center tw-justify-center\">\n <!-- <div class=\"tw-w-1 tw-h-1 tw-bg-gray-300 tw-rounded-full\"></div> -->\n </div>\n }\n </div>\n \n <!-- Cell Content -->\n <div class=\"tw-flex-1 tw-w-full\">\n @if (column.type === 'text') {\n <p class=\"tw-text-sm tw-text-gray-900\"\n [class.tw-truncate]=\"column.truncate\"\n [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </p>\n } @else if (column.type === 'number') {\n <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'date') {\n <span class=\"tw-text-sm tw-text-gray-600\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'boolean') {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\n </span>\n } @else if (column.type === 'status' && column.statusConfig) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\n {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\n </span>\n } @else if (column.type === 'actions' && column.actions) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @for (action of column.actions; track action.key) {\n <button\n cideEleButton\n [variant]=\"action.variant || 'ghost'\"\n size=\"xs\"\n type=\"button\"\n (click)=\"onActionClick(item, action); $event.stopPropagation()\"\n [title]=\"action.tooltip || action.label\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\n [ngClass]=\"{\n 'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\n 'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\n 'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\n 'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\n }\">\n @if (action.icon) {\n <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 12l-5-5h10l-5 5z\"/>\n </svg>\n }\n {{ action.label }}\n </button>\n }\n </div>\n } @else if (column.type === 'custom') {\n <!-- Template Renderer -->\n @if (column.renderer && isTemplateRenderer(column.renderer)) {\n <ng-container \n *ngTemplateOutlet=\"getTemplateRenderer(column.renderer)!; \n context: getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </ng-container>\n }\n <!-- Default rendering -->\n @else {\n <div>{{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}</div>\n }\n }\n </div>\n </div>\n } @else {\n <!-- Regular cell content (non-tree or non-first column) -->\n @if (column.type === 'text') {\n <p class=\"tw-text-sm tw-text-gray-900\"\n [class.tw-truncate]=\"column.truncate\"\n [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </p>\n } @else if (column.type === 'number') {\n <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'date') {\n <span class=\"tw-text-sm tw-text-gray-600\">\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\n </span>\n } @else if (column.type === 'boolean') {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\n {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\n </span>\n } @else if (column.type === 'status' && column.statusConfig) {\n <span class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-0.5 tw-rounded-full tw-text-xs tw-font-medium\"\n [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\n {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\n </span>\n } @else if (column.type === 'actions' && column.actions) {\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n @for (action of column.actions; track action.key) {\n <button\n cideEleButton\n [variant]=\"action.variant || 'ghost'\"\n size=\"xs\"\n type=\"button\"\n (click)=\"onActionClick(item, action); $event.stopPropagation()\"\n [title]=\"action.tooltip || action.label\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\n [ngClass]=\"{\n 'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\n 'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\n 'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\n 'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\n }\">\n @if (action.icon) {\n <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path d=\"M10 12l-5-5h10l-5 5z\"/>\n </svg>\n }\n {{ action.label }}\n </button>\n }\n </div>\n } @else if (column.type === 'custom') {\n <!-- Template Renderer -->\n @if (column.renderer && isTemplateRenderer(column.renderer)) {\n <ng-container \n *ngTemplateOutlet=\"getTemplateRenderer(column.renderer)!; \n context: getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\n </ng-container>\n }\n <!-- Default rendering -->\n @else {\n <div>{{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}</div>\n }\n }\n }\n </td>\n }\n </tr>\n }\n \n <!-- Empty State -->\n @if (displayedData.length === 0) {\n <tr class=\"tw-h-full\">\n <td [attr.colspan]=\"columns.length\" class=\"tw-px-6 tw-py-22 tw-text-center tw-h-full tw-align-middle\">\n <div class=\"tw-text-gray-500 tw-flex tw-flex-col tw-items-center tw-justify-center tw-min-h-[300px]\">\n <svg class=\"tw-mx-auto tw-h-12 tw-w-12 tw-text-gray-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"></path>\n </svg>\n <h3 class=\"tw-mt-2 tw-text-sm tw-font-medium tw-text-gray-900\">No data found</h3>\n <p class=\"tw-mt-1 tw-text-sm tw-text-gray-500\">\n @if (searchQuery()) {\n No results match your search criteria.\n } @else {\n There are no items to display.\n }\n </p>\n </div>\n </td>\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <!-- Pagination Section -->\n @if (paginationConfig.enabled && totalItems() > 0) {\n <div class=\"tw-px-3 tw-py-2 tw-border-t tw-border-gray-200 tw-bg-white tw-relative tw-z-20\"\n [class.tw-opacity-60]=\"isRefreshing()\">\n \n <!-- Results Info and Page Size -->\n <div class=\"tw-flex tw-flex-col sm:tw-flex-row tw-justify-between tw-items-start sm:tw-items-center tw-space-y-2 sm:tw-space-y-0\">\n \n <!-- Results Info -->\n @if (paginationConfig.showPageInfo) {\n <div class=\"tw-flex tw-items-center tw-space-x-4\">\n <p class=\"tw-text-sm tw-text-gray-700\">\n Showing {{ getItemRangeText() }} results\n </p>\n \n <!-- Page Size Selector -->\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\n <span class=\"tw-text-sm tw-text-gray-700\">Per page:</span>\n <div class=\"tw-w-20 tw-relative\">\n <cide-ele-select\n [labelHide]=\"true\"\n [ngModel]=\"pageSize()\"\n (ngModelChange)=\"updatePageSize($event)\"\n [options]=\"getPageSizeOptions()\"\n [disabled]=\"isRefreshing()\"\n fill=\"outline\"\n size=\"sm\"\n class=\"tw-z-30\">\n </cide-ele-select>\n </div>\n </div>\n </div>\n }\n\n <!-- Pagination Controls -->\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\n \n <!-- Previous/Next and Page Numbers -->\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\n \n <!-- First Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onPageChange(1)\"\n [disabled]=\"currentPage() === 1 || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n ««\n </button>\n \n <!-- Previous Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"previousPage()\"\n [disabled]=\"!hasPreviousPage() || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n ‹\n </button>\n \n <!-- Page Numbers -->\n @for (page of getEnhancedPageNumbers(); track page) {\n @if (page === '...') {\n <span class=\"tw-px-2 tw-py-2 tw-text-sm tw-text-gray-500\">...</span>\n } @else {\n <button\n cideEleButton\n [variant]=\"currentPage() === page ? 'primary' : 'outline'\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onPageChange(page)\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-sm tw-border tw-rounded-md tw-transition-colors\"\n [ngClass]=\"{\n 'tw-bg-blue-600 tw-text-white tw-border-blue-600': currentPage() === page,\n 'tw-bg-white tw-text-gray-700 tw-border-gray-300 hover:tw-bg-gray-50': currentPage() !== page\n }\">\n {{ page }}\n </button>\n }\n }\n \n <!-- Next Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"nextPage()\"\n [disabled]=\"!hasNextPage() || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n ›\n </button>\n \n <!-- Last Page -->\n <button\n cideEleButton\n variant=\"ghost\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onPageChange(totalPages())\"\n [disabled]=\"currentPage() === totalPages() || isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-lg tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-rounded-md tw-transition-colors disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n »»\n </button>\n \n </div>\n\n <!-- Quick Jump and Refresh -->\n @if (paginationConfig.showQuickJump || paginationConfig.showRefresh) {\n <div class=\"tw-flex tw-items-center tw-space-x-2 tw-border-l tw-border-gray-200 tw-pl-3\">\n \n <!-- Quick Jump -->\n @if (paginationConfig.showQuickJump) {\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\n <span class=\"tw-text-sm tw-text-gray-700\">Go to:</span>\n <div class=\"tw-w-20\">\n <cide-ele-input id=\"jump-to-page-input\" type=\"number\" [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\"\n [(ngModel)]=\"jumpToPage\" [min]=\"1\" [max]=\"totalPages()\"\n [disabled]=\"isRefreshing()\"\n (keydown.enter)=\"onJumpToPage()\">\n </cide-ele-input>\n </div>\n <button\n cideEleButton\n variant=\"outline\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onJumpToPage()\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-px-3 tw-py-2 tw-text-sm tw-bg-gray-100 tw-text-gray-700 tw-border tw-border-gray-300 tw-rounded-md hover:tw-bg-gray-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n Go\n </button>\n </div>\n }\n \n <!-- Refresh Button -->\n @if (paginationConfig.showRefresh) {\n <button\n cideEleButton\n variant=\"outline\"\n size=\"sm\"\n type=\"button\"\n (click)=\"onRefresh()\"\n [disabled]=\"isRefreshing()\"\n class=\"!tw-w-10 !tw-h-8 tw-flex tw-items-center tw-justify-center tw-text-gray-600 tw-bg-gray-100 tw-border tw-border-gray-300 tw-rounded-md hover:tw-bg-gray-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\">\n @if (isRefreshing()) {\n <svg class=\"tw-animate-spin tw-h-4 tw-w-4\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\n <path class=\"tw-opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n } @else {\n <svg class=\"tw-h-4 tw-w-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"></path>\n </svg>\n }\n </button>\n }\n </div>\n }\n \n </div>\n </div>\n </div>\n }\n</div>\n","import { Injectable, signal } from '@angular/core';\r\n\r\nexport interface DropdownInstance {\r\n id: string;\r\n close: () => void;\r\n element?: Element;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DropdownManagerService {\r\n private activeDropdowns = signal<Map<string, DropdownInstance>>(new Map());\r\n private documentClickListener?: (event: Event) => void;\r\n private escapeKeyListener?: (event: KeyboardEvent) => void;\r\n\r\n constructor() {\r\n this.initializeGlobalListeners();\r\n }\r\n\r\n private initializeGlobalListeners(): void {\r\n // Global document click listener\r\n this.documentClickListener = (event: Event) => {\r\n this.handleDocumentClick(event);\r\n };\r\n\r\n // Global escape key listener\r\n this.escapeKeyListener = (event: KeyboardEvent) => {\r\n if (event.key === 'Escape') {\r\n this.closeAllDropdowns();\r\n }\r\n };\r\n\r\n // Add listeners\r\n document.addEventListener('click', this.documentClickListener, true);\r\n document.addEventListener('keydown', this.escapeKeyListener, true);\r\n }\r\n\r\n registerDropdown(dropdown: DropdownInstance): void {\r\n // Close any existing dropdowns before opening a new one\r\n this.closeAllDropdowns();\r\n \r\n this.activeDropdowns.update(map => {\r\n const newMap = new Map(map);\r\n newMap.set(dropdown.id, dropdown);\r\n return newMap;\r\n });\r\n }\r\n\r\n unregisterDropdown(id: string): void {\r\n this.activeDropdowns.update(map => {\r\n const newMap = new Map(map);\r\n newMap.delete(id);\r\n return newMap;\r\n });\r\n }\r\n\r\n closeAllDropdowns(): void {\r\n const dropdowns = this.activeDropdowns();\r\n dropdowns.forEach(dropdown => {\r\n dropdown.close();\r\n });\r\n this.activeDropdowns.set(new Map());\r\n }\r\n\r\n closeDropdown(id: string): void {\r\n const dropdowns = this.activeDropdowns();\r\n const dropdown = dropdowns.get(id);\r\n if (dropdown) {\r\n dropdown.close();\r\n this.unregisterDropdown(id);\r\n }\r\n }\r\n\r\n isDropdownOpen(id: string): boolean {\r\n return this.activeDropdowns().has(id);\r\n }\r\n\r\n private handleDocumentClick(event: Event): void {\r\n const dropdowns = this.activeDropdowns();\r\n \r\n if (dropdowns.size === 0) {\r\n return;\r\n }\r\n\r\n // Check if click is inside any open dropdown\r\n const target = event.target as Element;\r\n let isClickInsideDropdown = false;\r\n\r\n dropdowns.forEach(dropdown => {\r\n if (dropdown.element && dropdown.element.contains(target)) {\r\n isClickInsideDropdown = true;\r\n }\r\n });\r\n\r\n // If click is outside all dropdowns, close them\r\n if (!isClickInsideDropdown) {\r\n this.closeAllDropdowns();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Clean up global listeners\r\n if (this.documentClickListener) {\r\n document.removeEventListener('click', this.documentClickListener, true);\r\n }\r\n if (this.escapeKeyListener) {\r\n document.removeEventListener('keydown', this.escapeKeyListener, true);\r\n }\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter, signal, viewChild, TemplateRef, ElementRef, HostListener, DestroyRef, inject, OnInit, OnDestroy, ViewContainerRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { DropdownManagerService, DropdownInstance } from '../../services/dropdown-manager.service';\nimport { PortalService } from '../../services/portal.service';\n\nexport interface DropdownItem {\n id: string;\n label: string;\n icon?: string;\n iconColor?: string;\n textColor?: string;\n hoverBgColor?: string;\n disabled?: boolean;\n divider?: boolean;\n}\n\nexport interface DropdownConfig {\n triggerIcon?: string;\n triggerSize?: 'xs' | 'sm' | 'md' | 'lg';\n triggerColor?: string;\n triggerHoverColor?: string;\n triggerHoverBgColor?: string;\n menuWidth?: string;\n menuPosition?: 'left' | 'right' | 'auto';\n showArrow?: boolean;\n forcePosition?: 'top' | 'bottom' | 'left' | 'right';\n offsetX?: number;\n offsetY?: number;\n usePortal?: boolean; // New property to enable portal mode\n}\n\nexport interface DropdownPosition {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'right';\n spaceAvailable: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n };\n}\n\n@Component({\n selector: 'cide-ele-dropdown',\n standalone: true,\n imports: [CommonModule, CideIconComponent],\n template: `\n <div class=\"tw-relative\" #dropdownContainer>\n <!-- Trigger Button -->\n <button \n type=\"button\" \n class=\"dropdown-trigger tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-text-gray-400 hover:tw-text-gray-600 hover:tw-bg-gray-100 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-offset-2 focus:tw-ring-blue-500 tw-transition-all tw-duration-150\"\n [class]=\"getTriggerClasses()\"\n (click)=\"toggleDropdown($event)\"\n [title]=\"config.triggerIcon === 'more_vert' ? 'More actions' : 'Options'\">\n \n <!-- Custom Trigger Template -->\n @if (triggerTemplate) {\n <ng-container *ngTemplateOutlet=\"triggerTemplate; context: { $implicit: isOpen() }\">\n </ng-container>\n } @else {\n <!-- Default Trigger -->\n <cide-ele-icon \n [class]=\"getTriggerIconClasses()\"\n [size]=\"config.triggerSize || 'sm'\">\n {{ config.triggerIcon || 'more_vert' }}\n </cide-ele-icon>\n }\n </button>\n \n <!-- Dropdown Menu (Non-Portal) -->\n @if (isOpen() && !config.usePortal) {\n <div \n #dropdownMenu\n class=\"dropdown-menu tw-absolute tw-z-50 tw-bg-white tw-shadow-lg tw-border tw-border-gray-200 tw-rounded-md tw-text-black\"\n [class]=\"getMenuClasses()\"\n [style]=\"getMenuStyles()\"\n role=\"menu\">\n <ng-container *ngTemplateOutlet=\"dropdownMenuTemplate; context: { $implicit: items }\">\n </ng-container>\n </div>\n }\n </div>\n \n <!-- Dropdown Menu Template (for both portal and non-portal) -->\n <ng-template #dropdownMenuTemplate let-items>\n <!-- Custom Menu Template -->\n @if (menuTemplate) {\n <ng-container *ngTemplateOutlet=\"menuTemplate; context: { $implicit: items }\">\n </ng-container>\n } @else {\n <!-- Default Menu -->\n <div class=\"tw-py-1\" role=\"none\">\n @for (item of items; track item.id) {\n @if (item.divider) {\n <!-- Divider Item -->\n <hr class=\"tw-border-t tw-border-gray-200 tw-my-1\" role=\"separator\">\n } @else {\n <!-- Regular Menu Item -->\n <button \n type=\"button\"\n [class]=\"getItemClasses(item)\"\n [disabled]=\"item.disabled\"\n (click)=\"onItemClick(item, $event)\"\n [attr.data-item-id]=\"item.id\">\n \n <!-- Item Icon -->\n @if (item.icon) {\n <cide-ele-icon \n class=\"tw-w-4 tw-h-4 tw-mr-2\"\n [class]=\"item.iconColor || 'tw-text-gray-400'\"\n size=\"xs\">\n {{ item.icon }}\n </cide-ele-icon>\n }\n \n <!-- Item Label -->\n <span [class]=\"item.textColor || 'tw-text-gray-700'\">\n {{ item.label }}\n </span>\n </button>\n }\n }\n </div>\n }\n </ng-template>\n `,\n styles: [`\n .dropdown-menu {\n transform-origin: top right;\n }\n `]\n})\nexport class CideEleDropdownComponent implements OnInit, OnDestroy {\n private destroyRef = inject(DestroyRef);\n private dropdownManager = inject(DropdownManagerService);\n private portalService = inject(PortalService);\n private viewContainerRef = inject(ViewContainerRef);\n private dropdownId = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\n private portalId = `dropdown-portal-${this.dropdownId}`;\n\n // ViewChild for container reference\n dropdownContainer = viewChild.required<ElementRef>('dropdownContainer');\n dropdownMenu = viewChild<ElementRef>('dropdownMenu');\n dropdownMenuTemplate = viewChild<TemplateRef<any>>('dropdownMenuTemplate');\n\n // Inputs\n @Input() set items(value: DropdownItem[]) {\n this._items = value;\n }\n get items(): DropdownItem[] {\n return this._items;\n }\n private _items: DropdownItem[] = [];\n\n @Input() config: DropdownConfig = {};\n @Input() triggerTemplate?: TemplateRef<{ $implicit: boolean }>;\n @Input() menuTemplate?: TemplateRef<{ $implicit: DropdownItem[] }>;\n\n // Outputs\n @Output() itemClick = new EventEmitter<DropdownItem>();\n @Output() dropdownToggle = new EventEmitter<boolean>();\n\n // Signals\n isOpen = signal(false);\n currentPosition = signal<DropdownPosition>({\n vertical: 'bottom',\n horizontal: 'right',\n spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\n });\n\n ngOnInit(): void {\n // Setup cleanup on destroy\n this.destroyRef.onDestroy(() => {\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n });\n }\n\n // Methods\n getTriggerClasses(): string {\n const baseClasses = 'tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-rounded-full tw-transition-all tw-duration-150 focus:tw-outline-none focus:tw-ring-2 focus:tw-ring-offset-2 focus:tw-ring-blue-500';\n\n const colorClasses = this.config?.triggerColor || 'tw-text-gray-400';\n const hoverColorClasses = this.config?.triggerHoverColor || 'hover:tw-text-gray-600';\n const hoverBgClasses = this.config?.triggerHoverBgColor || 'hover:tw-bg-gray-100';\n\n return `${baseClasses} ${colorClasses} ${hoverColorClasses} ${hoverBgClasses}`;\n }\n\n getTriggerIconClasses(): string {\n return this.config?.triggerColor || 'tw-text-gray-400';\n }\n\n getMenuClasses(): string {\n const baseClasses = 'tw-absolute tw-z-50 tw-rounded-md tw-bg-white tw-shadow-lg tw-ring-1 tw-ring-black tw-ring-opacity-5 focus:tw-outline-none tw-transition-all tw-duration-150';\n const widthClass = this.config?.menuWidth || 'tw-w-44';\n \n return `${baseClasses} ${widthClass}`;\n }\n\n getMenuStyles(): string {\n const position = this.currentPosition();\n const offsetX = this.config?.offsetX || 0;\n const offsetY = this.config?.offsetY || 4;\n \n let styles = 'position: absolute; z-index: 9999;';\n \n // Vertical positioning\n if (position.vertical === 'bottom') {\n styles += `top: calc(100% + ${offsetY}px);`;\n } else {\n styles += `bottom: calc(100% + ${offsetY}px);`;\n }\n \n // Horizontal positioning\n if (position.horizontal === 'right') {\n styles += `right: ${offsetX}px;`;\n } else {\n styles += `left: ${offsetX}px;`;\n }\n \n return styles;\n }\n\n calculatePosition(): DropdownPosition {\n const container = this.dropdownContainer();\n if (!container) {\n return {\n vertical: 'bottom',\n horizontal: 'right',\n spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\n };\n }\n\n const rect = container.nativeElement.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n // Calculate available space in each direction\n const spaceAvailable = {\n top: rect.top,\n bottom: viewport.height - rect.bottom,\n left: rect.left,\n right: viewport.width - rect.right\n };\n\n // Estimated dropdown menu dimensions (adjust based on your needs)\n const menuWidth = this.getMenuWidth();\n const menuHeight = this.getEstimatedMenuHeight();\n\n // Determine vertical position\n let vertical: 'top' | 'bottom' = 'bottom';\n if (this.config?.forcePosition === 'top' || this.config?.forcePosition === 'bottom') {\n vertical = this.config.forcePosition;\n } else {\n // Check if there's enough space below\n if (spaceAvailable.bottom < menuHeight && spaceAvailable.top > menuHeight) {\n vertical = 'top';\n }\n }\n\n // Determine horizontal position \n let horizontal: 'left' | 'right' = 'right';\n if (this.config?.forcePosition === 'left' || this.config?.forcePosition === 'right') {\n horizontal = this.config.forcePosition;\n } else if (this.config?.menuPosition === 'left') {\n horizontal = 'left';\n } else if (this.config?.menuPosition === 'auto') {\n // Auto-detect best horizontal position\n if (spaceAvailable.right < menuWidth && spaceAvailable.left > menuWidth) {\n horizontal = 'left';\n }\n }\n\n return {\n vertical,\n horizontal,\n spaceAvailable\n };\n }\n\n private getMenuWidth(): number {\n // Parse width from config or use default\n const configWidth = this.config?.menuWidth || 'tw-w-44';\n if (configWidth.includes('tw-w-')) {\n const widthMap: { [key: string]: number } = {\n 'tw-w-32': 128, 'tw-w-36': 144, 'tw-w-40': 160,\n 'tw-w-44': 176, 'tw-w-48': 192, 'tw-w-52': 208,\n 'tw-w-56': 224, 'tw-w-60': 240, 'tw-w-64': 256\n };\n return widthMap[configWidth] || 176;\n }\n return 176; // Default width\n }\n\n private getEstimatedMenuHeight(): number {\n // Estimate height based on number of items\n const itemHeight = 40; // Approximate height per item\n const padding = 8; // Top and bottom padding\n return (this.items.length * itemHeight) + padding;\n }\n\n toggleDropdown(event: Event): void {\n console.log('🔵 toggleDropdown called');\n event.stopPropagation();\n \n if (!this.isOpen()) {\n this.openDropdown();\n } else {\n this.closeDropdown();\n }\n }\n\n private openDropdown(): void {\n // Calculate position before opening\n const newPosition = this.calculatePosition();\n this.currentPosition.set(newPosition);\n \n this.isOpen.set(true);\n \n // Create portal if usePortal is enabled\n if (this.config.usePortal && this.dropdownMenuTemplate()) {\n this.createPortalDropdown();\n }\n \n // Register with dropdown manager\n const dropdownInstance: DropdownInstance = {\n id: this.dropdownId,\n close: () => this.closeDropdown(),\n element: this.dropdownContainer().nativeElement\n };\n \n this.dropdownManager.registerDropdown(dropdownInstance);\n \n console.log('🔵 Dropdown opened:', this.dropdownId);\n console.log('🔵 Position:', this.currentPosition());\n this.dropdownToggle.emit(true);\n }\n\n testMouseDown(item: DropdownItem): void {\n console.log('🔵 Mouse down detected: ' + item.label);\n // Don't close dropdown on mousedown\n }\n\n onItemClick(item: DropdownItem, event: Event): void {\n console.log('🔵 Dropdown onItemClick called with:', item);\n\n // Simple event handling\n event.stopPropagation();\n\n if (item.disabled || item.divider) {\n console.log('🔵 Item is disabled or divider, returning');\n return;\n }\n\n console.log('🔵 Emitting itemClick event');\n this.itemClick.emit(item);\n\n // Close dropdown after a small delay to ensure click is processed\n setTimeout(() => {\n this.closeDropdown();\n }, 500);\n }\n\n private createPortalDropdown(): void {\n const triggerElement = this.dropdownContainer().nativeElement;\n const template = this.dropdownMenuTemplate();\n \n if (!template) {\n console.warn('🔵 Dropdown menu template not found for portal creation');\n return;\n }\n\n try {\n this.portalService.createTemplatePortal(this.portalId, {\n triggerElement,\n template,\n viewContainerRef: this.viewContainerRef,\n context: { $implicit: this.items },\n className: `dropdown-menu tw-bg-white tw-shadow-lg tw-border tw-border-gray-200 tw-rounded-md tw-text-black ${this.getMenuClasses()}`,\n position: this.currentPosition().vertical === 'top' ? 'top' : 'bottom',\n align: this.currentPosition().horizontal === 'left' ? 'left' : 'right',\n offsetX: this.config.offsetX || 0,\n offsetY: this.config.offsetY || 0,\n minWidth: this.getMenuWidth(),\n closeOnClickOutside: true,\n closeOnEscape: true\n });\n \n console.log('🔵 Portal dropdown created:', this.portalId);\n } catch (error) {\n console.error('🔵 Failed to create portal dropdown:', error);\n }\n }\n\n private destroyPortalDropdown(): void {\n try {\n this.portalService.destroyPortal(this.portalId);\n console.log('🔵 Portal dropdown destroyed:', this.portalId);\n } catch (error) {\n console.error('🔵 Failed to destroy portal dropdown:', error);\n }\n }\n\n closeDropdown(): void {\n console.log('🔵 closeDropdown called, setting isOpen to false');\n this.isOpen.set(false);\n \n // Destroy portal if it exists\n if (this.config.usePortal) {\n this.destroyPortalDropdown();\n }\n \n this.dropdownManager.unregisterDropdown(this.dropdownId);\n this.dropdownToggle.emit(false);\n }\n\n getItemClasses(item: DropdownItem): string {\n const baseClasses = 'tw-flex tw-items-center tw-w-full tw-px-3 tw-py-2 tw-text-sm tw-transition-colors tw-duration-150';\n\n if (item.disabled) {\n return `${baseClasses} tw-text-gray-400 tw-cursor-not-allowed`;\n }\n\n const textColor = item.textColor || 'tw-text-gray-700';\n const hoverBg = item.hoverBgColor || 'hover:tw-bg-gray-100';\n const hoverText = item.textColor || 'hover:tw-text-gray-900';\n\n return `${baseClasses} ${textColor} ${hoverBg} ${hoverText}`;\n }\n\n // Host listeners for window events (position recalculation only)\n // Note: Click outside and escape key handling is now managed by DropdownManagerService\n\n @HostListener('window:resize')\n onWindowResize(): void {\n if (this.isOpen()) {\n // Recalculate position on window resize\n const newPosition = this.calculatePosition();\n this.currentPosition.set(newPosition);\n }\n }\n\n @HostListener('window:scroll')\n onWindowScroll(): void {\n if (this.isOpen()) {\n // Recalculate position on scroll\n const newPosition = this.calculatePosition();\n this.currentPosition.set(newPosition);\n }\n }\n\n ngOnDestroy(): void {\n // Cleanup portal if it exists\n if (this.config.usePortal) {\n this.destroyPortalDropdown();\n }\n \n // Close dropdown and unregister\n if (this.isOpen()) {\n this.closeDropdown();\n }\n \n // Ensure dropdown is unregistered\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n }\n} ","import { Injectable, signal, computed, TemplateRef } from '@angular/core';\r\n\r\nexport interface ConfirmationRequest<T = unknown> {\r\n id: string;\r\n title: string;\r\n message: string;\r\n type: 'danger' | 'warning' | 'info' | 'success';\r\n icon?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n customTemplate?: TemplateRef<unknown>;\r\n customData?: T;\r\n resolve: (value: boolean | T) => void;\r\n reject: (reason?: unknown) => void;\r\n}\r\n\r\nexport interface ConfirmationOptions<T = unknown> {\r\n title: string;\r\n message: string;\r\n type?: 'danger' | 'warning' | 'info' | 'success';\r\n icon?: string;\r\n confirmText?: string;\r\n cancelText?: string;\r\n customTemplate?: TemplateRef<unknown>;\r\n customData?: T;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ConfirmationService {\r\n private confirmationQueue = signal<ConfirmationRequest<unknown>[]>([]);\r\n private currentRequest = signal<ConfirmationRequest<unknown> | null>(null);\r\n \r\n // Computed signals\r\n hasActiveConfirmation = computed(() => this.currentRequest() !== null);\r\n queueLength = computed(() => this.confirmationQueue().length);\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Ask for confirmation with a simple yes/no dialog\r\n */\r\n ask(options: ConfirmationOptions<unknown>): Promise<boolean> {\r\n return new Promise<boolean>((resolve, reject) => {\r\n const request: ConfirmationRequest<unknown> = {\r\n id: this.generateId(),\r\n title: options.title,\r\n message: options.message,\r\n type: options.type || 'warning',\r\n icon: options.icon || this.getDefaultIcon(options.type || 'warning'),\r\n confirmText: options.confirmText || 'Confirm',\r\n cancelText: options.cancelText || 'Cancel',\r\n resolve: (value: boolean | unknown) => resolve(value as boolean),\r\n reject\r\n };\r\n\r\n this.addToQueue(request);\r\n });\r\n }\r\n\r\n /**\r\n * Ask for confirmation with custom template and return custom data\r\n */\r\n askWithTemplate<T = unknown>(options: ConfirmationOptions<T> & { customTemplate: TemplateRef<unknown> }): Promise<T> {\r\n return new Promise<T>((resolve, reject) => {\r\n const request: ConfirmationRequest<T> = {\r\n id: this.generateId(),\r\n title: options.title,\r\n message: options.message,\r\n type: options.type || 'info',\r\n icon: options.icon || this.getDefaultIcon(options.type || 'info'),\r\n confirmText: options.confirmText || 'Confirm',\r\n cancelText: options.cancelText || 'Cancel',\r\n customTemplate: options.customTemplate,\r\n customData: options.customData,\r\n resolve: (value: boolean | T) => resolve(value as T),\r\n reject\r\n };\r\n\r\n // Cast to unknown for queue compatibility\r\n this.addToQueue(request as ConfirmationRequest<unknown>);\r\n });\r\n }\r\n\r\n /**\r\n * Quick confirmation for dangerous actions\r\n */\r\n confirmDelete(itemName?: string): Promise<boolean> {\r\n return this.ask({\r\n title: 'Confirm Delete',\r\n message: itemName ? `Are you sure you want to delete \"${itemName}\"? This action cannot be undone.` : 'Are you sure you want to delete this item? This action cannot be undone.',\r\n type: 'danger',\r\n icon: 'delete_forever',\r\n confirmText: 'Delete',\r\n cancelText: 'Cancel'\r\n });\r\n }\r\n\r\n /**\r\n * Quick confirmation for permanent actions\r\n */\r\n confirmPermanentAction(action: string, itemName?: string): Promise<boolean> {\r\n return this.ask({\r\n title: `Confirm ${action}`,\r\n message: itemName ? `Are you sure you want to ${action.toLowerCase()} \"${itemName}\"? This action cannot be undone.` : `Are you sure you want to ${action.toLowerCase()}? This action cannot be undone.`,\r\n type: 'danger',\r\n icon: 'warning',\r\n confirmText: action,\r\n cancelText: 'Cancel'\r\n });\r\n }\r\n\r\n /**\r\n * Quick confirmation for safe actions\r\n */\r\n confirmSafeAction(action: string, itemName?: string): Promise<boolean> {\r\n return this.ask({\r\n title: `Confirm ${action}`,\r\n message: itemName ? `Are you sure you want to ${action.toLowerCase()} \"${itemName}\"?` : `Are you sure you want to ${action.toLowerCase()}?`,\r\n type: 'info',\r\n icon: 'info',\r\n confirmText: action,\r\n cancelText: 'Cancel'\r\n });\r\n }\r\n\r\n // Internal methods\r\n private addToQueue(request: ConfirmationRequest<unknown>): void {\r\n this.confirmationQueue.update(queue => [...queue, request]);\r\n this.processQueue();\r\n }\r\n\r\n private processQueue(): void {\r\n if (this.currentRequest() || this.confirmationQueue().length === 0) {\r\n return;\r\n }\r\n\r\n const nextRequest = this.confirmationQueue()[0];\r\n this.currentRequest.set(nextRequest);\r\n }\r\n\r\n confirmCurrentRequest(data?: unknown): void {\r\n const request = this.currentRequest();\r\n if (!request) return;\r\n\r\n request.resolve(data !== undefined ? data : true);\r\n this.removeCurrentRequest();\r\n }\r\n\r\n cancelCurrentRequest(): void {\r\n const request = this.currentRequest();\r\n if (!request) return;\r\n\r\n request.reject(new Error('User cancelled'));\r\n this.removeCurrentRequest();\r\n }\r\n\r\n private removeCurrentRequest(): void {\r\n this.confirmationQueue.update(queue => queue.slice(1));\r\n this.currentRequest.set(null);\r\n \r\n // Process next request if any\r\n setTimeout(() => this.processQueue(), 100);\r\n }\r\n\r\n private generateId(): string {\r\n return `confirmation-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private getDefaultIcon(type: 'danger' | 'warning' | 'info' | 'success'): string {\r\n const iconMap = {\r\n danger: 'error',\r\n warning: 'warning',\r\n info: 'info',\r\n success: 'check_circle'\r\n };\r\n return iconMap[type];\r\n }\r\n\r\n // Public getters for components\r\n getCurrentRequest() {\r\n return this.currentRequest;\r\n }\r\n\r\n getHasActiveConfirmation() {\r\n return this.hasActiveConfirmation;\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface NotificationOptions {\r\n message: string;\r\n type?: 'success' | 'error' | 'warning' | 'info';\r\n duration?: number;\r\n showUndo?: boolean;\r\n undoAction?: () => void;\r\n undoText?: string;\r\n icon?: string;\r\n title?: string;\r\n}\r\n\r\nexport interface NotificationItem {\r\n id: string;\r\n message: string;\r\n type: 'success' | 'error' | 'warning' | 'info';\r\n duration: number;\r\n showUndo: boolean;\r\n undoAction?: () => void;\r\n undoText: string;\r\n icon: string;\r\n title?: string;\r\n timestamp: number;\r\n isVisible: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class NotificationService {\r\n private notifications = signal<NotificationItem[]>([]);\r\n private maxNotifications = 5; // Maximum notifications to show at once\r\n\r\n // Computed signals\r\n activeNotifications = computed(() => \r\n this.notifications().filter(n => n.isVisible)\r\n );\r\n\r\n constructor() {}\r\n\r\n /**\r\n * Show a success notification\r\n */\r\n success(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'success',\r\n icon: 'check_circle',\r\n duration: 3000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show an error notification\r\n */\r\n error(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'error',\r\n icon: 'error',\r\n duration: 5000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show a warning notification\r\n */\r\n warning(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'warning',\r\n icon: 'warning',\r\n duration: 4000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show an info notification\r\n */\r\n info(message: string, options?: Partial<NotificationOptions>): string {\r\n return this.show({\r\n message,\r\n type: 'info',\r\n icon: 'info',\r\n duration: 3000,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show a notification with undo functionality\r\n */\r\n showWithUndo(\r\n message: string, \r\n undoAction: () => void, \r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.show({\r\n message,\r\n type: 'info',\r\n icon: 'info',\r\n duration: 8000,\r\n showUndo: true,\r\n undoAction,\r\n undoText: 'Undo',\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Show a notification for reversible destructive actions\r\n */\r\n showReversibleAction(\r\n action: string,\r\n itemName: string,\r\n undoAction: () => void,\r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.showWithUndo(\r\n `${action} \"${itemName}\"`,\r\n undoAction,\r\n {\r\n type: 'warning',\r\n icon: 'delete',\r\n title: `${action} completed`,\r\n ...options\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Show a notification for background tasks\r\n */\r\n showBackgroundTask(\r\n taskName: string,\r\n isComplete: boolean = true,\r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.show({\r\n message: isComplete ? `${taskName} completed successfully` : `${taskName} in progress...`,\r\n type: isComplete ? 'success' : 'info',\r\n icon: isComplete ? 'check_circle' : 'sync',\r\n duration: isComplete ? 3000 : 0, // Don't auto-dismiss for in-progress tasks\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Core show method\r\n */\r\n private show(options: NotificationOptions): string {\r\n const notification: NotificationItem = {\r\n id: this.generateId(),\r\n message: options.message,\r\n type: options.type || 'info',\r\n duration: options.duration || 3000,\r\n showUndo: options.showUndo || false,\r\n undoAction: options.undoAction,\r\n undoText: options.undoText || 'Undo',\r\n icon: options.icon || this.getDefaultIcon(options.type || 'info'),\r\n title: options.title,\r\n timestamp: Date.now(),\r\n isVisible: true\r\n };\r\n\r\n this.addNotification(notification);\r\n return notification.id;\r\n }\r\n\r\n /**\r\n * Remove a specific notification\r\n */\r\n remove(id: string): void {\r\n this.notifications.update(notifications => \r\n notifications.map(n => \r\n n.id === id ? { ...n, isVisible: false } : n\r\n )\r\n );\r\n\r\n // Remove from array after animation\r\n setTimeout(() => {\r\n this.notifications.update(notifications => \r\n notifications.filter(n => n.id !== id)\r\n );\r\n }, 300);\r\n }\r\n\r\n /**\r\n * Remove all notifications\r\n */\r\n clearAll(): void {\r\n this.notifications.update(notifications => \r\n notifications.map(n => ({ ...n, isVisible: false }))\r\n );\r\n\r\n setTimeout(() => {\r\n this.notifications.set([]);\r\n }, 300);\r\n }\r\n\r\n /**\r\n * Execute undo action for a notification\r\n */\r\n executeUndo(id: string): void {\r\n const notification = this.notifications().find(n => n.id === id);\r\n if (notification && notification.undoAction) {\r\n notification.undoAction();\r\n this.remove(id);\r\n }\r\n }\r\n\r\n // Internal methods\r\n private addNotification(notification: NotificationItem): void {\r\n this.notifications.update(notifications => {\r\n const newNotifications = [...notifications, notification];\r\n \r\n // Limit the number of visible notifications\r\n if (newNotifications.length > this.maxNotifications) {\r\n // Remove oldest notifications\r\n const toRemove = newNotifications.length - this.maxNotifications;\r\n for (let i = 0; i < toRemove; i++) {\r\n if (newNotifications[i]) {\r\n newNotifications[i] = { ...newNotifications[i], isVisible: false };\r\n }\r\n }\r\n }\r\n \r\n return newNotifications;\r\n });\r\n\r\n // Auto-remove after duration (if not 0)\r\n if (notification.duration > 0) {\r\n setTimeout(() => {\r\n this.remove(notification.id);\r\n }, notification.duration);\r\n }\r\n }\r\n\r\n private generateId(): string {\r\n return `notification-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private getDefaultIcon(type: 'success' | 'error' | 'warning' | 'info'): string {\r\n const iconMap = {\r\n success: 'check_circle',\r\n error: 'error',\r\n warning: 'warning',\r\n info: 'info'\r\n };\r\n return iconMap[type];\r\n }\r\n\r\n // Public getters for components\r\n getNotifications() {\r\n return this.notifications;\r\n }\r\n\r\n getActiveNotifications() {\r\n return this.activeNotifications;\r\n }\r\n}\r\n\r\n","import { Component, signal, computed, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { ConfirmationService } from '../../services/confirmation.service';\r\n\r\n@Component({\r\n selector: 'cide-ele-confirmation-modal',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n template: `\r\n <!-- Backdrop -->\r\n <div \r\n *ngIf=\"hasActiveConfirmation()\"\r\n class=\"confirmation-backdrop\"\r\n (click)=\"onBackdropClick($event)\"\r\n [@backdropAnimation]>\r\n </div>\r\n\r\n <!-- Modal -->\r\n <div \r\n *ngIf=\"hasActiveConfirmation()\"\r\n class=\"confirmation-modal\"\r\n [@modalAnimation]>\r\n \r\n <!-- Modal Header -->\r\n <div class=\"modal-header\" [class]=\"getHeaderClass()\">\r\n <div class=\"header-content\">\r\n <div class=\"icon-container\" [class]=\"getIconClass()\">\r\n <cide-ele-icon \r\n size=\"lg\">\r\n {{ currentRequest()?.icon || 'info' }}\r\n </cide-ele-icon>\r\n </div>\r\n <h2 class=\"modal-title\">{{ currentRequest()?.title }}</h2>\r\n </div>\r\n </div>\r\n\r\n <!-- Modal Body -->\r\n <div class=\"modal-body\">\r\n <p class=\"modal-message\">{{ currentRequest()?.message }}</p>\r\n \r\n <!-- Custom Template Slot -->\r\n <div *ngIf=\"currentRequest()?.customTemplate\" class=\"custom-content\">\r\n <ng-container \r\n *ngTemplateOutlet=\"currentRequest()?.customTemplate!; context: { $implicit: customData }\">\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Modal Footer -->\r\n <div class=\"modal-footer\">\r\n <button \r\n type=\"button\"\r\n class=\"btn btn-secondary\"\r\n (click)=\"onCancel()\">\r\n {{ currentRequest()?.cancelText || 'Cancel' }}\r\n </button>\r\n \r\n <button \r\n type=\"button\"\r\n class=\"btn\"\r\n [class]=\"getConfirmButtonClass()\"\r\n (click)=\"onConfirm()\">\r\n {{ currentRequest()?.confirmText || 'Confirm' }}\r\n </button>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .confirmation-backdrop {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-color: rgba(0, 0, 0, 0.5);\r\n backdrop-filter: blur(4px);\r\n z-index: 10000;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n\r\n .confirmation-modal {\r\n background: white;\r\n border-radius: 12px;\r\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\r\n max-width: 480px;\r\n width: 90%;\r\n max-height: 90vh;\r\n overflow: hidden;\r\n z-index: 10001;\r\n position: relative;\r\n }\r\n\r\n .modal-header {\r\n padding: 24px 24px 16px;\r\n border-bottom: 1px solid #e5e7eb;\r\n }\r\n\r\n .header-content {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n }\r\n\r\n .icon-container {\r\n width: 48px;\r\n height: 48px;\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n }\r\n\r\n .icon-container.danger {\r\n background-color: #fef2f2;\r\n color: #dc2626;\r\n }\r\n\r\n .icon-container.warning {\r\n background-color: #fffbeb;\r\n color: #d97706;\r\n }\r\n\r\n .icon-container.info {\r\n background-color: #eff6ff;\r\n color: #2563eb;\r\n }\r\n\r\n .icon-container.success {\r\n background-color: #f0fdf4;\r\n color: #16a34a;\r\n }\r\n\r\n .modal-title {\r\n margin: 0;\r\n font-size: 20px;\r\n font-weight: 600;\r\n color: #111827;\r\n line-height: 1.4;\r\n }\r\n\r\n .modal-body {\r\n padding: 16px 24px 24px;\r\n }\r\n\r\n .modal-message {\r\n margin: 0 0 16px 0;\r\n font-size: 16px;\r\n line-height: 1.5;\r\n color: #6b7280;\r\n }\r\n\r\n .custom-content {\r\n margin-top: 16px;\r\n padding-top: 16px;\r\n border-top: 1px solid #f3f4f6;\r\n }\r\n\r\n .modal-footer {\r\n padding: 16px 24px 24px;\r\n display: flex;\r\n gap: 12px;\r\n justify-content: flex-end;\r\n border-top: 1px solid #e5e7eb;\r\n }\r\n\r\n .btn {\r\n padding: 10px 20px;\r\n border-radius: 8px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n border: none;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n min-width: 80px;\r\n }\r\n\r\n .btn:hover {\r\n transform: translateY(-1px);\r\n }\r\n\r\n .btn:active {\r\n transform: translateY(0);\r\n }\r\n\r\n .btn-secondary {\r\n background-color: #f9fafb;\r\n color: #374151;\r\n border: 1px solid #d1d5db;\r\n }\r\n\r\n .btn-secondary:hover {\r\n background-color: #f3f4f6;\r\n border-color: #9ca3af;\r\n }\r\n\r\n .btn-primary {\r\n background-color: #2563eb;\r\n color: white;\r\n }\r\n\r\n .btn-primary:hover {\r\n background-color: #1d4ed8;\r\n }\r\n\r\n .btn-danger {\r\n background-color: #dc2626;\r\n color: white;\r\n }\r\n\r\n .btn-danger:hover {\r\n background-color: #b91c1c;\r\n }\r\n\r\n .btn-warning {\r\n background-color: #d97706;\r\n color: white;\r\n }\r\n\r\n .btn-warning:hover {\r\n background-color: #b45309;\r\n }\r\n\r\n .btn-success {\r\n background-color: #16a34a;\r\n color: white;\r\n }\r\n\r\n .btn-success:hover {\r\n background-color: #15803d;\r\n }\r\n\r\n /* Responsive Design */\r\n @media (max-width: 640px) {\r\n .confirmation-modal {\r\n width: 95%;\r\n margin: 20px;\r\n }\r\n\r\n .modal-header {\r\n padding: 20px 20px 12px;\r\n }\r\n\r\n .modal-body {\r\n padding: 12px 20px 20px;\r\n }\r\n\r\n .modal-footer {\r\n padding: 12px 20px 20px;\r\n flex-direction: column-reverse;\r\n }\r\n\r\n .btn {\r\n width: 100%;\r\n justify-content: center;\r\n }\r\n\r\n .header-content {\r\n flex-direction: column;\r\n text-align: center;\r\n gap: 12px;\r\n }\r\n\r\n .modal-title {\r\n font-size: 18px;\r\n }\r\n }\r\n\r\n /* Focus styles for accessibility */\r\n .btn:focus {\r\n outline: 2px solid #2563eb;\r\n outline-offset: 2px;\r\n }\r\n\r\n /* Animation classes */\r\n .modal-enter {\r\n opacity: 0;\r\n transform: scale(0.95) translateY(-10px);\r\n }\r\n\r\n .modal-enter-active {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n transition: all 0.2s ease-out;\r\n }\r\n\r\n .modal-exit {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n }\r\n\r\n .modal-exit-active {\r\n opacity: 0;\r\n transform: scale(0.95) translateY(-10px);\r\n transition: all 0.15s ease-in;\r\n }\r\n `],\r\n animations: [\r\n // Add animations here if needed\r\n ]\r\n})\r\nexport class CideEleConfirmationModalComponent {\r\n private confirmationService = inject(ConfirmationService);\r\n\r\n // Signals\r\n hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;\r\n currentRequest = this.confirmationService.getCurrentRequest();\r\n customData = signal<unknown>(null);\r\n\r\n // Computed\r\n getHeaderClass = computed(() => {\r\n const request = this.currentRequest();\r\n return request ? `header-${request.type}` : '';\r\n });\r\n\r\n getIconClass = computed(() => {\r\n const request = this.currentRequest();\r\n return request ? request.type : 'info';\r\n });\r\n\r\n getConfirmButtonClass = computed(() => {\r\n const request = this.currentRequest();\r\n if (!request) return 'btn-primary';\r\n \r\n const classMap = {\r\n danger: 'btn-danger',\r\n warning: 'btn-warning',\r\n info: 'btn-primary',\r\n success: 'btn-success'\r\n };\r\n \r\n return classMap[request.type] || 'btn-primary';\r\n });\r\n\r\n onBackdropClick(event: Event): void {\r\n // Only close if clicking the backdrop itself, not its children\r\n if (event.target === event.currentTarget) {\r\n this.onCancel();\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.confirmationService.cancelCurrentRequest();\r\n }\r\n\r\n onConfirm(): void {\r\n // If there's custom data, pass it to the confirmation\r\n const data = this.customData();\r\n this.confirmationService.confirmCurrentRequest(data);\r\n this.customData.set(null); // Reset custom data\r\n }\r\n\r\n // Method to update custom data (called by custom templates)\r\n updateCustomData(data: unknown): void {\r\n this.customData.set(data);\r\n }\r\n}\r\n","import { Component, signal, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { NotificationService, NotificationItem } from '../../services/notification.service';\n\n@Component({\n selector: 'cide-ele-toast-notification',\n standalone: true,\n imports: [CommonModule, CideIconComponent],\n template: `\n <!-- Toast Container -->\n <div class=\"toast-container\">\n <div \n *ngFor=\"let notification of activeNotifications(); trackBy: trackByNotification\"\n class=\"toast-notification\"\n [class]=\"getToastClass(notification)\"\n [@toastAnimation]>\n \n <!-- Toast Content -->\n <div class=\"toast-content\">\n <!-- Icon -->\n <div class=\"toast-icon\" [class]=\"getIconClass(notification.type)\">\n <cide-ele-icon size=\"sm\">\n {{ notification.icon }}\n </cide-ele-icon>\n </div>\n \n <!-- Text Content -->\n <div class=\"toast-text\">\n <div *ngIf=\"notification.title\" class=\"toast-title\">\n {{ notification.title }}\n </div>\n <div class=\"toast-message\">\n {{ notification.message }}\n </div>\n </div>\n \n <!-- Close Button -->\n <button \n type=\"button\"\n class=\"toast-close\"\n (click)=\"removeNotification(notification.id)\"\n aria-label=\"Close notification\">\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n </button>\n </div>\n \n <!-- Undo Button -->\n <div *ngIf=\"notification.showUndo\" class=\"toast-actions\">\n <button \n type=\"button\"\n class=\"toast-undo-btn\"\n (click)=\"executeUndo(notification.id)\">\n {{ notification.undoText }}\n </button>\n </div>\n \n <!-- Progress Bar -->\n <div \n *ngIf=\"notification.duration > 0\"\n class=\"toast-progress\"\n [style.animation-duration]=\"notification.duration + 'ms'\">\n </div>\n </div>\n </div>\n `,\n styles: [`\n .toast-container {\n position: fixed;\n top: 20px;\n right: 20px;\n z-index: 9990;\n display: flex;\n flex-direction: column;\n gap: 12px;\n max-width: 400px;\n width: 100%;\n }\n\n .toast-notification {\n background: white;\n border-radius: 8px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n border: 1px solid #e5e7eb;\n overflow: hidden;\n position: relative;\n animation: slideInRight 0.3s ease-out;\n }\n\n .toast-notification.success {\n border-left: 4px solid #16a34a;\n }\n\n .toast-notification.error {\n border-left: 4px solid #dc2626;\n }\n\n .toast-notification.warning {\n border-left: 4px solid #d97706;\n }\n\n .toast-notification.info {\n border-left: 4px solid #2563eb;\n }\n\n .toast-content {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n }\n\n .toast-icon {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-top: 2px;\n }\n\n .toast-icon.success {\n background-color: #f0fdf4;\n color: #16a34a;\n }\n\n .toast-icon.error {\n background-color: #fef2f2;\n color: #dc2626;\n }\n\n .toast-icon.warning {\n background-color: #fffbeb;\n color: #d97706;\n }\n\n .toast-icon.info {\n background-color: #eff6ff;\n color: #2563eb;\n }\n\n .toast-text {\n flex: 1;\n min-width: 0;\n }\n\n .toast-title {\n font-size: 14px;\n font-weight: 600;\n color: #111827;\n margin-bottom: 4px;\n line-height: 1.4;\n }\n\n .toast-message {\n font-size: 14px;\n color: #6b7280;\n line-height: 1.4;\n }\n\n .toast-close {\n background: none;\n border: none;\n color: #9ca3af;\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n flex-shrink: 0;\n }\n\n .toast-close:hover {\n background-color: #f3f4f6;\n color: #6b7280;\n }\n\n .toast-actions {\n padding: 0 16px 16px;\n display: flex;\n justify-content: flex-end;\n }\n\n .toast-undo-btn {\n background: none;\n border: none;\n color: #2563eb;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n padding: 8px 12px;\n border-radius: 6px;\n transition: all 0.2s ease;\n }\n\n .toast-undo-btn:hover {\n background-color: #eff6ff;\n }\n\n .toast-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n height: 3px;\n background-color: #e5e7eb;\n animation: progressShrink linear forwards;\n }\n\n .toast-notification.success .toast-progress {\n background-color: #16a34a;\n }\n\n .toast-notification.error .toast-progress {\n background-color: #dc2626;\n }\n\n .toast-notification.warning .toast-progress {\n background-color: #d97706;\n }\n\n .toast-notification.info .toast-progress {\n background-color: #2563eb;\n }\n\n /* Animations */\n @keyframes slideInRight {\n from {\n transform: translateX(100%);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n }\n\n @keyframes slideOutRight {\n from {\n transform: translateX(0);\n opacity: 1;\n }\n to {\n transform: translateX(100%);\n opacity: 0;\n }\n }\n\n @keyframes progressShrink {\n from {\n width: 100%;\n }\n to {\n width: 0%;\n }\n }\n\n /* Responsive Design */\n @media (max-width: 640px) {\n .toast-container {\n top: 10px;\n right: 10px;\n left: 10px;\n max-width: none;\n }\n\n .toast-notification {\n border-radius: 6px;\n }\n\n .toast-content {\n padding: 12px;\n }\n\n .toast-actions {\n padding: 0 12px 12px;\n }\n }\n\n /* Focus styles for accessibility */\n .toast-close:focus,\n .toast-undo-btn:focus {\n outline: 2px solid #2563eb;\n outline-offset: 2px;\n }\n `],\n animations: [\n // Add animations here if needed\n ]\n})\nexport class CideEleToastNotificationComponent {\n private notificationService = inject(NotificationService);\n\n // Signals\n activeNotifications = this.notificationService.getActiveNotifications();\n\n // Methods\n getToastClass(notification: NotificationItem): string {\n return `toast-${notification.type}`;\n }\n\n getIconClass(type: string): string {\n return `toast-icon ${type}`;\n }\n\n removeNotification(id: string): void {\n this.notificationService.remove(id);\n }\n\n executeUndo(id: string): void {\n this.notificationService.executeUndo(id);\n }\n\n trackByNotification(index: number, notification: NotificationItem): string {\n return notification.id;\n }\n}\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideEleConfirmationModalComponent } from '../confirmation-modal/confirmation-modal.component';\r\nimport { CideEleToastNotificationComponent } from '../toast-notification/toast-notification.component';\r\n\r\n@Component({\r\n selector: 'cide-ele-global-notifications',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideEleConfirmationModalComponent,\r\n CideEleToastNotificationComponent\r\n ],\r\n template: `\r\n <!-- Global Confirmation Modal -->\r\n <cide-ele-confirmation-modal></cide-ele-confirmation-modal>\r\n \r\n <!-- Global Toast Notifications -->\r\n <cide-ele-toast-notification></cide-ele-toast-notification>\r\n `,\r\n styles: [`\r\n /* Global styles for notifications */\r\n :host {\r\n display: contents;\r\n }\r\n `]\r\n})\r\nexport class CideEleGlobalNotificationsComponent {\r\n // This component serves as a container for global notifications\r\n // It doesn't need any logic as the services handle everything\r\n}\r\n\r\n","import { Component, Input, Output, EventEmitter, OnInit, ElementRef, signal, computed, inject, DestroyRef, forwardRef, viewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface JsonEditorConfig {\r\n /** Enable syntax highlighting */\r\n syntaxHighlighting?: boolean;\r\n /** Enable line numbers */\r\n showLineNumbers?: boolean;\r\n /** Enable auto-formatting */\r\n autoFormat?: boolean;\r\n /** Enable validation */\r\n validateOnChange?: boolean;\r\n /** Theme for the editor */\r\n theme?: 'light' | 'dark';\r\n /** Minimum height in pixels */\r\n minHeight?: number;\r\n /** Maximum height in pixels */\r\n maxHeight?: number;\r\n /** Placeholder text */\r\n placeholder?: string;\r\n /** Read-only mode */\r\n readOnly?: boolean;\r\n /** Show error messages */\r\n showErrors?: boolean;\r\n}\r\n\r\nexport interface JsonEditorError {\r\n line: number;\r\n column: number;\r\n message: string;\r\n type: 'syntax' | 'validation';\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-json-editor',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n template: `\r\n <div class=\"tw-relative tw-w-full\" [class]=\"containerClass()\">\r\n <!-- Label -->\r\n @if (label) {\r\n <label \r\n [for]=\"editorId\" \r\n class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 tw-mb-2\"\r\n [class.tw-text-red-600]=\"hasErrors()\">\r\n {{ label }}\r\n @if (required) {\r\n <span class=\"tw-text-red-500 tw-ml-1\">*</span>\r\n }\r\n </label>\r\n }\r\n\r\n <!-- Editor Container -->\r\n <div \r\n class=\"tw-relative tw-border tw-rounded-md tw-bg-white tw-overflow-hidden\"\r\n [class.tw-border-red-300]=\"hasErrors()\"\r\n [class.tw-border-gray-300]=\"!hasErrors()\"\r\n [class.tw-focus-within:tw-border-blue-500]=\"!hasErrors()\"\r\n [class.tw-focus-within:tw-ring-1]=\"!hasErrors()\"\r\n [class.tw-focus-within:tw-ring-blue-500]=\"!hasErrors()\"\r\n [class.tw-opacity-50]=\"disabled()\"\r\n [class.tw-cursor-not-allowed]=\"disabled()\">\r\n \r\n <!-- Line Numbers -->\r\n @if (configSignal().showLineNumbers) {\r\n <div \r\n class=\"tw-absolute tw-left-0 tw-top-0 tw-bottom-0 tw-w-12 tw-bg-gray-50 tw-border-r tw-border-gray-200 tw-text-xs tw-text-gray-500 tw-font-mono tw-select-none tw-overflow-hidden\"\r\n [class.tw-bg-gray-800]=\"configSignal().theme === 'dark'\"\r\n [class.tw-border-gray-600]=\"configSignal().theme === 'dark'\"\r\n [class.tw-text-gray-400]=\"configSignal().theme === 'dark'\">\r\n @for (line of lineNumbers(); track line) {\r\n <div \r\n class=\"tw-px-2 tw-py-1 tw-text-right\"\r\n [class.tw-bg-red-100]=\"hasErrorOnLine(line)\"\r\n [class.tw-text-red-600]=\"hasErrorOnLine(line)\"\r\n [class.tw-bg-red-900]=\"configSignal().theme === 'dark' && hasErrorOnLine(line)\"\r\n [class.tw-text-red-400]=\"configSignal().theme === 'dark' && hasErrorOnLine(line)\">\r\n {{ line }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Textarea -->\r\n <textarea\r\n #jsonTextarea\r\n [id]=\"editorId\"\r\n [value]=\"jsonString()\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n [placeholder]=\"configSignal().placeholder || 'Enter JSON configuration...'\"\r\n [readonly]=\"configSignal().readOnly || disabled()\"\r\n [disabled]=\"disabled()\"\r\n class=\"tw-w-full tw-p-3 tw-text-sm tw-font-mono tw-leading-relaxed tw-resize-none tw-outline-none tw-bg-transparent\"\r\n [class.tw-pl-12]=\"configSignal().showLineNumbers\"\r\n [class.tw-text-gray-900]=\"configSignal().theme === 'light'\"\r\n [class.tw-text-gray-100]=\"configSignal().theme === 'dark'\"\r\n [class.tw-bg-gray-900]=\"configSignal().theme === 'dark'\"\r\n [style.min-height.px]=\"configSignal().minHeight || 120\"\r\n [style.max-height.px]=\"configSignal().maxHeight || 400\"\r\n [attr.aria-describedby]=\"errorId()\"\r\n [attr.aria-invalid]=\"hasErrors()\">\r\n </textarea>\r\n\r\n <!-- Format Button -->\r\n @if (!configSignal().readOnly && !disabled()) {\r\n <button\r\n type=\"button\"\r\n (click)=\"formatJson()\"\r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-p-1 tw-text-gray-400 hover:tw-text-gray-600 tw-rounded tw-transition-colors\"\r\n [class.tw-text-gray-500]=\"configSignal().theme === 'dark'\"\r\n [class.hover:tw-text-gray-300]=\"configSignal().theme === 'dark'\"\r\n title=\"Format JSON\">\r\n <svg class=\"tw-w-4 tw-h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\r\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h7\"></path>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Helper Text -->\r\n @if (helperText && !hasErrors()) {\r\n <p class=\"tw-mt-1 tw-text-xs tw-text-gray-500\">{{ helperText }}</p>\r\n }\r\n\r\n <!-- Error Messages -->\r\n @if (configSignal().showErrors && hasErrors()) {\r\n <div [id]=\"errorId()\" class=\"tw-mt-1 tw-space-y-1\">\r\n @for (error of errors(); track error.line + '-' + error.column) {\r\n <p class=\"tw-text-xs tw-text-red-600 tw-flex tw-items-start tw-gap-1\">\r\n <svg class=\"tw-w-3 tw-h-3 tw-mt-0.5 tw-flex-shrink-0\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z\" clip-rule=\"evenodd\"></path>\r\n </svg>\r\n <span>\r\n Line {{ error.line }}, Column {{ error.column }}: {{ error.message }}\r\n </span>\r\n </p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Character Count -->\r\n @if (showCharacterCount) {\r\n <p class=\"tw-mt-1 tw-text-xs tw-text-gray-400 tw-text-right\">\r\n {{ jsonString().length }} characters\r\n </p>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n :host {\r\n display: block;\r\n }\r\n \r\n textarea {\r\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;\r\n tab-size: 2;\r\n }\r\n \r\n textarea:focus {\r\n box-shadow: none;\r\n }\r\n \r\n .tw-cursor-not-allowed {\r\n cursor: not-allowed;\r\n }\r\n `],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideEleJsonEditorComponent),\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CideEleJsonEditorComponent implements OnInit, ControlValueAccessor {\r\n // Inputs\r\n @Input() label?: string;\r\n @Input() helperText?: string;\r\n @Input() required = false;\r\n @Input() disabled = signal(false);\r\n @Input() showCharacterCount = false;\r\n @Input() config: JsonEditorConfig = {};\r\n configSignal = signal<JsonEditorConfig>({});\r\n\r\n // Outputs\r\n @Output() valueChange = new EventEmitter<string>();\r\n @Output() objectChange = new EventEmitter<object | null>();\r\n @Output() errorsChange = new EventEmitter<JsonEditorError[]>();\r\n @Output() validChange = new EventEmitter<boolean>();\r\n\r\n // ViewChild\r\n jsonTextarea = viewChild.required<ElementRef<HTMLTextAreaElement>>('jsonTextarea');\r\n\r\n // Dependency injection\r\n private destroyRef = inject(DestroyRef);\r\n\r\n // Internal state\r\n jsonString = signal('');\r\n jsonObject = signal<object | null>(null);\r\n errors = signal<JsonEditorError[]>([]);\r\n editorId = `json-editor-${Math.random().toString(36).substr(2, 9)}`;\r\n\r\n // Computed values\r\n hasErrors = computed(() => this.errors().length > 0);\r\n isValid = computed(() => !this.hasErrors() && this.jsonObject() !== null);\r\n lineNumbers = computed(() => {\r\n const lines = this.jsonString().split('\\n');\r\n return Array.from({ length: Math.max(lines.length, 1) }, (_, i) => i + 1);\r\n });\r\n containerClass = computed(() => {\r\n const classes = ['tw-w-full'];\r\n if (this.disabled()) {\r\n classes.push('tw-opacity-50');\r\n }\r\n return classes.join(' ');\r\n });\r\n\r\n // Default configuration\r\n private defaultConfig: JsonEditorConfig = {\r\n syntaxHighlighting: true,\r\n showLineNumbers: true,\r\n autoFormat: true,\r\n validateOnChange: true,\r\n theme: 'light',\r\n minHeight: 120,\r\n maxHeight: 400,\r\n placeholder: 'Enter JSON configuration...',\r\n readOnly: false,\r\n showErrors: true\r\n };\r\n\r\n ngOnInit(): void {\r\n // Merge default config with input config\r\n const mergedConfig = { ...this.defaultConfig, ...this.config };\r\n this.configSignal.set(mergedConfig);\r\n \r\n // Initial validation\r\n if (mergedConfig.validateOnChange && this.jsonString()) {\r\n this.validateJson();\r\n }\r\n }\r\n\r\n /**\r\n * Handle input changes\r\n */\r\n onInput(event: Event): void {\r\n const target = event.target as HTMLTextAreaElement;\r\n const value = target.value;\r\n \r\n this.jsonString.set(value);\r\n this.valueChange.emit(value);\r\n \r\n // Call ControlValueAccessor onChange callback\r\n this.onChange(value);\r\n \r\n if (this.configSignal().validateOnChange) {\r\n this.validateJson();\r\n }\r\n \r\n this.parseJson(value);\r\n }\r\n\r\n /**\r\n * Handle blur event\r\n */\r\n onBlur(): void {\r\n // Call ControlValueAccessor onTouched callback\r\n this.onTouched();\r\n \r\n if (this.configSignal().autoFormat && this.isValid()) {\r\n this.formatJson();\r\n }\r\n }\r\n\r\n /**\r\n * Parse JSON string and emit object\r\n */\r\n private parseJson(jsonStr: string): void {\r\n if (!jsonStr.trim()) {\r\n this.jsonObject.set(null);\r\n this.objectChange.emit(null);\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(jsonStr);\r\n this.jsonObject.set(parsed);\r\n this.objectChange.emit(parsed);\r\n } catch (error) {\r\n // Error will be handled by validateJson\r\n this.jsonObject.set(null);\r\n this.objectChange.emit(null);\r\n }\r\n }\r\n\r\n /**\r\n * Validate JSON and update errors\r\n */\r\n private validateJson(): void {\r\n const jsonStr = this.jsonString();\r\n const newErrors: JsonEditorError[] = [];\r\n\r\n if (!jsonStr.trim()) {\r\n this.errors.set(newErrors);\r\n this.errorsChange.emit(newErrors);\r\n this.validChange.emit(true);\r\n return;\r\n }\r\n\r\n try {\r\n JSON.parse(jsonStr);\r\n // JSON is valid\r\n this.errors.set(newErrors);\r\n this.errorsChange.emit(newErrors);\r\n this.validChange.emit(true);\r\n } catch (error) {\r\n // Parse error - extract line and column information\r\n const errorMessage = (error as Error).message;\r\n const lineMatch = errorMessage.match(/position (\\d+)/);\r\n \r\n if (lineMatch) {\r\n const position = parseInt(lineMatch[1]);\r\n const lines = jsonStr.substring(0, position).split('\\n');\r\n const line = lines.length;\r\n const column = lines[lines.length - 1].length + 1;\r\n \r\n newErrors.push({\r\n line,\r\n column,\r\n message: 'Invalid JSON syntax',\r\n type: 'syntax'\r\n });\r\n } else {\r\n newErrors.push({\r\n line: 1,\r\n column: 1,\r\n message: 'Invalid JSON format',\r\n type: 'syntax'\r\n });\r\n }\r\n \r\n this.errors.set(newErrors);\r\n this.errorsChange.emit(newErrors);\r\n this.validChange.emit(false);\r\n }\r\n }\r\n\r\n /**\r\n * Format JSON with proper indentation\r\n */\r\n formatJson(): void {\r\n if (!this.jsonString().trim()) {\r\n return;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(this.jsonString());\r\n const formatted = JSON.stringify(parsed, null, 2);\r\n this.jsonString.set(formatted);\r\n this.valueChange.emit(formatted);\r\n this.jsonObject.set(parsed);\r\n this.objectChange.emit(parsed);\r\n this.errors.set([]);\r\n this.errorsChange.emit([]);\r\n this.validChange.emit(true);\r\n } catch (error) {\r\n // Don't format if JSON is invalid\r\n console.warn('Cannot format invalid JSON');\r\n }\r\n }\r\n\r\n /**\r\n * Check if there's an error on a specific line\r\n */\r\n hasErrorOnLine(line: number): boolean {\r\n return this.errors().some(error => error.line === line);\r\n }\r\n\r\n /**\r\n * Get error ID for accessibility\r\n */\r\n errorId(): string {\r\n return `${this.editorId}-errors`;\r\n }\r\n\r\n /**\r\n * Focus the editor\r\n */\r\n focus(): void {\r\n this.jsonTextarea().nativeElement.focus();\r\n }\r\n\r\n /**\r\n * Clear the editor\r\n */\r\n clear(): void {\r\n this.jsonString.set('');\r\n this.jsonObject.set(null);\r\n this.errors.set([]);\r\n this.valueChange.emit('');\r\n this.objectChange.emit(null);\r\n this.errorsChange.emit([]);\r\n this.validChange.emit(true);\r\n }\r\n\r\n /**\r\n * Get current JSON object\r\n */\r\n getValue(): object | null {\r\n return this.jsonObject();\r\n }\r\n\r\n /**\r\n * Get current JSON string\r\n */\r\n getStringValue(): string {\r\n return this.jsonString();\r\n }\r\n\r\n /**\r\n * Check if JSON is valid\r\n */\r\n isValidJson(): boolean {\r\n return this.isValid();\r\n }\r\n\r\n /**\r\n * Get validation errors\r\n */\r\n getErrors(): JsonEditorError[] {\r\n return this.errors();\r\n }\r\n\r\n // ControlValueAccessor methods\r\n writeValue(value: string | object | null | undefined): void {\r\n if (value === null || value === undefined) {\r\n this.jsonString.set('');\r\n this.jsonObject.set(null);\r\n } else if (typeof value === 'string') {\r\n this.jsonString.set(value);\r\n this.parseJson(value);\r\n } else if (typeof value === 'object') {\r\n this.jsonObject.set(value);\r\n this.jsonString.set(JSON.stringify(value, null, 2));\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: string) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled.set(isDisabled);\r\n }\r\n\r\n private onChange: (value: string) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n} ","/*\n * Public API Surface of cloud-ide-element\n * Here we can add what need to be exported from library\n */\n\nexport * from './lib/elements/input/input.component';\nexport * from './lib/elements/button/cide-ele-button.component';\nexport * from './lib/elements/spinner/spinner.component';\nexport * from './lib/elements/icon/icon.component';\nexport * from './lib/elements/select/select.component';\nexport * from './lib/elements/tab/cide-ele-tab.component';\nexport * from './lib/elements/file-input/file-input.component';\nexport * from './lib/elements/textarea/textarea.component';\nexport * from './lib/utils/services/elements/elements.service';\nexport * from './lib/utils/directives/resizer/resizer.directive';\nexport * from './lib/utils/directives/tooltip/tooltip.directive';\nexport * from './lib/components/skeleton-loader/skeleton-loader.component';\n\n// Data Grid Component and Types\nexport * from './lib/components/data-grid/data-grid.component';\nexport * from './lib/components/data-grid/data-grid.types';\n\n// Dropdown Component and Service\nexport * from './lib/components/dropdown/dropdown.component';\nexport * from './lib/services/dropdown-manager.service';\n\n// Confirmation and Notification System\nexport * from './lib/services/confirmation.service';\nexport * from './lib/services/notification.service';\nexport * from './lib/components/confirmation-modal/confirmation-modal.component';\nexport * from './lib/components/toast-notification/toast-notification.component';\nexport * from './lib/components/global-notifications/global-notifications.component';\n\n// JSON Editor Component\nexport * from './lib/components/json-editor/json-editor.component';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CideElementsService","i2"],"mappings":"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"}
|