cloud-ide-element 1.0.63 → 1.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"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/interfaces/core-file-manager.interface.ts","../../../projects/cloud-ide-element/src/lib/services/file-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/notification.service.ts","../../../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/directives/file-image/file-image.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/core-file-manager.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';\n\nexport interface PortalPosition {\n top: number;\n left: number;\n maxHeight?: number;\n maxWidth?: number;\n minWidth?: number;\n}\n\nexport interface PortalConfig {\n triggerElement: HTMLElement;\n content: string;\n className?: string;\n position?: 'bottom' | 'top' | 'auto';\n align?: 'left' | 'right' | 'center' | 'auto';\n offsetX?: number;\n offsetY?: number;\n maxHeight?: number;\n minWidth?: number;\n closeOnClickOutside?: boolean;\n closeOnEscape?: boolean;\n}\n\nexport interface TemplatePortalConfig {\n triggerElement: HTMLElement;\n template: TemplateRef<any>;\n viewContainerRef: ViewContainerRef;\n context?: any;\n className?: string;\n position?: 'bottom' | 'top' | 'auto';\n align?: 'left' | 'right' | 'center' | 'auto';\n offsetX?: number;\n offsetY?: number;\n maxHeight?: number;\n minWidth?: number;\n closeOnClickOutside?: boolean;\n closeOnEscape?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PortalService {\n private portals = new Map<string, HTMLElement>();\n private templatePortals = new Map<string, { element: HTMLElement; viewRef: EmbeddedViewRef<any> }>();\n private boundClickOutsideHandler: (event: Event) => void;\n private boundEscapeHandler: (event: KeyboardEvent) => void;\n private closeCallbacks = new Map<string, () => void>();\n\n constructor() {\n this.boundClickOutsideHandler = this.handleClickOutside.bind(this);\n this.boundEscapeHandler = this.handleEscape.bind(this);\n }\n\n /**\n * Create a portal with the given configuration\n */\n createPortal(id: string, config: PortalConfig): HTMLElement {\n // Clean up any existing portal with the same ID\n this.destroyPortal(id);\n\n // Calculate position\n const position = this.calculatePosition(config);\n\n // Create portal element\n const portal = document.createElement('div');\n portal.id = `portal-${id}`;\n portal.className = `cide-portal ${config.className || ''}`;\n portal.style.position = 'fixed';\n portal.style.top = `${position.top}px`;\n portal.style.left = `${position.left}px`;\n portal.style.zIndex = '9999';\n\n if (position.maxHeight) {\n portal.style.maxHeight = `${position.maxHeight}px`;\n portal.style.overflowY = 'auto';\n }\n\n if (position.maxWidth) {\n portal.style.maxWidth = `${position.maxWidth}px`;\n }\n\n if (position.minWidth) {\n portal.style.minWidth = `${position.minWidth}px`;\n }\n\n // Set content\n portal.innerHTML = config.content;\n\n // Append to body\n document.body.appendChild(portal);\n\n // Store portal reference\n this.portals.set(id, portal);\n\n // Set up event listeners if needed\n if (config.closeOnClickOutside || config.closeOnEscape) {\n this.setupEventListeners(id, config);\n }\n\n // Adjust position if portal goes outside viewport\n this.adjustPosition(portal, config.triggerElement);\n\n return portal;\n }\n\n /**\n * Create a template-based portal with Angular template\n */\n createTemplatePortal(id: string, config: TemplatePortalConfig): HTMLElement {\n // Clean up any existing portal with the same ID\n this.destroyPortal(id);\n\n // Calculate position\n const position = this.calculatePosition({\n triggerElement: config.triggerElement,\n content: '', // Not used for template portals\n position: config.position,\n align: config.align,\n offsetX: config.offsetX,\n offsetY: config.offsetY,\n maxHeight: config.maxHeight,\n minWidth: config.minWidth\n });\n console.log(\"test astrd\", config);\n // Create the view from template\n const viewRef = config.viewContainerRef.createEmbeddedView(config.template, { context: config.context });\n viewRef.detectChanges();\n \n console.log('🔵 Template view created:', {\n viewRef,\n rootNodes: viewRef.rootNodes,\n rootNodesLength: viewRef.rootNodes.length\n });\n\n // Create portal container element\n const portal = document.createElement('div');\n portal.id = `portal-${id}`;\n portal.className = `cide-portal ${config.className || ''}`;\n portal.style.position = 'fixed';\n portal.style.top = `${position.top}px`;\n portal.style.left = `${position.left}px`;\n portal.style.zIndex = '99999'; // Increased z-index\n portal.style.display = 'block';\n portal.style.visibility = 'visible';\n portal.style.opacity = '1';\n\n if (position.maxHeight) {\n portal.style.maxHeight = `${position.maxHeight}px`;\n portal.style.overflowY = 'auto';\n }\n\n if (position.maxWidth) {\n portal.style.maxWidth = `${position.maxWidth}px`;\n }\n\n if (position.minWidth) {\n portal.style.minWidth = `${position.minWidth}px`;\n }\n\n // Append template nodes to portal\n viewRef.rootNodes.forEach(node => {\n portal.appendChild(node);\n });\n\n // Append to body\n document.body.appendChild(portal);\n\n // Store template portal reference\n this.templatePortals.set(id, { element: portal, viewRef });\n\n console.log('🔵 Portal created and appended to body:', {\n id,\n portal,\n position: { top: position.top, left: position.left },\n zIndex: portal.style.zIndex,\n className: portal.className,\n children: portal.children.length\n });\n\n // Set up event listeners if needed\n if (config.closeOnClickOutside || config.closeOnEscape) {\n this.setupEventListeners(id, {\n triggerElement: config.triggerElement,\n content: '',\n closeOnClickOutside: config.closeOnClickOutside,\n closeOnEscape: config.closeOnEscape\n });\n }\n\n // Adjust position if portal goes outside viewport\n this.adjustPosition(portal, config.triggerElement);\n\n return portal;\n }\n\n /**\n * Update portal content\n */\n updatePortal(id: string, content: string): void {\n const portal = this.portals.get(id);\n if (portal) {\n portal.innerHTML = content;\n }\n }\n\n /**\n * Update portal position\n */\n updatePortalPosition(id: string, config: PortalConfig): void {\n const portal = this.portals.get(id);\n if (portal) {\n const position = this.calculatePosition(config);\n portal.style.top = `${position.top}px`;\n portal.style.left = `${position.left}px`;\n this.adjustPosition(portal, config.triggerElement);\n }\n }\n\n /**\n * Destroy a portal\n */\n destroyPortal(id: string): void {\n // Handle regular portals\n const portal = this.portals.get(id);\n if (portal && portal.parentNode) {\n portal.parentNode.removeChild(portal);\n this.portals.delete(id);\n this.closeCallbacks.delete(id);\n this.cleanupEventListeners();\n return;\n }\n\n // Handle template portals\n const templatePortal = this.templatePortals.get(id);\n if (templatePortal) {\n if (templatePortal.element && templatePortal.element.parentNode) {\n templatePortal.element.parentNode.removeChild(templatePortal.element);\n }\n templatePortal.viewRef.destroy();\n this.templatePortals.delete(id);\n this.closeCallbacks.delete(id);\n this.cleanupEventListeners();\n }\n }\n\n /**\n * Destroy all portals\n */\n destroyAllPortals(): void {\n this.portals.forEach((_, id) => this.destroyPortal(id));\n this.templatePortals.forEach((_, id) => this.destroyPortal(id));\n }\n\n /**\n * Register a close callback for a portal\n */\n registerCloseCallback(id: string, callback: () => void): void {\n this.closeCallbacks.set(id, callback);\n }\n\n /**\n * Get portal element by ID\n */\n getPortal(id: string): HTMLElement | undefined {\n const portal = this.portals.get(id);\n if (portal) return portal;\n\n const templatePortal = this.templatePortals.get(id);\n return templatePortal?.element;\n }\n\n /**\n * Check if portal exists\n */\n hasPortal(id: string): boolean {\n return this.portals.has(id) || this.templatePortals.has(id);\n }\n\n private calculatePosition(config: PortalConfig): PortalPosition {\n const rect = config.triggerElement.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n const offsetX = config.offsetX || 0;\n const offsetY = config.offsetY || 4;\n const estimatedHeight = config.maxHeight || 300;\n const estimatedWidth = config.minWidth || rect.width;\n\n // Smart vertical positioning - check available space above and below\n const spaceBelow = viewport.height - rect.bottom;\n const spaceAbove = rect.top;\n \n let top: number;\n let position: 'top' | 'bottom' = 'bottom'; // Default to bottom\n \n // Determine if we should open above or below\n if (config.position === 'auto' || !config.position) {\n // Auto-detect: prefer bottom, but use top if not enough space below\n if (spaceBelow < estimatedHeight && spaceAbove > estimatedHeight) {\n position = 'top';\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\n } else {\n position = 'bottom';\n top = rect.bottom + window.scrollY + offsetY;\n }\n } else if (config.position === 'top') {\n position = 'top';\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\n } else {\n position = 'bottom';\n top = rect.bottom + window.scrollY + offsetY;\n }\n\n let left = rect.left + window.scrollX + offsetX; \n\n // Auto-detect horizontal alignment\n if (config.align === 'auto' || !config.align) {\n const spaceRight = viewport.width - rect.left;\n const spaceLeft = rect.right;\n\n if (spaceRight < estimatedWidth && spaceLeft > estimatedWidth) {\n // Align to right edge of trigger\n left = rect.right + window.scrollX - estimatedWidth;\n }\n } else if (config.align === 'right') {\n left = rect.right + window.scrollX - estimatedWidth;\n } else if (config.align === 'center') {\n left = rect.left + window.scrollX + (rect.width / 2) - (estimatedWidth / 2);\n }\n\n return {\n top,\n left,\n maxHeight: config.maxHeight,\n minWidth: config.minWidth\n };\n }\n\n private adjustPosition(portal: HTMLElement, triggerElement: HTMLElement): void {\n const portalRect = portal.getBoundingClientRect();\n const triggerRect = triggerElement.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n let adjustedLeft = parseInt(portal.style.left);\n let adjustedTop = parseInt(portal.style.top);\n\n // Adjust horizontal position if portal goes outside viewport\n if (portalRect.right > viewport.width) {\n adjustedLeft = triggerRect.right + window.scrollX - portalRect.width;\n }\n if (portalRect.left < 0) {\n adjustedLeft = window.scrollX + 4; // Small margin from edge\n }\n\n // Smart vertical adjustment - flip to opposite side if needed\n const spaceBelow = viewport.height - triggerRect.bottom;\n const spaceAbove = triggerRect.top;\n const portalHeight = portalRect.height;\n\n // If portal goes below viewport and there's more space above, flip to top\n if (portalRect.bottom > viewport.height && spaceAbove > portalHeight) {\n adjustedTop = triggerRect.top + window.scrollY - portalHeight - 4;\n }\n // If portal goes above viewport and there's more space below, flip to bottom\n else if (portalRect.top < 0 && spaceBelow > portalHeight) {\n adjustedTop = triggerRect.bottom + window.scrollY + 4;\n }\n // If still outside viewport, adjust to fit within bounds\n else {\n if (portalRect.bottom > viewport.height) {\n adjustedTop = viewport.height + window.scrollY - portalHeight - 4;\n }\n if (portalRect.top < 0) {\n adjustedTop = window.scrollY + 4; // Small margin from top\n }\n }\n\n portal.style.left = `${adjustedLeft}px`;\n portal.style.top = `${adjustedTop}px`;\n }\n\n private setupEventListeners(id: string, config: PortalConfig): void {\n // Set up event listeners only once when first portal is created\n const totalPortals = this.portals.size + this.templatePortals.size;\n if (totalPortals === 1) {\n if (config.closeOnClickOutside) {\n document.addEventListener('click', this.boundClickOutsideHandler);\n }\n if (config.closeOnEscape) {\n document.addEventListener('keydown', this.boundEscapeHandler);\n }\n }\n }\n\n private cleanupEventListeners(): void {\n // Clean up event listeners when no portals exist\n const totalPortals = this.portals.size + this.templatePortals.size;\n if (totalPortals === 0) {\n document.removeEventListener('click', this.boundClickOutsideHandler);\n document.removeEventListener('keydown', this.boundEscapeHandler);\n }\n }\n\n private handleClickOutside(event: Event): void {\n const target = event.target as HTMLElement;\n\n // Handle regular portals\n this.portals.forEach((portal, id) => {\n const callback = this.closeCallbacks.get(id);\n if (callback && !portal.contains(target)) {\n // Check if click is on trigger element\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\n if (!triggerElement || !triggerElement.contains(target)) {\n callback();\n }\n }\n });\n\n // Handle template portals\n this.templatePortals.forEach((templatePortal, id) => {\n const callback = this.closeCallbacks.get(id);\n if (callback && !templatePortal.element.contains(target)) {\n // Check if click is on trigger element\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\n if (!triggerElement || !triggerElement.contains(target)) {\n callback();\n }\n }\n });\n }\n\n private handleEscape(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n // Close the most recently opened portal\n const portalIds = Array.from(this.portals.keys());\n const templatePortalIds = Array.from(this.templatePortals.keys());\n const allPortalIds = [...portalIds, ...templatePortalIds];\n const lastPortalId = allPortalIds[allPortalIds.length - 1];\n\n if (lastPortalId) {\n const callback = this.closeCallbacks.get(lastPortalId);\n if (callback) {\n callback();\n }\n }\n }\n }\n}\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 = \"floating\";\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 = true;\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 = \"md\";\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 let ngModel = this.autoCapitalizeByOption(value, this.type);\r\n if (this.type === 'date') {\r\n ngModel = this.processValue(ngModel, this.type);\r\n }\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 } else {\r\n // Try to parse and format unformatted date to YYYY-MM-DD\r\n const parsedDate = new Date(value);\r\n if (!isNaN(parsedDate.getTime())) {\r\n const year = parsedDate.getFullYear();\r\n const month = String(parsedDate.getMonth() + 1).padStart(2, '0');\r\n const day = String(parsedDate.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n }\r\n } else if (type === 'url' && typeof value === 'string' && value) {\r\n // Normalize URL format - ensure it starts with http:// or https://\r\n if (!value.startsWith('http://') && !value.startsWith('https://')) {\r\n return `https://${value}`;\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 } else if (type == 'url') {\r\n // URLs should not be capitalized - return as is\r\n return value;\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 == 'url') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n // Validate URL format\r\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n return urlRegex.test(value);\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 console.log(value, \"value, req\")\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) === 'number'){\r\n value = value.toString();\r\n }\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 == 'url') {\r\n if (typeof (value) == 'string' && value) {\r\n // URL validation regex\r\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n if (!urlRegex.test(value)) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Please enter a valid URL (e.g., https://example.com)!`;\r\n }\r\n\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 if (this.required && !value) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `URL is 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 if (this.type === 'url') {\r\n this.typeInternal = \"url\";\r\n // Set default link icon if no trailing icon specified\r\n this.trailingIconInternal = this.trailingIcon || \"link\";\r\n this.isTrailingIconAllwedClick = false; // URL type doesn't need clickable trailing 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 // Parse date string in YYYY-MM-DD format to avoid timezone issues\r\n const [year, month, day] = date.split('-').map(Number);\r\n date = new Date(year, month - 1, day); // month is 0-indexed\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 // Parse date string in YYYY-MM-DD format to avoid timezone issues\r\n const [year, month, day] = date.split('-').map(Number);\r\n date = new Date(year, month - 1, day); // month is 0-indexed\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 // Parse date string in YYYY-MM-DD format to avoid timezone issues\r\n const [year, month, day] = this.ngModel.split('-').map(Number);\r\n this.selectedDate = new Date(year, month - 1, day); // month is 0-indexed\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: 'auto' as const, // Smart positioning - will auto-detect best position\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 - Use local date formatting to avoid timezone issues\r\n const year = dayInfo.date.getFullYear();\r\n const month = String(dayInfo.date.getMonth() + 1).padStart(2, '0');\r\n const day = String(dayInfo.date.getDate()).padStart(2, '0');\r\n const formattedDate = `${year}-${month}-${day}`; // YYYY-MM-DD format\r\n\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 | URL------------------------------------------>\r\n @if (type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'tel' || type === 'date' || type === 'url') {\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, non-url) -->\r\n @if (type !== 'date' && type !== 'url') {\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\r\n <!-- URL Input -->\r\n @if (type === 'url') {\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\"\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-base\">chevron_left</span>\r\n </button>\r\n \r\n <button \r\n type=\"button\" \r\n class=\"tw-text-sm tw-font-medium 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-base\">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-base\">keyboard_double_arrow_left</span>\r\n </button>\r\n <span class=\"tw-text-sm tw-font-medium 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-base\">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 }\" type=\"button\">\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, TemplateRef, ViewContainerRef, inject } 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';\nimport { PortalService } from '../../services/portal.service';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\n// Extended interface for object-based options\nexport interface SelectOptionObject {\n [key: string]: any;\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],\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 | string[] = '';\n @Input() size: themeSize = 'md';\n @Input() fill: elementStyleType = 'outline';\n @Input() labelPlacement: labelPlacementType = 'floating';\n @Input() labelDir: labelDirType = 'start';\n @Input() leadingIcon: string = '';\n @Input() trailingIcon: string = '';\n @Input() clearInput: boolean = false;\n @Input() options: (SelectOption | SelectOptionObject)[] = [];\n @Input() multiple: boolean = false;\n @Input() searchable: boolean = false;\n @Input() showSearchInput: boolean = true;\n @Input() loading: boolean = false;\n /** \n * Key to extract the value from option objects. \n * Default: 'value'. Use when options are objects with custom property names.\n * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set valueKey = 'id'\n */\n @Input() valueKey: string = 'value';\n\n /** \n * Key to extract the label from option objects. \n * Default: 'label'. Use when options are objects with custom property names.\n * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set labelKey = 'name'\n */\n @Input() labelKey: string = 'label';\n\n @Output() ngModelChange = new EventEmitter<string | number | string[]>();\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('change') selectionChange = new EventEmitter<any>();\n @Output() searchChange = new EventEmitter<selectSearchType>();\n\n isOpen: boolean = false;\n isTouched = false;\n isValid = true;\n searchTerm: string = '';\n filteredOptions: (SelectOption | SelectOptionObject)[] = [];\n private searchDebounceTimeout: ReturnType<typeof setTimeout> | null = null;\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n private isUpdatingOptions: boolean = false;\n \n // Portal-related properties\n private portalService = inject(PortalService);\n private dropdownPortalId: string = '';\n @ViewChild('dropdownTemplate', { static: false }) dropdownTemplate!: TemplateRef<any>;\n @ViewChild('dropdownContainer', { read: ViewContainerRef, static: false }) dropdownContainer!: ViewContainerRef;\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 // Setup debounced search\n this.setupDebouncedSearch();\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 => this.getOptionValue(option) === this.ngModel)) {\n this.searchChange.emit({\n query: \"\",\n value: this.ngModel as string | number // emit raw value for external handlers\n });\n }\n }\n if (changes['options']) {\n this.filterOptions();\n console.log('🔍 options changed', this.options, this.isOpen, this.dropdownPortalId);\n \n // Debug: Check what elements exist in the DOM\n if (this.dropdownPortalId) {\n console.log('🔍 Current portal ID:', this.dropdownPortalId);\n console.log('🔍 All elements with portal ID:', document.querySelectorAll(`[id*=\"${this.dropdownPortalId}\"]`));\n console.log('🔍 All input elements:', document.querySelectorAll('input[type=\"text\"]'));\n console.log('🔍 All elements with select-dropdown in ID:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\n console.log('🔍 All portal elements:', document.querySelectorAll('[id*=\"portal\"]'));\n }\n \n // Update portal context if dropdown is open\n if (this.isOpen && this.dropdownPortalId) {\n // Always use portal recreation since focus preservation is working\n this.updatePortalContext();\n }\n }\n }\n\n writeValue(value: string | number): void {\n this.ngModel = value;\n if (this.searchable) {\n this.searchChange.emit({\n query: \"\",\n value: value // emit raw value for external handlers\n });\n }\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 | string[]): ValidationErrors | null {\n if (this.required) {\n const isEmpty = (v: unknown) => {\n if (v === null || v === undefined) return true;\n if (typeof v === 'string') return v.trim() === '';\n if (Array.isArray(v)) return v.length === 0;\n return false;\n };\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 if (this.isOpen) {\n this.closeDropdown();\n } else {\n this.openDropdown();\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.closeDropdown(); // Close the portal on error\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n }\n }\n\n private openDropdown(): void {\n this.isOpen = true;\n this.logDebug('Opening dropdown with portal');\n \n // Clean up any orphaned portals before creating new one\n this.cleanupOrphanedPortals();\n \n this.calculateDropdownPosition();\n this.focusControl();\n this.searchTerm = '';\n this.filterOptions();\n this.createDropdownPortal();\n this.logDebug('Dropdown opened, search term reset');\n }\n\n private closeDropdown(): void {\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n this.logDebug('Closing dropdown portal');\n this.destroyDropdownPortal();\n this.logDebug('Dropdown closed, interaction flags reset');\n }\n\n // Cleanup method to prevent memory leaks\n ngOnDestroy(): void {\n this.clearTimeouts();\n // Clear search debounce timeout\n if (this.searchDebounceTimeout) {\n clearTimeout(this.searchDebounceTimeout);\n this.searchDebounceTimeout = null;\n }\n \n // Complete subjects to prevent memory leaks\n this.destroy$.next();\n this.destroy$.complete();\n this.searchSubject.complete();\n \n // Destroy dropdown portal\n this.destroyDropdownPortal();\n \n // Clean up any remaining portals from this component\n console.log('🔍 Cleaning up all portals on destroy');\n const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\n console.log('🔍 Found portals to clean up:', allPortals.length);\n allPortals.forEach(portal => {\n const portalId = portal.getAttribute('id');\n if (portalId) {\n console.log('🔍 Cleaning up portal:', portalId);\n this.portalService.destroyPortal(portalId);\n }\n });\n \n window.removeEventListener('resize', this.onWindowResize.bind(this));\n this.logDebug('Component destroyed, timeouts cleared');\n }\n\n private createDropdownPortal(): void {\n try {\n const triggerElement = this.elementRef?.nativeElement;\n if (!triggerElement || !this.dropdownTemplate || !this.dropdownContainer) {\n this.logDebug('Cannot create portal - missing elements');\n return;\n }\n\n // Ensure filteredOptions is properly initialized\n if (!this.filteredOptions || this.filteredOptions.length === 0) {\n this.filterOptions(); // Make sure filteredOptions is populated\n }\n\n // Generate unique portal ID\n this.dropdownPortalId = `select-dropdown-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n console.log('🔍 Creating new portal with ID:', this.dropdownPortalId);\n\n const portalConfig = {\n triggerElement,\n template: this.dropdownTemplate,\n viewContainerRef: this.dropdownContainer,\n context: {\n options: this.filteredOptions,\n isOpen: this.isOpen,\n searchTerm: this.searchTerm,\n searchable: this.searchable,\n multiple: this.multiple,\n loading: this.loading,\n dropdownPosition: this.dropdownPosition,\n onSearchInput: this.onSearchInput.bind(this),\n selectOption: this.selectOption.bind(this),\n isOptionSelected: this.isOptionSelected.bind(this),\n trackByValue: this.trackByValue.bind(this),\n getOptionLabel: this.getOptionLabel.bind(this)\n },\n className: 'cide-select-dropdown-portal',\n position: this.dropdownPosition,\n align: 'left' as const,\n offsetX: 0,\n offsetY: 5,\n maxHeight: 250,\n minWidth: 200,\n closeOnClickOutside: true,\n closeOnEscape: true\n };\n\n // Create the template portal\n this.portalService.createTemplatePortal(this.dropdownPortalId, portalConfig);\n\n // Register close callback\n this.portalService.registerCloseCallback(this.dropdownPortalId, () => {\n this.closeDropdown();\n });\n\n // Set data attribute for click outside detection\n triggerElement.setAttribute('data-portal-trigger', this.dropdownPortalId);\n\n this.logDebug('Dropdown portal created', { \n portalId: this.dropdownPortalId, \n filteredOptionsCount: this.filteredOptions.length,\n allOptionsCount: this.options.length \n });\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] createDropdownPortal error:`, error);\n }\n }\n\n private destroyDropdownPortal(): void {\n try {\n if (this.dropdownPortalId) {\n console.log('🔍 Destroying portal with ID:', this.dropdownPortalId);\n this.portalService.destroyPortal(this.dropdownPortalId);\n this.dropdownPortalId = '';\n this.logDebug('Dropdown portal destroyed');\n console.log('🔍 Portal destroyed, remaining portals:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] destroyDropdownPortal error:`, error);\n }\n }\n\n private updatePortalContext(): void {\n try {\n if (!this.dropdownPortalId) {\n return; // Portal not created yet\n }\n\n // Set flag to prevent blur during update\n this.isUpdatingOptions = true;\n\n // Store reference to search input before destroying portal\n console.log('🔍 Looking for search input with portal ID:', this.dropdownPortalId);\n const searchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 searchInput found:', searchInput);\n \n // Try alternative selectors if the first one fails\n let searchInputAlt = null;\n if (!searchInput) {\n searchInputAlt = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 searchInputAlt found:', searchInputAlt);\n }\n \n const finalSearchInput = searchInput || searchInputAlt;\n const wasSearchInputFocused = finalSearchInput && document.activeElement === finalSearchInput;\n const searchInputValue = finalSearchInput ? finalSearchInput.value : '';\n const cursorPosition = finalSearchInput ? finalSearchInput.selectionStart || 0 : 0;\n\n // Since the portal service doesn't have an update context method,\n // we need to recreate the portal with updated context\n this.destroyDropdownPortal();\n this.createDropdownPortal();\n \n // Restore focus and value to search input after recreation\n if (wasSearchInputFocused && searchInputValue) {\n // Use multiple timing strategies to ensure focus restoration works\n const restoreFocus = () => {\n let newSearchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 newSearchInput', newSearchInput);\n \n // Try alternative selectors if the first one fails\n if (!newSearchInput) {\n newSearchInput = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 newSearchInputAlt', newSearchInput);\n }\n \n if (newSearchInput) {\n newSearchInput.value = searchInputValue;\n newSearchInput.focus();\n // Set cursor position to the original position\n newSearchInput.setSelectionRange(cursorPosition, cursorPosition);\n return true;\n }\n return false;\n };\n\n // Try immediate restoration\n if (!restoreFocus()) {\n // Try with requestAnimationFrame\n requestAnimationFrame(() => {\n if (!restoreFocus()) {\n // Try with setTimeout as fallback\n setTimeout(() => {\n restoreFocus();\n // Clear the flag after restoration\n this.isUpdatingOptions = false;\n }, 10);\n } else {\n // Clear the flag after successful restoration\n this.isUpdatingOptions = false;\n }\n });\n } else {\n // Clear the flag after successful restoration\n this.isUpdatingOptions = false;\n }\n } else {\n // Clear the flag if no focus restoration needed\n this.isUpdatingOptions = false;\n }\n \n this.logDebug('Portal context updated', { \n filteredOptionsCount: this.filteredOptions.length,\n searchTerm: this.searchTerm \n });\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] updatePortalContext error:`, error);\n this.isUpdatingOptions = false;\n }\n }\n\n private updateOptionsInDOM(): boolean {\n try {\n if (!this.dropdownPortalId) {\n return false; // Portal not created yet\n }\n\n // Find the options container in the DOM\n console.log('🔍 Looking for options container with portal ID:', this.dropdownPortalId);\n let optionsContainer = document.querySelector(`#${this.dropdownPortalId} .tw-py-1`);\n console.log('🔍 optionsContainer (.tw-py-1):', optionsContainer);\n \n // Try alternative selectors if the first one fails\n if (!optionsContainer) {\n optionsContainer = document.querySelector(`#${this.dropdownPortalId}`);\n console.log('🔍 optionsContainer (main):', optionsContainer);\n }\n \n if (!optionsContainer) {\n optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] .tw-py-1`);\n console.log('🔍 optionsContainer (alt .tw-py-1):', optionsContainer);\n }\n \n if (!optionsContainer) {\n optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"]`);\n console.log('🔍 optionsContainer (alt main):', optionsContainer);\n }\n \n if (!optionsContainer) {\n console.log('🔍 No options container found, returning false');\n return false;\n }\n\n console.log('🔍 optionsContainer found, clearing and updating with', this.filteredOptions.length, 'options');\n console.log('🔍 Current optionsContainer HTML before clear:', optionsContainer.innerHTML);\n\n // Find and clear only the option buttons and loading states, not the entire container\n const existingOptions = optionsContainer.querySelectorAll('.cide-select-option, .tw-px-3.tw-py-2, .tw-px-3.tw-py-4');\n console.log('🔍 Found existing options to remove:', existingOptions.length);\n existingOptions.forEach(option => option.remove());\n\n // Add filtered options directly to DOM\n this.filteredOptions.forEach((option) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.className = `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 ${\n this.isOptionSelected(option) ? 'tw-bg-blue-50 tw-text-blue-700' : ''\n } ${option.disabled ? 'tw-text-gray-400 tw-cursor-not-allowed' : ''}`;\n button.textContent = this.getOptionLabel(option);\n button.disabled = option.disabled || false;\n \n // Add event listeners\n button.addEventListener('mousedown', () => this.onDropdownMouseDown());\n button.addEventListener('click', () => this.selectOption(option));\n button.addEventListener('keyup', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n this.selectOption(option);\n }\n });\n\n optionsContainer.appendChild(button);\n });\n\n // Add \"No options\" message if no options\n if (this.filteredOptions.length === 0) {\n const noOptionsDiv = document.createElement('div');\n noOptionsDiv.className = 'tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic';\n noOptionsDiv.textContent = this.searchable && this.searchTerm ? 'No options found' : 'No options available';\n optionsContainer.appendChild(noOptionsDiv);\n }\n \n console.log('🔍 Options added, final optionsContainer HTML:', optionsContainer.innerHTML);\n console.log('🔍 Number of child elements in optionsContainer:', optionsContainer.children.length);\n \n this.logDebug('Options updated directly in DOM', { \n filteredOptionsCount: this.filteredOptions.length,\n searchTerm: this.searchTerm \n });\n \n return true; // Success\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] updateOptionsInDOM error:`, error);\n return false; // Failed\n }\n }\n\n private setupDebouncedSearch(): void {\n this.searchSubject\n .pipe(\n debounceTime(300), // 300ms debounce\n distinctUntilChanged((prev, curr) => {\n // Custom comparison to ensure empty strings are always emitted\n return prev === curr;\n }),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n console.log(`🔍 SELECT [${this.debugId}] Debounced search triggered:`, `\"${searchTerm}\"`);\n this.performSearch(searchTerm);\n });\n }\n\n private performSearch(searchTerm: string): void {\n const queryValue = searchTerm || '';\n \n console.log(`🔍 SELECT [${this.debugId}] About to emit search:`, `query=\"${queryValue}\"`);\n \n // Emit search change event for external API calls\n // Note: selectSearchType interface requires both query and value\n this.searchChange.emit({\n query: queryValue,\n value: '' // Empty value since this is just a search, not a selection\n });\n \n console.log(`🔍 SELECT [${this.debugId}] Search emitted successfully:`, `query=\"${queryValue}\"`);\n }\n\n private cleanupOrphanedPortals(): void {\n try {\n console.log('🔍 Cleaning up orphaned portals');\n const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\n console.log('🔍 Found portals before cleanup:', allPortals.length);\n \n allPortals.forEach(portal => {\n const portalId = portal.getAttribute('id');\n if (portalId && portalId !== this.dropdownPortalId) {\n console.log('🔍 Cleaning up orphaned portal:', portalId);\n this.portalService.destroyPortal(portalId);\n }\n });\n \n console.log('🔍 Orphaned portals cleaned up');\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] cleanupOrphanedPortals error:`, error);\n }\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 | SelectOptionObject): void {\n try {\n this.logDebug('selectOption called', { option, disabled: option.disabled, multiple: this.multiple });\n if (option.disabled) return;\n\n const optionValue = this.getOptionValue(option);\n\n if (this.multiple) {\n // Handle both array and CSV formats\n let current: string[] = [];\n \n if (Array.isArray(this.ngModel)) {\n // Handle array values (new format)\n current = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n } else {\n // Handle string values (legacy CSV format)\n const currentCsv = this.ngModel as string || '';\n current = currentCsv ? currentCsv.split(',').map(v => v.trim()).filter(Boolean) : [];\n }\n \n const idx = current.findIndex(v => v.toString() === optionValue.toString());\n\n if (idx >= 0) {\n current.splice(idx, 1);\n } else {\n current.push(optionValue.toString());\n }\n\n // For array-based form controls, emit array; for CSV-based, emit CSV\n if (Array.isArray(this.ngModel)) {\n this.ngModel = current;\n this.onChange(current as any);\n this.ngModelChange.emit(current);\n } else {\n const newCsv = current.join(',');\n this.ngModel = newCsv;\n this.onChange(newCsv);\n this.ngModelChange.emit(newCsv);\n }\n \n this.selectionChange.emit(option as SelectOption);\n this.validateValue(this.ngModel);\n this.isTouched = true;\n this.onTouched();\n // Do not close dropdown in multi-select mode\n } else {\n this.ngModel = optionValue;\n this.onChange(optionValue);\n this.ngModelChange.emit(optionValue);\n this.selectionChange.emit(option as SelectOption);\n this.validateValue(optionValue);\n this.isOpen = false;\n this.closeDropdown(); // Close the portal when option is selected\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.closeDropdown(); // Close the portal on error as well\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.closeDropdown(); // Close the portal when max interaction count exceeded\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.closeDropdown(); // Close the portal when dropdown interaction ends\n this.searchTerm = '';\n this.filterOptions();\n }\n this.interactionCount = 0;\n } catch (error) {\n this.isOpen = false;\n this.closeDropdown(); // Close the portal on error\n this.interactionCount = 0;\n }\n }, 150);\n } catch {\n this.isOpen = false;\n this.closeDropdown(); // Close the portal on error\n this.isDropdownInteraction = 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 if (this.multiple && Array.isArray(this.ngModel)) {\n this.ngModel = [];\n this.onChange([] as any);\n this.ngModelChange.emit([]);\n this.validateValue([]);\n } else {\n this.ngModel = '';\n this.onChange('');\n this.ngModelChange.emit('');\n this.validateValue('');\n }\n }\n\n getSelectedOptionLabel(): string {\n if (this.multiple) {\n // Handle both string (CSV) and array values\n let values: string[] = [];\n \n if (Array.isArray(this.ngModel)) {\n // Handle array values (new format)\n values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n } else {\n // Handle string values (legacy CSV format)\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return '';\n values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n }\n \n const labels = values\n .map(v => this.options.find(o => this.getOptionValue(o).toString() === v))\n .map(option => option ? this.getOptionLabel(option) : '')\n .filter((l): l is string => typeof l === 'string');\n return labels.join(', ');\n }\n const selectedOption = this.options.find(option => this.getOptionValue(option) === this.ngModel);\n return selectedOption ? this.getOptionLabel(selectedOption) : '';\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 => this.getOptionLabel(option).toLowerCase().includes(this.searchTerm.toLowerCase()));\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 \n console.log(`🔍 SELECT [${this.debugId}] Search input changed:`, `\"${this.searchTerm}\"`);\n \n // If search term is empty, emit immediately without debounce\n if (this.searchTerm === '' || this.searchTerm === null || this.searchTerm === undefined) {\n console.log(`🔍 SELECT [${this.debugId}] Empty search - emitting immediately`);\n this.performSearch('');\n } else {\n // For non-empty values, use debounced search\n this.searchSubject.next(this.searchTerm);\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 onSearchInputBlur(event: Event): void {\n // Prevent blur if we're updating options (to maintain focus during API updates)\n if (this.isUpdatingOptions) {\n event.preventDefault();\n (event.target as HTMLInputElement).focus();\n }\n }\n\n onDropdownMouseUp(): void {\n this.addTimeout(() => {\n this.isDropdownInteraction = false;\n }, 200);\n }\n\n isOptionSelected(option: SelectOption | SelectOptionObject): boolean {\n if (this.multiple) {\n // Handle both array and CSV formats\n let values: string[] = [];\n \n if (Array.isArray(this.ngModel)) {\n // Handle array values (new format)\n values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n } else {\n // Handle string values (legacy CSV format)\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return false;\n values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n }\n \n return values.includes(this.getOptionValue(option).toString());\n }\n return this.getOptionValue(option) === this.ngModel;\n }\n\n // Helper methods to extract values and labels from options\n getOptionValue(option: SelectOption | SelectOptionObject): string | number {\n if (this.isSelectOption(option)) {\n return option.value;\n }\n return option[this.valueKey] || '';\n }\n\n getOptionLabel(option: SelectOption | SelectOptionObject): string {\n if (this.isSelectOption(option)) {\n return option.label;\n }\n return option[this.labelKey] || '';\n }\n\n private isSelectOption(option: SelectOption | SelectOptionObject): option is SelectOption {\n return 'value' in option && 'label' in option;\n }\n\n trackByValue(index: number, option: SelectOption | SelectOptionObject): string | number {\n return this.getOptionValue(option);\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 @if (label && !labelHide) {\n <label [for]=\"id\" class=\"cide-select-label\">{{ label }}</label>\n }\n\n <div class=\"cide-element-select-wrapper tw-relative\">\n <!-- Leading Icon -->\n @if (leadingIcon) {\n <span class=\"cide-input-leading-icon-wrapper\">\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n </span>\n }\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 <!-- Trailing Icon (Dropdown Arrow or Loading Spinner) -->\n @if (!clearInput || !ngModel || loading) {\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 <!-- Loading Spinner -->\n @if (loading) {\n <span 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\"\n 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\">\n </path>\n </svg>\n </span>\n }\n <!-- Dropdown Arrow -->\n @if (!loading) {\n <span\n 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 }\n </span>\n }\n\n <!-- Clear Button -->\n @if (clearInput && ngModel) {\n <button class=\"cide-input-clear\" (click)=\"clearSelection()\" type=\"button\">\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n </button>\n }\n\n\n </div>\n\n <!-- Error/Helper Text -->\n @if ((errorText || helperText) && !isValid) {\n <span class=\"cide-select-help-error-text\">\n {{ errorText || helperText }}\n </span>\n }\n @if (helperText && isValid) {\n <span class=\"cide-select-help-error-text\">\n {{ helperText }}\n </span>\n }\n\n <!-- Portal Container -->\n <div #dropdownContainer></div>\n</div>\n\n<!-- Portal Template for Dropdown -->\n<ng-template #dropdownTemplate let-context=\"context\">\n <div\n class=\"cide-select-dropdown-portal tw-bg-white tw-border tw-border-gray-300 tw-rounded-md tw-shadow-lg tw-max-h-60 tw-overflow-y-auto tw-z-50\">\n <!-- Search Input (if searchable and showSearchInput is true) -->\n @if (context?.searchable && showSearchInput) {\n <div class=\"tw-p-2 tw-border-b tw-border-gray-200\">\n <input #searchInput type=\"text\" placeholder=\"Search options...\" [value]=\"context?.searchTerm\"\n (input)=\"context?.onSearchInput($event)\" (mousedown)=\"onDropdownMouseDown()\" (focus)=\"onDropdownMouseDown()\"\n (click)=\"$event.stopPropagation()\" (blur)=\"onSearchInputBlur($event)\"\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\n <!-- Options List -->\n <div class=\"tw-py-1\">\n <!-- Loading State -->\n @if (context?.loading) {\n <div 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\"\n 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\"\n 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\">\n </path>\n </svg>\n <span class=\"tw-text-sm tw-text-gray-500\">Loading...</span>\n </div>\n </div>\n }\n <!-- Options -->\n @if (!context?.loading) {\n @for (option of context?.options; track $index) {\n <button type=\"button\" (mousedown)=\"onDropdownMouseDown()\" (click)=\"context?.selectOption(option)\"\n (keyup.enter)=\"context?.selectOption(option)\" (keyup.space)=\"context?.selectOption(option)\"\n [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': context?.isOptionSelected(option),\n 'tw-text-gray-400 tw-cursor-not-allowed': option.disabled\n }\" class=\"cide-select-option\">\n {{ context?.getOptionLabel(option) }}\n </button>\n }\n }\n\n <!-- No options message -->\n @if (!context?.loading && context?.options.length === 0) {\n <div class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic\">\n {{ context?.searchable && context?.searchTerm ? 'No options found' : 'No options available' }}\n </div>\n }\n </div>\n </div>\n</ng-template>","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> ","/**\r\n * File Manager Interfaces\r\n * Based on core_file_manager table schema\r\n */\r\n\r\nexport interface ICoreCyfm {\r\n _id?: string;\r\n cyfm_name?: string;\r\n cyfm_alt_text?: string;\r\n cyfm_path?: string;\r\n cyfm_size_in_byte?: number;\r\n cyfm_type?: string;\r\n cyfm_creation_dt?: string;\r\n cyfm_id_user?: string;\r\n cyfm_permissions?: string[];\r\n cyfm_tags?: string[];\r\n cyfm_version?: number;\r\n cyfm_file_status_sygmt?: string;\r\n cyfm_isactive?: boolean;\r\n}\r\n\r\nexport interface ICoreFileManager extends ICoreCyfm {\r\n _id: string;\r\n cyfm_name: string;\r\n cyfm_path: string;\r\n cyfm_size_in_byte: number;\r\n cyfm_type: string;\r\n cyfm_creation_dt: string;\r\n cyfm_id_user: string;\r\n cyfm_permissions: string[];\r\n cyfm_tags: string[];\r\n cyfm_version: number;\r\n cyfm_file_status_sygmt: string;\r\n cyfm_isactive: boolean;\r\n}\r\n\r\nexport interface controllerResponse {\r\n success?: boolean; // true or false\r\n error_code?: string; // general master error codes\r\n message?: string; // special message we will connect this with general master in future for language achivment\r\n data?: any; //custom data\r\n code?: string; // like 200\r\n action?: string; // code to take conditionla action on save erro code\r\n total?: number; // for pagination calls\r\n pageIndex?: number; //for pagination\r\n pageSize?: number; //for pagination\r\n controls?: { [key: string]: string }; // error controls name and message\r\n}\r\n\r\nexport type IFileManagerErrorLogger = {\r\n [key in keyof MFileManager]: string;\r\n};\r\n\r\nexport class MFileManager {\r\n public cyfm_id: string = \"\";\r\n\r\n constructor(init: MFileManager) {\r\n Object.assign(this, init);\r\n }\r\n\r\n Validate?(): Partial<IFileManagerErrorLogger> {\r\n let errorLogger: Partial<IFileManagerErrorLogger> = {};\r\n // Log errors here\r\n if (!this.cyfm_id) {\r\n errorLogger.cyfm_id = \"File ID is Required!\";\r\n }\r\n\r\n return errorLogger;\r\n }\r\n}\r\n\r\nexport class ICoreCyfmSave implements ICoreCyfm {\r\n _id?: string;\r\n cyfm_name?: string;\r\n cyfm_alt_text?: string;\r\n cyfm_path?: string;\r\n cyfm_size_in_byte?: number;\r\n cyfm_type?: string;\r\n cyfm_creation_dt?: string;\r\n cyfm_id_user?: string;\r\n cyfm_permissions?: string[];\r\n cyfm_tags?: string[];\r\n cyfm_version?: number;\r\n cyfm_file_status_sygmt?: string;\r\n cyfm_isactive?: boolean;\r\n cyfm_file_base64: string = \"\";\r\n cyfm_temp_unique_id: string = \"\";\r\n\r\n constructor(init: ICoreCyfmSave) {\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\nexport class CoreFileManagerInsertUpdatePayload {\r\n core_file_manager_new: ICoreCyfmSave[] = [];\r\n core_file_manager_update: ICoreCyfm[] = [];\r\n core_file_manager_delete: ICoreCyfm[] = [];\r\n\r\n constructor(init: CoreFileManagerInsertUpdatePayload) {\r\n Object.assign(this, init);\r\n }\r\n\r\n Validate?(): Partial<IFileManagerErrorLogger> {\r\n let errorLogger: Partial<IFileManagerErrorLogger> = {};\r\n // Log errors here\r\n\r\n return errorLogger;\r\n }\r\n}\r\n\r\nexport interface fileManagerResponseData extends ICoreCyfm {\r\n cyfm_file_base64: string\r\n}\r\n\r\nexport interface fileManagerControllerResponse extends controllerResponse {\r\n data?: fileManagerResponseData[]\r\n}\r\n\r\nexport interface CoreFileManagerInsertUpdateResponse extends controllerResponse {\r\n data?: {\r\n core_file_manager: {\r\n cyfm_id: string;\r\n cyfm_temp_unique_id: string;\r\n }[];\r\n }\r\n}\r\n\r\nexport interface IFileUploadRequest {\r\n file: File;\r\n altText?: string;\r\n tags?: string[];\r\n permissions?: string[];\r\n userId: string;\r\n}\r\n\r\nexport interface IFileUploadResponse {\r\n success: boolean;\r\n message: string;\r\n data?: ICoreFileManager;\r\n error?: string;\r\n}\r\n\r\nexport interface IFileListRequest {\r\n pageIndex: number;\r\n pageSize: number;\r\n search?: string;\r\n fileType?: string;\r\n status?: string;\r\n userId?: string;\r\n tags?: string[];\r\n sortBy?: string;\r\n sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\nexport interface IFileListResponse {\r\n success: boolean;\r\n message: string;\r\n data: ICoreFileManager[];\r\n total: number;\r\n pageIndex: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface IFileDeleteResponse {\r\n success: boolean;\r\n message: string;\r\n data?: string;\r\n}\r\n\r\nexport interface IFileUpdateRequest {\r\n _id: string;\r\n cyfm_name?: string;\r\n cyfm_alt_text?: string;\r\n cyfm_tags?: string[];\r\n cyfm_permissions?: string[];\r\n cyfm_file_status_sygmt?: string;\r\n cyfm_isactive?: boolean;\r\n}\r\n\r\nexport interface IFileUpdateResponse {\r\n success: boolean;\r\n message: string;\r\n data?: ICoreFileManager;\r\n}\r\n\r\nexport interface IFileUploadProgress {\r\n fileId: string;\r\n fileName: string;\r\n progress: number;\r\n status: 'pending' | 'uploading' | 'completed' | 'error' | 'cancelled';\r\n error?: string;\r\n uploadedFile?: ICoreFileManager;\r\n}\r\n\r\nexport interface IFileUploadQueueItem extends IFileUploadProgress {\r\n file: File;\r\n}\r\n\r\nexport interface IFileFilterOptions {\r\n fileTypes: string[];\r\n statuses: string[];\r\n dateRange?: {\r\n start: Date;\r\n end: Date;\r\n };\r\n sizeRange?: {\r\n min: number;\r\n max: number;\r\n };\r\n tags: string[];\r\n}\r\n\r\nexport interface IFileGroupingOptions {\r\n groupBy: 'type' | 'status' | 'date' | 'size' | 'user' | 'none';\r\n sortBy: 'name' | 'size' | 'date' | 'type';\r\n sortOrder: 'asc' | 'desc';\r\n}\r\n","import { Injectable, signal, computed, inject, DestroyRef } from '@angular/core';\nimport { HttpClient, HttpErrorResponse, HttpEventType } from '@angular/common/http';\nimport { Observable, BehaviorSubject, throwError, retry, catchError, finalize } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CoreFileManagerInsertUpdatePayload, CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData, MFileManager } from '../interfaces/core-file-manager.interface';\n\n\n\nexport interface FileUploadOptions {\n altText?: string;\n userId?: string;\n permissions?: string[];\n tags?: string[];\n fileStatus?: string;\n retryAttempts?: number;\n timeout?: number;\n [key: string]: string | number | string[] | undefined; // Allow additional properties with proper typing\n}\n\nexport interface UploadProgress {\n loaded: number;\n total: number;\n percentage: number;\n stage: 'reading' | 'uploading' | 'complete' | 'error';\n}\n\nexport interface ServiceState {\n isUploading: boolean;\n uploadQueue: string[];\n activeUploads: Map<string, UploadProgress>;\n error: string | null;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideEleFileManagerService {\n // Angular 20: Modern dependency injection\n private readonly http = inject(HttpClient);\n private readonly destroyRef = inject(DestroyRef);\n \n // Angular 20: Signal-based state management\n private readonly _baseUrl = signal('/api');\n private readonly _isUploading = signal(false);\n private readonly _uploadQueue = signal<string[]>([]);\n private readonly _activeUploads = signal<Map<string, UploadProgress>>(new Map());\n private readonly _error = signal<string | null>(null);\n \n // Angular 20: Computed values\n readonly baseUrl = this._baseUrl.asReadonly();\n readonly isUploading = this._isUploading.asReadonly();\n readonly uploadQueue = this._uploadQueue.asReadonly();\n readonly activeUploads = this._activeUploads.asReadonly();\n readonly error = this._error.asReadonly();\n \n readonly hasActiveUploads = computed(() => this._activeUploads().size > 0);\n readonly queueLength = computed(() => this._uploadQueue().length);\n readonly serviceState = computed(() => ({\n isUploading: this._isUploading(),\n uploadQueue: this._uploadQueue(),\n activeUploads: this._activeUploads(),\n error: this._error()\n }));\n\n constructor() {\n console.log('🚀 [FileManagerService] Angular 20 service initialized');\n }\n\n /**\n * Upload a file with base64 encoding and progress tracking\n * Angular 20: Enhanced with better error handling, retry logic, and signal-based state\n * @param file The file to upload\n * @param options Upload options and additional data\n * @param progressCallback Optional callback for progress updates\n * @returns Observable with the upload response\n */\n uploadFile(file: File, options?: FileUploadOptions, progressCallback?: (progress: number) => void): Observable<CoreFileManagerInsertUpdateResponse> {\n const fileId = this.generateFileId(file);\n const uploadOptions = { retryAttempts: 3, timeout: 30000, ...options };\n \n // Angular 20: Update service state\n this._isUploading.set(true);\n this._error.set(null);\n this.addToUploadQueue(fileId);\n \n console.log('📤 [FileManagerService] Starting upload for:', file.name, 'Size:', file.size, 'bytes');\n \n return new Observable<CoreFileManagerInsertUpdateResponse>(observer => {\n const reader = new FileReader();\n \n // Angular 20: Enhanced progress tracking with signals\n reader.onprogress = (event) => {\n if (event.lengthComputable && progressCallback) {\n const progress = (event.loaded / event.total) * 50; // File reading is 50% of total progress\n progressCallback(progress);\n this.updateUploadProgress(fileId, {\n loaded: event.loaded,\n total: event.total,\n percentage: progress,\n stage: 'reading'\n });\n }\n };\n \n reader.onload = () => {\n try {\n const base64String = reader.result as string;\n const base64Data = base64String.split(',')[1]; // Remove data:image/jpeg;base64, prefix\n \n // Update progress to 50% (file reading complete)\n if (progressCallback) {\n progressCallback(50);\n }\n this.updateUploadProgress(fileId, {\n loaded: 50,\n total: 100,\n percentage: 50,\n stage: 'uploading'\n });\n \n // Create the file data object with proper typing\n const fileData = {\n cyfm_name: file.name,\n cyfm_alt_text: uploadOptions?.altText || file.name,\n cyfm_path: '', // Will be set by backend\n cyfm_size_in_byte: file.size,\n cyfm_type: file.type,\n cyfm_creation_dt: new Date().toISOString(),\n cyfm_id_user: uploadOptions?.userId || '',\n cyfm_permissions: [] as [], // Match the interface type\n cyfm_tags: uploadOptions?.tags || [],\n cyfm_version: 1,\n cyfm_file_status_sygmt: uploadOptions?.fileStatus || 'file_manager_file_status_active',\n cyfm_isactive: true,\n cyfm_file_base64: base64Data,\n cyfm_temp_unique_id: fileId\n };\n\n // Create the payload with proper typing\n const payload: CoreFileManagerInsertUpdatePayload = new CoreFileManagerInsertUpdatePayload({\n core_file_manager_new: [fileData],\n core_file_manager_update: [],\n core_file_manager_delete: []\n });\n\n // Angular 20: Enhanced HTTP request with retry logic and better error handling\n // Use proper API endpoint from cloud-ide-lms-model\n this.http.post<CoreFileManagerInsertUpdateResponse>(`${this._baseUrl()}/upload`, payload, {\n reportProgress: true,\n observe: 'events'\n }).pipe(\n retry(uploadOptions.retryAttempts || 3),\n catchError(this.handleError.bind(this)),\n finalize(() => {\n this.removeFromUploadQueue(fileId);\n this.removeActiveUpload(fileId);\n if (this._uploadQueue().length === 0) {\n this._isUploading.set(false);\n }\n }),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (event: any) => {\n if (event.type === HttpEventType.UploadProgress && progressCallback) {\n const uploadProgress = (event.loaded / event.total) * 50; // Upload is remaining 50%\n const totalProgress = 50 + uploadProgress; // Total progress (50% file reading + upload progress)\n progressCallback(totalProgress);\n this.updateUploadProgress(fileId, {\n loaded: event.loaded,\n total: event.total,\n percentage: totalProgress,\n stage: 'uploading'\n });\n } else if (event.type === HttpEventType.Response) {\n if (progressCallback) {\n progressCallback(100);\n }\n this.updateUploadProgress(fileId, {\n loaded: 100,\n total: 100,\n percentage: 100,\n stage: 'complete'\n });\n console.log('✅ [FileManagerService] Upload successful:', event.body);\n \n // Handle the CoreFileManagerInsertUpdateResponse\n const response = event.body as CoreFileManagerInsertUpdateResponse;\n if (response.success) {\n observer.next(response);\n observer.complete();\n } else {\n observer.error(new Error(response.message || 'Upload failed'));\n }\n }\n },\n error: (error) => {\n console.error('❌ [FileManagerService] Upload failed:', error);\n this._error.set(error.message || 'Upload failed');\n this.updateUploadProgress(fileId, {\n loaded: 0,\n total: 100,\n percentage: 0,\n stage: 'error'\n });\n observer.error(error);\n }\n });\n } catch (error) {\n console.error('❌ [FileManagerService] File processing error:', error);\n this._error.set('Failed to process file');\n observer.error(error);\n }\n };\n \n reader.onerror = () => {\n console.error('❌ [FileManagerService] File reading failed');\n this._error.set('Failed to read file');\n observer.error(new Error('Failed to read file'));\n };\n \n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Set the base URL for API calls\n * Angular 20: Using signal-based state management\n * @param url The base URL for the API\n */\n setBaseUrl(url: string): void {\n console.log('🔍 [FileManagerService] Setting base URL:', url);\n this._baseUrl.set(url);\n }\n\n /**\n * Angular 20: Helper methods for state management\n */\n private generateFileId(file: File): string {\n return `${file.name}_${file.size}_${Date.now()}`;\n }\n\n private addToUploadQueue(fileId: string): void {\n const currentQueue = this._uploadQueue();\n this._uploadQueue.set([...currentQueue, fileId]);\n }\n\n private removeFromUploadQueue(fileId: string): void {\n const currentQueue = this._uploadQueue();\n this._uploadQueue.set(currentQueue.filter(id => id !== fileId));\n }\n\n private updateUploadProgress(fileId: string, progress: UploadProgress): void {\n const currentUploads = new Map(this._activeUploads());\n currentUploads.set(fileId, progress);\n this._activeUploads.set(currentUploads);\n }\n\n private removeActiveUpload(fileId: string): void {\n const currentUploads = new Map(this._activeUploads());\n currentUploads.delete(fileId);\n this._activeUploads.set(currentUploads);\n }\n\n /**\n * Angular 20: Enhanced error handling\n */\n private handleError(error: HttpErrorResponse): Observable<never> {\n let errorMessage = 'An unknown error occurred';\n \n if (error.error instanceof ErrorEvent) {\n // Client-side error\n errorMessage = `Client Error: ${error.error.message}`;\n } else {\n // Server-side error\n errorMessage = `Server Error: ${error.status} - ${error.message}`;\n }\n \n console.error('❌ [FileManagerService] HTTP Error:', errorMessage);\n this._error.set(errorMessage);\n \n return throwError(() => new Error(errorMessage));\n }\n\n /**\n * Get file details by ID\n * @param payload The file ID to fetch details for\n * @returns Observable with file details\n */\n getFileDetails(payload: MFileManager): Observable<fileManagerControllerResponse> {\n console.log('🔍 [FileManagerService] Fetching file details for ID:', payload.cyfm_id);\n \n return this.http.post<fileManagerControllerResponse>(`${this._baseUrl()}`, payload).pipe(\n retry(2),\n catchError(this.handleError.bind(this)),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n /**\n * Angular 20: Service utility methods\n */\n clearError(): void {\n this._error.set(null);\n }\n\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this._activeUploads().get(fileId);\n }\n\n cancelUpload(fileId: string): void {\n this.removeFromUploadQueue(fileId);\n this.removeActiveUpload(fileId);\n console.log('🚫 [FileManagerService] Upload cancelled for:', fileId);\n }\n\n /**\n * Angular 20: File validation utility\n */\n validateFile(file: File, maxSizeMB: number = 10, allowedTypes: string[] = []): { valid: boolean; error?: string } {\n // Check file size\n const maxSizeBytes = maxSizeMB * 1024 * 1024; // Convert MB to bytes\n if (file.size > maxSizeBytes) {\n return { valid: false, error: `File size exceeds ${maxSizeMB}MB limit` };\n }\n\n // Check file type\n if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\n return { valid: false, error: `File type ${file.type} is not allowed` };\n }\n\n return { valid: true };\n }\n}\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 progress?: number; // Progress percentage (0-100)\r\n showProgress?: boolean; // Whether to show progress bar\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 progress?: number; // Progress percentage (0-100)\r\n showProgress?: boolean; // Whether to show progress bar\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 * Show a progress notification\r\n */\r\n showProgress(\r\n message: string,\r\n progress: number = 0,\r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.show({\r\n message,\r\n type: 'info',\r\n icon: 'upload',\r\n duration: 0, // Don't auto-dismiss\r\n progress,\r\n showProgress: true,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Update progress for an existing notification\r\n */\r\n updateProgress(id: string, progress: number, message?: string): void {\r\n this.notifications.update(notifications => \r\n notifications.map(n => \r\n n.id === id ? { \r\n ...n, \r\n progress: Math.max(0, Math.min(100, progress)),\r\n ...(message && { message })\r\n } : n\r\n )\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 progress: options.progress,\r\n showProgress: options.showProgress || false\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 { CommonModule } from '@angular/common';\nimport { \n Component, \n EventEmitter, \n Input, \n Output, \n OnDestroy, \n OnInit,\n inject, \n signal, \n computed, \n effect, \n DestroyRef, \n afterRenderEffect,\n afterNextRender,\n PendingTasks\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule, Validator, NG_VALIDATORS, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CideIconComponent } from '../icon/icon.component';\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData } from '../../interfaces/core-file-manager.interface';\n\n/**\n * Angular 20: Proper TypeScript interface for file upload data\n * This interface defines the structure of additional data that can be sent with file uploads\n */\nexport interface FileUploadData {\n /** Alternative text for the uploaded file (useful for accessibility) */\n altText?: string;\n /** User ID associated with the upload */\n userId?: string;\n /** Array of permissions for the uploaded file */\n permissions?: string[];\n /** Array of tags to categorize the uploaded file */\n tags?: string[];\n /** Status of the file (e.g., 'active', 'pending', 'archived') */\n fileStatus?: \"file_manager_file_status_active\";\n /** Allow additional properties with proper typing */\n [key: string]: string | number | string[] | undefined;\n}\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, CideIconComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: CideEleFileInputComponent,\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: CideEleFileInputComponent,\n multi: true\n }\n ]\n})\nexport class CideEleFileInputComponent implements ControlValueAccessor, OnDestroy, OnInit, Validator {\n private readonly fileManagerService = inject(CideEleFileManagerService);\n private readonly notificationService = inject(NotificationService);\n private readonly elementService = inject(CideElementsService);\n private readonly destroyRef = inject(DestroyRef);\n // private readonly pendingTasks = inject(PendingTasks); // TODO: Fix PendingTasks API usage\n \n // Traditional @Input() decorators\n @Input() label: string = 'Choose file';\n @Input() accept: string = '';\n @Input() multiple: boolean = false;\n @Input() disabled: boolean = false;\n @Input() required: 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() showFileName: boolean = true;\n @Input() placeholderText: string = 'Click to select image';\n @Input() placeholderIcon: string = '📷';\n @Input() autoUpload: boolean = false;\n @Input() uploadData: FileUploadData = {};\n\n // Traditional @Output() decorators\n @Output() fileChange = new EventEmitter<FileList | null>();\n @Output() uploadSuccess = new EventEmitter<string>();\n @Output() uploadError = new EventEmitter<string>();\n @Output() uploadProgressChange = new EventEmitter<number>();\n\n // Readable signals created from @Input() decorator values\n readonly labelSignal = signal(this.label);\n readonly acceptSignal = signal(this.accept);\n readonly multipleSignal = signal(this.multiple);\n readonly disabledSignal = signal(this.disabled);\n readonly requiredSignal = signal(this.required);\n readonly helperTextSignal = signal(this.helperText);\n readonly errorTextSignal = signal(this.errorText);\n readonly showPreviewSignal = signal(this.showPreview);\n readonly previewWidthSignal = signal(this.previewWidth);\n readonly previewHeightSignal = signal(this.previewHeight);\n readonly previewBoxModeSignal = signal(this.previewBoxMode);\n readonly showFileNameSignal = signal(this.showFileName);\n readonly placeholderTextSignal = signal(this.placeholderText);\n readonly placeholderIconSignal = signal(this.placeholderIcon);\n readonly autoUploadSignal = signal(this.autoUpload);\n readonly uploadDataSignal = signal(this.uploadData);\n\n // Reactive state with signals\n readonly id = signal(Math.random().toString(36).substring(2, 10));\n readonly isUploading = signal(false);\n readonly uploadProgress = signal(0);\n readonly uploadStatus = signal<'idle' | 'start' | 'uploading' | 'success' | 'error'>('idle');\n readonly files = signal<FileList | null>(null);\n readonly fileNames = signal<string[]>([]);\n readonly previewUrls = signal<string[]>([]);\n readonly uploadNotificationId = signal<string | null>(null);\n readonly isDragOver = signal(false);\n \n // Computed signals for better relationships\n readonly hasFiles = computed(() => this.files() !== null && this.files()!.length > 0);\n readonly canUpload = computed(() => this.hasFiles() && !this.isUploading() && !this.disabledSignal());\n readonly isInErrorState = computed(() => this.uploadStatus() === 'error');\n readonly isInSuccessState = computed(() => this.uploadStatus() === 'success');\n \n // Angular 20: Computed values using new features\n readonly totalFileSize = computed(() => {\n if (!this.files()) return 0;\n return Array.from(this.files()!).reduce((total, file) => total + file.size, 0);\n });\n \n readonly fileSizeInMB = computed(() => {\n // Angular 20: Using ** operator for exponentiation\n return (this.totalFileSize() / (1024 ** 2)).toFixed(2);\n });\n \n readonly uploadProgressPercentage = computed(() => {\n // Angular 20: Using ** operator for exponentiation\n return Math.round(this.uploadProgress() ** 1); // Simple power operation\n });\n\n // ControlValueAccessor callbacks\n private onChange = (value: FileList | string | null) => {};\n private onTouched = () => {};\n private onValidatorChange = () => {};\n\n // Computed values\n readonly hasImages = computed(() => this.previewUrls().length > 0);\n readonly isPreviewBoxMode = computed(() => this.previewBoxModeSignal() && this.showPreviewSignal());\n readonly isImagePreviewAvailable = computed(() => this.showPreviewSignal() && this.previewUrls().length > 0);\n\n constructor() {\n // Angular 20: afterRenderEffect for DOM operations\n afterRenderEffect(() => {\n // Update file input element when files change\n if (this.files()) {\n const fileInput = document.getElementById('cide-file-input-' + this.id()) as HTMLInputElement;\n if (fileInput) {\n // Ensure the input reflects the current state\n fileInput.files = this.files();\n }\n }\n });\n\n // Angular 20: afterNextRender for one-time DOM operations\n afterNextRender(() => {\n console.log('🎯 [FileInput] Component rendered and DOM is ready');\n });\n }\n\n ngOnInit() {\n // Update signals with initial @Input() values\n this.labelSignal.set(this.label);\n this.acceptSignal.set(this.accept);\n this.multipleSignal.set(this.multiple);\n this.disabledSignal.set(this.disabled);\n this.requiredSignal.set(this.required);\n this.helperTextSignal.set(this.helperText);\n this.errorTextSignal.set(this.errorText);\n this.showPreviewSignal.set(this.showPreview);\n this.previewWidthSignal.set(this.previewWidth);\n this.previewHeightSignal.set(this.previewHeight);\n this.previewBoxModeSignal.set(this.previewBoxMode);\n this.showFileNameSignal.set(this.showFileName);\n this.placeholderTextSignal.set(this.placeholderText);\n this.placeholderIconSignal.set(this.placeholderIcon);\n this.autoUploadSignal.set(this.autoUpload);\n this.uploadDataSignal.set(this.uploadData);\n }\n\n writeValue(value: FileList | string | null): void {\n console.log('📝 [FileInput] writeValue called with:', value);\n \n if (typeof value === 'string') {\n // Value is an uploaded file ID - fetch file details and set preview\n console.log('📝 [FileInput] Value is uploaded file ID:', value);\n this.files.set(null);\n this.fileNames.set([]);\n this.clearPreviews();\n \n // Fetch file details to get base64 and set preview\n this.loadFileDetailsFromId(value);\n } else if (value instanceof FileList) {\n // Value is a FileList\n console.log('📝 [FileInput] Value is FileList:', Array.from(value).map(f => f.name));\n this.files.set(value);\n this.fileNames.set(Array.from(value).map(f => f.name));\n this.generatePreviews();\n } else {\n // Value is null\n console.log('📝 [FileInput] Value is null');\n this.files.set(null);\n this.fileNames.set([]);\n this.clearPreviews();\n }\n }\n\n registerOnChange(fn: (value: FileList | string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.onValidatorChange = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n // Note: With input signals, disabled state is controlled by the parent component\n // This method is kept for ControlValueAccessor compatibility but doesn't modify the signal\n console.log('🔧 [FileInput] setDisabledState called with:', isDisabled, '(controlled by parent component)');\n }\n\n onFileSelected(event: Event) {\n console.log('🔍 [FileInput] onFileSelected called');\n const input = event.target as HTMLInputElement;\n const selectedFiles = input.files;\n \n this.files.set(selectedFiles);\n this.fileNames.set(selectedFiles ? Array.from(selectedFiles).map(f => f.name) : []);\n console.log('📁 [FileInput] Files selected:', this.fileNames());\n this.generatePreviews();\n \n // Reset upload status when new file is selected\n this.uploadStatus.set('idle');\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n \n this.onChange(selectedFiles);\n this.fileChange.emit(selectedFiles);\n this.onTouched();\n\n // Auto upload if enabled\n if (this.autoUploadSignal() && selectedFiles && selectedFiles.length > 0) {\n console.log('🚀 [FileInput] Auto upload enabled, starting upload for:', selectedFiles[0].name);\n this.uploadFile(selectedFiles[0]);\n } else {\n console.log('⏸️ [FileInput] Auto upload disabled or no files');\n }\n }\n\n clearFiles() {\n console.log('🗑️ [FileInput] clearFiles called');\n this.files.set(null);\n this.fileNames.set([]);\n this.clearPreviews();\n this.uploadStatus.set('idle');\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n this.onChange(null);\n this.fileChange.emit(null);\n }\n\n private uploadFile(file: File) {\n console.log('📤 [FileInput] uploadFile called for:', file.name, 'Size:', file.size, 'bytes');\n \n // Angular 20: Use PendingTasks for better loading state management\n // const uploadTask = this.pendingTasks.add(); // TODO: Fix PendingTasks API usage\n // console.log('⏳ [FileInput] Pending task added for upload tracking');\n \n // Set upload status to 'start' before starting upload\n this.uploadStatus.set('start');\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n \n this.isUploading.set(true);\n this.uploadProgress.set(0);\n this.uploadProgressChange.emit(0);\n console.log('📊 [FileInput] Upload progress initialized to 0%');\n \n // Make form control invalid during upload - this prevents form submission\n this.onChange(null);\n console.log('🚫 [FileInput] Form control value set to null to prevent submission');\n \n // Show initial progress notification with spinner (persistent - no auto-dismiss)\n const notificationId = this.notificationService.showProgress('🔄 Preparing file upload...', 0, { duration: 0 });\n this.uploadNotificationId.set(notificationId);\n console.log('🔔 [FileInput] Progress notification started with ID:', notificationId);\n\n this.fileManagerService.uploadFile(file, this.uploadDataSignal(), (progress: number) => {\n // Real progress callback from file manager service\n this.uploadProgress.set(progress);\n this.uploadProgressChange.emit(progress);\n console.log('📈 [FileInput] Upload progress:', Math.round(progress) + '%');\n \n // Set upload status to 'uploading' when progress starts\n if (this.uploadStatus() === 'start') {\n this.uploadStatus.set('uploading');\n console.log('🔄 [FileInput] Upload status changed to:', this.uploadStatus());\n }\n \n // Update progress notification with spinner\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n let progressMessage = '';\n if (progress < 10) {\n progressMessage = '🔄 Starting upload...';\n } else if (progress < 25) {\n progressMessage = '🔄 Uploading file...';\n } else if (progress < 50) {\n progressMessage = '🔄 Upload in progress...';\n } else if (progress < 75) {\n progressMessage = '🔄 Almost done...';\n } else if (progress < 95) {\n progressMessage = '🔄 Finishing upload...';\n } else {\n progressMessage = '🔄 Finalizing...';\n }\n \n this.notificationService.updateProgress(\n notificationId,\n progress,\n progressMessage\n );\n }\n }).pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (response: CoreFileManagerInsertUpdateResponse) => {\n console.log('🎉 [FileInput] Upload SUCCESS - Response received:', response);\n \n // Angular 20: Complete the pending task\n // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\n // console.log('✅ [FileInput] Pending task completed for successful upload');\n \n // Set upload status to 'success'\n this.uploadStatus.set('success');\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n \n // Complete the progress\n this.uploadProgress.set(100);\n this.uploadProgressChange.emit(100);\n console.log('📊 [FileInput] Upload progress completed: 100%');\n \n // Update progress notification to complete\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n console.log('🔔 [FileInput] Progress notification removed');\n }\n this.notificationService.success('✅ File uploaded successfully!', { duration: 0 });\n this.uploadNotificationId.set(null);\n \n // Extract ID from CoreFileManagerInsertUpdateResponse\n const uploadedId = response?.data?.core_file_manager?.[0]?.cyfm_id;\n if (uploadedId) {\n console.log('✅ [FileInput] File uploaded successfully with ID:', uploadedId);\n \n // Set the uploaded ID as the form control value\n this.onChange(uploadedId);\n console.log('📝 [FileInput] Form control value set to uploaded ID:', uploadedId);\n \n this.uploadSuccess.emit(uploadedId);\n console.log('📝 [FileInput] Upload success event emitted with file ID:', uploadedId);\n } else {\n console.error('❌ [FileInput] Upload successful but no ID returned:', response);\n this.uploadError.emit('Upload successful but no ID returned');\n }\n this.isUploading.set(false);\n console.log('🔄 [FileInput] isUploading set to false');\n },\n error: (error) => {\n console.error('💥 [FileInput] Upload FAILED:', error);\n \n // Angular 20: Complete the pending task even on error\n // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\n // console.log('❌ [FileInput] Pending task completed for failed upload');\n \n // Set upload status to 'error' and remove upload validation error\n this.uploadStatus.set('error');\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n \n // Remove progress notification and show error\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n console.log('🔔 [FileInput] Progress notification removed due to error');\n }\n this.notificationService.error(`❌ File upload failed: ${error.message || error.error?.message || 'Unknown error occurred'}`, { duration: 0 });\n this.uploadNotificationId.set(null);\n \n this.uploadError.emit(error.message || error.error?.message || 'Upload failed');\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadProgressChange.emit(0);\n console.log('🔄 [FileInput] Upload state reset - isUploading: false, progress: 0%');\n }\n });\n }\n\n\n private generatePreviews() {\n // Clear existing previews\n this.clearPreviews();\n\n if (!this.showPreviewSignal() || !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.update(urls => [...urls, 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.set([]);\n }\n\n private isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n }\n\n private loadFileDetailsFromId(fileId: string): void {\n console.log('🔍 [FileInput] Loading file details for ID:', fileId);\n if(!fileId) return;\n this.fileManagerService?.getFileDetails({ cyfm_id: fileId })?.pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (fileDetails: fileManagerControllerResponse) => {\n console.log('📋 [FileInput] File details received:', fileDetails);\n \n if (fileDetails?.data?.length) {\n const fileData = fileDetails.data[0];\n console.log('📁 [FileInput] File data:', fileData);\n \n // Set file name from the details\n if (fileData.cyfm_name) {\n this.fileNames.set([fileData.cyfm_name]);\n console.log('📝 [FileInput] File name set:', fileData.cyfm_name);\n }\n \n // If it's an image and we have base64 data, set preview\n if (this.showPreviewSignal() && fileData.cyfm_file_base64) {\n // Check if it's an image file based on file name or type\n const isImage = this.isImageFileFromName(fileData.cyfm_name || '') || \n this.isImageFileFromType(fileData.cyfm_type || '');\n \n if (isImage) {\n // Add data URL prefix if not already present\n let base64Data = fileData.cyfm_file_base64;\n if (!base64Data.startsWith('data:')) {\n const mimeType = fileData.cyfm_type || 'image/jpeg';\n base64Data = `data:${mimeType};base64,${base64Data}`;\n }\n \n this.previewUrls.set([base64Data]);\n console.log('🖼️ [FileInput] Preview set from base64 data');\n }\n }\n } else {\n console.warn('⚠️ [FileInput] No file data found for ID:', fileId);\n }\n },\n error: (error: any) => {\n console.error('❌ [FileInput] Error loading file details:', error);\n this.notificationService.error(`Failed to load file details: ${error.message || 'Unknown error'}`, { duration: 0 });\n }\n });\n }\n\n private isImageFileFromName(fileName: string): boolean {\n if (!fileName) return false;\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg'];\n const lowerFileName = fileName.toLowerCase();\n return imageExtensions.some(ext => lowerFileName.endsWith(ext));\n }\n\n private isImageFileFromType(fileType: string): boolean {\n if (!fileType) return false;\n return fileType.startsWith('image/');\n }\n\n removePreview(index: number) {\n const currentFiles = this.files();\n const currentUrls = this.previewUrls();\n \n if (currentFiles && currentFiles.length > index) {\n // Handle FileList case - remove file from FileList\n const dt = new DataTransfer();\n Array.from(currentFiles).forEach((file, i) => {\n if (i !== index) {\n dt.items.add(file);\n }\n });\n \n const newFiles = dt.files;\n this.files.set(newFiles);\n this.fileNames.set(Array.from(newFiles).map(f => f.name));\n \n // Remove the preview URL\n if (currentUrls[index] && currentUrls[index].startsWith('blob:')) {\n URL.revokeObjectURL(currentUrls[index]);\n }\n this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\n \n this.onChange(newFiles);\n this.fileChange.emit(newFiles);\n } else if (currentUrls.length > index) {\n // Handle uploaded file ID case - clear the preview and set control value to null\n console.log('🗑️ [FileInput] Removing preview for uploaded file ID');\n \n // Clear preview\n this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\n this.fileNames.set([]);\n \n // Set control value to null since we're removing the uploaded file\n this.onChange(null);\n this.fileChange.emit(null);\n }\n }\n\n ngOnDestroy() {\n // Clean up preview URLs to prevent memory leaks\n this.clearPreviews();\n \n // Clean up any active upload notification\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n this.uploadNotificationId.set(null);\n }\n }\n\n triggerFileSelect() {\n const fileInput = document.getElementById('cide-file-input-' + this.id()) as HTMLInputElement;\n if (fileInput && !this.disabledSignal()) {\n fileInput.click();\n }\n }\n\n // Drag and Drop Event Handlers\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (!this.disabledSignal()) {\n this.isDragOver.set(true);\n console.log('🔄 [FileInput] Drag over detected');\n }\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n console.log('🔄 [FileInput] Drag leave detected');\n }\n\n onDragEnter(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (!this.disabledSignal()) {\n this.isDragOver.set(true);\n console.log('🔄 [FileInput] Drag enter detected');\n }\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n \n if (this.disabledSignal()) {\n console.log('⏸️ [FileInput] Drop ignored - component is disabled');\n return;\n }\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n console.log('📁 [FileInput] Files dropped:', Array.from(files).map(f => f.name));\n \n // Validate file types if accept is specified\n if (this.acceptSignal() && !this.validateFileTypes(files)) {\n console.log('❌ [FileInput] Invalid file types dropped');\n this.notificationService.error('❌ Invalid file type. Please select files of the correct type.', { duration: 0 });\n return;\n }\n\n // Handle single vs multiple files\n if (!this.multipleSignal() && files.length > 1) {\n console.log('⚠️ [FileInput] Multiple files dropped but multiple is disabled');\n this.notificationService.warning('⚠️ Only one file is allowed. Using the first file.', { duration: 0 });\n // Create a new FileList with only the first file\n const dt = new DataTransfer();\n dt.items.add(files[0]);\n this.handleFileSelection(dt.files);\n } else {\n this.handleFileSelection(files);\n }\n }\n }\n\n private validateFileTypes(files: FileList): boolean {\n const acceptTypes = this.acceptSignal().split(',').map(type => type.trim());\n if (acceptTypes.length === 0 || acceptTypes[0] === '') return true;\n\n return Array.from(files).every(file => {\n return acceptTypes.some(acceptType => {\n if (acceptType.startsWith('.')) {\n // Extension-based validation\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase());\n } else if (acceptType.includes('/')) {\n // MIME type validation\n return file.type === acceptType || file.type.startsWith(acceptType.replace('*', ''));\n }\n return false;\n });\n });\n }\n\n private handleFileSelection(files: FileList) {\n this.files.set(files);\n this.fileNames.set(Array.from(files).map(f => f.name));\n console.log('📁 [FileInput] Files selected via drag & drop:', this.fileNames());\n this.generatePreviews();\n \n // Reset upload status when new file is selected\n this.uploadStatus.set('idle');\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n \n this.onChange(files);\n this.fileChange.emit(files);\n this.onTouched();\n\n // Auto upload if enabled\n if (this.autoUploadSignal() && files.length > 0) {\n console.log('🚀 [FileInput] Auto upload enabled, starting upload for:', files[0].name);\n this.uploadFile(files[0]);\n } else {\n console.log('⏸️ [FileInput] Auto upload disabled or no files');\n }\n }\n\n isRequired(): boolean {\n return this.requiredSignal();\n }\n\n /**\n * Angular 20: Utility method to get upload data with proper typing\n * @returns Properly typed upload data\n */\n getUploadData(): FileUploadData {\n return this.uploadDataSignal();\n }\n\n /**\n * Angular 20: Utility method to update upload data with type safety\n * @param data Partial upload data to merge with existing data\n */\n updateUploadData(data: Partial<FileUploadData>): void {\n const currentData = this.uploadDataSignal();\n const updatedData: FileUploadData = { ...currentData, ...data };\n // Note: This would require the uploadData to be a writable signal\n // For now, this method serves as a type-safe way to work with upload data\n console.log('📝 [FileInput] Upload data updated:', updatedData);\n }\n\n getCurrentState() {\n return {\n id: this.id(),\n label: this.labelSignal(),\n required: this.requiredSignal(),\n disabled: this.disabledSignal(),\n accept: this.acceptSignal(),\n multiple: this.multipleSignal(),\n showPreview: this.showPreviewSignal(),\n autoUpload: this.autoUploadSignal(),\n uploadStatus: this.uploadStatus(),\n isUploading: this.isUploading(),\n uploadProgress: this.uploadProgress(),\n files: this.files() ? Array.from(this.files()!).map(f => ({ name: f.name, size: f.size, type: f.type })) : null,\n fileNames: this.fileNames(),\n previewUrls: this.previewUrls().length,\n helperText: this.helperTextSignal(),\n errorText: this.errorTextSignal(),\n placeholderText: this.placeholderTextSignal(),\n placeholderIcon: this.placeholderIconSignal(),\n previewWidth: this.previewWidthSignal(),\n previewHeight: this.previewHeightSignal(),\n previewBoxMode: this.previewBoxModeSignal(),\n showFileName: this.showFileNameSignal(),\n uploadData: this.uploadDataSignal()\n };\n }\n\n async getControlData() {\n console.log('🔍 [FileInput] getControlData called');\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id() });\n if (cide_element_data) {\n console.log('📋 [FileInput] Element data loaded:', cide_element_data);\n \n // Note: Since we're using input signals, we can't directly set their values\n // This method would need to be refactored to work with the new signal-based approach\n // For now, we'll log the data and trigger validation\n console.log('✅ [FileInput] Control data received from element service');\n console.log('⚠️ [FileInput] Note: Input signals cannot be modified after component initialization');\n \n // Trigger validation update\n this.onValidatorChange();\n } else {\n console.log('⚠️ [FileInput] No element data found for key:', this.id());\n }\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n console.log('🔍 [FileInput] validate() called - uploadStatus:', this.uploadStatus(), 'required:', this.requiredSignal(), 'files:', !!this.files(), 'control.value:', control.value);\n \n // If upload is in progress (start or uploading status), return validation error\n if (this.uploadStatus() === 'start' || this.uploadStatus() === 'uploading') {\n console.log('⚠️ [FileInput] Validation ERROR: Upload in progress');\n return { 'uploadInProgress': { message: 'File upload in progress. Please wait...' } };\n }\n \n // If required and no file is selected and no control value (uploaded file ID), return validation error\n if (this.requiredSignal() && !this.files() && !control.value) {\n console.log('⚠️ [FileInput] Validation ERROR: File required');\n return { 'required': { message: 'Please select a file to upload.' } };\n }\n \n console.log('✅ [FileInput] Validation PASSED: No errors');\n return null; // No validation errors\n }\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 @if (labelSignal() && !isPreviewBoxMode()) {\n <label class=\"cide-file-input-label\" [attr.for]=\"'cide-file-input-' + id()\">\n {{ labelSignal() }}@if (requiredSignal()) {<span class=\"cide-file-input-required\"> *</span>}\n </label>\n }\n \n <!-- Preview Box Mode -->\n @if (isPreviewBoxMode()) {\n <div 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]=\"acceptSignal()\"\n [attr.multiple]=\"multipleSignal() ? true : null\"\n [disabled]=\"disabledSignal()\"\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]=\"disabledSignal()\"\n [class.cide-file-input-preview-box-has-image]=\"hasImages()\"\n [class.cide-file-input-preview-box-drag-over]=\"isDragOver()\"\n [style.width]=\"previewWidthSignal()\"\n [style.height]=\"previewHeightSignal()\"\n (click)=\"triggerFileSelect()\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n [attr.title]=\"disabledSignal() ? 'File selection disabled' : placeholderTextSignal()\">\n \n <!-- No Image State -->\n @if (!hasImages()) {\n <div class=\"cide-file-input-preview-box-placeholder\">\n <div class=\"cide-file-input-preview-box-icon\">\n <cide-ele-icon>{{ isDragOver() ? '📁' : placeholderIconSignal() }}</cide-ele-icon>\n </div>\n <div class=\"cide-file-input-preview-box-text\">\n {{ isDragOver() ? 'Drop files here...' : placeholderTextSignal() }}\n </div>\n </div>\n }\n \n <!-- Image Preview State -->\n @if (hasImages()) {\n <div 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 @if (!disabledSignal()) {\n <button \n type=\"button\" \n class=\"cide-file-input-preview-box-remove\"\n (click)=\"clearFiles(); $event.stopPropagation()\"\n title=\"Remove image\">\n ×\n </button>\n }\n </div>\n }\n </div>\n \n <!-- File name display for preview box mode -->\n @if (hasImages() && fileNames().length && showFileNameSignal()) {\n <div class=\"cide-file-input-preview-box-filename\">\n {{ fileNames()[0] }}\n </div>\n }\n </div>\n }\n\n <!-- Standard Mode -->\n @if (!isPreviewBoxMode()) {\n <div \n class=\"cide-file-input-wrapper\"\n [class.cide-file-input-drag-over]=\"isDragOver()\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n type=\"file\"\n [attr.id]=\"'cide-file-input-' + id()\"\n [attr.accept]=\"acceptSignal()\"\n [attr.multiple]=\"multipleSignal() ? true : null\"\n [disabled]=\"disabledSignal()\"\n (change)=\"onFileSelected($event)\"\n class=\"cide-file-input-element\"\n />\n @if (hasFiles()) {\n <button type=\"button\" class=\"cide-file-input-clear\" (click)=\"clearFiles()\">\n Clear\n </button>\n }\n </div>\n @if (hasFiles() && !isPreviewBoxMode()) {\n <div class=\"cide-file-input-files\">\n @for (name of fileNames(); track name) {\n <span>{{ name }}</span>\n }\n <!-- Angular 20: Display file size using new computed values -->\n @if (totalFileSize() > 0) {\n <div class=\"cide-file-input-size\">\n Total size: {{ fileSizeInMB() }} MB\n </div>\n }\n </div>\n }\n }\n \n <!-- Image Preview Section (only for standard mode) -->\n @if (isImagePreviewAvailable() && !isPreviewBoxMode()) {\n <div class=\"cide-file-input-preview\">\n <div class=\"cide-file-input-preview-label\">Preview:</div>\n <div class=\"cide-file-input-preview-container\">\n @for (previewUrl of previewUrls(); track previewUrl; let i = $index) {\n <div \n class=\"cide-file-input-preview-item\"\n [style.width]=\"previewWidthSignal()\"\n [style.height]=\"previewHeightSignal()\">\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 }\n </div>\n </div>\n }\n \n @if (errorTextSignal()) {\n <div class=\"cide-file-input-error\">{{ errorTextSignal() }}</div>\n }\n @if (helperTextSignal() && !errorTextSignal()) {\n <div class=\"cide-file-input-helper\">{{ helperTextSignal() }}</div>\n }\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 { Directive, ElementRef, Input, OnInit, OnDestroy, inject } from '@angular/core';\r\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\n/**\r\n * Directive to display images from file manager by ID\r\n * Usage: <img cideEleFileImage [fileId]=\"yourFileId\" [altText]=\"'Image'\" class=\"your-css-classes\" />\r\n */\r\n@Directive({\r\n selector: '[cideEleFileImage]',\r\n standalone: true\r\n})\r\nexport class CideEleFileImageDirective implements OnInit, OnDestroy {\r\n @Input() fileId: string | null = null;\r\n @Input() altText: string = 'Image';\r\n\r\n private readonly fileManagerService = inject(CideEleFileManagerService);\r\n private readonly elementRef = inject(ElementRef);\r\n\r\n ngOnInit(): void {\r\n this.loadImage();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup handled by takeUntilDestroyed\r\n }\r\n\r\n private loadImage(): void {\r\n if (!this.fileId) {\r\n return;\r\n }\r\n\r\n console.log('🖼️ [FileImageDirective] Loading image for ID:', this.fileId);\r\n\r\n this.fileManagerService.getFileDetails({ cyfm_id: this.fileId }).pipe(\r\n takeUntilDestroyed()\r\n ).subscribe({\r\n next: (fileDetails: any) => {\r\n console.log('📋 [FileImageDirective] File details received:', fileDetails);\r\n \r\n if (fileDetails?.data?.length) {\r\n const fileData = fileDetails.data[0];\r\n this.displayImage(fileData);\r\n } else {\r\n console.warn('⚠️ [FileImageDirective] No file data found for ID:', this.fileId);\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FileImageDirective] Error loading file details:', error);\r\n }\r\n });\r\n }\r\n\r\n private displayImage(fileData: any): void {\r\n const imgElement = this.elementRef.nativeElement as HTMLImageElement;\r\n \r\n // Check if it's an image file\r\n const isImage = this.isImageFile(fileData.cyfm_name || '', fileData.cyfm_type || '');\r\n \r\n if (isImage) {\r\n // For now, we'll use a placeholder or the file path\r\n // In a real implementation, you might need to fetch the actual file content\r\n if (fileData.cyfm_path) {\r\n // If you have a direct URL to the file, use it\r\n imgElement.src = fileData.cyfm_path;\r\n imgElement.alt = fileData.cyfm_alt_text || this.altText;\r\n console.log('✅ [FileImageDirective] Image loaded from path:', fileData.cyfm_path);\r\n } else if (fileData.cyfm_file_base64) {\r\n // If base64 data is available, use it\r\n let base64Data = fileData.cyfm_file_base64;\r\n if (!base64Data.startsWith('data:')) {\r\n const mimeType = fileData.cyfm_type || 'image/jpeg';\r\n base64Data = `data:${mimeType};base64,${base64Data}`;\r\n }\r\n imgElement.src = base64Data;\r\n imgElement.alt = fileData.cyfm_alt_text || this.altText;\r\n console.log('✅ [FileImageDirective] Image loaded from base64 data');\r\n } else {\r\n console.warn('⚠️ [FileImageDirective] No image data available for file:', fileData.cyfm_name);\r\n }\r\n } else {\r\n console.warn('⚠️ [FileImageDirective] File is not an image:', fileData.cyfm_name);\r\n }\r\n }\r\n\r\n private isImageFile(fileName: string, fileType: string): boolean {\r\n if (fileType && fileType.startsWith('image/')) {\r\n return true;\r\n }\r\n \r\n if (fileName) {\r\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg'];\r\n const lowerFileName = fileName.toLowerCase();\r\n return imageExtensions.some(ext => lowerFileName.endsWith(ext));\r\n }\r\n \r\n return false;\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, NgTemplateOutlet } 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 NgTemplateOutlet,\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 | string[]) {\n // Handle array case (shouldn't happen for page size, but just in case)\n const pageSizeValue = Array.isArray(value) ? value[0] : value;\n this.pageSize.set(+pageSizeValue);\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 // If search is cleared (empty), trigger search immediately without debounce\n if (!searchValue || searchValue.trim() === '') {\n console.log('Search cleared, triggering immediate search event');\n this.currentPage.set(1);\n if (this.serverSidePagination) {\n this.emitEvent('search', searchValue);\n } else {\n this.onSearch();\n }\n return;\n }\n \n // Apply debounce for non-empty search queries\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 // If pagination is disabled, return all data\n if (!this.mergedConfig().pagination?.enabled) {\n return data;\n }\n // If pagination is enabled, slice the data\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 type=\"button\"\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 type=\"button\"\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 [ngTemplateOutletContext]=\"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 [ngTemplateOutletContext]=\"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 minWidth?: 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() && !getSafeConfig().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-context=\"context\">\n <!-- Custom Menu Template -->\n @if (menuTemplate) {\n <ng-container *ngTemplateOutlet=\"menuTemplate; context: { $implicit: context?.items }\">\n </ng-container>\n } @else {\n <!-- Default Menu -->\n <div class=\"tw-py-1\" role=\"none\">\n @for (item of context?.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 protected getSafeConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n menuWidth: 'tw-w-44',\n menuPosition: 'auto',\n showArrow: false,\n offsetX: 0,\n offsetY: 4,\n usePortal: true, // Default to portal mode\n ...this.config // Override with provided config\n };\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, current state:', this.isOpen());\n console.log('🔵 Items:', this.items);\n console.log('🔵 Config:', this.getSafeConfig());\n event.stopPropagation();\n\n if (!this.isOpen()) {\n this.openDropdown();\n } else {\n setTimeout(() => {\n this.closeDropdown();\n }, 100);\n }\n }\n\n private openDropdown(): void {\n console.log('🔵 openDropdown called');\n console.log('🔵 Items:', this.items);\n console.log('🔵 Config:', this.getSafeConfig());\n console.log('🔵 Template available:', !!this.dropdownMenuTemplate());\n \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.getSafeConfig().usePortal && this.dropdownMenuTemplate()) {\n console.log('🔵 Creating portal dropdown...');\n this.createPortalDropdown();\n } else {\n console.log('🔵 Not creating portal - usePortal:', this.getSafeConfig().usePortal, 'template:', !!this.dropdownMenuTemplate());\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 }, 50);\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 console.log('🔵 Creating portal dropdown with items:', this.items);\n console.log('🔵 Trigger element:', triggerElement);\n console.log('🔵 Template:', template);\n console.log('🔵 Config:', this.config);\n\n try {\n const safeConfig = this.getSafeConfig();\n const portalElement = this.portalService.createTemplatePortal(this.portalId, {\n triggerElement,\n template,\n viewContainerRef: this.viewContainerRef,\n context: { items: 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: safeConfig.offsetX || 0,\n offsetY: safeConfig.offsetY || 4,\n minWidth: safeConfig.minWidth || this.getMenuWidth(),\n maxHeight: 300,\n closeOnClickOutside: true,\n closeOnEscape: true\n });\n\n console.log('🔵 Portal dropdown created:', this.portalId);\n console.log('🔵 Portal element:', portalElement);\n console.log('🔵 Portal element styles:', {\n position: portalElement.style.position,\n top: portalElement.style.top,\n left: portalElement.style.left,\n zIndex: portalElement.style.zIndex,\n display: portalElement.style.display,\n visibility: portalElement.style.visibility\n });\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 setTimeout(() => {\n this.isOpen.set(false);\n\n // Destroy portal if it exists\n if (this.getSafeConfig().usePortal) {\n this.destroyPortalDropdown();\n }\n\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n this.dropdownToggle.emit(false);\n }, 100);\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.getSafeConfig().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 { \r\n Injectable, \r\n signal, \r\n computed, \r\n type TemplateRef,\r\n type OnDestroy \r\n} 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 implements OnDestroy {\r\n // Modern signal-based state management\r\n private readonly confirmationQueue = signal<ConfirmationRequest<unknown>[]>([]);\r\n private readonly currentRequest = signal<ConfirmationRequest<unknown> | null>(null);\r\n \r\n // Modern computed signals with proper typing\r\n readonly hasActiveConfirmation = computed((): boolean => this.currentRequest() !== null);\r\n readonly queueLength = computed((): number => this.confirmationQueue().length);\r\n\r\n constructor() {\r\n // Modern service initialization\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\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 console.log('🔔 ConfirmationService.ask called with options:', options);\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 console.log('🔽 Ask for confirmation with a simple yes/no dialog', request);\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 // Modern private methods with proper typing\r\n private addToQueue(request: ConfirmationRequest<unknown>): void {\r\n this.confirmationQueue.update(queue => [...queue, request]);\r\n console.log('🔔 Added request to queue:', request);\r\n this.processQueue();\r\n }\r\n\r\n private processQueue(): void {\r\n console.log('🔔 Processing queue. Current request:', this.currentRequest(), 'Queue length:', this.confirmationQueue().length);\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 console.log('🔔 Setting current request:', nextRequest);\r\n this.currentRequest.set(nextRequest);\r\n }\r\n\r\n // Modern public methods with proper typing\r\n confirmCurrentRequest(data?: unknown): void {\r\n const request = this.currentRequest();\r\n if (!request) return;\r\n\r\n // Always resolve with true for confirmation, unless custom data is explicitly provided\r\n const resolvedValue = data !== undefined ? data : true;\r\n console.log('🔔 Confirming request with value:', resolvedValue);\r\n request.resolve(resolvedValue);\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 // Modern private utility method with proper typing\r\n private getDefaultIcon(type: 'danger' | 'warning' | 'info' | 'success'): string {\r\n const iconMap: Record<string, string> = {\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 // Modern public getters with proper typing\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 } from '@angular/core';\r\nimport { HttpClient, HttpEvent, HttpEventType, HttpProgressEvent, HttpRequest } from '@angular/common/http';\r\nimport { Observable, throwError, BehaviorSubject, of } from 'rxjs';\r\nimport { catchError, tap, map } from 'rxjs/operators';\r\nimport { \r\n cidePath, \r\n coreRoutesUrl, \r\n generateStringFromObject, \r\n hostManagerRoutesUrl\r\n} from 'cloud-ide-lms-model';\r\nimport {\r\n ICoreFileManager,\r\n IFileUploadRequest,\r\n IFileUploadResponse,\r\n IFileListRequest,\r\n IFileListResponse,\r\n IFileDeleteResponse,\r\n IFileUpdateRequest,\r\n IFileUpdateResponse,\r\n IFileUploadProgress\r\n} from '../interfaces/core-file-manager.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideCoreFileManagerService {\r\n private apiUrl = `${coreRoutesUrl?.fileManager}`;\r\n private fileListSubject = new BehaviorSubject<ICoreFileManager[]>([]);\r\n public fileList$ = this.fileListSubject.asObservable();\r\n\r\n constructor(private http: HttpClient) {\r\n console.log('CideCoreFileManagerService initialized - using real API');\r\n }\r\n\r\n /**\r\n * Get file list from API\r\n */\r\n getFileList(body: IFileListRequest): Observable<IFileListResponse> {\r\n const query = generateStringFromObject(body);\r\n return this.http?.get<IFileListResponse>(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]))\r\n .pipe(\r\n tap((response: IFileListResponse) => {\r\n if (response?.success) {\r\n this.fileListSubject.next(response?.data || []);\r\n }\r\n }),\r\n catchError(error => {\r\n console.error('CideCoreFileManagerService API error:', error);\r\n return this.handleError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get file list using mock data (deprecated - use getFileList instead)\r\n */\r\n getFileListWithMockData(_body: IFileListRequest): Observable<IFileListResponse> {\r\n console.warn('getFileListWithMockData is deprecated. Use getFileList instead.');\r\n return this.getFileList(_body);\r\n }\r\n\r\n /**\r\n * Get file list from cache (if available)\r\n */\r\n getFileListFromCache(): ICoreFileManager[] {\r\n return this.fileListSubject.value;\r\n }\r\n\r\n /**\r\n * Upload file with progress tracking\r\n */\r\n uploadFile(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\r\n const formData = new FormData();\r\n formData.append('file', request.file);\r\n formData.append('altText', request.altText || '');\r\n formData.append('tags', JSON.stringify(request.tags || []));\r\n formData.append('permissions', JSON.stringify(request.permissions || []));\r\n formData.append('userId', request.userId);\r\n\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'upload']);\r\n const req = new HttpRequest('POST', url, formData, {\r\n reportProgress: true\r\n });\r\n\r\n return this.http.request<IFileUploadResponse>(req).pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Upload file with progress tracking (mock version - deprecated)\r\n */\r\n uploadFileWithMockData(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\r\n console.warn('uploadFileWithMockData is deprecated. Use uploadFile instead.');\r\n return this.uploadFile(request);\r\n }\r\n\r\n /**\r\n * Update file metadata\r\n */\r\n updateFile(request: IFileUpdateRequest): Observable<IFileUpdateResponse> {\r\n console.log('Updating file:', request);\r\n \r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager]);\r\n return this.http.post<IFileUpdateResponse>(url, request)\r\n .pipe(\r\n tap((response: IFileUpdateResponse) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Delete file\r\n */\r\n deleteFile(id: string): Observable<IFileDeleteResponse> {\r\n const payload = { cyfm_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n return this.http.delete<IFileDeleteResponse>(url)\r\n .pipe(\r\n tap((response: IFileDeleteResponse) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Delete multiple files\r\n */\r\n deleteMultipleFiles(ids: string[]): Observable<{ success: boolean; message?: string; data?: unknown }> {\r\n console.log('Deleting multiple files:', ids);\r\n const payload = { ids };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n return this.http.delete<{ success: boolean; message?: string; data?: unknown }>(url)\r\n .pipe(\r\n tap((response: { success: boolean; message?: string; data?: unknown }) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Toggle file active status\r\n */\r\n toggleFileStatus(id: string): Observable<IFileListResponse> {\r\n console.log('Toggling file status:', id);\r\n const payload = { id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n return this.http.put<IFileListResponse>(url, {})\r\n .pipe(\r\n tap((response: IFileListResponse) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get file by ID\r\n */\r\n getFileById(id: string): Observable<{ success: boolean; message: string; data?: ICoreFileManager }> {\r\n console.log('Getting file by ID:', id);\r\n const payload = { cyfm_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'byId', query]);\r\n return this.http.get<{ success: boolean; message: string; data?: ICoreFileManager }>(url)\r\n .pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Find file by ID\r\n */\r\n findFileById(id: string, items: ICoreFileManager[] = this.fileListSubject.value): ICoreFileManager | null {\r\n for (const item of items) {\r\n if (item._id === id) {\r\n return item;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get file size in human readable format\r\n */\r\n getFileSizeDisplay(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n }\r\n\r\n /**\r\n * Get file type icon\r\n */\r\n getFileTypeIcon(fileType: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'image/jpeg': 'image',\r\n 'image/png': 'image',\r\n 'image/gif': 'image',\r\n 'image/svg+xml': 'image',\r\n 'application/pdf': 'picture_as_pdf',\r\n 'text/plain': 'description',\r\n 'text/html': 'code',\r\n 'application/json': 'code',\r\n 'application/javascript': 'code',\r\n 'text/css': 'code',\r\n 'application/zip': 'folder_zip',\r\n 'application/x-zip-compressed': 'folder_zip',\r\n 'application/msword': 'description',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'description',\r\n 'application/vnd.ms-excel': 'table_chart',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'table_chart',\r\n 'application/vnd.ms-powerpoint': 'slideshow',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'slideshow'\r\n };\r\n return typeMap[fileType] || 'insert_drive_file';\r\n }\r\n\r\n /**\r\n * Refresh file list from server\r\n */\r\n private refreshFileList(): void {\r\n const defaultBody: IFileListRequest = {\r\n pageIndex: 1,\r\n pageSize: 10\r\n };\r\n this.getFileList(defaultBody).subscribe({\r\n next: () => {\r\n console.log('File list refreshed successfully');\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing file list:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle errors\r\n */\r\n private handleError(error: unknown): Observable<never> {\r\n let errorMessage = 'An error occurred';\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message;\r\n } else if (typeof error === 'string') {\r\n errorMessage = error;\r\n }\r\n\r\n console.error('CideCoreFileManagerService Error:', errorMessage);\r\n return throwError(() => new Error(errorMessage));\r\n }\r\n}\r\n","import { \r\n Component, \r\n signal, \r\n computed, \r\n inject, \r\n effect,\r\n type OnInit,\r\n type OnDestroy \r\n} 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// Types\r\ninterface ConfirmationRequest {\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?: any;\r\n customData?: unknown;\r\n resolve: (value: boolean | unknown) => void;\r\n reject: (reason?: unknown) => void;\r\n}\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 </div>\r\n\r\n <!-- Modal -->\r\n <div \r\n *ngIf=\"hasActiveConfirmation()\"\r\n class=\"confirmation-modal\"\r\n style=\"position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10001;\">\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: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\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})\r\nexport class CideEleConfirmationModalComponent implements OnInit, OnDestroy {\r\n // Modern Angular 20+ dependency injection\r\n private readonly confirmationService = inject(ConfirmationService);\r\n\r\n // Modern signal-based state management\r\n readonly hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;\r\n readonly currentRequest = this.confirmationService.getCurrentRequest();\r\n readonly customData = signal<unknown>(null);\r\n\r\n // Modern lifecycle management\r\n ngOnInit(): void {\r\n // Debug: Log when confirmation state changes\r\n effect(() => {\r\n const hasActive = this.hasActiveConfirmation();\r\n console.log('🔔 Confirmation modal hasActiveConfirmation changed:', hasActive);\r\n if (hasActive) {\r\n console.log('🔔 Current request:', this.currentRequest());\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\r\n\r\n // Modern computed signals with proper typing\r\n readonly getHeaderClass = computed((): string => {\r\n const request = this.currentRequest();\r\n return request ? `header-${request.type}` : '';\r\n });\r\n\r\n readonly getIconClass = computed((): string => {\r\n const request = this.currentRequest();\r\n return request ? request.type : 'info';\r\n });\r\n\r\n readonly getConfirmButtonClass = computed((): string => {\r\n const request = this.currentRequest();\r\n if (!request) return 'btn-primary';\r\n \r\n const classMap: Record<string, string> = {\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 // Modern event handlers with proper typing\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, otherwise pass true\r\n const data = this.customData();\r\n console.log('🔔 Modal onConfirm called with customData:', data);\r\n this.confirmationService.confirmCurrentRequest(data !== null ? data : true);\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 && !notification.showProgress\"\n class=\"toast-progress\"\n [style.animation-duration]=\"notification.duration + 'ms'\">\n </div>\n \n <!-- Custom Progress Bar -->\n <div \n *ngIf=\"notification.showProgress\"\n class=\"toast-custom-progress\">\n <div \n class=\"toast-custom-progress-bar\"\n [style.width.%]=\"notification.progress || 0\">\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .toast-container {\n position: fixed;\n top: 80px;\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 /* Custom Progress Bar */\n .toast-custom-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 3px;\n background-color: #e5e7eb;\n overflow: hidden;\n }\n\n .toast-custom-progress-bar {\n height: 100%;\n background-color: #2563eb;\n transition: width 0.3s ease;\n border-radius: 0 3px 0 0;\n }\n\n .toast-notification.success .toast-custom-progress-bar {\n background-color: #16a34a;\n }\n\n .toast-notification.error .toast-custom-progress-bar {\n background-color: #dc2626;\n }\n\n .toast-notification.warning .toast-custom-progress-bar {\n background-color: #d97706;\n }\n\n .toast-notification.info .toast-custom-progress-bar {\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: 80px;\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/directives/file-image/file-image.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/services/file-manager.service';\nexport * from './lib/services/core-file-manager.service';\nexport * from './lib/interfaces/core-file-manager.interface';\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","catchError","i1"],"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/interfaces/core-file-manager.interface.ts","../../../projects/cloud-ide-element/src/lib/services/file-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/notification.service.ts","../../../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/directives/file-image/file-image.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/core-file-manager.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';\n\nexport interface PortalPosition {\n top: number;\n left: number;\n maxHeight?: number;\n maxWidth?: number;\n minWidth?: number;\n}\n\nexport interface PortalConfig {\n triggerElement: HTMLElement;\n content: string;\n className?: string;\n position?: 'bottom' | 'top' | 'auto';\n align?: 'left' | 'right' | 'center' | 'auto';\n offsetX?: number;\n offsetY?: number;\n maxHeight?: number;\n minWidth?: number;\n closeOnClickOutside?: boolean;\n closeOnEscape?: boolean;\n}\n\nexport interface TemplatePortalConfig {\n triggerElement: HTMLElement;\n template: TemplateRef<any>;\n viewContainerRef: ViewContainerRef;\n context?: any;\n className?: string;\n position?: 'bottom' | 'top' | 'auto';\n align?: 'left' | 'right' | 'center' | 'auto';\n offsetX?: number;\n offsetY?: number;\n maxHeight?: number;\n minWidth?: number;\n closeOnClickOutside?: boolean;\n closeOnEscape?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PortalService {\n private portals = new Map<string, HTMLElement>();\n private templatePortals = new Map<string, { element: HTMLElement; viewRef: EmbeddedViewRef<any> }>();\n private boundClickOutsideHandler: (event: Event) => void;\n private boundEscapeHandler: (event: KeyboardEvent) => void;\n private closeCallbacks = new Map<string, () => void>();\n\n constructor() {\n this.boundClickOutsideHandler = this.handleClickOutside.bind(this);\n this.boundEscapeHandler = this.handleEscape.bind(this);\n }\n\n /**\n * Create a portal with the given configuration\n */\n createPortal(id: string, config: PortalConfig): HTMLElement {\n // Clean up any existing portal with the same ID\n this.destroyPortal(id);\n\n // Calculate position\n const position = this.calculatePosition(config);\n\n // Create portal element\n const portal = document.createElement('div');\n portal.id = `portal-${id}`;\n portal.className = `cide-portal ${config.className || ''}`;\n portal.style.position = 'fixed';\n portal.style.top = `${position.top}px`;\n portal.style.left = `${position.left}px`;\n portal.style.zIndex = '9999';\n\n if (position.maxHeight) {\n portal.style.maxHeight = `${position.maxHeight}px`;\n portal.style.overflowY = 'auto';\n }\n\n if (position.maxWidth) {\n portal.style.maxWidth = `${position.maxWidth}px`;\n }\n\n if (position.minWidth) {\n portal.style.minWidth = `${position.minWidth}px`;\n }\n\n // Set content\n portal.innerHTML = config.content;\n\n // Append to body\n document.body.appendChild(portal);\n\n // Store portal reference\n this.portals.set(id, portal);\n\n // Set up event listeners if needed\n if (config.closeOnClickOutside || config.closeOnEscape) {\n this.setupEventListeners(id, config);\n }\n\n // Adjust position if portal goes outside viewport\n this.adjustPosition(portal, config.triggerElement);\n\n return portal;\n }\n\n /**\n * Create a template-based portal with Angular template\n */\n createTemplatePortal(id: string, config: TemplatePortalConfig): HTMLElement {\n // Clean up any existing portal with the same ID\n this.destroyPortal(id);\n\n // Calculate position\n const position = this.calculatePosition({\n triggerElement: config.triggerElement,\n content: '', // Not used for template portals\n position: config.position,\n align: config.align,\n offsetX: config.offsetX,\n offsetY: config.offsetY,\n maxHeight: config.maxHeight,\n minWidth: config.minWidth\n });\n console.log(\"test astrd\", config);\n // Create the view from template\n const viewRef = config.viewContainerRef.createEmbeddedView(config.template, { context: config.context });\n viewRef.detectChanges();\n \n console.log('🔵 Template view created:', {\n viewRef,\n rootNodes: viewRef.rootNodes,\n rootNodesLength: viewRef.rootNodes.length\n });\n\n // Create portal container element\n const portal = document.createElement('div');\n portal.id = `portal-${id}`;\n portal.className = `cide-portal ${config.className || ''}`;\n portal.style.position = 'fixed';\n portal.style.top = `${position.top}px`;\n portal.style.left = `${position.left}px`;\n portal.style.zIndex = '99999'; // Increased z-index\n portal.style.display = 'block';\n portal.style.visibility = 'visible';\n portal.style.opacity = '1';\n\n if (position.maxHeight) {\n portal.style.maxHeight = `${position.maxHeight}px`;\n portal.style.overflowY = 'auto';\n }\n\n if (position.maxWidth) {\n portal.style.maxWidth = `${position.maxWidth}px`;\n }\n\n if (position.minWidth) {\n portal.style.minWidth = `${position.minWidth}px`;\n }\n\n // Append template nodes to portal\n viewRef.rootNodes.forEach(node => {\n portal.appendChild(node);\n });\n\n // Append to body\n document.body.appendChild(portal);\n\n // Store template portal reference\n this.templatePortals.set(id, { element: portal, viewRef });\n\n console.log('🔵 Portal created and appended to body:', {\n id,\n portal,\n position: { top: position.top, left: position.left },\n zIndex: portal.style.zIndex,\n className: portal.className,\n children: portal.children.length\n });\n\n // Set up event listeners if needed\n if (config.closeOnClickOutside || config.closeOnEscape) {\n this.setupEventListeners(id, {\n triggerElement: config.triggerElement,\n content: '',\n closeOnClickOutside: config.closeOnClickOutside,\n closeOnEscape: config.closeOnEscape\n });\n }\n\n // Adjust position if portal goes outside viewport\n this.adjustPosition(portal, config.triggerElement);\n\n return portal;\n }\n\n /**\n * Update portal content\n */\n updatePortal(id: string, content: string): void {\n const portal = this.portals.get(id);\n if (portal) {\n portal.innerHTML = content;\n }\n }\n\n /**\n * Update portal position\n */\n updatePortalPosition(id: string, config: PortalConfig): void {\n const portal = this.portals.get(id);\n if (portal) {\n const position = this.calculatePosition(config);\n portal.style.top = `${position.top}px`;\n portal.style.left = `${position.left}px`;\n this.adjustPosition(portal, config.triggerElement);\n }\n }\n\n /**\n * Destroy a portal\n */\n destroyPortal(id: string): void {\n // Handle regular portals\n const portal = this.portals.get(id);\n if (portal && portal.parentNode) {\n portal.parentNode.removeChild(portal);\n this.portals.delete(id);\n this.closeCallbacks.delete(id);\n this.cleanupEventListeners();\n return;\n }\n\n // Handle template portals\n const templatePortal = this.templatePortals.get(id);\n if (templatePortal) {\n if (templatePortal.element && templatePortal.element.parentNode) {\n templatePortal.element.parentNode.removeChild(templatePortal.element);\n }\n templatePortal.viewRef.destroy();\n this.templatePortals.delete(id);\n this.closeCallbacks.delete(id);\n this.cleanupEventListeners();\n }\n }\n\n /**\n * Destroy all portals\n */\n destroyAllPortals(): void {\n this.portals.forEach((_, id) => this.destroyPortal(id));\n this.templatePortals.forEach((_, id) => this.destroyPortal(id));\n }\n\n /**\n * Register a close callback for a portal\n */\n registerCloseCallback(id: string, callback: () => void): void {\n this.closeCallbacks.set(id, callback);\n }\n\n /**\n * Get portal element by ID\n */\n getPortal(id: string): HTMLElement | undefined {\n const portal = this.portals.get(id);\n if (portal) return portal;\n\n const templatePortal = this.templatePortals.get(id);\n return templatePortal?.element;\n }\n\n /**\n * Check if portal exists\n */\n hasPortal(id: string): boolean {\n return this.portals.has(id) || this.templatePortals.has(id);\n }\n\n private calculatePosition(config: PortalConfig): PortalPosition {\n const rect = config.triggerElement.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n const offsetX = config.offsetX || 0;\n const offsetY = config.offsetY || 4;\n const estimatedHeight = config.maxHeight || 300;\n const estimatedWidth = config.minWidth || rect.width;\n\n // Smart vertical positioning - check available space above and below\n const spaceBelow = viewport.height - rect.bottom;\n const spaceAbove = rect.top;\n \n let top: number;\n let position: 'top' | 'bottom' = 'bottom'; // Default to bottom\n \n // Determine if we should open above or below\n if (config.position === 'auto' || !config.position) {\n // Auto-detect: prefer bottom, but use top if not enough space below\n if (spaceBelow < estimatedHeight && spaceAbove > estimatedHeight) {\n position = 'top';\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\n } else {\n position = 'bottom';\n top = rect.bottom + window.scrollY + offsetY;\n }\n } else if (config.position === 'top') {\n position = 'top';\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\n } else {\n position = 'bottom';\n top = rect.bottom + window.scrollY + offsetY;\n }\n\n let left = rect.left + window.scrollX + offsetX; \n\n // Auto-detect horizontal alignment\n if (config.align === 'auto' || !config.align) {\n const spaceRight = viewport.width - rect.left;\n const spaceLeft = rect.right;\n\n if (spaceRight < estimatedWidth && spaceLeft > estimatedWidth) {\n // Align to right edge of trigger\n left = rect.right + window.scrollX - estimatedWidth;\n }\n } else if (config.align === 'right') {\n left = rect.right + window.scrollX - estimatedWidth;\n } else if (config.align === 'center') {\n left = rect.left + window.scrollX + (rect.width / 2) - (estimatedWidth / 2);\n }\n\n return {\n top,\n left,\n maxHeight: config.maxHeight,\n minWidth: config.minWidth\n };\n }\n\n private adjustPosition(portal: HTMLElement, triggerElement: HTMLElement): void {\n const portalRect = portal.getBoundingClientRect();\n const triggerRect = triggerElement.getBoundingClientRect();\n const viewport = {\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n let adjustedLeft = parseInt(portal.style.left);\n let adjustedTop = parseInt(portal.style.top);\n\n // Adjust horizontal position if portal goes outside viewport\n if (portalRect.right > viewport.width) {\n adjustedLeft = triggerRect.right + window.scrollX - portalRect.width;\n }\n if (portalRect.left < 0) {\n adjustedLeft = window.scrollX + 4; // Small margin from edge\n }\n\n // Smart vertical adjustment - flip to opposite side if needed\n const spaceBelow = viewport.height - triggerRect.bottom;\n const spaceAbove = triggerRect.top;\n const portalHeight = portalRect.height;\n\n // If portal goes below viewport and there's more space above, flip to top\n if (portalRect.bottom > viewport.height && spaceAbove > portalHeight) {\n adjustedTop = triggerRect.top + window.scrollY - portalHeight - 4;\n }\n // If portal goes above viewport and there's more space below, flip to bottom\n else if (portalRect.top < 0 && spaceBelow > portalHeight) {\n adjustedTop = triggerRect.bottom + window.scrollY + 4;\n }\n // If still outside viewport, adjust to fit within bounds\n else {\n if (portalRect.bottom > viewport.height) {\n adjustedTop = viewport.height + window.scrollY - portalHeight - 4;\n }\n if (portalRect.top < 0) {\n adjustedTop = window.scrollY + 4; // Small margin from top\n }\n }\n\n portal.style.left = `${adjustedLeft}px`;\n portal.style.top = `${adjustedTop}px`;\n }\n\n private setupEventListeners(id: string, config: PortalConfig): void {\n // Set up event listeners only once when first portal is created\n const totalPortals = this.portals.size + this.templatePortals.size;\n if (totalPortals === 1) {\n if (config.closeOnClickOutside) {\n document.addEventListener('click', this.boundClickOutsideHandler);\n }\n if (config.closeOnEscape) {\n document.addEventListener('keydown', this.boundEscapeHandler);\n }\n }\n }\n\n private cleanupEventListeners(): void {\n // Clean up event listeners when no portals exist\n const totalPortals = this.portals.size + this.templatePortals.size;\n if (totalPortals === 0) {\n document.removeEventListener('click', this.boundClickOutsideHandler);\n document.removeEventListener('keydown', this.boundEscapeHandler);\n }\n }\n\n private handleClickOutside(event: Event): void {\n const target = event.target as HTMLElement;\n\n // Handle regular portals\n this.portals.forEach((portal, id) => {\n const callback = this.closeCallbacks.get(id);\n if (callback && !portal.contains(target)) {\n // Check if click is on trigger element\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\n if (!triggerElement || !triggerElement.contains(target)) {\n callback();\n }\n }\n });\n\n // Handle template portals\n this.templatePortals.forEach((templatePortal, id) => {\n const callback = this.closeCallbacks.get(id);\n if (callback && !templatePortal.element.contains(target)) {\n // Check if click is on trigger element\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\n if (!triggerElement || !triggerElement.contains(target)) {\n callback();\n }\n }\n });\n }\n\n private handleEscape(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n // Close the most recently opened portal\n const portalIds = Array.from(this.portals.keys());\n const templatePortalIds = Array.from(this.templatePortals.keys());\n const allPortalIds = [...portalIds, ...templatePortalIds];\n const lastPortalId = allPortalIds[allPortalIds.length - 1];\n\n if (lastPortalId) {\n const callback = this.closeCallbacks.get(lastPortalId);\n if (callback) {\n callback();\n }\n }\n }\n }\n}\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 = \"floating\";\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 = true;\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 = \"md\";\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 let ngModel = this.autoCapitalizeByOption(value, this.type);\r\n if (this.type === 'date') {\r\n ngModel = this.processValue(ngModel, this.type);\r\n }\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 } else {\r\n // Try to parse and format unformatted date to YYYY-MM-DD\r\n const parsedDate = new Date(value);\r\n if (!isNaN(parsedDate.getTime())) {\r\n const year = parsedDate.getFullYear();\r\n const month = String(parsedDate.getMonth() + 1).padStart(2, '0');\r\n const day = String(parsedDate.getDate()).padStart(2, '0');\r\n return `${year}-${month}-${day}`;\r\n }\r\n }\r\n } else if (type === 'url' && typeof value === 'string' && value) {\r\n // Normalize URL format - ensure it starts with http:// or https://\r\n if (!value.startsWith('http://') && !value.startsWith('https://')) {\r\n return `https://${value}`;\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 } else if (type == 'url') {\r\n // URLs should not be capitalized - return as is\r\n return value;\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 == 'url') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n // Validate URL format\r\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n return urlRegex.test(value);\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 console.log(value, \"value, req\")\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) === 'number'){\r\n value = value.toString();\r\n }\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 == 'url') {\r\n if (typeof (value) == 'string' && value) {\r\n // URL validation regex\r\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\r\n if (!urlRegex.test(value)) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Please enter a valid URL (e.g., https://example.com)!`;\r\n }\r\n\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 if (this.required && !value) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `URL is 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 if (this.type === 'url') {\r\n this.typeInternal = \"url\";\r\n // Set default link icon if no trailing icon specified\r\n this.trailingIconInternal = this.trailingIcon || \"link\";\r\n this.isTrailingIconAllwedClick = false; // URL type doesn't need clickable trailing 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 // Parse date string in YYYY-MM-DD format to avoid timezone issues\r\n const [year, month, day] = date.split('-').map(Number);\r\n date = new Date(year, month - 1, day); // month is 0-indexed\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 // Parse date string in YYYY-MM-DD format to avoid timezone issues\r\n const [year, month, day] = date.split('-').map(Number);\r\n date = new Date(year, month - 1, day); // month is 0-indexed\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 // Parse date string in YYYY-MM-DD format to avoid timezone issues\r\n const [year, month, day] = this.ngModel.split('-').map(Number);\r\n this.selectedDate = new Date(year, month - 1, day); // month is 0-indexed\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: 'auto' as const, // Smart positioning - will auto-detect best position\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 - Use local date formatting to avoid timezone issues\r\n const year = dayInfo.date.getFullYear();\r\n const month = String(dayInfo.date.getMonth() + 1).padStart(2, '0');\r\n const day = String(dayInfo.date.getDate()).padStart(2, '0');\r\n const formattedDate = `${year}-${month}-${day}`; // YYYY-MM-DD format\r\n\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 | URL------------------------------------------>\r\n @if (type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'tel' || type === 'date' || type === 'url') {\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, non-url) -->\r\n @if (type !== 'date' && type !== 'url') {\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\r\n <!-- URL Input -->\r\n @if (type === 'url') {\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\"\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-base\">chevron_left</span>\r\n </button>\r\n \r\n <button \r\n type=\"button\" \r\n class=\"tw-text-sm tw-font-medium 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-base\">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-base\">keyboard_double_arrow_left</span>\r\n </button>\r\n <span class=\"tw-text-sm tw-font-medium 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-base\">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 }\" type=\"button\">\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, TemplateRef, ViewContainerRef, inject } 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';\nimport { PortalService } from '../../services/portal.service';\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\n// Extended interface for object-based options\nexport interface SelectOptionObject {\n [key: string]: any;\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],\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 | string[] = '';\n @Input() size: themeSize = 'md';\n @Input() fill: elementStyleType = 'outline';\n @Input() labelPlacement: labelPlacementType = 'floating';\n @Input() labelDir: labelDirType = 'start';\n @Input() leadingIcon: string = '';\n @Input() trailingIcon: string = '';\n @Input() clearInput: boolean = false;\n @Input() options: (SelectOption | SelectOptionObject)[] = [];\n @Input() multiple: boolean = false;\n @Input() searchable: boolean = false;\n @Input() showSearchInput: boolean = true;\n @Input() loading: boolean = false;\n /** \n * Key to extract the value from option objects. \n * Default: 'value'. Use when options are objects with custom property names.\n * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set valueKey = 'id'\n */\n @Input() valueKey: string = 'value';\n\n /** \n * Key to extract the label from option objects. \n * Default: 'label'. Use when options are objects with custom property names.\n * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set labelKey = 'name'\n */\n @Input() labelKey: string = 'label';\n\n @Output() ngModelChange = new EventEmitter<string | number | string[]>();\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\n @Output('change') selectionChange = new EventEmitter<any>();\n @Output() searchChange = new EventEmitter<selectSearchType>();\n\n isOpen: boolean = false;\n isTouched = false;\n isValid = true;\n searchTerm: string = '';\n filteredOptions: (SelectOption | SelectOptionObject)[] = [];\n private searchDebounceTimeout: ReturnType<typeof setTimeout> | null = null;\n private searchSubject = new Subject<string>();\n private destroy$ = new Subject<void>();\n private isUpdatingOptions: boolean = false;\n \n // Portal-related properties\n private portalService = inject(PortalService);\n private dropdownPortalId: string = '';\n @ViewChild('dropdownTemplate', { static: false }) dropdownTemplate!: TemplateRef<any>;\n @ViewChild('dropdownContainer', { read: ViewContainerRef, static: false }) dropdownContainer!: ViewContainerRef;\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 // Setup debounced search\n this.setupDebouncedSearch();\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 => this.getOptionValue(option) === this.ngModel)) {\n this.searchChange.emit({\n query: \"\",\n value: this.ngModel as string | number // emit raw value for external handlers\n });\n }\n }\n if (changes['options']) {\n this.filterOptions();\n console.log('🔍 options changed', this.options, this.isOpen, this.dropdownPortalId);\n \n // Debug: Check what elements exist in the DOM\n if (this.dropdownPortalId) {\n console.log('🔍 Current portal ID:', this.dropdownPortalId);\n console.log('🔍 All elements with portal ID:', document.querySelectorAll(`[id*=\"${this.dropdownPortalId}\"]`));\n console.log('🔍 All input elements:', document.querySelectorAll('input[type=\"text\"]'));\n console.log('🔍 All elements with select-dropdown in ID:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\n console.log('🔍 All portal elements:', document.querySelectorAll('[id*=\"portal\"]'));\n }\n \n // Update portal context if dropdown is open\n if (this.isOpen && this.dropdownPortalId) {\n // Always use portal recreation since focus preservation is working\n this.updatePortalContext();\n }\n }\n }\n\n writeValue(value: string | number): void {\n this.ngModel = value;\n if (this.searchable) {\n this.searchChange.emit({\n query: \"\",\n value: value // emit raw value for external handlers\n });\n }\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 | string[]): ValidationErrors | null {\n if (this.required) {\n const isEmpty = (v: unknown) => {\n if (v === null || v === undefined) return true;\n if (typeof v === 'string') return v.trim() === '';\n if (Array.isArray(v)) return v.length === 0;\n return false;\n };\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 if (this.isOpen) {\n this.closeDropdown();\n } else {\n this.openDropdown();\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.closeDropdown(); // Close the portal on error\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n }\n }\n\n private openDropdown(): void {\n this.isOpen = true;\n this.logDebug('Opening dropdown with portal');\n \n // Clean up any orphaned portals before creating new one\n this.cleanupOrphanedPortals();\n \n this.calculateDropdownPosition();\n this.focusControl();\n this.searchTerm = '';\n this.filterOptions();\n this.createDropdownPortal();\n this.logDebug('Dropdown opened, search term reset');\n }\n\n private closeDropdown(): void {\n this.isOpen = false;\n this.isDropdownInteraction = false;\n this.interactionCount = 0;\n this.logDebug('Closing dropdown portal');\n this.destroyDropdownPortal();\n this.logDebug('Dropdown closed, interaction flags reset');\n }\n\n // Cleanup method to prevent memory leaks\n ngOnDestroy(): void {\n this.clearTimeouts();\n // Clear search debounce timeout\n if (this.searchDebounceTimeout) {\n clearTimeout(this.searchDebounceTimeout);\n this.searchDebounceTimeout = null;\n }\n \n // Complete subjects to prevent memory leaks\n this.destroy$.next();\n this.destroy$.complete();\n this.searchSubject.complete();\n \n // Destroy dropdown portal\n this.destroyDropdownPortal();\n \n // Clean up any remaining portals from this component\n console.log('🔍 Cleaning up all portals on destroy');\n const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\n console.log('🔍 Found portals to clean up:', allPortals.length);\n allPortals.forEach(portal => {\n const portalId = portal.getAttribute('id');\n if (portalId) {\n console.log('🔍 Cleaning up portal:', portalId);\n this.portalService.destroyPortal(portalId);\n }\n });\n \n window.removeEventListener('resize', this.onWindowResize.bind(this));\n this.logDebug('Component destroyed, timeouts cleared');\n }\n\n private createDropdownPortal(): void {\n try {\n const triggerElement = this.elementRef?.nativeElement;\n if (!triggerElement || !this.dropdownTemplate || !this.dropdownContainer) {\n this.logDebug('Cannot create portal - missing elements');\n return;\n }\n\n // Ensure filteredOptions is properly initialized\n if (!this.filteredOptions || this.filteredOptions.length === 0) {\n this.filterOptions(); // Make sure filteredOptions is populated\n }\n\n // Generate unique portal ID\n this.dropdownPortalId = `select-dropdown-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n console.log('🔍 Creating new portal with ID:', this.dropdownPortalId);\n\n const portalConfig = {\n triggerElement,\n template: this.dropdownTemplate,\n viewContainerRef: this.dropdownContainer,\n context: {\n options: this.filteredOptions,\n isOpen: this.isOpen,\n searchTerm: this.searchTerm,\n searchable: this.searchable,\n multiple: this.multiple,\n loading: this.loading,\n dropdownPosition: this.dropdownPosition,\n onSearchInput: this.onSearchInput.bind(this),\n selectOption: this.selectOption.bind(this),\n isOptionSelected: this.isOptionSelected.bind(this),\n trackByValue: this.trackByValue.bind(this),\n getOptionLabel: this.getOptionLabel.bind(this)\n },\n className: 'cide-select-dropdown-portal',\n position: this.dropdownPosition,\n align: 'left' as const,\n offsetX: 0,\n offsetY: 5,\n maxHeight: 250,\n minWidth: 200,\n closeOnClickOutside: true,\n closeOnEscape: true\n };\n\n // Create the template portal\n this.portalService.createTemplatePortal(this.dropdownPortalId, portalConfig);\n\n // Register close callback\n this.portalService.registerCloseCallback(this.dropdownPortalId, () => {\n this.closeDropdown();\n });\n\n // Set data attribute for click outside detection\n triggerElement.setAttribute('data-portal-trigger', this.dropdownPortalId);\n\n this.logDebug('Dropdown portal created', { \n portalId: this.dropdownPortalId, \n filteredOptionsCount: this.filteredOptions.length,\n allOptionsCount: this.options.length \n });\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] createDropdownPortal error:`, error);\n }\n }\n\n private destroyDropdownPortal(): void {\n try {\n if (this.dropdownPortalId) {\n console.log('🔍 Destroying portal with ID:', this.dropdownPortalId);\n this.portalService.destroyPortal(this.dropdownPortalId);\n this.dropdownPortalId = '';\n this.logDebug('Dropdown portal destroyed');\n console.log('🔍 Portal destroyed, remaining portals:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\n }\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] destroyDropdownPortal error:`, error);\n }\n }\n\n private updatePortalContext(): void {\n try {\n if (!this.dropdownPortalId) {\n return; // Portal not created yet\n }\n\n // Set flag to prevent blur during update\n this.isUpdatingOptions = true;\n\n // Store reference to search input before destroying portal\n console.log('🔍 Looking for search input with portal ID:', this.dropdownPortalId);\n const searchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 searchInput found:', searchInput);\n \n // Try alternative selectors if the first one fails\n let searchInputAlt = null;\n if (!searchInput) {\n searchInputAlt = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 searchInputAlt found:', searchInputAlt);\n }\n \n const finalSearchInput = searchInput || searchInputAlt;\n const wasSearchInputFocused = finalSearchInput && document.activeElement === finalSearchInput;\n const searchInputValue = finalSearchInput ? finalSearchInput.value : '';\n const cursorPosition = finalSearchInput ? finalSearchInput.selectionStart || 0 : 0;\n\n // Since the portal service doesn't have an update context method,\n // we need to recreate the portal with updated context\n this.destroyDropdownPortal();\n this.createDropdownPortal();\n \n // Restore focus and value to search input after recreation\n if (wasSearchInputFocused && searchInputValue) {\n // Use multiple timing strategies to ensure focus restoration works\n const restoreFocus = () => {\n let newSearchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 newSearchInput', newSearchInput);\n \n // Try alternative selectors if the first one fails\n if (!newSearchInput) {\n newSearchInput = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\n console.log('🔍 newSearchInputAlt', newSearchInput);\n }\n \n if (newSearchInput) {\n newSearchInput.value = searchInputValue;\n newSearchInput.focus();\n // Set cursor position to the original position\n newSearchInput.setSelectionRange(cursorPosition, cursorPosition);\n return true;\n }\n return false;\n };\n\n // Try immediate restoration\n if (!restoreFocus()) {\n // Try with requestAnimationFrame\n requestAnimationFrame(() => {\n if (!restoreFocus()) {\n // Try with setTimeout as fallback\n setTimeout(() => {\n restoreFocus();\n // Clear the flag after restoration\n this.isUpdatingOptions = false;\n }, 10);\n } else {\n // Clear the flag after successful restoration\n this.isUpdatingOptions = false;\n }\n });\n } else {\n // Clear the flag after successful restoration\n this.isUpdatingOptions = false;\n }\n } else {\n // Clear the flag if no focus restoration needed\n this.isUpdatingOptions = false;\n }\n \n this.logDebug('Portal context updated', { \n filteredOptionsCount: this.filteredOptions.length,\n searchTerm: this.searchTerm \n });\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] updatePortalContext error:`, error);\n this.isUpdatingOptions = false;\n }\n }\n\n private updateOptionsInDOM(): boolean {\n try {\n if (!this.dropdownPortalId) {\n return false; // Portal not created yet\n }\n\n // Find the options container in the DOM\n console.log('🔍 Looking for options container with portal ID:', this.dropdownPortalId);\n let optionsContainer = document.querySelector(`#${this.dropdownPortalId} .tw-py-1`);\n console.log('🔍 optionsContainer (.tw-py-1):', optionsContainer);\n \n // Try alternative selectors if the first one fails\n if (!optionsContainer) {\n optionsContainer = document.querySelector(`#${this.dropdownPortalId}`);\n console.log('🔍 optionsContainer (main):', optionsContainer);\n }\n \n if (!optionsContainer) {\n optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] .tw-py-1`);\n console.log('🔍 optionsContainer (alt .tw-py-1):', optionsContainer);\n }\n \n if (!optionsContainer) {\n optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"]`);\n console.log('🔍 optionsContainer (alt main):', optionsContainer);\n }\n \n if (!optionsContainer) {\n console.log('🔍 No options container found, returning false');\n return false;\n }\n\n console.log('🔍 optionsContainer found, clearing and updating with', this.filteredOptions.length, 'options');\n console.log('🔍 Current optionsContainer HTML before clear:', optionsContainer.innerHTML);\n\n // Find and clear only the option buttons and loading states, not the entire container\n const existingOptions = optionsContainer.querySelectorAll('.cide-select-option, .tw-px-3.tw-py-2, .tw-px-3.tw-py-4');\n console.log('🔍 Found existing options to remove:', existingOptions.length);\n existingOptions.forEach(option => option.remove());\n\n // Add filtered options directly to DOM\n this.filteredOptions.forEach((option) => {\n const button = document.createElement('button');\n button.type = 'button';\n button.className = `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 ${\n this.isOptionSelected(option) ? 'tw-bg-blue-50 tw-text-blue-700' : ''\n } ${option.disabled ? 'tw-text-gray-400 tw-cursor-not-allowed' : ''}`;\n button.textContent = this.getOptionLabel(option);\n button.disabled = option.disabled || false;\n \n // Add event listeners\n button.addEventListener('mousedown', () => this.onDropdownMouseDown());\n button.addEventListener('click', () => this.selectOption(option));\n button.addEventListener('keyup', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n this.selectOption(option);\n }\n });\n\n optionsContainer.appendChild(button);\n });\n\n // Add \"No options\" message if no options\n if (this.filteredOptions.length === 0) {\n const noOptionsDiv = document.createElement('div');\n noOptionsDiv.className = 'tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic';\n noOptionsDiv.textContent = this.searchable && this.searchTerm ? 'No options found' : 'No options available';\n optionsContainer.appendChild(noOptionsDiv);\n }\n \n console.log('🔍 Options added, final optionsContainer HTML:', optionsContainer.innerHTML);\n console.log('🔍 Number of child elements in optionsContainer:', optionsContainer.children.length);\n \n this.logDebug('Options updated directly in DOM', { \n filteredOptionsCount: this.filteredOptions.length,\n searchTerm: this.searchTerm \n });\n \n return true; // Success\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] updateOptionsInDOM error:`, error);\n return false; // Failed\n }\n }\n\n private setupDebouncedSearch(): void {\n this.searchSubject\n .pipe(\n debounceTime(300), // 300ms debounce\n distinctUntilChanged((prev, curr) => {\n // Custom comparison to ensure empty strings are always emitted\n return prev === curr;\n }),\n takeUntil(this.destroy$)\n )\n .subscribe(searchTerm => {\n console.log(`🔍 SELECT [${this.debugId}] Debounced search triggered:`, `\"${searchTerm}\"`);\n this.performSearch(searchTerm);\n });\n }\n\n private performSearch(searchTerm: string): void {\n const queryValue = searchTerm || '';\n \n console.log(`🔍 SELECT [${this.debugId}] About to emit search:`, `query=\"${queryValue}\"`);\n \n // Emit search change event for external API calls\n // Note: selectSearchType interface requires both query and value\n this.searchChange.emit({\n query: queryValue,\n value: '' // Empty value since this is just a search, not a selection\n });\n \n console.log(`🔍 SELECT [${this.debugId}] Search emitted successfully:`, `query=\"${queryValue}\"`);\n }\n\n private cleanupOrphanedPortals(): void {\n try {\n console.log('🔍 Cleaning up orphaned portals');\n const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\n console.log('🔍 Found portals before cleanup:', allPortals.length);\n \n allPortals.forEach(portal => {\n const portalId = portal.getAttribute('id');\n if (portalId && portalId !== this.dropdownPortalId) {\n console.log('🔍 Cleaning up orphaned portal:', portalId);\n this.portalService.destroyPortal(portalId);\n }\n });\n \n console.log('🔍 Orphaned portals cleaned up');\n } catch (error) {\n console.error(`💥 SELECT [${this.debugId}] cleanupOrphanedPortals error:`, error);\n }\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 | SelectOptionObject): void {\n try {\n this.logDebug('selectOption called', { option, disabled: option.disabled, multiple: this.multiple });\n if (option.disabled) return;\n\n const optionValue = this.getOptionValue(option);\n\n if (this.multiple) {\n // Handle both array and CSV formats\n let current: string[] = [];\n \n if (Array.isArray(this.ngModel)) {\n // Handle array values (new format)\n current = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n } else {\n // Handle string values (legacy CSV format)\n const currentCsv = this.ngModel as string || '';\n current = currentCsv ? currentCsv.split(',').map(v => v.trim()).filter(Boolean) : [];\n }\n \n const idx = current.findIndex(v => v.toString() === optionValue.toString());\n\n if (idx >= 0) {\n current.splice(idx, 1);\n } else {\n current.push(optionValue.toString());\n }\n\n // For array-based form controls, emit array; for CSV-based, emit CSV\n if (Array.isArray(this.ngModel)) {\n this.ngModel = current;\n this.onChange(current as any);\n this.ngModelChange.emit(current);\n } else {\n const newCsv = current.join(',');\n this.ngModel = newCsv;\n this.onChange(newCsv);\n this.ngModelChange.emit(newCsv);\n }\n \n this.selectionChange.emit(option as SelectOption);\n this.validateValue(this.ngModel);\n this.isTouched = true;\n this.onTouched();\n // Do not close dropdown in multi-select mode\n } else {\n this.ngModel = optionValue;\n this.onChange(optionValue);\n this.ngModelChange.emit(optionValue);\n this.selectionChange.emit(option as SelectOption);\n this.validateValue(optionValue);\n this.isOpen = false;\n this.closeDropdown(); // Close the portal when option is selected\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.closeDropdown(); // Close the portal on error as well\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.closeDropdown(); // Close the portal when max interaction count exceeded\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.closeDropdown(); // Close the portal when dropdown interaction ends\n this.searchTerm = '';\n this.filterOptions();\n }\n this.interactionCount = 0;\n } catch (error) {\n this.isOpen = false;\n this.closeDropdown(); // Close the portal on error\n this.interactionCount = 0;\n }\n }, 150);\n } catch {\n this.isOpen = false;\n this.closeDropdown(); // Close the portal on error\n this.isDropdownInteraction = 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 if (this.multiple && Array.isArray(this.ngModel)) {\n this.ngModel = [];\n this.onChange([] as any);\n this.ngModelChange.emit([]);\n this.validateValue([]);\n } else {\n this.ngModel = '';\n this.onChange('');\n this.ngModelChange.emit('');\n this.validateValue('');\n }\n }\n\n getSelectedOptionLabel(): string {\n if (this.multiple) {\n // Handle both string (CSV) and array values\n let values: string[] = [];\n \n if (Array.isArray(this.ngModel)) {\n // Handle array values (new format)\n values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n } else {\n // Handle string values (legacy CSV format)\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return '';\n values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n }\n \n const labels = values\n .map(v => this.options.find(o => this.getOptionValue(o).toString() === v))\n .map(option => option ? this.getOptionLabel(option) : '')\n .filter((l): l is string => typeof l === 'string');\n return labels.join(', ');\n }\n const selectedOption = this.options.find(option => this.getOptionValue(option) === this.ngModel);\n return selectedOption ? this.getOptionLabel(selectedOption) : '';\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 => this.getOptionLabel(option).toLowerCase().includes(this.searchTerm.toLowerCase()));\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 \n console.log(`🔍 SELECT [${this.debugId}] Search input changed:`, `\"${this.searchTerm}\"`);\n \n // If search term is empty, emit immediately without debounce\n if (this.searchTerm === '' || this.searchTerm === null || this.searchTerm === undefined) {\n console.log(`🔍 SELECT [${this.debugId}] Empty search - emitting immediately`);\n this.performSearch('');\n } else {\n // For non-empty values, use debounced search\n this.searchSubject.next(this.searchTerm);\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 onSearchInputBlur(event: Event): void {\n // Prevent blur if we're updating options (to maintain focus during API updates)\n if (this.isUpdatingOptions) {\n event.preventDefault();\n (event.target as HTMLInputElement).focus();\n }\n }\n\n onDropdownMouseUp(): void {\n this.addTimeout(() => {\n this.isDropdownInteraction = false;\n }, 200);\n }\n\n isOptionSelected(option: SelectOption | SelectOptionObject): boolean {\n if (this.multiple) {\n // Handle both array and CSV formats\n let values: string[] = [];\n \n if (Array.isArray(this.ngModel)) {\n // Handle array values (new format)\n values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\n } else {\n // Handle string values (legacy CSV format)\n const csvValue = this.ngModel as string || '';\n if (!csvValue.trim()) return false;\n values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\n }\n \n return values.includes(this.getOptionValue(option).toString());\n }\n return this.getOptionValue(option) === this.ngModel;\n }\n\n // Helper methods to extract values and labels from options\n getOptionValue(option: SelectOption | SelectOptionObject): string | number {\n if (this.isSelectOption(option)) {\n return option.value;\n }\n return option[this.valueKey] || '';\n }\n\n getOptionLabel(option: SelectOption | SelectOptionObject): string {\n if (this.isSelectOption(option)) {\n return option.label;\n }\n return option[this.labelKey] || '';\n }\n\n private isSelectOption(option: SelectOption | SelectOptionObject): option is SelectOption {\n return 'value' in option && 'label' in option;\n }\n\n trackByValue(index: number, option: SelectOption | SelectOptionObject): string | number {\n return this.getOptionValue(option);\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 @if (label && !labelHide) {\n <label [for]=\"id\" class=\"cide-select-label\">{{ label }}</label>\n }\n\n <div class=\"cide-element-select-wrapper tw-relative\">\n <!-- Leading Icon -->\n @if (leadingIcon) {\n <span class=\"cide-input-leading-icon-wrapper\">\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n </span>\n }\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 <!-- Trailing Icon (Dropdown Arrow or Loading Spinner) -->\n @if (!clearInput || !ngModel || loading) {\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 <!-- Loading Spinner -->\n @if (loading) {\n <span 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\"\n 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\">\n </path>\n </svg>\n </span>\n }\n <!-- Dropdown Arrow -->\n @if (!loading) {\n <span\n 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 }\n </span>\n }\n\n <!-- Clear Button -->\n @if (clearInput && ngModel) {\n <button class=\"cide-input-clear\" (click)=\"clearSelection()\" type=\"button\">\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n </button>\n }\n\n\n </div>\n\n <!-- Error/Helper Text -->\n @if ((errorText || helperText) && !isValid) {\n <span class=\"cide-select-help-error-text\">\n {{ errorText || helperText }}\n </span>\n }\n @if (helperText && isValid) {\n <span class=\"cide-select-help-error-text\">\n {{ helperText }}\n </span>\n }\n\n <!-- Portal Container -->\n <div #dropdownContainer></div>\n</div>\n\n<!-- Portal Template for Dropdown -->\n<ng-template #dropdownTemplate let-context=\"context\">\n <div\n class=\"cide-select-dropdown-portal tw-bg-white tw-border tw-border-gray-300 tw-rounded-md tw-shadow-lg tw-max-h-60 tw-overflow-y-auto tw-z-50\">\n <!-- Search Input (if searchable and showSearchInput is true) -->\n @if (context?.searchable && showSearchInput) {\n <div class=\"tw-p-2 tw-border-b tw-border-gray-200\">\n <input #searchInput type=\"text\" placeholder=\"Search options...\" [value]=\"context?.searchTerm\"\n (input)=\"context?.onSearchInput($event)\" (mousedown)=\"onDropdownMouseDown()\" (focus)=\"onDropdownMouseDown()\"\n (click)=\"$event.stopPropagation()\" (blur)=\"onSearchInputBlur($event)\"\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\n <!-- Options List -->\n <div class=\"tw-py-1\">\n <!-- Loading State -->\n @if (context?.loading) {\n <div 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\"\n 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\"\n 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\">\n </path>\n </svg>\n <span class=\"tw-text-sm tw-text-gray-500\">Loading...</span>\n </div>\n </div>\n }\n <!-- Options -->\n @if (!context?.loading) {\n @for (option of context?.options; track $index) {\n <button type=\"button\" (mousedown)=\"onDropdownMouseDown()\" (click)=\"context?.selectOption(option)\"\n (keyup.enter)=\"context?.selectOption(option)\" (keyup.space)=\"context?.selectOption(option)\"\n [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': context?.isOptionSelected(option),\n 'tw-text-gray-400 tw-cursor-not-allowed': option.disabled\n }\" class=\"cide-select-option\">\n {{ context?.getOptionLabel(option) }}\n </button>\n }\n }\n\n <!-- No options message -->\n @if (!context?.loading && context?.options.length === 0) {\n <div class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic\">\n {{ context?.searchable && context?.searchTerm ? 'No options found' : 'No options available' }}\n </div>\n }\n </div>\n </div>\n</ng-template>","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> ","/**\r\n * File Manager Interfaces\r\n * Based on core_file_manager table schema\r\n */\r\n\r\nexport interface ICoreCyfm {\r\n _id?: string;\r\n cyfm_name?: string;\r\n cyfm_alt_text?: string;\r\n cyfm_path?: string;\r\n cyfm_size_in_byte?: number;\r\n cyfm_type?: string;\r\n cyfm_creation_dt?: string;\r\n cyfm_id_user?: string;\r\n cyfm_permissions?: string[];\r\n cyfm_tags?: string[];\r\n cyfm_version?: number;\r\n cyfm_file_status_sygmt?: string;\r\n cyfm_isactive?: boolean;\r\n}\r\n\r\nexport interface ICoreFileManager extends ICoreCyfm {\r\n _id: string;\r\n cyfm_name: string;\r\n cyfm_path: string;\r\n cyfm_size_in_byte: number;\r\n cyfm_type: string;\r\n cyfm_creation_dt: string;\r\n cyfm_id_user: string;\r\n cyfm_permissions: string[];\r\n cyfm_tags: string[];\r\n cyfm_version: number;\r\n cyfm_file_status_sygmt: string;\r\n cyfm_isactive: boolean;\r\n}\r\n\r\nexport interface controllerResponse {\r\n success?: boolean; // true or false\r\n error_code?: string; // general master error codes\r\n message?: string; // special message we will connect this with general master in future for language achivment\r\n data?: any; //custom data\r\n code?: string; // like 200\r\n action?: string; // code to take conditionla action on save erro code\r\n total?: number; // for pagination calls\r\n pageIndex?: number; //for pagination\r\n pageSize?: number; //for pagination\r\n controls?: { [key: string]: string }; // error controls name and message\r\n}\r\n\r\nexport type IFileManagerErrorLogger = {\r\n [key in keyof MFileManager]: string;\r\n};\r\n\r\nexport class MFileManager {\r\n public cyfm_id: string = \"\";\r\n\r\n constructor(init: MFileManager) {\r\n Object.assign(this, init);\r\n }\r\n\r\n Validate?(): Partial<IFileManagerErrorLogger> {\r\n let errorLogger: Partial<IFileManagerErrorLogger> = {};\r\n // Log errors here\r\n if (!this.cyfm_id) {\r\n errorLogger.cyfm_id = \"File ID is Required!\";\r\n }\r\n\r\n return errorLogger;\r\n }\r\n}\r\n\r\nexport class ICoreCyfmSave implements ICoreCyfm {\r\n _id?: string;\r\n cyfm_name?: string;\r\n cyfm_alt_text?: string;\r\n cyfm_path?: string;\r\n cyfm_size_in_byte?: number;\r\n cyfm_type?: string;\r\n cyfm_creation_dt?: string;\r\n cyfm_id_user?: string;\r\n cyfm_permissions?: string[];\r\n cyfm_tags?: string[];\r\n cyfm_version?: number;\r\n cyfm_file_status_sygmt?: string;\r\n cyfm_isactive?: boolean;\r\n cyfm_file_base64: string = \"\";\r\n cyfm_temp_unique_id: string = \"\";\r\n\r\n constructor(init: ICoreCyfmSave) {\r\n Object.assign(this, init);\r\n }\r\n}\r\n\r\nexport class CoreFileManagerInsertUpdatePayload {\r\n core_file_manager_new: ICoreCyfmSave[] = [];\r\n core_file_manager_update: ICoreCyfm[] = [];\r\n core_file_manager_delete: ICoreCyfm[] = [];\r\n\r\n constructor(init: CoreFileManagerInsertUpdatePayload) {\r\n Object.assign(this, init);\r\n }\r\n\r\n Validate?(): Partial<IFileManagerErrorLogger> {\r\n let errorLogger: Partial<IFileManagerErrorLogger> = {};\r\n // Log errors here\r\n\r\n return errorLogger;\r\n }\r\n}\r\n\r\nexport interface fileManagerResponseData extends ICoreCyfm {\r\n cyfm_file_base64: string\r\n}\r\n\r\nexport interface fileManagerControllerResponse extends controllerResponse {\r\n data?: fileManagerResponseData[]\r\n}\r\n\r\nexport interface CoreFileManagerInsertUpdateResponse extends controllerResponse {\r\n data?: {\r\n core_file_manager: {\r\n cyfm_id: string;\r\n cyfm_temp_unique_id: string;\r\n }[];\r\n }\r\n}\r\n\r\nexport interface IFileUploadRequest {\r\n file: File;\r\n altText?: string;\r\n tags?: string[];\r\n permissions?: string[];\r\n userId: string;\r\n}\r\n\r\nexport interface IFileUploadResponse {\r\n success: boolean;\r\n message: string;\r\n data?: ICoreFileManager;\r\n error?: string;\r\n}\r\n\r\nexport interface IFileListRequest {\r\n pageIndex: number;\r\n pageSize: number;\r\n search?: string;\r\n fileType?: string;\r\n status?: string;\r\n userId?: string;\r\n tags?: string[];\r\n sortBy?: string;\r\n sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\nexport interface IFileListResponse {\r\n success: boolean;\r\n message: string;\r\n data: ICoreFileManager[];\r\n total: number;\r\n pageIndex: number;\r\n pageSize: number;\r\n}\r\n\r\nexport interface IFileDeleteResponse {\r\n success: boolean;\r\n message: string;\r\n data?: string;\r\n}\r\n\r\nexport interface IFileUpdateRequest {\r\n _id: string;\r\n cyfm_name?: string;\r\n cyfm_alt_text?: string;\r\n cyfm_tags?: string[];\r\n cyfm_permissions?: string[];\r\n cyfm_file_status_sygmt?: string;\r\n cyfm_isactive?: boolean;\r\n}\r\n\r\nexport interface IFileUpdateResponse {\r\n success: boolean;\r\n message: string;\r\n data?: ICoreFileManager;\r\n}\r\n\r\nexport interface IFileUploadProgress {\r\n fileId: string;\r\n fileName: string;\r\n progress: number;\r\n status: 'pending' | 'uploading' | 'completed' | 'error' | 'cancelled';\r\n error?: string;\r\n uploadedFile?: ICoreFileManager;\r\n}\r\n\r\nexport interface IFileUploadQueueItem extends IFileUploadProgress {\r\n file: File;\r\n}\r\n\r\nexport interface IFileFilterOptions {\r\n fileTypes: string[];\r\n statuses: string[];\r\n dateRange?: {\r\n start: Date;\r\n end: Date;\r\n };\r\n sizeRange?: {\r\n min: number;\r\n max: number;\r\n };\r\n tags: string[];\r\n}\r\n\r\nexport interface IFileGroupingOptions {\r\n groupBy: 'type' | 'status' | 'date' | 'size' | 'user' | 'none';\r\n sortBy: 'name' | 'size' | 'date' | 'type';\r\n sortOrder: 'asc' | 'desc';\r\n}\r\n","import { Injectable, signal, computed, inject, DestroyRef } from '@angular/core';\nimport { HttpClient, HttpErrorResponse, HttpEventType } from '@angular/common/http';\nimport { Observable, BehaviorSubject, throwError, retry, catchError, finalize } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CoreFileManagerInsertUpdatePayload, CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData, MFileManager } from '../interfaces/core-file-manager.interface';\n\n\n\nexport interface FileUploadOptions {\n altText?: string;\n userId?: string;\n permissions?: string[];\n tags?: string[];\n fileStatus?: string;\n retryAttempts?: number;\n timeout?: number;\n [key: string]: string | number | string[] | undefined; // Allow additional properties with proper typing\n}\n\nexport interface UploadProgress {\n loaded: number;\n total: number;\n percentage: number;\n stage: 'reading' | 'uploading' | 'complete' | 'error';\n}\n\nexport interface ServiceState {\n isUploading: boolean;\n uploadQueue: string[];\n activeUploads: Map<string, UploadProgress>;\n error: string | null;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideEleFileManagerService {\n // Angular 20: Modern dependency injection\n private readonly http = inject(HttpClient);\n private readonly destroyRef = inject(DestroyRef);\n \n // Angular 20: Signal-based state management\n private readonly _baseUrl = signal('/api');\n private readonly _isUploading = signal(false);\n private readonly _uploadQueue = signal<string[]>([]);\n private readonly _activeUploads = signal<Map<string, UploadProgress>>(new Map());\n private readonly _error = signal<string | null>(null);\n \n // Angular 20: Computed values\n readonly baseUrl = this._baseUrl.asReadonly();\n readonly isUploading = this._isUploading.asReadonly();\n readonly uploadQueue = this._uploadQueue.asReadonly();\n readonly activeUploads = this._activeUploads.asReadonly();\n readonly error = this._error.asReadonly();\n \n readonly hasActiveUploads = computed(() => this._activeUploads().size > 0);\n readonly queueLength = computed(() => this._uploadQueue().length);\n readonly serviceState = computed(() => ({\n isUploading: this._isUploading(),\n uploadQueue: this._uploadQueue(),\n activeUploads: this._activeUploads(),\n error: this._error()\n }));\n\n constructor() {\n console.log('🚀 [FileManagerService] Angular 20 service initialized');\n }\n\n /**\n * Upload a file with base64 encoding and progress tracking\n * Angular 20: Enhanced with better error handling, retry logic, and signal-based state\n * @param file The file to upload\n * @param options Upload options and additional data\n * @param progressCallback Optional callback for progress updates\n * @returns Observable with the upload response\n */\n uploadFile(file: File, options?: FileUploadOptions, progressCallback?: (progress: number) => void): Observable<CoreFileManagerInsertUpdateResponse> {\n const fileId = this.generateFileId(file);\n const uploadOptions = { retryAttempts: 3, timeout: 30000, ...options };\n \n // Angular 20: Update service state\n this._isUploading.set(true);\n this._error.set(null);\n this.addToUploadQueue(fileId);\n \n console.log('📤 [FileManagerService] Starting upload for:', file.name, 'Size:', file.size, 'bytes');\n \n return new Observable<CoreFileManagerInsertUpdateResponse>(observer => {\n const reader = new FileReader();\n \n // Angular 20: Enhanced progress tracking with signals\n reader.onprogress = (event) => {\n if (event.lengthComputable && progressCallback) {\n const progress = (event.loaded / event.total) * 50; // File reading is 50% of total progress\n progressCallback(progress);\n this.updateUploadProgress(fileId, {\n loaded: event.loaded,\n total: event.total,\n percentage: progress,\n stage: 'reading'\n });\n }\n };\n \n reader.onload = () => {\n try {\n const base64String = reader.result as string;\n const base64Data = base64String.split(',')[1]; // Remove data:image/jpeg;base64, prefix\n \n // Update progress to 50% (file reading complete)\n if (progressCallback) {\n progressCallback(50);\n }\n this.updateUploadProgress(fileId, {\n loaded: 50,\n total: 100,\n percentage: 50,\n stage: 'uploading'\n });\n \n // Create the file data object with proper typing\n const fileData = {\n cyfm_name: file.name,\n cyfm_alt_text: uploadOptions?.altText || file.name,\n cyfm_path: '', // Will be set by backend\n cyfm_size_in_byte: file.size,\n cyfm_type: file.type,\n cyfm_creation_dt: new Date().toISOString(),\n cyfm_id_user: uploadOptions?.userId || '',\n cyfm_permissions: [] as [], // Match the interface type\n cyfm_tags: uploadOptions?.tags || [],\n cyfm_version: 1,\n cyfm_file_status_sygmt: uploadOptions?.fileStatus || 'file_manager_file_status_active',\n cyfm_isactive: true,\n cyfm_file_base64: base64Data,\n cyfm_temp_unique_id: fileId\n };\n\n // Create the payload with proper typing\n const payload: CoreFileManagerInsertUpdatePayload = new CoreFileManagerInsertUpdatePayload({\n core_file_manager_new: [fileData],\n core_file_manager_update: [],\n core_file_manager_delete: []\n });\n\n // Angular 20: Enhanced HTTP request with retry logic and better error handling\n // Use proper API endpoint from cloud-ide-lms-model\n this.http.post<CoreFileManagerInsertUpdateResponse>(`${this._baseUrl()}/upload`, payload, {\n reportProgress: true,\n observe: 'events'\n }).pipe(\n retry(uploadOptions.retryAttempts || 3),\n catchError(this.handleError.bind(this)),\n finalize(() => {\n this.removeFromUploadQueue(fileId);\n this.removeActiveUpload(fileId);\n if (this._uploadQueue().length === 0) {\n this._isUploading.set(false);\n }\n }),\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (event: any) => {\n if (event.type === HttpEventType.UploadProgress && progressCallback) {\n const uploadProgress = (event.loaded / event.total) * 50; // Upload is remaining 50%\n const totalProgress = 50 + uploadProgress; // Total progress (50% file reading + upload progress)\n progressCallback(totalProgress);\n this.updateUploadProgress(fileId, {\n loaded: event.loaded,\n total: event.total,\n percentage: totalProgress,\n stage: 'uploading'\n });\n } else if (event.type === HttpEventType.Response) {\n if (progressCallback) {\n progressCallback(100);\n }\n this.updateUploadProgress(fileId, {\n loaded: 100,\n total: 100,\n percentage: 100,\n stage: 'complete'\n });\n console.log('✅ [FileManagerService] Upload successful:', event.body);\n \n // Handle the CoreFileManagerInsertUpdateResponse\n const response = event.body as CoreFileManagerInsertUpdateResponse;\n if (response.success) {\n observer.next(response);\n observer.complete();\n } else {\n observer.error(new Error(response.message || 'Upload failed'));\n }\n }\n },\n error: (error) => {\n console.error('❌ [FileManagerService] Upload failed:', error);\n this._error.set(error.message || 'Upload failed');\n this.updateUploadProgress(fileId, {\n loaded: 0,\n total: 100,\n percentage: 0,\n stage: 'error'\n });\n observer.error(error);\n }\n });\n } catch (error) {\n console.error('❌ [FileManagerService] File processing error:', error);\n this._error.set('Failed to process file');\n observer.error(error);\n }\n };\n \n reader.onerror = () => {\n console.error('❌ [FileManagerService] File reading failed');\n this._error.set('Failed to read file');\n observer.error(new Error('Failed to read file'));\n };\n \n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Set the base URL for API calls\n * Angular 20: Using signal-based state management\n * @param url The base URL for the API\n */\n setBaseUrl(url: string): void {\n console.log('🔍 [FileManagerService] Setting base URL:', url);\n this._baseUrl.set(url);\n }\n\n /**\n * Angular 20: Helper methods for state management\n */\n private generateFileId(file: File): string {\n return `${file.name}_${file.size}_${Date.now()}`;\n }\n\n private addToUploadQueue(fileId: string): void {\n const currentQueue = this._uploadQueue();\n this._uploadQueue.set([...currentQueue, fileId]);\n }\n\n private removeFromUploadQueue(fileId: string): void {\n const currentQueue = this._uploadQueue();\n this._uploadQueue.set(currentQueue.filter(id => id !== fileId));\n }\n\n private updateUploadProgress(fileId: string, progress: UploadProgress): void {\n const currentUploads = new Map(this._activeUploads());\n currentUploads.set(fileId, progress);\n this._activeUploads.set(currentUploads);\n }\n\n private removeActiveUpload(fileId: string): void {\n const currentUploads = new Map(this._activeUploads());\n currentUploads.delete(fileId);\n this._activeUploads.set(currentUploads);\n }\n\n /**\n * Angular 20: Enhanced error handling\n */\n private handleError(error: HttpErrorResponse): Observable<never> {\n let errorMessage = 'An unknown error occurred';\n \n if (error.error instanceof ErrorEvent) {\n // Client-side error\n errorMessage = `Client Error: ${error.error.message}`;\n } else {\n // Server-side error\n errorMessage = `Server Error: ${error.status} - ${error.message}`;\n }\n \n console.error('❌ [FileManagerService] HTTP Error:', errorMessage);\n this._error.set(errorMessage);\n \n return throwError(() => new Error(errorMessage));\n }\n\n /**\n * Get file details by ID\n * @param payload The file ID to fetch details for\n * @returns Observable with file details\n */\n getFileDetails(payload: MFileManager): Observable<fileManagerControllerResponse> {\n console.log('🔍 [FileManagerService] Fetching file details for ID:', payload.cyfm_id);\n \n return this.http.post<fileManagerControllerResponse>(`${this._baseUrl()}`, payload).pipe(\n retry(2),\n catchError(this.handleError.bind(this)),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n /**\n * Angular 20: Service utility methods\n */\n clearError(): void {\n this._error.set(null);\n }\n\n getUploadProgress(fileId: string): UploadProgress | undefined {\n return this._activeUploads().get(fileId);\n }\n\n cancelUpload(fileId: string): void {\n this.removeFromUploadQueue(fileId);\n this.removeActiveUpload(fileId);\n console.log('🚫 [FileManagerService] Upload cancelled for:', fileId);\n }\n\n /**\n * Angular 20: File validation utility\n */\n validateFile(file: File, maxSizeMB: number = 10, allowedTypes: string[] = []): { valid: boolean; error?: string } {\n // Check file size\n const maxSizeBytes = maxSizeMB * 1024 * 1024; // Convert MB to bytes\n if (file.size > maxSizeBytes) {\n return { valid: false, error: `File size exceeds ${maxSizeMB}MB limit` };\n }\n\n // Check file type\n if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\n return { valid: false, error: `File type ${file.type} is not allowed` };\n }\n\n return { valid: true };\n }\n}\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 progress?: number; // Progress percentage (0-100)\r\n showProgress?: boolean; // Whether to show progress bar\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 progress?: number; // Progress percentage (0-100)\r\n showProgress?: boolean; // Whether to show progress bar\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 * Show a progress notification\r\n */\r\n showProgress(\r\n message: string,\r\n progress: number = 0,\r\n options?: Partial<NotificationOptions>\r\n ): string {\r\n return this.show({\r\n message,\r\n type: 'info',\r\n icon: 'upload',\r\n duration: 0, // Don't auto-dismiss\r\n progress,\r\n showProgress: true,\r\n ...options\r\n });\r\n }\r\n\r\n /**\r\n * Update progress for an existing notification\r\n */\r\n updateProgress(id: string, progress: number, message?: string): void {\r\n this.notifications.update(notifications => \r\n notifications.map(n => \r\n n.id === id ? { \r\n ...n, \r\n progress: Math.max(0, Math.min(100, progress)),\r\n ...(message && { message })\r\n } : n\r\n )\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 progress: options.progress,\r\n showProgress: options.showProgress || false\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 { CommonModule } from '@angular/common';\nimport { \n Component, \n EventEmitter, \n Input, \n Output, \n OnDestroy, \n OnInit,\n inject, \n signal, \n computed, \n effect, \n DestroyRef, \n afterRenderEffect,\n afterNextRender,\n PendingTasks\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule, Validator, NG_VALIDATORS, AbstractControl, ValidationErrors } from '@angular/forms';\nimport { CideIconComponent } from '../icon/icon.component';\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData } from '../../interfaces/core-file-manager.interface';\n\n/**\n * Angular 20: Proper TypeScript interface for file upload data\n * This interface defines the structure of additional data that can be sent with file uploads\n */\nexport interface FileUploadData {\n /** Alternative text for the uploaded file (useful for accessibility) */\n altText?: string;\n /** User ID associated with the upload */\n userId?: string;\n /** Array of permissions for the uploaded file */\n permissions?: string[];\n /** Array of tags to categorize the uploaded file */\n tags?: string[];\n /** Status of the file (e.g., 'active', 'pending', 'archived') */\n fileStatus?: \"file_manager_file_status_active\";\n /** Allow additional properties with proper typing */\n [key: string]: string | number | string[] | undefined;\n}\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, CideIconComponent],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: CideEleFileInputComponent,\n multi: true\n },\n {\n provide: NG_VALIDATORS,\n useExisting: CideEleFileInputComponent,\n multi: true\n }\n ]\n})\nexport class CideEleFileInputComponent implements ControlValueAccessor, OnDestroy, OnInit, Validator {\n private readonly fileManagerService = inject(CideEleFileManagerService);\n private readonly notificationService = inject(NotificationService);\n private readonly elementService = inject(CideElementsService);\n private readonly destroyRef = inject(DestroyRef);\n // private readonly pendingTasks = inject(PendingTasks); // TODO: Fix PendingTasks API usage\n \n // Traditional @Input() decorators\n @Input() label: string = 'Choose file';\n @Input() accept: string = '';\n @Input() multiple: boolean = false;\n @Input() disabled: boolean = false;\n @Input() required: 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() showFileName: boolean = true;\n @Input() placeholderText: string = 'Click to select image';\n @Input() placeholderIcon: string = '📷';\n @Input() autoUpload: boolean = false;\n @Input() uploadData: FileUploadData = {};\n\n // Traditional @Output() decorators\n @Output() fileChange = new EventEmitter<FileList | null>();\n @Output() uploadSuccess = new EventEmitter<string>();\n @Output() uploadError = new EventEmitter<string>();\n @Output() uploadProgressChange = new EventEmitter<number>();\n\n // Readable signals created from @Input() decorator values\n readonly labelSignal = signal(this.label);\n readonly acceptSignal = signal(this.accept);\n readonly multipleSignal = signal(this.multiple);\n readonly disabledSignal = signal(this.disabled);\n readonly requiredSignal = signal(this.required);\n readonly helperTextSignal = signal(this.helperText);\n readonly errorTextSignal = signal(this.errorText);\n readonly showPreviewSignal = signal(this.showPreview);\n readonly previewWidthSignal = signal(this.previewWidth);\n readonly previewHeightSignal = signal(this.previewHeight);\n readonly previewBoxModeSignal = signal(this.previewBoxMode);\n readonly showFileNameSignal = signal(this.showFileName);\n readonly placeholderTextSignal = signal(this.placeholderText);\n readonly placeholderIconSignal = signal(this.placeholderIcon);\n readonly autoUploadSignal = signal(this.autoUpload);\n readonly uploadDataSignal = signal(this.uploadData);\n\n // Reactive state with signals\n readonly id = signal(Math.random().toString(36).substring(2, 10));\n readonly isUploading = signal(false);\n readonly uploadProgress = signal(0);\n readonly uploadStatus = signal<'idle' | 'start' | 'uploading' | 'success' | 'error'>('idle');\n readonly files = signal<FileList | null>(null);\n readonly fileNames = signal<string[]>([]);\n readonly previewUrls = signal<string[]>([]);\n readonly uploadNotificationId = signal<string | null>(null);\n readonly isDragOver = signal(false);\n \n // Computed signals for better relationships\n readonly hasFiles = computed(() => this.files() !== null && this.files()!.length > 0);\n readonly canUpload = computed(() => this.hasFiles() && !this.isUploading() && !this.disabledSignal());\n readonly isInErrorState = computed(() => this.uploadStatus() === 'error');\n readonly isInSuccessState = computed(() => this.uploadStatus() === 'success');\n \n // Angular 20: Computed values using new features\n readonly totalFileSize = computed(() => {\n if (!this.files()) return 0;\n return Array.from(this.files()!).reduce((total, file) => total + file.size, 0);\n });\n \n readonly fileSizeInMB = computed(() => {\n // Angular 20: Using ** operator for exponentiation\n return (this.totalFileSize() / (1024 ** 2)).toFixed(2);\n });\n \n readonly uploadProgressPercentage = computed(() => {\n // Angular 20: Using ** operator for exponentiation\n return Math.round(this.uploadProgress() ** 1); // Simple power operation\n });\n\n // ControlValueAccessor callbacks\n private onChange = (value: FileList | string | null) => {};\n private onTouched = () => {};\n private onValidatorChange = () => {};\n\n // Computed values\n readonly hasImages = computed(() => this.previewUrls().length > 0);\n readonly isPreviewBoxMode = computed(() => this.previewBoxModeSignal() && this.showPreviewSignal());\n readonly isImagePreviewAvailable = computed(() => this.showPreviewSignal() && this.previewUrls().length > 0);\n\n constructor() {\n // Angular 20: afterRenderEffect for DOM operations\n afterRenderEffect(() => {\n // Update file input element when files change\n if (this.files()) {\n const fileInput = document.getElementById('cide-file-input-' + this.id()) as HTMLInputElement;\n if (fileInput) {\n // Ensure the input reflects the current state\n fileInput.files = this.files();\n }\n }\n });\n\n // Angular 20: afterNextRender for one-time DOM operations\n afterNextRender(() => {\n console.log('🎯 [FileInput] Component rendered and DOM is ready');\n });\n }\n\n ngOnInit() {\n // Update signals with initial @Input() values\n this.labelSignal.set(this.label);\n this.acceptSignal.set(this.accept);\n this.multipleSignal.set(this.multiple);\n this.disabledSignal.set(this.disabled);\n this.requiredSignal.set(this.required);\n this.helperTextSignal.set(this.helperText);\n this.errorTextSignal.set(this.errorText);\n this.showPreviewSignal.set(this.showPreview);\n this.previewWidthSignal.set(this.previewWidth);\n this.previewHeightSignal.set(this.previewHeight);\n this.previewBoxModeSignal.set(this.previewBoxMode);\n this.showFileNameSignal.set(this.showFileName);\n this.placeholderTextSignal.set(this.placeholderText);\n this.placeholderIconSignal.set(this.placeholderIcon);\n this.autoUploadSignal.set(this.autoUpload);\n this.uploadDataSignal.set(this.uploadData);\n }\n\n writeValue(value: FileList | string | null): void {\n console.log('📝 [FileInput] writeValue called with:', value);\n \n if (typeof value === 'string') {\n // Value is an uploaded file ID - fetch file details and set preview\n console.log('📝 [FileInput] Value is uploaded file ID:', value);\n this.files.set(null);\n this.fileNames.set([]);\n this.clearPreviews();\n \n // Fetch file details to get base64 and set preview\n this.loadFileDetailsFromId(value);\n } else if (value instanceof FileList) {\n // Value is a FileList\n console.log('📝 [FileInput] Value is FileList:', Array.from(value).map(f => f.name));\n this.files.set(value);\n this.fileNames.set(Array.from(value).map(f => f.name));\n this.generatePreviews();\n } else {\n // Value is null\n console.log('📝 [FileInput] Value is null');\n this.files.set(null);\n this.fileNames.set([]);\n this.clearPreviews();\n }\n }\n\n registerOnChange(fn: (value: FileList | string | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n registerOnValidatorChange(fn: () => void): void {\n this.onValidatorChange = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n // Note: With input signals, disabled state is controlled by the parent component\n // This method is kept for ControlValueAccessor compatibility but doesn't modify the signal\n console.log('🔧 [FileInput] setDisabledState called with:', isDisabled, '(controlled by parent component)');\n }\n\n onFileSelected(event: Event) {\n console.log('🔍 [FileInput] onFileSelected called');\n const input = event.target as HTMLInputElement;\n const selectedFiles = input.files;\n \n this.files.set(selectedFiles);\n this.fileNames.set(selectedFiles ? Array.from(selectedFiles).map(f => f.name) : []);\n console.log('📁 [FileInput] Files selected:', this.fileNames());\n this.generatePreviews();\n \n // Reset upload status when new file is selected\n this.uploadStatus.set('idle');\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n \n this.onChange(selectedFiles);\n this.fileChange.emit(selectedFiles);\n this.onTouched();\n\n // Auto upload if enabled\n if (this.autoUploadSignal() && selectedFiles && selectedFiles.length > 0) {\n console.log('🚀 [FileInput] Auto upload enabled, starting upload for:', selectedFiles[0].name);\n this.uploadFile(selectedFiles[0]);\n } else {\n console.log('⏸️ [FileInput] Auto upload disabled or no files');\n }\n }\n\n clearFiles() {\n console.log('🗑️ [FileInput] clearFiles called');\n this.files.set(null);\n this.fileNames.set([]);\n this.clearPreviews();\n this.uploadStatus.set('idle');\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n this.onChange(null);\n this.fileChange.emit(null);\n }\n\n private uploadFile(file: File) {\n console.log('📤 [FileInput] uploadFile called for:', file.name, 'Size:', file.size, 'bytes');\n \n // Angular 20: Use PendingTasks for better loading state management\n // const uploadTask = this.pendingTasks.add(); // TODO: Fix PendingTasks API usage\n // console.log('⏳ [FileInput] Pending task added for upload tracking');\n \n // Set upload status to 'start' before starting upload\n this.uploadStatus.set('start');\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n \n this.isUploading.set(true);\n this.uploadProgress.set(0);\n this.uploadProgressChange.emit(0);\n console.log('📊 [FileInput] Upload progress initialized to 0%');\n \n // Make form control invalid during upload - this prevents form submission\n this.onChange(null);\n console.log('🚫 [FileInput] Form control value set to null to prevent submission');\n \n // Show initial progress notification with spinner (persistent - no auto-dismiss)\n const notificationId = this.notificationService.showProgress('🔄 Preparing file upload...', 0, { duration: 0 });\n this.uploadNotificationId.set(notificationId);\n console.log('🔔 [FileInput] Progress notification started with ID:', notificationId);\n\n this.fileManagerService.uploadFile(file, this.uploadDataSignal(), (progress: number) => {\n // Real progress callback from file manager service\n this.uploadProgress.set(progress);\n this.uploadProgressChange.emit(progress);\n console.log('📈 [FileInput] Upload progress:', Math.round(progress) + '%');\n \n // Set upload status to 'uploading' when progress starts\n if (this.uploadStatus() === 'start') {\n this.uploadStatus.set('uploading');\n console.log('🔄 [FileInput] Upload status changed to:', this.uploadStatus());\n }\n \n // Update progress notification with spinner\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n let progressMessage = '';\n if (progress < 10) {\n progressMessage = '🔄 Starting upload...';\n } else if (progress < 25) {\n progressMessage = '🔄 Uploading file...';\n } else if (progress < 50) {\n progressMessage = '🔄 Upload in progress...';\n } else if (progress < 75) {\n progressMessage = '🔄 Almost done...';\n } else if (progress < 95) {\n progressMessage = '🔄 Finishing upload...';\n } else {\n progressMessage = '🔄 Finalizing...';\n }\n \n this.notificationService.updateProgress(\n notificationId,\n progress,\n progressMessage\n );\n }\n }).pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (response: CoreFileManagerInsertUpdateResponse) => {\n console.log('🎉 [FileInput] Upload SUCCESS - Response received:', response);\n \n // Angular 20: Complete the pending task\n // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\n // console.log('✅ [FileInput] Pending task completed for successful upload');\n \n // Set upload status to 'success'\n this.uploadStatus.set('success');\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n \n // Complete the progress\n this.uploadProgress.set(100);\n this.uploadProgressChange.emit(100);\n console.log('📊 [FileInput] Upload progress completed: 100%');\n \n // Update progress notification to complete\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n console.log('🔔 [FileInput] Progress notification removed');\n }\n this.notificationService.success('✅ File uploaded successfully!', { duration: 0 });\n this.uploadNotificationId.set(null);\n \n // Extract ID from CoreFileManagerInsertUpdateResponse\n const uploadedId = response?.data?.core_file_manager?.[0]?.cyfm_id;\n if (uploadedId) {\n console.log('✅ [FileInput] File uploaded successfully with ID:', uploadedId);\n \n // Set the uploaded ID as the form control value\n this.onChange(uploadedId);\n console.log('📝 [FileInput] Form control value set to uploaded ID:', uploadedId);\n \n this.uploadSuccess.emit(uploadedId);\n console.log('📝 [FileInput] Upload success event emitted with file ID:', uploadedId);\n } else {\n console.error('❌ [FileInput] Upload successful but no ID returned:', response);\n this.uploadError.emit('Upload successful but no ID returned');\n }\n this.isUploading.set(false);\n console.log('🔄 [FileInput] isUploading set to false');\n },\n error: (error) => {\n console.error('💥 [FileInput] Upload FAILED:', error);\n \n // Angular 20: Complete the pending task even on error\n // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\n // console.log('❌ [FileInput] Pending task completed for failed upload');\n \n // Set upload status to 'error' and remove upload validation error\n this.uploadStatus.set('error');\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\n \n // Remove progress notification and show error\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n console.log('🔔 [FileInput] Progress notification removed due to error');\n }\n this.notificationService.error(`❌ File upload failed: ${error.message || error.error?.message || 'Unknown error occurred'}`, { duration: 0 });\n this.uploadNotificationId.set(null);\n \n this.uploadError.emit(error.message || error.error?.message || 'Upload failed');\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n this.uploadProgressChange.emit(0);\n console.log('🔄 [FileInput] Upload state reset - isUploading: false, progress: 0%');\n }\n });\n }\n\n\n private generatePreviews() {\n // Clear existing previews\n this.clearPreviews();\n\n if (!this.showPreviewSignal() || !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.update(urls => [...urls, 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.set([]);\n }\n\n private isImageFile(file: File): boolean {\n return file.type.startsWith('image/');\n }\n\n private loadFileDetailsFromId(fileId: string): void {\n console.log('🔍 [FileInput] Loading file details for ID:', fileId);\n if(!fileId) return;\n this.fileManagerService?.getFileDetails({ cyfm_id: fileId })?.pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (fileDetails: fileManagerControllerResponse) => {\n console.log('📋 [FileInput] File details received:', fileDetails);\n \n if (fileDetails?.data?.length) {\n const fileData = fileDetails.data[0];\n console.log('📁 [FileInput] File data:', fileData);\n \n // Set file name from the details\n if (fileData.cyfm_name) {\n this.fileNames.set([fileData.cyfm_name]);\n console.log('📝 [FileInput] File name set:', fileData.cyfm_name);\n }\n \n // If it's an image and we have base64 data, set preview\n if (this.showPreviewSignal() && fileData.cyfm_file_base64) {\n // Check if it's an image file based on file name or type\n const isImage = this.isImageFileFromName(fileData.cyfm_name || '') || \n this.isImageFileFromType(fileData.cyfm_type || '');\n \n if (isImage) {\n // Add data URL prefix if not already present\n let base64Data = fileData.cyfm_file_base64;\n if (!base64Data.startsWith('data:')) {\n const mimeType = fileData.cyfm_type || 'image/jpeg';\n base64Data = `data:${mimeType};base64,${base64Data}`;\n }\n \n this.previewUrls.set([base64Data]);\n console.log('🖼️ [FileInput] Preview set from base64 data');\n }\n }\n } else {\n console.warn('⚠️ [FileInput] No file data found for ID:', fileId);\n }\n },\n error: (error: any) => {\n console.error('❌ [FileInput] Error loading file details:', error);\n this.notificationService.error(`Failed to load file details: ${error.message || 'Unknown error'}`, { duration: 0 });\n }\n });\n }\n\n private isImageFileFromName(fileName: string): boolean {\n if (!fileName) return false;\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg'];\n const lowerFileName = fileName.toLowerCase();\n return imageExtensions.some(ext => lowerFileName.endsWith(ext));\n }\n\n private isImageFileFromType(fileType: string): boolean {\n if (!fileType) return false;\n return fileType.startsWith('image/');\n }\n\n removePreview(index: number) {\n const currentFiles = this.files();\n const currentUrls = this.previewUrls();\n \n if (currentFiles && currentFiles.length > index) {\n // Handle FileList case - remove file from FileList\n const dt = new DataTransfer();\n Array.from(currentFiles).forEach((file, i) => {\n if (i !== index) {\n dt.items.add(file);\n }\n });\n \n const newFiles = dt.files;\n this.files.set(newFiles);\n this.fileNames.set(Array.from(newFiles).map(f => f.name));\n \n // Remove the preview URL\n if (currentUrls[index] && currentUrls[index].startsWith('blob:')) {\n URL.revokeObjectURL(currentUrls[index]);\n }\n this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\n \n this.onChange(newFiles);\n this.fileChange.emit(newFiles);\n } else if (currentUrls.length > index) {\n // Handle uploaded file ID case - clear the preview and set control value to null\n console.log('🗑️ [FileInput] Removing preview for uploaded file ID');\n \n // Clear preview\n this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\n this.fileNames.set([]);\n \n // Set control value to null since we're removing the uploaded file\n this.onChange(null);\n this.fileChange.emit(null);\n }\n }\n\n ngOnDestroy() {\n // Clean up preview URLs to prevent memory leaks\n this.clearPreviews();\n \n // Clean up any active upload notification\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n this.uploadNotificationId.set(null);\n }\n }\n\n triggerFileSelect() {\n const fileInput = document.getElementById('cide-file-input-' + this.id()) as HTMLInputElement;\n if (fileInput && !this.disabledSignal()) {\n fileInput.click();\n }\n }\n\n // Drag and Drop Event Handlers\n onDragOver(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (!this.disabledSignal()) {\n this.isDragOver.set(true);\n console.log('🔄 [FileInput] Drag over detected');\n }\n }\n\n onDragLeave(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n console.log('🔄 [FileInput] Drag leave detected');\n }\n\n onDragEnter(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n if (!this.disabledSignal()) {\n this.isDragOver.set(true);\n console.log('🔄 [FileInput] Drag enter detected');\n }\n }\n\n onDrop(event: DragEvent) {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n \n if (this.disabledSignal()) {\n console.log('⏸️ [FileInput] Drop ignored - component is disabled');\n return;\n }\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n console.log('📁 [FileInput] Files dropped:', Array.from(files).map(f => f.name));\n \n // Validate file types if accept is specified\n if (this.acceptSignal() && !this.validateFileTypes(files)) {\n console.log('❌ [FileInput] Invalid file types dropped');\n this.notificationService.error('❌ Invalid file type. Please select files of the correct type.', { duration: 0 });\n return;\n }\n\n // Handle single vs multiple files\n if (!this.multipleSignal() && files.length > 1) {\n console.log('⚠️ [FileInput] Multiple files dropped but multiple is disabled');\n this.notificationService.warning('⚠️ Only one file is allowed. Using the first file.', { duration: 0 });\n // Create a new FileList with only the first file\n const dt = new DataTransfer();\n dt.items.add(files[0]);\n this.handleFileSelection(dt.files);\n } else {\n this.handleFileSelection(files);\n }\n }\n }\n\n private validateFileTypes(files: FileList): boolean {\n const acceptTypes = this.acceptSignal().split(',').map(type => type.trim());\n if (acceptTypes.length === 0 || acceptTypes[0] === '') return true;\n\n return Array.from(files).every(file => {\n return acceptTypes.some(acceptType => {\n if (acceptType.startsWith('.')) {\n // Extension-based validation\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase());\n } else if (acceptType.includes('/')) {\n // MIME type validation\n return file.type === acceptType || file.type.startsWith(acceptType.replace('*', ''));\n }\n return false;\n });\n });\n }\n\n private handleFileSelection(files: FileList) {\n this.files.set(files);\n this.fileNames.set(Array.from(files).map(f => f.name));\n console.log('📁 [FileInput] Files selected via drag & drop:', this.fileNames());\n this.generatePreviews();\n \n // Reset upload status when new file is selected\n this.uploadStatus.set('idle');\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\n \n this.onChange(files);\n this.fileChange.emit(files);\n this.onTouched();\n\n // Auto upload if enabled\n if (this.autoUploadSignal() && files.length > 0) {\n console.log('🚀 [FileInput] Auto upload enabled, starting upload for:', files[0].name);\n this.uploadFile(files[0]);\n } else {\n console.log('⏸️ [FileInput] Auto upload disabled or no files');\n }\n }\n\n isRequired(): boolean {\n return this.requiredSignal();\n }\n\n /**\n * Angular 20: Utility method to get upload data with proper typing\n * @returns Properly typed upload data\n */\n getUploadData(): FileUploadData {\n return this.uploadDataSignal();\n }\n\n /**\n * Angular 20: Utility method to update upload data with type safety\n * @param data Partial upload data to merge with existing data\n */\n updateUploadData(data: Partial<FileUploadData>): void {\n const currentData = this.uploadDataSignal();\n const updatedData: FileUploadData = { ...currentData, ...data };\n // Note: This would require the uploadData to be a writable signal\n // For now, this method serves as a type-safe way to work with upload data\n console.log('📝 [FileInput] Upload data updated:', updatedData);\n }\n\n getCurrentState() {\n return {\n id: this.id(),\n label: this.labelSignal(),\n required: this.requiredSignal(),\n disabled: this.disabledSignal(),\n accept: this.acceptSignal(),\n multiple: this.multipleSignal(),\n showPreview: this.showPreviewSignal(),\n autoUpload: this.autoUploadSignal(),\n uploadStatus: this.uploadStatus(),\n isUploading: this.isUploading(),\n uploadProgress: this.uploadProgress(),\n files: this.files() ? Array.from(this.files()!).map(f => ({ name: f.name, size: f.size, type: f.type })) : null,\n fileNames: this.fileNames(),\n previewUrls: this.previewUrls().length,\n helperText: this.helperTextSignal(),\n errorText: this.errorTextSignal(),\n placeholderText: this.placeholderTextSignal(),\n placeholderIcon: this.placeholderIconSignal(),\n previewWidth: this.previewWidthSignal(),\n previewHeight: this.previewHeightSignal(),\n previewBoxMode: this.previewBoxModeSignal(),\n showFileName: this.showFileNameSignal(),\n uploadData: this.uploadDataSignal()\n };\n }\n\n async getControlData() {\n console.log('🔍 [FileInput] getControlData called');\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id() });\n if (cide_element_data) {\n console.log('📋 [FileInput] Element data loaded:', cide_element_data);\n \n // Note: Since we're using input signals, we can't directly set their values\n // This method would need to be refactored to work with the new signal-based approach\n // For now, we'll log the data and trigger validation\n console.log('✅ [FileInput] Control data received from element service');\n console.log('⚠️ [FileInput] Note: Input signals cannot be modified after component initialization');\n \n // Trigger validation update\n this.onValidatorChange();\n } else {\n console.log('⚠️ [FileInput] No element data found for key:', this.id());\n }\n }\n\n // Validator implementation\n validate(control: AbstractControl): ValidationErrors | null {\n console.log('🔍 [FileInput] validate() called - uploadStatus:', this.uploadStatus(), 'required:', this.requiredSignal(), 'files:', !!this.files(), 'control.value:', control.value);\n \n // If upload is in progress (start or uploading status), return validation error\n if (this.uploadStatus() === 'start' || this.uploadStatus() === 'uploading') {\n console.log('⚠️ [FileInput] Validation ERROR: Upload in progress');\n return { 'uploadInProgress': { message: 'File upload in progress. Please wait...' } };\n }\n \n // If required and no file is selected and no control value (uploaded file ID), return validation error\n if (this.requiredSignal() && !this.files() && !control.value) {\n console.log('⚠️ [FileInput] Validation ERROR: File required');\n return { 'required': { message: 'Please select a file to upload.' } };\n }\n \n console.log('✅ [FileInput] Validation PASSED: No errors');\n return null; // No validation errors\n }\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 @if (labelSignal() && !isPreviewBoxMode()) {\n <label class=\"cide-file-input-label\" [attr.for]=\"'cide-file-input-' + id()\">\n {{ labelSignal() }}@if (requiredSignal()) {<span class=\"cide-file-input-required\"> *</span>}\n </label>\n }\n \n <!-- Preview Box Mode -->\n @if (isPreviewBoxMode()) {\n <div 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]=\"acceptSignal()\"\n [attr.multiple]=\"multipleSignal() ? true : null\"\n [disabled]=\"disabledSignal()\"\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]=\"disabledSignal()\"\n [class.cide-file-input-preview-box-has-image]=\"hasImages()\"\n [class.cide-file-input-preview-box-drag-over]=\"isDragOver()\"\n [style.width]=\"previewWidthSignal()\"\n [style.height]=\"previewHeightSignal()\"\n (click)=\"triggerFileSelect()\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n [attr.title]=\"disabledSignal() ? 'File selection disabled' : placeholderTextSignal()\">\n \n <!-- No Image State -->\n @if (!hasImages()) {\n <div class=\"cide-file-input-preview-box-placeholder\">\n <div class=\"cide-file-input-preview-box-icon\">\n <cide-ele-icon>{{ isDragOver() ? '📁' : placeholderIconSignal() }}</cide-ele-icon>\n </div>\n <div class=\"cide-file-input-preview-box-text\">\n {{ isDragOver() ? 'Drop files here...' : placeholderTextSignal() }}\n </div>\n </div>\n }\n \n <!-- Image Preview State -->\n @if (hasImages()) {\n <div 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 @if (!disabledSignal()) {\n <button \n type=\"button\" \n class=\"cide-file-input-preview-box-remove\"\n (click)=\"clearFiles(); $event.stopPropagation()\"\n title=\"Remove image\">\n ×\n </button>\n }\n </div>\n }\n </div>\n \n <!-- File name display for preview box mode -->\n @if (hasImages() && fileNames().length && showFileNameSignal()) {\n <div class=\"cide-file-input-preview-box-filename\">\n {{ fileNames()[0] }}\n </div>\n }\n </div>\n }\n\n <!-- Standard Mode -->\n @if (!isPreviewBoxMode()) {\n <div \n class=\"cide-file-input-wrapper\"\n [class.cide-file-input-drag-over]=\"isDragOver()\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n type=\"file\"\n [attr.id]=\"'cide-file-input-' + id()\"\n [attr.accept]=\"acceptSignal()\"\n [attr.multiple]=\"multipleSignal() ? true : null\"\n [disabled]=\"disabledSignal()\"\n (change)=\"onFileSelected($event)\"\n class=\"cide-file-input-element\"\n />\n @if (hasFiles()) {\n <button type=\"button\" class=\"cide-file-input-clear\" (click)=\"clearFiles()\">\n Clear\n </button>\n }\n </div>\n @if (hasFiles() && !isPreviewBoxMode()) {\n <div class=\"cide-file-input-files\">\n @for (name of fileNames(); track name) {\n <span>{{ name }}</span>\n }\n <!-- Angular 20: Display file size using new computed values -->\n @if (totalFileSize() > 0) {\n <div class=\"cide-file-input-size\">\n Total size: {{ fileSizeInMB() }} MB\n </div>\n }\n </div>\n }\n }\n \n <!-- Image Preview Section (only for standard mode) -->\n @if (isImagePreviewAvailable() && !isPreviewBoxMode()) {\n <div class=\"cide-file-input-preview\">\n <div class=\"cide-file-input-preview-label\">Preview:</div>\n <div class=\"cide-file-input-preview-container\">\n @for (previewUrl of previewUrls(); track previewUrl; let i = $index) {\n <div \n class=\"cide-file-input-preview-item\"\n [style.width]=\"previewWidthSignal()\"\n [style.height]=\"previewHeightSignal()\">\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 }\n </div>\n </div>\n }\n \n @if (errorTextSignal()) {\n <div class=\"cide-file-input-error\">{{ errorTextSignal() }}</div>\n }\n @if (helperTextSignal() && !errorTextSignal()) {\n <div class=\"cide-file-input-helper\">{{ helperTextSignal() }}</div>\n }\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 { Directive, ElementRef, Input, OnInit, OnDestroy, inject, DestroyRef } from '@angular/core';\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fileManagerControllerResponse } from '../../interfaces/core-file-manager.interface';\n\n/**\n * Directive to display images from file manager by ID\n * Usage: <img cideEleFileImage [fileId]=\"yourFileId\" [altText]=\"'Image'\" class=\"your-css-classes\" />\n */\n@Directive({\n selector: '[cideEleFileImage]',\n standalone: true\n})\nexport class CideEleFileImageDirective implements OnInit, OnDestroy {\n @Input() fileId: string | null = null;\n @Input() altText: string = 'Image';\n\n private readonly fileManagerService = inject(CideEleFileManagerService);\n private readonly elementRef = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n ngOnInit(): void {\n this.loadImage();\n }\n\n ngOnDestroy(): void {\n // Cleanup handled by takeUntilDestroyed\n }\n\n private loadImage(): void {\n if (!this.fileId) {\n return;\n }\n\n console.log('🖼️ [FileImageDirective] Loading image for ID:', this.fileId);\n\n this.fileManagerService.getFileDetails({ cyfm_id: this.fileId }).pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (fileDetails: fileManagerControllerResponse) => {\n console.log('📋 [FileImageDirective] File details received:', fileDetails);\n \n if (fileDetails?.data?.length) {\n const fileData = fileDetails.data[0];\n this.displayImage(fileData);\n } else {\n console.warn('⚠️ [FileImageDirective] No file data found for ID:', this.fileId);\n }\n },\n error: (error: any) => {\n console.error('❌ [FileImageDirective] Error loading file details:', error);\n }\n });\n }\n\n private displayImage(fileData: any): void {\n const imgElement = this.elementRef.nativeElement as HTMLImageElement;\n \n // Check if it's an image file\n const isImage = this.isImageFile(fileData.cyfm_name || '', fileData.cyfm_type || '');\n \n if (isImage) {\n // For now, we'll use a placeholder or the file path\n // In a real implementation, you might need to fetch the actual file content\n if (fileData.cyfm_path) {\n // If you have a direct URL to the file, use it\n imgElement.src = fileData.cyfm_path;\n imgElement.alt = fileData.cyfm_alt_text || this.altText;\n console.log('✅ [FileImageDirective] Image loaded from path:', fileData.cyfm_path);\n } else if (fileData.cyfm_file_base64) {\n // If base64 data is available, use it\n let base64Data = fileData.cyfm_file_base64;\n if (!base64Data.startsWith('data:')) {\n const mimeType = fileData.cyfm_type || 'image/jpeg';\n base64Data = `data:${mimeType};base64,${base64Data}`;\n }\n imgElement.src = base64Data;\n imgElement.alt = fileData.cyfm_alt_text || this.altText;\n console.log('✅ [FileImageDirective] Image loaded from base64 data');\n } else {\n console.warn('⚠️ [FileImageDirective] No image data available for file:', fileData.cyfm_name);\n }\n } else {\n console.warn('⚠️ [FileImageDirective] File is not an image:', fileData.cyfm_name);\n }\n }\n\n private isImageFile(fileName: string, fileType: string): boolean {\n if (fileType && fileType.startsWith('image/')) {\n return true;\n }\n \n if (fileName) {\n const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg'];\n const lowerFileName = fileName.toLowerCase();\n return imageExtensions.some(ext => lowerFileName.endsWith(ext));\n }\n \n return false;\n }\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, NgTemplateOutlet } 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 NgTemplateOutlet,\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 | string[]) {\n // Handle array case (shouldn't happen for page size, but just in case)\n const pageSizeValue = Array.isArray(value) ? value[0] : value;\n this.pageSize.set(+pageSizeValue);\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 // If search is cleared (empty), trigger search immediately without debounce\n if (!searchValue || searchValue.trim() === '') {\n console.log('Search cleared, triggering immediate search event');\n this.currentPage.set(1);\n if (this.serverSidePagination) {\n this.emitEvent('search', searchValue);\n } else {\n this.onSearch();\n }\n return;\n }\n \n // Apply debounce for non-empty search queries\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 // If pagination is disabled, return all data\n if (!this.mergedConfig().pagination?.enabled) {\n return data;\n }\n // If pagination is enabled, slice the data\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 type=\"button\"\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 type=\"button\"\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 [ngTemplateOutletContext]=\"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 [ngTemplateOutletContext]=\"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 minWidth?: 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() && !getSafeConfig().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-context=\"context\">\n <!-- Custom Menu Template -->\n @if (menuTemplate) {\n <ng-container *ngTemplateOutlet=\"menuTemplate; context: { $implicit: context?.items }\">\n </ng-container>\n } @else {\n <!-- Default Menu -->\n <div class=\"tw-py-1\" role=\"none\">\n @for (item of context?.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 protected getSafeConfig(): DropdownConfig {\n return {\n triggerIcon: 'more_vert',\n triggerSize: 'sm',\n menuWidth: 'tw-w-44',\n menuPosition: 'auto',\n showArrow: false,\n offsetX: 0,\n offsetY: 4,\n usePortal: true, // Default to portal mode\n ...this.config // Override with provided config\n };\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, current state:', this.isOpen());\n console.log('🔵 Items:', this.items);\n console.log('🔵 Config:', this.getSafeConfig());\n event.stopPropagation();\n\n if (!this.isOpen()) {\n this.openDropdown();\n } else {\n setTimeout(() => {\n this.closeDropdown();\n }, 100);\n }\n }\n\n private openDropdown(): void {\n console.log('🔵 openDropdown called');\n console.log('🔵 Items:', this.items);\n console.log('🔵 Config:', this.getSafeConfig());\n console.log('🔵 Template available:', !!this.dropdownMenuTemplate());\n \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.getSafeConfig().usePortal && this.dropdownMenuTemplate()) {\n console.log('🔵 Creating portal dropdown...');\n this.createPortalDropdown();\n } else {\n console.log('🔵 Not creating portal - usePortal:', this.getSafeConfig().usePortal, 'template:', !!this.dropdownMenuTemplate());\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 }, 50);\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 console.log('🔵 Creating portal dropdown with items:', this.items);\n console.log('🔵 Trigger element:', triggerElement);\n console.log('🔵 Template:', template);\n console.log('🔵 Config:', this.config);\n\n try {\n const safeConfig = this.getSafeConfig();\n const portalElement = this.portalService.createTemplatePortal(this.portalId, {\n triggerElement,\n template,\n viewContainerRef: this.viewContainerRef,\n context: { items: 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: safeConfig.offsetX || 0,\n offsetY: safeConfig.offsetY || 4,\n minWidth: safeConfig.minWidth || this.getMenuWidth(),\n maxHeight: 300,\n closeOnClickOutside: true,\n closeOnEscape: true\n });\n\n console.log('🔵 Portal dropdown created:', this.portalId);\n console.log('🔵 Portal element:', portalElement);\n console.log('🔵 Portal element styles:', {\n position: portalElement.style.position,\n top: portalElement.style.top,\n left: portalElement.style.left,\n zIndex: portalElement.style.zIndex,\n display: portalElement.style.display,\n visibility: portalElement.style.visibility\n });\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 setTimeout(() => {\n this.isOpen.set(false);\n\n // Destroy portal if it exists\n if (this.getSafeConfig().usePortal) {\n this.destroyPortalDropdown();\n }\n\n this.dropdownManager.unregisterDropdown(this.dropdownId);\n this.dropdownToggle.emit(false);\n }, 100);\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.getSafeConfig().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 { \r\n Injectable, \r\n signal, \r\n computed, \r\n type TemplateRef,\r\n type OnDestroy \r\n} 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 implements OnDestroy {\r\n // Modern signal-based state management\r\n private readonly confirmationQueue = signal<ConfirmationRequest<unknown>[]>([]);\r\n private readonly currentRequest = signal<ConfirmationRequest<unknown> | null>(null);\r\n \r\n // Modern computed signals with proper typing\r\n readonly hasActiveConfirmation = computed((): boolean => this.currentRequest() !== null);\r\n readonly queueLength = computed((): number => this.confirmationQueue().length);\r\n\r\n constructor() {\r\n // Modern service initialization\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\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 console.log('🔔 ConfirmationService.ask called with options:', options);\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 console.log('🔽 Ask for confirmation with a simple yes/no dialog', request);\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 // Modern private methods with proper typing\r\n private addToQueue(request: ConfirmationRequest<unknown>): void {\r\n this.confirmationQueue.update(queue => [...queue, request]);\r\n console.log('🔔 Added request to queue:', request);\r\n this.processQueue();\r\n }\r\n\r\n private processQueue(): void {\r\n console.log('🔔 Processing queue. Current request:', this.currentRequest(), 'Queue length:', this.confirmationQueue().length);\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 console.log('🔔 Setting current request:', nextRequest);\r\n this.currentRequest.set(nextRequest);\r\n }\r\n\r\n // Modern public methods with proper typing\r\n confirmCurrentRequest(data?: unknown): void {\r\n const request = this.currentRequest();\r\n if (!request) return;\r\n\r\n // Always resolve with true for confirmation, unless custom data is explicitly provided\r\n const resolvedValue = data !== undefined ? data : true;\r\n console.log('🔔 Confirming request with value:', resolvedValue);\r\n request.resolve(resolvedValue);\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 // Modern private utility method with proper typing\r\n private getDefaultIcon(type: 'danger' | 'warning' | 'info' | 'success'): string {\r\n const iconMap: Record<string, string> = {\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 // Modern public getters with proper typing\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 } from '@angular/core';\r\nimport { HttpClient, HttpEvent, HttpEventType, HttpProgressEvent, HttpRequest } from '@angular/common/http';\r\nimport { Observable, throwError, BehaviorSubject, of } from 'rxjs';\r\nimport { catchError, tap, map } from 'rxjs/operators';\r\nimport { \r\n cidePath, \r\n coreRoutesUrl, \r\n generateStringFromObject, \r\n hostManagerRoutesUrl\r\n} from 'cloud-ide-lms-model';\r\nimport {\r\n ICoreFileManager,\r\n IFileUploadRequest,\r\n IFileUploadResponse,\r\n IFileListRequest,\r\n IFileListResponse,\r\n IFileDeleteResponse,\r\n IFileUpdateRequest,\r\n IFileUpdateResponse,\r\n IFileUploadProgress\r\n} from '../interfaces/core-file-manager.interface';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideCoreFileManagerService {\r\n private apiUrl = `${coreRoutesUrl?.fileManager}`;\r\n private fileListSubject = new BehaviorSubject<ICoreFileManager[]>([]);\r\n public fileList$ = this.fileListSubject.asObservable();\r\n\r\n constructor(private http: HttpClient) {\r\n console.log('CideCoreFileManagerService initialized - using real API');\r\n }\r\n\r\n /**\r\n * Get file list from API\r\n */\r\n getFileList(body: IFileListRequest): Observable<IFileListResponse> {\r\n const query = generateStringFromObject(body);\r\n return this.http?.get<IFileListResponse>(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]))\r\n .pipe(\r\n tap((response: IFileListResponse) => {\r\n if (response?.success) {\r\n this.fileListSubject.next(response?.data || []);\r\n }\r\n }),\r\n catchError(error => {\r\n console.error('CideCoreFileManagerService API error:', error);\r\n return this.handleError(error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get file list using mock data (deprecated - use getFileList instead)\r\n */\r\n getFileListWithMockData(_body: IFileListRequest): Observable<IFileListResponse> {\r\n console.warn('getFileListWithMockData is deprecated. Use getFileList instead.');\r\n return this.getFileList(_body);\r\n }\r\n\r\n /**\r\n * Get file list from cache (if available)\r\n */\r\n getFileListFromCache(): ICoreFileManager[] {\r\n return this.fileListSubject.value;\r\n }\r\n\r\n /**\r\n * Upload file with progress tracking\r\n */\r\n uploadFile(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\r\n const formData = new FormData();\r\n formData.append('file', request.file);\r\n formData.append('altText', request.altText || '');\r\n formData.append('tags', JSON.stringify(request.tags || []));\r\n formData.append('permissions', JSON.stringify(request.permissions || []));\r\n formData.append('userId', request.userId);\r\n\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'upload']);\r\n const req = new HttpRequest('POST', url, formData, {\r\n reportProgress: true\r\n });\r\n\r\n return this.http.request<IFileUploadResponse>(req).pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Upload file with progress tracking (mock version - deprecated)\r\n */\r\n uploadFileWithMockData(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\r\n console.warn('uploadFileWithMockData is deprecated. Use uploadFile instead.');\r\n return this.uploadFile(request);\r\n }\r\n\r\n /**\r\n * Update file metadata\r\n */\r\n updateFile(request: IFileUpdateRequest): Observable<IFileUpdateResponse> {\r\n console.log('Updating file:', request);\r\n \r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager]);\r\n return this.http.post<IFileUpdateResponse>(url, request)\r\n .pipe(\r\n tap((response: IFileUpdateResponse) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Delete file\r\n */\r\n deleteFile(id: string): Observable<IFileDeleteResponse> {\r\n const payload = { cyfm_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n return this.http.delete<IFileDeleteResponse>(url)\r\n .pipe(\r\n tap((response: IFileDeleteResponse) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Delete multiple files\r\n */\r\n deleteMultipleFiles(ids: string[]): Observable<{ success: boolean; message?: string; data?: unknown }> {\r\n console.log('Deleting multiple files:', ids);\r\n const payload = { ids };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n return this.http.delete<{ success: boolean; message?: string; data?: unknown }>(url)\r\n .pipe(\r\n tap((response: { success: boolean; message?: string; data?: unknown }) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Toggle file active status\r\n */\r\n toggleFileStatus(id: string): Observable<IFileListResponse> {\r\n console.log('Toggling file status:', id);\r\n const payload = { id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\r\n return this.http.put<IFileListResponse>(url, {})\r\n .pipe(\r\n tap((response: IFileListResponse) => {\r\n if (response.success) {\r\n this.refreshFileList();\r\n }\r\n }),\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n /**\r\n * Get file by ID\r\n */\r\n getFileById(id: string): Observable<{ success: boolean; message: string; data?: ICoreFileManager }> {\r\n console.log('Getting file by ID:', id);\r\n const payload = { cyfm_id: id };\r\n const query = generateStringFromObject(payload);\r\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'byId', query]);\r\n return this.http.get<{ success: boolean; message: string; data?: ICoreFileManager }>(url)\r\n .pipe(\r\n catchError(this.handleError)\r\n );\r\n }\r\n\r\n\r\n /**\r\n * Find file by ID\r\n */\r\n findFileById(id: string, items: ICoreFileManager[] = this.fileListSubject.value): ICoreFileManager | null {\r\n for (const item of items) {\r\n if (item._id === id) {\r\n return item;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get file size in human readable format\r\n */\r\n getFileSizeDisplay(bytes: number): string {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n }\r\n\r\n /**\r\n * Get file type icon\r\n */\r\n getFileTypeIcon(fileType: string): string {\r\n const typeMap: Record<string, string> = {\r\n 'image/jpeg': 'image',\r\n 'image/png': 'image',\r\n 'image/gif': 'image',\r\n 'image/svg+xml': 'image',\r\n 'application/pdf': 'picture_as_pdf',\r\n 'text/plain': 'description',\r\n 'text/html': 'code',\r\n 'application/json': 'code',\r\n 'application/javascript': 'code',\r\n 'text/css': 'code',\r\n 'application/zip': 'folder_zip',\r\n 'application/x-zip-compressed': 'folder_zip',\r\n 'application/msword': 'description',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'description',\r\n 'application/vnd.ms-excel': 'table_chart',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'table_chart',\r\n 'application/vnd.ms-powerpoint': 'slideshow',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'slideshow'\r\n };\r\n return typeMap[fileType] || 'insert_drive_file';\r\n }\r\n\r\n /**\r\n * Refresh file list from server\r\n */\r\n private refreshFileList(): void {\r\n const defaultBody: IFileListRequest = {\r\n pageIndex: 1,\r\n pageSize: 10\r\n };\r\n this.getFileList(defaultBody).subscribe({\r\n next: () => {\r\n console.log('File list refreshed successfully');\r\n },\r\n error: (error) => {\r\n console.error('Error refreshing file list:', error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle errors\r\n */\r\n private handleError(error: unknown): Observable<never> {\r\n let errorMessage = 'An error occurred';\r\n\r\n if (error instanceof Error) {\r\n errorMessage = error.message;\r\n } else if (typeof error === 'string') {\r\n errorMessage = error;\r\n }\r\n\r\n console.error('CideCoreFileManagerService Error:', errorMessage);\r\n return throwError(() => new Error(errorMessage));\r\n }\r\n}\r\n","import { \r\n Component, \r\n signal, \r\n computed, \r\n inject, \r\n effect,\r\n type OnInit,\r\n type OnDestroy \r\n} 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// Types\r\ninterface ConfirmationRequest {\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?: any;\r\n customData?: unknown;\r\n resolve: (value: boolean | unknown) => void;\r\n reject: (reason?: unknown) => void;\r\n}\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 </div>\r\n\r\n <!-- Modal -->\r\n <div \r\n *ngIf=\"hasActiveConfirmation()\"\r\n class=\"confirmation-modal\"\r\n style=\"position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); z-index: 10001;\">\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: fixed;\r\n top: 50%;\r\n left: 50%;\r\n transform: translate(-50%, -50%);\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})\r\nexport class CideEleConfirmationModalComponent implements OnInit, OnDestroy {\r\n // Modern Angular 20+ dependency injection\r\n private readonly confirmationService = inject(ConfirmationService);\r\n\r\n // Modern signal-based state management\r\n readonly hasActiveConfirmation = this.confirmationService.hasActiveConfirmation;\r\n readonly currentRequest = this.confirmationService.getCurrentRequest();\r\n readonly customData = signal<unknown>(null);\r\n\r\n // Modern lifecycle management\r\n ngOnInit(): void {\r\n // Debug: Log when confirmation state changes\r\n effect(() => {\r\n const hasActive = this.hasActiveConfirmation();\r\n console.log('🔔 Confirmation modal hasActiveConfirmation changed:', hasActive);\r\n if (hasActive) {\r\n console.log('🔔 Current request:', this.currentRequest());\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup if needed\r\n }\r\n\r\n // Modern computed signals with proper typing\r\n readonly getHeaderClass = computed((): string => {\r\n const request = this.currentRequest();\r\n return request ? `header-${request.type}` : '';\r\n });\r\n\r\n readonly getIconClass = computed((): string => {\r\n const request = this.currentRequest();\r\n return request ? request.type : 'info';\r\n });\r\n\r\n readonly getConfirmButtonClass = computed((): string => {\r\n const request = this.currentRequest();\r\n if (!request) return 'btn-primary';\r\n \r\n const classMap: Record<string, string> = {\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 // Modern event handlers with proper typing\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, otherwise pass true\r\n const data = this.customData();\r\n console.log('🔔 Modal onConfirm called with customData:', data);\r\n this.confirmationService.confirmCurrentRequest(data !== null ? data : true);\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 && !notification.showProgress\"\n class=\"toast-progress\"\n [style.animation-duration]=\"notification.duration + 'ms'\">\n </div>\n \n <!-- Custom Progress Bar -->\n <div \n *ngIf=\"notification.showProgress\"\n class=\"toast-custom-progress\">\n <div \n class=\"toast-custom-progress-bar\"\n [style.width.%]=\"notification.progress || 0\">\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [`\n .toast-container {\n position: fixed;\n top: 80px;\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 /* Custom Progress Bar */\n .toast-custom-progress {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: 3px;\n background-color: #e5e7eb;\n overflow: hidden;\n }\n\n .toast-custom-progress-bar {\n height: 100%;\n background-color: #2563eb;\n transition: width 0.3s ease;\n border-radius: 0 3px 0 0;\n }\n\n .toast-notification.success .toast-custom-progress-bar {\n background-color: #16a34a;\n }\n\n .toast-notification.error .toast-custom-progress-bar {\n background-color: #dc2626;\n }\n\n .toast-notification.warning .toast-custom-progress-bar {\n background-color: #d97706;\n }\n\n .toast-notification.info .toast-custom-progress-bar {\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: 80px;\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/directives/file-image/file-image.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/services/file-manager.service';\nexport * from './lib/services/core-file-manager.service';\nexport * from './lib/interfaces/core-file-manager.interface';\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","catchError","i1"],"mappings":"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"}