cloud-ide-element 1.1.12 → 1.1.13

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/select/select.component.ts","../../../projects/cloud-ide-element/src/lib/elements/select/select.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/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/components/floating-container/floating-container.service.ts","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.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/floating-file-uploader/floating-file-uploader.component.ts","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.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/elements/breadcrumb/breadcrumb.component.ts","../../../projects/cloud-ide-element/src/lib/elements/breadcrumb/breadcrumb.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/utils/directives/tooltip/tooltip.directive.ts","../../../projects/cloud-ide-element/src/lib/utils/directives/resizer/resizer.directive.ts","../../../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/services/core-file-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/dropdown-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/keyboard-shortcut.service.ts","../../../projects/cloud-ide-element/src/lib/services/confirmation.service.ts","../../../projects/cloud-ide-element/src/lib/directives/file-image/file-image.directive.ts","../../../projects/cloud-ide-element/src/lib/components/form-field-error/form-field-error.component.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/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/components/dropdown/dropdown.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-manager.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-shortcuts.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-features.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-dynamic.directive.ts","../../../projects/cloud-ide-element/src/lib/components/json-editor/json-editor.component.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/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';\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, forwardRef, inject, ViewChild, TemplateRef, ViewContainerRef, EmbeddedViewRef } from '@angular/core';\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\nimport { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\nimport { autocapitalizeType, autocompleteType, controlType, elementStyleType, inputType, labelDirType, labelPlacementType, themeSize } from 'cloud-ide-lms-model';\nimport { PortalService } from '../../services/portal.service';\n\n/** @description type to register error related to control */\nexport type ErrorValidationStatus = {\n maxlength?: string,\n minlength?: string,\n required?: string,\n}\nexport type ValidationStatus = {\n validation: ErrorValidationStatus,\n status: boolean\n}\n\n@Component({\n selector: 'cide-ele-input',\n standalone: true,\n templateUrl: './input.component.html',\n styleUrl: './input.component.scss',\n imports: [\n // directives\n CommonModule,\n // for ngModel\n FormsModule\n ],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CideInputComponent),\n multi: true\n },\n /** @description to apply validations */\n {\n provide: NG_VALIDATORS,\n multi: true,\n useExisting: forwardRef(() => CideInputComponent),\n },\n CapitalizePipe\n ]\n})\n\nexport class CideInputComponent implements ControlValueAccessor, Validator, OnChanges, OnInit, OnDestroy {\n\n // Modern Angular v20 dependency injection pattern\n public capitalizePipe = inject(CapitalizePipe);\n private elementService = inject(CideElementsService);\n\n constructor() {\n // Modern Angular v20 pattern: Use constructor for initialization only\n // Validate control\n this.onValidate();\n }\n /*=======Set custom controls inputs to set components=========*/\n\n /** \n * @description to se the visual of control like solid control offerd by material design or outline with a border\n * @options solid | outline | standard\n */\n @Input() fill: elementStyleType = 'outline';\n /** @description Lable of control (Title), Like Name, Email */\n @Input() label: string = \"\";\n /** @description to hide and show label */\n @Input() labelHide: boolean = false;\n /** @description is control Editable or Disabled */\n @Input() disabled: boolean = false;\n /** @description Is Clear Input Cross button is visible or not */\n @Input() clearInput: boolean = false;\n /** @description Position of Label 'floating' | 'fixed' */\n @Input() labelPlacement: labelPlacementType = \"floating\";\n /** @description Lable direction from start of contrl or end of control */\n @Input() labelDir: labelDirType = \"start\";\n /** @description Place holder for control to display if there is no value */\n @Input() placeholder: string = \"\";\n /** @description it is to set leading icon, at the start of control */\n @Input() leadingIcon: string = \"\";\n /** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon */\n @Input() trailingIcon: string = \"\";\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 */\n @Input() helperText: string = \"\";\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 */\n @Input() helperTextCollapse: boolean = true;\n /** @description show and hide helper text its forecfull */\n @Input() hideHelperAndErrorText: boolean = true;\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 */\n @Input() errorText: string = \"\";\n /** @description maxlength for control */\n @Input() maxlength: number = 0;\n /** @description minlength for control */\n @Input() minlength: number = 0;\n /** @description is control is required or not input type is true | false */\n @Input() required: boolean = false;\n /** @description Auto capatalization for the value and applicable to word or to complete sentance */\n @Input() autocapitalize: autocapitalizeType = \"off\";\n /** @description auto complete type to help reader what is the type of value */\n @Input() autocomplete: autocompleteType = \"off\";\n /** @description type of control */\n @Input() type: controlType = 'text';\n /** @description width of control, default width is 100% */\n @Input() width: string = '100%';\n /** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */\n @Input() id: string = '';\n /** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */\n @Input() ngModel: inputType = '';\n @Input() option: string[] = [\"anksuh\", \"bhure\"];\n /** @description min value for number type control or min date for date type control */\n @Input() min: number | string = 0;\n /** @description max value for number type control or max date for date type control */\n @Input() max: number | string = 0;\n /**\n * @description\n * Holds the size of the component like Small, Extra small, Large\n * by Default it takes small size\n * or the size set by the project setup service\n * or it will beset for individual component\n * \n * Size Appled \n * Component level then setup service then finally default md\n * Options: \"2xs\" | \"\"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" \n */\n @Input() size: themeSize = \"md\";\n /** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */\n @Output() ngModelChange: EventEmitter<inputType> = new EventEmitter<inputType>();\n\n /*\n internal Properties for input\n */\n /** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */\n public isNgModel: boolean = this.ngModel ? true : false;\n /** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular */\n public isValid: boolean = true;\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 */\n public isTouched: boolean = false;\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 */\n public typeInternal: controlType = \"text\";\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 */\n public trailingIconInternal: string = \"\";\n\n /* \n Properties connected with trailingIconInternal \n */\n public isTrailingIconAllwedClick: boolean = false;\n\n // Properties connected with id\n public idRandom: string = this.randomString();\n\n // Date picker properties\n public showDatePicker: boolean = false;\n public showMonthYearSelector: boolean = false;\n public currentMonth: number = new Date().getMonth();\n public currentYear: number = new Date().getFullYear();\n public selectedDate: Date | null = null;\n public calendarDays: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }[] = [];\n public monthNames: string[] = [\n 'January', 'February', 'March', 'April', 'May', 'June',\n 'July', 'August', 'September', 'October', 'November', 'December'\n ];\n public shortMonthNames: string[] = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ];\n private portalService = inject(PortalService);\n private datePickerPortalId = `date-picker-${this.randomString()}`;\n private viewContainerRef = inject(ViewContainerRef);\n\n // ViewChild for date picker template\n @ViewChild('datePickerTemplate', { static: true }) datePickerTemplate!: TemplateRef<any>;\n private datePickerViewRef: EmbeddedViewRef<any> | null = null;\n\n // Time picker properties\n public showTimePicker: boolean = false;\n public timeHours: number = 1;\n public timeMinutes: number = 30;\n public timeSeconds: number = 30;\n public timeFormat: 'AM' | 'PM' = 'AM';\n private timePickerPortalId = `time-picker-${this.randomString()}`;\n \n // ViewChild for time picker template\n @ViewChild('timePickerTemplate', { static: true }) timePickerTemplate!: TemplateRef<any>;\n \n // DateTime picker properties\n public showDateTimePicker: boolean = false;\n public dateTimeStep: 'date' | 'time' = 'date';\n private dateTimePickerPortalId = `datetime-picker-${this.randomString()}`;\n\n // ==================================METHODS FOR CUSTOM FORM COMPONENT=============================\n // FOR ANGULAR CALLED BY UI\n\n /** \n * @description Function to call when the HTML Chnage to tell Angular somthing is changed.\n * @field value : inputType\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private onChange = (value: inputType) => { };\n\n /** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */\n onTouched = () => { };\n\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). */\n onValidate = () => { };\n\n /**\n * @description\n * Method that performs synchronous validation against the provided control.\n * Exicuted by Angular\n *\n * @param control The control to validate against.\n *\n * @returns A map of validation errors if validation fails,\n * otherwise null.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n validate(control: AbstractControl): ValidationErrors | null {\n const validation_error = this.isControlValid(this.ngModel);\n if (validation_error?.status) {\n // Return the validation object directly, not wrapped in ValidationStatus\n return validation_error.validation;\n } else {\n return null;\n }\n }\n /**\n * @description\n * Registers a callback function to call when the validator inputs change.\n * Exicuted by Angular\n *\n * @param fn The callback function\n */\n registerOnValidatorChange?(fn: () => void): void {\n this.onValidate = fn;\n }\n\n /** @description when form control change from model side this method is implemented */\n writeValue(value: inputType): void {\n if (!this.isNgModel) {\n let ngModel = this.autoCapitalizeByOption(value, this.type);\n if (this.type === 'date') {\n ngModel = this.processValue(ngModel, this.type);\n }\n console.log('writeValue', this.ngModel, ngModel);\n this.ngModel = ngModel;\n }\n }\n /** @description Allows Angular to register a function to call when the model changes. */\n // Save the function as a property to call later here.\n registerOnChange(fn: (value: inputType) => void): void {\n this.onChange = fn;\n }\n /** @description Allows Angular to register a function to call when the input has been touched. */\n // Save the function as a property to call later here.\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n //==========================================================================\n\n /*\n Methods for input\n*/\n\n /** @description Detect wether input propertires canged or not */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes?.['value']) {\n this.isNgModel = true;\n this.ngModel = this.processValue(this.ngModel, this.type);\n }\n if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {\n this.isControlValid(this.ngModel);\n }\n\n // Ditect type change\n if (changes?.['type']) {\n this.detectTypeChange();\n }\n }\n\n ngOnInit(): void {\n if (this.id) {\n this.getControlData();\n }\n }\n\n ngOnDestroy(): void {\n // Clean up date picker portal\n this.portalService.destroyPortal(this.datePickerPortalId);\n // Clean up time picker portal\n this.portalService.destroyPortal(this.timePickerPortalId);\n // Clean up datetime picker portal\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\n }\n\n /** @description custom method run when HTML changes, we call method registerd by angular to detect change */\n upDateValue(value: { target: { value: inputType } } | Event) {\n const target = value.target as HTMLInputElement | { value: inputType };\n this.isControlValid(target?.value);\n const updatedValue = this.processValue(target?.value, this.type);\n this.ngModel = updatedValue;\n this.ngModelChange?.emit(updatedValue);\n // console.log(target)\n this.onChange(updatedValue);\n }\n\n /**\n * @description method applicable in case of control type checkbox\n * \n * @param value boolean | string\n */\n updateValueCheckBox(value: string | boolean) {\n // Convert string to boolean\n this.ngModel = !this.ngModel;\n value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);\n this.ngModelChange?.emit(value);\n this.onChange(value);\n }\n\n /** @description clear the value */\n ClearInputValue() {\n if (this.type == \"text\") {\n this.upDateValue({ target: { value: \"\" } });\n }\n }\n\n /** @description when HTML is focuesd */\n focusControl() {\n this.isTouched = true;\n this.onTouched();\n this.onValidate();\n }\n\n /** @description If control value need to be processed, like UPPERCASE */\n processValue(value: inputType, type: controlType) {\n value = this.autoCapitalizeByOption(value, type);\n if (type === 'date' && typeof value === 'string' && value) {\n // Ensure date is in YYYY-MM-DD format\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (dateRegex.test(value) && !isNaN(Date.parse(value))) {\n return value; // Already in correct format\n } else {\n // Try to parse and format unformatted date to YYYY-MM-DD\n const parsedDate = new Date(value);\n if (!isNaN(parsedDate.getTime())) {\n const year = parsedDate.getFullYear();\n const month = String(parsedDate.getMonth() + 1).padStart(2, '0');\n const day = String(parsedDate.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n }\n } else if (type === 'datetime-local' && typeof value === 'string' && value) {\n // Ensure datetime-local is in YYYY-MM-DDTHH:mm format\n const datetimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n if (datetimeRegex.test(value) && !isNaN(Date.parse(value))) {\n return value; // Already in correct format\n } else {\n // Try to parse and format unformatted datetime to YYYY-MM-DDTHH:mm\n const parsedDate = new Date(value);\n if (!isNaN(parsedDate.getTime())) {\n const year = parsedDate.getFullYear();\n const month = String(parsedDate.getMonth() + 1).padStart(2, '0');\n const day = String(parsedDate.getDate()).padStart(2, '0');\n const hours = String(parsedDate.getHours()).padStart(2, '0');\n const minutes = String(parsedDate.getMinutes()).padStart(2, '0');\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n }\n }\n } else if (type === 'url' && typeof value === 'string' && value) {\n // Normalize URL format - ensure it starts with http:// or https://\n if (!value.startsWith('http://') && !value.startsWith('https://')) {\n return `https://${value}`;\n }\n }\n return value;\n }\n\n /** @description for capitalization */\n autoCapitalizeByOption(value: inputType, type: controlType) {\n if (type == 'text') {\n if (this.autocapitalize == \"on\") {\n return this.capitalizePipe?.transform(value as string, 'allUpperCase');\n }\n if (this.autocapitalize == \"words\") {\n return this.capitalizePipe?.transform(value as string, 'titleCase');\n }\n if (this.autocapitalize == \"sentences\") {\n return this.capitalizePipe?.transform(value as string, \"sentenceCase\");\n }\n } else if (type == 'url') {\n // URLs should not be capitalized - return as is\n return value;\n }\n return value;\n }\n\n /** @description It is used to return the value is valid or not */\n isValidValueAndType(value: inputType, type: controlType) {\n if (type == 'text') {\n if (typeof (value) == 'string') {\n if (value?.length > 0) {\n return true;\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else if (type == 'url') {\n if (typeof (value) == 'string') {\n if (value?.length > 0) {\n // Validate URL format\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\n return urlRegex.test(value);\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else if (type == 'date') {\n if (typeof (value) == 'string') {\n if (value?.length > 0) {\n // Validate date format (YYYY-MM-DD)\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n return dateRegex.test(value) && !isNaN(Date.parse(value));\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else if (type == 'datetime-local') {\n if (typeof (value) == 'string') {\n if (value?.length > 0) {\n // Validate datetime-local format (YYYY-MM-DDTHH:mm)\n const datetimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n return datetimeRegex.test(value) && !isNaN(Date.parse(value));\n } else {\n return false;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n /** @description to check control is valid or not */\n isControlValid(value: inputType): ValidationStatus {\n const validation_status: ValidationStatus = {\n validation: {},\n status: false\n };\n\n if (this.required) {\n if (!value) {\n console.log(value, \"value, req\")\n validation_status.status = true;\n validation_status.validation.required = `required!`;\n }\n }\n\n if (this.type == 'text') {\n if(typeof (value) === 'number'){\n value = value.toString();\n }\n if (typeof (value) == 'string') {\n if (this.maxlength > 0) {\n if (value?.length > this.maxlength) {\n validation_status.status = true;\n validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;\n }\n }\n if (this.minlength > 0) {\n if (value?.length < this.minlength) {\n validation_status.status = true;\n validation_status.validation.minlength = `minimum length is ${this.minlength}!`;\n }\n }\n } else {\n validation_status.status = true;\n validation_status.validation.required = `required!`;\n }\n } else if (this.type == 'url') {\n if (typeof (value) == 'string' && value) {\n // URL validation regex\n const urlRegex = /^https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)$/;\n if (!urlRegex.test(value)) {\n validation_status.status = true;\n validation_status.validation.required = `Please enter a valid URL (e.g., https://example.com)!`;\n }\n\n if (this.maxlength > 0) {\n if (value?.length > this.maxlength) {\n validation_status.status = true;\n validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;\n }\n }\n if (this.minlength > 0) {\n if (value?.length < this.minlength) {\n validation_status.status = true;\n validation_status.validation.minlength = `minimum length is ${this.minlength}!`;\n }\n }\n } else if (this.required && !value) {\n validation_status.status = true;\n validation_status.validation.required = `URL is required!`;\n }\n } else if (this.type == 'date') {\n if (typeof (value) == 'string' && value) {\n // Validate date format and parse\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}$/;\n if (!dateRegex.test(value)) {\n validation_status.status = true;\n validation_status.validation.required = `Invalid date format (YYYY-MM-DD)!`;\n } else {\n const parsedDate = Date.parse(value);\n if (isNaN(parsedDate)) {\n validation_status.status = true;\n validation_status.validation.required = `Invalid date!`;\n } else {\n // Validate min date\n if (this.min && typeof this.min === 'string') {\n const minDate = Date.parse(this.min);\n if (!isNaN(minDate) && parsedDate < minDate) {\n validation_status.status = true;\n validation_status.validation.required = `Date must be after ${this.min}!`;\n }\n }\n // Validate max date\n if (this.max && typeof this.max === 'string') {\n const maxDate = Date.parse(this.max);\n if (!isNaN(maxDate) && parsedDate > maxDate) {\n validation_status.status = true;\n validation_status.validation.required = `Date must be before ${this.max}!`;\n }\n }\n }\n }\n } else if (this.required && !value) {\n validation_status.status = true;\n validation_status.validation.required = `Date is required!`;\n }\n } else if (this.type == 'datetime-local') {\n if (typeof (value) == 'string' && value) {\n // Validate datetime-local format and parse\n const datetimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\n if (!datetimeRegex.test(value)) {\n validation_status.status = true;\n validation_status.validation.required = `Invalid datetime format (YYYY-MM-DDTHH:mm)!`;\n } else {\n const parsedDate = Date.parse(value);\n if (isNaN(parsedDate)) {\n validation_status.status = true;\n validation_status.validation.required = `Invalid datetime!`;\n } else {\n // Validate min datetime\n if (this.min && typeof this.min === 'string') {\n const minDate = Date.parse(this.min);\n if (!isNaN(minDate) && parsedDate < minDate) {\n validation_status.status = true;\n validation_status.validation.required = `Datetime must be after ${this.min}!`;\n }\n }\n // Validate max datetime\n if (this.max && typeof this.max === 'string') {\n const maxDate = Date.parse(this.max);\n if (!isNaN(maxDate) && parsedDate > maxDate) {\n validation_status.status = true;\n validation_status.validation.required = `Datetime must be before ${this.max}!`;\n }\n }\n }\n }\n } else if (this.required && !value) {\n validation_status.status = true;\n validation_status.validation.required = `Datetime is required!`;\n }\n }\n this.isValid = !validation_status.status;\n this.errorText = Object.values(validation_status.validation).at(0) || ''\n return validation_status;\n }\n\n /** @description Allows Angular to disable the input. */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n /** @description Method for trailing Icon Click */\n trailingIconClick() {\n if (this.type === 'password') {\n if (this.typeInternal === 'password') {\n this.typeInternal = 'text';\n this.trailingIconInternal = 'visibility';\n } else {\n this.typeInternal = 'password';\n this.trailingIconInternal = 'visibility_off';\n }\n } else if (this.type === 'date') {\n // Toggle custom date picker using portal service\n this.showDatePicker = !this.showDatePicker;\n if (this.showDatePicker) {\n this.initializeDatePicker();\n this.createDatePickerUsingPortal();\n } else {\n this.closeDatePicker();\n }\n } else if (this.type === 'time') {\n // Toggle custom time picker using portal service\n this.showTimePicker = !this.showTimePicker;\n if (this.showTimePicker) {\n this.initializeTimePicker();\n this.createTimePickerUsingPortal();\n } else {\n this.closeTimePicker();\n }\n } else if (this.type === 'datetime-local') {\n // Toggle custom datetime picker using portal service\n this.showDateTimePicker = !this.showDateTimePicker;\n if (this.showDateTimePicker) {\n this.dateTimeStep = 'date'; // Start with date selection\n this.initializeDateTimePicker();\n this.createDateTimePickerUsingPortal();\n } else {\n this.closeDateTimePicker();\n }\n } else {\n this.typeInternal = this.type;\n }\n }\n\n /**\n * Method to generate Random String\n * @param setupPrarameter { lenght: number, prefix: string }\n * default lenght is 10, prefox is \"\"\n * @returns string\n */\n randomString(setupPrarameter: { lenght: number, prefix: string } = { lenght: 10, prefix: \"\" }): string {\n //variable consisting alphabets in small and capital letter \n const characters = \"ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz\";\n //loop to select a new character in each iteration \n let random_string = setupPrarameter?.prefix || \"\";\n for (let i = 0; i < setupPrarameter?.lenght; i++) {\n const rnum = Math.floor(Math.random() * characters.length);\n random_string += characters.substring(rnum, rnum + 1);\n }\n //return the generated string \n return random_string;\n }\n\n async getControlData() {\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\n if (cide_element_data) {\n this.label = cide_element_data?.sype_label as string;\n this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating') as labelPlacementType;\n this.type = (cide_element_data?.sype_type || 'text') as controlType;\n this.required = (cide_element_data?.sype_required || false) as boolean;\n this.size = (cide_element_data?.sype_size || 'md') as themeSize;\n this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false) as boolean;\n this.maxlength = (cide_element_data?.sype_max_length) as number;\n this.minlength = (cide_element_data?.sype_min_length) as number;\n this.leadingIcon = (cide_element_data?.sype_leading_icon) as string;\n this.labelHide = (cide_element_data?.sype_label_hide) as boolean;\n this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text) as boolean;\n this.detectTypeChange();\n // Validate control\n this.onValidate();\n }\n }\n\n /**\n * @description Helper to check if type is time (for template type narrowing)\n */\n isTimeType(): boolean {\n return this.type === 'time';\n }\n\n /**\n * @description use to detact the change in type if changes done this method is ued to run\n */\n detectTypeChange() {\n if (this.type === 'password') {\n this.typeInternal = \"password\";\n this.trailingIconInternal = \"visibility_off\";\n this.isTrailingIconAllwedClick = true;\n } else if (this.type === 'date') {\n this.typeInternal = \"date\";\n // Set default calendar icon if no trailing icon specified\n this.trailingIconInternal = this.trailingIcon || \"calendar_today\";\n this.isTrailingIconAllwedClick = true; // Allow clicking calendar icon\n } else if (this.type === 'time') {\n this.typeInternal = \"time\";\n // Set default schedule icon for time picker\n this.trailingIconInternal = this.trailingIcon || \"schedule\";\n this.isTrailingIconAllwedClick = true; // Allow clicking time icon\n } else if (this.type === 'datetime-local') {\n this.typeInternal = \"datetime-local\";\n // Set default schedule icon if no trailing icon specified\n this.trailingIconInternal = this.trailingIcon || \"event\";\n this.isTrailingIconAllwedClick = true; // datetime-local now uses custom picker\n } else if (this.type === 'url') {\n this.typeInternal = \"url\";\n // Set default link icon if no trailing icon specified\n this.trailingIconInternal = this.trailingIcon || \"link\";\n this.isTrailingIconAllwedClick = false; // URL type doesn't need clickable trailing icon\n } else {\n this.typeInternal = this.type;\n this.trailingIconInternal = this.trailingIcon;\n }\n }\n\n /**\n * @description Format date to YYYY-MM-DD format (for form submission)\n */\n formatDate(date: Date | string): string {\n if (typeof date === 'string') {\n // Parse date string in YYYY-MM-DD format to avoid timezone issues\n const [year, month, day] = date.split('-').map(Number);\n date = new Date(year, month - 1, day); // month is 0-indexed\n }\n if (date instanceof Date && !isNaN(date.getTime())) {\n const year = date.getFullYear();\n const month = (date.getMonth() + 1).toString().padStart(2, '0');\n const day = date.getDate().toString().padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n return '';\n }\n\n /**\n * @description Format date for display as \"DD/MMM/YYYY\" (e.g., \"20/Jun/2025\")\n */\n formatDateForDisplay(date: Date | string): string {\n if (typeof date === 'string') {\n // Parse date string in YYYY-MM-DD format to avoid timezone issues\n const [year, month, day] = date.split('-').map(Number);\n date = new Date(year, month - 1, day); // month is 0-indexed\n }\n if (date instanceof Date && !isNaN(date.getTime())) {\n const day = date.getDate().toString().padStart(2, '0');\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const month = monthNames[date.getMonth()];\n const year = date.getFullYear();\n return `${day}/${month}/${year}`;\n }\n return '';\n }\n\n /**\n * @description Get display value for date input\n */\n getDateDisplayValue(): string {\n if (this.ngModel && typeof this.ngModel === 'string') {\n return this.formatDateForDisplay(this.ngModel);\n }\n return '';\n }\n\n /**\n * @description Initialize date picker with current values\n */\n initializeDatePicker(): void {\n // Set selected date from current value\n if (this.ngModel && typeof this.ngModel === 'string') {\n // Parse date string in YYYY-MM-DD format to avoid timezone issues\n const [year, month, day] = this.ngModel.split('-').map(Number);\n this.selectedDate = new Date(year, month - 1, day); // month is 0-indexed\n if (!isNaN(this.selectedDate.getTime())) {\n this.currentMonth = this.selectedDate.getMonth();\n this.currentYear = this.selectedDate.getFullYear();\n }\n } else {\n this.selectedDate = null;\n }\n this.generateCalendar();\n }\n\n /**\n * @description Generate calendar days for current month\n */\n generateCalendar(): void {\n const firstDay = new Date(this.currentYear, this.currentMonth, 1);\n const lastDay = new Date(this.currentYear, this.currentMonth + 1, 0);\n const startDate = new Date(firstDay);\n startDate.setDate(startDate.getDate() - firstDay.getDay()); // Start from Sunday\n\n const today = new Date();\n this.calendarDays = [];\n\n // Generate 42 days (6 weeks)\n for (let i = 0; i < 42; i++) {\n const currentDate = new Date(startDate);\n currentDate.setDate(startDate.getDate() + i);\n\n const isCurrentMonth = currentDate.getMonth() === this.currentMonth;\n const isSelected = this.selectedDate ?\n currentDate.toDateString() === this.selectedDate.toDateString() : false;\n const isToday = currentDate.toDateString() === today.toDateString();\n\n this.calendarDays.push({\n day: currentDate.getDate(),\n isCurrentMonth,\n isSelected,\n isToday,\n date: new Date(currentDate)\n });\n }\n }\n\n /**\n * @description Create date picker using template-based portal service\n */\n private createDatePickerUsingPortal(): void {\n // Reset to calendar view when opening\n this.showMonthYearSelector = false;\n\n // Get input element\n const inputElement = document.getElementById(this.id);\n if (!inputElement) return;\n\n // Create template portal configuration\n const portalConfig = {\n triggerElement: inputElement,\n template: this.datePickerTemplate,\n viewContainerRef: this.viewContainerRef,\n context: {}, // Template can access component properties directly\n className: 'cide-date-picker-portal',\n position: 'auto' as const, // Smart positioning - will auto-detect best position\n align: 'left' as const,\n offsetY: 4,\n minWidth: 320,\n maxHeight: 400,\n closeOnClickOutside: true,\n closeOnEscape: true\n };\n\n // Create the template portal\n this.portalService.createTemplatePortal(this.datePickerPortalId, portalConfig);\n\n // Register close callback\n this.portalService.registerCloseCallback(this.datePickerPortalId, () => {\n this.closeDatePicker();\n });\n\n // Set data attribute for click outside detection\n inputElement.setAttribute('data-portal-trigger', this.datePickerPortalId);\n }\n\n /**\n * @description Close date picker\n */\n closeDatePicker(): void {\n this.showDatePicker = false;\n this.showMonthYearSelector = false;\n this.portalService.destroyPortal(this.datePickerPortalId);\n }\n\n /**\n * @description Navigate to previous month\n */\n previousMonth(): void {\n if (this.currentMonth === 0) {\n this.currentMonth = 11;\n this.currentYear--;\n } else {\n this.currentMonth--;\n }\n this.generateCalendar();\n }\n\n /**\n * @description Navigate to next month\n */\n nextMonth(): void {\n if (this.currentMonth === 11) {\n this.currentMonth = 0;\n this.currentYear++;\n } else {\n this.currentMonth++;\n }\n this.generateCalendar();\n }\n\n /**\n * @description Navigate to previous year\n */\n previousYear(): void {\n this.currentYear--;\n }\n\n /**\n * @description Navigate to next year\n */\n nextYear(): void {\n this.currentYear++;\n }\n\n /**\n * @description Toggle between calendar and month/year selector\n */\n toggleMonthYearSelector(): void {\n this.showMonthYearSelector = !this.showMonthYearSelector;\n }\n\n /**\n * @description Select a month from the month selector\n */\n selectMonth(monthIndex: number): void {\n this.currentMonth = monthIndex;\n this.generateCalendar();\n this.showMonthYearSelector = false; // Return to calendar view\n }\n\n /**\n * @description Select a date from the calendar\n */\n selectDate(dayInfo: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }): void {\n if (!dayInfo.isCurrentMonth) return;\n\n // Set the selected date\n this.selectedDate = dayInfo.date;\n\n // Update the input value - Use local date formatting to avoid timezone issues\n const year = dayInfo.date.getFullYear();\n const month = String(dayInfo.date.getMonth() + 1).padStart(2, '0');\n const day = String(dayInfo.date.getDate()).padStart(2, '0');\n const formattedDate = `${year}-${month}-${day}`; // YYYY-MM-DD format\n\n this.ngModel = formattedDate;\n this.ngModelChange?.emit(formattedDate);\n this.onChange(formattedDate);\n\n // Regenerate calendar to update selection\n this.generateCalendar();\n\n // Close date picker\n this.closeDatePicker();\n }\n\n // ==================== TIME PICKER METHODS ====================\n\n /**\n * @description Initialize time picker with current values\n */\n initializeTimePicker(): void {\n if (this.ngModel) {\n // Parse existing time value (format: HH:mm or HH:mm:ss)\n const timeString = this.ngModel.toString();\n const timeParts = timeString.split(':');\n \n if (timeParts.length >= 2) {\n let hours = parseInt(timeParts[0]);\n const minutes = parseInt(timeParts[1]);\n const seconds = timeParts[2] ? parseInt(timeParts[2]) : 0;\n \n // Convert to 12-hour format\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n this.timeMinutes = minutes;\n this.timeSeconds = seconds;\n }\n } else {\n // Default to current time\n const now = new Date();\n let hours = now.getHours();\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n this.timeMinutes = now.getMinutes();\n this.timeSeconds = now.getSeconds();\n }\n }\n\n /**\n * @description Create time picker using template-based portal service\n */\n private createTimePickerUsingPortal(): void {\n const inputElement = document.getElementById(this.id || this.idRandom);\n if (!inputElement) return;\n\n const portalConfig = {\n template: this.timePickerTemplate,\n context: { $implicit: this },\n triggerElement: inputElement,\n viewContainerRef: this.viewContainerRef,\n className: 'cide-time-picker-portal',\n position: 'bottom' as 'bottom',\n align: 'left' as 'left',\n offset: { x: 0, y: 8 },\n closeOnOutsideClick: true,\n closeOnEscape: true\n };\n\n this.portalService.createTemplatePortal(this.timePickerPortalId, portalConfig);\n\n // Register close callback\n this.portalService.registerCloseCallback(this.timePickerPortalId, () => {\n this.closeTimePicker();\n });\n\n inputElement.setAttribute('data-portal-trigger', this.timePickerPortalId);\n }\n\n /**\n * @description Close time picker\n */\n closeTimePicker(): void {\n this.showTimePicker = false;\n this.portalService.destroyPortal(this.timePickerPortalId);\n }\n\n /**\n * @description Increment/decrement time value\n */\n adjustTime(unit: 'hours' | 'minutes' | 'seconds', direction: 'up' | 'down'): void {\n if (unit === 'hours') {\n if (direction === 'up') {\n this.timeHours = this.timeHours === 12 ? 1 : this.timeHours + 1;\n } else {\n this.timeHours = this.timeHours === 1 ? 12 : this.timeHours - 1;\n }\n } else if (unit === 'minutes') {\n if (direction === 'up') {\n this.timeMinutes = this.timeMinutes === 59 ? 0 : this.timeMinutes + 1;\n } else {\n this.timeMinutes = this.timeMinutes === 0 ? 59 : this.timeMinutes - 1;\n }\n } else if (unit === 'seconds') {\n if (direction === 'up') {\n this.timeSeconds = this.timeSeconds === 59 ? 0 : this.timeSeconds + 1;\n } else {\n this.timeSeconds = this.timeSeconds === 0 ? 59 : this.timeSeconds - 1;\n }\n }\n }\n\n /**\n * @description Toggle AM/PM\n */\n toggleTimeFormat(): void {\n this.timeFormat = this.timeFormat === 'AM' ? 'PM' : 'AM';\n }\n\n /**\n * @description Apply selected time\n */\n applyTime(): void {\n // Convert to 24-hour format\n let hours = this.timeHours;\n if (this.timeFormat === 'PM' && hours !== 12) {\n hours += 12;\n } else if (this.timeFormat === 'AM' && hours === 12) {\n hours = 0;\n }\n\n // Format time as HH:mm:ss\n const timeString = `${hours.toString().padStart(2, '0')}:${this.timeMinutes.toString().padStart(2, '0')}:${this.timeSeconds.toString().padStart(2, '0')}`;\n \n this.ngModel = timeString;\n this.ngModelChange.emit(timeString);\n this.onChange(timeString);\n \n this.closeTimePicker();\n }\n\n /**\n * @description Get time display value for the input field\n */\n getTimeDisplayValue(): string {\n if (!this.ngModel) return '';\n \n const timeString = this.ngModel.toString();\n const timeParts = timeString.split(':');\n \n if (timeParts.length >= 2) {\n let hours = parseInt(timeParts[0]);\n const minutes = parseInt(timeParts[1]);\n const seconds = timeParts[2] ? parseInt(timeParts[2]) : 0;\n \n const format = hours >= 12 ? 'PM' : 'AM';\n hours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n \n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')} ${format}`;\n }\n \n return timeString;\n }\n\n // ==================== DATETIME PICKER METHODS ====================\n\n /**\n * @description Initialize datetime picker\n */\n initializeDateTimePicker(): void {\n if (this.ngModel) {\n // Parse existing datetime value\n const dateTimeString = this.ngModel.toString();\n const dateTime = new Date(dateTimeString);\n \n if (!isNaN(dateTime.getTime())) {\n // Initialize date picker values\n this.selectedDate = dateTime;\n this.currentMonth = dateTime.getMonth();\n this.currentYear = dateTime.getFullYear();\n this.generateCalendar();\n \n // Initialize time picker values\n let hours = dateTime.getHours();\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n this.timeMinutes = dateTime.getMinutes();\n this.timeSeconds = dateTime.getSeconds();\n }\n } else {\n // Default to current date and time\n const now = new Date();\n this.selectedDate = now;\n this.currentMonth = now.getMonth();\n this.currentYear = now.getFullYear();\n this.generateCalendar();\n \n let hours = now.getHours();\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n this.timeMinutes = now.getMinutes();\n this.timeSeconds = now.getSeconds();\n }\n }\n\n /**\n * @description Create datetime picker using portal service\n */\n private createDateTimePickerUsingPortal(): void {\n const inputElement = document.getElementById(this.id || this.idRandom);\n if (!inputElement) return;\n\n // Use date picker template for datetime picker (will show date first, then time)\n const portalConfig = {\n template: this.datePickerTemplate,\n context: { $implicit: this },\n triggerElement: inputElement,\n viewContainerRef: this.viewContainerRef,\n className: 'cide-datetime-picker-portal',\n position: 'bottom' as 'bottom',\n align: 'left' as 'left',\n offset: { x: 0, y: 8 },\n closeOnOutsideClick: true,\n closeOnEscape: true\n };\n\n this.portalService.createTemplatePortal(this.dateTimePickerPortalId, portalConfig);\n\n this.portalService.registerCloseCallback(this.dateTimePickerPortalId, () => {\n this.closeDateTimePicker();\n });\n\n inputElement.setAttribute('data-portal-trigger', this.dateTimePickerPortalId);\n }\n\n /**\n * @description Close datetime picker\n */\n closeDateTimePicker(): void {\n this.showDateTimePicker = false;\n this.dateTimeStep = 'date';\n this.showMonthYearSelector = false;\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\n }\n\n /**\n * @description Select date in datetime picker (moves to time selection)\n */\n selectDateTimeDate(dayInfo: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }): void {\n if (!dayInfo.isCurrentMonth) return;\n\n this.selectedDate = dayInfo.date;\n this.dateTimeStep = 'time'; // Move to time selection\n \n // Recreate portal with time picker template\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\n \n const inputElement = document.getElementById(this.id || this.idRandom);\n if (!inputElement) return;\n\n const portalConfig = {\n template: this.timePickerTemplate,\n context: { $implicit: this },\n triggerElement: inputElement,\n viewContainerRef: this.viewContainerRef,\n className: 'cide-datetime-picker-portal',\n position: 'bottom' as 'bottom',\n align: 'left' as 'left',\n offset: { x: 0, y: 8 },\n closeOnOutsideClick: true,\n closeOnEscape: true\n };\n\n this.portalService.createTemplatePortal(this.dateTimePickerPortalId, portalConfig);\n\n this.portalService.registerCloseCallback(this.dateTimePickerPortalId, () => {\n this.closeDateTimePicker();\n });\n }\n\n /**\n * @description Apply datetime (combines date and time)\n */\n applyDateTime(): void {\n if (!this.selectedDate) return;\n\n // Convert time to 24-hour format\n let hours = this.timeHours;\n if (this.timeFormat === 'PM' && hours !== 12) {\n hours += 12;\n } else if (this.timeFormat === 'AM' && hours === 12) {\n hours = 0;\n }\n\n // Combine date and time\n const dateTime = new Date(this.selectedDate);\n dateTime.setHours(hours, this.timeMinutes, this.timeSeconds);\n\n // Format as datetime-local string (YYYY-MM-DDTHH:mm:ss)\n const dateTimeString = dateTime.toISOString().slice(0, 19);\n \n this.ngModel = dateTimeString;\n this.ngModelChange.emit(dateTimeString);\n this.onChange(dateTimeString);\n \n this.closeDateTimePicker();\n }\n\n /**\n * @description Get datetime display value\n */\n getDateTimeDisplayValue(): string {\n if (!this.ngModel) return '';\n \n const dateTime = new Date(this.ngModel.toString());\n if (isNaN(dateTime.getTime())) return this.ngModel.toString();\n \n // Format: MMM DD, YYYY HH:mm AM/PM\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const month = monthNames[dateTime.getMonth()];\n const day = dateTime.getDate();\n const year = dateTime.getFullYear();\n \n let hours = dateTime.getHours();\n const minutes = dateTime.getMinutes();\n const format = hours >= 12 ? 'PM' : 'AM';\n hours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\n \n return `${month} ${day}, ${year} ${hours}:${minutes.toString().padStart(2, '0')} ${format}`;\n }\n\n /**\n * @description Back to date selection in datetime picker\n */\n backToDateSelection(): void {\n this.dateTimeStep = 'date';\n \n // Recreate portal with date picker template\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\n this.createDateTimePickerUsingPortal();\n }\n\n}\n","<div class=\"cide-input\">\n <!------------------------------------------TEXT | PASSWORD | DATE | URL------------------------------------------>\n @if (type === 'text' || type === 'number' || type === 'password' || type === 'email' || type === 'tel' || type === 'date' || type === 'datetime-local' || type === 'url') {\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [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-leading-icon': leadingIcon,\n 'cide-element-trailing-icon': trailingIconInternal,\n 'cide-element-clear-input': clearInput,\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 'cide-element-input-number': (type === 'number')\n }\">\n <!-- label -->\n @if (label && !labelHide) {\n <label [for]=\"id\" class=\"cide-input-label\">\n {{label}}\n @if (required) {\n <span class=\"tw-text-red-500 tw-ml-1\">*</span>\n }\n </label>\n }\n\n <!-- all one line elemets which dose not affect with label and error text -->\n <div class=\"cide-element-input-wrapper\">\n <!-- Leading Icon -->\n @if (leadingIcon) {\n <span class=\"cide-input-leading-icon-wrapper\">\n <span\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n </span>\n }\n\n <!-- Trailing icon -->\n @if (trailingIconInternal) {\n <span class=\"tw-absolute cide-input-trailing-icon tw-select-none tw-right-0\">\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\n </span>\n }\n\n <!-- Clear -->\n @if (clearInput && ngModel) {\n <button class=\"cide-input-clear\" (click)=\"ClearInputValue()\">\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n </button>\n }\n\n <!-- Date Input Wrapper -->\n @if (type === 'date') {\n <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\n <!-- Date Input (read-only to prevent manual input) -->\n <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\"\n [ngClass]=\"{\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIconInternal,\n 'tw-pr-1': !trailingIconInternal,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n 'tw-h-7': size === 'sm',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\n }\"\n [value]=\"getDateDisplayValue()\" type=\"text\" readonly (focus)=\"focusControl()\" (click)=\"trailingIconClick()\"\n [autocomplete]=\"autocomplete\"\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\" />\n \n <!-- Placeholder overlay for empty date -->\n @if (!ngModel && placeholder) {\n <div class=\"cide-input-date-overlay\">\n {{placeholder}}\n </div>\n }\n\n <!-- Date picker is now rendered as a portal appended to body -->\n </div>\n }\n\n <!-- Time Input Wrapper -->\n @if (isTimeType()) {\n <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\n <!-- Time Input (read-only to prevent manual input) -->\n <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\"\n [ngClass]=\"{\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIconInternal,\n 'tw-pr-1': !trailingIconInternal,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n 'tw-h-7': size === 'sm',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\n }\"\n [value]=\"getTimeDisplayValue()\" type=\"text\" readonly (focus)=\"focusControl()\" (click)=\"trailingIconClick()\"\n [autocomplete]=\"autocomplete\"\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\" />\n \n <!-- Placeholder overlay for empty time -->\n @if (!ngModel && placeholder) {\n <div class=\"cide-input-date-overlay\">\n {{placeholder}}\n </div>\n }\n\n <!-- Time picker is now rendered as a portal appended to body -->\n </div>\n }\n\n <!-- DateTime Local Input -->\n @if (type === 'datetime-local') {\n <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\n <!-- DateTime Input (read-only to prevent manual input) -->\n <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\"\n [ngClass]=\"{\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIconInternal,\n 'tw-pr-1': !trailingIconInternal,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n 'tw-h-7': size === 'sm',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\n }\"\n [value]=\"getDateTimeDisplayValue()\" type=\"text\" readonly (focus)=\"focusControl()\" (click)=\"trailingIconClick()\"\n [autocomplete]=\"autocomplete\"\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\" />\n \n <!-- Placeholder overlay for empty datetime -->\n @if (!ngModel && placeholder) {\n <div class=\"cide-input-date-overlay\">\n {{placeholder}}\n </div>\n }\n\n <!-- DateTime picker is now rendered as a portal appended to body -->\n </div>\n }\n\n <!-- Regular Input (non-date, non-time, non-datetime-local, non-url) -->\n @if (type !== 'date' && !isTimeType() && type !== 'datetime-local' && type !== 'url') {\n <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\"\n [ngClass]=\"{\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIconInternal,\n 'tw-pr-1': !trailingIconInternal,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n 'tw-h-7': size === 'sm',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\n }\"\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\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\" />\n }\n\n <!-- URL Input -->\n @if (type === 'url') {\n <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\"\n [ngClass]=\"{\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIconInternal,\n 'tw-pr-1': !trailingIconInternal,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n 'tw-h-7': size === 'sm',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\n }\"\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\n [autocomplete]=\"autocomplete\"\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\" />\n }\n </div>\n <!-- error text / helper text -->\n @if ((errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText) {\n <span class=\"cide-input-help-error-text\">{{\n isValid\n ? helperText : (errorText ?\n (isTouched ? errorText : helperText)\n : helperText)}}\n </span>\n }\n </div>\n }\n\n <!-- Input with tralling icon -->\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\n <div class=\"tw-w-fullh-full tw-relative\">\n <label\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>\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\n </span>\n <input\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\"\n value=\"Ankush Bhure\" />\n </div>\n </div> -->\n\n <!-- Input with leading icon -->\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\n <div class=\"tw-w-fullh-full tw-relative\">\n <label\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>\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\n </span>\n <input\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\"\n value=\"Ankush Bhure\" />\n </div>\n </div> -->\n\n <!------------------------------------------CHECKBOX------------------------------------------>\n @if (type === 'checkbox') {\n <div class=\"tw-flex\">\n <div class=\"cide-checkbox tw-relative\">\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\" [disabled]=\"disabled\"\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\n [autocomplete]=\"autocomplete\" />\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\n </svg>\n </span>\n @if (!labelHide) {\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\">{{label}}</span>\n }\n </label>\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\n <!-- Element hidden and its xpath is used to display inside SVG -->\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\n </symbol>\n </svg>\n </div>\n </div>\n }\n\n <!-------------------------------------------SELECT------------------------------------------->\n @if (type === 'select') {\n <div>sas\n <div class=\"tw-relative\">\n <div class=\"tw-absolute\">\n @for (item of option; track $index) {\n <div class=\"tw-w-full\">\n {{item}}\n </div>\n }\n </div>\n </div>\n </div>\n }\n</div>\n\n<!-- Date Picker Template -->\n<ng-template #datePickerTemplate>\n <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4\">\n <!-- Date Picker Header -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-4\">\n <button \n type=\"button\" \n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n (click)=\"previousMonth()\">\n <span class=\"material-symbols-outlined tw-text-base\">chevron_left</span>\n </button>\n \n <button \n type=\"button\" \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\"\n (click)=\"toggleMonthYearSelector()\">\n {{ monthNames[currentMonth] }} {{ currentYear }}\n </button>\n \n <button \n type=\"button\" \n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n (click)=\"nextMonth()\">\n <span class=\"material-symbols-outlined tw-text-base\">chevron_right</span>\n </button>\n </div>\n\n <!-- Month/Year Selector -->\n @if (showMonthYearSelector) {\n <div class=\"tw-mb-4\">\n <!-- Year Navigation -->\n <div class=\"tw-flex tw-items-center tw-justify-between tw-mb-3\">\n <button \n type=\"button\" \n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n (click)=\"previousYear()\">\n <span class=\"material-symbols-outlined tw-text-base\">keyboard_double_arrow_left</span>\n </button>\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-800\">{{ currentYear }}</span>\n <button \n type=\"button\" \n class=\"tw-p-1 tw-rounded-md tw-text-gray-600 hover:tw-bg-gray-100 tw-transition-colors\"\n (click)=\"nextYear()\">\n <span class=\"material-symbols-outlined tw-text-base\">keyboard_double_arrow_right</span>\n </button>\n </div>\n \n <!-- Month Grid -->\n <div class=\"tw-grid tw-grid-cols-3 tw-gap-2 tw-mb-3\">\n @for (monthName of shortMonthNames; track $index) {\n <button \n type=\"button\"\n class=\"tw-px-3 tw-py-2 tw-text-sm tw-rounded-md tw-transition-colors tw-text-center\"\n [class.tw-bg-blue-500]=\"$index === currentMonth\"\n [class.tw-text-white]=\"$index === currentMonth\"\n [class.tw-text-gray-700]=\"$index !== currentMonth\"\n [class.hover:tw-bg-blue-50]=\"$index !== currentMonth\"\n (click)=\"selectMonth($index)\">\n {{ monthName }}\n </button>\n }\n </div>\n \n <!-- Back to Calendar Button -->\n <div class=\"tw-text-center\">\n <button \n type=\"button\" \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\"\n (click)=\"toggleMonthYearSelector()\">\n Back to Calendar\n </button>\n </div>\n </div>\n } @else {\n <!-- Calendar View -->\n <div>\n <!-- Days of Week Header -->\n <div class=\"tw-grid tw-grid-cols-7 tw-gap-1 tw-mb-2\">\n @for (dayName of ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']; track dayName) {\n <div class=\"tw-text-center tw-text-xs tw-font-medium tw-text-gray-500 tw-py-2\">\n {{ dayName }}\n </div>\n }\n </div>\n\n <!-- Calendar Days -->\n <div class=\"tw-grid tw-grid-cols-7 tw-gap-1\">\n @for (dayInfo of calendarDays; track dayInfo.date.getTime()) {\n <button \n type=\"button\"\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\"\n [class.tw-text-gray-400]=\"!dayInfo.isCurrentMonth\"\n [class.tw-text-gray-900]=\"dayInfo.isCurrentMonth\"\n [class.tw-bg-blue-500]=\"dayInfo.isSelected\"\n [class.tw-text-white]=\"dayInfo.isSelected\"\n [class.tw-bg-blue-100]=\"dayInfo.isToday && !dayInfo.isSelected\"\n [class.tw-text-blue-800]=\"dayInfo.isToday && !dayInfo.isSelected\"\n [class.hover:tw-bg-blue-50]=\"dayInfo.isCurrentMonth && !dayInfo.isSelected\"\n (click)=\"showDateTimePicker ? selectDateTimeDate(dayInfo) : selectDate(dayInfo)\">\n {{ dayInfo.day }}\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Date Picker Footer -->\n <div class=\"tw-flex tw-justify-between tw-mt-4 tw-pt-3 tw-border-t tw-border-gray-200\">\n <button \n type=\"button\" \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\"\n (click)=\"closeDatePicker()\">\n Cancel\n </button>\n <button \n type=\"button\" \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\"\n (click)=\"closeDatePicker()\">\n Done\n </button>\n </div>\n </div>\n</ng-template>\n\n<!-- Time Picker Template -->\n<ng-template #timePickerTemplate>\n <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-2xl tw-shadow-lg tw-p-6 tw-w-80\">\n <!-- Time Picker Header -->\n <div class=\"tw-text-center tw-mb-6\">\n <h3 class=\"tw-text-lg tw-font-semibold tw-text-gray-800 tw-m-0\">Time</h3>\n </div>\n\n <!-- Time Spinners Container -->\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-4 tw-mb-6\">\n <!-- Hours -->\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n <button \n type=\"button\"\n class=\"tw-w-10 tw-h-10 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n (click)=\"adjustTime('hours', 'up')\">\n <span class=\"material-symbols-outlined tw-text-xl\">expand_less</span>\n </button>\n <div class=\"tw-text-4xl tw-font-normal tw-text-gray-800 tw-my-2 tw-w-16 tw-text-center\">\n {{ timeHours }}\n </div>\n <button \n type=\"button\"\n class=\"tw-w-10 tw-h-10 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n (click)=\"adjustTime('hours', 'down')\">\n <span class=\"material-symbols-outlined tw-text-xl\">expand_more</span>\n </button>\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">hour</span>\n </div>\n\n <!-- Colon Separator -->\n <div class=\"tw-text-4xl tw-font-normal tw-text-gray-800 tw-mb-6\">:</div>\n\n <!-- Minutes -->\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n <button \n type=\"button\"\n class=\"tw-w-10 tw-h-10 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n (click)=\"adjustTime('minutes', 'up')\">\n <span class=\"material-symbols-outlined tw-text-xl\">expand_less</span>\n </button>\n <div class=\"tw-text-4xl tw-font-normal tw-text-gray-800 tw-my-2 tw-w-16 tw-text-center\">\n {{ timeMinutes.toString().padStart(2, '0') }}\n </div>\n <button \n type=\"button\"\n class=\"tw-w-10 tw-h-10 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n (click)=\"adjustTime('minutes', 'down')\">\n <span class=\"material-symbols-outlined tw-text-xl\">expand_more</span>\n </button>\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">min</span>\n </div>\n\n <!-- Colon Separator -->\n <div class=\"tw-text-4xl tw-font-normal tw-text-gray-800 tw-mb-6\">:</div>\n\n <!-- Seconds -->\n <div class=\"tw-flex tw-flex-col tw-items-center\">\n <button \n type=\"button\"\n class=\"tw-w-10 tw-h-10 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n (click)=\"adjustTime('seconds', 'up')\">\n <span class=\"material-symbols-outlined tw-text-xl\">expand_less</span>\n </button>\n <div class=\"tw-text-4xl tw-font-normal tw-text-gray-800 tw-my-2 tw-w-16 tw-text-center\">\n {{ timeSeconds.toString().padStart(2, '0') }}\n </div>\n <button \n type=\"button\"\n class=\"tw-w-10 tw-h-10 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\n (click)=\"adjustTime('seconds', 'down')\">\n <span class=\"material-symbols-outlined tw-text-xl\">expand_more</span>\n </button>\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">sec</span>\n </div>\n </div>\n\n <!-- AM/PM Toggle -->\n <div class=\"tw-flex tw-justify-center tw-mb-6\">\n <div class=\"tw-inline-flex tw-rounded-lg tw-bg-gray-100 tw-p-1\">\n <button \n type=\"button\"\n class=\"tw-px-6 tw-py-2 tw-text-sm tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\n [class.tw-bg-white]=\"timeFormat === 'AM'\"\n [class.tw-text-gray-800]=\"timeFormat === 'AM'\"\n [class.tw-shadow]=\"timeFormat === 'AM'\"\n [class.tw-text-gray-600]=\"timeFormat !== 'AM'\"\n (click)=\"timeFormat = 'AM'\">\n AM\n </button>\n <button \n type=\"button\"\n class=\"tw-px-6 tw-py-2 tw-text-sm tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\n [class.tw-bg-white]=\"timeFormat === 'PM'\"\n [class.tw-text-gray-800]=\"timeFormat === 'PM'\"\n [class.tw-shadow]=\"timeFormat === 'PM'\"\n [class.tw-text-gray-600]=\"timeFormat !== 'PM'\"\n (click)=\"timeFormat = 'PM'\">\n PM\n </button>\n </div>\n </div>\n\n <!-- Current Time Display -->\n <div class=\"tw-text-center tw-mb-6\">\n <span class=\"tw-text-sm tw-text-gray-600\">\n {{ timeHours }}:{{ timeMinutes.toString().padStart(2, '0') }}:{{ timeSeconds.toString().padStart(2, '0') }} {{ timeFormat }}\n </span>\n </div>\n\n <!-- Time Picker Footer -->\n <div class=\"tw-flex tw-gap-3\">\n <button \n type=\"button\" \n class=\"tw-flex-1 tw-px-4 tw-py-2 tw-text-sm tw-font-medium tw-text-gray-700 tw-bg-white tw-border tw-border-gray-300 hover:tw-bg-gray-50 tw-rounded-lg tw-transition-colors\"\n (click)=\"showDateTimePicker ? closeDateTimePicker() : closeTimePicker()\">\n Cancel\n </button>\n <button \n type=\"button\" \n class=\"tw-flex-1 tw-px-4 tw-py-2 tw-text-sm tw-font-medium tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700 tw-rounded-lg tw-transition-colors tw-border-0\"\n (click)=\"showDateTimePicker ? applyDateTime() : applyTime()\">\n OK\n </button>\n </div>\n\n <!-- Back to Date Button (only for datetime picker) -->\n @if (showDateTimePicker && dateTimeStep === 'time') {\n <div class=\"tw-text-center tw-mt-4\">\n <button \n type=\"button\" \n class=\"tw-text-sm tw-text-blue-600 hover:tw-text-blue-700 tw-underline tw-border-0 tw-bg-transparent tw-p-0\"\n (click)=\"backToDateSelection()\">\n ← Back to Date\n </button>\n </div>\n }\n </div>\n</ng-template>","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 dropdownWidthConstraints: { minWidth: number; maxWidth: number } = { minWidth: 200, maxWidth: 400 };\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: this.dropdownWidthConstraints.minWidth,\n maxWidth: this.dropdownWidthConstraints.maxWidth,\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 viewportWidth = window.innerWidth;\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 \n // Calculate dropdown width constraints\n const triggerWidth = rect.width;\n const maxDropdownWidth = Math.min(triggerWidth * 2, viewportWidth * 0.8); // Max 2x trigger width or 80% of viewport\n const minDropdownWidth = Math.max(triggerWidth, 200); // At least trigger width or 200px\n \n // Store width constraints for portal creation\n this.dropdownWidthConstraints = {\n minWidth: minDropdownWidth,\n maxWidth: maxDropdownWidth\n };\n \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\">\n {{ label }}\n @if (required) {\n <span class=\"tw-text-red-500 tw-ml-1\">*</span>\n }\n </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 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIcon || clearInput || loading,\n 'tw-pr-1': !trailingIcon && !clearInput && !loading,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n 'tw-h-7': size === 'sm',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled,\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': true\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 { 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 { 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> ","/**\n * File Manager Interfaces\n * Based on core_file_manager table schema\n */\n\nexport interface ICoreCyfm {\n _id?: string;\n cyfm_name?: string;\n cyfm_alt_text?: string;\n cyfm_path?: string;\n cyfm_size_in_byte?: number;\n cyfm_type?: string;\n cyfm_creation_dt?: string;\n cyfm_id_user?: string;\n cyfm_permissions?: string[];\n cyfm_tags?: string[];\n cyfm_version?: number;\n cyfm_file_status_sygmt?: string;\n cyfm_group_id?: string; // Group ID for multiple file uploads\n cyfm_ismultiple?: boolean; // Whether the file is multiple\n cyfm_isactive?: boolean;\n}\n\nexport interface ICoreFileManager extends ICoreCyfm {\n _id: string;\n cyfm_name: string;\n cyfm_path: string;\n cyfm_size_in_byte: number;\n cyfm_type: string;\n cyfm_creation_dt: string;\n cyfm_id_user: string;\n cyfm_permissions: string[];\n cyfm_tags: string[];\n cyfm_version: number;\n cyfm_file_status_sygmt: string;\n cyfm_group_id?: string; // Group ID for multiple file uploads\n cyfm_ismultiple?: boolean; // Whether the file is multiple\n cyfm_isactive: boolean;\n}\n\nexport interface controllerResponse {\n success?: boolean; // true or false\n error_code?: string; // general master error codes\n message?: string; // special message we will connect this with general master in future for language achivment\n data?: any; //custom data\n code?: string; // like 200\n action?: string; // code to take conditionla action on save erro code\n total?: number; // for pagination calls\n pageIndex?: number; //for pagination\n pageSize?: number; //for pagination\n controls?: { [key: string]: string }; // error controls name and message\n}\n\nexport type IFileManagerErrorLogger = {\n [key in keyof MFileManager]: string;\n};\n\nexport class MFileManager {\n public cyfm_id: string = \"\";\n\n constructor(init: MFileManager) {\n Object.assign(this, init);\n }\n\n Validate?(): Partial<IFileManagerErrorLogger> {\n let errorLogger: Partial<IFileManagerErrorLogger> = {};\n // Log errors here\n if (!this.cyfm_id) {\n errorLogger.cyfm_id = \"File ID is Required!\";\n }\n\n return errorLogger;\n }\n}\n\nexport class ICoreCyfmSave implements ICoreCyfm {\n _id?: string;\n cyfm_name?: string;\n cyfm_alt_text?: string;\n cyfm_path?: string;\n cyfm_size_in_byte?: number;\n cyfm_type?: string;\n cyfm_creation_dt?: string;\n cyfm_id_user?: string;\n cyfm_permissions?: string[];\n cyfm_tags?: string[];\n cyfm_version?: number;\n cyfm_file_status_sygmt?: string;\n cyfm_group_id?: string; // Group ID for multiple file uploads\n cyfm_isactive?: boolean;\n cyfm_ismultiple?: boolean;\n cyfm_file_base64: string = \"\";\n cyfm_temp_unique_id: string = \"\";\n\n constructor(init: ICoreCyfmSave) {\n Object.assign(this, init);\n }\n}\n\nexport class CoreFileManagerInsertUpdatePayload {\n core_file_manager_new: ICoreCyfmSave[] = [];\n core_file_manager_update: ICoreCyfm[] = [];\n core_file_manager_delete: ICoreCyfm[] = [];\n\n constructor(init: CoreFileManagerInsertUpdatePayload) {\n Object.assign(this, init);\n }\n\n Validate?(): Partial<IFileManagerErrorLogger> {\n let errorLogger: Partial<IFileManagerErrorLogger> = {};\n // Log errors here\n\n return errorLogger;\n }\n}\n\nexport interface fileManagerResponseData extends ICoreCyfm {\n cyfm_file_base64: string\n}\n\nexport interface fileManagerControllerResponse extends controllerResponse {\n data?: fileManagerResponseData[]\n}\n\nexport interface CoreFileManagerInsertUpdateResponse extends controllerResponse {\n data?: {\n core_file_manager: {\n cyfm_id: string;\n cyfm_temp_unique_id: string;\n }[];\n }\n}\n\nexport interface mongooseObjectIdCreateControllerResponse extends controllerResponse {\n data?: {\n objectId: string;\n }\n}\n\nexport interface IFileUploadRequest {\n file: File;\n altText?: string;\n tags?: string[];\n permissions?: string[];\n userId?: string;\n groupId?: string;\n [key: string]: string | number | string[] | File | undefined;\n}\n\nexport interface IFileUploadResponse {\n success: boolean;\n message: string;\n data?: ICoreFileManager;\n error?: string;\n}\n\nexport interface IFileListRequest {\n pageIndex: number;\n pageSize: number;\n search?: string;\n fileType?: string;\n status?: string;\n userId?: string;\n tags?: string[];\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface IFileListResponse {\n success: boolean;\n message: string;\n data: ICoreFileManager[];\n total: number;\n pageIndex: number;\n pageSize: number;\n}\n\nexport interface IFileDeleteResponse {\n success: boolean;\n message: string;\n data?: string;\n}\n\nexport interface IFileUpdateRequest {\n _id: string;\n cyfm_name?: string;\n cyfm_alt_text?: string;\n cyfm_tags?: string[];\n cyfm_permissions?: string[];\n cyfm_file_status_sygmt?: string;\n cyfm_isactive?: boolean;\n}\n\nexport interface IFileUpdateResponse {\n success: boolean;\n message: string;\n data?: ICoreFileManager;\n}\n\nexport interface IFileUploadProgress {\n fileId: string;\n fileName: string;\n progress: number;\n status: 'pending' | 'uploading' | 'completed' | 'error' | 'cancelled';\n error?: string;\n uploadedFile?: any;\n}\n\nexport interface IFileUploadQueueItem extends IFileUploadProgress {\n file: File;\n}\n\nexport interface IFileFilterOptions {\n fileTypes: string[];\n statuses: string[];\n dateRange?: {\n start: Date;\n end: Date;\n };\n sizeRange?: {\n min: number;\n max: number;\n };\n tags: string[];\n}\n\nexport interface IFileGroupingOptions {\n groupBy: 'type' | 'status' | 'date' | 'size' | 'user' | 'none';\n sortBy: 'name' | 'size' | 'date' | 'type';\n sortOrder: 'asc' | 'desc';\n}\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, map, of } from 'rxjs';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CoreFileManagerInsertUpdatePayload, CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData, ICoreCyfmSave, MFileManager, mongooseObjectIdCreateControllerResponse } from '../interfaces/core-file-manager.interface';\nimport { ICoreCyfm, MFileManagerListByGroupIdPayload, fileManagerListByGroupIdControllerResponse, generateStringFromObject } from 'cloud-ide-lms-model';\n\n\n\nexport interface FileUploadOptions {\n altText?: string;\n userId?: string;\n permissions?: string[];\n tags?: string[];\n fileStatus?: string;\n groupId?: string; // Group ID for multiple file uploads\n isMultiple?: boolean;\n retryAttempts?: number;\n timeout?: number;\n [key: string]: string | number | string[] | undefined | boolean; // 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 groupId?: string; // Group ID for filtering uploads by component\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 _objectIdEndpoint = signal('/utility/generateObjectId');\n private readonly _userId = signal<string>('');\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 _fetchedFiles = signal<Map<string, any[]>>(new Map()); // Group ID -> Files mapping\n private readonly _fileIdMapping = signal<Map<string, string>>(new Map()); // Temp ID -> Actual ID mapping\n private readonly _error = signal<string | null>(null);\n \n // Angular 20: Computed values\n readonly baseUrl = this._baseUrl.asReadonly();\n readonly objectIdEndpoint = this._objectIdEndpoint.asReadonly();\n readonly userId = this._userId.asReadonly();\n readonly isUploading = this._isUploading.asReadonly();\n readonly uploadQueue = this._uploadQueue.asReadonly();\n readonly activeUploads = this._activeUploads.asReadonly();\n readonly fetchedFiles = this._fetchedFiles.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 totalFetchedFiles = computed(() => {\n let total = 0;\n this._fetchedFiles().forEach(files => total += files.length);\n return total;\n });\n \n // Optimized computed properties for file counting by group\n readonly getFileCountByGroup = computed(() => {\n const countMap = new Map<string, number>();\n \n // Count files for each group using the same deduplication logic as getAllFilesForGroup\n this._fetchedFiles().forEach((fetchedFiles, groupId) => {\n const fileCount = this.getAllFilesForGroup(groupId).length;\n countMap.set(groupId, fileCount);\n });\n \n // Also count groups that have active uploads but no fetched files yet\n this._activeUploads().forEach((upload, fileId) => {\n if (upload.groupId && !countMap.has(upload.groupId)) {\n const fileCount = this.getAllFilesForGroup(upload.groupId).length;\n countMap.set(upload.groupId, fileCount);\n }\n });\n \n return countMap;\n });\n \n readonly serviceState = computed(() => ({\n isUploading: this._isUploading(),\n uploadQueue: this._uploadQueue(),\n activeUploads: this._activeUploads(),\n fetchedFiles: this._fetchedFiles(),\n error: this._error()\n }));\n\n constructor() {\n // 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 // Upload started for file: ${file.name}\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 }, uploadOptions?.groupId);\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 }, uploadOptions?.groupId);\n \n // Create the file data object with proper typing\n const fileData:ICoreCyfmSave = {\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 || this._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_group_id: uploadOptions?.groupId, // Group ID for multiple file uploads\n cyfm_isactive: true,\n cyfm_ismultiple: uploadOptions?.isMultiple || false,\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 // Don't remove from activeUploads - keep completed files visible with their final progress\n // The floating uploader will handle cleanup when user closes it\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 }, uploadOptions?.groupId);\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 }, uploadOptions?.groupId);\n // Handle the CoreFileManagerInsertUpdateResponse\n const response = event.body as CoreFileManagerInsertUpdateResponse;\n \n if (response.success) {\n // Map temp file ID to actual file ID from response\n const fileData = response.data?.core_file_manager?.[0];\n const actualFileId = fileData?.cyfm_id;\n if (actualFileId && actualFileId !== fileId) {\n // Store the mapping\n const currentMapping = new Map(this._fileIdMapping());\n currentMapping.set(fileId, actualFileId);\n this._fileIdMapping.set(currentMapping);\n }\n \n observer.next(response);\n observer.complete();\n } else {\n console.error('❌ [FileManagerService] Upload failed with response:', response);\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 }, uploadOptions?.groupId);\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 * Set the user ID for file uploads\n * Angular 20: Using signal-based state management\n * @param userId The user ID to associate with uploaded files\n */\n setUserId(userId: string): void {\n console.log('🔍 [FileManagerService] Setting user ID:', userId);\n this._userId.set(userId);\n }\n\n /**\n * Set the object ID generation endpoint\n * Angular 20: Using signal-based state management\n * @param endpoint The endpoint for generating object IDs (e.g., '/utility/generateObjectId')\n */\n setObjectIdEndpoint(endpoint: string): void {\n console.log('🔍 [FileManagerService] Setting object ID endpoint:', endpoint);\n this._objectIdEndpoint.set(endpoint);\n }\n\n /**\n * Generate Object ID for group uploads\n * Calls the backend API to generate a unique ObjectId for grouping multiple files\n * Uses the configurable object ID endpoint instead of hardcoded path\n * @returns Observable with the generated ObjectId\n */\n generateObjectId(): Observable<mongooseObjectIdCreateControllerResponse> {\n const url = `${this._objectIdEndpoint()}`;\n \n console.log('🆔 [FileManagerService] Generating ObjectId from:', url);\n console.log('🔧 [FileManagerService] Using object ID endpoint:', this._objectIdEndpoint());\n \n return this.http.get<mongooseObjectIdCreateControllerResponse>(url).pipe(\n catchError((error: HttpErrorResponse) => {\n console.error('❌ [FileManagerService] Error generating ObjectId:', error);\n this._error.set(`Failed to generate ObjectId: ${error.message}`);\n return throwError(() => error);\n }),\n takeUntilDestroyed(this.destroyRef)\n );\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, groupId?: string): void {\n const currentUploads = new Map(this._activeUploads());\n const progressWithGroupId = { ...progress, groupId };\n \n currentUploads.set(fileId, progressWithGroupId);\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 * Get files by group ID and store them in service state\n * @param groupId The group ID to fetch files for\n * @returns Observable with files list\n */\n getFilesByGroupId(groupId: string): Observable<fileManagerListByGroupIdControllerResponse> {\n console.log('🔍 [FileManagerService] Fetching files for group ID:', groupId);\n \n const payload: MFileManagerListByGroupIdPayload = {\n cyfm_group_id: groupId\n };\n \n // Convert payload to string using generateStringFromObject\n const queryString = generateStringFromObject(payload);\n console.log('📝 [FileManagerService] Query string generated:', queryString);\n \n return this.http.get<fileManagerListByGroupIdControllerResponse>(`${this._baseUrl()}/group/${queryString}`).pipe(\n retry(2),\n catchError(this.handleError.bind(this)),\n takeUntilDestroyed(this.destroyRef)\n );\n }\n\n /**\n * Fetch and store files by group ID in service state\n * @param groupId The group ID to fetch files for\n * @returns Observable that completes when files are stored\n */\n fetchAndStoreFilesByGroupId(groupId: string): Observable<any[]> {\n console.log('📡 [FileManagerService] Fetching and storing files for group:', groupId);\n \n return this.getFilesByGroupId(groupId).pipe(\n map(response => {\n console.log('📡 [FileManagerService] API Response for group', groupId, ':', response);\n \n if (response.success && response.data && response.data.files) {\n // Store files in service state\n const currentFetchedFiles = new Map(this._fetchedFiles());\n currentFetchedFiles.set(groupId, response.data.files);\n this._fetchedFiles.set(currentFetchedFiles);\n \n console.log('📁 [FileManagerService] Stored', response.data.files.length, 'files for group:', groupId);\n console.log('📁 [FileManagerService] Files stored:', response.data.files.map(f => ({ id: f._id, name: f.cyfm_name })));\n \n // Debug: Check if files are actually stored\n const storedFiles = this.getFetchedFilesByGroupId(groupId);\n console.log('📁 [FileManagerService] Verification - files now in storage:', storedFiles.length);\n \n return response.data.files;\n } else {\n console.log('📡 [FileManagerService] No files in response or response not successful:', {\n success: response.success,\n hasData: !!response.data,\n hasFiles: !!(response.data && response.data.files)\n });\n }\n return [];\n }),\n catchError(error => {\n console.error('❌ [FileManagerService] Failed to fetch files for group:', groupId, error);\n return of([]);\n })\n );\n }\n\n /**\n * Get fetched files for a specific group ID\n * @param groupId The group ID to get files for\n * @returns Array of files for the group\n */\n getFetchedFilesByGroupId(groupId: string): any[] {\n console.log(\"getFetchedFilesByGroupId getFetchedFilesByGroupId\", groupId);\n console.log(\"getFetchedFilesByGroupId this._fetchedFiles()\", this._fetchedFiles());\n console.log(\"getFetchedFilesByGroupId this._fetchedFiles().get(groupId)\", this._fetchedFiles().get(groupId));\n return this._fetchedFiles().get(groupId) || [];\n }\n\n /**\n * Signal to trigger floating uploader visibility\n */\n private readonly _showFloatingUploader = signal(false);\n private readonly _triggerGroupId = signal<string | null>(null);\n readonly showFloatingUploader = this._showFloatingUploader.asReadonly();\n readonly getTriggerGroupId = this._triggerGroupId.asReadonly();\n\n /**\n * Trigger floating uploader to show with group ID\n * This is the ONLY way to pass group ID to floating uploader\n */\n triggerFloatingUploaderShow(groupId?: string): void {\n console.log('🎬 [FileManagerService] Triggering floating uploader to show with groupId:', groupId);\n this._triggerGroupId.set(groupId || null);\n this._showFloatingUploader.set(true);\n // Reset after a short delay to allow components to react\n setTimeout(() => {\n this._showFloatingUploader.set(false);\n this._triggerGroupId.set(null);\n }, 100);\n }\n\n /**\n * Get all files (active uploads + fetched files) for a group ID\n * @param groupId The group ID to get files for\n * @returns Combined array of active and fetched files\n */\n getAllFilesForGroup(groupId: string): Array<{ fileId: string; fileName: string; stage: string; percentage?: number }> {\n const files: Array<{ fileId: string; fileName: string; stage: string; percentage?: number }> = [];\n const processedIds = new Set<string>(); // Track all processed IDs (temp and actual)\n const fileNames = new Set<string>(); // Track file names to prevent duplicates by name\n const fileIdMapping = this._fileIdMapping();\n \n // Add active uploads for this group\n this._activeUploads().forEach((upload, tempFileId) => {\n if (upload.groupId === groupId) {\n const fileName = this.getFileNameFromId(tempFileId);\n const actualFileId = fileIdMapping.get(tempFileId) || tempFileId;\n \n // Check if we've already processed this file (by actual ID or name)\n if (!processedIds.has(actualFileId) && !fileNames.has(fileName)) {\n processedIds.add(tempFileId); // Track temp ID\n processedIds.add(actualFileId); // Track actual ID\n fileNames.add(fileName);\n \n files.push({\n fileId: tempFileId, // Keep temp ID for UI consistency\n fileName,\n stage: upload.stage,\n percentage: upload.percentage\n });\n }\n }\n });\n \n // Add fetched files for this group (only if not already processed)\n const fetchedFiles = this.getFetchedFilesByGroupId(groupId);\n fetchedFiles.forEach(file => {\n const fetchedFileId = file._id;\n const fetchedFileName = file.cyfm_name || 'Unknown file';\n \n // Check if this file was already processed (either as temp or actual ID)\n const isAlreadyProcessed = processedIds.has(fetchedFileId) || fileNames.has(fetchedFileName);\n \n if (!isAlreadyProcessed) {\n processedIds.add(fetchedFileId);\n fileNames.add(fetchedFileName);\n \n files.push({\n fileId: fetchedFileId,\n fileName: fetchedFileName,\n stage: 'complete' // Fetched files are already completed\n });\n }\n });\n \n // Smart deduplication completed for group: ${groupId}\n \n return files;\n }\n\n /**\n * Get file name from file ID (extract from the ID format)\n */\n private getFileNameFromId(fileId: string): string {\n const parts = fileId.split('_');\n if (parts.length >= 3) {\n return parts.slice(0, -2).join('_');\n }\n return fileId;\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 * Clear all completed uploads from active uploads\n * Called when the floating uploader is closed\n */\n clearCompletedUploads(): void {\n const currentUploads = new Map(this._activeUploads());\n let hasChanges = false;\n \n currentUploads.forEach((upload, fileId) => {\n if (upload.stage === 'complete') {\n currentUploads.delete(fileId);\n hasChanges = true;\n // Cleared completed upload\n }\n });\n \n if (hasChanges) {\n this._activeUploads.set(currentUploads);\n // Cleared all completed uploads\n }\n }\n \n /**\n * Remove a specific completed upload from active uploads\n */\n removeCompletedUpload(fileId: string): void {\n const currentUploads = new Map(this._activeUploads());\n const upload = currentUploads.get(fileId);\n \n if (upload && upload.stage === 'complete') {\n currentUploads.delete(fileId);\n this._activeUploads.set(currentUploads);\n \n // Also clean up the file ID mapping for this temp ID\n const currentMapping = new Map(this._fileIdMapping());\n if (currentMapping.has(fileId)) {\n currentMapping.delete(fileId);\n this._fileIdMapping.set(currentMapping);\n // Cleaned up mapping\n }\n \n // Removed completed upload\n }\n }\n \n /**\n * Optimized method to get file count for a specific group\n * Uses computed property for better performance\n */\n getFileCountForGroup(groupId: string): number {\n return this.getFileCountByGroup().get(groupId) || 0;\n }\n \n /**\n * Optimized method to check if group has active uploads\n */\n hasActiveUploadsForGroup(groupId: string): boolean {\n return Array.from(this._activeUploads().values())\n .some(upload => upload.groupId === groupId && upload.stage !== 'complete');\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 { Injectable, signal, computed, Type, ComponentRef, ViewContainerRef, Injector } from '@angular/core';\nimport { FloatingContainerConfig } from './floating-container.component';\n// Note: Avoid importing FloatingContainerShortcutsService here to prevent circular dependency\n\n// Re-export for external use\nexport type { FloatingContainerConfig } from './floating-container.component';\n\nexport interface FloatingComponentConfig {\n componentId: string;\n componentType?: Type<any>;\n inputs?: { [key: string]: any };\n outputs?: { [key: string]: (event: any) => void };\n}\n\nexport interface FloatingContainerInstance {\n id: string;\n config: FloatingContainerConfig;\n isVisible: boolean;\n isMinimized: boolean;\n isMaximized: boolean;\n zIndex: number;\n // Instance management\n instanceId: string; // Unique instance identifier\n componentType: string; // Component type for grouping\n createdAt: Date;\n lastAccessed: Date;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideEleFloatingContainerService {\n private containers = signal<Map<string, FloatingContainerInstance>>(new Map());\n private nextZIndex = signal(1000);\n private instanceCounter = signal(0);\n\n // Dynamic component management\n private componentRegistry = new Map<string, Type<any>>();\n private activeComponents = new Map<string, ComponentRef<any>>();\n\n constructor(\n private injector: Injector\n ) {\n // Keyboard shortcuts are registered by FloatingContainerShortcutsService independently\n }\n\n // Computed properties\n visibleContainers = computed(() => \n Array.from(this.containers().values()).filter(container => container.isVisible)\n );\n\n minimizedContainers = computed(() => \n Array.from(this.containers().values()).filter(container => container.isMinimized)\n );\n\n maximizedContainers = computed(() => \n Array.from(this.containers().values()).filter(container => container.isMaximized)\n );\n\n // Container management methods\n show(config: FloatingContainerConfig): string {\n const containerId = config.id || this.generateId();\n const instanceId = this.generateInstanceId(config.componentId || 'default');\n // Get the highest z-index and add 1 to bring new container to front\n const maxZIndex = this.getMaxZIndex();\n const zIndex = maxZIndex + 1;\n const now = new Date();\n \n const container: FloatingContainerInstance = {\n id: containerId,\n config: { ...config, id: containerId },\n isVisible: true,\n isMinimized: false,\n isMaximized: false,\n zIndex,\n instanceId,\n componentType: config.componentId || 'default',\n createdAt: now,\n lastAccessed: now\n };\n\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n newContainers.set(containerId, container);\n return newContainers;\n });\n\n this.nextZIndex.update(z => z + 1);\n return containerId;\n }\n\n hide(containerId: string): void {\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n const container = newContainers.get(containerId);\n if (container) {\n container.isVisible = false;\n newContainers.set(containerId, container);\n }\n return newContainers;\n });\n }\n\n /**\n * Get the maximum z-index among all visible containers\n */\n private getMaxZIndex(): number {\n const containers = this.containers();\n let maxZIndex = 1000; // Base z-index\n \n for (const container of containers.values()) {\n if (container.isVisible && container.zIndex > maxZIndex) {\n maxZIndex = container.zIndex;\n }\n }\n \n return maxZIndex;\n }\n\n /**\n * Bring a container to the front (highest z-index)\n */\n bringToFront(containerId: string): void {\n const maxZIndex = this.getMaxZIndex();\n const newZIndex = maxZIndex + 1;\n const baseZIndex = 1000;\n \n console.log(`🎯 [FloatingContainer] Bringing container '${containerId}' to front`);\n console.log(`🎯 [FloatingContainer] Current max z-index: ${maxZIndex}, new z-index: ${newZIndex}`);\n \n this.containers.update(containers => {\n const newContainers = new Map(containers);\n\n // First, decrement all other visible containers by 1 (clamped to base)\n for (const [id, c] of newContainers) {\n if (c.isVisible && id !== containerId) {\n const decremented = Math.max(baseZIndex, (c.zIndex || baseZIndex) - 1);\n if (decremented !== c.zIndex) {\n c.zIndex = decremented;\n c.lastAccessed = new Date();\n newContainers.set(id, c);\n }\n }\n }\n\n // Then set the focused container to max + 1\n const container = newContainers.get(containerId);\n if (container) {\n const oldZIndex = container.zIndex;\n container.zIndex = newZIndex;\n container.lastAccessed = new Date();\n newContainers.set(containerId, container);\n console.log(`🎯 [FloatingContainer] Container '${containerId}' z-index updated: ${oldZIndex} → ${newZIndex}`);\n } else {\n console.warn(`⚠️ [FloatingContainer] Container '${containerId}' not found!`);\n }\n\n return newContainers;\n });\n }\n\n\n minimize(containerId: string): void {\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n const container = newContainers.get(containerId);\n if (container) {\n container.isMinimized = !container.isMinimized;\n newContainers.set(containerId, container);\n }\n return newContainers;\n });\n }\n\n maximize(containerId: string): void {\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n const container = newContainers.get(containerId);\n if (container) {\n container.isMaximized = !container.isMaximized;\n newContainers.set(containerId, container);\n }\n return newContainers;\n });\n }\n\n\n getContainer(containerId: string): FloatingContainerInstance | undefined {\n return this.containers().get(containerId);\n }\n\n isVisible(containerId: string): boolean {\n const container = this.getContainer(containerId);\n return container ? container.isVisible : false;\n }\n\n isMinimized(containerId: string): boolean {\n const container = this.getContainer(containerId);\n return container ? container.isMinimized : false;\n }\n\n isMaximized(containerId: string): boolean {\n const container = this.getContainer(containerId);\n return container ? container.isMaximized : false;\n }\n\n hideAll(): void {\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n for (const [id, container] of newContainers) {\n container.isVisible = false;\n newContainers.set(id, container);\n }\n return newContainers;\n });\n }\n\n minimizeAll(): void {\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n for (const [id, container] of newContainers) {\n if (container.isVisible) {\n container.isMinimized = true;\n newContainers.set(id, container);\n }\n }\n return newContainers;\n });\n }\n\n private generateId(): string {\n return `floating-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private generateInstanceId(componentType: string): string {\n const counter = this.instanceCounter() + 1;\n this.instanceCounter.update(c => c + 1);\n return `${componentType}-instance-${counter}-${Date.now()}`;\n }\n\n // Multiple instance management methods\n getInstancesByComponentType(componentType: string): FloatingContainerInstance[] {\n return Array.from(this.containers().values())\n .filter(container => container.componentType === componentType);\n }\n\n getActiveInstancesByComponentType(componentType: string): FloatingContainerInstance[] {\n return Array.from(this.containers().values())\n .filter(container => container.componentType === componentType && container.isVisible);\n }\n\n getInstanceCount(componentType: string): number {\n return this.getInstancesByComponentType(componentType).length;\n }\n\n getActiveInstanceCount(componentType: string): number {\n return this.getActiveInstancesByComponentType(componentType).length;\n }\n\n // Close all instances of a component type\n closeAllInstancesOfType(componentType: string): void {\n const instances = this.getInstancesByComponentType(componentType);\n instances.forEach(instance => {\n this.hide(instance.id);\n });\n }\n\n // Minimize all instances of a component type\n minimizeAllInstancesOfType(componentType: string): void {\n const instances = this.getActiveInstancesByComponentType(componentType);\n instances.forEach(instance => {\n this.minimize(instance.id);\n });\n }\n\n // Bring all instances of a component type to front\n bringAllInstancesToFront(componentType: string): void {\n const instances = this.getActiveInstancesByComponentType(componentType);\n instances.forEach(instance => {\n this.bringToFront(instance.id);\n });\n }\n\n // Get instance by unique instance ID\n getInstanceByInstanceId(instanceId: string): FloatingContainerInstance | undefined {\n return Array.from(this.containers().values())\n .find(container => container.instanceId === instanceId);\n }\n\n // Update last accessed time\n updateLastAccessed(containerId: string): void {\n this.containers.update(containers => {\n const newContainers = new Map(containers);\n const container = newContainers.get(containerId);\n if (container) {\n container.lastAccessed = new Date();\n newContainers.set(containerId, container);\n }\n return newContainers;\n });\n }\n\n // ===== DYNAMIC COMPONENT MANAGEMENT =====\n\n /**\n * Register a component for dynamic loading\n */\n registerComponent(componentId: string, componentType: Type<any>): void {\n this.componentRegistry.set(componentId, componentType);\n }\n\n /**\n * Unregister a component\n */\n unregisterComponent(componentId: string): void {\n this.componentRegistry.delete(componentId);\n }\n\n /**\n * Get registered component type\n */\n getComponentType(componentId: string): Type<any> | undefined {\n return this.componentRegistry.get(componentId);\n }\n\n /**\n * Check if component is registered\n */\n isComponentRegistered(componentId: string): boolean {\n return this.componentRegistry.has(componentId);\n }\n\n /**\n * Get registered component IDs\n */\n getRegisteredComponentIds(): string[] {\n return Array.from(this.componentRegistry.keys());\n }\n\n /**\n * Create and load component dynamically\n */\n loadComponent(\n componentId: string, \n viewContainer: ViewContainerRef, \n config?: FloatingComponentConfig\n ): ComponentRef<any> | null {\n const componentType = this.componentRegistry.get(componentId);\n \n if (!componentType) {\n return null;\n }\n\n try {\n viewContainer.clear();\n const componentRef = viewContainer.createComponent(componentType, {\n injector: this.injector\n });\n\n // Set inputs if provided\n if (config?.inputs) {\n Object.keys(config.inputs).forEach(key => {\n if (componentRef.instance && typeof componentRef.instance === 'object' && key in componentRef.instance) {\n (componentRef.instance as any)[key] = config.inputs![key];\n }\n });\n }\n\n // Set outputs if provided\n if (config?.outputs) {\n Object.keys(config.outputs).forEach(key => {\n if (componentRef.instance && typeof componentRef.instance === 'object' && key in componentRef.instance) {\n const output = (componentRef.instance as any)[key];\n if (output && typeof output.subscribe === 'function') {\n output.subscribe(config.outputs![key]);\n }\n }\n });\n }\n\n this.activeComponents.set(componentId, componentRef);\n return componentRef;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Destroy component\n */\n destroyComponent(componentId: string): void {\n const componentRef = this.activeComponents.get(componentId);\n if (componentRef) {\n componentRef.destroy();\n this.activeComponents.delete(componentId);\n }\n }\n\n /**\n * Get active component count\n */\n getActiveComponentCount(): number {\n return this.activeComponents.size;\n }\n\n /**\n * Clear all active components\n */\n clearActiveComponents(): void {\n this.activeComponents.forEach(componentRef => componentRef.destroy());\n this.activeComponents.clear();\n }\n\n // ===== CONTAINER MANAGER FUNCTIONALITY =====\n\n /**\n * Get config signal for a container\n */\n getConfigSignal(config: FloatingContainerConfig) {\n return signal(config);\n }\n\n /**\n * Get minimized signal for a container\n */\n getMinimizedSignal(containerId: string) {\n return computed(() => {\n const container = this.getContainer(containerId);\n return container?.isMinimized || false;\n });\n }\n\n /**\n * Get maximized signal for a container\n */\n getMaximizedSignal(containerId: string) {\n return computed(() => {\n const container = this.getContainer(containerId);\n return container?.isMaximized || false;\n });\n }\n\n getZIndexSignal(containerId: string) {\n return computed(() => {\n const container = this.getContainer(containerId);\n const zIndex = container?.zIndex || 1000;\n console.log(`🎯 [FloatingContainer] Z-index signal for '${containerId}': ${zIndex}`);\n return zIndex;\n });\n }\n\n /**\n * Set z-index for a specific container\n */\n setZIndex(containerId: string, zIndex: number): void {\n console.log(`🎯 [FloatingContainer] Setting z-index for '${containerId}' to ${zIndex}`);\n \n this.containers.update(containers => {\n const newContainers = new Map(containers);\n const container = newContainers.get(containerId);\n if (container) {\n const oldZIndex = container.zIndex;\n container.zIndex = zIndex;\n container.lastAccessed = new Date();\n newContainers.set(containerId, container);\n console.log(`🎯 [FloatingContainer] Container '${containerId}' z-index updated: ${oldZIndex} → ${zIndex}`);\n } else {\n console.warn(`⚠️ [FloatingContainer] Container '${containerId}' not found for z-index update!`);\n }\n return newContainers;\n });\n }\n\n /**\n * Get visible signal for a container\n */\n getVisibleSignal(containerId: string) {\n return computed(() => {\n const container = this.getContainer(containerId);\n return container?.isVisible || false;\n });\n }\n\n /**\n * Get component config for dynamic loading\n */\n getComponentConfig(config: FloatingContainerConfig) {\n if (config.componentConfig) {\n return {\n componentId: config.componentId || config.id,\n inputs: config.componentConfig.inputs,\n outputs: config.componentConfig.outputs\n };\n }\n return undefined;\n }\n\n /**\n * Handle container close event\n */\n onClose(containerId: string): void {\n this.hide(containerId);\n }\n\n /**\n * Handle container minimize event\n */\n onMinimize(containerId: string): void {\n this.minimize(containerId);\n }\n\n /**\n * Handle container maximize event\n */\n onMaximize(containerId: string): void {\n this.maximize(containerId);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from '../../components/floating-container/floating-container.service';\n\nexport interface FileUploaderData {\n groupId?: string;\n userId?: string;\n allowedTypes?: string[];\n maxFileSize?: number;\n uploadPath?: string;\n multiple?: boolean;\n autoUpload?: boolean;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideEleFloatingFileUploaderService {\n private containerService = inject(CideEleFloatingContainerService);\n\n constructor() {\n // Auto-register file uploader component on service initialization\n this.initializeFileUploader();\n }\n\n private async initializeFileUploader(): Promise<void> {\n // Check if already registered to avoid duplicate registration\n if (this.containerService.isComponentRegistered('file-uploader')) {\n console.log('✅ File uploader component already registered');\n return;\n }\n\n try {\n // Use relative import to avoid circular dependency\n const module = await import('./floating-file-uploader.component');\n if (module.CideEleFloatingFileUploaderComponent) {\n this.containerService.registerComponent('file-uploader', module.CideEleFloatingFileUploaderComponent);\n console.log('✅ File uploader component registered successfully');\n }\n } catch (error) {\n console.error('❌ Failed to register file uploader component:', error);\n }\n }\n\n /**\n * Show file uploader in floating container\n */\n async show(data?: FileUploaderData): Promise<string> {\n console.log('🚀 Showing file uploader...');\n console.log('📋 Current registered components:', this.containerService.getRegisteredComponentIds());\n\n // Ensure component is registered before showing\n if (!this.containerService.isComponentRegistered('file-uploader')) {\n console.log('📝 File uploader component not registered, registering now...');\n await this.initializeFileUploader();\n console.log('📋 Components after registration:', this.containerService.getRegisteredComponentIds());\n } else {\n console.log('✅ File uploader component already registered');\n }\n\n const config: FloatingContainerConfig = {\n id: 'file-uploader-main',\n title: 'File Uploader',\n icon: 'cloud_upload',\n width: '500px',\n height: '400px',\n minWidth: '400px',\n minHeight: '300px',\n resizable: true,\n draggable: true,\n closable: true,\n minimizable: true,\n maximizable: true,\n componentId: 'file-uploader',\n componentConfig: data ? {\n inputs: { data },\n outputs: {}\n } : { inputs: ({} as any), outputs: ({} as any) }\n };\n\n const containerId = this.containerService.show(config);\n console.log('✅ Container created with ID:', containerId);\n return containerId;\n }\n\n /**\n * Hide file uploader\n */\n hide(): void {\n this.containerService.hide('file-uploader-main');\n }\n\n /**\n * Show file uploader with specific group ID\n */\n async showWithGroupId(groupId: string, additionalData?: Partial<FileUploaderData>): Promise<string> {\n const data: FileUploaderData = {\n groupId,\n ...additionalData\n };\n return this.show(data);\n }\n\n /**\n * Show file uploader for user with specific settings\n */\n async showForUser(userId: string, settings?: Partial<FileUploaderData>): Promise<string> {\n const data: FileUploaderData = {\n userId,\n allowedTypes: ['image/*', 'application/pdf', 'text/*'],\n maxFileSize: 10485760, // 10MB\n multiple: true,\n autoUpload: false,\n ...settings\n };\n return this.show(data);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { \n Component, \n EventEmitter, \n Input, \n Output, \n OnDestroy, \n OnInit,\n OnChanges,\n SimpleChanges,\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, FileUploadOptions } from '../../services/file-manager.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\nimport { CideEleFloatingFileUploaderComponent } from '../floating-file-uploader/floating-file-uploader.component';\nimport { CideEleFloatingFileUploaderService } from '../floating-file-uploader/floating-file-uploader.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 /** Group ID for multiple file uploads */\n groupId?: string;\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, OnChanges, 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 floatingFileUploaderService = inject(CideEleFloatingFileUploaderService);\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 @Input() showFloatingUploader: boolean = true;\n @Input() floatingUploaderGroupId?: string;\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 readonly showFloatingUploaderSignal = signal(this.showFloatingUploader);\n readonly floatingUploaderGroupIdSignal = signal(this.floatingUploaderGroupId);\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 readonly groupId = signal<string | null>(null); // Group ID for multiple file uploads\n readonly isMultipleUploadMode = signal(false); // Flag to track if we're in multiple upload mode\n readonly hasEverUploaded = signal(false); // Track if this component has ever uploaded files\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 // Optimized computed values - only calculate when needed\n readonly totalFileSize = computed(() => {\n const files = this.files();\n return files ? Array.from(files).reduce((total, file) => total + file.size, 0) : 0;\n });\n \n readonly fileSizeInMB = computed(() => (this.totalFileSize() / 1048576).toFixed(2)); // 1024^2 = 1048576\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 // Minimal DOM operations - only when necessary\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 ngOnChanges(changes: SimpleChanges): void {\n // Angular 20: Update signals when @Input() values change\n if (changes['label']) this.labelSignal.set(this.label);\n if (changes['accept']) this.acceptSignal.set(this.accept);\n if (changes['multiple']) this.multipleSignal.set(this.multiple);\n if (changes['disabled']) this.disabledSignal.set(this.disabled);\n if (changes['required']) this.requiredSignal.set(this.required);\n if (changes['helperText']) this.helperTextSignal.set(this.helperText);\n if (changes['errorText']) this.errorTextSignal.set(this.errorText);\n if (changes['showPreview']) this.showPreviewSignal.set(this.showPreview);\n if (changes['previewWidth']) this.previewWidthSignal.set(this.previewWidth);\n if (changes['previewHeight']) this.previewHeightSignal.set(this.previewHeight);\n if (changes['previewBoxMode']) this.previewBoxModeSignal.set(this.previewBoxMode);\n if (changes['showFileName']) this.showFileNameSignal.set(this.showFileName);\n if (changes['placeholderText']) this.placeholderTextSignal.set(this.placeholderText);\n if (changes['placeholderIcon']) this.placeholderIconSignal.set(this.placeholderIcon);\n if (changes['autoUpload']) this.autoUploadSignal.set(this.autoUpload);\n if (changes['uploadData']) 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 // Check if this is a group ID for multiple files or single file ID\n if (this.isMultipleFileMode()) {\n // Multiple file mode - value is group ID\n console.log('📁 [FileInput] Value is group ID for multiple files:', value);\n this.groupId.set(value);\n this.loadFilesFromGroupId(value);\n } else {\n // Single file mode - value is file ID\n console.log('📝 [FileInput] Value is single 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 }\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 \n // For multiple files, use group ID API to fetch files\n if (value.length > 1) {\n const groupId = this.groupId();\n if (groupId) {\n console.log('📁 [FileInput] Multiple files detected, fetching files for group:', groupId);\n this.loadFilesFromGroupId(groupId);\n }\n }\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 const input = event.target as HTMLInputElement;\n const selectedFiles = input.files;\n \n if (selectedFiles) {\n this.handleFileSelection(selectedFiles);\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, '- SINGLE UPLOAD INITIATED');\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 // Upload progress updated\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 // Success notification removed for cleaner UX\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 // Only emit individual uploadSuccess if not in multiple upload mode\n if (!this.isMultipleUploadMode()) {\n this.uploadSuccess.emit(uploadedId);\n console.log('📝 [FileInput] Upload success event emitted with file ID:', uploadedId);\n } else {\n console.log('📝 [FileInput] Individual upload success suppressed (multiple upload mode) - file ID:', uploadedId);\n }\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: any) => {\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 * Upload multiple files with group ID support\n * FLOW: 1) Generate group ID first, 2) Upload all files with same group ID, 3) Emit group ID on completion\n */\n private uploadMultipleFiles(files: File[]) {\n console.log('🚨 [FileInput] uploadMultipleFiles called for:', files.length, 'files - MULTIPLE UPLOAD INITIATED');\n \n // Set multiple upload mode flag\n this.isMultipleUploadMode.set(true);\n \n // Set upload status to 'start' before starting upload\n this.uploadStatus.set('start');\n this.isUploading.set(true);\n this.uploadProgress.set(0);\n this.uploadProgressChange.emit(0);\n \n // Make form control invalid during upload\n this.onChange(null);\n \n // Show initial progress notification\n const notificationId = this.notificationService.showProgress('🔄 Preparing multiple file upload...', 0, { duration: 0 });\n this.uploadNotificationId.set(notificationId);\n \n // STEP 1: Generate or get group ID BEFORE starting any file uploads\n // Check if component already has a group ID or if one is provided in uploadData\n const existingComponentGroupId = this.groupId();\n const existingUploadDataGroupId = this.uploadDataSignal().groupId;\n \n if (existingComponentGroupId) {\n // Component already has its own group ID - use it\n console.log('🆔 [FileInput] Using existing component group ID:', existingComponentGroupId);\n \n // Open floating uploader with existing group ID\n if (this.showFloatingUploaderSignal()) {\n console.log('🔄 [FileInput] Opening floating uploader with existing group ID:', existingComponentGroupId);\n this.fileManagerService.triggerFloatingUploaderShow(existingComponentGroupId);\n }\n \n this.startMulti(files, existingComponentGroupId);\n } else if (existingUploadDataGroupId) {\n // Use group ID from uploadData and set it as component's group ID\n console.log('🆔 [FileInput] Using group ID from uploadData:', existingUploadDataGroupId);\n this.groupId.set(existingUploadDataGroupId);\n \n // Open floating uploader with group ID from uploadData\n if (this.showFloatingUploaderSignal()) {\n console.log('🔄 [FileInput] Opening floating uploader with uploadData group ID:', existingUploadDataGroupId);\n this.fileManagerService.triggerFloatingUploaderShow(existingUploadDataGroupId);\n }\n \n this.startMulti(files, existingUploadDataGroupId);\n } else {\n // Generate new group ID just before upload\n console.log('🆔 [FileInput] Generating new group ID just before upload...');\n this.fileManagerService.generateObjectId().subscribe({\n next: (response) => {\n const newGroupId = response.data?.objectId as string;\n console.log('🆔 [FileInput] Generated new group ID just before upload:', newGroupId);\n // Set the group ID to this component so it can track its own files\n this.groupId.set(newGroupId);\n \n // Open floating uploader with newly generated group ID\n if (this.showFloatingUploaderSignal()) {\n console.log('🔄 [FileInput] Opening floating uploader with new group ID:', newGroupId);\n this.fileManagerService.triggerFloatingUploaderShow(newGroupId);\n }\n \n this.startMulti(files, newGroupId);\n },\n error: (error: any) => {\n console.error('❌ [FileInput] Failed to generate group ID:', error);\n this.uploadError.emit('Failed to generate group ID');\n this.isUploading.set(false);\n this.uploadStatus.set('error');\n \n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n }\n this.notificationService.error('❌ Failed to generate group ID for multiple file upload', { duration: 0 });\n this.uploadNotificationId.set(null);\n }\n });\n }\n }\n\n /**\n * Start uploading multiple files with the provided group ID\n * All files will be uploaded with the SAME group ID that was generated before this method\n */\n private startMulti(files: File[], groupId: string) {\n console.log('🚀 [FileInput] STEP 2: Starting upload for', files.length, 'files with group ID:', groupId);\n console.log('📋 [FileInput] All files will use the same group ID:', groupId);\n \n // Mark that this component has ever uploaded files\n this.hasEverUploaded.set(true);\n \n let completedUploads = 0;\n let failedUploads = 0;\n const totalFiles = files.length;\n \n // IMPORTANT: All files use the SAME group ID that was generated before starting uploads\n const uploadDataWithGroupId:FileUploadOptions = {\n ...this.uploadDataSignal(),\n groupId: groupId,\n isMultiple: true\n };\n \n files.forEach((file, index) => {\n const componentId = this.id();\n console.log(`📤 [FileInput-${componentId}] Uploading file ${index + 1}/${totalFiles}: \"${file.name}\" with group ID: ${groupId}`);\n console.log(`📤 [FileInput-${componentId}] Upload data:`, uploadDataWithGroupId);\n \n this.fileManagerService.uploadFile(file, uploadDataWithGroupId, (progress: number) => {\n // Calculate overall progress\n const fileProgress = progress / totalFiles;\n const overallProgress = ((completedUploads * 100) + fileProgress) / totalFiles;\n this.uploadProgress.set(overallProgress);\n this.uploadProgressChange.emit(overallProgress);\n \n // Update progress notification\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n const progressMessage = `🔄 Uploading file ${index + 1} of ${totalFiles}...`;\n this.notificationService.updateProgress(notificationId, overallProgress, progressMessage);\n }\n }).pipe(\n takeUntilDestroyed(this.destroyRef)\n ).subscribe({\n next: (response: CoreFileManagerInsertUpdateResponse) => {\n completedUploads++;\n console.log(`✅ [FileInput] File ${index + 1}/${totalFiles} uploaded`);\n \n // Check if all files are completed\n if (completedUploads + failedUploads === totalFiles) {\n this.handleMultipleUploadComplete(completedUploads, failedUploads, totalFiles, groupId);\n }\n },\n error: (error: any) => {\n failedUploads++;\n console.error(`❌ [FileInput] File ${index + 1}/${totalFiles} upload failed:`, error);\n \n // Check if all files are completed\n if (completedUploads + failedUploads === totalFiles) {\n this.handleMultipleUploadComplete(completedUploads, failedUploads, totalFiles, groupId);\n }\n }\n });\n });\n }\n\n /**\n * Handle completion of multiple file upload\n */\n private handleMultipleUploadComplete(completed: number, failed: number, total: number, groupId: string) {\n console.log(`📊 [FileInput] Multiple upload complete: ${completed}/${total} successful, ${failed} failed`);\n \n this.isUploading.set(false);\n this.uploadProgress.set(100);\n this.uploadProgressChange.emit(100);\n \n // Remove progress notification\n const notificationId = this.uploadNotificationId();\n if (notificationId) {\n this.notificationService.remove(notificationId);\n }\n this.uploadNotificationId.set(null);\n \n if (failed === 0) {\n // All files uploaded successfully\n this.uploadStatus.set('success');\n // Success notification removed for cleaner UX\n \n // STEP 3: For multiple file upload, emit the group ID (not individual file IDs)\n this.onChange(groupId);\n this.uploadSuccess.emit(groupId);\n console.log('📝 [FileInput] Multiple upload completed with group ID:', groupId);\n } else if (completed > 0) {\n // Some files uploaded successfully\n this.uploadStatus.set('error');\n this.notificationService.warning(`⚠️ ${completed}/${total} files uploaded. ${failed} failed.`, { duration: 0 });\n this.uploadError.emit(`${failed} out of ${total} files failed to upload`);\n } else {\n // All files failed\n this.uploadStatus.set('error');\n this.notificationService.error(`❌ All ${total} files failed to upload.`, { duration: 0 });\n this.uploadError.emit('All files failed to upload');\n }\n \n // Reset multiple upload mode flag\n this.isMultipleUploadMode.set(false);\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 /**\n * Check if the component is in multiple file mode\n */\n private isMultipleFileMode(): boolean {\n // Check if multiple attribute is set or if we have a group ID\n return this.multiple || this.groupId() !== null;\n }\n\n /**\n * Load files from group ID using the group API\n */\n private loadFilesFromGroupId(groupId: string): void {\n console.log('🔍 [FileInput] Loading files for group ID:', groupId);\n if (!groupId) return;\n \n this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (files) => {\n console.log('📋 [FileInput] Files loaded for group:', files.length);\n \n // Set file names to show count in input\n if (files && files.length > 0) {\n const fileNames = files.map(file => file.file_name || file.name || 'Unknown file');\n this.fileNames.set(fileNames);\n console.log('📝 [FileInput] File names set for display:', fileNames);\n } else {\n this.fileNames.set([]);\n }\n \n // Files are now stored in service state and will be displayed by floating uploader\n },\n error: (error: any) => {\n console.error('❌ [FileInput] Failed to load files for group:', error);\n this.fileNames.set([]);\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 /**\n * Show floating uploader manually\n * This can be called to show the floating uploader even when no files are selected\n */\n showUploader() {\n console.log('👁️ [FileInput] Manually showing floating uploader');\n \n if (!this.showFloatingUploaderSignal()) {\n console.log('⚠️ [FileInput] Floating uploader is disabled');\n return;\n }\n \n const groupId = this.groupId();\n if (groupId) {\n console.log(\"✅ [FileInput] Has existing group ID:\", groupId);\n // Fetch files for the group and trigger floating uploader to show\n this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (files) => {\n console.log('✅ [FileInput] Files fetched for floating uploader:', files.length);\n // Trigger the floating uploader to show via service with group ID\n this.fileManagerService.triggerFloatingUploaderShow(groupId);\n },\n error: (error: any) => {\n console.error('❌ [FileInput] Failed to fetch files for floating uploader:', error);\n // Still trigger show even if fetch fails, with group ID\n this.fileManagerService.triggerFloatingUploaderShow(groupId);\n }\n });\n } else {\n console.log('⚠️ [FileInput] No group ID yet - floating uploader will open when user uploads files');\n // No group ID yet - don't open floating uploader now\n // It will open automatically when user uploads files and group ID is generated\n // This prevents the \"No active files\" issue\n }\n }\n\n /**\n * Get total upload count from file manager service for this component's group ID\n * Uses optimized service method for better performance\n * Only counts files for this component's specific group ID\n */\n getUploadCount(): number {\n const groupId = this.groupId();\n const componentId = this.id();\n \n if (!groupId) {\n // No group ID yet - component hasn't uploaded anything, so count is 0\n return 0;\n }\n \n const count = this.fileManagerService.getFileCountForGroup(groupId);\n return count;\n }\n\n /**\n * Check if there are active uploads for this component's group ID\n * Uses optimized service method for better performance\n * Only checks files for this component's specific group ID\n */\n hasActiveUploads(): boolean {\n const groupId = this.groupId();\n \n if (!groupId) {\n // No group ID yet - component hasn't uploaded anything, so no active uploads\n return false;\n }\n \n return this.fileManagerService.hasActiveUploadsForGroup(groupId);\n }\n\n /**\n * Get count of active (non-completed) uploads for this component's group ID\n * Only counts files for this component's specific group ID\n */\n getActiveUploadCount(): number {\n const groupId = this.groupId();\n \n if (!groupId) {\n // No group ID yet - component hasn't uploaded anything, so no active uploads\n return 0;\n }\n \n return this.fileManagerService.getAllFilesForGroup(groupId)\n .filter(file => file.stage !== 'complete').length;\n }\n\n /**\n * Show floating uploader (alias for showUploader for template)\n */\n async showFloatingUploaderDialog() {\n console.log('👁️ [FileInput] Opening floating file uploader via dedicated service');\n \n if (!this.showFloatingUploaderSignal()) {\n console.log('⚠️ [FileInput] Floating uploader is disabled');\n return;\n }\n \n const groupId = this.groupId();\n if (groupId) {\n console.log(\"✅ [FileInput] Has existing group ID:\", groupId);\n // Use the dedicated floating file uploader service\n try {\n await this.floatingFileUploaderService.showWithGroupId(groupId, {\n allowedTypes: this.acceptSignal() ? this.acceptSignal().split(',') : undefined,\n multiple: this.multipleSignal(),\n autoUpload: this.autoUploadSignal(),\n userId: this.uploadDataSignal().userId\n });\n console.log('✅ [FileInput] Floating file uploader opened successfully');\n } catch (error) {\n console.error('❌ [FileInput] Failed to open floating file uploader:', error);\n this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\n }\n } else {\n console.log('⚠️ [FileInput] No group ID yet - generating one and opening uploader');\n // Generate a new group ID and open the uploader\n this.fileManagerService.generateObjectId().subscribe({\n next: async (response) => {\n const newGroupId = response.data?.objectId as string;\n console.log('🆔 [FileInput] Generated new group ID for uploader:', newGroupId);\n this.groupId.set(newGroupId);\n // Use the dedicated floating file uploader service\n try {\n await this.floatingFileUploaderService.showWithGroupId(newGroupId, {\n allowedTypes: this.acceptSignal() ? this.acceptSignal().split(',') : undefined,\n multiple: this.multipleSignal(),\n autoUpload: this.autoUploadSignal(),\n userId: this.uploadDataSignal().userId\n });\n console.log('✅ [FileInput] Floating file uploader opened successfully');\n } catch (error) {\n console.error('❌ [FileInput] Failed to open floating file uploader:', error);\n this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\n }\n },\n error: (error: any) => {\n console.error('❌ [FileInput] Failed to generate group ID for uploader:', error);\n this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\n }\n });\n }\n }\n\n /**\n * Get dynamic classes for drag and drop zone\n */\n getDragDropZoneClasses(): string {\n const classes = [];\n \n if (this.isDragOver()) {\n classes.push('!tw-border-blue-500', '!tw-bg-blue-100', 'dark:!tw-bg-blue-900/30', 'tw-scale-[1.01]');\n }\n \n if (this.disabledSignal()) {\n classes.push('tw-opacity-50', 'tw-cursor-not-allowed', '!hover:tw-border-gray-300', '!hover:tw-bg-gray-50', 'dark:!hover:tw-bg-gray-800');\n }\n \n if (this.hasFiles()) {\n classes.push('!tw-border-emerald-500', '!tw-bg-emerald-50', 'dark:!tw-bg-emerald-900/20', 'hover:!tw-border-emerald-600', 'hover:!tw-bg-emerald-100', 'dark:hover:!tw-bg-emerald-900/30');\n }\n \n return classes.join(' ');\n }\n\n /**\n * Get dynamic classes for icon\n */\n getIconClasses(): string {\n const classes = ['tw-text-gray-500', 'dark:tw-text-gray-400'];\n \n if (this.isDragOver()) {\n classes.push('!tw-text-blue-500', 'dark:!tw-text-blue-400');\n } else if (this.hasFiles()) {\n classes.push('!tw-text-emerald-500', 'dark:!tw-text-emerald-400');\n }\n \n return classes.join(' ');\n }\n\n /**\n * Get dynamic classes for preview box\n */\n getPreviewBoxClasses(): string {\n const classes = [];\n \n if (this.isDragOver()) {\n classes.push('!tw-border-blue-500', '!tw-bg-blue-100', 'dark:!tw-bg-blue-900/30');\n }\n \n if (this.disabledSignal()) {\n classes.push('tw-opacity-50', 'tw-cursor-not-allowed', '!hover:tw-border-gray-300', '!hover:tw-bg-gray-50', 'dark:!hover:tw-bg-gray-800');\n }\n \n if (this.hasImages()) {\n classes.push('!tw-border-emerald-500', '!tw-bg-emerald-50', 'dark:!tw-bg-emerald-900/20');\n }\n \n return classes.join(' ');\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 console.log('🔥 [FileInput] handleFileSelection called with:', files.length, 'files');\n \n this.files.set(files);\n this.fileNames.set(Array.from(files).map(f => f.name));\n this.generatePreviews();\n \n // Reset upload status when new file is selected\n this.uploadStatus.set('idle');\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 is enabled, proceeding with upload...');\n if (this.multipleSignal()) {\n this.uploadMultipleFiles(Array.from(files));\n } else {\n this.uploadFile(files[0]);\n }\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=\"tw-flex tw-flex-col tw-gap-2\">\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=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-200 tw-mb-1.5 tw-leading-5\" [attr.for]=\"'cide-file-input-' + id()\">\n {{ labelSignal() }}@if (requiredSignal()) {<span class=\"tw-text-red-500 dark:tw-text-red-400\"> *</span>}\n </label>\n }\n \n <!-- Preview Box Mode -->\n @if (isPreviewBoxMode()) {\n <div class=\"tw-relative\">\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=\"tw-hidden\"\n />\n \n <!-- Preview Box -->\n <div \n class=\"tw-border-2 tw-border-dashed tw-border-gray-300 dark:tw-border-gray-600 tw-rounded-lg tw-bg-gray-50 dark:tw-bg-gray-800 tw-cursor-pointer tw-transition-all tw-duration-200 tw-relative tw-overflow-hidden hover:tw-border-blue-500 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20\"\n [class]=\"getPreviewBoxClasses()\"\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=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-h-full tw-p-4\">\n <div class=\"tw-mb-2\">\n <cide-ele-icon class=\"tw-text-gray-400 dark:tw-text-gray-500\" size=\"lg\">{{ isDragOver() ? '📁' : placeholderIconSignal() }}</cide-ele-icon>\n </div>\n <div class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-text-center\">\n {{ isDragOver() ? 'Drop files here...' : placeholderTextSignal() }}\n </div>\n </div>\n }\n \n <!-- Image Preview State -->\n @if (hasImages()) {\n <div class=\"tw-relative tw-w-full tw-h-full\">\n <img \n [src]=\"previewUrls()[0]\" \n [alt]=\"fileNames()[0] || 'Preview image'\"\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-lg\">\n <div class=\"tw-absolute tw-inset-0 tw-bg-black tw-bg-opacity-0 hover:tw-bg-opacity-30 tw-transition-all tw-duration-200 tw-flex tw-items-center tw-justify-center tw-rounded-lg\">\n <div class=\"tw-text-white tw-text-sm tw-opacity-0 hover:tw-opacity-100 tw-transition-opacity tw-duration-200\">Click to change</div>\n </div>\n @if (!disabledSignal()) {\n <button \n type=\"button\" \n class=\"tw-absolute tw-top-2 tw-right-2 tw-w-6 tw-h-6 tw-bg-red-500 hover:tw-bg-red-600 tw-text-white tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-sm tw-font-bold tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer\"\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=\"tw-mt-2 tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-text-center tw-truncate\">\n {{ fileNames()[0] }}\n </div>\n }\n </div>\n }\n\n <!-- Standard Mode -->\n @if (!isPreviewBoxMode()) {\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=\"tw-hidden\"\n />\n \n <!-- Modern Drag and Drop Zone -->\n <div \n class=\"tw-border-2 tw-border-dashed tw-border-gray-300 dark:tw-border-gray-600 tw-rounded-lg tw-bg-gray-50 dark:tw-bg-gray-800 tw-cursor-pointer tw-transition-all tw-duration-200 tw-min-h-[60px] hover:tw-border-blue-500 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20\"\n [class]=\"getDragDropZoneClasses()\"\n (click)=\"triggerFileSelect()\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n \n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-gap-3\">\n <!-- Icon and Text -->\n <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-flex-1 tw-min-w-0\">\n <cide-ele-icon class=\"tw-flex-shrink-0 tw-transition-colors tw-duration-200\" \n [class]=\"getIconClasses()\" \n size=\"sm\">\n {{ isDragOver() ? 'file_download' : (hasFiles() ? 'check_circle' : 'cloud_upload') }}\n </cide-ele-icon>\n \n <div class=\"tw-flex tw-flex-col tw-gap-0.5 tw-min-w-0\">\n @if (isDragOver()) {\n <span class=\"tw-text-sm tw-font-medium tw-text-blue-700 dark:tw-text-blue-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">Drop files here</span>\n } @else if (hasFiles()) {\n <span class=\"tw-text-sm tw-font-medium tw-text-emerald-700 dark:tw-text-emerald-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">\n @if (multipleSignal() && fileNames().length > 1) {\n {{ fileNames().length }} files selected\n } @else {\n {{ fileNames()[0] }}\n }\n </span>\n @if (totalFileSize() > 0) {\n <span class=\"tw-text-xs tw-text-emerald-600 dark:tw-text-emerald-400\">{{ fileSizeInMB() }} MB</span>\n }\n } @else {\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">\n {{ multipleSignal() ? 'Choose files or drag here' : 'Choose file or drag here' }}\n </span>\n }\n </div>\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-gap-1 tw-flex-shrink-0\">\n @if (hasFiles()) {\n <button type=\"button\" \n class=\"tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-border-none tw-rounded tw-bg-transparent tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-red-600 hover:tw-bg-red-50 dark:hover:tw-bg-red-900/20 hover:tw-text-red-700\" \n (click)=\"clearFiles(); $event.stopPropagation()\"\n title=\"Clear files\">\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\n </button>\n }\n </div>\n </div>\n </div>\n }\n \n <!-- Image Preview Section (only for standard mode) -->\n @if (isImagePreviewAvailable() && !isPreviewBoxMode()) {\n <div class=\"tw-mt-3\">\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-200 tw-mb-2\">Preview:</div>\n <div class=\"tw-flex tw-flex-wrap tw-gap-3\">\n @for (previewUrl of previewUrls(); track previewUrl; let i = $index) {\n <div \n class=\"tw-relative tw-border tw-border-gray-200 dark:tw-border-gray-600 tw-rounded-lg tw-overflow-hidden tw-bg-white dark:tw-bg-gray-800\"\n [style.width]=\"previewWidthSignal()\"\n [style.height]=\"previewHeightSignal()\">\n <button \n type=\"button\" \n class=\"tw-absolute tw-top-1 tw-right-1 tw-w-5 tw-h-5 tw-bg-red-500 hover:tw-bg-red-600 tw-text-white tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-xs tw-font-bold tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer tw-z-10\"\n (click)=\"removePreview(i)\"\n title=\"Remove image\">\n ×\n </button>\n <img \n [src]=\"previewUrl\" \n [alt]=\"fileNames()[i] || 'Preview image'\"\n class=\"tw-w-full tw-h-full tw-object-cover\"\n loading=\"lazy\">\n <div class=\"tw-absolute tw-bottom-0 tw-left-0 tw-right-0 tw-bg-black tw-bg-opacity-75 tw-text-white tw-text-xs tw-p-1 tw-truncate\">{{ fileNames()[i] }}</div>\n </div>\n }\n </div>\n </div>\n }\n \n <!-- Upload Status and Show Files Button (only for multiple file inputs) -->\n @if (multiple && showFloatingUploaderSignal() && (getUploadCount() > 0 || hasActiveUploads() || hasEverUploaded())) {\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-1.5 tw-gap-2\">\n <div class=\"tw-flex tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-text-blue-600 dark:tw-text-blue-400\" size=\"sm\">cloud_upload</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">\n @if (hasActiveUploads()) {\n {{ getActiveUploadCount() }} uploading\n } @else if (getUploadCount() > 0) {\n {{ getUploadCount() }} completed\n } @else if (hasEverUploaded()) {\n View uploads\n }\n </span>\n </div>\n <button \n type=\"button\" \n class=\"tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-rounded-md tw-bg-gray-100 dark:tw-bg-gray-700 hover:tw-bg-gray-200 dark:hover:tw-bg-gray-600 tw-text-gray-600 dark:tw-text-gray-300 tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer\"\n (click)=\"showFloatingUploaderDialog()\"\n title=\"View upload progress and history\">\n <cide-ele-icon size=\"sm\">visibility</cide-ele-icon>\n </button>\n </div>\n }\n \n @if (errorTextSignal()) {\n <div class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400 tw-mt-1\">{{ errorTextSignal() }}</div>\n }\n @if (helperTextSignal() && !errorTextSignal()) {\n <div class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-1\">{{ helperTextSignal() }}</div>\n }\n</div> ","import { Component, signal, computed, DestroyRef, inject, OnInit, OnDestroy, effect, Input } from '@angular/core';\nimport { ElementRef, ViewChild } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CideIconComponent } from '../icon/icon.component';\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\n\nexport interface FloatingFileUploaderData {\n userId?: string;\n groupId?: string;\n title?: string;\n description?: string;\n maxFileSize?: number;\n allowedFileTypes?: string[];\n multiple?: boolean;\n}\n\n@Component({\n selector: 'cide-ele-floating-file-uploader',\n standalone: true,\n imports: [\n CommonModule,\n CideIconComponent\n ],\n templateUrl: './floating-file-uploader.component.html',\n styleUrls: []\n})\nexport class CideEleFloatingFileUploaderComponent implements OnInit, OnDestroy {\n private destroyRef = inject(DestroyRef);\n private fileManagerService = inject(CideEleFileManagerService);\n\n @ViewChild('fileInput') fileInputRef!: ElementRef<HTMLInputElement>;\n\n // Input data from floating container\n @Input() data: FloatingFileUploaderData = {};\n\n // Signals for reactive state (simplified for floating container)\n isVisible = signal(true); // Set to true by default for floating containers\n currentUserId = signal('');\n currentGroupId = signal<string | null>(null);\n \n // Use file manager service as the single source of truth\n uploadQueue = computed(() => this.fileManagerService.uploadQueue());\n activeUploads = computed(() => this.fileManagerService.activeUploads());\n\n // Computed values based on service state\n hasUploads = computed(() => this.uploadQueue().length > 0 || this.activeUploads().size > 0);\n hasActiveUploads = computed(() => this.uploadQueue().length > 0 || Array.from(this.activeUploads().values()).some(upload => upload.stage !== 'complete'));\n pendingUploads = computed(() => this.uploadQueue().filter(fileId => !this.activeUploads().has(fileId)));\n activeUploadsLocal = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'reading' || upload.stage === 'uploading'));\n completedUploads = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'complete'));\n failedUploads = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'error'));\n \n // Get all files for the current group (computed property for reactivity)\n allFilesForGroup = computed(() => {\n const groupId = this.currentGroupId();\n if (!groupId) return [];\n \n return this.fileManagerService.getAllFilesForGroup(groupId);\n });\n\n // Check if there are any files to display (active uploads OR fetched files for current group)\n hasFilesToShow = computed(() => {\n return this.hasActiveUploads() || this.allFilesForGroup().length > 0;\n });\n\n // Count methods for template\n getUploadingCount(): number {\n return this.activeUploadsLocal().length;\n }\n\n getCompletedCount(): number {\n return this.completedUploads().length;\n }\n\n getFailedCount(): number {\n return this.failedUploads().length;\n }\n\n // Animation states\n isAnimating = signal(false);\n\n // Drag functionality removed - handled by floating container\n\n // File drag and drop functionality\n isDragOver = signal(false);\n\n // Window resize handler removed - handled by floating container\n\n // Cached dimensions for performance\n // Cached dimensions removed - handled by floating container\n\n constructor() {\n console.log('🚀 [FloatingFileUploader] Component initialized');\n \n // Position initialization removed - handled by floating container\n \n // Consolidated effect for all visibility logic - SINGLE SOURCE OF TRUTH\n effect(() => {\n const hasActiveUploads = this.hasActiveUploads();\n const shouldShow = this.fileManagerService.showFloatingUploader();\n const triggerGroupId = this.fileManagerService.getTriggerGroupId();\n const isCurrentlyVisible = this.isVisible();\n \n // Show due to active uploads\n if (hasActiveUploads && !isCurrentlyVisible) {\n this.showWithAnimation();\n return;\n }\n \n // Handle manual trigger (show OR switch group ID)\n if (shouldShow) {\n if (triggerGroupId) {\n // Always switch to the new group ID (even if already visible)\n console.log('🔄 [FloatingFileUploader] Switching to group ID:', triggerGroupId);\n this.currentGroupId.set(triggerGroupId);\n \n // Fetch files for this group\n this.fileManagerService.fetchAndStoreFilesByGroupId(triggerGroupId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: () => {\n if (!isCurrentlyVisible) {\n this.showWithAnimation();\n }\n },\n error: () => {\n if (!isCurrentlyVisible) {\n this.showWithAnimation(); // Show anyway\n }\n }\n });\n } else if (!isCurrentlyVisible) {\n this.showWithAnimation();\n }\n }\n });\n }\n\n ngOnInit() {\n // Initialize with input data\n this.initializeWithData();\n \n // Set up drag and drop listeners\n this.setupDragAndDrop();\n \n // Set up file input change listeners\n this.setupFileInputListeners();\n \n // Window resize setup removed - handled by floating container\n }\n\n private initializeWithData() {\n console.log('🚀 [FloatingFileUploader] Initializing with data:', this.data);\n \n // Set user ID if provided\n if (this.data.userId) {\n this.currentUserId.set(this.data.userId);\n console.log('👤 [FloatingFileUploader] User ID set:', this.data.userId);\n }\n \n // Set group ID if provided\n if (this.data.groupId) {\n this.currentGroupId.set(this.data.groupId);\n console.log('🆔 [FloatingFileUploader] Group ID set:', this.data.groupId);\n \n // Load existing files for this group\n this.loadExistingFiles();\n }\n \n // Set visibility to true when component loads\n this.isVisible.set(true);\n }\n\n private loadExistingFiles() {\n const groupId = this.currentGroupId();\n if (!groupId) return;\n \n console.log('📁 [FloatingFileUploader] Loading existing files for group:', groupId);\n \n this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: (files) => {\n console.log('📋 [FloatingFileUploader] Files loaded:', files.length);\n },\n error: (error: any) => {\n console.error('❌ [FloatingFileUploader] Failed to load files:', error);\n }\n });\n }\n\n ngOnDestroy() {\n console.log('🧹 [FloatingFileUploader] Component destroyed');\n this.removeDragAndDropListeners();\n this.removeFileInputListeners();\n \n // Window resize cleanup removed - handled by floating container\n }\n\n /**\n * Set up drag and drop functionality\n */\n private setupDragAndDrop(): void {\n document.addEventListener('dragover', this.handleDragOver.bind(this));\n document.addEventListener('dragleave', this.handleDragLeave.bind(this));\n document.addEventListener('drop', this.handleDrop.bind(this));\n }\n\n /**\n * Remove drag and drop listeners\n */\n private removeDragAndDropListeners(): void {\n document.removeEventListener('dragover', this.handleDragOver.bind(this));\n document.removeEventListener('dragleave', this.handleDragLeave.bind(this));\n document.removeEventListener('drop', this.handleDrop.bind(this));\n }\n\n /**\n * Set up file input change listeners\n */\n private setupFileInputListeners(): void {\n // Listen for file input change events globally\n document.addEventListener('change', this.handleFileInputChange.bind(this));\n }\n\n /**\n * Remove file input listeners\n */\n private removeFileInputListeners(): void {\n document.removeEventListener('change', this.handleFileInputChange.bind(this));\n }\n\n /**\n * Handle file input change events\n */\n private handleFileInputChange(event: Event): void {\n const target = event.target as HTMLInputElement;\n \n console.log('🔍 [FloatingFileUploader] File input change event detected:', {\n type: target.type,\n filesLength: target.files?.length || 0,\n element: target\n });\n \n // Check if this is a file input with files\n if (target.type === 'file' && target.files && target.files.length > 0) {\n console.log('📁 [FloatingFileUploader] File input change detected:', target.files.length, 'files');\n \n // Check if the input has a data-user-id attribute for user context\n const userId = target.getAttribute('data-user-id');\n if (userId && userId !== this.currentUserId()) {\n this.setCurrentUserId(userId);\n }\n \n // Handle the files\n this.handleFiles(Array.from(target.files));\n \n // Reset the input to allow selecting the same files again\n target.value = '';\n }\n }\n\n /**\n * Handle drag over event\n */\n private handleDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n \n // Show floating uploader when files are dragged over\n if (event.dataTransfer?.types.includes('Files')) {\n this.showWithAnimation();\n }\n }\n\n /**\n * Handle drag leave event\n */\n private handleDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n \n // Only hide if leaving the entire document\n if (!event.relatedTarget || event.relatedTarget === document.body) {\n this.updateVisibility();\n }\n }\n\n /**\n * Handle drop event\n */\n private handleDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n \n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.handleFiles(Array.from(files));\n }\n }\n\n /**\n * Handle files from drag and drop or file input\n */\n private handleFiles(files: File[]): void {\n console.log('📁 [FloatingFileUploader] Handling files:', files.length);\n \n // Use handleFileSelection to avoid duplicate upload paths\n this.handleFileSelection(files);\n }\n\n /**\n * Update visibility - simplified for notification only\n */\n updateVisibility() {\n // This is just a notification component now\n // The actual uploads are handled by the global uploader\n }\n\n /**\n * Show with animation\n */\n private showWithAnimation() {\n console.log('🎬 [FloatingFileUploader] showWithAnimation called - setting isVisible to true');\n this.isAnimating.set(true);\n this.isVisible.set(true);\n \n // Remove animation class after animation completes\n setTimeout(() => {\n this.isAnimating.set(false);\n console.log('🎬 [FloatingFileUploader] Animation completed, isVisible:', this.isVisible());\n }, 300);\n }\n\n /**\n * Hide with animation\n */\n private hideWithAnimation() {\n this.isAnimating.set(true);\n \n // Wait for animation to complete before hiding\n setTimeout(() => {\n this.isVisible.set(false);\n this.isAnimating.set(false);\n }, 300);\n }\n\n // Minimize and close functionality removed - handled by floating container\n\n /**\n * Get upload summary text\n */\n getUploadSummary(): string {\n const pending = this.pendingUploads();\n const active = this.activeUploadsLocal();\n const completed = this.completedUploads();\n const failed = this.failedUploads();\n\n if (active.length > 0) {\n return `${active.length} uploading`;\n } else if (pending.length > 0) {\n return `${pending.length} pending`;\n } else if (completed.length > 0 && failed.length === 0) {\n return `${completed.length} completed`;\n } else if (failed.length > 0) {\n return `${completed.length} completed, ${failed.length} failed`;\n }\n\n return 'No uploads';\n }\n\n /**\n * Get overall progress percentage\n */\n getOverallProgress(): number {\n const allUploads = Array.from(this.activeUploads().values());\n if (allUploads.length === 0) return 0;\n\n const totalProgress = allUploads.reduce((sum, upload) => sum + (upload.percentage || 0), 0);\n return Math.round(totalProgress / allUploads.length);\n }\n\n /**\n * Get status icon based on upload stage\n */\n getStatusIcon(stage: string): string {\n switch (stage) {\n case 'reading': return 'schedule';\n case 'uploading': return 'cloud_upload';\n case 'complete': return 'check_circle';\n case 'error': return 'error';\n default: return 'help';\n }\n }\n\n /**\n * Get status class based on upload stage\n */\n getStatusClass(stage: string): string {\n switch (stage) {\n case 'reading': return 'status-pending';\n case 'uploading': return 'status-uploading';\n case 'complete': return 'status-completed';\n case 'error': return 'status-error';\n default: return 'status-unknown';\n }\n }\n\n /**\n * Cancel upload\n */\n cancelUpload(fileId: string) {\n console.log('🚫 [FloatingFileUploader] Cancelling upload:', fileId);\n this.fileManagerService.cancelUpload(fileId);\n }\n\n /**\n * Get file name from file ID (extract from the ID format)\n */\n getFileNameFromId(fileId: string): string {\n // Extract filename from the fileId format: filename_size_timestamp\n const parts = fileId.split('_');\n if (parts.length >= 3) {\n // Remove the last two parts (size and timestamp) to get the filename\n return parts.slice(0, -2).join('_');\n }\n return fileId;\n }\n\n /**\n * Get all files from service state (pending + active uploads + fetched files)\n * This method now uses the computed property for consistency\n */\n getAllFiles() {\n return this.allFilesForGroup();\n }\n\n\n /**\n * Set current user ID\n */\n setCurrentUserId(userId: string) {\n this.currentUserId.set(userId);\n this.fileManagerService.setUserId(userId);\n }\n\n\n\n /**\n * Check if there are any uploads for the current group\n */\n hasUploadsForCurrentGroup(): boolean {\n const groupId = this.currentGroupId();\n if (!groupId) {\n // If no group filter, show all uploads\n return this.hasUploads();\n }\n \n // Check if any uploads belong to the current group\n // Note: This would need to be enhanced based on how group IDs are stored in the file manager service\n return this.hasUploads();\n }\n\n /**\n * Handle drag over event for file drop\n */\n onDragOver(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(true);\n }\n\n /**\n * Handle drag leave event for file drop\n */\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n }\n\n /**\n * Handle drop event for file drop\n */\n onDrop(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver.set(false);\n\n const files = event.dataTransfer?.files;\n if (files && files.length > 0) {\n this.handleFileSelection(Array.from(files));\n }\n }\n\n /**\n * Trigger file input click\n */\n triggerFileInput(): void {\n if (this.fileInputRef?.nativeElement) {\n this.fileInputRef.nativeElement.click();\n }\n }\n\n /**\n * Handle file input change\n */\n onFileInputChange(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files && input.files.length > 0) {\n this.handleFileSelection(Array.from(input.files));\n input.value = ''; // Reset input\n }\n }\n\n /**\n * Handle file selection from drag/drop or file input\n */\n private handleFileSelection(files: File[]): void {\n const groupId = this.currentGroupId();\n \n // Group ID must be provided by the file input component\n if (!groupId) {\n console.error('❌ [FloatingFileUploader] No group ID available. Files cannot be uploaded without a group ID from the file input component.');\n return;\n }\n \n // Upload files using the file manager service\n files.forEach((file) => {\n this.fileManagerService.uploadFile(file, {\n groupId: groupId,\n isMultiple: true,\n userId: this.currentUserId()\n });\n });\n }\n\n\n /**\n * Update cached dimensions (throttled for performance)\n */\n // Cached dimensions functionality removed - handled by floating container\n\n /**\n * Start dragging the uploader\n */\n // Drag functionality removed - handled by floating container\n\n /**\n * Handle dragging movement\n */\n // All drag functionality removed - handled by floating container\n\n /**\n * Set up window resize listener to keep uploader within bounds\n */\n // Window resize functionality removed - handled by floating container\n\n /**\n * Initialize default position\n */\n // Position initialization removed - handled by floating container\n\n}\n","<!-- File Uploader Content (No absolute positioning - works within floating container) -->\n@if (isVisible()) {\n<div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden\">\n <!-- Content starts directly - no header needed since floating container provides it -->\n\n <!-- Content -->\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-pb-4\">\n \n <!-- Drag and Drop Zone -->\n <div class=\"tw-mb-4 tw-p-6 tw-border-2 tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-bg-gray-50 tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-center hover:tw-border-blue-500 hover:tw-bg-blue-50\" \n [class.tw-border-blue-500]=\"isDragOver()\"\n [class.tw-bg-blue-100]=\"isDragOver()\"\n [class.tw-scale-105]=\"isDragOver()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\" \n (drop)=\"onDrop($event)\" \n (click)=\"triggerFileInput()\">\n \n <!-- Hidden file input -->\n <input #fileInput \n type=\"file\" \n [multiple]=\"data.multiple !== false\" \n [accept]=\"data.allowedFileTypes?.join(',') || '*/*'\" \n (change)=\"onFileInputChange($event)\" \n class=\"tw-hidden\">\n \n <div class=\"tw-flex tw-flex-col tw-items-center tw-gap-2\">\n <cide-ele-icon class=\"tw-text-gray-400 tw-transition-colors tw-duration-200\" \n [class.tw-text-blue-500]=\"isDragOver()\"\n size=\"sm\">cloud_upload</cide-ele-icon>\n \n <div>\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">\n {{ isDragOver() ? 'Drop files here' : 'Drag files here or click to browse' }}\n </div>\n @if (data.description) {\n <div class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ data.description }}</div>\n }\n </div>\n </div>\n </div>\n \n <!-- Upload Queue - Show files from service state -->\n @if (allFilesForGroup().length > 0) {\n <div class=\"tw-space-y-2\">\n <!-- Show all files from service state -->\n @for (file of allFilesForGroup(); track file.fileId) {\n <div class=\"tw-flex tw-items-center tw-px-4 tw-py-3 tw-rounded-lg tw-transition-colors tw-duration-200 tw-bg-white tw-border tw-border-gray-200 hover:tw-bg-gray-100 hover:tw-shadow-sm\"\n [class.tw-bg-blue-50]=\"file.stage === 'uploading'\"\n [class.tw-bg-green-50]=\"file.stage === 'complete'\"\n [class.tw-bg-red-50]=\"file.stage === 'error'\">\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-1 tw-min-w-0\">\n <cide-ele-icon class=\"tw-flex-shrink-0\" size=\"xs\">{{ getStatusIcon(file.stage) }}</cide-ele-icon>\n <div class=\"tw-min-w-0 tw-flex-1\">\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\">{{ file.fileName }}</div>\n <div class=\"tw-text-xs\">\n @switch (file.stage) {\n @case ('pending') {\n <span class=\"tw-text-yellow-600 tw-font-medium\">Waiting...</span>\n }\n @case ('reading') {\n <span class=\"tw-text-yellow-600 tw-font-medium\">Reading...</span>\n }\n @case ('uploading') {\n <span class=\"tw-text-blue-600 tw-font-medium\">Uploading...</span>\n }\n @case ('complete') {\n <span class=\"tw-text-green-600 tw-font-medium\">Completed</span>\n }\n @case ('error') {\n <span class=\"tw-text-red-600 tw-font-medium\">Failed</span>\n }\n }\n </div>\n </div>\n </div>\n\n <!-- Progress Bar (only for uploading files) -->\n @if (file.stage === 'uploading' && file.percentage !== undefined) {\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-ml-2 tw-min-w-[80px]\">\n <div class=\"tw-flex-1 tw-h-1 tw-bg-gray-200 tw-rounded-full tw-overflow-hidden\">\n <div class=\"tw-h-full tw-bg-blue-500 tw-transition-all tw-duration-300\" [style.width.%]=\"file.percentage\"></div>\n </div>\n <span class=\"tw-text-xs tw-text-gray-500 tw-min-w-[24px] tw-text-right\">{{ file.percentage }}%</span>\n </div>\n }\n\n <!-- Actions -->\n <div class=\"tw-flex tw-gap-1 tw-ml-2\">\n @switch (file.stage) {\n @case ('pending') {\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \n (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('reading') {\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \n (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('uploading') {\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \n (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\n </button>\n }\n @case ('complete') {\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-text-green-600\" title=\"Completed\">\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\n </button>\n }\n @case ('error') {\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-blue-50 hover:tw-text-blue-600\" \n title=\"Retry\">\n <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\n </button>\n }\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <!-- No uploads message when manually opened -->\n <div class=\"tw-py-8 tw-text-center tw-text-gray-500\">\n <div class=\"tw-flex tw-flex-col tw-items-center tw-gap-4\">\n <cide-ele-icon size=\"md\" class=\"tw-text-gray-300 tw-opacity-70\">cloud_upload</cide-ele-icon>\n <div>\n <h4 class=\"tw-text-lg tw-font-semibold tw-text-gray-700 tw-mb-2\">No active uploads</h4>\n <p class=\"tw-text-sm tw-text-gray-500\">Upload files to see their progress here</p>\n </div>\n </div>\n </div>\n }\n </div>\n\n <!-- Status summary - integrated into content -->\n @if (hasActiveUploads()) {\n <div class=\"tw-px-4 tw-py-2 tw-bg-gray-50\">\n <div class=\"tw-flex tw-gap-3 tw-text-xs\">\n <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-blue-600\">\n <cide-ele-icon size=\"xs\">upload</cide-ele-icon>\n <span>{{ getUploadingCount() }} uploading</span>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-green-600\">\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\n <span>{{ getCompletedCount() }} completed</span>\n </div>\n <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-red-600\">\n <cide-ele-icon size=\"xs\">error</cide-ele-icon>\n <span>{{ getFailedCount() }} failed</span>\n </div>\n </div>\n </div>\n }\n</div>\n}","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]=\"{\n 'cide-element-size-xxs': (size === '2xs'),\n 'cide-element-size-xs': (size === 'xs'),\n 'cide-element-size-sm': (size === 'sm'),\n 'cide-element-size-md': (size === 'md'),\n 'cide-element-size-lg': (size === 'lg'),\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\n 'cide-element-input-label-start': (labelDir === 'start'),\n 'cide-element-input-label-end': (labelDir === 'end'),\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\n 'cide-element-input-label-less': (!label || labelHide),\n 'cide-element-style-outline': (fill === 'outline'),\n 'cide-element-style-solid': (fill === 'solid'),\n 'cide-element-style-standard': (fill === 'standard'),\n}\">\n <label *ngIf=\"label && !labelHide\" [for]=\"id\" class=\"cide-textarea-label\">\n {{ label }}\n <span *ngIf=\"required\" class=\"tw-text-red-500 tw-ml-1\">*</span>\n </label>\n <div class=\"cide-element-input-wrapper\">\n <!-- Leading Icon -->\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\n </span>\n <!-- Trailing Icon -->\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\n *ngIf=\"trailingIconInternal\">\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\n </span>\n <!-- Clear -->\n <button class=\"cide-input-clear\" *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\n </button>\n <!-- Textarea -->\n <textarea [id]=\"id\" [attr.placeholder]=\"placeholder\" [attr.rows]=\"rows\"\n [attr.minlength]=\"minlength > 0 ? minlength : null\" [attr.maxlength]=\"maxlength > 0 ? maxlength : null\"\n [disabled]=\"disabled\" [(ngModel)]=\"ngModel\" (input)=\"onInput($event)\" (blur)=\"onBlur()\"\n [ngClass]=\"{\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\n 'tw-pl-1': !leadingIcon,\n 'tw-pr-8': trailingIconInternal,\n 'tw-pr-1': !trailingIconInternal,\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\n '!tw-mt-0': labelHide,\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\n }\"\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>\n </div>\n <span *ngIf=\"(errorText || helperText) && !isValid\" class=\"cide-textarea-help-error-text\">{{ errorText || helperText\n }}</span>\n <span *ngIf=\"helperText && isValid\" class=\"cide-textarea-help-error-text\">{{ helperText }}</span>\n</div>","import { Component, Input, Output, EventEmitter, signal, computed, OnInit, OnDestroy, HostListener, inject, effect, input, ChangeDetectionStrategy } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideIconComponent } from '../icon/icon.component';\n// Breadcrumb service removed; component operates on inputs and local state only\n\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n icon?: string;\n url?: string;\n disabled?: boolean;\n type?: 'root' | 'category' | 'entity' | 'custom';\n metadata?: any;\n}\n\nexport interface BreadcrumbDropdownOption {\n id: string;\n label: string;\n icon?: string;\n disabled?: boolean;\n action?: () => void;\n}\n\nexport interface BreadcrumbSeparator {\n type: 'chevron' | 'slash' | 'arrow' | 'dot' | 'custom';\n icon?: string;\n text?: string;\n}\n\nexport type BreadcrumbStyle = 'modern' | 'classic' | 'minimal' | 'hierarchical';\n\nexport interface BreadcrumbConfig {\n style: BreadcrumbStyle;\n separator: BreadcrumbSeparator;\n showHomeIcon: boolean;\n homeIcon: string;\n maxItems: number;\n showDropdownOnOverflow: boolean;\n dropdownOptions: BreadcrumbDropdownOption[];\n clickableItems: boolean;\n showTooltips: boolean;\n responsive: boolean;\n compact: boolean;\n animated: boolean;\n}\n\n@Component({\n selector: 'cide-ele-breadcrumb',\n standalone: true,\n imports: [CommonModule, CideIconComponent],\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CideEleBreadcrumbComponent implements OnInit, OnDestroy {\n // Input signals\n items = input<BreadcrumbItem[]>([]);\n style = input<BreadcrumbStyle>('modern');\n separator = input<BreadcrumbSeparator>({ type: 'chevron' });\n showHomeIcon = input<boolean>(true);\n homeIcon = input<string>('home');\n maxItems = input<number>(5);\n showDropdownOnOverflow = input<boolean>(true);\n dropdownOptions = input<BreadcrumbDropdownOption[]>([]);\n clickableItems = input<boolean>(true);\n showTooltips = input<boolean>(true);\n responsive = input<boolean>(true);\n compact = input<boolean>(false);\n animated = input<boolean>(true);\n loadingInput = input<boolean>(false);\n disabled = input<boolean>(false);\n\n // Optional context id when used inside tabs/popups; if omitted, uses service active context\n contextId = input<string | undefined>(undefined);\n // Optional pageCode input for auto-resolving via provided resolver (no service injection needed by consumer)\n pageCode = input<string | undefined>(undefined);\n\n // Output events\n @Output() itemClick = new EventEmitter<BreadcrumbItem>();\n @Output() dropdownOptionClick = new EventEmitter<BreadcrumbDropdownOption>();\n @Output() homeClick = new EventEmitter<void>();\n\n // Internal state\n private showDropdown = signal(false);\n private isOverflowing = signal(false);\n private visibleItems = signal<BreadcrumbItem[]>([]);\n private hiddenItems = signal<BreadcrumbItem[]>([]);\n private localItems = signal<BreadcrumbItem[]>([]);\n private localLoading = signal<boolean>(false);\n\n // Computed properties\n showDropdownSignal = computed(() => this.showDropdown());\n isOverflowingSignal = computed(() => this.isOverflowing());\n visibleItemsSignal = computed(() => this.visibleItems());\n hiddenItemsSignal = computed(() => this.hiddenItems());\n\n // Configuration based on style\n config = computed(() => this.getConfigForStyle(this.style()));\n effectiveLoading = computed(() => this.loadingInput() || this.localLoading());\n\n // Service for auto-binding when inputs are not provided\n // No service injection\n private cleanupEffect?: { destroy: () => void };\n\n constructor() {\n // Mirror external input items into local state within injection context\n const ref = effect(() => {\n const inItems = this.items();\n if (inItems && inItems.length > 0) {\n this.localItems.set([...inItems]);\n this.processItems();\n }\n });\n this.cleanupEffect = { destroy: () => ref.destroy() };\n }\n\n ngOnInit() {\n // Initial calculation\n this.processItems();\n }\n\n ngOnDestroy() {\n this.cleanupEffect?.destroy();\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event) {\n const target = event.target as HTMLElement;\n if (!target.closest('.breadcrumb-dropdown-container')) {\n this.showDropdown.set(false);\n }\n }\n\n // Process items based on maxItems and overflow\n private processItems() {\n const source = this.localItems();\n const max = this.maxItems();\n if (source.length <= max) {\n this.visibleItems.set([...source]);\n this.hiddenItems.set([]);\n this.isOverflowing.set(false);\n } else {\n const visibleCount = this.showDropdownOnOverflow() ? max - 1 : max;\n this.visibleItems.set(source.slice(0, visibleCount));\n this.hiddenItems.set(source.slice(visibleCount));\n this.isOverflowing.set(true);\n }\n }\n\n // Get configuration based on style\n private getConfigForStyle(style: BreadcrumbStyle): BreadcrumbConfig {\n const configs: Record<BreadcrumbStyle, BreadcrumbConfig> = {\n modern: {\n style: 'modern',\n separator: { type: 'chevron' },\n showHomeIcon: true,\n homeIcon: 'home',\n maxItems: 5,\n showDropdownOnOverflow: true,\n dropdownOptions: [],\n clickableItems: true,\n showTooltips: true,\n responsive: true,\n compact: false,\n animated: true\n },\n classic: {\n style: 'classic',\n separator: { type: 'slash' },\n showHomeIcon: false,\n homeIcon: 'home',\n maxItems: 8,\n showDropdownOnOverflow: false,\n dropdownOptions: [],\n clickableItems: true,\n showTooltips: false,\n responsive: false,\n compact: true,\n animated: false\n },\n minimal: {\n style: 'minimal',\n separator: { type: 'dot' },\n showHomeIcon: false,\n homeIcon: 'home',\n maxItems: 3,\n showDropdownOnOverflow: true,\n dropdownOptions: [],\n clickableItems: false,\n showTooltips: true,\n responsive: true,\n compact: true,\n animated: false\n },\n hierarchical: {\n style: 'hierarchical',\n separator: { type: 'chevron' },\n showHomeIcon: true,\n homeIcon: 'home',\n maxItems: 4,\n showDropdownOnOverflow: true,\n dropdownOptions: [],\n clickableItems: true,\n showTooltips: false,\n responsive: true,\n compact: true,\n animated: false\n }\n };\n\n return configs[style];\n }\n\n // Event handlers\n onItemClick(item: BreadcrumbItem) {\n if (!item.disabled && this.clickableItems() && !this.disabled()) {\n this.itemClick.emit(item);\n }\n }\n\n onHomeClick() {\n if (!this.disabled()) {\n this.homeClick.emit();\n }\n }\n\n onDropdownToggle() {\n if (!this.disabled()) {\n this.showDropdown.set(!this.showDropdown());\n }\n }\n\n onDropdownOptionClick(option: BreadcrumbDropdownOption) {\n if (!option.disabled && !this.disabled()) {\n this.dropdownOptionClick.emit(option);\n this.showDropdown.set(false);\n }\n }\n\n // Utility methods\n getItemClasses(item: BreadcrumbItem, isLast: boolean = false): string {\n const classes = ['breadcrumb-item'];\n \n if (this.config().compact) classes.push('compact');\n if (this.config().animated) classes.push('animated');\n if (item.disabled) classes.push('disabled');\n if (isLast) classes.push('last');\n if (this.clickableItems() && !item.disabled) classes.push('clickable');\n \n return classes.join(' ');\n }\n\n getContainerClasses(): string {\n const classes = ['breadcrumb-container'];\n \n classes.push(`style-${this.style()}`);\n if (this.config().compact) classes.push('compact');\n if (this.config().responsive) classes.push('responsive');\n if (this.config().animated) classes.push('animated');\n if (this.effectiveLoading()) classes.push('loading');\n if (this.disabled()) classes.push('disabled');\n \n return classes.join(' ');\n }\n\n getSeparatorIcon(): string {\n const separatorMap: Record<string, string> = {\n 'chevron': 'chevron_right',\n 'slash': 'keyboard_arrow_right',\n 'arrow': 'arrow_forward',\n 'dot': 'fiber_manual_record'\n };\n \n const sep = this.separator();\n return separatorMap[sep.type] || 'chevron_right';\n }\n\n getTooltipText(item: BreadcrumbItem): string {\n if (!this.showTooltips) return '';\n \n let tooltip = item.label;\n if (item.type) {\n tooltip += ` (${item.type})`;\n }\n if (item.url) {\n tooltip += ` - ${item.url}`;\n }\n \n return tooltip;\n }\n\n // Public methods for external control\n public toggleDropdown() {\n this.onDropdownToggle();\n }\n\n public closeDropdown() {\n this.showDropdown.set(false);\n }\n\n public updateItems(newItems: BreadcrumbItem[]) {\n this.localItems.set(newItems);\n this.processItems();\n }\n\n public addItem(item: BreadcrumbItem) {\n this.localItems.set([...this.localItems(), item]);\n this.processItems();\n }\n\n public removeItem(itemId: string) {\n this.localItems.set(this.localItems().filter(item => item.id !== itemId));\n this.processItems();\n }\n\n public setLoading(value: boolean) {\n this.localLoading.set(value);\n }\n}\n","<!-- Breadcrumb Component Template -->\n<div [class]=\"getContainerClasses()\" class=\"tw-flex tw-items-center tw-text-xs tw-text-gray-700 tw-py-0\">\n \n <!-- Loading State -->\n @if (effectiveLoading()) {\n <div class=\"breadcrumb-loading\">\n <cide-ele-icon class=\"animate-spin\">refresh</cide-ele-icon>\n <span>Loading...</span>\n </div>\n }\n\n <!-- Main Breadcrumb Content -->\n @if (!effectiveLoading()) {\n <nav class=\"tw-flex tw-items-center tw-p-1 tw-min-w-0 tw-flex-1\" role=\"navigation\" aria-label=\"Breadcrumb\">\n <ol class=\"tw-flex tw-items-center tw-list-none tw-m-0 tw-p-0 tw-gap-1 tw-flex-wrap\">\n \n <!-- Home Icon (if enabled) -->\n @if (config().showHomeIcon) {\n <li class=\"tw-flex tw-items-center tw-gap-1 tw-px-1 tw-whitespace-nowrap tw-relative\" \n [class.tw-cursor-pointer]=\"clickableItems() && !disabled()\"\n (click)=\"onHomeClick()\"\n [title]=\"showTooltips() ? 'Go to Home' : ''\">\n <cide-ele-icon class=\"tw-text-gray-500 tw-text-xs\">\n {{ config().homeIcon }}\n </cide-ele-icon>\n </li>\n \n <!-- Separator after home -->\n @if (visibleItemsSignal().length > 0) {\n <li class=\"tw-flex tw-items-center tw-text-gray-300 tw-mx-0.5\">\n @if (separator().type === 'custom' && separator().text) {\n <span class=\"tw-font-normal tw-text-gray-400\">{{ separator().text }}</span>\n } @else {\n <cide-ele-icon class=\"tw-text-xs\">\n {{ getSeparatorIcon() }}\n </cide-ele-icon>\n }\n </li>\n }\n }\n\n <!-- Visible Items -->\n @for (item of visibleItemsSignal(); track item.id; let i = $index; let isLast = $last) {\n <li class=\"tw-flex tw-items-center tw-gap-1 tw-px-1 tw-whitespace-nowrap tw-relative\"\n [class.tw-cursor-pointer]=\"clickableItems() && !disabled()\"\n [class.tw-text-gray-400]=\"isLast\"\n (click)=\"onItemClick(item)\"\n [title]=\"getTooltipText(item)\"\n [attr.aria-current]=\"isLast ? 'page' : null\">\n \n <!-- Item Icon (if provided) -->\n @if (item.icon) {\n <cide-ele-icon class=\"tw-text-gray-500 tw-text-xs tw-flex-shrink-0\">\n {{ item.icon }}\n </cide-ele-icon>\n }\n \n <!-- Item Label -->\n <span class=\"tw-font-medium tw-text-xs\">\n {{ item.label }}\n </span>\n \n <!-- Item Type Badge (for hierarchical style) -->\n @if (style() === 'hierarchical' && item.type && item.type !== 'root') {\n <span class=\"item-type-badge\" [class]=\"'type-' + item.type\">\n {{ item.type }}\n </span>\n }\n </li>\n\n <!-- Separator (except for last item) -->\n @if (!isLast || isOverflowingSignal()) {\n <li class=\"tw-flex tw-items-center tw-text-gray-300 tw-mx-0.5\">\n @if (separator().type === 'custom' && separator().text) {\n <span class=\"tw-font-normal tw-text-gray-400\">{{ separator().text }}</span>\n } @else {\n <cide-ele-icon class=\"tw-text-xs\">\n {{ getSeparatorIcon() }}\n </cide-ele-icon>\n }\n </li>\n }\n }\n\n <!-- Overflow Dropdown -->\n @if (isOverflowingSignal() && showDropdownOnOverflow()) {\n <li class=\"breadcrumb-item overflow-item\">\n <div class=\"breadcrumb-dropdown-container\">\n <button type=\"button\" \n class=\"overflow-button\"\n (click)=\"onDropdownToggle()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showDropdownSignal()\"\n aria-haspopup=\"true\"\n [title]=\"showTooltips() ? 'More items' : ''\">\n <cide-ele-icon class=\"overflow-icon\">more_horiz</cide-ele-icon>\n <span class=\"overflow-text\" [class.compact]=\"config().compact\">\n {{ hiddenItemsSignal().length }}+ more\n </span>\n </button>\n \n <!-- Dropdown Menu -->\n @if (showDropdownSignal()) {\n <div class=\"breadcrumb-dropdown\" role=\"menu\">\n <div class=\"dropdown-header\">\n <span>Hidden Items</span>\n </div>\n \n <!-- Hidden Items -->\n @for (item of hiddenItemsSignal(); track item.id) {\n <button type=\"button\" \n class=\"dropdown-item\"\n (click)=\"onItemClick(item)\"\n [disabled]=\"item.disabled || disabled()\"\n role=\"menuitem\">\n @if (item.icon) {\n <cide-ele-icon class=\"dropdown-item-icon\">{{ item.icon }}</cide-ele-icon>\n }\n <span class=\"dropdown-item-label\">{{ item.label }}</span>\n </button>\n }\n \n <!-- Custom Dropdown Options -->\n @if (dropdownOptions().length > 0) {\n <div class=\"dropdown-divider\"></div>\n @for (option of dropdownOptions(); track option.id) {\n <button type=\"button\" \n class=\"dropdown-option\"\n (click)=\"onDropdownOptionClick(option)\"\n [disabled]=\"option.disabled || disabled()\"\n role=\"menuitem\">\n @if (option.icon) {\n <cide-ele-icon class=\"dropdown-option-icon\">{{ option.icon }}</cide-ele-icon>\n }\n <span class=\"dropdown-option-label\">{{ option.label }}</span>\n </button>\n }\n }\n </div>\n }\n </div>\n </li>\n }\n </ol>\n </nav>\n }\n\n</div>\n","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 { 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, 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 { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideElementsService } from '../../utils';\nimport { CideSpinnerComponent } from '../spinner/spinner.component';\nimport { NavigationExtras, Router } from '@angular/router';\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'text' | 'link' | 'success' | 'danger' | 'warning' | 'info' | 'ghost';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\nexport type ButtonType = 'button' | 'submit' | 'reset';\nexport type ButtonShape = 'default' | 'rounded' | 'pill' | 'square';\nexport type ButtonElevation = 'none' | 'low' | 'medium' | 'high';\n\n/**\n * Advanced Angular button component that provides a comprehensive button implementation\n * with loading state, styling variants, animations, tooltips, and other features.\n * \n * This component uses proper Angular templating to avoid hydration issues (NG0500).\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'button[cideEleButton], a[cideEleButton]',\n standalone: true,\n imports: [CommonModule, CideSpinnerComponent],\n templateUrl: './cide-ele-button.component.html',\n styleUrls: ['./cide-ele-button.component.scss'],\n host: {\n 'class': 'cide-button tw-rounded-md tw-text-white tw-py-0.5 tw-select-none tw-flex tw-items-center tw-justify-center',\n '[class.cide-button-disabled]': 'disabled || loading',\n '[attr.disabled]': '(disabled || loading) ? true : null',\n '[class.primary]': 'variant === \"primary\"',\n '[class.secondary]': 'variant === \"secondary\"',\n '[class.outline]': 'variant === \"outline\"',\n '[class.text]': 'variant === \"text\"',\n '[class.link]': 'variant === \"link\"',\n '[class.success]': 'variant === \"success\"',\n '[class.danger]': 'variant === \"danger\"',\n '[class.warning]': 'variant === \"warning\"',\n '[class.info]': 'variant === \"info\"',\n '[class.xs]': 'size === \"xs\"',\n '[class.sm]': 'size === \"sm\"',\n '[class.md]': 'size === \"md\"',\n '[class.lg]': 'size === \"lg\"',\n '[class.xl]': 'size === \"xl\"',\n '[class.rounded]': 'shape === \"rounded\"',\n '[class.pill]': 'shape === \"pill\"',\n '[class.square]': 'shape === \"square\"',\n '[class.elevation-none]': 'elevation === \"none\"',\n '[class.elevation-low]': 'elevation === \"low\"',\n '[class.elevation-medium]': 'elevation === \"medium\"',\n '[class.elevation-high]': 'elevation === \"high\"',\n '[attr.type]': 'type',\n '[attr.aria-label]': 'ariaLabel',\n '[attr.aria-disabled]': 'disabled || loading',\n '[attr.data-testid]': 'testId',\n '[attr.title]': 'tooltip',\n '[class]': 'customClass'\n }\n})\n\nexport class CideEleButtonComponent implements OnInit, OnChanges, OnDestroy {\n private destroy$ = new Subject<void>();\n private clickCount = 0;\n private clickDebouncer$ = new Subject<Event>();\n\n constructor(\n private elementService: CideElementsService,\n private router: Router,\n private renderer: Renderer2,\n private elementRef: ElementRef\n ) {\n // Setup debounced click handler to prevent double-clicks\n this.clickDebouncer$\n .pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n )\n .subscribe({\n next: (event) => {\n this.handleClick(event);\n }\n });\n }\n \n // INPUTS\n /** \n * @description Label of button like Submit, Update, Add, etc. \n * Note: it is only used in case you did not set label between tags (via ng-content)\n */\n @Input() label: string = \"\";\n \n /** @description Button style variant */\n @Input() variant: ButtonVariant = 'primary';\n \n /** @description Button size */\n @Input() size: ButtonSize = 'md';\n \n /** @description Button HTML type attribute */\n @Input() type: ButtonType = 'button';\n \n /** @description Button shape */\n @Input() shape: ButtonShape = 'default';\n \n /** @description Button shadow elevation */\n @Input() elevation: ButtonElevation = 'medium';\n \n /** @description Button disabled state */\n @Input() disabled: boolean | null = false;\n \n /** @description Unique ID of control, used to differentiate elements */\n @Input() id: string = '';\n \n /** @description Enables loading state with spinner */\n @Input() loading: boolean = false;\n \n /** @description Makes button take full width of container */\n @Input() fullWidth: boolean = false;\n \n /** @description Icon to display on the left side of the button */\n @Input() leftIcon: string = '';\n \n /** @description Icon to display on the right side of the button */\n @Input() rightIcon: string = '';\n \n /** @description Additional CSS classes to apply */\n @Input() customClass: string = '';\n \n /** @description Tooltip text to display on hover */\n @Input() tooltip: string = '';\n \n /** @description Aria label for accessibility */\n @Input() ariaLabel: string = '';\n \n /** @description Test ID for automated testing */\n @Input() testId: string = '';\n \n /** @description Route to navigate to when clicked (for link buttons) */\n @Input() routerLink: string | unknown[] = '';\n \n /** @description Router navigation extras */\n @Input() routerExtras: NavigationExtras = {};\n \n /** @description Prevent multiple rapid clicks (debounce) */\n @Input() preventDoubleClick: boolean = true;\n \n /** @description Animation on click */\n @Input() animated: boolean = true;\n \n // OUTPUTS\n /**\n * @description Click event of button\n */\n @Output() btnClick: EventEmitter<Event> = new EventEmitter();\n \n /**\n * @description Double click event\n */\n @Output() doubleClick: EventEmitter<Event> = new EventEmitter();\n\n @HostListener('click', ['$event'])\n onClick(event: Event): void {\n if (this.disabled || this.loading) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n \n if (this.animated) {\n this.addClickAnimation();\n }\n \n if (this.preventDoubleClick) {\n this.clickDebouncer$.next(event);\n } else {\n this.handleClick(event);\n }\n }\n \n private handleClick(event: Event): void {\n // Handle navigation for routerLink\n if (this.routerLink && this.routerLink.length) {\n event.preventDefault();\n this.router.navigate(\n Array.isArray(this.routerLink) ? this.routerLink : [this.routerLink],\n this.routerExtras\n );\n }\n \n // Handle double-click detection\n this.clickCount++;\n setTimeout(() => {\n if (this.clickCount === 2) {\n this.doubleClick.emit(event);\n }\n this.clickCount = 0;\n }, 300);\n \n // Emit standard click event\n this.btnClick.emit(event);\n }\n \n private addClickAnimation(): void {\n // Add ripple effect\n const ripple = this.renderer.createElement('span');\n this.renderer.addClass(ripple, 'ripple-effect');\n \n // Position the ripple at click position\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n const size = Math.max(rect.width, rect.height);\n \n // Set ripple style\n this.renderer.setStyle(ripple, 'width', `${size}px`);\n this.renderer.setStyle(ripple, 'height', `${size}px`);\n this.renderer.setStyle(ripple, 'left', `${0}px`);\n this.renderer.setStyle(ripple, 'top', `${0}px`);\n \n // Add ripple to button\n this.renderer.appendChild(this.elementRef.nativeElement, ripple);\n \n // Modern ES2022+ pattern: Use Promise-based delay\n const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n delay(600).then(() => {\n this.renderer.removeChild(this.elementRef.nativeElement, ripple);\n });\n }\n\n ngOnInit(): void {\n if (this.id) {\n this.getControlData();\n }\n \n // Set aria-label if not explicitly provided\n if (!this.ariaLabel && this.label) {\n this.ariaLabel = this.label;\n }\n }\n \n ngOnChanges(changes: SimpleChanges): void {\n // Update aria-label when label changes\n if (changes['label'] && !this.ariaLabel) {\n this.ariaLabel = changes['label'].currentValue;\n }\n }\n \n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n async getControlData() {\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });\n if (cide_element_data) {\n this.label = cide_element_data?.sype_label as string;\n }\n }\n}\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 { Injectable } from '@angular/core';\nimport { HttpClient, HttpEvent, HttpEventType, HttpProgressEvent, HttpRequest } from '@angular/common/http';\nimport { Observable, throwError, BehaviorSubject, of } from 'rxjs';\nimport { catchError, tap, map } from 'rxjs/operators';\nimport { \n cidePath, \n coreRoutesUrl, \n generateStringFromObject, \n hostManagerRoutesUrl\n} from 'cloud-ide-lms-model';\nimport {\n ICoreFileManager,\n IFileUploadRequest,\n IFileUploadResponse,\n IFileListRequest,\n IFileListResponse,\n IFileDeleteResponse,\n IFileUpdateRequest,\n IFileUpdateResponse,\n IFileUploadProgress\n} from '../interfaces/core-file-manager.interface';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideCoreFileManagerService {\n private apiUrl = `${coreRoutesUrl?.fileManager}`;\n private fileListSubject = new BehaviorSubject<ICoreFileManager[]>([]);\n public fileList$ = this.fileListSubject.asObservable();\n\n constructor(private http: HttpClient) {\n console.log('CideCoreFileManagerService initialized - using real API');\n }\n\n /**\n * Get file list from API\n */\n getFileList(body: IFileListRequest): Observable<IFileListResponse> {\n const query = generateStringFromObject(body);\n return this.http?.get<IFileListResponse>(cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]))\n .pipe(\n tap((response: IFileListResponse) => {\n if (response?.success) {\n this.fileListSubject.next(response?.data || []);\n }\n }),\n catchError(error => {\n console.error('CideCoreFileManagerService API error:', error);\n return this.handleError(error);\n })\n );\n }\n\n /**\n * Get file list using mock data (deprecated - use getFileList instead)\n */\n getFileListWithMockData(_body: IFileListRequest): Observable<IFileListResponse> {\n console.warn('getFileListWithMockData is deprecated. Use getFileList instead.');\n return this.getFileList(_body);\n }\n\n /**\n * Get file list from cache (if available)\n */\n getFileListFromCache(): ICoreFileManager[] {\n return this.fileListSubject.value;\n }\n\n /**\n * Upload file with progress tracking\n */\n uploadFile(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\n const formData = new FormData();\n formData.append('file', request.file);\n formData.append('altText', request.altText || '');\n formData.append('tags', JSON.stringify(request.tags || []));\n formData.append('permissions', JSON.stringify(request.permissions || []));\n formData.append('userId', request.userId || '');\n\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'upload']);\n const req = new HttpRequest('POST', url, formData, {\n reportProgress: true\n });\n\n return this.http.request<IFileUploadResponse>(req).pipe(\n catchError(this.handleError)\n );\n }\n\n /**\n * Upload file with progress tracking (mock version - deprecated)\n */\n uploadFileWithMockData(request: IFileUploadRequest): Observable<HttpEvent<IFileUploadResponse>> {\n console.warn('uploadFileWithMockData is deprecated. Use uploadFile instead.');\n return this.uploadFile(request);\n }\n\n /**\n * Update file metadata\n */\n updateFile(request: IFileUpdateRequest): Observable<IFileUpdateResponse> {\n console.log('Updating file:', request);\n \n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager]);\n return this.http.post<IFileUpdateResponse>(url, request)\n .pipe(\n tap((response: IFileUpdateResponse) => {\n if (response.success) {\n this.refreshFileList();\n }\n }),\n catchError(this.handleError)\n );\n }\n\n /**\n * Delete file\n */\n deleteFile(id: string): Observable<IFileDeleteResponse> {\n const payload = { cyfm_id: id };\n const query = generateStringFromObject(payload);\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\n return this.http.delete<IFileDeleteResponse>(url)\n .pipe(\n tap((response: IFileDeleteResponse) => {\n if (response.success) {\n this.refreshFileList();\n }\n }),\n catchError(this.handleError)\n );\n }\n\n /**\n * Delete multiple files\n */\n deleteMultipleFiles(ids: string[]): Observable<{ success: boolean; message?: string; data?: unknown }> {\n console.log('Deleting multiple files:', ids);\n const payload = { ids };\n const query = generateStringFromObject(payload);\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\n return this.http.delete<{ success: boolean; message?: string; data?: unknown }>(url)\n .pipe(\n tap((response: { success: boolean; message?: string; data?: unknown }) => {\n if (response.success) {\n this.refreshFileList();\n }\n }),\n catchError(this.handleError)\n );\n }\n\n /**\n * Toggle file active status\n */\n toggleFileStatus(id: string): Observable<IFileListResponse> {\n console.log('Toggling file status:', id);\n const payload = { id };\n const query = generateStringFromObject(payload);\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, query]);\n return this.http.put<IFileListResponse>(url, {})\n .pipe(\n tap((response: IFileListResponse) => {\n if (response.success) {\n this.refreshFileList();\n }\n }),\n catchError(this.handleError)\n );\n }\n\n /**\n * Get file by ID\n */\n getFileById(id: string): Observable<{ success: boolean; message: string; data?: ICoreFileManager }> {\n console.log('Getting file by ID:', id);\n const payload = { cyfm_id: id };\n const query = generateStringFromObject(payload);\n const url = cidePath?.join([hostManagerRoutesUrl?.cideSuiteHost, coreRoutesUrl?.module, coreRoutesUrl?.fileManager, 'byId', query]);\n return this.http.get<{ success: boolean; message: string; data?: ICoreFileManager }>(url)\n .pipe(\n catchError(this.handleError)\n );\n }\n\n\n /**\n * Find file by ID\n */\n findFileById(id: string, items: ICoreFileManager[] = this.fileListSubject.value): ICoreFileManager | null {\n for (const item of items) {\n if (item._id === id) {\n return item;\n }\n }\n return null;\n }\n\n /**\n * Get file size in human readable format\n */\n getFileSizeDisplay(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n }\n\n /**\n * Get file type icon\n */\n getFileTypeIcon(fileType: string): string {\n const typeMap: Record<string, string> = {\n 'image/jpeg': 'image',\n 'image/png': 'image',\n 'image/gif': 'image',\n 'image/svg+xml': 'image',\n 'application/pdf': 'picture_as_pdf',\n 'text/plain': 'description',\n 'text/html': 'code',\n 'application/json': 'code',\n 'application/javascript': 'code',\n 'text/css': 'code',\n 'application/zip': 'folder_zip',\n 'application/x-zip-compressed': 'folder_zip',\n 'application/msword': 'description',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'description',\n 'application/vnd.ms-excel': 'table_chart',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'table_chart',\n 'application/vnd.ms-powerpoint': 'slideshow',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'slideshow'\n };\n return typeMap[fileType] || 'insert_drive_file';\n }\n\n /**\n * Refresh file list from server\n */\n private refreshFileList(): void {\n const defaultBody: IFileListRequest = {\n pageIndex: 1,\n pageSize: 10\n };\n this.getFileList(defaultBody).subscribe({\n next: () => {\n console.log('File list refreshed successfully');\n },\n error: (error) => {\n console.error('Error refreshing file list:', error);\n }\n });\n }\n\n /**\n * Handle errors\n */\n private handleError(error: unknown): Observable<never> {\n let errorMessage = 'An error occurred';\n\n if (error instanceof Error) {\n errorMessage = error.message;\n } else if (typeof error === 'string') {\n errorMessage = error;\n }\n\n console.error('CideCoreFileManagerService Error:', errorMessage);\n return throwError(() => new Error(errorMessage));\n }\n}\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 { Injectable, OnDestroy } from '@angular/core';\r\n\r\nexport interface KeyboardShortcut {\r\n id: string;\r\n key: string;\r\n ctrlKey?: boolean;\r\n altKey?: boolean;\r\n shiftKey?: boolean;\r\n metaKey?: boolean;\r\n description?: string;\r\n action: () => void;\r\n preventDefault?: boolean;\r\n stopPropagation?: boolean;\r\n}\r\n\r\nexport interface ShortcutOverride {\r\n shortcutId: string;\r\n newKey: string;\r\n newCtrlKey?: boolean;\r\n newAltKey?: boolean;\r\n newShiftKey?: boolean;\r\n newMetaKey?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class KeyboardShortcutService implements OnDestroy {\r\n private shortcuts = new Map<string, KeyboardShortcut>();\r\n private overrides = new Map<string, ShortcutOverride>();\r\n private keydownListener?: (event: KeyboardEvent) => void;\r\n\r\n constructor() {\r\n this.setupGlobalListener();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeGlobalListener();\r\n }\r\n\r\n /**\r\n * Register a new keyboard shortcut\r\n */\r\n register(shortcut: KeyboardShortcut): void {\r\n this.shortcuts.set(shortcut.id, shortcut);\r\n console.log(`⌨️ [KeyboardShortcut] Registered shortcut: ${shortcut.id} (${this.getKeyDescription(shortcut)})`);\r\n }\r\n\r\n /**\r\n * Override an existing shortcut with new key combination\r\n */\r\n override(shortcutId: string, newKey: string, options?: {\r\n ctrlKey?: boolean;\r\n altKey?: boolean;\r\n shiftKey?: boolean;\r\n metaKey?: boolean;\r\n }): void {\r\n const originalShortcut = this.shortcuts.get(shortcutId);\r\n if (!originalShortcut) {\r\n console.warn(`⚠️ [KeyboardShortcut] Cannot override shortcut '${shortcutId}' - not found`);\r\n return;\r\n }\r\n\r\n const override: ShortcutOverride = {\r\n shortcutId,\r\n newKey,\r\n newCtrlKey: options?.ctrlKey,\r\n newAltKey: options?.altKey,\r\n newShiftKey: options?.shiftKey,\r\n newMetaKey: options?.metaKey\r\n };\r\n\r\n this.overrides.set(shortcutId, override);\r\n console.log(`🔄 [KeyboardShortcut] Override registered for '${shortcutId}': ${this.getKeyDescription({ ...originalShortcut, ...options, key: newKey })}`);\r\n }\r\n\r\n /**\r\n * Remove a shortcut\r\n */\r\n unregister(shortcutId: string): void {\r\n this.shortcuts.delete(shortcutId);\r\n this.overrides.delete(shortcutId);\r\n console.log(`🗑️ [KeyboardShortcut] Removed shortcut: ${shortcutId}`);\r\n }\r\n\r\n /**\r\n * Remove override for a shortcut (restore original key combination)\r\n */\r\n removeOverride(shortcutId: string): void {\r\n this.overrides.delete(shortcutId);\r\n console.log(`🔄 [KeyboardShortcut] Override removed for: ${shortcutId}`);\r\n }\r\n\r\n /**\r\n * Get all registered shortcuts\r\n */\r\n getAllShortcuts(): KeyboardShortcut[] {\r\n return Array.from(this.shortcuts.values());\r\n }\r\n\r\n /**\r\n * Get shortcuts by category or filter\r\n */\r\n getShortcuts(filter?: (shortcut: KeyboardShortcut) => boolean): KeyboardShortcut[] {\r\n const shortcuts = this.getAllShortcuts();\r\n return filter ? shortcuts.filter(filter) : shortcuts;\r\n }\r\n\r\n /**\r\n * Check if a shortcut is registered\r\n */\r\n hasShortcut(shortcutId: string): boolean {\r\n return this.shortcuts.has(shortcutId);\r\n }\r\n\r\n /**\r\n * Get shortcut information\r\n */\r\n getShortcut(shortcutId: string): KeyboardShortcut | undefined {\r\n return this.shortcuts.get(shortcutId);\r\n }\r\n\r\n /**\r\n * Clear all shortcuts\r\n */\r\n clearAll(): void {\r\n this.shortcuts.clear();\r\n this.overrides.clear();\r\n console.log(`🧹 [KeyboardShortcut] All shortcuts cleared`);\r\n }\r\n\r\n /**\r\n * Set up global keyboard listener\r\n */\r\n private setupGlobalListener(): void {\r\n this.keydownListener = (event: KeyboardEvent) => {\r\n this.handleKeydown(event);\r\n };\r\n \r\n document.addEventListener('keydown', this.keydownListener);\r\n console.log(`🎧 [KeyboardShortcut] Global keyboard listener attached`);\r\n }\r\n\r\n /**\r\n * Remove global keyboard listener\r\n */\r\n private removeGlobalListener(): void {\r\n if (this.keydownListener) {\r\n document.removeEventListener('keydown', this.keydownListener);\r\n this.keydownListener = undefined;\r\n console.log(`🎧 [KeyboardShortcut] Global keyboard listener removed`);\r\n }\r\n }\r\n\r\n /**\r\n * Handle keydown events\r\n */\r\n private handleKeydown(event: KeyboardEvent): void {\r\n for (const [shortcutId, shortcut] of this.shortcuts) {\r\n if (this.matchesShortcut(event, shortcut)) {\r\n // Check for override\r\n const override = this.overrides.get(shortcutId);\r\n if (override && !this.matchesOverride(event, override)) {\r\n continue; // Skip if override doesn't match\r\n }\r\n\r\n if (shortcut.preventDefault !== false) {\r\n event.preventDefault();\r\n }\r\n\r\n if (shortcut.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n\r\n console.log(`⌨️ [KeyboardShortcut] Executing shortcut: ${shortcutId}`);\r\n shortcut.action();\r\n break; // Only execute one shortcut per keydown\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if event matches shortcut\r\n */\r\n private matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\r\n return event.key === shortcut.key &&\r\n (shortcut.ctrlKey === undefined || event.ctrlKey === shortcut.ctrlKey) &&\r\n (shortcut.altKey === undefined || event.altKey === shortcut.altKey) &&\r\n (shortcut.shiftKey === undefined || event.shiftKey === shortcut.shiftKey) &&\r\n (shortcut.metaKey === undefined || event.metaKey === shortcut.metaKey);\r\n }\r\n\r\n /**\r\n * Check if event matches override\r\n */\r\n private matchesOverride(event: KeyboardEvent, override: ShortcutOverride): boolean {\r\n return event.key === override.newKey &&\r\n (override.newCtrlKey === undefined || event.ctrlKey === override.newCtrlKey) &&\r\n (override.newAltKey === undefined || event.altKey === override.newAltKey) &&\r\n (override.newShiftKey === undefined || event.shiftKey === override.newShiftKey) &&\r\n (override.newMetaKey === undefined || event.metaKey === override.newMetaKey);\r\n }\r\n\r\n /**\r\n * Get human-readable key description\r\n */\r\n private getKeyDescription(shortcut: Partial<KeyboardShortcut>): string {\r\n const modifiers = [];\r\n if (shortcut.ctrlKey) modifiers.push('Ctrl');\r\n if (shortcut.altKey) modifiers.push('Alt');\r\n if (shortcut.shiftKey) modifiers.push('Shift');\r\n if (shortcut.metaKey) modifiers.push('Meta');\r\n \r\n return [...modifiers, shortcut.key].join(' + ');\r\n }\r\n\r\n /**\r\n * Get key description for a shortcut ID\r\n */\r\n getKeyDescriptionForShortcut(shortcutId: string): string {\r\n const shortcut = this.shortcuts.get(shortcutId);\r\n if (!shortcut) return 'Not found';\r\n \r\n const override = this.overrides.get(shortcutId);\r\n if (override) {\r\n return this.getKeyDescription({\r\n key: override.newKey,\r\n ctrlKey: override.newCtrlKey,\r\n altKey: override.newAltKey,\r\n shiftKey: override.newShiftKey,\r\n metaKey: override.newMetaKey\r\n });\r\n }\r\n \r\n return this.getKeyDescription(shortcut);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\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 { 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 // Use base64 data directly\n if (fileData.cyfm_file_base64) {\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 base64 data available for file');\n }\n }\n\n}","import { Component, Input, inject, signal, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { AbstractControl, FormGroup } from '@angular/forms';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\n\n@Component({\n selector: 'cide-form-field-error',\n standalone: true,\n template: `\n @if (isFormGroupMode()) {\n <!-- Form Group Error Display -->\n @if (formErrors().length > 0) {\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-text-red-600 tw-text-sm\">\n <cide-ele-icon class=\"tw-text-red-500\">error</cide-ele-icon>\n <span>{{ getFormGroupErrorMessage() }}</span>\n </div>\n }\n } @else {\n <!-- Individual Field Error Display -->\n @if (control && control.invalid && (control.dirty || control.touched)) {\n <div class=\"tw-text-red-500 tw-text-xs tw-mt-1 tw-flex tw-items-center tw-gap-1\">\n <cide-ele-icon class=\"tw-text-xs\">error</cide-ele-icon>\n <span>{{ getErrorMessage() }}</span>\n </div>\n }\n }\n `,\n imports: [CideIconComponent]\n})\nexport class CideFormFieldErrorComponent implements OnInit, OnChanges {\n @Input() control!: AbstractControl;\n @Input() formGroup!: FormGroup;\n @Input() fieldName: string = '';\n @Input() customMessages: { [key: string]: string } = {};\n\n // Map to store field labels for efficient lookup\n private fieldLabelsMap = new Map<string, string>();\n \n // Inject the element service\n private elementService = inject(CideElementsService);\n \n // Signal to hold form errors\n formErrors = signal<string[]>([]);\n\n ngOnInit(): void {\n if (this.isFormGroupMode()) {\n this.loadFormErrors();\n this.setupFormChangeListener();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['formGroup'] && this.isFormGroupMode()) {\n this.loadFormErrors();\n this.setupFormChangeListener();\n }\n }\n\n private setupFormChangeListener(): void {\n if (this.formGroup) {\n // Listen to form value changes to update errors\n this.formGroup.valueChanges.subscribe(() => {\n this.updateFormErrors();\n });\n \n // Listen to form status changes\n this.formGroup.statusChanges.subscribe(() => {\n this.updateFormErrors();\n });\n }\n }\n\n private updateFormErrors(): void {\n if (this.isFormGroupMode()) {\n this.loadFormErrors();\n }\n }\n\n private loadFormErrors(): void {\n this.getFormGroupErrors().then(errors => {\n this.formErrors.set(errors);\n });\n }\n\n isFormGroupMode(): boolean {\n return !!this.formGroup && !this.control;\n }\n\n getFormGroupErrors(): Promise<string[]> {\n if (!this.formGroup) return Promise.resolve([]);\n \n return this.buildFieldLabelsMap().then(() => {\n const errors: string[] = [];\n \n Object.keys(this.formGroup.controls).forEach(key => {\n const control = this.formGroup.get(key);\n \n if (control && control.invalid) {\n const errorMessage = this.getControlErrorMessage(control, key);\n if (errorMessage) {\n errors.push(errorMessage);\n }\n }\n });\n \n return errors;\n });\n }\n\n private buildFieldLabelsMap(): Promise<void> {\n if (this.fieldLabelsMap.size > 0) return Promise.resolve(); // Already built\n \n const promises = Object.keys(this.formGroup.controls).map(key => {\n return this.elementService?.getElementData({ sype_key: key }).then(elementData => {\n if (elementData?.sype_label) {\n this.fieldLabelsMap.set(key, elementData.sype_label as string);\n }\n }).catch(error => {\n // Silently handle errors - element data might not be available for all fields\n });\n });\n \n return Promise.all(promises).then(() => {\n // All promises completed\n });\n }\n\n\n getFormGroupErrorMessage(): string {\n const errors = this.formErrors();\n if (errors.length === 0) return '';\n \n if (errors.length === 1) {\n return errors[0];\n }\n \n return `Please fix the following errors: ${errors.join(', ')}`;\n }\n\n getControlErrorMessage(control: AbstractControl, fieldName: string): string {\n if (!control || !control.errors) {\n return '';\n }\n\n const errors = control.errors;\n \n // Get display name from map first, fallback to conversion\n const displayName = this.fieldLabelsMap.get(fieldName) || this.convertToDisplayName(fieldName);\n \n // Check for custom messages first\n for (const errorType in errors) {\n if (this.customMessages[errorType]) {\n return this.customMessages[errorType];\n }\n }\n\n // Default error messages\n if (errors['required']) {\n return `${displayName} is required`;\n }\n \n if (errors['email']) {\n return `${displayName} must be a valid email address`;\n }\n \n if (errors['minlength']) {\n return `${displayName} must be at least ${errors['minlength'].requiredLength} characters`;\n }\n \n if (errors['maxlength']) {\n return `${displayName} must not exceed ${errors['maxlength'].requiredLength} characters`;\n }\n \n if (errors['pattern']) {\n return `${displayName} format is invalid`;\n }\n\n // Fallback to first error\n const firstError = Object.keys(errors)[0];\n return `${displayName} is invalid`;\n }\n\n getErrorMessage(): string {\n if (!this.control || !this.control.errors) {\n return '';\n }\n\n const errors = this.control.errors;\n \n // Check for custom messages first\n for (const errorType in errors) {\n if (this.customMessages[errorType]) {\n return this.customMessages[errorType];\n }\n }\n\n // Default error messages\n if (errors['required']) {\n return `${this.getFieldDisplayName()} is required`;\n }\n \n if (errors['email']) {\n return `${this.getFieldDisplayName()} must be a valid email address`;\n }\n \n if (errors['minlength']) {\n return `${this.getFieldDisplayName()} must be at least ${errors['minlength'].requiredLength} characters`;\n }\n \n if (errors['maxlength']) {\n return `${this.getFieldDisplayName()} must not exceed ${errors['maxlength'].requiredLength} characters`;\n }\n \n if (errors['pattern']) {\n return `${this.getFieldDisplayName()} format is invalid`;\n }\n\n // Fallback to first error\n const firstError = Object.keys(errors)[0];\n return `${this.getFieldDisplayName()} is invalid`;\n }\n\n private getFieldDisplayName(): string {\n if (this.fieldName) {\n return this.fieldName;\n }\n \n // Convert field name to display name\n if (this.control && this.control.parent) {\n const fieldName = Object.keys(this.control.parent.controls).find(\n key => this.control.parent!.get(key) === this.control\n );\n \n if (fieldName) {\n return this.convertToDisplayName(fieldName);\n }\n }\n \n return 'This field';\n }\n\n private convertToDisplayName(fieldName: string): string {\n // Convert snake_case to Title Case\n return fieldName\n .split('_')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n}\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","// 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 filterable?: boolean; // Enable column filtering\n filterType?: 'text' | 'number' | 'date' | 'select' | 'custom'; // Filter type\n filterOptions?: Array<{ label: string; value: unknown }>; // Options for select filters\n filterRenderer?: string; // Custom filter template renderer\n groupable?: boolean; // Enable grouping by this column\n aggregatable?: boolean; // Enable aggregation for this column\n aggregationType?: 'sum' | 'avg' | 'count' | 'min' | 'max'; // Aggregation type\n resizable?: boolean; // Enable column resizing\n hideable?: boolean; // Can be hidden/shown\n hidden?: boolean; // Initial hidden state\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 GridColumnMenuConfig {\n enabled: boolean;\n showSort?: boolean; // Show sort options (Ascending/Descending)\n showFilter?: boolean; // Show filter option\n showAutosize?: boolean; // Show autosize option\n showGroupBy?: boolean; // Show group by column option\n showManageColumns?: boolean; // Show manage columns option\n showResetColumns?: boolean; // Show reset columns option\n showHideColumn?: boolean; // Show hide column option\n showAggregation?: boolean; // Show aggregation select option\n}\n\nexport interface ColumnFilter {\n columnKey: string;\n value: unknown;\n operator?: 'equals' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'lt' | 'gte' | 'lte' | 'in';\n}\n\nexport interface ColumnSort {\n columnKey: string;\n direction: 'asc' | 'desc';\n}\n\nexport interface ColumnGroup<T = Record<string, unknown>> {\n columnKey: string;\n groups: Map<unknown, T[]>;\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 columnMenu?: GridColumnMenuConfig; // Column menu 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 'columnFilter' | 'columnSort' | 'columnAutosize' | 'columnGroupBy' | 'columnHide' | 'columnShow' | \n 'columnReset' | 'columnAggregation' | 'manageColumns';\n data: T | T[] | string | number | null | {\n sourceItem: T;\n sourceIndex: number;\n targetItem: T;\n targetIndex: number;\n newOrder: T[];\n allOrders?: T[]; // Complete order for reference when only changed orders are sent\n } | ColumnFilter | ColumnFilter[] | ColumnSort | { columnKey: string; aggregationType: string };\n column?: GridColumn;\n action?: GridAction;\n filters?: ColumnFilter[]; // Active filters\n sorts?: ColumnSort[]; // Active sorts\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 columnMenu: {\n enabled: true,\n showSort: true,\n showFilter: true,\n showAutosize: true,\n showGroupBy: true,\n showManageColumns: true,\n showResetColumns: true,\n showHideColumn: true,\n showAggregation: true\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 ColumnFilter,\n ColumnSort,\n GridColumnMenuConfig\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 '../../elements/button/cide-ele-button.component';\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 // Column menu state\n openColumnMenu = signal<string | null>(null); // Column key of open menu\n columnFilters = signal<ColumnFilter[]>([]); // Active column filters\n columnSorts = signal<ColumnSort[]>([]); // Active column sorts\n hiddenColumns = signal<string[]>([]); // Hidden column keys\n showFilterPanel = signal<string | null>(null); // Column key for active filter panel\n filterSearchTerm = signal<string>(''); // Search term for filter values\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 // Visible columns (excluding hidden)\n visibleColumns = computed(() => {\n const hidden = this.hiddenColumns();\n return this.mergedConfig().columns.filter(col => !hidden.includes(col.key) && !col.hidden);\n });\n\n ngOnInit() {\n this.initializeGrid();\n this.initializeOriginalOrder();\n \n // Add global click listener to close menus when clicking outside\n document.addEventListener('click', this.handleGlobalClick.bind(this));\n }\n\n ngOnDestroy() {\n // Clean up search debounce timer\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n \n // Remove global click listener\n document.removeEventListener('click', this.handleGlobalClick.bind(this));\n }\n \n private handleGlobalClick(event: MouseEvent): void {\n // Close column menu and filter panel when clicking outside\n const target = event.target as HTMLElement;\n const isInsideMenu = target.closest('.column-menu-dropdown');\n const isMenuTrigger = target.closest('.column-menu-trigger');\n \n if (!isInsideMenu && !isMenuTrigger) {\n this.closeColumnMenu();\n this.closeFilterPanel();\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 // Preserve expansion state from current data before transforming\n const currentData = this.internalData();\n const expansionState = this.preserveTreeExpansionState(currentData);\n \n processedData = this.transformToTree(data);\n console.log('processedData', processedData);\n \n // Apply preserved expansion state to new tree data\n processedData = this.applyTreeExpansionState(processedData, expansionState);\n console.log('processedData with preserved expansion state', 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 // Preserve expansion state from current data before transforming\n const currentData = this.internalData();\n const expansionState = this.preserveTreeExpansionState(currentData);\n \n data = this.transformToTree(data);\n \n // Apply preserved expansion state to new tree data\n data = this.applyTreeExpansionState(data, expansionState);\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 // Flatten the data to include all items (parents and children) for hierarchical structures\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n \n // Completely build the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Build the order tracking with flattened data\n flattenedData.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 flattened dataset:', this.initialDataOrderIds.length, 'items (including children)');\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 // Flatten the data to include all items (parents and children) for hierarchical structures\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with flattened data\n flattenedData.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 * Preserve tree expansion state from current data\n */\n private preserveTreeExpansionState(currentData: T[]): Map<string, boolean> {\n const expansionState = new Map<string, boolean>();\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return expansionState;\n \n const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\n \n const extractExpansionState = (items: T[]) => {\n items.forEach(item => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n if (itemId) {\n const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\n expansionState.set(itemId, isExpanded);\n }\n \n // Check for children recursively\n const children = this.getNestedValue(item, treeConfig.childrenKey || 'children') as T[] || [];\n if (children.length > 0) {\n extractExpansionState(children);\n }\n });\n };\n \n extractExpansionState(currentData);\n console.log('🔍 DataGrid: Preserved expansion state for', expansionState.size, 'items');\n return expansionState;\n }\n\n /**\n * Apply preserved tree expansion state to new data\n */\n private applyTreeExpansionState(data: T[], expansionState: Map<string, boolean>): T[] {\n const treeConfig = this.mergedConfig().tree;\n if (!treeConfig) return data;\n \n const { expandedKey = 'isExpanded', primaryKey, childrenKey = 'children' } = treeConfig;\n \n const applyToItems = (items: T[]): T[] => {\n return items.map(item => {\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\n const isExpanded = expansionState.get(itemId) || false;\n \n const updatedItem = {\n ...item,\n [expandedKey]: isExpanded\n } as T;\n \n // Apply to children recursively\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\n if (children.length > 0) {\n this.setNestedValue(updatedItem, childrenKey, applyToItems(children));\n }\n \n return updatedItem;\n });\n };\n \n return applyToItems(data);\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 \n // IMPORTANT: Update the actual sequence value in the item itself\n this.setNestedValue(item, dragDropConfig.orderField, newOrderValue);\n } else {\n // Fallback to index-based position\n const newOrderValue = index + 1;\n currentEntry.newPosition = newOrderValue;\n \n // Update the actual sequence value in the item itself\n if (dragDropConfig?.orderField) {\n this.setNestedValue(item, dragDropConfig.orderField, newOrderValue);\n }\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 * Includes all items from hierarchical structure (parents and children)\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 // Flatten the data to include all items (parents and children) for hierarchical structures\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with flattened data\n flattenedData.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 flattened data:', this.initialDataOrderIds.length, 'items (including children)');\n }\n\n /**\n * Update the row order map baseline to current positions (for save action)\n * Includes all items from hierarchical structure (parents and children)\n */\n private updateRowOrderMapBaseline(): void {\n // Get the current full dataset from the config\n const fullData = this.mergedConfig().data || [];\n \n // Flatten the data to include all items (parents and children) for hierarchical structures\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n \n // Completely rebuild the order tracking from current data\n this.rowOrderMap.clear();\n this.initialDataOrderIds = [];\n \n // Rebuild the order tracking with flattened data\n flattenedData.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 flattened data:', this.initialDataOrderIds.length, 'items (including children)');\n }\n\n /**\n * Get the current order array from the row order map\n * Includes all items from hierarchical structure (parents and children)\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 // Flatten the data to include all items (parents and children) for hierarchical structures\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n \n // Collect all items with their new positions from the flattened dataset\n this.rowOrderMap.forEach((orderInfo, itemId) => {\n const item = flattenedData.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 * Get only the items that have actually changed order\n * Includes all items from hierarchical structure (parents and children)\n */\n private getChangedOrders(): T[] {\n const changedItems: T[] = [];\n \n // Get the full dataset from the config\n const fullData = this.mergedConfig().data || [];\n \n // Flatten the data to include all items (parents and children) for hierarchical structures\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\n \n // Check each item to see if its position has changed\n this.rowOrderMap.forEach((orderInfo, itemId) => {\n const item = flattenedData.find(dataItem => this.getItemId(dataItem) === itemId);\n if (item && orderInfo.oldPosition !== orderInfo.newPosition) {\n changedItems.push(item);\n console.log('🔍 Item changed order:', itemId, 'from', orderInfo.oldPosition, 'to', orderInfo.newPosition);\n }\n });\n \n return changedItems;\n }\n\n /**\n * Flatten all data for order tracking (includes all hierarchical children)\n * This method ensures that all items (parents and children) are included in order tracking\n */\n private flattenAllDataForOrderTracking(data: T[]): T[] {\n const flattenedItems: T[] = [];\n \n const flattenItems = (items: T[]) => {\n items.forEach(item => {\n flattenedItems.push(item);\n \n // Check if item has children (for hierarchical data)\n const treeConfig = this.mergedConfig().tree;\n if (treeConfig?.enabled) {\n const childrenKey = treeConfig.childrenKey || 'children';\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\n if (children.length > 0) {\n flattenItems(children);\n }\n }\n });\n };\n \n flattenItems(data);\n console.log('🔍 Flattened data for order tracking:', flattenedItems.length, 'items (including children)');\n return flattenedItems;\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 // Check if there are any actual changes before proceeding\n const hasActualChanges = this.checkIfOrderChanged();\n if (!hasActualChanges) {\n console.log('🔍 No actual order changes detected, skipping save');\n this.hasOrderChanged.set(false);\n return;\n }\n\n // Get only the changed orders and emit them BEFORE clearing local data\n const changedOrders = this.getChangedOrders();\n if (changedOrders.length > 0) {\n console.log('🔍 Emitting rowReorder event with changed orders only:', changedOrders);\n console.log('🔍 Number of changed records:', changedOrders.length, 'out of', this.getCurrentOrderFromMap().length, 'total records');\n // Use the expected GridEvent structure for rowReorder\n this.emitEvent('rowReorder', {\n sourceItem: changedOrders[0], // First changed item as source\n sourceIndex: 0, // First position as source\n targetItem: changedOrders[changedOrders.length - 1], // Last changed item as target\n targetIndex: changedOrders.length - 1, // Last position as target\n newOrder: changedOrders, // Only the records whose order actually changed\n allOrders: this.getCurrentOrderFromMap() // Complete order for reference\n });\n }\n\n // DON'T clear the local data or reset the order map here\n // Let the parent component handle the data refresh after API call\n // The local data will be cleared when new data arrives via ngOnChanges\n console.log('🔍 Save clicked, rowReorder event emitted, preserving local data until API response');\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 // ===== Column Menu Methods =====\n \n toggleColumnMenu(columnKey: string, event?: Event) {\n if (event) {\n event.stopPropagation();\n }\n const current = this.openColumnMenu();\n this.openColumnMenu.set(current === columnKey ? null : columnKey);\n }\n\n closeColumnMenu() {\n this.openColumnMenu.set(null);\n }\n\n isColumnMenuOpen(columnKey: string): boolean {\n return this.openColumnMenu() === columnKey;\n }\n\n onColumnSort(column: GridColumn, direction: 'asc' | 'desc') {\n const sorts = this.columnSorts();\n const existingIndex = sorts.findIndex(s => s.columnKey === column.key);\n \n if (existingIndex !== -1) {\n // Update existing sort\n sorts[existingIndex].direction = direction;\n } else {\n // Add new sort (replace existing for single column sort, or add for multi-column)\n sorts.push({ columnKey: column.key, direction });\n }\n \n this.columnSorts.set([...sorts]);\n this.emitEvent('columnSort', { columnKey: column.key, direction }, column);\n this.closeColumnMenu();\n }\n\n onColumnFilter(column: GridColumn, value: unknown, operator: ColumnFilter['operator'] = 'equals') {\n const filters = this.columnFilters();\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n \n if (value === null || value === undefined || value === '') {\n // Remove filter\n if (existingIndex !== -1) {\n filters.splice(existingIndex, 1);\n }\n } else {\n const filter: ColumnFilter = { columnKey: column.key, value, operator };\n if (existingIndex !== -1) {\n // Update existing filter\n filters[existingIndex] = filter;\n } else {\n // Add new filter\n filters.push(filter);\n }\n }\n \n this.columnFilters.set([...filters]);\n this.emitEvent('columnFilter', filters, column);\n }\n\n onColumnAutosize(column: GridColumn) {\n this.emitEvent('columnAutosize', column.key, column);\n this.closeColumnMenu();\n }\n\n onColumnGroupBy(column: GridColumn) {\n this.emitEvent('columnGroupBy', column.key, column);\n this.closeColumnMenu();\n }\n\n onColumnHide(column: GridColumn) {\n const hidden = this.hiddenColumns();\n if (!hidden.includes(column.key)) {\n this.hiddenColumns.set([...hidden, column.key]);\n this.emitEvent('columnHide', column.key, column);\n }\n this.closeColumnMenu();\n }\n\n onColumnShow(columnKey: string) {\n const hidden = this.hiddenColumns();\n const index = hidden.indexOf(columnKey);\n if (index !== -1) {\n hidden.splice(index, 1);\n this.hiddenColumns.set([...hidden]);\n const column = this.mergedConfig().columns.find(c => c.key === columnKey);\n if (column) {\n this.emitEvent('columnShow', columnKey, column);\n }\n }\n }\n\n onColumnReset() {\n this.hiddenColumns.set([]);\n this.columnFilters.set([]);\n this.columnSorts.set([]);\n this.emitEvent('columnReset', null);\n this.closeColumnMenu();\n }\n\n onColumnAggregation(column: GridColumn, aggregationType: 'sum' | 'avg' | 'count' | 'min' | 'max') {\n this.emitEvent('columnAggregation', { columnKey: column.key, aggregationType }, column);\n this.closeColumnMenu();\n }\n\n onManageColumns() {\n this.emitEvent('manageColumns', null);\n this.closeColumnMenu();\n }\n\n getColumnFilterValue(columnKey: string): unknown {\n const filter = this.columnFilters().find(f => f.columnKey === columnKey);\n return filter?.value;\n }\n\n getColumnSortDirection(columnKey: string): 'asc' | 'desc' | null {\n const sort = this.columnSorts().find(s => s.columnKey === columnKey);\n return sort?.direction || null;\n }\n\n isColumnFiltered(columnKey: string): boolean {\n return this.columnFilters().some(f => f.columnKey === columnKey);\n }\n\n getActiveFilterCount(columnKey: string): number {\n const filter = this.columnFilters().find(f => f.columnKey === columnKey);\n if (filter && filter.operator === 'in' && Array.isArray(filter.value)) {\n return filter.value.length;\n }\n return 0;\n }\n\n toggleFilterPanel(columnKey: string, event?: Event) {\n if (event) {\n event.stopPropagation();\n }\n const current = this.showFilterPanel();\n this.showFilterPanel.set(current === columnKey ? null : columnKey);\n this.filterSearchTerm.set('');\n }\n\n closeFilterPanel() {\n this.showFilterPanel.set(null);\n this.filterSearchTerm.set('');\n }\n\n isFilterPanelOpen(columnKey: string): boolean {\n return this.showFilterPanel() === columnKey;\n }\n\n getUniqueColumnValues(column: GridColumn): Array<{ value: unknown; label: string; count: number; checked: boolean }> {\n const data = this.internalData();\n const values = new Map<unknown, number>();\n \n // Count occurrences of each value\n data.forEach(row => {\n const value = column.valueGetter \n ? this.getNestedValue(row, column.valueGetter)\n : (row as Record<string, unknown>)[column.key];\n \n const count = values.get(value) || 0;\n values.set(value, count + 1);\n });\n\n // Get active filter for this column\n const activeFilter = this.columnFilters().find(f => f.columnKey === column.key);\n const activeValues = activeFilter?.operator === 'in' && Array.isArray(activeFilter.value) \n ? activeFilter.value \n : [];\n\n // Convert to array and sort\n const result = Array.from(values.entries())\n .map(([value, count]) => ({\n value,\n label: this.formatFilterValue(value, column),\n count,\n checked: activeValues.length === 0 || activeValues.includes(value)\n }))\n .sort((a, b) => {\n // Sort by label\n if (a.label < b.label) return -1;\n if (a.label > b.label) return 1;\n return 0;\n });\n\n // Filter by search term\n const searchTerm = this.filterSearchTerm().toLowerCase();\n if (searchTerm) {\n return result.filter(item => item.label.toLowerCase().includes(searchTerm));\n }\n\n return result;\n }\n\n formatFilterValue(value: unknown, column: GridColumn): string {\n if (value === null || value === undefined) return '(Blank)';\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\n if (value instanceof Date) return value.toLocaleDateString();\n return String(value);\n }\n\n toggleFilterValue(column: GridColumn, value: unknown, checked: boolean) {\n const filters = this.columnFilters();\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n \n let selectedValues: unknown[] = [];\n \n if (existingIndex !== -1) {\n const existing = filters[existingIndex];\n selectedValues = Array.isArray(existing.value) ? [...existing.value] : [];\n } else {\n // If no filter exists, start with all values\n selectedValues = this.getUniqueColumnValues(column).map(v => v.value);\n }\n\n if (checked) {\n // Add value if not present\n if (!selectedValues.includes(value)) {\n selectedValues.push(value);\n }\n } else {\n // Remove value\n selectedValues = selectedValues.filter(v => v !== value);\n }\n\n // Apply filter\n if (selectedValues.length === 0 || selectedValues.length === this.getUniqueColumnValues(column).length) {\n // Remove filter if all or none selected\n if (existingIndex !== -1) {\n filters.splice(existingIndex, 1);\n }\n } else {\n const filter: ColumnFilter = {\n columnKey: column.key,\n value: selectedValues,\n operator: 'in'\n };\n \n if (existingIndex !== -1) {\n filters[existingIndex] = filter;\n } else {\n filters.push(filter);\n }\n }\n\n this.columnFilters.set([...filters]);\n this.emitEvent('columnFilter', filters, column);\n this.applyFiltersToData();\n }\n\n selectAllFilterValues(column: GridColumn) {\n const filters = this.columnFilters();\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n \n if (existingIndex !== -1) {\n filters.splice(existingIndex, 1);\n this.columnFilters.set([...filters]);\n this.emitEvent('columnFilter', filters, column);\n this.applyFiltersToData();\n }\n }\n\n deselectAllFilterValues(column: GridColumn) {\n const filters = this.columnFilters();\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\n \n const filter: ColumnFilter = {\n columnKey: column.key,\n value: [],\n operator: 'in'\n };\n \n if (existingIndex !== -1) {\n filters[existingIndex] = filter;\n } else {\n filters.push(filter);\n }\n\n this.columnFilters.set([...filters]);\n this.emitEvent('columnFilter', filters, column);\n this.applyFiltersToData();\n }\n\n applyFiltersToData() {\n let filtered = [...this.internalData()];\n \n const filters = this.columnFilters();\n \n filters.forEach(filter => {\n const column = this.mergedConfig().columns.find(c => c.key === filter.columnKey);\n if (!column) return;\n\n filtered = filtered.filter(row => {\n const value = column.valueGetter \n ? this.getNestedValue(row, column.valueGetter)\n : (row as Record<string, unknown>)[column.key];\n\n if (filter.operator === 'in' && Array.isArray(filter.value)) {\n return filter.value.includes(value);\n }\n\n return true;\n });\n });\n\n this.filteredData.set(filtered);\n this.totalItems.set(filtered.length);\n this.totalPages.set(Math.ceil(filtered.length / this.pageSize()));\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({ \n type, \n data, \n column, \n action,\n filters: this.columnFilters(),\n sorts: this.columnSorts()\n } 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 /**\n * Set a nested value in an object using dot notation\n * @param obj The object to modify\n * @param path The dot notation path (e.g., 'contact.email')\n * @param value The value to set\n * @example\n * const obj = { contact: { email: 'old@example.com' } };\n * setNestedValue(obj, 'contact.email', 'new@example.com');\n * // obj.contact.email === 'new@example.com'\n */\n setNestedValue(obj: T, path: string, value: unknown): void {\n const keys = path.split('.');\n const lastKey = keys.pop()!;\n const target = keys.reduce((current: unknown, key: string) => {\n if (current && typeof current === 'object') {\n if (!(current as Record<string, unknown>)[key]) {\n (current as Record<string, unknown>)[key] = {};\n }\n return (current as Record<string, unknown>)[key];\n }\n return undefined;\n }, obj);\n \n if (target && typeof target === 'object') {\n (target as Record<string, unknown>)[lastKey] = value;\n }\n }\n\n /**\n * Compare two order arrays to check if they are different\n * This method can be used by parent components to check if order has actually changed\n * @param currentOrder Current order array\n * @param originalOrder Original order array\n * @returns true if orders are different, false if they are the same\n */\n compareOrders(currentOrder: Array<{id: string | undefined, order: number | undefined}>, originalOrder: Array<{id: string | undefined, order: number | undefined}>): boolean {\n console.log('🔍 DataGrid: Comparing orders - current length:', currentOrder.length, 'original length:', originalOrder.length);\n \n // If lengths are different, there are changes\n if (currentOrder.length !== originalOrder.length) {\n console.log('🔍 DataGrid: Lengths are different, returning true');\n return true;\n }\n\n // Compare the order of items by their IDs (not just their sequence values)\n // This will detect if items have been reordered even if sequence values are the same\n for (let i = 0; i < currentOrder.length; i++) {\n const currentItem = currentOrder[i];\n const originalItem = originalOrder[i];\n \n console.log('🔍 DataGrid: Position', i, '- Current ID:', currentItem.id, 'Original ID:', originalItem.id);\n \n if (currentItem.id !== originalItem.id) {\n console.log('🔍 DataGrid: Different item at position', i, 'returning true');\n return true;\n }\n }\n\n console.log('🔍 DataGrid: No differences found, returning false');\n return false;\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-1.5 tw-border-b tw-border-gray-200\">\n <div class=\"tw-flex tw-items-center tw-justify-between\">\n <!-- Left Side: Search Input and Action Icons -->\n <div class=\"tw-flex tw-items-center tw-space-x-1.5\">\n <!-- Search Input - Apple Style -->\n <div class=\"tw-max-w-md data-grid-search-input\">\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 size=\"sm\">\n </cide-ele-input>\n </div>\n \n <!-- Action Icons (Filter, Sort, Download) - Apple Style Compact -->\n <div class=\"tw-flex tw-items-center tw-space-x-1 data-grid-action-buttons\">\n <!-- Filter Button -->\n <button type=\"button\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200\"\n title=\"Filter\"\n (click)=\"onActionClick(null, { key: 'filter', label: 'Filter', icon: 'filter_list', variant: 'ghost', onClick: 'filter' })\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">filter_list</cide-ele-icon>\n </button>\n \n <!-- Sort Button -->\n <button type=\"button\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200\"\n title=\"Sort\"\n (click)=\"onActionClick(null, { key: 'sort', label: 'Sort', icon: 'swap_vert', variant: 'ghost', onClick: 'sort' })\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">swap_vert</cide-ele-icon>\n </button>\n \n <!-- Download/Export Button -->\n <button type=\"button\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200\"\n title=\"Download\"\n (click)=\"onActionClick(null, { key: 'download', label: 'Download', icon: 'file_download', variant: 'ghost', onClick: 'download' })\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">file_download</cide-ele-icon>\n </button>\n </div>\n </div>\n \n <!-- Right Side: 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 visibleColumns(); 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-relative\"\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 <div class=\"tw-flex tw-items-center tw-justify-between tw-gap-1\">\n <span class=\"tw-truncate tw-flex-1\">{{ column.header }}</span>\n \n <!-- Active Filter Indicator -->\n @if (isColumnFiltered(column.key)) {\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded tw-bg-blue-100 tw-text-blue-700 tw-text-xs tw-font-medium tw-mr-1\">\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-0.5\">filter_alt</cide-ele-icon>\n {{ getActiveFilterCount(column.key) }}\n </div>\n }\n \n <!-- Column Menu Trigger (Three Dots Icon) -->\n @if (mergedConfig().columnMenu?.enabled) {\n <button\n type=\"button\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-rounded tw-text-gray-600 hover:tw-text-gray-800 hover:tw-bg-gray-100 tw-transition-all column-menu-trigger\"\n [class.tw-text-blue-600]=\"isColumnMenuOpen(column.key) || isColumnFiltered(column.key)\"\n [class.tw-bg-blue-50]=\"isColumnFiltered(column.key)\"\n (click)=\"toggleColumnMenu(column.key, $event)\"\n title=\"Column options\">\n <cide-ele-icon class=\"tw-w-5 tw-h-4\">more_vert</cide-ele-icon>\n </button>\n }\n </div>\n\n <!-- Column Menu Dropdown -->\n @if (isColumnMenuOpen(column.key)) {\n <div class=\"column-menu-dropdown tw-absolute tw-z-50 tw-mt-2 tw-w-56 tw-rounded-lg tw-shadow-lg tw-bg-white tw-ring-1 tw-ring-black tw-ring-opacity-5\">\n <div class=\"tw-py-1\">\n <!-- Sort Options -->\n @if (mergedConfig().columnMenu?.showSort && column.sortable !== false) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnSort(column, 'asc')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_upward</cide-ele-icon>\n Ascending\n </button>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnSort(column, 'desc')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_downward</cide-ele-icon>\n Descending\n </button>\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n }\n\n <!-- Filter Option -->\n @if (mergedConfig().columnMenu?.showFilter && column.filterable !== false) {\n <!-- Check if there's a custom filter renderer template -->\n @if (column.filterRenderer && templateRenderers[column.filterRenderer]) {\n <div class=\"tw-px-4 tw-py-2\">\n <ng-container [ngTemplateOutlet]=\"$any(templateRenderers[column.filterRenderer])\"\n [ngTemplateOutletContext]=\"{ $implicit: column, column: column, onFilter: onColumnFilter.bind(this) }\">\n </ng-container>\n </div>\n } @else {\n <!-- Excel-style Filter Button -->\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n [class.tw-bg-blue-50]=\"isFilterPanelOpen(column.key)\"\n (click)=\"toggleFilterPanel(column.key, $event)\">\n <div class=\"tw-flex tw-items-center\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">filter_list</cide-ele-icon>\n Filter\n </div>\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-gray-400\">\n {{ isFilterPanelOpen(column.key) ? 'expand_less' : 'expand_more' }}\n </cide-ele-icon>\n </button>\n \n <!-- Excel-style Filter Panel -->\n @if (isFilterPanelOpen(column.key)) {\n <div class=\"tw-px-2 tw-py-2 tw-bg-gray-50\" (click)=\"$event.stopPropagation()\">\n <!-- Search box -->\n <div class=\"tw-px-2 tw-mb-2\">\n <input\n type=\"text\"\n class=\"tw-w-full tw-px-2 tw-py-1 tw-text-xs tw-border tw-border-gray-300 tw-rounded focus:tw-outline-none focus:tw-ring-1 focus:tw-ring-blue-500\"\n placeholder=\"Search...\"\n [(ngModel)]=\"filterSearchTerm\"\n (click)=\"$event.stopPropagation()\">\n </div>\n \n <!-- Select All / Deselect All -->\n <div class=\"tw-px-2 tw-mb-1 tw-flex tw-gap-2\">\n <button\n type=\"button\"\n class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-700\"\n (click)=\"selectAllFilterValues(column); $event.stopPropagation()\">\n Select All\n </button>\n <span class=\"tw-text-xs tw-text-gray-400\">|</span>\n <button\n type=\"button\"\n class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-700\"\n (click)=\"deselectAllFilterValues(column); $event.stopPropagation()\">\n Clear\n </button>\n </div>\n \n <!-- Filter values list -->\n <div class=\"tw-max-h-48 tw-overflow-y-auto\">\n @for (item of getUniqueColumnValues(column); track item.value) {\n <label class=\"tw-flex tw-items-center tw-px-2 tw-py-1 tw-text-xs hover:tw-bg-white tw-cursor-pointer tw-rounded\">\n <input\n type=\"checkbox\"\n class=\"tw-mr-2 tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500\"\n [checked]=\"item.checked\"\n (change)=\"toggleFilterValue(column, item.value, $any($event.target).checked)\"\n (click)=\"$event.stopPropagation()\">\n <span class=\"tw-flex-1 tw-truncate\">{{ item.label }}</span>\n <span class=\"tw-text-gray-400 tw-ml-1\">({{ item.count }})</span>\n </label>\n }\n </div>\n </div>\n }\n }\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n }\n\n <!-- Autosize Option -->\n @if (mergedConfig().columnMenu?.showAutosize) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnAutosize(column)\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">fit_screen</cide-ele-icon>\n Autosize\n </button>\n }\n\n <!-- Group By Column Option -->\n @if (mergedConfig().columnMenu?.showGroupBy && column.groupable !== false) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnGroupBy(column)\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">group_work</cide-ele-icon>\n Group By Column\n </button>\n }\n\n <!-- Manage Columns Option -->\n @if (mergedConfig().columnMenu?.showManageColumns) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onManageColumns()\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">view_column</cide-ele-icon>\n Manage Columns\n </button>\n }\n\n <!-- Reset Columns Option -->\n @if (mergedConfig().columnMenu?.showResetColumns) {\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnReset()\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">refresh</cide-ele-icon>\n Reset Columns\n </button>\n }\n\n <!-- Hide Column Option -->\n @if (mergedConfig().columnMenu?.showHideColumn && column.hideable !== false) {\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnHide(column)\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">visibility_off</cide-ele-icon>\n Hide Column\n </button>\n }\n\n <!-- Aggregation Select Option -->\n @if (mergedConfig().columnMenu?.showAggregation && column.aggregatable !== false) {\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\n <div class=\"tw-px-4 tw-py-2 tw-text-xs tw-font-semibold tw-text-gray-500 tw-uppercase\">Aggregation</div>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnAggregation(column, 'sum')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">functions</cide-ele-icon>\n Sum\n </button>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnAggregation(column, 'avg')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">analytics</cide-ele-icon>\n Average\n </button>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnAggregation(column, 'count')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">tag</cide-ele-icon>\n Count\n </button>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnAggregation(column, 'min')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_downward</cide-ele-icon>\n Min\n </button>\n <button\n type=\"button\"\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\n (click)=\"onColumnAggregation(column, 'max')\">\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_upward</cide-ele-icon>\n Max\n </button>\n }\n </div>\n </div>\n }\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-0 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-1 sm:tw-space-y-0\">\n \n <!-- Results Info -->\n @if (paginationConfig.showPageInfo) {\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\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 <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-500\">view_list</cide-ele-icon>\n <span class=\"tw-text-sm tw-text-gray-700\">Per page:</span>\n <div class=\"tw-w-16 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=\"xs\"\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-2\">\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 type=\"button\"\n (click)=\"onPageChange(1)\"\n [disabled]=\"currentPage() === 1 || isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n title=\"First page\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">first_page</cide-ele-icon>\n </button>\n \n <!-- Previous Page -->\n <button\n type=\"button\"\n (click)=\"previousPage()\"\n [disabled]=\"!hasPreviousPage() || isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n title=\"Previous page\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">chevron_left</cide-ele-icon>\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 type=\"button\"\n (click)=\"onPageChange(page)\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-p-0 tw-rounded tw-text-xs tw-font-medium tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n [ngClass]=\"{\n 'tw-bg-blue-600 tw-text-white hover:tw-bg-blue-700': currentPage() === page,\n 'tw-bg-white tw-text-gray-700 tw-border tw-border-gray-300 hover:tw-bg-gray-50': currentPage() !== page\n }\"\n [title]=\"'Page ' + page\">\n {{ page }}\n </button>\n }\n }\n \n <!-- Next Page -->\n <button\n type=\"button\"\n (click)=\"nextPage()\"\n [disabled]=\"!hasNextPage() || isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n title=\"Next page\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">chevron_right</cide-ele-icon>\n </button>\n \n <!-- Last Page -->\n <button\n type=\"button\"\n (click)=\"onPageChange(totalPages())\"\n [disabled]=\"currentPage() === totalPages() || isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n title=\"Last page\">\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">last_page</cide-ele-icon>\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-1 tw-border-l tw-border-gray-200 tw-pl-2\">\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-16\">\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 size=\"xs\"\n (keydown.enter)=\"onJumpToPage()\">\n </cide-ele-input>\n </div>\n <button\n type=\"button\"\n (click)=\"onJumpToPage()\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-p-0 tw-rounded tw-text-xs tw-font-medium tw-bg-gray-100 tw-text-gray-700 tw-border tw-border-gray-300 hover:tw-bg-gray-200 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n title=\"Go to page\">\n Go\n </button>\n </div>\n }\n \n <!-- Refresh Button -->\n @if (paginationConfig.showRefresh) {\n <button\n type=\"button\"\n (click)=\"onRefresh()\"\n [disabled]=\"isRefreshing()\"\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\n title=\"Refresh\">\n @if (isRefreshing()) {\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4 tw-animate-spin\">refresh</cide-ele-icon>\n } @else {\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">refresh</cide-ele-icon>\n }\n </button>\n }\n </div>\n }\n \n </div>\n </div>\n </div>\n }\n</div>\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 { Component, Input, Output, EventEmitter, signal, computed, ElementRef, ViewChild, AfterViewInit, OnDestroy, effect, Signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\nimport { CideSpinnerComponent } from '../../elements/spinner/spinner.component';\n\nexport interface FloatingContainerConfig {\n id: string;\n title: string;\n icon?: string;\n headerColor?: string;\n width?: string;\n height?: string;\n minWidth?: string;\n minHeight?: string;\n maxWidth?: string;\n maxHeight?: string;\n resizable?: boolean;\n draggable?: boolean;\n closable?: boolean;\n minimizable?: boolean;\n maximizable?: boolean;\n isMinimized?: boolean;\n isMaximized?: boolean;\n // Dynamic component support\n componentId?: string;\n componentConfig?: {\n inputs?: { [key: string]: Signal<any> };\n outputs?: { [key: string]: (event: Signal<any>) => void };\n };\n}\n\n@Component({\n selector: 'cide-ele-floating-container',\n standalone: true,\n imports: [CommonModule, CideEleButtonComponent, CideIconComponent, CideSpinnerComponent],\n template: `\n <div \n #container\n class=\"tw-fixed tw-bg-gray-50 tw-bg-opacity-90 tw-backdrop-blur-sm tw-border tw-border-gray-200 tw-border-opacity-50 tw-rounded-xl tw-shadow-lg tw-transition-all tw-duration-200 tw-flex tw-flex-col\"\n [style.left.px]=\"isMaximized() ? 20 : position().x\"\n [style.top.px]=\"isMaximized() ? 20 : position().y\"\n [style.width]=\"isMaximized() ? 'calc(100vw - 40px)' : (config().width || '400px')\"\n [style.height]=\"isMaximized() ? 'calc(100vh - 40px)' : (isMinimized() ? 'auto' : (savedHeight || config().height || '500px'))\"\n [style.min-width]=\"config().minWidth || '300px'\"\n [style.min-height]=\"isMinimized() ? 'auto' : (config().minHeight || '200px')\"\n [style.max-width]=\"config().maxWidth || '90vw'\"\n [style.max-height]=\"config().maxHeight || '90vh'\"\n [style.z-index]=\"zIndex()\"\n [class.tw-cursor-move]=\"isDragging()\"\n [class.tw-select-none]=\"true\"\n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseUp($event)\">\n \n <!-- Header -->\n <div \n class=\"tw-flex tw-items-center tw-justify-between tw-px-3 tw-py-2 tw-border-b tw-border-gray-200 tw-border-opacity-30 tw-rounded-t-xl tw-cursor-move tw-transition-all tw-duration-200 tw-shadow-sm tw-flex-shrink-0\"\n [style.background]=\"getHeaderBackground()\"\n (mousedown)=\"startDrag($event)\"\n (click)=\"onHeaderClick($event)\">\n \n <!-- Title Section -->\n <div class=\"tw-flex tw-items-center tw-space-x-2 tw-text-white\">\n @if (config().icon) {\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">{{ config().icon }}</cide-ele-icon>\n }\n <h2 class=\"tw-text-sm tw-font-medium tw-truncate\">{{ config().title }}</h2>\n @if (isMinimized()) {\n <span class=\"tw-text-xs tw-opacity-75\">(Click to restore)</span>\n }\n </div>\n \n <!-- Action Buttons -->\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\n @if (config().minimizable !== false) {\n <button \n cideEleButton \n variant=\"ghost\" \n size=\"xs\" \n type=\"button\" \n (click)=\"minimize(); $event.stopPropagation()\" \n class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\n [title]=\"isMinimized() ? 'Restore' : 'Minimize'\">\n <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">{{ isMinimized() ? 'open_in_full' : 'remove' }}</cide-ele-icon>\n </button>\n }\n @if (config().maximizable !== false) {\n <button \n cideEleButton \n variant=\"ghost\" \n size=\"xs\" \n type=\"button\" \n (click)=\"toggleMaximize(); $event.stopPropagation()\" \n class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\n [title]=\"isMaximized() ? 'Restore' : 'Maximize'\">\n <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">{{ isMaximized() ? 'fullscreen_exit' : 'fullscreen' }}</cide-ele-icon>\n </button>\n }\n @if (config().closable !== false) {\n <button \n cideEleButton \n variant=\"ghost\" \n size=\"xs\" \n type=\"button\" \n (click)=\"close(); $event.stopPropagation()\" \n class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\n title=\"Close\">\n <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">close</cide-ele-icon>\n </button>\n }\n </div>\n </div>\n \n <!-- Content with @defer for performance -->\n @if (!isMinimized()) {\n <div \n class=\"tw-flex-1 tw-overflow-auto tw-overflow-x-hidden floating-container-content tw-bg-gray-50 tw-bg-opacity-90\"\n [style.height]=\"isMaximized() ? 'calc(100vh - 100px)' : 'auto'\"\n [style.min-height]=\"'200px'\">\n @defer (when !isMinimized() && isVisible()) {\n <div class=\"tw-p-0 tw-min-h-full\">\n <ng-content></ng-content>\n </div>\n } @placeholder {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-p-4 tw-min-h-[200px]\">\n <cide-ele-spinner size=\"sm\"></cide-ele-spinner>\n <span class=\"tw-ml-2 tw-text-sm tw-text-gray-600\">Loading content...</span>\n </div>\n }\n </div>\n }\n \n <!-- Resize Handle (if resizable) -->\n @if (config().resizable !== false) {\n <div \n class=\"tw-absolute tw-bottom-0 tw-right-0 tw-w-[1.38rem] tw-h-3 tw-cursor-se-resize tw-bg-gray-300 tw-opacity-50 hover:tw-opacity-100\"\n (mousedown)=\"startResize($event)\">\n </div>\n }\n </div>\n `,\n styles: [`\n .tw-cursor-move {\n cursor: move !important;\n }\n .tw-cursor-se-resize {\n cursor: se-resize !important;\n }\n .floating-container-content {\n overflow-y: auto;\n overflow-x: hidden;\n scrollbar-width: thin;\n scrollbar-color: #cbd5e1 #f1f5f9;\n position: relative;\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n .floating-container-content::-webkit-scrollbar {\n width: 8px;\n }\n .floating-container-content::-webkit-scrollbar-track {\n background: #f8fafc;\n border-radius: 4px;\n margin: 4px;\n }\n .floating-container-content::-webkit-scrollbar-thumb {\n background: #cbd5e1;\n border-radius: 4px;\n transition: background-color 0.2s ease;\n border: 1px solid #e2e8f0;\n }\n .floating-container-content::-webkit-scrollbar-thumb:hover {\n background: #94a3b8;\n border-color: #cbd5e1;\n }\n .floating-container-content::-webkit-scrollbar-thumb:active {\n background: #64748b;\n }\n `]\n})\nexport class CideEleFloatingContainerComponent implements AfterViewInit, OnDestroy {\n @Input() config = signal<FloatingContainerConfig>({\n id: '',\n title: 'Floating Container',\n icon: 'widgets',\n headerColor: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n width: '400px',\n height: 'auto',\n minWidth: '300px',\n minHeight: '200px',\n maxWidth: '90vw',\n maxHeight: '90vh',\n resizable: true,\n draggable: true,\n closable: true,\n minimizable: true,\n maximizable: true\n });\n @Input() isMinimized!: Signal<boolean>;\n @Input() isMaximized!: Signal<boolean>;\n @Input() isVisible!: Signal<boolean>;\n @Input() zIndex!: Signal<number>;\n\n @Output() closeEvent = new EventEmitter<string>();\n @Output() minimizeEvent = new EventEmitter<string>();\n @Output() maximizeEvent = new EventEmitter<string>();\n @Output() clickEvent = new EventEmitter<string>();\n\n @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\n\n // State signals\n position = signal({ x: 100, y: 100 });\n isDragging = signal(false);\n isResizing = signal(false);\n\n // Computed properties\n computedConfig = computed(() => this.config());\n\n private dragStart = { x: 0, y: 0 };\n private resizeStart = { x: 0, y: 0, width: 0, height: 0 };\n private originalPosition = { x: 0, y: 0 };\n private originalSize = { width: 0, height: 0 };\n private savedPosition = { x: 100, y: 100 }; // Store position before maximizing\n savedHeight = ''; // Store height before maximizing\n\n ngAfterViewInit() {\n // Only center the container if it's at the default position (100, 100)\n // This prevents position jumping when containers are focused\n const currentPos = this.position();\n if (currentPos.x === 100 && currentPos.y === 100) {\n this.centerContainer();\n }\n }\n\n constructor() {\n // Watch for maximize state changes\n effect(() => {\n const isMaximized = this.isMaximized();\n if (isMaximized && !this.savedHeight) {\n // Save current height when maximizing\n this.savedHeight = this.containerRef?.nativeElement?.style.height || this.config().height || '500px';\n } else if (!isMaximized && this.savedHeight) {\n // Restore height when unmaximizing\n this.savedHeight = '';\n }\n });\n }\n\n ngOnDestroy() {\n // Clean up any event listeners if needed\n }\n\n centerContainer() {\n if (this.containerRef?.nativeElement) {\n if (this.isMaximized()) {\n // For maximized state, position with equal margins (20px from all sides)\n this.position.set({ x: 20, y: 20 });\n } else {\n // For normal state, center based on container size\n const rect = this.containerRef.nativeElement.getBoundingClientRect();\n const centerX = (window.innerWidth - rect.width) / 2;\n const centerY = (window.innerHeight - rect.height) / 2;\n this.position.set({ x: Math.max(0, centerX), y: Math.max(0, centerY) });\n }\n }\n }\n\n startDrag(event: MouseEvent) {\n if (!this.computedConfig().draggable) return;\n \n event.preventDefault();\n event.stopPropagation();\n \n this.isDragging.set(true);\n this.dragStart = { x: event.clientX, y: event.clientY };\n this.originalPosition = { ...this.position() };\n \n document.addEventListener('mousemove', this.onDragMove.bind(this));\n document.addEventListener('mouseup', this.onDragEnd.bind(this));\n }\n\n onDragMove(event: MouseEvent) {\n if (!this.isDragging()) return;\n \n const deltaX = event.clientX - this.dragStart.x;\n const deltaY = event.clientY - this.dragStart.y;\n \n const newX = Math.max(0, Math.min(window.innerWidth - 300, this.originalPosition.x + deltaX));\n const newY = Math.max(0, Math.min(window.innerHeight - 100, this.originalPosition.y + deltaY));\n \n this.position.set({ x: newX, y: newY });\n }\n\n onDragEnd() {\n this.isDragging.set(false);\n document.removeEventListener('mousemove', this.onDragMove.bind(this));\n document.removeEventListener('mouseup', this.onDragEnd.bind(this));\n }\n\n startResize(event: MouseEvent) {\n if (!this.computedConfig().resizable) return;\n \n event.preventDefault();\n event.stopPropagation();\n \n this.isResizing.set(true);\n this.resizeStart = { \n x: event.clientX, \n y: event.clientY, \n width: this.containerRef.nativeElement.offsetWidth,\n height: this.containerRef.nativeElement.offsetHeight\n };\n this.originalSize = { ...this.resizeStart };\n \n document.addEventListener('mousemove', this.onResizeMove.bind(this));\n document.addEventListener('mouseup', this.onResizeEnd.bind(this));\n }\n\n onResizeMove(event: MouseEvent) {\n if (!this.isResizing()) return;\n \n const deltaX = event.clientX - this.resizeStart.x;\n const deltaY = event.clientY - this.resizeStart.y;\n \n const newWidth = Math.max(300, this.originalSize.width + deltaX);\n const newHeight = Math.max(200, this.originalSize.height + deltaY);\n \n this.containerRef.nativeElement.style.width = `${newWidth}px`;\n this.containerRef.nativeElement.style.height = `${newHeight}px`;\n }\n\n onResizeEnd() {\n this.isResizing.set(false);\n document.removeEventListener('mousemove', this.onResizeMove.bind(this));\n document.removeEventListener('mouseup', this.onResizeEnd.bind(this));\n }\n\n // Mouse event handlers for container\n onMouseDown(event: MouseEvent) {\n // Prevent text selection during drag\n event.preventDefault();\n }\n\n onMouseMove(event: MouseEvent) {\n // Handle any additional mouse move logic if needed\n }\n\n onMouseUp(event: MouseEvent) {\n // Handle any additional mouse up logic if needed\n }\n\n // Action methods\n onHeaderClick(event: MouseEvent) {\n // Emit click event to bring container to front\n this.clickEvent.emit(this.computedConfig().id);\n \n // Only minimize if clicking on the header itself, not on buttons\n if (this.isMinimized() && !(event.target as HTMLElement).closest('button')) {\n this.minimize();\n }\n }\n\n minimize() {\n this.minimizeEvent.emit(this.computedConfig().id);\n }\n\n bringToFront() {\n // This will be handled by the container service through the manager component\n // The manager component will call the service's bringToFront method\n console.log(`🎯 [FloatingContainer] Container '${this.computedConfig().id}' clicked - bringing to front`);\n \n // Preserve current position to prevent jumping\n const currentPos = this.position();\n console.log(`🎯 [FloatingContainer] Preserving position: x=${currentPos.x}, y=${currentPos.y}`);\n }\n\n toggleMaximize() {\n this.maximizeEvent.emit(this.computedConfig().id);\n }\n\n close() {\n this.closeEvent.emit(this.computedConfig().id);\n }\n\n getHeaderBackground(): string {\n return 'linear-gradient(135deg, var(--cide-theme-primary-color) 0%, var(--tw-blue-400) 100%)';\n }\n}\n","import { Component, inject, computed } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CideEleFloatingContainerComponent } from './floating-container.component';\nimport { CideEleFloatingContainerService } from './floating-container.service';\nimport { CideEleFloatingContainerDynamicDirective } from './floating-container-dynamic.directive';\nimport { CideSpinnerComponent } from '../../elements/spinner/spinner.component';\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\nimport { CideIconComponent } from '../../elements/icon/icon.component';\n\n@Component({\n selector: 'cide-ele-floating-container-manager',\n standalone: true,\n imports: [CommonModule, CideEleFloatingContainerComponent, CideEleFloatingContainerDynamicDirective, CideSpinnerComponent, CideEleButtonComponent, CideIconComponent],\n template: `\n @for (container of visibleContainers(); track container.id) {\n <cide-ele-floating-container\n [config]=\"containerService.getConfigSignal(container.config)\"\n [isMinimized]=\"containerService.getMinimizedSignal(container.id)\"\n [isMaximized]=\"containerService.getMaximizedSignal(container.id)\"\n [isVisible]=\"containerService.getVisibleSignal(container.id)\"\n [zIndex]=\"containerService.getZIndexSignal(container.id)\"\n (closeEvent)=\"containerService.onClose($event)\"\n (minimizeEvent)=\"containerService.onMinimize($event)\"\n (maximizeEvent)=\"containerService.onMaximize($event)\"\n (clickEvent)=\"containerService.bringToFront($event)\">\n \n <!-- Dynamic content loading with @defer for performance -->\n @defer (when container.isVisible) {\n <div \n cideEleFloatingDynamic\n [componentId]=\"container.config.componentId || container.config.id\"\n [componentConfig]=\"containerService.getComponentConfig(container.config)\"\n [isVisible]=\"container.isVisible\">\n </div>\n } @placeholder {\n <div class=\"tw-flex tw-items-center tw-justify-center tw-p-4\">\n <cide-ele-spinner size=\"sm\"></cide-ele-spinner>\n <span class=\"tw-ml-2 tw-text-sm tw-text-gray-600\">Loading component...</span>\n </div>\n } @error {\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-4 tw-text-center\">\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500 tw-mb-2\">error</cide-ele-icon>\n <p class=\"tw-text-red-600 tw-font-medium\">Failed to load component</p>\n <p class=\"tw-text-gray-500 tw-text-sm\">Component \"{{ container.config.componentId || container.config.id }}\" is not available</p>\n <button \n cideEleButton \n variant=\"outline\" \n size=\"xs\" \n (click)=\"containerService.onClose(container.id)\"\n class=\"tw-mt-2\">\n Close\n </button>\n </div>\n }\n </cide-ele-floating-container>\n }\n `,\n styles: []\n})\nexport class CideEleFloatingContainerManagerComponent {\n containerService = inject(CideEleFloatingContainerService);\n\n // Computed properties\n visibleContainers = computed(() => this.containerService.visibleContainers());\n}\n","import { Injectable, inject } from '@angular/core';\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\nimport { CideEleFloatingContainerService } from './floating-container.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FloatingContainerShortcutsService {\n private keyboardShortcutService = inject(KeyboardShortcutService);\n private containerService = inject(CideEleFloatingContainerService);\n\n // Z-index layers for different container states\n private readonly Z_INDEX_LAYERS = {\n HIDDEN: 100, // Hidden containers (behind everything)\n BACKGROUND: 1000, // Background containers\n NORMAL: 2000, // Normal visible containers\n FOCUSED: 3000, // Focused containers\n MODAL: 4000, // Modal containers\n TOOLTIP: 5000 // Tooltips and overlays\n };\n\n constructor() {\n this.registerDefaultShortcuts();\n }\n\n /**\n * Register default floating container shortcuts\n */\n private registerDefaultShortcuts(): void {\n console.log('🎯 [FloatingContainerShortcuts] Registering default shortcuts');\n\n // Alt + 1, Alt + 2, etc. - Focus specific containers\n this.registerNumberShortcuts();\n\n // Alt + N - New container\n this.keyboardShortcutService.register({\n id: 'floating-container-new',\n key: 'n',\n altKey: true,\n description: 'Create new floating container',\n action: () => this.openNewContainer(),\n preventDefault: true\n });\n\n // Alt + P - Previous container\n this.keyboardShortcutService.register({\n id: 'floating-container-previous',\n key: 'p',\n altKey: true,\n description: 'Focus previous container',\n action: () => this.focusPreviousContainer(),\n preventDefault: true\n });\n\n // Alt + H - Hide all containers\n this.keyboardShortcutService.register({\n id: 'floating-container-hide-all',\n key: 'h',\n altKey: true,\n description: 'Hide all containers',\n action: () => this.hideAllContainers(),\n preventDefault: true\n });\n\n // Alt + S - Show all containers\n this.keyboardShortcutService.register({\n id: 'floating-container-show-all',\n key: 's',\n altKey: true,\n description: 'Show all containers',\n action: () => this.showAllContainers(),\n preventDefault: true\n });\n\n // Alt + M - Minimize all containers\n this.keyboardShortcutService.register({\n id: 'floating-container-minimize-all',\n key: 'm',\n altKey: true,\n description: 'Minimize all containers',\n action: () => this.minimizeAllContainers(),\n preventDefault: true\n });\n\n // Alt + W - Close current container\n this.keyboardShortcutService.register({\n id: 'floating-container-close-current',\n key: 'w',\n altKey: true,\n description: 'Close current container',\n action: () => this.closeCurrentContainer(),\n preventDefault: true\n });\n\n // Alt + D - Duplicate current container\n this.keyboardShortcutService.register({\n id: 'floating-container-duplicate',\n key: 'd',\n altKey: true,\n description: 'Duplicate current container',\n action: () => this.duplicateCurrentContainer(),\n preventDefault: true\n });\n\n // Alt + T - Toggle container visibility\n this.keyboardShortcutService.register({\n id: 'floating-container-toggle-visibility',\n key: 't',\n altKey: true,\n description: 'Toggle container visibility',\n action: () => this.toggleContainerVisibility(),\n preventDefault: true\n });\n\n // Alt + O - Open file uploader\n this.keyboardShortcutService.register({\n id: 'floating-container-open-file-uploader',\n key: 'o',\n altKey: true,\n description: 'Open file uploader',\n action: () => this.openFileUploader(),\n preventDefault: true\n });\n\n // Alt + R - Open entity rights sharing\n this.keyboardShortcutService.register({\n id: 'floating-container-open-entity-rights',\n key: 'r',\n altKey: true,\n description: 'Open entity rights sharing',\n action: () => this.openEntityRightsSharing(),\n preventDefault: true\n });\n\n console.log('✅ [FloatingContainerShortcuts] Default shortcuts registered');\n }\n\n /**\n * Register number shortcuts (Alt + 1, Alt + 2, etc.)\n */\n private registerNumberShortcuts(): void {\n for (let i = 1; i <= 9; i++) {\n this.keyboardShortcutService.register({\n id: `floating-container-focus-${i}`,\n key: i.toString(),\n altKey: true,\n description: `Focus container ${i}`,\n action: () => this.focusContainerByIndex(i - 1),\n preventDefault: true\n });\n }\n }\n\n /**\n * Open new floating container\n */\n private openNewContainer(): void {\n console.log('🎯 [FloatingContainerShortcuts] Opening new container');\n const containerId = this.containerService.show({\n id: 'new-container-' + Date.now(),\n title: 'New Container',\n width: '400px',\n height: '300px'\n });\n console.log('✅ [FloatingContainerShortcuts] New container created:', containerId);\n }\n\n /**\n * Focus previous container\n */\n private focusPreviousContainer(): void {\n console.log('🎯 [FloatingContainerShortcuts] Focusing previous container');\n const containers = this.containerService.visibleContainers();\n if (containers.length > 0) {\n // For now, just focus the last container\n const previousIndex = containers.length - 1;\n this.containerService.bringToFront(containers[previousIndex].id);\n }\n }\n\n /**\n * Hide all containers\n */\n private hideAllContainers(): void {\n console.log('🎯 [FloatingContainerShortcuts] Hiding all containers');\n const containers = this.containerService.visibleContainers();\n containers.forEach(container => {\n this.containerService.setZIndex(container.id, this.Z_INDEX_LAYERS.HIDDEN);\n });\n console.log('✅ [FloatingContainerShortcuts] All containers hidden');\n }\n\n /**\n * Show all containers\n */\n private showAllContainers(): void {\n console.log('🎯 [FloatingContainerShortcuts] Showing all containers');\n const containers = this.containerService.visibleContainers();\n containers.forEach((container, index) => {\n this.containerService.setZIndex(container.id, this.Z_INDEX_LAYERS.NORMAL + index);\n });\n console.log('✅ [FloatingContainerShortcuts] All containers shown');\n }\n\n /**\n * Minimize all containers\n */\n private minimizeAllContainers(): void {\n console.log('🎯 [FloatingContainerShortcuts] Minimizing all containers');\n const containers = this.containerService.visibleContainers();\n containers.forEach(container => {\n // Implement minimize logic here\n console.log('📦 [FloatingContainerShortcuts] Minimizing container:', container.id);\n });\n console.log('✅ [FloatingContainerShortcuts] All containers minimized');\n }\n\n /**\n * Focus container by index\n */\n private focusContainerByIndex(index: number): void {\n console.log('🎯 [FloatingContainerShortcuts] Focusing container at index:', index);\n const containers = this.containerService.visibleContainers();\n if (containers[index]) {\n this.containerService.bringToFront(containers[index].id);\n console.log('✅ [FloatingContainerShortcuts] Container focused:', containers[index].id);\n } else {\n console.warn('⚠️ [FloatingContainerShortcuts] Container not found at index:', index);\n }\n }\n\n /**\n * Open file uploader\n */\n private openFileUploader(): void {\n console.log('🎯 [FloatingContainerShortcuts] Opening file uploader');\n // Implement file uploader opening logic here\n console.log('✅ [FloatingContainerShortcuts] File uploader opened');\n }\n\n /**\n * Open entity rights sharing\n */\n private openEntityRightsSharing(): void {\n console.log('🎯 [FloatingContainerShortcuts] Opening entity rights sharing');\n // Implement entity rights sharing opening logic here\n console.log('✅ [FloatingContainerShortcuts] Entity rights sharing opened');\n }\n\n /**\n * Duplicate current container\n */\n private duplicateCurrentContainer(): void {\n console.log('🎯 [FloatingContainerShortcuts] Duplicating current container');\n const containers = this.containerService.visibleContainers();\n if (containers.length > 0) {\n const containerToDuplicate = containers[containers.length - 1]; // Use last container\n const newContainerId = this.containerService.show({\n id: 'duplicate-' + Date.now(),\n title: `${containerToDuplicate.config.title} (Copy)`,\n width: containerToDuplicate.config.width,\n height: containerToDuplicate.config.height\n });\n console.log('✅ [FloatingContainerShortcuts] Container duplicated:', newContainerId);\n } else {\n console.warn('⚠️ [FloatingContainerShortcuts] No container to duplicate');\n }\n }\n\n /**\n * Close current container\n */\n private closeCurrentContainer(): void {\n console.log('🎯 [FloatingContainerShortcuts] Closing current container');\n const containers = this.containerService.visibleContainers();\n if (containers.length > 0) {\n const containerToClose = containers[containers.length - 1]; // Use last container\n this.containerService.hide(containerToClose.id);\n console.log('✅ [FloatingContainerShortcuts] Container closed:', containerToClose.id);\n } else {\n console.warn('⚠️ [FloatingContainerShortcuts] No container to close');\n }\n }\n\n /**\n * Toggle container visibility\n */\n private toggleContainerVisibility(): void {\n console.log('🎯 [FloatingContainerShortcuts] Toggling container visibility');\n const containers = this.containerService.visibleContainers();\n if (containers.length > 0) {\n const containerToToggle = containers[containers.length - 1]; // Use last container\n const currentZIndex = this.containerService.getZIndexSignal(containerToToggle.id)();\n if (currentZIndex === this.Z_INDEX_LAYERS.HIDDEN) {\n this.containerService.setZIndex(containerToToggle.id, this.Z_INDEX_LAYERS.NORMAL);\n console.log('✅ [FloatingContainerShortcuts] Container shown:', containerToToggle.id);\n } else {\n this.containerService.setZIndex(containerToToggle.id, this.Z_INDEX_LAYERS.HIDDEN);\n console.log('✅ [FloatingContainerShortcuts] Container hidden:', containerToToggle.id);\n }\n } else {\n console.warn('⚠️ [FloatingContainerShortcuts] No container to toggle');\n }\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from './floating-container.service';\nimport { FloatingContainerShortcutsService } from './floating-container-shortcuts.service';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CideEleFloatingFeaturesService {\n private containerService = inject(CideEleFloatingContainerService);\n private shortcutsService = inject(FloatingContainerShortcutsService);\n\n constructor() {\n // File uploader is handled by its own dedicated service\n // Entity rights sharing is handled by its own dedicated service\n }\n\n\n\n // Generic method to show any floating feature\n showFeature(featureId: string, config: FloatingContainerConfig): string {\n return this.containerService.show({ ...config, id: featureId });\n }\n\n // Generic method for showing any component dynamically\n showComponent(\n containerId: string,\n componentId: string,\n title: string,\n componentType?: any,\n config: Partial<FloatingContainerConfig> = {}\n ): string {\n const containerConfig: FloatingContainerConfig = {\n id: containerId,\n title,\n icon: 'widgets',\n width: '400px',\n height: '500px',\n minWidth: '300px',\n minHeight: '200px',\n resizable: true,\n draggable: true,\n closable: true,\n minimizable: true,\n maximizable: true,\n componentId,\n ...config\n };\n\n // Register component if provided\n if (componentType) {\n this.registerComponent(componentId, componentType);\n }\n\n return this.containerService.show(containerConfig);\n }\n\n /**\n * Generic method for showing any component with input data\n * \n * @example\n * // Pass data to a component\n * this.floatingFeaturesService.showComponentWithData(\n * 'my-component-container',\n * 'my-component',\n * 'My Component Title',\n * {\n * data: {\n * userId: '123',\n * userName: 'John Doe',\n * settings: { theme: 'dark' }\n * },\n * outputs: {\n * onSave: (data) => console.log('Save event:', data),\n * onCancel: () => console.log('Cancel clicked')\n * }\n * },\n * {\n * width: '600px',\n * height: '400px',\n * icon: 'settings'\n * }\n * );\n */\n showComponentWithData(\n containerId: string,\n componentId: string,\n title: string,\n componentData: {\n data: { [key: string]: any };\n outputs?: { [key: string]: (event: any) => void };\n },\n containerConfig: Partial<FloatingContainerConfig> = {}\n ): string {\n const config: FloatingContainerConfig = {\n id: containerId,\n title,\n icon: 'widgets',\n width: '400px',\n height: '500px',\n minWidth: '300px',\n minHeight: '200px',\n resizable: true,\n draggable: true,\n closable: true,\n minimizable: true,\n maximizable: true,\n componentId,\n componentConfig: {\n inputs: componentData.data,\n outputs: componentData.outputs || {}\n },\n ...containerConfig\n };\n\n return this.containerService.show(config);\n }\n\n // Show multiple instances of the same component\n showMultipleInstances(\n componentId: string,\n titlePrefix: string,\n count: number,\n config: Partial<FloatingContainerConfig> = {}\n ): string[] {\n const containerIds: string[] = [];\n \n for (let i = 1; i <= count; i++) {\n const containerId = `${componentId}-instance-${i}-${Date.now()}`;\n const title = `${titlePrefix} ${i}`;\n \n const containerConfig: FloatingContainerConfig = {\n id: containerId,\n title,\n icon: 'widgets',\n width: '400px',\n height: '500px',\n minWidth: '300px',\n minHeight: '200px',\n resizable: true,\n draggable: true,\n closable: true,\n minimizable: true,\n maximizable: true,\n componentId,\n ...config\n };\n\n const id = this.containerService.show(containerConfig);\n containerIds.push(id);\n }\n \n return containerIds;\n }\n\n // Get all instances of a component type\n getInstancesOfType(componentType: string) {\n return this.containerService.getInstancesByComponentType(componentType);\n }\n\n // Get active instances of a component type\n getActiveInstancesOfType(componentType: string) {\n return this.containerService.getActiveInstancesByComponentType(componentType);\n }\n\n // Close all instances of a component type\n closeAllInstancesOfType(componentType: string): void {\n this.containerService.closeAllInstancesOfType(componentType);\n }\n\n // Minimize all instances of a component type\n minimizeAllInstancesOfType(componentType: string): void {\n this.containerService.minimizeAllInstancesOfType(componentType);\n }\n\n // Get instance count for a component type\n getInstanceCount(componentType: string): number {\n return this.containerService.getInstanceCount(componentType);\n }\n\n // Get active instance count for a component type\n getActiveInstanceCount(componentType: string): number {\n return this.containerService.getActiveInstanceCount(componentType);\n }\n\n // Register a component for dynamic loading\n registerComponent(componentId: string, componentType: any): void {\n this.containerService.registerComponent(componentId, componentType);\n }\n\n // Unregister a component\n unregisterComponent(componentId: string): void {\n this.containerService.unregisterComponent(componentId);\n }\n\n hideFeature(featureId: string): void {\n this.containerService.hide(featureId);\n }\n\n // Utility methods\n bringToFront(featureId: string): void {\n this.containerService.bringToFront(featureId);\n }\n\n minimize(featureId: string): void {\n this.containerService.minimize(featureId);\n }\n\n maximize(featureId: string): void {\n this.containerService.maximize(featureId);\n }\n\n isVisible(featureId: string): boolean {\n return this.containerService.isVisible(featureId);\n }\n\n hideAll(): void {\n this.containerService.hideAll();\n }\n\n minimizeAll(): void {\n this.containerService.minimizeAll();\n }\n\n}\n","import { Directive, Input, OnInit, OnDestroy, ViewContainerRef, ComponentRef } from '@angular/core';\nimport { CideEleFloatingContainerService, FloatingComponentConfig } from './floating-container.service';\n\n@Directive({\n selector: '[cideEleFloatingDynamic]',\n standalone: true\n})\nexport class CideEleFloatingContainerDynamicDirective implements OnInit, OnDestroy {\n @Input() componentId!: string;\n @Input() componentConfig?: FloatingComponentConfig;\n @Input() isVisible: boolean = true;\n\n private componentRef: ComponentRef<any> | null = null;\n\n constructor(\n private viewContainer: ViewContainerRef,\n private containerService: CideEleFloatingContainerService\n ) {}\n\n ngOnInit(): void {\n if (this.isVisible && this.componentId) {\n this.loadComponent();\n }\n }\n\n ngOnDestroy(): void {\n this.destroyComponent();\n }\n\n ngOnChanges(): void {\n if (this.isVisible && this.componentId && !this.componentRef) {\n this.loadComponent();\n } else if (!this.isVisible && this.componentRef) {\n this.destroyComponent();\n }\n }\n\n private loadComponent(): void {\n if (this.componentId && this.containerService.isComponentRegistered(this.componentId)) {\n this.componentRef = this.containerService.loadComponent(\n this.componentId,\n this.viewContainer,\n this.componentConfig\n );\n } else {\n console.warn(`Component '${this.componentId}' is not registered. Available components:`, this.containerService.getRegisteredComponentIds());\n \n // Retry after a short delay in case registration is still in progress\n setTimeout(() => {\n if (this.containerService.isComponentRegistered(this.componentId)) {\n this.componentRef = this.containerService.loadComponent(\n this.componentId,\n this.viewContainer,\n this.componentConfig\n );\n } else {\n console.error(`Component '${this.componentId}' still not registered after retry`);\n }\n }, 100);\n }\n }\n\n private destroyComponent(): void {\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n }\n}\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} ","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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CideElementsService","i2","catchError","i1","i1.CideEleFloatingContainerService"],"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/select/select.component.ts","../../../projects/cloud-ide-element/src/lib/elements/select/select.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/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/components/floating-container/floating-container.service.ts","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.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/floating-file-uploader/floating-file-uploader.component.ts","../../../projects/cloud-ide-element/src/lib/elements/floating-file-uploader/floating-file-uploader.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/elements/breadcrumb/breadcrumb.component.ts","../../../projects/cloud-ide-element/src/lib/elements/breadcrumb/breadcrumb.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/utils/directives/tooltip/tooltip.directive.ts","../../../projects/cloud-ide-element/src/lib/utils/directives/resizer/resizer.directive.ts","../../../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/services/core-file-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/dropdown-manager.service.ts","../../../projects/cloud-ide-element/src/lib/services/keyboard-shortcut.service.ts","../../../projects/cloud-ide-element/src/lib/services/confirmation.service.ts","../../../projects/cloud-ide-element/src/lib/directives/file-image/file-image.directive.ts","../../../projects/cloud-ide-element/src/lib/components/form-field-error/form-field-error.component.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/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/components/dropdown/dropdown.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-manager.component.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-shortcuts.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-features.service.ts","../../../projects/cloud-ide-element/src/lib/components/floating-container/floating-container-dynamic.directive.ts","../../../projects/cloud-ide-element/src/lib/components/json-editor/json-editor.component.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/cloud-ide-element.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'capitalize',\r\n standalone: true\r\n})\r\nexport class CapitalizePipe implements PipeTransform {\r\n\r\n transform(\r\n value: string,\r\n capitalizationMethod: 'allUpperCase' | 'titleCase' | 'sentenceCase'\r\n ): string {\r\n if (value) {\r\n if (capitalizationMethod === 'allUpperCase') {\r\n return value.toUpperCase();\r\n } else if (capitalizationMethod === 'titleCase') {\r\n const splitString = value\r\n .split(' ')\r\n .map((s) => `${s[0].toUpperCase()}${s.slice(1)}`);\r\n return splitString.join(' ');\r\n } else if (capitalizationMethod === 'sentenceCase') {\r\n const splitString = value.split('.').map((s) => {\r\n const trimmedString = s.trim();\r\n if (trimmedString.length > 0) {\r\n return `${trimmedString[0].toUpperCase()}${trimmedString.slice(1)}`;\r\n }\r\n return '';\r\n });\r\n return splitString.join('. ');\r\n }\r\n }\r\n return '';\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { GetElementDataRequest, ICoreSype } from 'cloud-ide-lms-model';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideElementsService {\r\n cide_element_data: { [key: string]: ICoreSype } = {};\r\n is_cide_element_data_updated: BehaviorSubject<boolean> = new BehaviorSubject(false);\r\n async getElementData(body: GetElementDataRequest): Promise<ICoreSype> {\r\n return new Promise<ICoreSype>((resolve) => {\r\n const cide_element_data = this.cide_element_data[body?.sype_key];\r\n if (cide_element_data) {\r\n resolve(cide_element_data);\r\n } else {\r\n const subscription = this.is_cide_element_data_updated?.subscribe({\r\n next: (is_cide_element_data_updated: boolean) => {\r\n if (is_cide_element_data_updated) {\r\n const cide_element_data = this.cide_element_data[body?.sype_key];\r\n if (cide_element_data) {\r\n subscription?.unsubscribe();\r\n resolve(cide_element_data);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n })\r\n }\r\n}\r\n","import { Injectable, TemplateRef, ViewContainerRef, EmbeddedViewRef } from '@angular/core';\r\n\r\nexport interface PortalPosition {\r\n top: number;\r\n left: number;\r\n maxHeight?: number;\r\n maxWidth?: number;\r\n minWidth?: number;\r\n}\r\n\r\nexport interface PortalConfig {\r\n triggerElement: HTMLElement;\r\n content: string;\r\n className?: string;\r\n position?: 'bottom' | 'top' | 'auto';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n offsetX?: number;\r\n offsetY?: number;\r\n maxHeight?: number;\r\n minWidth?: number;\r\n closeOnClickOutside?: boolean;\r\n closeOnEscape?: boolean;\r\n}\r\n\r\nexport interface TemplatePortalConfig {\r\n triggerElement: HTMLElement;\r\n template: TemplateRef<any>;\r\n viewContainerRef: ViewContainerRef;\r\n context?: any;\r\n className?: string;\r\n position?: 'bottom' | 'top' | 'auto';\r\n align?: 'left' | 'right' | 'center' | 'auto';\r\n offsetX?: number;\r\n offsetY?: number;\r\n maxHeight?: number;\r\n minWidth?: number;\r\n closeOnClickOutside?: boolean;\r\n closeOnEscape?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PortalService {\r\n private portals = new Map<string, HTMLElement>();\r\n private templatePortals = new Map<string, { element: HTMLElement; viewRef: EmbeddedViewRef<any> }>();\r\n private boundClickOutsideHandler: (event: Event) => void;\r\n private boundEscapeHandler: (event: KeyboardEvent) => void;\r\n private closeCallbacks = new Map<string, () => void>();\r\n\r\n constructor() {\r\n this.boundClickOutsideHandler = this.handleClickOutside.bind(this);\r\n this.boundEscapeHandler = this.handleEscape.bind(this);\r\n }\r\n\r\n /**\r\n * Create a portal with the given configuration\r\n */\r\n createPortal(id: string, config: PortalConfig): HTMLElement {\r\n // Clean up any existing portal with the same ID\r\n this.destroyPortal(id);\r\n\r\n // Calculate position\r\n const position = this.calculatePosition(config);\r\n\r\n // Create portal element\r\n const portal = document.createElement('div');\r\n portal.id = `portal-${id}`;\r\n portal.className = `cide-portal ${config.className || ''}`;\r\n portal.style.position = 'fixed';\r\n portal.style.top = `${position.top}px`;\r\n portal.style.left = `${position.left}px`;\r\n portal.style.zIndex = '9999';\r\n\r\n if (position.maxHeight) {\r\n portal.style.maxHeight = `${position.maxHeight}px`;\r\n portal.style.overflowY = 'auto';\r\n }\r\n\r\n if (position.maxWidth) {\r\n portal.style.maxWidth = `${position.maxWidth}px`;\r\n }\r\n\r\n if (position.minWidth) {\r\n portal.style.minWidth = `${position.minWidth}px`;\r\n }\r\n\r\n // Set content\r\n portal.innerHTML = config.content;\r\n\r\n // Append to body\r\n document.body.appendChild(portal);\r\n\r\n // Store portal reference\r\n this.portals.set(id, portal);\r\n\r\n // Set up event listeners if needed\r\n if (config.closeOnClickOutside || config.closeOnEscape) {\r\n this.setupEventListeners(id, config);\r\n }\r\n\r\n // Adjust position if portal goes outside viewport\r\n this.adjustPosition(portal, config.triggerElement);\r\n\r\n return portal;\r\n }\r\n\r\n /**\r\n * Create a template-based portal with Angular template\r\n */\r\n createTemplatePortal(id: string, config: TemplatePortalConfig): HTMLElement {\r\n // Clean up any existing portal with the same ID\r\n this.destroyPortal(id);\r\n\r\n // Calculate position\r\n const position = this.calculatePosition({\r\n triggerElement: config.triggerElement,\r\n content: '', // Not used for template portals\r\n position: config.position,\r\n align: config.align,\r\n offsetX: config.offsetX,\r\n offsetY: config.offsetY,\r\n maxHeight: config.maxHeight,\r\n minWidth: config.minWidth\r\n });\r\n console.log(\"test astrd\", config);\r\n // Create the view from template\r\n const viewRef = config.viewContainerRef.createEmbeddedView(config.template, { context: config.context });\r\n viewRef.detectChanges();\r\n \r\n console.log('🔵 Template view created:', {\r\n viewRef,\r\n rootNodes: viewRef.rootNodes,\r\n rootNodesLength: viewRef.rootNodes.length\r\n });\r\n\r\n // Create portal container element\r\n const portal = document.createElement('div');\r\n portal.id = `portal-${id}`;\r\n portal.className = `cide-portal ${config.className || ''}`;\r\n portal.style.position = 'fixed';\r\n portal.style.top = `${position.top}px`;\r\n portal.style.left = `${position.left}px`;\r\n portal.style.zIndex = '99999'; // Increased z-index\r\n portal.style.display = 'block';\r\n portal.style.visibility = 'visible';\r\n portal.style.opacity = '1';\r\n\r\n if (position.maxHeight) {\r\n portal.style.maxHeight = `${position.maxHeight}px`;\r\n portal.style.overflowY = 'auto';\r\n }\r\n\r\n if (position.maxWidth) {\r\n portal.style.maxWidth = `${position.maxWidth}px`;\r\n }\r\n\r\n if (position.minWidth) {\r\n portal.style.minWidth = `${position.minWidth}px`;\r\n }\r\n\r\n // Append template nodes to portal\r\n viewRef.rootNodes.forEach(node => {\r\n portal.appendChild(node);\r\n });\r\n\r\n // Append to body\r\n document.body.appendChild(portal);\r\n\r\n // Store template portal reference\r\n this.templatePortals.set(id, { element: portal, viewRef });\r\n\r\n console.log('🔵 Portal created and appended to body:', {\r\n id,\r\n portal,\r\n position: { top: position.top, left: position.left },\r\n zIndex: portal.style.zIndex,\r\n className: portal.className,\r\n children: portal.children.length\r\n });\r\n\r\n // Set up event listeners if needed\r\n if (config.closeOnClickOutside || config.closeOnEscape) {\r\n this.setupEventListeners(id, {\r\n triggerElement: config.triggerElement,\r\n content: '',\r\n closeOnClickOutside: config.closeOnClickOutside,\r\n closeOnEscape: config.closeOnEscape\r\n });\r\n }\r\n\r\n // Adjust position if portal goes outside viewport\r\n this.adjustPosition(portal, config.triggerElement);\r\n\r\n return portal;\r\n }\r\n\r\n /**\r\n * Update portal content\r\n */\r\n updatePortal(id: string, content: string): void {\r\n const portal = this.portals.get(id);\r\n if (portal) {\r\n portal.innerHTML = content;\r\n }\r\n }\r\n\r\n /**\r\n * Update portal position\r\n */\r\n updatePortalPosition(id: string, config: PortalConfig): void {\r\n const portal = this.portals.get(id);\r\n if (portal) {\r\n const position = this.calculatePosition(config);\r\n portal.style.top = `${position.top}px`;\r\n portal.style.left = `${position.left}px`;\r\n this.adjustPosition(portal, config.triggerElement);\r\n }\r\n }\r\n\r\n /**\r\n * Destroy a portal\r\n */\r\n destroyPortal(id: string): void {\r\n // Handle regular portals\r\n const portal = this.portals.get(id);\r\n if (portal && portal.parentNode) {\r\n portal.parentNode.removeChild(portal);\r\n this.portals.delete(id);\r\n this.closeCallbacks.delete(id);\r\n this.cleanupEventListeners();\r\n return;\r\n }\r\n\r\n // Handle template portals\r\n const templatePortal = this.templatePortals.get(id);\r\n if (templatePortal) {\r\n if (templatePortal.element && templatePortal.element.parentNode) {\r\n templatePortal.element.parentNode.removeChild(templatePortal.element);\r\n }\r\n templatePortal.viewRef.destroy();\r\n this.templatePortals.delete(id);\r\n this.closeCallbacks.delete(id);\r\n this.cleanupEventListeners();\r\n }\r\n }\r\n\r\n /**\r\n * Destroy all portals\r\n */\r\n destroyAllPortals(): void {\r\n this.portals.forEach((_, id) => this.destroyPortal(id));\r\n this.templatePortals.forEach((_, id) => this.destroyPortal(id));\r\n }\r\n\r\n /**\r\n * Register a close callback for a portal\r\n */\r\n registerCloseCallback(id: string, callback: () => void): void {\r\n this.closeCallbacks.set(id, callback);\r\n }\r\n\r\n /**\r\n * Get portal element by ID\r\n */\r\n getPortal(id: string): HTMLElement | undefined {\r\n const portal = this.portals.get(id);\r\n if (portal) return portal;\r\n\r\n const templatePortal = this.templatePortals.get(id);\r\n return templatePortal?.element;\r\n }\r\n\r\n /**\r\n * Check if portal exists\r\n */\r\n hasPortal(id: string): boolean {\r\n return this.portals.has(id) || this.templatePortals.has(id);\r\n }\r\n\r\n private calculatePosition(config: PortalConfig): PortalPosition {\r\n const rect = config.triggerElement.getBoundingClientRect();\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n };\r\n\r\n const offsetX = config.offsetX || 0;\r\n const offsetY = config.offsetY || 4;\r\n const estimatedHeight = config.maxHeight || 300;\r\n const estimatedWidth = config.minWidth || rect.width;\r\n\r\n // Smart vertical positioning - check available space above and below\r\n const spaceBelow = viewport.height - rect.bottom;\r\n const spaceAbove = rect.top;\r\n \r\n let top: number;\r\n let position: 'top' | 'bottom' = 'bottom'; // Default to bottom\r\n \r\n // Determine if we should open above or below\r\n if (config.position === 'auto' || !config.position) {\r\n // Auto-detect: prefer bottom, but use top if not enough space below\r\n if (spaceBelow < estimatedHeight && spaceAbove > estimatedHeight) {\r\n position = 'top';\r\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\r\n } else {\r\n position = 'bottom';\r\n top = rect.bottom + window.scrollY + offsetY;\r\n }\r\n } else if (config.position === 'top') {\r\n position = 'top';\r\n top = rect.top + window.scrollY - estimatedHeight - offsetY;\r\n } else {\r\n position = 'bottom';\r\n top = rect.bottom + window.scrollY + offsetY;\r\n }\r\n\r\n let left = rect.left + window.scrollX + offsetX; \r\n\r\n // Auto-detect horizontal alignment\r\n if (config.align === 'auto' || !config.align) {\r\n const spaceRight = viewport.width - rect.left;\r\n const spaceLeft = rect.right;\r\n\r\n if (spaceRight < estimatedWidth && spaceLeft > estimatedWidth) {\r\n // Align to right edge of trigger\r\n left = rect.right + window.scrollX - estimatedWidth;\r\n }\r\n } else if (config.align === 'right') {\r\n left = rect.right + window.scrollX - estimatedWidth;\r\n } else if (config.align === 'center') {\r\n left = rect.left + window.scrollX + (rect.width / 2) - (estimatedWidth / 2);\r\n }\r\n\r\n return {\r\n top,\r\n left,\r\n maxHeight: config.maxHeight,\r\n minWidth: config.minWidth\r\n };\r\n }\r\n\r\n private adjustPosition(portal: HTMLElement, triggerElement: HTMLElement): void {\r\n const portalRect = portal.getBoundingClientRect();\r\n const triggerRect = triggerElement.getBoundingClientRect();\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n };\r\n\r\n let adjustedLeft = parseInt(portal.style.left);\r\n let adjustedTop = parseInt(portal.style.top);\r\n\r\n // Adjust horizontal position if portal goes outside viewport\r\n if (portalRect.right > viewport.width) {\r\n adjustedLeft = triggerRect.right + window.scrollX - portalRect.width;\r\n }\r\n if (portalRect.left < 0) {\r\n adjustedLeft = window.scrollX + 4; // Small margin from edge\r\n }\r\n\r\n // Smart vertical adjustment - flip to opposite side if needed\r\n const spaceBelow = viewport.height - triggerRect.bottom;\r\n const spaceAbove = triggerRect.top;\r\n const portalHeight = portalRect.height;\r\n\r\n // If portal goes below viewport and there's more space above, flip to top\r\n if (portalRect.bottom > viewport.height && spaceAbove > portalHeight) {\r\n adjustedTop = triggerRect.top + window.scrollY - portalHeight - 4;\r\n }\r\n // If portal goes above viewport and there's more space below, flip to bottom\r\n else if (portalRect.top < 0 && spaceBelow > portalHeight) {\r\n adjustedTop = triggerRect.bottom + window.scrollY + 4;\r\n }\r\n // If still outside viewport, adjust to fit within bounds\r\n else {\r\n if (portalRect.bottom > viewport.height) {\r\n adjustedTop = viewport.height + window.scrollY - portalHeight - 4;\r\n }\r\n if (portalRect.top < 0) {\r\n adjustedTop = window.scrollY + 4; // Small margin from top\r\n }\r\n }\r\n\r\n portal.style.left = `${adjustedLeft}px`;\r\n portal.style.top = `${adjustedTop}px`;\r\n }\r\n\r\n private setupEventListeners(id: string, config: PortalConfig): void {\r\n // Set up event listeners only once when first portal is created\r\n const totalPortals = this.portals.size + this.templatePortals.size;\r\n if (totalPortals === 1) {\r\n if (config.closeOnClickOutside) {\r\n document.addEventListener('click', this.boundClickOutsideHandler);\r\n }\r\n if (config.closeOnEscape) {\r\n document.addEventListener('keydown', this.boundEscapeHandler);\r\n }\r\n }\r\n }\r\n\r\n private cleanupEventListeners(): void {\r\n // Clean up event listeners when no portals exist\r\n const totalPortals = this.portals.size + this.templatePortals.size;\r\n if (totalPortals === 0) {\r\n document.removeEventListener('click', this.boundClickOutsideHandler);\r\n document.removeEventListener('keydown', this.boundEscapeHandler);\r\n }\r\n }\r\n\r\n private handleClickOutside(event: Event): void {\r\n const target = event.target as HTMLElement;\r\n\r\n // Handle regular portals\r\n this.portals.forEach((portal, id) => {\r\n const callback = this.closeCallbacks.get(id);\r\n if (callback && !portal.contains(target)) {\r\n // Check if click is on trigger element\r\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\r\n if (!triggerElement || !triggerElement.contains(target)) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n // Handle template portals\r\n this.templatePortals.forEach((templatePortal, id) => {\r\n const callback = this.closeCallbacks.get(id);\r\n if (callback && !templatePortal.element.contains(target)) {\r\n // Check if click is on trigger element\r\n const triggerElement = document.querySelector(`[data-portal-trigger=\"${id}\"]`) as HTMLElement;\r\n if (!triggerElement || !triggerElement.contains(target)) {\r\n callback();\r\n }\r\n }\r\n });\r\n }\r\n\r\n private handleEscape(event: KeyboardEvent): void {\r\n if (event.key === 'Escape') {\r\n // Close the most recently opened portal\r\n const portalIds = Array.from(this.portals.keys());\r\n const templatePortalIds = Array.from(this.templatePortals.keys());\r\n const allPortalIds = [...portalIds, ...templatePortalIds];\r\n const lastPortalId = allPortalIds[allPortalIds.length - 1];\r\n\r\n if (lastPortalId) {\r\n const callback = this.closeCallbacks.get(lastPortalId);\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, forwardRef, inject, ViewChild, TemplateRef, ViewContainerRef, EmbeddedViewRef } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\r\nimport { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';\r\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\r\nimport { autocapitalizeType, autocompleteType, controlType, elementStyleType, inputType, labelDirType, labelPlacementType, themeSize } from 'cloud-ide-lms-model';\r\nimport { PortalService } from '../../services/portal.service';\r\n\r\n/** @description type to register error related to control */\r\nexport type ErrorValidationStatus = {\r\n maxlength?: string,\r\n minlength?: string,\r\n required?: string,\r\n}\r\nexport type ValidationStatus = {\r\n validation: ErrorValidationStatus,\r\n status: boolean\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-input',\r\n standalone: true,\r\n templateUrl: './input.component.html',\r\n styleUrl: './input.component.scss',\r\n imports: [\r\n // directives\r\n CommonModule,\r\n // for ngModel\r\n FormsModule\r\n ],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideInputComponent),\r\n multi: true\r\n },\r\n /** @description to apply validations */\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: forwardRef(() => CideInputComponent),\r\n },\r\n CapitalizePipe\r\n ]\r\n})\r\n\r\nexport class CideInputComponent implements ControlValueAccessor, Validator, OnChanges, OnInit, OnDestroy {\r\n\r\n // Modern Angular v20 dependency injection pattern\r\n public capitalizePipe = inject(CapitalizePipe);\r\n private elementService = inject(CideElementsService);\r\n\r\n constructor() {\r\n // Modern Angular v20 pattern: Use constructor for initialization only\r\n // Validate control\r\n this.onValidate();\r\n }\r\n /*=======Set custom controls inputs to set components=========*/\r\n\r\n /** \r\n * @description to se the visual of control like solid control offerd by material design or outline with a border\r\n * @options solid | outline | standard\r\n */\r\n @Input() fill: elementStyleType = 'outline';\r\n /** @description Lable of control (Title), Like Name, Email */\r\n @Input() label: string = \"\";\r\n /** @description to hide and show label */\r\n @Input() labelHide: boolean = false;\r\n /** @description is control Editable or Disabled */\r\n @Input() disabled: boolean = false;\r\n /** @description Is Clear Input Cross button is visible or not */\r\n @Input() clearInput: boolean = false;\r\n /** @description Position of Label 'floating' | 'fixed' */\r\n @Input() labelPlacement: labelPlacementType = \"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 // Time picker properties\r\n public showTimePicker: boolean = false;\r\n public timeHours: number = 1;\r\n public timeMinutes: number = 30;\r\n public timeSeconds: number = 30;\r\n public timeFormat: 'AM' | 'PM' = 'AM';\r\n private timePickerPortalId = `time-picker-${this.randomString()}`;\r\n \r\n // ViewChild for time picker template\r\n @ViewChild('timePickerTemplate', { static: true }) timePickerTemplate!: TemplateRef<any>;\r\n \r\n // DateTime picker properties\r\n public showDateTimePicker: boolean = false;\r\n public dateTimeStep: 'date' | 'time' = 'date';\r\n private dateTimePickerPortalId = `datetime-picker-${this.randomString()}`;\r\n \r\n // ViewChild for datetime picker template\r\n @ViewChild('dateTimePickerTemplate', { static: true }) dateTimePickerTemplate!: TemplateRef<any>;\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 the validation object directly, not wrapped in ValidationStatus\r\n return validation_error.validation;\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 // Clean up time picker portal\r\n this.portalService.destroyPortal(this.timePickerPortalId);\r\n // Clean up datetime picker portal\r\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\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 === 'datetime-local' && typeof value === 'string' && value) {\r\n // Ensure datetime-local is in YYYY-MM-DDTHH:mm format\r\n const datetimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\r\n if (datetimeRegex.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 datetime to YYYY-MM-DDTHH:mm\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 const hours = String(parsedDate.getHours()).padStart(2, '0');\r\n const minutes = String(parsedDate.getMinutes()).padStart(2, '0');\r\n return `${year}-${month}-${day}T${hours}:${minutes}`;\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 if (type == 'time') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n // Validate time format (HH:mm or HH:mm:ss)\r\n const timeRegex = /^\\d{2}:\\d{2}(:\\d{2})?$/;\r\n return timeRegex.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 == 'datetime-local') {\r\n if (typeof (value) == 'string') {\r\n if (value?.length > 0) {\r\n // Validate datetime-local format (YYYY-MM-DDTHH:mm:ss or YYYY-MM-DDTHH:mm)\r\n const datetimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}(:\\d{2})?$/;\r\n return datetimeRegex.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 } else if (this.type == 'datetime-local') {\r\n if (typeof (value) == 'string' && value) {\r\n // Validate datetime-local format and parse\r\n const datetimeRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/;\r\n if (!datetimeRegex.test(value)) {\r\n validation_status.status = true;\r\n validation_status.validation.required = `Invalid datetime format (YYYY-MM-DDTHH:mm)!`;\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 datetime!`;\r\n } else {\r\n // Validate min datetime\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 = `Datetime must be after ${this.min}!`;\r\n }\r\n }\r\n // Validate max datetime\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 = `Datetime 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 = `Datetime 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 if (this.type === 'time') {\r\n // Toggle custom time picker using portal service\r\n this.showTimePicker = !this.showTimePicker;\r\n if (this.showTimePicker) {\r\n this.initializeTimePicker();\r\n this.createTimePickerUsingPortal();\r\n } else {\r\n this.closeTimePicker();\r\n }\r\n } else if (this.type === 'datetime-local') {\r\n // Toggle custom datetime picker using portal service\r\n this.showDateTimePicker = !this.showDateTimePicker;\r\n if (this.showDateTimePicker) {\r\n this.dateTimeStep = 'date'; // Start with date selection\r\n this.initializeDateTimePicker();\r\n this.createDateTimePickerUsingPortal();\r\n } else {\r\n this.closeDateTimePicker();\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 Helper to check if type is time (for template type narrowing)\r\n */\r\n isTimeType(): boolean {\r\n return this.type === 'time';\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 === 'time') {\r\n this.typeInternal = \"time\";\r\n // Set default schedule icon for time picker\r\n this.trailingIconInternal = this.trailingIcon || \"schedule\";\r\n this.isTrailingIconAllwedClick = true; // Allow clicking time icon\r\n } else if (this.type === 'datetime-local') {\r\n this.typeInternal = \"datetime-local\";\r\n // Set default schedule icon if no trailing icon specified\r\n this.trailingIconInternal = this.trailingIcon || \"event\";\r\n this.isTrailingIconAllwedClick = true; // datetime-local now uses custom picker\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 // Mark as touched and validate\r\n this.isTouched = true;\r\n this.onTouched();\r\n this.isControlValid(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 // ==================== TIME PICKER METHODS ====================\r\n\r\n /**\r\n * @description Initialize time picker with current values\r\n */\r\n initializeTimePicker(): void {\r\n if (this.ngModel) {\r\n // Parse existing time value (format: HH:mm or HH:mm:ss)\r\n const timeString = this.ngModel.toString();\r\n const timeParts = timeString.split(':');\r\n \r\n if (timeParts.length >= 2) {\r\n let hours = parseInt(timeParts[0]);\r\n const minutes = parseInt(timeParts[1]);\r\n const seconds = timeParts[2] ? parseInt(timeParts[2]) : 0;\r\n \r\n // Convert to 12-hour format\r\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\r\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\r\n this.timeMinutes = minutes;\r\n this.timeSeconds = seconds;\r\n }\r\n } else {\r\n // Default to current time\r\n const now = new Date();\r\n let hours = now.getHours();\r\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\r\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\r\n this.timeMinutes = now.getMinutes();\r\n this.timeSeconds = now.getSeconds();\r\n }\r\n }\r\n\r\n /**\r\n * @description Create time picker using template-based portal service\r\n */\r\n private createTimePickerUsingPortal(): void {\r\n const inputElement = document.getElementById(this.id || this.idRandom);\r\n if (!inputElement) return;\r\n\r\n const portalConfig = {\r\n template: this.timePickerTemplate,\r\n context: { $implicit: this },\r\n triggerElement: inputElement,\r\n viewContainerRef: this.viewContainerRef,\r\n className: 'cide-time-picker-portal',\r\n position: 'bottom' as 'bottom',\r\n align: 'left' as 'left',\r\n offset: { x: 0, y: 8 },\r\n closeOnOutsideClick: true,\r\n closeOnEscape: true\r\n };\r\n\r\n this.portalService.createTemplatePortal(this.timePickerPortalId, portalConfig);\r\n\r\n // Register close callback\r\n this.portalService.registerCloseCallback(this.timePickerPortalId, () => {\r\n this.closeTimePicker();\r\n });\r\n\r\n inputElement.setAttribute('data-portal-trigger', this.timePickerPortalId);\r\n }\r\n\r\n /**\r\n * @description Close time picker\r\n */\r\n closeTimePicker(): void {\r\n this.showTimePicker = false;\r\n this.portalService.destroyPortal(this.timePickerPortalId);\r\n }\r\n\r\n /**\r\n * @description Increment/decrement time value\r\n */\r\n adjustTime(unit: 'hours' | 'minutes' | 'seconds', direction: 'up' | 'down'): void {\r\n if (unit === 'hours') {\r\n if (direction === 'up') {\r\n this.timeHours = this.timeHours === 12 ? 1 : this.timeHours + 1;\r\n } else {\r\n this.timeHours = this.timeHours === 1 ? 12 : this.timeHours - 1;\r\n }\r\n } else if (unit === 'minutes') {\r\n if (direction === 'up') {\r\n this.timeMinutes = this.timeMinutes === 59 ? 0 : this.timeMinutes + 1;\r\n } else {\r\n this.timeMinutes = this.timeMinutes === 0 ? 59 : this.timeMinutes - 1;\r\n }\r\n } else if (unit === 'seconds') {\r\n if (direction === 'up') {\r\n this.timeSeconds = this.timeSeconds === 59 ? 0 : this.timeSeconds + 1;\r\n } else {\r\n this.timeSeconds = this.timeSeconds === 0 ? 59 : this.timeSeconds - 1;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @description Toggle AM/PM\r\n */\r\n toggleTimeFormat(): void {\r\n this.timeFormat = this.timeFormat === 'AM' ? 'PM' : 'AM';\r\n }\r\n\r\n /**\r\n * @description Apply selected time\r\n */\r\n applyTime(): void {\r\n // Convert to 24-hour format\r\n let hours = this.timeHours;\r\n if (this.timeFormat === 'PM' && hours !== 12) {\r\n hours += 12;\r\n } else if (this.timeFormat === 'AM' && hours === 12) {\r\n hours = 0;\r\n }\r\n\r\n // Format time as HH:mm:ss\r\n const timeString = `${hours.toString().padStart(2, '0')}:${this.timeMinutes.toString().padStart(2, '0')}:${this.timeSeconds.toString().padStart(2, '0')}`;\r\n \r\n this.ngModel = timeString;\r\n this.ngModelChange.emit(timeString);\r\n this.onChange(timeString);\r\n \r\n // Mark as touched and validate\r\n this.isTouched = true;\r\n this.onTouched();\r\n this.isControlValid(timeString);\r\n \r\n this.closeTimePicker();\r\n }\r\n\r\n /**\r\n * @description Get time display value for the input field\r\n */\r\n getTimeDisplayValue(): string {\r\n if (!this.ngModel) return '';\r\n \r\n const timeString = this.ngModel.toString();\r\n const timeParts = timeString.split(':');\r\n \r\n if (timeParts.length >= 2) {\r\n let hours = parseInt(timeParts[0]);\r\n const minutes = parseInt(timeParts[1]);\r\n const seconds = timeParts[2] ? parseInt(timeParts[2]) : 0;\r\n \r\n const format = hours >= 12 ? 'PM' : 'AM';\r\n hours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\r\n \r\n return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')} ${format}`;\r\n }\r\n \r\n return timeString;\r\n }\r\n\r\n // ==================== DATETIME PICKER METHODS ====================\r\n\r\n /**\r\n * @description Initialize datetime picker\r\n */\r\n initializeDateTimePicker(): void {\r\n if (this.ngModel) {\r\n // Parse existing datetime value\r\n const dateTimeString = this.ngModel.toString();\r\n const dateTime = new Date(dateTimeString);\r\n \r\n if (!isNaN(dateTime.getTime())) {\r\n // Initialize date picker values\r\n this.selectedDate = dateTime;\r\n this.currentMonth = dateTime.getMonth();\r\n this.currentYear = dateTime.getFullYear();\r\n this.generateCalendar();\r\n \r\n // Initialize time picker values\r\n let hours = dateTime.getHours();\r\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\r\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\r\n this.timeMinutes = dateTime.getMinutes();\r\n this.timeSeconds = dateTime.getSeconds();\r\n }\r\n } else {\r\n // Default to current date and time\r\n const now = new Date();\r\n this.selectedDate = now;\r\n this.currentMonth = now.getMonth();\r\n this.currentYear = now.getFullYear();\r\n this.generateCalendar();\r\n \r\n let hours = now.getHours();\r\n this.timeFormat = hours >= 12 ? 'PM' : 'AM';\r\n this.timeHours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\r\n this.timeMinutes = now.getMinutes();\r\n this.timeSeconds = now.getSeconds();\r\n }\r\n }\r\n\r\n /**\r\n * @description Create datetime picker using portal service\r\n */\r\n private createDateTimePickerUsingPortal(): void {\r\n const inputElement = document.getElementById(this.id || this.idRandom);\r\n if (!inputElement) return;\r\n\r\n // Use combined datetime picker template (shows date and time together)\r\n const portalConfig = {\r\n template: this.dateTimePickerTemplate,\r\n context: { $implicit: this },\r\n triggerElement: inputElement,\r\n viewContainerRef: this.viewContainerRef,\r\n className: 'cide-datetime-picker-portal',\r\n position: 'bottom' as 'bottom',\r\n align: 'left' as 'left',\r\n offset: { x: 0, y: 8 },\r\n closeOnOutsideClick: true,\r\n closeOnEscape: true\r\n };\r\n\r\n this.portalService.createTemplatePortal(this.dateTimePickerPortalId, portalConfig);\r\n\r\n this.portalService.registerCloseCallback(this.dateTimePickerPortalId, () => {\r\n this.closeDateTimePicker();\r\n });\r\n\r\n inputElement.setAttribute('data-portal-trigger', this.dateTimePickerPortalId);\r\n }\r\n\r\n /**\r\n * @description Close datetime picker\r\n */\r\n closeDateTimePicker(): void {\r\n this.showDateTimePicker = false;\r\n this.dateTimeStep = 'date';\r\n this.showMonthYearSelector = false;\r\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\r\n }\r\n\r\n /**\r\n * @description Select date in datetime picker (just updates the selected date, time stays visible)\r\n */\r\n selectDateTimeDate(dayInfo: { day: number, isCurrentMonth: boolean, isSelected: boolean, isToday: boolean, date: Date }): void {\r\n if (!dayInfo.isCurrentMonth) return;\r\n\r\n // Just update the selected date - time picker remains visible on the right\r\n this.selectedDate = dayInfo.date;\r\n \r\n // Regenerate calendar to update selection\r\n this.generateCalendar();\r\n }\r\n\r\n /**\r\n * @description Apply datetime (combines date and time)\r\n */\r\n applyDateTime(): void {\r\n if (!this.selectedDate) return;\r\n\r\n // Convert time to 24-hour format\r\n let hours = this.timeHours;\r\n if (this.timeFormat === 'PM' && hours !== 12) {\r\n hours += 12;\r\n } else if (this.timeFormat === 'AM' && hours === 12) {\r\n hours = 0;\r\n }\r\n\r\n // Combine date and time\r\n const dateTime = new Date(this.selectedDate);\r\n dateTime.setHours(hours, this.timeMinutes, this.timeSeconds);\r\n\r\n // Format as datetime-local string (YYYY-MM-DDTHH:mm:ss)\r\n const dateTimeString = dateTime.toISOString().slice(0, 19);\r\n \r\n this.ngModel = dateTimeString;\r\n this.ngModelChange.emit(dateTimeString);\r\n this.onChange(dateTimeString);\r\n \r\n // Mark as touched and validate\r\n this.isTouched = true;\r\n this.onTouched();\r\n this.isControlValid(dateTimeString);\r\n \r\n this.closeDateTimePicker();\r\n }\r\n\r\n /**\r\n * @description Get datetime display value\r\n */\r\n getDateTimeDisplayValue(): string {\r\n if (!this.ngModel) return '';\r\n \r\n const dateTime = new Date(this.ngModel.toString());\r\n if (isNaN(dateTime.getTime())) return this.ngModel.toString();\r\n \r\n // Format: MMM DD, YYYY HH:mm AM/PM\r\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n const month = monthNames[dateTime.getMonth()];\r\n const day = dateTime.getDate();\r\n const year = dateTime.getFullYear();\r\n \r\n let hours = dateTime.getHours();\r\n const minutes = dateTime.getMinutes();\r\n const format = hours >= 12 ? 'PM' : 'AM';\r\n hours = hours === 0 ? 12 : (hours > 12 ? hours - 12 : hours);\r\n \r\n return `${month} ${day}, ${year} ${hours}:${minutes.toString().padStart(2, '0')} ${format}`;\r\n }\r\n\r\n /**\r\n * @description Back to date selection in datetime picker\r\n */\r\n backToDateSelection(): void {\r\n this.dateTimeStep = 'date';\r\n \r\n // Recreate portal with date picker template\r\n this.portalService.destroyPortal(this.dateTimePickerPortalId);\r\n this.createDateTimePickerUsingPortal();\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 === 'datetime-local' || 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\">\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 <!-- 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 || idRandom\" [disabled]=\"disabled\"\r\n [ngClass]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIconInternal,\r\n 'tw-pr-1': !trailingIconInternal,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n 'tw-h-7': size === 'sm',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n }\"\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 <!-- Time Input Wrapper -->\r\n @if (isTimeType()) {\r\n <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\r\n <!-- Time Input (read-only to prevent manual input) -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id || idRandom\" [disabled]=\"disabled\"\r\n [ngClass]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIconInternal,\r\n 'tw-pr-1': !trailingIconInternal,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n 'tw-h-7': size === 'sm',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n }\"\r\n [value]=\"getTimeDisplayValue()\" 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 time -->\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 <!-- Time picker is now rendered as a portal appended to body -->\r\n </div>\r\n }\r\n\r\n <!-- DateTime Local Input -->\r\n @if (type === 'datetime-local') {\r\n <div class=\"cide-input-date-wrapper\" [ngClass]=\"{'cide-input-date-has-value': ngModel}\">\r\n <!-- DateTime Input (read-only to prevent manual input) -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id || idRandom\" [disabled]=\"disabled\"\r\n [ngClass]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIconInternal,\r\n 'tw-pr-1': !trailingIconInternal,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n 'tw-h-7': size === 'sm',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n }\"\r\n [value]=\"getDateTimeDisplayValue()\" 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 datetime -->\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 <!-- DateTime picker is now rendered as a portal appended to body -->\r\n </div>\r\n }\r\n\r\n <!-- Regular Input (non-date, non-time, non-datetime-local, non-url) -->\r\n @if (type !== 'date' && !isTimeType() && type !== 'datetime-local' && type !== 'url') {\r\n <input [placeholder]=\"placeholder\" [id]=\"id\" [disabled]=\"disabled\"\r\n [ngClass]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIconInternal,\r\n 'tw-pr-1': !trailingIconInternal,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n 'tw-h-7': size === 'sm',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n }\"\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\" [disabled]=\"disabled\"\r\n [ngClass]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIconInternal,\r\n 'tw-pr-1': !trailingIconInternal,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n 'tw-h-7': size === 'sm',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n }\"\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\" [disabled]=\"disabled\"\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)=\"showDateTimePicker ? selectDateTimeDate(dayInfo) : 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-3 tw-pt-2 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-xs tw-font-medium tw-text-gray-600 hover:tw-bg-gray-100 tw-rounded 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-xs tw-font-medium tw-bg-blue-600 tw-text-white hover:tw-bg-blue-700 tw-rounded tw-transition-colors\"\r\n (click)=\"closeDatePicker()\">\r\n Done\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Time Picker Template -->\r\n<ng-template #timePickerTemplate>\r\n <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4 tw-w-72\">\r\n <!-- Time Picker Header -->\r\n <div class=\"tw-text-center tw-mb-3\">\r\n <h3 class=\"tw-text-base tw-font-semibold tw-text-gray-800 tw-m-0\">Time</h3>\r\n </div>\r\n\r\n <!-- Time Spinners Container -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-3 tw-mb-4\">\r\n <!-- Hours -->\r\n <div class=\"tw-flex tw-flex-col tw-items-center\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('hours', 'up')\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">expand_less</span>\r\n </button>\r\n <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-12 tw-text-center\">\r\n {{ timeHours }}\r\n </div>\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('hours', 'down')\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">expand_more</span>\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">hour</span>\r\n </div>\r\n\r\n <!-- Colon Separator -->\r\n <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-mb-4\">:</div>\r\n\r\n <!-- Minutes -->\r\n <div class=\"tw-flex tw-flex-col tw-items-center\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('minutes', 'up')\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">expand_less</span>\r\n </button>\r\n <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-12 tw-text-center\">\r\n {{ timeMinutes.toString().padStart(2, '0') }}\r\n </div>\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('minutes', 'down')\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">expand_more</span>\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">min</span>\r\n </div>\r\n\r\n <!-- Colon Separator -->\r\n <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-mb-4\">:</div>\r\n\r\n <!-- Seconds -->\r\n <div class=\"tw-flex tw-flex-col tw-items-center\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('seconds', 'up')\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">expand_less</span>\r\n </button>\r\n <div class=\"tw-text-2xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-12 tw-text-center\">\r\n {{ timeSeconds.toString().padStart(2, '0') }}\r\n </div>\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('seconds', 'down')\">\r\n <span class=\"material-symbols-outlined tw-text-lg\">expand_more</span>\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-2\">sec</span>\r\n </div>\r\n </div>\r\n\r\n <!-- AM/PM Toggle -->\r\n <div class=\"tw-flex tw-justify-center tw-mb-3\">\r\n <div class=\"tw-inline-flex tw-rounded-md tw-bg-gray-100 tw-p-0.5\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-px-4 tw-py-1.5 tw-text-sm tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\r\n [class.tw-bg-white]=\"timeFormat === 'AM'\"\r\n [class.tw-text-gray-800]=\"timeFormat === 'AM'\"\r\n [class.tw-shadow]=\"timeFormat === 'AM'\"\r\n [class.tw-text-gray-600]=\"timeFormat !== 'AM'\"\r\n (click)=\"timeFormat = 'AM'\">\r\n AM\r\n </button>\r\n <button \r\n type=\"button\"\r\n class=\"tw-px-4 tw-py-1.5 tw-text-sm tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\r\n [class.tw-bg-white]=\"timeFormat === 'PM'\"\r\n [class.tw-text-gray-800]=\"timeFormat === 'PM'\"\r\n [class.tw-shadow]=\"timeFormat === 'PM'\"\r\n [class.tw-text-gray-600]=\"timeFormat !== 'PM'\"\r\n (click)=\"timeFormat = 'PM'\">\r\n PM\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Current Time Display -->\r\n <div class=\"tw-text-center tw-mb-3\">\r\n <span class=\"tw-text-sm tw-text-gray-600\">\r\n {{ timeHours }}:{{ timeMinutes.toString().padStart(2, '0') }}:{{ timeSeconds.toString().padStart(2, '0') }} {{ timeFormat }}\r\n </span>\r\n </div>\r\n\r\n <!-- Time Picker Footer -->\r\n <div class=\"tw-flex tw-gap-2\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-flex-1 tw-px-3 tw-py-1.5 tw-text-xs tw-font-medium tw-text-gray-700 tw-bg-white tw-border tw-border-gray-300 hover:tw-bg-gray-50 tw-rounded tw-transition-colors\"\r\n (click)=\"showDateTimePicker ? closeDateTimePicker() : closeTimePicker()\">\r\n Cancel\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"tw-flex-1 tw-px-3 tw-py-1.5 tw-text-xs tw-font-medium tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700 tw-rounded tw-transition-colors tw-border-0\"\r\n (click)=\"showDateTimePicker ? applyDateTime() : applyTime()\">\r\n OK\r\n </button>\r\n </div>\r\n\r\n </div>\r\n</ng-template>\r\n\r\n<!-- DateTime Picker Template (Combined Date + Time) -->\r\n<ng-template #dateTimePickerTemplate>\r\n <div class=\"tw-bg-white tw-border tw-border-gray-300 tw-rounded-lg tw-shadow-lg tw-p-4\">\r\n <!-- DateTime 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 <div class=\"tw-grid tw-grid-cols-2 tw-gap-4\">\r\n <!-- Left Side: Calendar -->\r\n <div>\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-2 tw-py-1.5 tw-text-xs 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-xs 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-1\">\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-7 tw-h-7 tw-text-xs 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)=\"selectDateTimeDate(dayInfo)\">\r\n {{ dayInfo.day }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Right Side: Time Picker -->\r\n <div class=\"tw-border-l tw-border-gray-200 tw-pl-4\">\r\n <div class=\"tw-text-center tw-mb-2\">\r\n <h4 class=\"tw-text-sm tw-font-semibold tw-text-gray-800 tw-m-0\">Time</h4>\r\n </div>\r\n\r\n <!-- Time Spinners -->\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-gap-2 tw-mb-3\">\r\n <!-- Hours -->\r\n <div class=\"tw-flex tw-flex-col tw-items-center\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('hours', 'up')\">\r\n <span class=\"material-symbols-outlined tw-text-base\">expand_less</span>\r\n </button>\r\n <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-10 tw-text-center\">\r\n {{ timeHours }}\r\n </div>\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('hours', 'down')\">\r\n <span class=\"material-symbols-outlined tw-text-base\">expand_more</span>\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">hour</span>\r\n </div>\r\n\r\n <!-- Colon -->\r\n <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-mb-3\">:</div>\r\n\r\n <!-- Minutes -->\r\n <div class=\"tw-flex tw-flex-col tw-items-center\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('minutes', 'up')\">\r\n <span class=\"material-symbols-outlined tw-text-base\">expand_less</span>\r\n </button>\r\n <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-10 tw-text-center\">\r\n {{ timeMinutes.toString().padStart(2, '0') }}\r\n </div>\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('minutes', 'down')\">\r\n <span class=\"material-symbols-outlined tw-text-base\">expand_more</span>\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">min</span>\r\n </div>\r\n\r\n <!-- Colon -->\r\n <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-mb-3\">:</div>\r\n\r\n <!-- Seconds -->\r\n <div class=\"tw-flex tw-flex-col tw-items-center\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('seconds', 'up')\">\r\n <span class=\"material-symbols-outlined tw-text-base\">expand_less</span>\r\n </button>\r\n <div class=\"tw-text-xl tw-font-medium tw-text-gray-800 tw-my-1 tw-w-10 tw-text-center\">\r\n {{ timeSeconds.toString().padStart(2, '0') }}\r\n </div>\r\n <button \r\n type=\"button\"\r\n class=\"tw-w-7 tw-h-7 tw-flex tw-items-center tw-justify-center tw-rounded-full tw-text-gray-500 hover:tw-bg-gray-100 tw-transition-colors tw-border-0 tw-bg-white\"\r\n (click)=\"adjustTime('seconds', 'down')\">\r\n <span class=\"material-symbols-outlined tw-text-base\">expand_more</span>\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">sec</span>\r\n </div>\r\n </div>\r\n\r\n <!-- AM/PM Toggle -->\r\n <div class=\"tw-flex tw-justify-center tw-mb-2\">\r\n <div class=\"tw-inline-flex tw-rounded-md tw-bg-gray-100 tw-p-0.5\">\r\n <button \r\n type=\"button\"\r\n class=\"tw-px-3 tw-py-1 tw-text-xs tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\r\n [class.tw-bg-white]=\"timeFormat === 'AM'\"\r\n [class.tw-text-gray-800]=\"timeFormat === 'AM'\"\r\n [class.tw-shadow-sm]=\"timeFormat === 'AM'\"\r\n [class.tw-text-gray-600]=\"timeFormat !== 'AM'\"\r\n (click)=\"timeFormat = 'AM'\">\r\n AM\r\n </button>\r\n <button \r\n type=\"button\"\r\n class=\"tw-px-3 tw-py-1 tw-text-xs tw-font-medium tw-rounded-md tw-transition-colors tw-border-0\"\r\n [class.tw-bg-white]=\"timeFormat === 'PM'\"\r\n [class.tw-text-gray-800]=\"timeFormat === 'PM'\"\r\n [class.tw-shadow-sm]=\"timeFormat === 'PM'\"\r\n [class.tw-text-gray-600]=\"timeFormat !== 'PM'\"\r\n (click)=\"timeFormat = 'PM'\">\r\n PM\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Current Time Display -->\r\n <div class=\"tw-text-center tw-text-xs tw-text-gray-600\">\r\n {{ timeHours }}:{{ timeMinutes.toString().padStart(2, '0') }}:{{ timeSeconds.toString().padStart(2, '0') }} {{ timeFormat }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- DateTime Picker Footer -->\r\n <div class=\"tw-flex tw-gap-2 tw-mt-3 tw-pt-2 tw-border-t tw-border-gray-200\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-flex-1 tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-text-gray-700 tw-bg-white tw-border tw-border-gray-300 hover:tw-bg-gray-50 tw-rounded tw-transition-colors\"\r\n (click)=\"closeDateTimePicker()\">\r\n Cancel\r\n </button>\r\n <button \r\n type=\"button\" \r\n class=\"tw-flex-1 tw-px-2 tw-py-1 tw-text-xs tw-font-medium tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700 tw-rounded tw-transition-colors tw-border-0\"\r\n (click)=\"applyDateTime()\">\r\n OK\r\n </button>\r\n </div>\r\n </div>\r\n</ng-template>","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef, ContentChildren, QueryList, AfterContentInit, ElementRef, ViewChild, OnDestroy, TemplateRef, ViewContainerRef, inject } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\r\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType, selectSearchType } from 'cloud-ide-lms-model';\r\nimport { PortalService } from '../../services/portal.service';\r\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\r\n\r\nexport interface SelectOption {\r\n value: string | number;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\n// Extended interface for object-based options\r\nexport interface SelectOptionObject {\r\n [key: string]: any;\r\n disabled?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-select-option',\r\n standalone: true,\r\n template: '<ng-content></ng-content>'\r\n})\r\nexport class CideSelectOptionComponent {\r\n @Input() value: string | number = '';\r\n @Input() disabled: boolean = false;\r\n\r\n get label(): string {\r\n return this.elementRef?.nativeElement?.textContent?.trim() || '';\r\n }\r\n\r\n constructor(private elementRef: ElementRef) { }\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-select',\r\n standalone: true,\r\n templateUrl: './select.component.html',\r\n styleUrl: './select.component.scss',\r\n imports: [CommonModule, FormsModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideSelectComponent),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: forwardRef(() => CideSelectComponent),\r\n }\r\n ]\r\n})\r\nexport class CideSelectComponent implements ControlValueAccessor, Validator, OnInit, OnChanges, AfterContentInit, OnDestroy {\r\n @ContentChildren(CideSelectOptionComponent) optionComponents!: QueryList<CideSelectOptionComponent>;\r\n @ViewChild('searchInput', { static: false }) searchInputRef!: ElementRef<HTMLInputElement>;\r\n @Input() label: string = '';\r\n @Input() labelHide: boolean = false;\r\n @Input() placeholder: string = 'Select an option';\r\n @Input() helperText: string = '';\r\n @Input() errorText: string = '';\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() id: string = '';\r\n @Input() ngModel: string | number | string[] = '';\r\n @Input() size: themeSize = 'md';\r\n @Input() fill: elementStyleType = 'outline';\r\n @Input() labelPlacement: labelPlacementType = 'floating';\r\n @Input() labelDir: labelDirType = 'start';\r\n @Input() leadingIcon: string = '';\r\n @Input() trailingIcon: string = '';\r\n @Input() clearInput: boolean = false;\r\n @Input() options: (SelectOption | SelectOptionObject)[] = [];\r\n @Input() multiple: boolean = false;\r\n @Input() searchable: boolean = false;\r\n @Input() showSearchInput: boolean = true;\r\n @Input() loading: boolean = false;\r\n /** \r\n * Key to extract the value from option objects. \r\n * Default: 'value'. Use when options are objects with custom property names.\r\n * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set valueKey = 'id'\r\n */\r\n @Input() valueKey: string = 'value';\r\n\r\n /** \r\n * Key to extract the label from option objects. \r\n * Default: 'label'. Use when options are objects with custom property names.\r\n * Example: if options = [{id: 1, name: 'John'}, {id: 2, name: 'Jane'}], set labelKey = 'name'\r\n */\r\n @Input() labelKey: string = 'label';\r\n\r\n @Output() ngModelChange = new EventEmitter<string | number | string[]>();\r\n // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename\r\n @Output('change') selectionChange = new EventEmitter<any>();\r\n @Output() searchChange = new EventEmitter<selectSearchType>();\r\n\r\n isOpen: boolean = false;\r\n isTouched = false;\r\n isValid = true;\r\n searchTerm: string = '';\r\n filteredOptions: (SelectOption | SelectOptionObject)[] = [];\r\n private searchDebounceTimeout: ReturnType<typeof setTimeout> | null = null;\r\n private searchSubject = new Subject<string>();\r\n private destroy$ = new Subject<void>();\r\n private isUpdatingOptions: boolean = false;\r\n \r\n // Portal-related properties\r\n private portalService = inject(PortalService);\r\n private dropdownPortalId: string = '';\r\n @ViewChild('dropdownTemplate', { static: false }) dropdownTemplate!: TemplateRef<any>;\r\n @ViewChild('dropdownContainer', { read: ViewContainerRef, static: false }) dropdownContainer!: ViewContainerRef;\r\n dropdownPosition: 'bottom' | 'top' = 'bottom';\r\n private isDropdownInteraction = false;\r\n dropdownWidthConstraints: { minWidth: number; maxWidth: number } = { minWidth: 200, maxWidth: 400 };\r\n\r\n // Debug tracking properties\r\n private debugId = Math.random().toString(36).substr(2, 9);\r\n private timeoutIds: ReturnType<typeof setTimeout>[] = [];\r\n private interactionCount = 0;\r\n private maxInteractionCount = 10; // Prevent infinite loops\r\n\r\n constructor(private elementRef: ElementRef) { }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string | number) => { };\r\n onTouched = () => { };\r\n onValidate = () => { };\r\n\r\n ngOnInit(): void {\r\n this.filteredOptions = [...this.options];\r\n this.validateValue(this.ngModel);\r\n console.log(`🔍 SELECT [${this.debugId}] Initialized with ${this.options.length} options`);\r\n window.addEventListener('resize', this.onWindowResize.bind(this));\r\n \r\n // Setup debounced search\r\n this.setupDebouncedSearch();\r\n }\r\n\r\n ngAfterContentInit(): void {\r\n if (this.options.length === 0 && this.optionComponents) {\r\n this.options = this.optionComponents.map(option => ({\r\n value: option.value,\r\n label: option.label,\r\n disabled: option.disabled\r\n }));\r\n this.filteredOptions = [...this.options];\r\n }\r\n console.log(`🔍 SELECT [${this.debugId}] After content init with ${this.options.length} options`);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['ngModel']) {\r\n this.validateValue(this.ngModel);\r\n if (!this.options.find(option => this.getOptionValue(option) === this.ngModel)) {\r\n this.searchChange.emit({\r\n query: \"\",\r\n value: this.ngModel as string | number // emit raw value for external handlers\r\n });\r\n }\r\n }\r\n if (changes['options']) {\r\n this.filterOptions();\r\n console.log('🔍 options changed', this.options, this.isOpen, this.dropdownPortalId);\r\n \r\n // Debug: Check what elements exist in the DOM\r\n if (this.dropdownPortalId) {\r\n console.log('🔍 Current portal ID:', this.dropdownPortalId);\r\n console.log('🔍 All elements with portal ID:', document.querySelectorAll(`[id*=\"${this.dropdownPortalId}\"]`));\r\n console.log('🔍 All input elements:', document.querySelectorAll('input[type=\"text\"]'));\r\n console.log('🔍 All elements with select-dropdown in ID:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\r\n console.log('🔍 All portal elements:', document.querySelectorAll('[id*=\"portal\"]'));\r\n }\r\n \r\n // Update portal context if dropdown is open\r\n if (this.isOpen && this.dropdownPortalId) {\r\n // Always use portal recreation since focus preservation is working\r\n this.updatePortalContext();\r\n }\r\n }\r\n }\r\n\r\n writeValue(value: string | number): void {\r\n this.ngModel = value;\r\n if (this.searchable) {\r\n this.searchChange.emit({\r\n query: \"\",\r\n value: value // emit raw value for external handlers\r\n });\r\n }\r\n this.validateValue(value);\r\n }\r\n\r\n registerOnChange(fn: (value: string | number) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return this.validateValue(control.value);\r\n }\r\n\r\n validateValue(value: string | number | string[]): ValidationErrors | null {\r\n if (this.required) {\r\n const isEmpty = (v: unknown) => {\r\n if (v === null || v === undefined) return true;\r\n if (typeof v === 'string') return v.trim() === '';\r\n if (Array.isArray(v)) return v.length === 0;\r\n return false;\r\n };\r\n if (isEmpty(value)) {\r\n this.isValid = false;\r\n return { required: 'This field is required' };\r\n }\r\n }\r\n this.isValid = true;\r\n return null;\r\n }\r\n\r\n toggleDropdown(): void {\r\n try {\r\n this.logDebug('toggleDropdown called', { disabled: this.disabled, isOpen: this.isOpen });\r\n if (!this.disabled) {\r\n if (this.isOpen) {\r\n this.closeDropdown();\r\n } else {\r\n this.openDropdown();\r\n }\r\n } else {\r\n this.logDebug('Dropdown toggle blocked - component disabled');\r\n }\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] toggleDropdown error:`, error);\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal on error\r\n this.isDropdownInteraction = false;\r\n this.interactionCount = 0;\r\n }\r\n }\r\n\r\n private openDropdown(): void {\r\n this.isOpen = true;\r\n this.logDebug('Opening dropdown with portal');\r\n \r\n // Clean up any orphaned portals before creating new one\r\n this.cleanupOrphanedPortals();\r\n \r\n this.calculateDropdownPosition();\r\n this.focusControl();\r\n this.searchTerm = '';\r\n this.filterOptions();\r\n this.createDropdownPortal();\r\n this.logDebug('Dropdown opened, search term reset');\r\n }\r\n\r\n private closeDropdown(): void {\r\n this.isOpen = false;\r\n this.isDropdownInteraction = false;\r\n this.interactionCount = 0;\r\n this.logDebug('Closing dropdown portal');\r\n this.destroyDropdownPortal();\r\n this.logDebug('Dropdown closed, interaction flags reset');\r\n }\r\n\r\n // Cleanup method to prevent memory leaks\r\n ngOnDestroy(): void {\r\n this.clearTimeouts();\r\n // Clear search debounce timeout\r\n if (this.searchDebounceTimeout) {\r\n clearTimeout(this.searchDebounceTimeout);\r\n this.searchDebounceTimeout = null;\r\n }\r\n \r\n // Complete subjects to prevent memory leaks\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n this.searchSubject.complete();\r\n \r\n // Destroy dropdown portal\r\n this.destroyDropdownPortal();\r\n \r\n // Clean up any remaining portals from this component\r\n console.log('🔍 Cleaning up all portals on destroy');\r\n const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\r\n console.log('🔍 Found portals to clean up:', allPortals.length);\r\n allPortals.forEach(portal => {\r\n const portalId = portal.getAttribute('id');\r\n if (portalId) {\r\n console.log('🔍 Cleaning up portal:', portalId);\r\n this.portalService.destroyPortal(portalId);\r\n }\r\n });\r\n \r\n window.removeEventListener('resize', this.onWindowResize.bind(this));\r\n this.logDebug('Component destroyed, timeouts cleared');\r\n }\r\n\r\n private createDropdownPortal(): void {\r\n try {\r\n const triggerElement = this.elementRef?.nativeElement;\r\n if (!triggerElement || !this.dropdownTemplate || !this.dropdownContainer) {\r\n this.logDebug('Cannot create portal - missing elements');\r\n return;\r\n }\r\n\r\n // Ensure filteredOptions is properly initialized\r\n if (!this.filteredOptions || this.filteredOptions.length === 0) {\r\n this.filterOptions(); // Make sure filteredOptions is populated\r\n }\r\n\r\n // Generate unique portal ID\r\n this.dropdownPortalId = `select-dropdown-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n console.log('🔍 Creating new portal with ID:', this.dropdownPortalId);\r\n\r\n const portalConfig = {\r\n triggerElement,\r\n template: this.dropdownTemplate,\r\n viewContainerRef: this.dropdownContainer,\r\n context: {\r\n options: this.filteredOptions,\r\n isOpen: this.isOpen,\r\n searchTerm: this.searchTerm,\r\n searchable: this.searchable,\r\n multiple: this.multiple,\r\n loading: this.loading,\r\n dropdownPosition: this.dropdownPosition,\r\n onSearchInput: this.onSearchInput.bind(this),\r\n selectOption: this.selectOption.bind(this),\r\n isOptionSelected: this.isOptionSelected.bind(this),\r\n trackByValue: this.trackByValue.bind(this),\r\n getOptionLabel: this.getOptionLabel.bind(this)\r\n },\r\n className: 'cide-select-dropdown-portal',\r\n position: this.dropdownPosition,\r\n align: 'left' as const,\r\n offsetX: 0,\r\n offsetY: 5,\r\n maxHeight: 250,\r\n minWidth: this.dropdownWidthConstraints.minWidth,\r\n maxWidth: this.dropdownWidthConstraints.maxWidth,\r\n closeOnClickOutside: true,\r\n closeOnEscape: true\r\n };\r\n\r\n // Create the template portal\r\n this.portalService.createTemplatePortal(this.dropdownPortalId, portalConfig);\r\n\r\n // Register close callback\r\n this.portalService.registerCloseCallback(this.dropdownPortalId, () => {\r\n this.closeDropdown();\r\n });\r\n\r\n // Set data attribute for click outside detection\r\n triggerElement.setAttribute('data-portal-trigger', this.dropdownPortalId);\r\n\r\n this.logDebug('Dropdown portal created', { \r\n portalId: this.dropdownPortalId, \r\n filteredOptionsCount: this.filteredOptions.length,\r\n allOptionsCount: this.options.length \r\n });\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] createDropdownPortal error:`, error);\r\n }\r\n }\r\n\r\n private destroyDropdownPortal(): void {\r\n try {\r\n if (this.dropdownPortalId) {\r\n console.log('🔍 Destroying portal with ID:', this.dropdownPortalId);\r\n this.portalService.destroyPortal(this.dropdownPortalId);\r\n this.dropdownPortalId = '';\r\n this.logDebug('Dropdown portal destroyed');\r\n console.log('🔍 Portal destroyed, remaining portals:', document.querySelectorAll('[id*=\"select-dropdown\"]'));\r\n }\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] destroyDropdownPortal error:`, error);\r\n }\r\n }\r\n\r\n private updatePortalContext(): void {\r\n try {\r\n if (!this.dropdownPortalId) {\r\n return; // Portal not created yet\r\n }\r\n\r\n // Set flag to prevent blur during update\r\n this.isUpdatingOptions = true;\r\n\r\n // Store reference to search input before destroying portal\r\n console.log('🔍 Looking for search input with portal ID:', this.dropdownPortalId);\r\n const searchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\r\n console.log('🔍 searchInput found:', searchInput);\r\n \r\n // Try alternative selectors if the first one fails\r\n let searchInputAlt = null;\r\n if (!searchInput) {\r\n searchInputAlt = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\r\n console.log('🔍 searchInputAlt found:', searchInputAlt);\r\n }\r\n \r\n const finalSearchInput = searchInput || searchInputAlt;\r\n const wasSearchInputFocused = finalSearchInput && document.activeElement === finalSearchInput;\r\n const searchInputValue = finalSearchInput ? finalSearchInput.value : '';\r\n const cursorPosition = finalSearchInput ? finalSearchInput.selectionStart || 0 : 0;\r\n\r\n // Since the portal service doesn't have an update context method,\r\n // we need to recreate the portal with updated context\r\n this.destroyDropdownPortal();\r\n this.createDropdownPortal();\r\n \r\n // Restore focus and value to search input after recreation\r\n if (wasSearchInputFocused && searchInputValue) {\r\n // Use multiple timing strategies to ensure focus restoration works\r\n const restoreFocus = () => {\r\n let newSearchInput = document.querySelector(`#${this.dropdownPortalId} input[type=\"text\"]`) as HTMLInputElement;\r\n console.log('🔍 newSearchInput', newSearchInput);\r\n \r\n // Try alternative selectors if the first one fails\r\n if (!newSearchInput) {\r\n newSearchInput = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] input[type=\"text\"]`) as HTMLInputElement;\r\n console.log('🔍 newSearchInputAlt', newSearchInput);\r\n }\r\n \r\n if (newSearchInput) {\r\n newSearchInput.value = searchInputValue;\r\n newSearchInput.focus();\r\n // Set cursor position to the original position\r\n newSearchInput.setSelectionRange(cursorPosition, cursorPosition);\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n // Try immediate restoration\r\n if (!restoreFocus()) {\r\n // Try with requestAnimationFrame\r\n requestAnimationFrame(() => {\r\n if (!restoreFocus()) {\r\n // Try with setTimeout as fallback\r\n setTimeout(() => {\r\n restoreFocus();\r\n // Clear the flag after restoration\r\n this.isUpdatingOptions = false;\r\n }, 10);\r\n } else {\r\n // Clear the flag after successful restoration\r\n this.isUpdatingOptions = false;\r\n }\r\n });\r\n } else {\r\n // Clear the flag after successful restoration\r\n this.isUpdatingOptions = false;\r\n }\r\n } else {\r\n // Clear the flag if no focus restoration needed\r\n this.isUpdatingOptions = false;\r\n }\r\n \r\n this.logDebug('Portal context updated', { \r\n filteredOptionsCount: this.filteredOptions.length,\r\n searchTerm: this.searchTerm \r\n });\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] updatePortalContext error:`, error);\r\n this.isUpdatingOptions = false;\r\n }\r\n }\r\n\r\n private updateOptionsInDOM(): boolean {\r\n try {\r\n if (!this.dropdownPortalId) {\r\n return false; // Portal not created yet\r\n }\r\n\r\n // Find the options container in the DOM\r\n console.log('🔍 Looking for options container with portal ID:', this.dropdownPortalId);\r\n let optionsContainer = document.querySelector(`#${this.dropdownPortalId} .tw-py-1`);\r\n console.log('🔍 optionsContainer (.tw-py-1):', optionsContainer);\r\n \r\n // Try alternative selectors if the first one fails\r\n if (!optionsContainer) {\r\n optionsContainer = document.querySelector(`#${this.dropdownPortalId}`);\r\n console.log('🔍 optionsContainer (main):', optionsContainer);\r\n }\r\n \r\n if (!optionsContainer) {\r\n optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"] .tw-py-1`);\r\n console.log('🔍 optionsContainer (alt .tw-py-1):', optionsContainer);\r\n }\r\n \r\n if (!optionsContainer) {\r\n optionsContainer = document.querySelector(`[id*=\"${this.dropdownPortalId}\"]`);\r\n console.log('🔍 optionsContainer (alt main):', optionsContainer);\r\n }\r\n \r\n if (!optionsContainer) {\r\n console.log('🔍 No options container found, returning false');\r\n return false;\r\n }\r\n\r\n console.log('🔍 optionsContainer found, clearing and updating with', this.filteredOptions.length, 'options');\r\n console.log('🔍 Current optionsContainer HTML before clear:', optionsContainer.innerHTML);\r\n\r\n // Find and clear only the option buttons and loading states, not the entire container\r\n const existingOptions = optionsContainer.querySelectorAll('.cide-select-option, .tw-px-3.tw-py-2, .tw-px-3.tw-py-4');\r\n console.log('🔍 Found existing options to remove:', existingOptions.length);\r\n existingOptions.forEach(option => option.remove());\r\n\r\n // Add filtered options directly to DOM\r\n this.filteredOptions.forEach((option) => {\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\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 ${\r\n this.isOptionSelected(option) ? 'tw-bg-blue-50 tw-text-blue-700' : ''\r\n } ${option.disabled ? 'tw-text-gray-400 tw-cursor-not-allowed' : ''}`;\r\n button.textContent = this.getOptionLabel(option);\r\n button.disabled = option.disabled || false;\r\n \r\n // Add event listeners\r\n button.addEventListener('mousedown', () => this.onDropdownMouseDown());\r\n button.addEventListener('click', () => this.selectOption(option));\r\n button.addEventListener('keyup', (e) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n this.selectOption(option);\r\n }\r\n });\r\n\r\n optionsContainer.appendChild(button);\r\n });\r\n\r\n // Add \"No options\" message if no options\r\n if (this.filteredOptions.length === 0) {\r\n const noOptionsDiv = document.createElement('div');\r\n noOptionsDiv.className = 'tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic';\r\n noOptionsDiv.textContent = this.searchable && this.searchTerm ? 'No options found' : 'No options available';\r\n optionsContainer.appendChild(noOptionsDiv);\r\n }\r\n \r\n console.log('🔍 Options added, final optionsContainer HTML:', optionsContainer.innerHTML);\r\n console.log('🔍 Number of child elements in optionsContainer:', optionsContainer.children.length);\r\n \r\n this.logDebug('Options updated directly in DOM', { \r\n filteredOptionsCount: this.filteredOptions.length,\r\n searchTerm: this.searchTerm \r\n });\r\n \r\n return true; // Success\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] updateOptionsInDOM error:`, error);\r\n return false; // Failed\r\n }\r\n }\r\n\r\n private setupDebouncedSearch(): void {\r\n this.searchSubject\r\n .pipe(\r\n debounceTime(300), // 300ms debounce\r\n distinctUntilChanged((prev, curr) => {\r\n // Custom comparison to ensure empty strings are always emitted\r\n return prev === curr;\r\n }),\r\n takeUntil(this.destroy$)\r\n )\r\n .subscribe(searchTerm => {\r\n console.log(`🔍 SELECT [${this.debugId}] Debounced search triggered:`, `\"${searchTerm}\"`);\r\n this.performSearch(searchTerm);\r\n });\r\n }\r\n\r\n private performSearch(searchTerm: string): void {\r\n const queryValue = searchTerm || '';\r\n \r\n console.log(`🔍 SELECT [${this.debugId}] About to emit search:`, `query=\"${queryValue}\"`);\r\n \r\n // Emit search change event for external API calls\r\n // Note: selectSearchType interface requires both query and value\r\n this.searchChange.emit({\r\n query: queryValue,\r\n value: '' // Empty value since this is just a search, not a selection\r\n });\r\n \r\n console.log(`🔍 SELECT [${this.debugId}] Search emitted successfully:`, `query=\"${queryValue}\"`);\r\n }\r\n\r\n private cleanupOrphanedPortals(): void {\r\n try {\r\n console.log('🔍 Cleaning up orphaned portals');\r\n const allPortals = document.querySelectorAll('[id*=\"select-dropdown\"]');\r\n console.log('🔍 Found portals before cleanup:', allPortals.length);\r\n \r\n allPortals.forEach(portal => {\r\n const portalId = portal.getAttribute('id');\r\n if (portalId && portalId !== this.dropdownPortalId) {\r\n console.log('🔍 Cleaning up orphaned portal:', portalId);\r\n this.portalService.destroyPortal(portalId);\r\n }\r\n });\r\n \r\n console.log('🔍 Orphaned portals cleaned up');\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] cleanupOrphanedPortals error:`, error);\r\n }\r\n }\r\n\r\n private onWindowResize(): void {\r\n if (this.isOpen) {\r\n this.calculateDropdownPosition();\r\n }\r\n }\r\n\r\n private calculateDropdownPosition(): void {\r\n try {\r\n const element = this.elementRef?.nativeElement;\r\n if (!element) {\r\n this.dropdownPosition = 'bottom';\r\n console.log('No element found, defaulting to bottom');\r\n return;\r\n }\r\n const rect = element.getBoundingClientRect();\r\n const viewportHeight = window.innerHeight;\r\n const viewportWidth = window.innerWidth;\r\n const dropdownHeight = Math.min(this.options.length * 40 + 100, 250);\r\n const spaceBelow = viewportHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const buffer = 30;\r\n \r\n // Calculate dropdown width constraints\r\n const triggerWidth = rect.width;\r\n const maxDropdownWidth = Math.min(triggerWidth * 2, viewportWidth * 0.8); // Max 2x trigger width or 80% of viewport\r\n const minDropdownWidth = Math.max(triggerWidth, 200); // At least trigger width or 200px\r\n \r\n // Store width constraints for portal creation\r\n this.dropdownWidthConstraints = {\r\n minWidth: minDropdownWidth,\r\n maxWidth: maxDropdownWidth\r\n };\r\n \r\n if (spaceBelow < (dropdownHeight + buffer) && spaceAbove > dropdownHeight) {\r\n this.dropdownPosition = 'top';\r\n } else {\r\n this.dropdownPosition = 'bottom';\r\n }\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] calculateDropdownPosition error:`, error);\r\n this.dropdownPosition = 'bottom';\r\n }\r\n }\r\n\r\n selectOption(option: SelectOption | SelectOptionObject): void {\r\n try {\r\n this.logDebug('selectOption called', { option, disabled: option.disabled, multiple: this.multiple });\r\n if (option.disabled) return;\r\n\r\n const optionValue = this.getOptionValue(option);\r\n\r\n if (this.multiple) {\r\n // Handle both array and CSV formats\r\n let current: string[] = [];\r\n \r\n if (Array.isArray(this.ngModel)) {\r\n // Handle array values (new format)\r\n current = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\r\n } else {\r\n // Handle string values (legacy CSV format)\r\n const currentCsv = this.ngModel as string || '';\r\n current = currentCsv ? currentCsv.split(',').map(v => v.trim()).filter(Boolean) : [];\r\n }\r\n \r\n const idx = current.findIndex(v => v.toString() === optionValue.toString());\r\n\r\n if (idx >= 0) {\r\n current.splice(idx, 1);\r\n } else {\r\n current.push(optionValue.toString());\r\n }\r\n\r\n // For array-based form controls, emit array; for CSV-based, emit CSV\r\n if (Array.isArray(this.ngModel)) {\r\n this.ngModel = current;\r\n this.onChange(current as any);\r\n this.ngModelChange.emit(current);\r\n } else {\r\n const newCsv = current.join(',');\r\n this.ngModel = newCsv;\r\n this.onChange(newCsv);\r\n this.ngModelChange.emit(newCsv);\r\n }\r\n \r\n this.selectionChange.emit(option as SelectOption);\r\n this.validateValue(this.ngModel);\r\n this.isTouched = true;\r\n this.onTouched();\r\n // Do not close dropdown in multi-select mode\r\n } else {\r\n this.ngModel = optionValue;\r\n this.onChange(optionValue);\r\n this.ngModelChange.emit(optionValue);\r\n this.selectionChange.emit(option as SelectOption);\r\n this.validateValue(optionValue);\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal when option is selected\r\n this.isTouched = true;\r\n this.onTouched();\r\n }\r\n this.isDropdownInteraction = false;\r\n this.interactionCount = 0;\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] selectOption error:`, error);\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal on error as well\r\n this.isDropdownInteraction = false;\r\n this.interactionCount = 0;\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n try {\r\n this.logDebug('onBlur called', { isOpen: this.isOpen, isDropdownInteraction: this.isDropdownInteraction });\r\n this.isTouched = true;\r\n this.onTouched();\r\n this.interactionCount++;\r\n if (this.interactionCount > this.maxInteractionCount) {\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal when max interaction count exceeded\r\n this.isDropdownInteraction = false;\r\n this.interactionCount = 0;\r\n return;\r\n }\r\n this.addTimeout(() => {\r\n try {\r\n if (!this.isDropdownInteraction && !this.multiple) {\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal when dropdown interaction ends\r\n this.searchTerm = '';\r\n this.filterOptions();\r\n }\r\n this.interactionCount = 0;\r\n } catch (error) {\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal on error\r\n this.interactionCount = 0;\r\n }\r\n }, 150);\r\n } catch {\r\n this.isOpen = false;\r\n this.closeDropdown(); // Close the portal on error\r\n this.isDropdownInteraction = false;\r\n this.interactionCount = 0;\r\n }\r\n }\r\n\r\n focusControl(): void {\r\n try {\r\n if (this.searchable && this.isOpen) {\r\n this.addTimeout(() => {\r\n try {\r\n if (this.searchInputRef && this.searchInputRef.nativeElement) {\r\n this.searchInputRef.nativeElement.focus();\r\n }\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\r\n }\r\n }, 100);\r\n }\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] focusControl error:`, error);\r\n }\r\n }\r\n\r\n clearSelection(): void {\r\n if (this.multiple && Array.isArray(this.ngModel)) {\r\n this.ngModel = [];\r\n this.onChange([] as any);\r\n this.ngModelChange.emit([]);\r\n this.validateValue([]);\r\n } else {\r\n this.ngModel = '';\r\n this.onChange('');\r\n this.ngModelChange.emit('');\r\n this.validateValue('');\r\n }\r\n }\r\n\r\n getSelectedOptionLabel(): string {\r\n if (this.multiple) {\r\n // Handle both string (CSV) and array values\r\n let values: string[] = [];\r\n \r\n if (Array.isArray(this.ngModel)) {\r\n // Handle array values (new format)\r\n values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\r\n } else {\r\n // Handle string values (legacy CSV format)\r\n const csvValue = this.ngModel as string || '';\r\n if (!csvValue.trim()) return '';\r\n values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\r\n }\r\n \r\n const labels = values\r\n .map(v => this.options.find(o => this.getOptionValue(o).toString() === v))\r\n .map(option => option ? this.getOptionLabel(option) : '')\r\n .filter((l): l is string => typeof l === 'string');\r\n return labels.join(', ');\r\n }\r\n const selectedOption = this.options.find(option => this.getOptionValue(option) === this.ngModel);\r\n return selectedOption ? this.getOptionLabel(selectedOption) : '';\r\n }\r\n\r\n filterOptions(): void {\r\n try {\r\n if (!this.searchable || !this.searchTerm) {\r\n this.filteredOptions = [...this.options];\r\n } else {\r\n this.filteredOptions = this.options.filter(option => this.getOptionLabel(option).toLowerCase().includes(this.searchTerm.toLowerCase()));\r\n }\r\n } catch {\r\n this.filteredOptions = [...this.options];\r\n }\r\n }\r\n\r\n onSearchInput(event: Event): void {\r\n try {\r\n this.searchTerm = (event.target as HTMLInputElement).value;\r\n \r\n console.log(`🔍 SELECT [${this.debugId}] Search input changed:`, `\"${this.searchTerm}\"`);\r\n \r\n // If search term is empty, emit immediately without debounce\r\n if (this.searchTerm === '' || this.searchTerm === null || this.searchTerm === undefined) {\r\n console.log(`🔍 SELECT [${this.debugId}] Empty search - emitting immediately`);\r\n this.performSearch('');\r\n } else {\r\n // For non-empty values, use debounced search\r\n this.searchSubject.next(this.searchTerm);\r\n }\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] onSearchInput error:`, error);\r\n }\r\n }\r\n\r\n onDropdownMouseDown(): void {\r\n this.isDropdownInteraction = true;\r\n }\r\n\r\n onSearchInputBlur(event: Event): void {\r\n // Prevent blur if we're updating options (to maintain focus during API updates)\r\n if (this.isUpdatingOptions) {\r\n event.preventDefault();\r\n (event.target as HTMLInputElement).focus();\r\n }\r\n }\r\n\r\n onDropdownMouseUp(): void {\r\n this.addTimeout(() => {\r\n this.isDropdownInteraction = false;\r\n }, 200);\r\n }\r\n\r\n isOptionSelected(option: SelectOption | SelectOptionObject): boolean {\r\n if (this.multiple) {\r\n // Handle both array and CSV formats\r\n let values: string[] = [];\r\n \r\n if (Array.isArray(this.ngModel)) {\r\n // Handle array values (new format)\r\n values = this.ngModel.map(v => v?.toString() || '').filter(Boolean);\r\n } else {\r\n // Handle string values (legacy CSV format)\r\n const csvValue = this.ngModel as string || '';\r\n if (!csvValue.trim()) return false;\r\n values = csvValue.split(',').map(v => v.trim()).filter(Boolean);\r\n }\r\n \r\n return values.includes(this.getOptionValue(option).toString());\r\n }\r\n return this.getOptionValue(option) === this.ngModel;\r\n }\r\n\r\n // Helper methods to extract values and labels from options\r\n getOptionValue(option: SelectOption | SelectOptionObject): string | number {\r\n if (this.isSelectOption(option)) {\r\n return option.value;\r\n }\r\n return option[this.valueKey] || '';\r\n }\r\n\r\n getOptionLabel(option: SelectOption | SelectOptionObject): string {\r\n if (this.isSelectOption(option)) {\r\n return option.label;\r\n }\r\n return option[this.labelKey] || '';\r\n }\r\n\r\n private isSelectOption(option: SelectOption | SelectOptionObject): option is SelectOption {\r\n return 'value' in option && 'label' in option;\r\n }\r\n\r\n trackByValue(index: number, option: SelectOption | SelectOptionObject): string | number {\r\n return this.getOptionValue(option);\r\n }\r\n\r\n // Debug helpers\r\n private logDebug(message: string, data?: unknown): void {\r\n console.log(`🔍 SELECT [${this.debugId}] ${message}`, data || '');\r\n }\r\n\r\n private clearTimeouts(): void {\r\n this.timeoutIds.forEach(id => { clearTimeout(id); });\r\n this.timeoutIds = [];\r\n }\r\n\r\n private addTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout> {\r\n const timeoutId = setTimeout(() => {\r\n try {\r\n callback();\r\n // remove executed timeout from tracking\r\n this.timeoutIds = this.timeoutIds.filter(id => id !== timeoutId);\r\n } catch (error) {\r\n console.error(`💥 SELECT [${this.debugId}] Timeout callback error:`, error);\r\n }\r\n }, delay);\r\n this.timeoutIds.push(timeoutId);\r\n return timeoutId;\r\n }\r\n} ","<div class=\"cide-select\" [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 @if (label && !labelHide) {\r\n <label [for]=\"id\" class=\"cide-select-label\">\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 <div class=\"cide-element-select-wrapper tw-relative\">\r\n <!-- Leading Icon -->\r\n @if (leadingIcon) {\r\n <span class=\"cide-input-leading-icon-wrapper\">\r\n <span class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n }\r\n\r\n <!-- Select Button -->\r\n <button type=\"button\" [id]=\"id\" [disabled]=\"disabled\" (click)=\"toggleDropdown()\" (blur)=\"onBlur()\" [ngClass]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIcon || clearInput || loading,\r\n 'tw-pr-1': !trailingIcon && !clearInput && !loading,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n 'tw-h-7': size === 'sm',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled,\r\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': true\r\n }\" class=\"cide-select-button\">\r\n\r\n <span class=\"cide-select-value\" [ngClass]=\"{'tw-text-gray-400': !ngModel}\">\r\n {{ ngModel ? getSelectedOptionLabel() : placeholder }}\r\n </span>\r\n </button>\r\n\r\n <!-- Trailing Icon (Dropdown Arrow or Loading Spinner) -->\r\n @if (!clearInput || !ngModel || loading) {\r\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\">\r\n <!-- Loading Spinner -->\r\n @if (loading) {\r\n <span class=\"tw-w-8 tw-h-8 tw-flex tw-items-center tw-justify-center tw-text-gray-500\">\r\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\">\r\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\r\n <path class=\"tw-opacity-75\" fill=\"currentColor\"\r\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\">\r\n </path>\r\n </svg>\r\n </span>\r\n }\r\n <!-- Dropdown Arrow -->\r\n @if (!loading) {\r\n <span\r\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\"\r\n [ngClass]=\"{'tw-rotate-180': isOpen}\">\r\n expand_more\r\n </span>\r\n }\r\n </span>\r\n }\r\n\r\n <!-- Clear Button -->\r\n @if (clearInput && ngModel) {\r\n <button class=\"cide-input-clear\" (click)=\"clearSelection()\" type=\"button\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n }\r\n\r\n\r\n </div>\r\n\r\n <!-- Error/Helper Text -->\r\n @if ((errorText || helperText) && !isValid) {\r\n <span class=\"cide-select-help-error-text\">\r\n {{ errorText || helperText }}\r\n </span>\r\n }\r\n @if (helperText && isValid) {\r\n <span class=\"cide-select-help-error-text\">\r\n {{ helperText }}\r\n </span>\r\n }\r\n\r\n <!-- Portal Container -->\r\n <div #dropdownContainer></div>\r\n</div>\r\n\r\n<!-- Portal Template for Dropdown -->\r\n<ng-template #dropdownTemplate let-context=\"context\">\r\n <div\r\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\">\r\n <!-- Search Input (if searchable and showSearchInput is true) -->\r\n @if (context?.searchable && showSearchInput) {\r\n <div class=\"tw-p-2 tw-border-b tw-border-gray-200\">\r\n <input #searchInput type=\"text\" placeholder=\"Search options...\" [value]=\"context?.searchTerm\"\r\n (input)=\"context?.onSearchInput($event)\" (mousedown)=\"onDropdownMouseDown()\" (focus)=\"onDropdownMouseDown()\"\r\n (click)=\"$event.stopPropagation()\" (blur)=\"onSearchInputBlur($event)\"\r\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\">\r\n </div>\r\n }\r\n\r\n <!-- Options List -->\r\n <div class=\"tw-py-1\">\r\n <!-- Loading State -->\r\n @if (context?.loading) {\r\n <div class=\"tw-px-3 tw-py-4 tw-text-center\">\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-space-x-2\">\r\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\"\r\n viewBox=\"0 0 24 24\">\r\n <circle class=\"tw-opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"4\"></circle>\r\n <path class=\"tw-opacity-75\" fill=\"currentColor\"\r\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\">\r\n </path>\r\n </svg>\r\n <span class=\"tw-text-sm tw-text-gray-500\">Loading...</span>\r\n </div>\r\n </div>\r\n }\r\n <!-- Options -->\r\n @if (!context?.loading) {\r\n @for (option of context?.options; track $index) {\r\n <button type=\"button\" (mousedown)=\"onDropdownMouseDown()\" (click)=\"context?.selectOption(option)\"\r\n (keyup.enter)=\"context?.selectOption(option)\" (keyup.space)=\"context?.selectOption(option)\"\r\n [disabled]=\"option.disabled\" [ngClass]=\"{\r\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,\r\n 'tw-bg-blue-50 tw-text-blue-700': context?.isOptionSelected(option),\r\n 'tw-text-gray-400 tw-cursor-not-allowed': option.disabled\r\n }\" class=\"cide-select-option\">\r\n {{ context?.getOptionLabel(option) }}\r\n </button>\r\n }\r\n }\r\n\r\n <!-- No options message -->\r\n @if (!context?.loading && context?.options.length === 0) {\r\n <div class=\"tw-px-3 tw-py-2 tw-text-sm tw-text-gray-500 tw-italic\">\r\n {{ context?.searchable && context?.searchTerm ? 'No options found' : 'No options available' }}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n</ng-template>","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 { 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_group_id?: string; // Group ID for multiple file uploads\r\n cyfm_ismultiple?: boolean; // Whether the file is multiple\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_group_id?: string; // Group ID for multiple file uploads\r\n cyfm_ismultiple?: boolean; // Whether the file is multiple\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_group_id?: string; // Group ID for multiple file uploads\r\n cyfm_isactive?: boolean;\r\n cyfm_ismultiple?: 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 mongooseObjectIdCreateControllerResponse extends controllerResponse {\r\n data?: {\r\n objectId: string;\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 groupId?: string;\r\n [key: string]: string | number | string[] | File | undefined;\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?: any;\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';\r\nimport { HttpClient, HttpErrorResponse, HttpEventType } from '@angular/common/http';\r\nimport { Observable, BehaviorSubject, throwError, retry, catchError, finalize, map, of } from 'rxjs';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CoreFileManagerInsertUpdatePayload, CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData, ICoreCyfmSave, MFileManager, mongooseObjectIdCreateControllerResponse } from '../interfaces/core-file-manager.interface';\r\nimport { ICoreCyfm, MFileManagerListByGroupIdPayload, fileManagerListByGroupIdControllerResponse, generateStringFromObject } from 'cloud-ide-lms-model';\r\n\r\n\r\n\r\nexport interface FileUploadOptions {\r\n altText?: string;\r\n userId?: string;\r\n permissions?: string[];\r\n tags?: string[];\r\n fileStatus?: string;\r\n groupId?: string; // Group ID for multiple file uploads\r\n isMultiple?: boolean;\r\n retryAttempts?: number;\r\n timeout?: number;\r\n [key: string]: string | number | string[] | undefined | boolean; // Allow additional properties with proper typing\r\n}\r\n\r\nexport interface UploadProgress {\r\n loaded: number;\r\n total: number;\r\n percentage: number;\r\n stage: 'reading' | 'uploading' | 'complete' | 'error';\r\n groupId?: string; // Group ID for filtering uploads by component\r\n}\r\n\r\nexport interface ServiceState {\r\n isUploading: boolean;\r\n uploadQueue: string[];\r\n activeUploads: Map<string, UploadProgress>;\r\n error: string | null;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideEleFileManagerService {\r\n // Angular 20: Modern dependency injection\r\n private readonly http = inject(HttpClient);\r\n private readonly destroyRef = inject(DestroyRef);\r\n \r\n // Angular 20: Signal-based state management\r\n private readonly _baseUrl = signal('/api');\r\n private readonly _objectIdEndpoint = signal('/utility/generateObjectId');\r\n private readonly _userId = signal<string>('');\r\n private readonly _isUploading = signal(false);\r\n private readonly _uploadQueue = signal<string[]>([]);\r\n private readonly _activeUploads = signal<Map<string, UploadProgress>>(new Map());\r\n private readonly _fetchedFiles = signal<Map<string, any[]>>(new Map()); // Group ID -> Files mapping\r\n private readonly _fileIdMapping = signal<Map<string, string>>(new Map()); // Temp ID -> Actual ID mapping\r\n private readonly _error = signal<string | null>(null);\r\n \r\n // Angular 20: Computed values\r\n readonly baseUrl = this._baseUrl.asReadonly();\r\n readonly objectIdEndpoint = this._objectIdEndpoint.asReadonly();\r\n readonly userId = this._userId.asReadonly();\r\n readonly isUploading = this._isUploading.asReadonly();\r\n readonly uploadQueue = this._uploadQueue.asReadonly();\r\n readonly activeUploads = this._activeUploads.asReadonly();\r\n readonly fetchedFiles = this._fetchedFiles.asReadonly();\r\n readonly error = this._error.asReadonly();\r\n \r\n readonly hasActiveUploads = computed(() => this._activeUploads().size > 0);\r\n readonly queueLength = computed(() => this._uploadQueue().length);\r\n readonly totalFetchedFiles = computed(() => {\r\n let total = 0;\r\n this._fetchedFiles().forEach(files => total += files.length);\r\n return total;\r\n });\r\n \r\n // Optimized computed properties for file counting by group\r\n readonly getFileCountByGroup = computed(() => {\r\n const countMap = new Map<string, number>();\r\n \r\n // Count files for each group using the same deduplication logic as getAllFilesForGroup\r\n this._fetchedFiles().forEach((fetchedFiles, groupId) => {\r\n const fileCount = this.getAllFilesForGroup(groupId).length;\r\n countMap.set(groupId, fileCount);\r\n });\r\n \r\n // Also count groups that have active uploads but no fetched files yet\r\n this._activeUploads().forEach((upload, fileId) => {\r\n if (upload.groupId && !countMap.has(upload.groupId)) {\r\n const fileCount = this.getAllFilesForGroup(upload.groupId).length;\r\n countMap.set(upload.groupId, fileCount);\r\n }\r\n });\r\n \r\n return countMap;\r\n });\r\n \r\n readonly serviceState = computed(() => ({\r\n isUploading: this._isUploading(),\r\n uploadQueue: this._uploadQueue(),\r\n activeUploads: this._activeUploads(),\r\n fetchedFiles: this._fetchedFiles(),\r\n error: this._error()\r\n }));\r\n\r\n constructor() {\r\n // Service initialized\r\n }\r\n\r\n /**\r\n * Upload a file with base64 encoding and progress tracking\r\n * Angular 20: Enhanced with better error handling, retry logic, and signal-based state\r\n * @param file The file to upload\r\n * @param options Upload options and additional data\r\n * @param progressCallback Optional callback for progress updates\r\n * @returns Observable with the upload response\r\n */\r\n uploadFile(file: File, options?: FileUploadOptions, progressCallback?: (progress: number) => void): Observable<CoreFileManagerInsertUpdateResponse> {\r\n const fileId = this.generateFileId(file);\r\n const uploadOptions = { retryAttempts: 3, timeout: 30000, ...options };\r\n \r\n // Angular 20: Update service state\r\n this._isUploading.set(true);\r\n this._error.set(null);\r\n this.addToUploadQueue(fileId);\r\n \r\n // Upload started for file: ${file.name}\r\n \r\n return new Observable<CoreFileManagerInsertUpdateResponse>(observer => {\r\n const reader = new FileReader();\r\n \r\n // Angular 20: Enhanced progress tracking with signals\r\n reader.onprogress = (event) => {\r\n if (event.lengthComputable && progressCallback) {\r\n const progress = (event.loaded / event.total) * 50; // File reading is 50% of total progress\r\n progressCallback(progress);\r\n this.updateUploadProgress(fileId, {\r\n loaded: event.loaded,\r\n total: event.total,\r\n percentage: progress,\r\n stage: 'reading'\r\n }, uploadOptions?.groupId);\r\n }\r\n };\r\n \r\n reader.onload = () => {\r\n try {\r\n const base64String = reader.result as string;\r\n const base64Data = base64String.split(',')[1]; // Remove data:image/jpeg;base64, prefix\r\n \r\n // Update progress to 50% (file reading complete)\r\n if (progressCallback) {\r\n progressCallback(50);\r\n }\r\n this.updateUploadProgress(fileId, {\r\n loaded: 50,\r\n total: 100,\r\n percentage: 50,\r\n stage: 'uploading'\r\n }, uploadOptions?.groupId);\r\n \r\n // Create the file data object with proper typing\r\n const fileData:ICoreCyfmSave = {\r\n cyfm_name: file.name,\r\n cyfm_alt_text: uploadOptions?.altText || file.name,\r\n cyfm_path: '', // Will be set by backend\r\n cyfm_size_in_byte: file.size,\r\n cyfm_type: file.type,\r\n cyfm_creation_dt: new Date().toISOString(),\r\n cyfm_id_user: uploadOptions?.userId || this._userId() || '',\r\n cyfm_permissions: [] as [], // Match the interface type\r\n cyfm_tags: uploadOptions?.tags || [],\r\n cyfm_version: 1,\r\n cyfm_file_status_sygmt: uploadOptions?.fileStatus || 'file_manager_file_status_active',\r\n cyfm_group_id: uploadOptions?.groupId, // Group ID for multiple file uploads\r\n cyfm_isactive: true,\r\n cyfm_ismultiple: uploadOptions?.isMultiple || false,\r\n cyfm_file_base64: base64Data,\r\n cyfm_temp_unique_id: fileId\r\n };\r\n\r\n // Create the payload with proper typing\r\n const payload: CoreFileManagerInsertUpdatePayload = new CoreFileManagerInsertUpdatePayload({\r\n core_file_manager_new: [fileData],\r\n core_file_manager_update: [],\r\n core_file_manager_delete: []\r\n });\r\n\r\n // Angular 20: Enhanced HTTP request with retry logic and better error handling\r\n // Use proper API endpoint from cloud-ide-lms-model\r\n this.http.post<CoreFileManagerInsertUpdateResponse>(`${this._baseUrl()}/upload`, payload, {\r\n reportProgress: true,\r\n observe: 'events'\r\n }).pipe(\r\n retry(uploadOptions.retryAttempts || 3),\r\n catchError(this.handleError.bind(this)),\r\n finalize(() => {\r\n this.removeFromUploadQueue(fileId);\r\n // Don't remove from activeUploads - keep completed files visible with their final progress\r\n // The floating uploader will handle cleanup when user closes it\r\n if (this._uploadQueue().length === 0) {\r\n this._isUploading.set(false);\r\n }\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: (event: any) => {\r\n if (event.type === HttpEventType.UploadProgress && progressCallback) {\r\n const uploadProgress = (event.loaded / event.total) * 50; // Upload is remaining 50%\r\n const totalProgress = 50 + uploadProgress; // Total progress (50% file reading + upload progress)\r\n progressCallback(totalProgress);\r\n this.updateUploadProgress(fileId, {\r\n loaded: event.loaded,\r\n total: event.total,\r\n percentage: totalProgress,\r\n stage: 'uploading'\r\n }, uploadOptions?.groupId);\r\n } else if (event.type === HttpEventType.Response) {\r\n if (progressCallback) {\r\n progressCallback(100);\r\n }\r\n this.updateUploadProgress(fileId, {\r\n loaded: 100,\r\n total: 100,\r\n percentage: 100,\r\n stage: 'complete'\r\n }, uploadOptions?.groupId);\r\n // Handle the CoreFileManagerInsertUpdateResponse\r\n const response = event.body as CoreFileManagerInsertUpdateResponse;\r\n \r\n if (response.success) {\r\n // Map temp file ID to actual file ID from response\r\n const fileData = response.data?.core_file_manager?.[0];\r\n const actualFileId = fileData?.cyfm_id;\r\n if (actualFileId && actualFileId !== fileId) {\r\n // Store the mapping\r\n const currentMapping = new Map(this._fileIdMapping());\r\n currentMapping.set(fileId, actualFileId);\r\n this._fileIdMapping.set(currentMapping);\r\n }\r\n \r\n observer.next(response);\r\n observer.complete();\r\n } else {\r\n console.error('❌ [FileManagerService] Upload failed with response:', response);\r\n observer.error(new Error(response.message || 'Upload failed'));\r\n }\r\n }\r\n },\r\n error: (error) => {\r\n console.error('❌ [FileManagerService] Upload failed:', error);\r\n this._error.set(error.message || 'Upload failed');\r\n this.updateUploadProgress(fileId, {\r\n loaded: 0,\r\n total: 100,\r\n percentage: 0,\r\n stage: 'error'\r\n }, uploadOptions?.groupId);\r\n observer.error(error);\r\n }\r\n });\r\n } catch (error) {\r\n console.error('❌ [FileManagerService] File processing error:', error);\r\n this._error.set('Failed to process file');\r\n observer.error(error);\r\n }\r\n };\r\n \r\n reader.onerror = () => {\r\n console.error('❌ [FileManagerService] File reading failed');\r\n this._error.set('Failed to read file');\r\n observer.error(new Error('Failed to read file'));\r\n };\r\n \r\n reader.readAsDataURL(file);\r\n });\r\n }\r\n\r\n /**\r\n * Set the base URL for API calls\r\n * Angular 20: Using signal-based state management\r\n * @param url The base URL for the API\r\n */\r\n setBaseUrl(url: string): void {\r\n console.log('🔍 [FileManagerService] Setting base URL:', url);\r\n this._baseUrl.set(url);\r\n }\r\n\r\n /**\r\n * Set the user ID for file uploads\r\n * Angular 20: Using signal-based state management\r\n * @param userId The user ID to associate with uploaded files\r\n */\r\n setUserId(userId: string): void {\r\n console.log('🔍 [FileManagerService] Setting user ID:', userId);\r\n this._userId.set(userId);\r\n }\r\n\r\n /**\r\n * Set the object ID generation endpoint\r\n * Angular 20: Using signal-based state management\r\n * @param endpoint The endpoint for generating object IDs (e.g., '/utility/generateObjectId')\r\n */\r\n setObjectIdEndpoint(endpoint: string): void {\r\n console.log('🔍 [FileManagerService] Setting object ID endpoint:', endpoint);\r\n this._objectIdEndpoint.set(endpoint);\r\n }\r\n\r\n /**\r\n * Generate Object ID for group uploads\r\n * Calls the backend API to generate a unique ObjectId for grouping multiple files\r\n * Uses the configurable object ID endpoint instead of hardcoded path\r\n * @returns Observable with the generated ObjectId\r\n */\r\n generateObjectId(): Observable<mongooseObjectIdCreateControllerResponse> {\r\n const url = `${this._objectIdEndpoint()}`;\r\n \r\n console.log('🆔 [FileManagerService] Generating ObjectId from:', url);\r\n console.log('🔧 [FileManagerService] Using object ID endpoint:', this._objectIdEndpoint());\r\n \r\n return this.http.get<mongooseObjectIdCreateControllerResponse>(url).pipe(\r\n catchError((error: HttpErrorResponse) => {\r\n console.error('❌ [FileManagerService] Error generating ObjectId:', error);\r\n this._error.set(`Failed to generate ObjectId: ${error.message}`);\r\n return throwError(() => error);\r\n }),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n /**\r\n * Angular 20: Helper methods for state management\r\n */\r\n private generateFileId(file: File): string {\r\n return `${file.name}_${file.size}_${Date.now()}`;\r\n }\r\n\r\n private addToUploadQueue(fileId: string): void {\r\n const currentQueue = this._uploadQueue();\r\n this._uploadQueue.set([...currentQueue, fileId]);\r\n }\r\n\r\n private removeFromUploadQueue(fileId: string): void {\r\n const currentQueue = this._uploadQueue();\r\n this._uploadQueue.set(currentQueue.filter(id => id !== fileId));\r\n }\r\n\r\n private updateUploadProgress(fileId: string, progress: UploadProgress, groupId?: string): void {\r\n const currentUploads = new Map(this._activeUploads());\r\n const progressWithGroupId = { ...progress, groupId };\r\n \r\n currentUploads.set(fileId, progressWithGroupId);\r\n this._activeUploads.set(currentUploads);\r\n }\r\n\r\n private removeActiveUpload(fileId: string): void {\r\n const currentUploads = new Map(this._activeUploads());\r\n currentUploads.delete(fileId);\r\n this._activeUploads.set(currentUploads);\r\n }\r\n\r\n /**\r\n * Angular 20: Enhanced error handling\r\n */\r\n private handleError(error: HttpErrorResponse): Observable<never> {\r\n let errorMessage = 'An unknown error occurred';\r\n \r\n if (error.error instanceof ErrorEvent) {\r\n // Client-side error\r\n errorMessage = `Client Error: ${error.error.message}`;\r\n } else {\r\n // Server-side error\r\n errorMessage = `Server Error: ${error.status} - ${error.message}`;\r\n }\r\n \r\n console.error('❌ [FileManagerService] HTTP Error:', errorMessage);\r\n this._error.set(errorMessage);\r\n \r\n return throwError(() => new Error(errorMessage));\r\n }\r\n\r\n /**\r\n * Get file details by ID\r\n * @param payload The file ID to fetch details for\r\n * @returns Observable with file details\r\n */\r\n getFileDetails(payload: MFileManager): Observable<fileManagerControllerResponse> {\r\n console.log('🔍 [FileManagerService] Fetching file details for ID:', payload.cyfm_id);\r\n \r\n return this.http.post<fileManagerControllerResponse>(`${this._baseUrl()}`, payload).pipe(\r\n retry(2),\r\n catchError(this.handleError.bind(this)),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n /**\r\n * Get files by group ID and store them in service state\r\n * @param groupId The group ID to fetch files for\r\n * @returns Observable with files list\r\n */\r\n getFilesByGroupId(groupId: string): Observable<fileManagerListByGroupIdControllerResponse> {\r\n console.log('🔍 [FileManagerService] Fetching files for group ID:', groupId);\r\n \r\n const payload: MFileManagerListByGroupIdPayload = {\r\n cyfm_group_id: groupId\r\n };\r\n \r\n // Convert payload to string using generateStringFromObject\r\n const queryString = generateStringFromObject(payload);\r\n console.log('📝 [FileManagerService] Query string generated:', queryString);\r\n \r\n return this.http.get<fileManagerListByGroupIdControllerResponse>(`${this._baseUrl()}/group/${queryString}`).pipe(\r\n retry(2),\r\n catchError(this.handleError.bind(this)),\r\n takeUntilDestroyed(this.destroyRef)\r\n );\r\n }\r\n\r\n /**\r\n * Fetch and store files by group ID in service state\r\n * @param groupId The group ID to fetch files for\r\n * @returns Observable that completes when files are stored\r\n */\r\n fetchAndStoreFilesByGroupId(groupId: string): Observable<any[]> {\r\n console.log('📡 [FileManagerService] Fetching and storing files for group:', groupId);\r\n \r\n return this.getFilesByGroupId(groupId).pipe(\r\n map(response => {\r\n console.log('📡 [FileManagerService] API Response for group', groupId, ':', response);\r\n \r\n if (response.success && response.data && response.data.files) {\r\n // Store files in service state\r\n const currentFetchedFiles = new Map(this._fetchedFiles());\r\n currentFetchedFiles.set(groupId, response.data.files);\r\n this._fetchedFiles.set(currentFetchedFiles);\r\n \r\n console.log('📁 [FileManagerService] Stored', response.data.files.length, 'files for group:', groupId);\r\n console.log('📁 [FileManagerService] Files stored:', response.data.files.map(f => ({ id: f._id, name: f.cyfm_name })));\r\n \r\n // Debug: Check if files are actually stored\r\n const storedFiles = this.getFetchedFilesByGroupId(groupId);\r\n console.log('📁 [FileManagerService] Verification - files now in storage:', storedFiles.length);\r\n \r\n return response.data.files;\r\n } else {\r\n console.log('📡 [FileManagerService] No files in response or response not successful:', {\r\n success: response.success,\r\n hasData: !!response.data,\r\n hasFiles: !!(response.data && response.data.files)\r\n });\r\n }\r\n return [];\r\n }),\r\n catchError(error => {\r\n console.error('❌ [FileManagerService] Failed to fetch files for group:', groupId, error);\r\n return of([]);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Get fetched files for a specific group ID\r\n * @param groupId The group ID to get files for\r\n * @returns Array of files for the group\r\n */\r\n getFetchedFilesByGroupId(groupId: string): any[] {\r\n console.log(\"getFetchedFilesByGroupId getFetchedFilesByGroupId\", groupId);\r\n console.log(\"getFetchedFilesByGroupId this._fetchedFiles()\", this._fetchedFiles());\r\n console.log(\"getFetchedFilesByGroupId this._fetchedFiles().get(groupId)\", this._fetchedFiles().get(groupId));\r\n return this._fetchedFiles().get(groupId) || [];\r\n }\r\n\r\n /**\r\n * Signal to trigger floating uploader visibility\r\n */\r\n private readonly _showFloatingUploader = signal(false);\r\n private readonly _triggerGroupId = signal<string | null>(null);\r\n readonly showFloatingUploader = this._showFloatingUploader.asReadonly();\r\n readonly getTriggerGroupId = this._triggerGroupId.asReadonly();\r\n\r\n /**\r\n * Trigger floating uploader to show with group ID\r\n * This is the ONLY way to pass group ID to floating uploader\r\n */\r\n triggerFloatingUploaderShow(groupId?: string): void {\r\n console.log('🎬 [FileManagerService] Triggering floating uploader to show with groupId:', groupId);\r\n this._triggerGroupId.set(groupId || null);\r\n this._showFloatingUploader.set(true);\r\n // Reset after a short delay to allow components to react\r\n setTimeout(() => {\r\n this._showFloatingUploader.set(false);\r\n this._triggerGroupId.set(null);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Get all files (active uploads + fetched files) for a group ID\r\n * @param groupId The group ID to get files for\r\n * @returns Combined array of active and fetched files\r\n */\r\n getAllFilesForGroup(groupId: string): Array<{ fileId: string; fileName: string; stage: string; percentage?: number }> {\r\n const files: Array<{ fileId: string; fileName: string; stage: string; percentage?: number }> = [];\r\n const processedIds = new Set<string>(); // Track all processed IDs (temp and actual)\r\n const fileNames = new Set<string>(); // Track file names to prevent duplicates by name\r\n const fileIdMapping = this._fileIdMapping();\r\n \r\n // Add active uploads for this group\r\n this._activeUploads().forEach((upload, tempFileId) => {\r\n if (upload.groupId === groupId) {\r\n const fileName = this.getFileNameFromId(tempFileId);\r\n const actualFileId = fileIdMapping.get(tempFileId) || tempFileId;\r\n \r\n // Check if we've already processed this file (by actual ID or name)\r\n if (!processedIds.has(actualFileId) && !fileNames.has(fileName)) {\r\n processedIds.add(tempFileId); // Track temp ID\r\n processedIds.add(actualFileId); // Track actual ID\r\n fileNames.add(fileName);\r\n \r\n files.push({\r\n fileId: tempFileId, // Keep temp ID for UI consistency\r\n fileName,\r\n stage: upload.stage,\r\n percentage: upload.percentage\r\n });\r\n }\r\n }\r\n });\r\n \r\n // Add fetched files for this group (only if not already processed)\r\n const fetchedFiles = this.getFetchedFilesByGroupId(groupId);\r\n fetchedFiles.forEach(file => {\r\n const fetchedFileId = file._id;\r\n const fetchedFileName = file.cyfm_name || 'Unknown file';\r\n \r\n // Check if this file was already processed (either as temp or actual ID)\r\n const isAlreadyProcessed = processedIds.has(fetchedFileId) || fileNames.has(fetchedFileName);\r\n \r\n if (!isAlreadyProcessed) {\r\n processedIds.add(fetchedFileId);\r\n fileNames.add(fetchedFileName);\r\n \r\n files.push({\r\n fileId: fetchedFileId,\r\n fileName: fetchedFileName,\r\n stage: 'complete' // Fetched files are already completed\r\n });\r\n }\r\n });\r\n \r\n // Smart deduplication completed for group: ${groupId}\r\n \r\n return files;\r\n }\r\n\r\n /**\r\n * Get file name from file ID (extract from the ID format)\r\n */\r\n private getFileNameFromId(fileId: string): string {\r\n const parts = fileId.split('_');\r\n if (parts.length >= 3) {\r\n return parts.slice(0, -2).join('_');\r\n }\r\n return fileId;\r\n }\r\n\r\n /**\r\n * Angular 20: Service utility methods\r\n */\r\n clearError(): void {\r\n this._error.set(null);\r\n }\r\n\r\n getUploadProgress(fileId: string): UploadProgress | undefined {\r\n return this._activeUploads().get(fileId);\r\n }\r\n\r\n cancelUpload(fileId: string): void {\r\n this.removeFromUploadQueue(fileId);\r\n this.removeActiveUpload(fileId);\r\n console.log('🚫 [FileManagerService] Upload cancelled for:', fileId);\r\n }\r\n\r\n /**\r\n * Clear all completed uploads from active uploads\r\n * Called when the floating uploader is closed\r\n */\r\n clearCompletedUploads(): void {\r\n const currentUploads = new Map(this._activeUploads());\r\n let hasChanges = false;\r\n \r\n currentUploads.forEach((upload, fileId) => {\r\n if (upload.stage === 'complete') {\r\n currentUploads.delete(fileId);\r\n hasChanges = true;\r\n // Cleared completed upload\r\n }\r\n });\r\n \r\n if (hasChanges) {\r\n this._activeUploads.set(currentUploads);\r\n // Cleared all completed uploads\r\n }\r\n }\r\n \r\n /**\r\n * Remove a specific completed upload from active uploads\r\n */\r\n removeCompletedUpload(fileId: string): void {\r\n const currentUploads = new Map(this._activeUploads());\r\n const upload = currentUploads.get(fileId);\r\n \r\n if (upload && upload.stage === 'complete') {\r\n currentUploads.delete(fileId);\r\n this._activeUploads.set(currentUploads);\r\n \r\n // Also clean up the file ID mapping for this temp ID\r\n const currentMapping = new Map(this._fileIdMapping());\r\n if (currentMapping.has(fileId)) {\r\n currentMapping.delete(fileId);\r\n this._fileIdMapping.set(currentMapping);\r\n // Cleaned up mapping\r\n }\r\n \r\n // Removed completed upload\r\n }\r\n }\r\n \r\n /**\r\n * Optimized method to get file count for a specific group\r\n * Uses computed property for better performance\r\n */\r\n getFileCountForGroup(groupId: string): number {\r\n return this.getFileCountByGroup().get(groupId) || 0;\r\n }\r\n \r\n /**\r\n * Optimized method to check if group has active uploads\r\n */\r\n hasActiveUploadsForGroup(groupId: string): boolean {\r\n return Array.from(this._activeUploads().values())\r\n .some(upload => upload.groupId === groupId && upload.stage !== 'complete');\r\n }\r\n\r\n /**\r\n * Angular 20: File validation utility\r\n */\r\n validateFile(file: File, maxSizeMB: number = 10, allowedTypes: string[] = []): { valid: boolean; error?: string } {\r\n // Check file size\r\n const maxSizeBytes = maxSizeMB * 1024 * 1024; // Convert MB to bytes\r\n if (file.size > maxSizeBytes) {\r\n return { valid: false, error: `File size exceeds ${maxSizeMB}MB limit` };\r\n }\r\n\r\n // Check file type\r\n if (allowedTypes.length > 0 && !allowedTypes.includes(file.type)) {\r\n return { valid: false, error: `File type ${file.type} is not allowed` };\r\n }\r\n\r\n return { valid: true };\r\n }\r\n}\r\n","import { Injectable, signal, computed } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport interface NotificationOptions {\r\n message: string;\r\n type?: 'success' | 'error' | 'warning' | 'info';\r\n duration?: number;\r\n showUndo?: boolean;\r\n undoAction?: () => void;\r\n undoText?: string;\r\n icon?: string;\r\n title?: string;\r\n 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 { Injectable, signal, computed, Type, ComponentRef, ViewContainerRef, Injector } from '@angular/core';\r\nimport { FloatingContainerConfig } from './floating-container.component';\r\n// Note: Avoid importing FloatingContainerShortcutsService here to prevent circular dependency\r\n\r\n// Re-export for external use\r\nexport type { FloatingContainerConfig } from './floating-container.component';\r\n\r\nexport interface FloatingComponentConfig {\r\n componentId: string;\r\n componentType?: Type<any>;\r\n inputs?: { [key: string]: any };\r\n outputs?: { [key: string]: (event: any) => void };\r\n}\r\n\r\nexport interface FloatingContainerInstance {\r\n id: string;\r\n config: FloatingContainerConfig;\r\n isVisible: boolean;\r\n isMinimized: boolean;\r\n isMaximized: boolean;\r\n zIndex: number;\r\n // Instance management\r\n instanceId: string; // Unique instance identifier\r\n componentType: string; // Component type for grouping\r\n createdAt: Date;\r\n lastAccessed: Date;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideEleFloatingContainerService {\r\n private containers = signal<Map<string, FloatingContainerInstance>>(new Map());\r\n private nextZIndex = signal(1000);\r\n private instanceCounter = signal(0);\r\n\r\n // Dynamic component management\r\n private componentRegistry = new Map<string, Type<any>>();\r\n private activeComponents = new Map<string, ComponentRef<any>>();\r\n\r\n constructor(\r\n private injector: Injector\r\n ) {\r\n // Keyboard shortcuts are registered by FloatingContainerShortcutsService independently\r\n }\r\n\r\n // Computed properties\r\n visibleContainers = computed(() => \r\n Array.from(this.containers().values()).filter(container => container.isVisible)\r\n );\r\n\r\n minimizedContainers = computed(() => \r\n Array.from(this.containers().values()).filter(container => container.isMinimized)\r\n );\r\n\r\n maximizedContainers = computed(() => \r\n Array.from(this.containers().values()).filter(container => container.isMaximized)\r\n );\r\n\r\n // Container management methods\r\n show(config: FloatingContainerConfig): string {\r\n const containerId = config.id || this.generateId();\r\n const instanceId = this.generateInstanceId(config.componentId || 'default');\r\n // Get the highest z-index and add 1 to bring new container to front\r\n const maxZIndex = this.getMaxZIndex();\r\n const zIndex = maxZIndex + 1;\r\n const now = new Date();\r\n \r\n const container: FloatingContainerInstance = {\r\n id: containerId,\r\n config: { ...config, id: containerId },\r\n isVisible: true,\r\n isMinimized: false,\r\n isMaximized: false,\r\n zIndex,\r\n instanceId,\r\n componentType: config.componentId || 'default',\r\n createdAt: now,\r\n lastAccessed: now\r\n };\r\n\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n newContainers.set(containerId, container);\r\n return newContainers;\r\n });\r\n\r\n this.nextZIndex.update(z => z + 1);\r\n return containerId;\r\n }\r\n\r\n hide(containerId: string): void {\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n const container = newContainers.get(containerId);\r\n if (container) {\r\n container.isVisible = false;\r\n newContainers.set(containerId, container);\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n /**\r\n * Get the maximum z-index among all visible containers\r\n */\r\n private getMaxZIndex(): number {\r\n const containers = this.containers();\r\n let maxZIndex = 1000; // Base z-index\r\n \r\n for (const container of containers.values()) {\r\n if (container.isVisible && container.zIndex > maxZIndex) {\r\n maxZIndex = container.zIndex;\r\n }\r\n }\r\n \r\n return maxZIndex;\r\n }\r\n\r\n /**\r\n * Bring a container to the front (highest z-index)\r\n */\r\n bringToFront(containerId: string): void {\r\n const maxZIndex = this.getMaxZIndex();\r\n const newZIndex = maxZIndex + 1;\r\n const baseZIndex = 1000;\r\n \r\n console.log(`🎯 [FloatingContainer] Bringing container '${containerId}' to front`);\r\n console.log(`🎯 [FloatingContainer] Current max z-index: ${maxZIndex}, new z-index: ${newZIndex}`);\r\n \r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n\r\n // First, decrement all other visible containers by 1 (clamped to base)\r\n for (const [id, c] of newContainers) {\r\n if (c.isVisible && id !== containerId) {\r\n const decremented = Math.max(baseZIndex, (c.zIndex || baseZIndex) - 1);\r\n if (decremented !== c.zIndex) {\r\n c.zIndex = decremented;\r\n c.lastAccessed = new Date();\r\n newContainers.set(id, c);\r\n }\r\n }\r\n }\r\n\r\n // Then set the focused container to max + 1\r\n const container = newContainers.get(containerId);\r\n if (container) {\r\n const oldZIndex = container.zIndex;\r\n container.zIndex = newZIndex;\r\n container.lastAccessed = new Date();\r\n newContainers.set(containerId, container);\r\n console.log(`🎯 [FloatingContainer] Container '${containerId}' z-index updated: ${oldZIndex} → ${newZIndex}`);\r\n } else {\r\n console.warn(`⚠️ [FloatingContainer] Container '${containerId}' not found!`);\r\n }\r\n\r\n return newContainers;\r\n });\r\n }\r\n\r\n\r\n minimize(containerId: string): void {\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n const container = newContainers.get(containerId);\r\n if (container) {\r\n container.isMinimized = !container.isMinimized;\r\n newContainers.set(containerId, container);\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n maximize(containerId: string): void {\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n const container = newContainers.get(containerId);\r\n if (container) {\r\n container.isMaximized = !container.isMaximized;\r\n newContainers.set(containerId, container);\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n\r\n getContainer(containerId: string): FloatingContainerInstance | undefined {\r\n return this.containers().get(containerId);\r\n }\r\n\r\n isVisible(containerId: string): boolean {\r\n const container = this.getContainer(containerId);\r\n return container ? container.isVisible : false;\r\n }\r\n\r\n isMinimized(containerId: string): boolean {\r\n const container = this.getContainer(containerId);\r\n return container ? container.isMinimized : false;\r\n }\r\n\r\n isMaximized(containerId: string): boolean {\r\n const container = this.getContainer(containerId);\r\n return container ? container.isMaximized : false;\r\n }\r\n\r\n hideAll(): void {\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n for (const [id, container] of newContainers) {\r\n container.isVisible = false;\r\n newContainers.set(id, container);\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n minimizeAll(): void {\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n for (const [id, container] of newContainers) {\r\n if (container.isVisible) {\r\n container.isMinimized = true;\r\n newContainers.set(id, container);\r\n }\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n private generateId(): string {\r\n return `floating-container-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private generateInstanceId(componentType: string): string {\r\n const counter = this.instanceCounter() + 1;\r\n this.instanceCounter.update(c => c + 1);\r\n return `${componentType}-instance-${counter}-${Date.now()}`;\r\n }\r\n\r\n // Multiple instance management methods\r\n getInstancesByComponentType(componentType: string): FloatingContainerInstance[] {\r\n return Array.from(this.containers().values())\r\n .filter(container => container.componentType === componentType);\r\n }\r\n\r\n getActiveInstancesByComponentType(componentType: string): FloatingContainerInstance[] {\r\n return Array.from(this.containers().values())\r\n .filter(container => container.componentType === componentType && container.isVisible);\r\n }\r\n\r\n getInstanceCount(componentType: string): number {\r\n return this.getInstancesByComponentType(componentType).length;\r\n }\r\n\r\n getActiveInstanceCount(componentType: string): number {\r\n return this.getActiveInstancesByComponentType(componentType).length;\r\n }\r\n\r\n // Close all instances of a component type\r\n closeAllInstancesOfType(componentType: string): void {\r\n const instances = this.getInstancesByComponentType(componentType);\r\n instances.forEach(instance => {\r\n this.hide(instance.id);\r\n });\r\n }\r\n\r\n // Minimize all instances of a component type\r\n minimizeAllInstancesOfType(componentType: string): void {\r\n const instances = this.getActiveInstancesByComponentType(componentType);\r\n instances.forEach(instance => {\r\n this.minimize(instance.id);\r\n });\r\n }\r\n\r\n // Bring all instances of a component type to front\r\n bringAllInstancesToFront(componentType: string): void {\r\n const instances = this.getActiveInstancesByComponentType(componentType);\r\n instances.forEach(instance => {\r\n this.bringToFront(instance.id);\r\n });\r\n }\r\n\r\n // Get instance by unique instance ID\r\n getInstanceByInstanceId(instanceId: string): FloatingContainerInstance | undefined {\r\n return Array.from(this.containers().values())\r\n .find(container => container.instanceId === instanceId);\r\n }\r\n\r\n // Update last accessed time\r\n updateLastAccessed(containerId: string): void {\r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n const container = newContainers.get(containerId);\r\n if (container) {\r\n container.lastAccessed = new Date();\r\n newContainers.set(containerId, container);\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n // ===== DYNAMIC COMPONENT MANAGEMENT =====\r\n\r\n /**\r\n * Register a component for dynamic loading\r\n */\r\n registerComponent(componentId: string, componentType: Type<any>): void {\r\n this.componentRegistry.set(componentId, componentType);\r\n }\r\n\r\n /**\r\n * Unregister a component\r\n */\r\n unregisterComponent(componentId: string): void {\r\n this.componentRegistry.delete(componentId);\r\n }\r\n\r\n /**\r\n * Get registered component type\r\n */\r\n getComponentType(componentId: string): Type<any> | undefined {\r\n return this.componentRegistry.get(componentId);\r\n }\r\n\r\n /**\r\n * Check if component is registered\r\n */\r\n isComponentRegistered(componentId: string): boolean {\r\n return this.componentRegistry.has(componentId);\r\n }\r\n\r\n /**\r\n * Get registered component IDs\r\n */\r\n getRegisteredComponentIds(): string[] {\r\n return Array.from(this.componentRegistry.keys());\r\n }\r\n\r\n /**\r\n * Create and load component dynamically\r\n */\r\n loadComponent(\r\n componentId: string, \r\n viewContainer: ViewContainerRef, \r\n config?: FloatingComponentConfig\r\n ): ComponentRef<any> | null {\r\n const componentType = this.componentRegistry.get(componentId);\r\n \r\n if (!componentType) {\r\n return null;\r\n }\r\n\r\n try {\r\n viewContainer.clear();\r\n const componentRef = viewContainer.createComponent(componentType, {\r\n injector: this.injector\r\n });\r\n\r\n // Set inputs if provided\r\n if (config?.inputs) {\r\n Object.keys(config.inputs).forEach(key => {\r\n if (componentRef.instance && typeof componentRef.instance === 'object' && key in componentRef.instance) {\r\n (componentRef.instance as any)[key] = config.inputs![key];\r\n }\r\n });\r\n }\r\n\r\n // Set outputs if provided\r\n if (config?.outputs) {\r\n Object.keys(config.outputs).forEach(key => {\r\n if (componentRef.instance && typeof componentRef.instance === 'object' && key in componentRef.instance) {\r\n const output = (componentRef.instance as any)[key];\r\n if (output && typeof output.subscribe === 'function') {\r\n output.subscribe(config.outputs![key]);\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.activeComponents.set(componentId, componentRef);\r\n return componentRef;\r\n } catch (error) {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy component\r\n */\r\n destroyComponent(componentId: string): void {\r\n const componentRef = this.activeComponents.get(componentId);\r\n if (componentRef) {\r\n componentRef.destroy();\r\n this.activeComponents.delete(componentId);\r\n }\r\n }\r\n\r\n /**\r\n * Get active component count\r\n */\r\n getActiveComponentCount(): number {\r\n return this.activeComponents.size;\r\n }\r\n\r\n /**\r\n * Clear all active components\r\n */\r\n clearActiveComponents(): void {\r\n this.activeComponents.forEach(componentRef => componentRef.destroy());\r\n this.activeComponents.clear();\r\n }\r\n\r\n // ===== CONTAINER MANAGER FUNCTIONALITY =====\r\n\r\n /**\r\n * Get config signal for a container\r\n */\r\n getConfigSignal(config: FloatingContainerConfig) {\r\n return signal(config);\r\n }\r\n\r\n /**\r\n * Get minimized signal for a container\r\n */\r\n getMinimizedSignal(containerId: string) {\r\n return computed(() => {\r\n const container = this.getContainer(containerId);\r\n return container?.isMinimized || false;\r\n });\r\n }\r\n\r\n /**\r\n * Get maximized signal for a container\r\n */\r\n getMaximizedSignal(containerId: string) {\r\n return computed(() => {\r\n const container = this.getContainer(containerId);\r\n return container?.isMaximized || false;\r\n });\r\n }\r\n\r\n getZIndexSignal(containerId: string) {\r\n return computed(() => {\r\n const container = this.getContainer(containerId);\r\n const zIndex = container?.zIndex || 1000;\r\n console.log(`🎯 [FloatingContainer] Z-index signal for '${containerId}': ${zIndex}`);\r\n return zIndex;\r\n });\r\n }\r\n\r\n /**\r\n * Set z-index for a specific container\r\n */\r\n setZIndex(containerId: string, zIndex: number): void {\r\n console.log(`🎯 [FloatingContainer] Setting z-index for '${containerId}' to ${zIndex}`);\r\n \r\n this.containers.update(containers => {\r\n const newContainers = new Map(containers);\r\n const container = newContainers.get(containerId);\r\n if (container) {\r\n const oldZIndex = container.zIndex;\r\n container.zIndex = zIndex;\r\n container.lastAccessed = new Date();\r\n newContainers.set(containerId, container);\r\n console.log(`🎯 [FloatingContainer] Container '${containerId}' z-index updated: ${oldZIndex} → ${zIndex}`);\r\n } else {\r\n console.warn(`⚠️ [FloatingContainer] Container '${containerId}' not found for z-index update!`);\r\n }\r\n return newContainers;\r\n });\r\n }\r\n\r\n /**\r\n * Get visible signal for a container\r\n */\r\n getVisibleSignal(containerId: string) {\r\n return computed(() => {\r\n const container = this.getContainer(containerId);\r\n return container?.isVisible || false;\r\n });\r\n }\r\n\r\n /**\r\n * Get component config for dynamic loading\r\n */\r\n getComponentConfig(config: FloatingContainerConfig) {\r\n if (config.componentConfig) {\r\n return {\r\n componentId: config.componentId || config.id,\r\n inputs: config.componentConfig.inputs,\r\n outputs: config.componentConfig.outputs\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Handle container close event\r\n */\r\n onClose(containerId: string): void {\r\n this.hide(containerId);\r\n }\r\n\r\n /**\r\n * Handle container minimize event\r\n */\r\n onMinimize(containerId: string): void {\r\n this.minimize(containerId);\r\n }\r\n\r\n /**\r\n * Handle container maximize event\r\n */\r\n onMaximize(containerId: string): void {\r\n this.maximize(containerId);\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from '../../components/floating-container/floating-container.service';\r\n\r\nexport interface FileUploaderData {\r\n groupId?: string;\r\n userId?: string;\r\n allowedTypes?: string[];\r\n maxFileSize?: number;\r\n uploadPath?: string;\r\n multiple?: boolean;\r\n autoUpload?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideEleFloatingFileUploaderService {\r\n private containerService = inject(CideEleFloatingContainerService);\r\n\r\n constructor() {\r\n // Auto-register file uploader component on service initialization\r\n this.initializeFileUploader();\r\n }\r\n\r\n private async initializeFileUploader(): Promise<void> {\r\n // Check if already registered to avoid duplicate registration\r\n if (this.containerService.isComponentRegistered('file-uploader')) {\r\n console.log('✅ File uploader component already registered');\r\n return;\r\n }\r\n\r\n try {\r\n // Use relative import to avoid circular dependency\r\n const module = await import('./floating-file-uploader.component');\r\n if (module.CideEleFloatingFileUploaderComponent) {\r\n this.containerService.registerComponent('file-uploader', module.CideEleFloatingFileUploaderComponent);\r\n console.log('✅ File uploader component registered successfully');\r\n }\r\n } catch (error) {\r\n console.error('❌ Failed to register file uploader component:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Show file uploader in floating container\r\n */\r\n async show(data?: FileUploaderData): Promise<string> {\r\n console.log('🚀 Showing file uploader...');\r\n console.log('📋 Current registered components:', this.containerService.getRegisteredComponentIds());\r\n\r\n // Ensure component is registered before showing\r\n if (!this.containerService.isComponentRegistered('file-uploader')) {\r\n console.log('📝 File uploader component not registered, registering now...');\r\n await this.initializeFileUploader();\r\n console.log('📋 Components after registration:', this.containerService.getRegisteredComponentIds());\r\n } else {\r\n console.log('✅ File uploader component already registered');\r\n }\r\n\r\n const config: FloatingContainerConfig = {\r\n id: 'file-uploader-main',\r\n title: 'File Uploader',\r\n icon: 'cloud_upload',\r\n width: '500px',\r\n height: '400px',\r\n minWidth: '400px',\r\n minHeight: '300px',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n componentId: 'file-uploader',\r\n componentConfig: data ? {\r\n inputs: { data },\r\n outputs: {}\r\n } : { inputs: ({} as any), outputs: ({} as any) }\r\n };\r\n\r\n const containerId = this.containerService.show(config);\r\n console.log('✅ Container created with ID:', containerId);\r\n return containerId;\r\n }\r\n\r\n /**\r\n * Hide file uploader\r\n */\r\n hide(): void {\r\n this.containerService.hide('file-uploader-main');\r\n }\r\n\r\n /**\r\n * Show file uploader with specific group ID\r\n */\r\n async showWithGroupId(groupId: string, additionalData?: Partial<FileUploaderData>): Promise<string> {\r\n const data: FileUploaderData = {\r\n groupId,\r\n ...additionalData\r\n };\r\n return this.show(data);\r\n }\r\n\r\n /**\r\n * Show file uploader for user with specific settings\r\n */\r\n async showForUser(userId: string, settings?: Partial<FileUploaderData>): Promise<string> {\r\n const data: FileUploaderData = {\r\n userId,\r\n allowedTypes: ['image/*', 'application/pdf', 'text/*'],\r\n maxFileSize: 10485760, // 10MB\r\n multiple: true,\r\n autoUpload: false,\r\n ...settings\r\n };\r\n return this.show(data);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { \r\n Component, \r\n EventEmitter, \r\n Input, \r\n Output, \r\n OnDestroy, \r\n OnInit,\r\n OnChanges,\r\n SimpleChanges,\r\n inject, \r\n signal, \r\n computed, \r\n effect, \r\n DestroyRef, \r\n afterRenderEffect,\r\n afterNextRender,\r\n PendingTasks\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, FormsModule, Validator, NG_VALIDATORS, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { CideIconComponent } from '../icon/icon.component';\r\nimport { CideEleFileManagerService, FileUploadOptions } from '../../services/file-manager.service';\r\nimport { NotificationService } from '../../services/notification.service';\r\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\r\nimport { CideEleFloatingFileUploaderComponent } from '../floating-file-uploader/floating-file-uploader.component';\r\nimport { CideEleFloatingFileUploaderService } from '../floating-file-uploader/floating-file-uploader.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CoreFileManagerInsertUpdateResponse, fileManagerControllerResponse, fileManagerResponseData } from '../../interfaces/core-file-manager.interface';\r\n\r\n/**\r\n * Angular 20: Proper TypeScript interface for file upload data\r\n * This interface defines the structure of additional data that can be sent with file uploads\r\n */\r\nexport interface FileUploadData {\r\n /** Alternative text for the uploaded file (useful for accessibility) */\r\n altText?: string;\r\n /** User ID associated with the upload */\r\n userId?: string;\r\n /** Array of permissions for the uploaded file */\r\n permissions?: string[];\r\n /** Array of tags to categorize the uploaded file */\r\n tags?: string[];\r\n /** Status of the file (e.g., 'active', 'pending', 'archived') */\r\n fileStatus?: \"file_manager_file_status_active\";\r\n /** Group ID for multiple file uploads */\r\n groupId?: string;\r\n /** Allow additional properties with proper typing */\r\n [key: string]: string | number | string[] | undefined;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-file-input',\r\n standalone: true,\r\n templateUrl: './file-input.component.html',\r\n styleUrl: './file-input.component.scss',\r\n imports: [CommonModule, FormsModule, CideIconComponent],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: CideEleFileInputComponent,\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n useExisting: CideEleFileInputComponent,\r\n multi: true\r\n }\r\n ]\r\n})\r\nexport class CideEleFileInputComponent implements ControlValueAccessor, OnDestroy, OnInit, OnChanges, Validator {\r\n private readonly fileManagerService = inject(CideEleFileManagerService);\r\n private readonly notificationService = inject(NotificationService);\r\n private readonly elementService = inject(CideElementsService);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly floatingFileUploaderService = inject(CideEleFloatingFileUploaderService);\r\n // private readonly pendingTasks = inject(PendingTasks); // TODO: Fix PendingTasks API usage\r\n \r\n // Traditional @Input() decorators\r\n @Input() label: string = 'Choose file';\r\n @Input() accept: string = '';\r\n @Input() multiple: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() required: boolean = false;\r\n @Input() helperText: string = '';\r\n @Input() errorText: string = '';\r\n @Input() showPreview: boolean = false;\r\n @Input() previewWidth: string = '200px';\r\n @Input() previewHeight: string = '200px';\r\n @Input() previewBoxMode: boolean = false;\r\n @Input() showFileName: boolean = true;\r\n @Input() placeholderText: string = 'Click to select image';\r\n @Input() placeholderIcon: string = '📷';\r\n @Input() autoUpload: boolean = false;\r\n @Input() uploadData: FileUploadData = {};\r\n @Input() showFloatingUploader: boolean = true;\r\n @Input() floatingUploaderGroupId?: string;\r\n\r\n // Traditional @Output() decorators\r\n @Output() fileChange = new EventEmitter<FileList | null>();\r\n @Output() uploadSuccess = new EventEmitter<string>();\r\n @Output() uploadError = new EventEmitter<string>();\r\n @Output() uploadProgressChange = new EventEmitter<number>();\r\n\r\n // Readable signals created from @Input() decorator values\r\n readonly labelSignal = signal(this.label);\r\n readonly acceptSignal = signal(this.accept);\r\n readonly multipleSignal = signal(this.multiple);\r\n readonly disabledSignal = signal(this.disabled);\r\n readonly requiredSignal = signal(this.required);\r\n readonly helperTextSignal = signal(this.helperText);\r\n readonly errorTextSignal = signal(this.errorText);\r\n readonly showPreviewSignal = signal(this.showPreview);\r\n readonly previewWidthSignal = signal(this.previewWidth);\r\n readonly previewHeightSignal = signal(this.previewHeight);\r\n readonly previewBoxModeSignal = signal(this.previewBoxMode);\r\n readonly showFileNameSignal = signal(this.showFileName);\r\n readonly placeholderTextSignal = signal(this.placeholderText);\r\n readonly placeholderIconSignal = signal(this.placeholderIcon);\r\n readonly autoUploadSignal = signal(this.autoUpload);\r\n readonly uploadDataSignal = signal(this.uploadData);\r\n readonly showFloatingUploaderSignal = signal(this.showFloatingUploader);\r\n readonly floatingUploaderGroupIdSignal = signal(this.floatingUploaderGroupId);\r\n\r\n // Reactive state with signals\r\n readonly id = signal(Math.random().toString(36).substring(2, 10));\r\n readonly isUploading = signal(false);\r\n readonly uploadProgress = signal(0);\r\n readonly uploadStatus = signal<'idle' | 'start' | 'uploading' | 'success' | 'error'>('idle');\r\n readonly files = signal<FileList | null>(null);\r\n readonly fileNames = signal<string[]>([]);\r\n readonly previewUrls = signal<string[]>([]);\r\n readonly uploadNotificationId = signal<string | null>(null);\r\n readonly isDragOver = signal(false);\r\n readonly groupId = signal<string | null>(null); // Group ID for multiple file uploads\r\n readonly isMultipleUploadMode = signal(false); // Flag to track if we're in multiple upload mode\r\n readonly hasEverUploaded = signal(false); // Track if this component has ever uploaded files\r\n \r\n // Computed signals for better relationships\r\n readonly hasFiles = computed(() => this.files() !== null && this.files()!.length > 0);\r\n readonly canUpload = computed(() => this.hasFiles() && !this.isUploading() && !this.disabledSignal());\r\n readonly isInErrorState = computed(() => this.uploadStatus() === 'error');\r\n readonly isInSuccessState = computed(() => this.uploadStatus() === 'success');\r\n \r\n // Optimized computed values - only calculate when needed\r\n readonly totalFileSize = computed(() => {\r\n const files = this.files();\r\n return files ? Array.from(files).reduce((total, file) => total + file.size, 0) : 0;\r\n });\r\n \r\n readonly fileSizeInMB = computed(() => (this.totalFileSize() / 1048576).toFixed(2)); // 1024^2 = 1048576\r\n\r\n // ControlValueAccessor callbacks\r\n private onChange = (value: FileList | string | null) => {};\r\n private onTouched = () => {};\r\n private onValidatorChange = () => {};\r\n\r\n // Computed values\r\n readonly hasImages = computed(() => this.previewUrls().length > 0);\r\n readonly isPreviewBoxMode = computed(() => this.previewBoxModeSignal() && this.showPreviewSignal());\r\n readonly isImagePreviewAvailable = computed(() => this.showPreviewSignal() && this.previewUrls().length > 0);\r\n\r\n constructor() {\r\n // Minimal DOM operations - only when necessary\r\n }\r\n\r\n ngOnInit() {\r\n // Update signals with initial @Input() values\r\n this.labelSignal.set(this.label);\r\n this.acceptSignal.set(this.accept);\r\n this.multipleSignal.set(this.multiple);\r\n this.disabledSignal.set(this.disabled);\r\n this.requiredSignal.set(this.required);\r\n this.helperTextSignal.set(this.helperText);\r\n this.errorTextSignal.set(this.errorText);\r\n this.showPreviewSignal.set(this.showPreview);\r\n this.previewWidthSignal.set(this.previewWidth);\r\n this.previewHeightSignal.set(this.previewHeight);\r\n this.previewBoxModeSignal.set(this.previewBoxMode);\r\n this.showFileNameSignal.set(this.showFileName);\r\n this.placeholderTextSignal.set(this.placeholderText);\r\n this.placeholderIconSignal.set(this.placeholderIcon);\r\n this.autoUploadSignal.set(this.autoUpload);\r\n this.uploadDataSignal.set(this.uploadData);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n // Angular 20: Update signals when @Input() values change\r\n if (changes['label']) this.labelSignal.set(this.label);\r\n if (changes['accept']) this.acceptSignal.set(this.accept);\r\n if (changes['multiple']) this.multipleSignal.set(this.multiple);\r\n if (changes['disabled']) this.disabledSignal.set(this.disabled);\r\n if (changes['required']) this.requiredSignal.set(this.required);\r\n if (changes['helperText']) this.helperTextSignal.set(this.helperText);\r\n if (changes['errorText']) this.errorTextSignal.set(this.errorText);\r\n if (changes['showPreview']) this.showPreviewSignal.set(this.showPreview);\r\n if (changes['previewWidth']) this.previewWidthSignal.set(this.previewWidth);\r\n if (changes['previewHeight']) this.previewHeightSignal.set(this.previewHeight);\r\n if (changes['previewBoxMode']) this.previewBoxModeSignal.set(this.previewBoxMode);\r\n if (changes['showFileName']) this.showFileNameSignal.set(this.showFileName);\r\n if (changes['placeholderText']) this.placeholderTextSignal.set(this.placeholderText);\r\n if (changes['placeholderIcon']) this.placeholderIconSignal.set(this.placeholderIcon);\r\n if (changes['autoUpload']) this.autoUploadSignal.set(this.autoUpload);\r\n if (changes['uploadData']) this.uploadDataSignal.set(this.uploadData);\r\n }\r\n\r\n writeValue(value: FileList | string | null): void {\r\n console.log('📝 [FileInput] writeValue called with:', value);\r\n \r\n if (typeof value === 'string') {\r\n // Check if this is a group ID for multiple files or single file ID\r\n if (this.isMultipleFileMode()) {\r\n // Multiple file mode - value is group ID\r\n console.log('📁 [FileInput] Value is group ID for multiple files:', value);\r\n this.groupId.set(value);\r\n this.loadFilesFromGroupId(value);\r\n } else {\r\n // Single file mode - value is file ID\r\n console.log('📝 [FileInput] Value is single file ID:', value);\r\n this.files.set(null);\r\n this.fileNames.set([]);\r\n this.clearPreviews();\r\n \r\n // Fetch file details to get base64 and set preview\r\n this.loadFileDetailsFromId(value);\r\n }\r\n } else if (value instanceof FileList) {\r\n // Value is a FileList\r\n console.log('📝 [FileInput] Value is FileList:', Array.from(value).map(f => f.name));\r\n this.files.set(value);\r\n this.fileNames.set(Array.from(value).map(f => f.name));\r\n this.generatePreviews();\r\n \r\n // For multiple files, use group ID API to fetch files\r\n if (value.length > 1) {\r\n const groupId = this.groupId();\r\n if (groupId) {\r\n console.log('📁 [FileInput] Multiple files detected, fetching files for group:', groupId);\r\n this.loadFilesFromGroupId(groupId);\r\n }\r\n }\r\n } else {\r\n // Value is null\r\n console.log('📝 [FileInput] Value is null');\r\n this.files.set(null);\r\n this.fileNames.set([]);\r\n this.clearPreviews();\r\n }\r\n }\r\n\r\n registerOnChange(fn: (value: FileList | string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n registerOnValidatorChange(fn: () => void): void {\r\n this.onValidatorChange = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n // Note: With input signals, disabled state is controlled by the parent component\r\n // This method is kept for ControlValueAccessor compatibility but doesn't modify the signal\r\n console.log('🔧 [FileInput] setDisabledState called with:', isDisabled, '(controlled by parent component)');\r\n }\r\n\r\n onFileSelected(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n const selectedFiles = input.files;\r\n \r\n if (selectedFiles) {\r\n this.handleFileSelection(selectedFiles);\r\n }\r\n }\r\n\r\n clearFiles() {\r\n console.log('🗑️ [FileInput] clearFiles called');\r\n this.files.set(null);\r\n this.fileNames.set([]);\r\n this.clearPreviews();\r\n this.uploadStatus.set('idle');\r\n console.log('🔄 [FileInput] Upload status reset to:', this.uploadStatus());\r\n this.onChange(null);\r\n this.fileChange.emit(null);\r\n }\r\n\r\n private uploadFile(file: File) {\r\n console.log('🚨 [FileInput] uploadFile called for:', file.name, '- SINGLE UPLOAD INITIATED');\r\n \r\n // Angular 20: Use PendingTasks for better loading state management\r\n // const uploadTask = this.pendingTasks.add(); // TODO: Fix PendingTasks API usage\r\n // console.log('⏳ [FileInput] Pending task added for upload tracking');\r\n \r\n // Set upload status to 'start' before starting upload\r\n this.uploadStatus.set('start');\r\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\r\n \r\n this.isUploading.set(true);\r\n this.uploadProgress.set(0);\r\n this.uploadProgressChange.emit(0);\r\n console.log('📊 [FileInput] Upload progress initialized to 0%');\r\n \r\n // Make form control invalid during upload - this prevents form submission\r\n this.onChange(null);\r\n console.log('🚫 [FileInput] Form control value set to null to prevent submission');\r\n \r\n // Show initial progress notification with spinner (persistent - no auto-dismiss)\r\n const notificationId = this.notificationService.showProgress('🔄 Preparing file upload...', 0, { duration: 0 });\r\n this.uploadNotificationId.set(notificationId);\r\n console.log('🔔 [FileInput] Progress notification started with ID:', notificationId);\r\n\r\n this.fileManagerService.uploadFile(file, this.uploadDataSignal(), (progress: number) => {\r\n // Real progress callback from file manager service\r\n this.uploadProgress.set(progress);\r\n this.uploadProgressChange.emit(progress);\r\n // Upload progress updated\r\n \r\n // Set upload status to 'uploading' when progress starts\r\n if (this.uploadStatus() === 'start') {\r\n this.uploadStatus.set('uploading');\r\n console.log('🔄 [FileInput] Upload status changed to:', this.uploadStatus());\r\n }\r\n \r\n // Update progress notification with spinner\r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n let progressMessage = '';\r\n if (progress < 10) {\r\n progressMessage = '🔄 Starting upload...';\r\n } else if (progress < 25) {\r\n progressMessage = '🔄 Uploading file...';\r\n } else if (progress < 50) { \r\n progressMessage = '🔄 Upload in progress...';\r\n } else if (progress < 75) {\r\n progressMessage = '🔄 Almost done...';\r\n } else if (progress < 95) {\r\n progressMessage = '🔄 Finishing upload...';\r\n } else {\r\n progressMessage = '🔄 Finalizing...';\r\n }\r\n \r\n this.notificationService.updateProgress(\r\n notificationId,\r\n progress,\r\n progressMessage\r\n );\r\n }\r\n }).pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: (response: CoreFileManagerInsertUpdateResponse) => {\r\n console.log('🎉 [FileInput] Upload SUCCESS - Response received:', response);\r\n \r\n // Angular 20: Complete the pending task\r\n // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\r\n // console.log('✅ [FileInput] Pending task completed for successful upload');\r\n \r\n // Set upload status to 'success'\r\n this.uploadStatus.set('success');\r\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\r\n \r\n // Complete the progress\r\n this.uploadProgress.set(100);\r\n this.uploadProgressChange.emit(100);\r\n console.log('📊 [FileInput] Upload progress completed: 100%');\r\n \r\n // Update progress notification to complete\r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n this.notificationService.remove(notificationId);\r\n console.log('🔔 [FileInput] Progress notification removed');\r\n }\r\n // Success notification removed for cleaner UX\r\n this.uploadNotificationId.set(null);\r\n \r\n // Extract ID from CoreFileManagerInsertUpdateResponse\r\n const uploadedId = response?.data?.core_file_manager?.[0]?.cyfm_id;\r\n if (uploadedId) {\r\n console.log('✅ [FileInput] File uploaded successfully with ID:', uploadedId);\r\n \r\n // Set the uploaded ID as the form control value\r\n this.onChange(uploadedId);\r\n console.log('📝 [FileInput] Form control value set to uploaded ID:', uploadedId);\r\n \r\n // Only emit individual uploadSuccess if not in multiple upload mode\r\n if (!this.isMultipleUploadMode()) {\r\n this.uploadSuccess.emit(uploadedId);\r\n console.log('📝 [FileInput] Upload success event emitted with file ID:', uploadedId);\r\n } else {\r\n console.log('📝 [FileInput] Individual upload success suppressed (multiple upload mode) - file ID:', uploadedId);\r\n }\r\n } else {\r\n console.error('❌ [FileInput] Upload successful but no ID returned:', response);\r\n this.uploadError.emit('Upload successful but no ID returned');\r\n }\r\n this.isUploading.set(false);\r\n console.log('🔄 [FileInput] isUploading set to false');\r\n },\r\n error: (error: any) => {\r\n console.error('💥 [FileInput] Upload FAILED:', error);\r\n \r\n // Angular 20: Complete the pending task even on error\r\n // this.pendingTasks.complete(uploadTask); // TODO: Fix PendingTasks API usage\r\n // console.log('❌ [FileInput] Pending task completed for failed upload');\r\n \r\n // Set upload status to 'error' and remove upload validation error\r\n this.uploadStatus.set('error');\r\n console.log('🔄 [FileInput] Upload status set to:', this.uploadStatus());\r\n \r\n // Remove progress notification and show error\r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n this.notificationService.remove(notificationId);\r\n console.log('🔔 [FileInput] Progress notification removed due to error');\r\n }\r\n this.notificationService.error(`❌ File upload failed: ${error.message || error.error?.message || 'Unknown error occurred'}`, { duration: 0 });\r\n this.uploadNotificationId.set(null);\r\n \r\n this.uploadError.emit(error.message || error.error?.message || 'Upload failed');\r\n this.isUploading.set(false);\r\n this.uploadProgress.set(0);\r\n this.uploadProgressChange.emit(0);\r\n console.log('🔄 [FileInput] Upload state reset - isUploading: false, progress: 0%');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Upload multiple files with group ID support\r\n * FLOW: 1) Generate group ID first, 2) Upload all files with same group ID, 3) Emit group ID on completion\r\n */\r\n private uploadMultipleFiles(files: File[]) {\r\n console.log('🚨 [FileInput] uploadMultipleFiles called for:', files.length, 'files - MULTIPLE UPLOAD INITIATED');\r\n \r\n // Set multiple upload mode flag\r\n this.isMultipleUploadMode.set(true);\r\n \r\n // Set upload status to 'start' before starting upload\r\n this.uploadStatus.set('start');\r\n this.isUploading.set(true);\r\n this.uploadProgress.set(0);\r\n this.uploadProgressChange.emit(0);\r\n \r\n // Make form control invalid during upload\r\n this.onChange(null);\r\n \r\n // Show initial progress notification\r\n const notificationId = this.notificationService.showProgress('🔄 Preparing multiple file upload...', 0, { duration: 0 });\r\n this.uploadNotificationId.set(notificationId);\r\n \r\n // STEP 1: Generate or get group ID BEFORE starting any file uploads\r\n // Check if component already has a group ID or if one is provided in uploadData\r\n const existingComponentGroupId = this.groupId();\r\n const existingUploadDataGroupId = this.uploadDataSignal().groupId;\r\n \r\n if (existingComponentGroupId) {\r\n // Component already has its own group ID - use it\r\n console.log('🆔 [FileInput] Using existing component group ID:', existingComponentGroupId);\r\n \r\n // Open floating uploader with existing group ID\r\n if (this.showFloatingUploaderSignal()) {\r\n console.log('🔄 [FileInput] Opening floating uploader with existing group ID:', existingComponentGroupId);\r\n this.fileManagerService.triggerFloatingUploaderShow(existingComponentGroupId);\r\n }\r\n \r\n this.startMulti(files, existingComponentGroupId);\r\n } else if (existingUploadDataGroupId) {\r\n // Use group ID from uploadData and set it as component's group ID\r\n console.log('🆔 [FileInput] Using group ID from uploadData:', existingUploadDataGroupId);\r\n this.groupId.set(existingUploadDataGroupId);\r\n \r\n // Open floating uploader with group ID from uploadData\r\n if (this.showFloatingUploaderSignal()) {\r\n console.log('🔄 [FileInput] Opening floating uploader with uploadData group ID:', existingUploadDataGroupId);\r\n this.fileManagerService.triggerFloatingUploaderShow(existingUploadDataGroupId);\r\n }\r\n \r\n this.startMulti(files, existingUploadDataGroupId);\r\n } else {\r\n // Generate new group ID just before upload\r\n console.log('🆔 [FileInput] Generating new group ID just before upload...');\r\n this.fileManagerService.generateObjectId().subscribe({\r\n next: (response) => {\r\n const newGroupId = response.data?.objectId as string;\r\n console.log('🆔 [FileInput] Generated new group ID just before upload:', newGroupId);\r\n // Set the group ID to this component so it can track its own files\r\n this.groupId.set(newGroupId);\r\n \r\n // Open floating uploader with newly generated group ID\r\n if (this.showFloatingUploaderSignal()) {\r\n console.log('🔄 [FileInput] Opening floating uploader with new group ID:', newGroupId);\r\n this.fileManagerService.triggerFloatingUploaderShow(newGroupId);\r\n }\r\n \r\n this.startMulti(files, newGroupId);\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FileInput] Failed to generate group ID:', error);\r\n this.uploadError.emit('Failed to generate group ID');\r\n this.isUploading.set(false);\r\n this.uploadStatus.set('error');\r\n \r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n this.notificationService.remove(notificationId);\r\n }\r\n this.notificationService.error('❌ Failed to generate group ID for multiple file upload', { duration: 0 });\r\n this.uploadNotificationId.set(null);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Start uploading multiple files with the provided group ID\r\n * All files will be uploaded with the SAME group ID that was generated before this method\r\n */\r\n private startMulti(files: File[], groupId: string) {\r\n console.log('🚀 [FileInput] STEP 2: Starting upload for', files.length, 'files with group ID:', groupId);\r\n console.log('📋 [FileInput] All files will use the same group ID:', groupId);\r\n \r\n // Mark that this component has ever uploaded files\r\n this.hasEverUploaded.set(true);\r\n \r\n let completedUploads = 0;\r\n let failedUploads = 0;\r\n const totalFiles = files.length;\r\n \r\n // IMPORTANT: All files use the SAME group ID that was generated before starting uploads\r\n const uploadDataWithGroupId:FileUploadOptions = {\r\n ...this.uploadDataSignal(),\r\n groupId: groupId,\r\n isMultiple: true\r\n };\r\n \r\n files.forEach((file, index) => {\r\n const componentId = this.id();\r\n console.log(`📤 [FileInput-${componentId}] Uploading file ${index + 1}/${totalFiles}: \"${file.name}\" with group ID: ${groupId}`);\r\n console.log(`📤 [FileInput-${componentId}] Upload data:`, uploadDataWithGroupId);\r\n \r\n this.fileManagerService.uploadFile(file, uploadDataWithGroupId, (progress: number) => {\r\n // Calculate overall progress\r\n const fileProgress = progress / totalFiles;\r\n const overallProgress = ((completedUploads * 100) + fileProgress) / totalFiles;\r\n this.uploadProgress.set(overallProgress);\r\n this.uploadProgressChange.emit(overallProgress);\r\n \r\n // Update progress notification\r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n const progressMessage = `🔄 Uploading file ${index + 1} of ${totalFiles}...`;\r\n this.notificationService.updateProgress(notificationId, overallProgress, progressMessage);\r\n }\r\n }).pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: (response: CoreFileManagerInsertUpdateResponse) => {\r\n completedUploads++;\r\n console.log(`✅ [FileInput] File ${index + 1}/${totalFiles} uploaded`);\r\n \r\n // Check if all files are completed\r\n if (completedUploads + failedUploads === totalFiles) {\r\n this.handleMultipleUploadComplete(completedUploads, failedUploads, totalFiles, groupId);\r\n }\r\n },\r\n error: (error: any) => {\r\n failedUploads++;\r\n console.error(`❌ [FileInput] File ${index + 1}/${totalFiles} upload failed:`, error);\r\n \r\n // Check if all files are completed\r\n if (completedUploads + failedUploads === totalFiles) {\r\n this.handleMultipleUploadComplete(completedUploads, failedUploads, totalFiles, groupId);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Handle completion of multiple file upload\r\n */\r\n private handleMultipleUploadComplete(completed: number, failed: number, total: number, groupId: string) {\r\n console.log(`📊 [FileInput] Multiple upload complete: ${completed}/${total} successful, ${failed} failed`);\r\n \r\n this.isUploading.set(false);\r\n this.uploadProgress.set(100);\r\n this.uploadProgressChange.emit(100);\r\n \r\n // Remove progress notification\r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n this.notificationService.remove(notificationId);\r\n }\r\n this.uploadNotificationId.set(null);\r\n \r\n if (failed === 0) {\r\n // All files uploaded successfully\r\n this.uploadStatus.set('success');\r\n // Success notification removed for cleaner UX\r\n \r\n // STEP 3: For multiple file upload, emit the group ID (not individual file IDs)\r\n this.onChange(groupId);\r\n this.uploadSuccess.emit(groupId);\r\n console.log('📝 [FileInput] Multiple upload completed with group ID:', groupId);\r\n } else if (completed > 0) {\r\n // Some files uploaded successfully\r\n this.uploadStatus.set('error');\r\n this.notificationService.warning(`⚠️ ${completed}/${total} files uploaded. ${failed} failed.`, { duration: 0 });\r\n this.uploadError.emit(`${failed} out of ${total} files failed to upload`);\r\n } else {\r\n // All files failed\r\n this.uploadStatus.set('error');\r\n this.notificationService.error(`❌ All ${total} files failed to upload.`, { duration: 0 });\r\n this.uploadError.emit('All files failed to upload');\r\n }\r\n \r\n // Reset multiple upload mode flag\r\n this.isMultipleUploadMode.set(false);\r\n }\r\n\r\n private generatePreviews() {\r\n // Clear existing previews\r\n this.clearPreviews();\r\n\r\n if (!this.showPreviewSignal() || !this.files()) {\r\n return;\r\n }\r\n\r\n Array.from(this.files()!).forEach(file => {\r\n if (this.isImageFile(file)) {\r\n const reader = new FileReader();\r\n reader.onload = (e) => {\r\n if (e.target?.result) {\r\n this.previewUrls.update(urls => [...urls, e.target!.result as string]);\r\n }\r\n };\r\n reader.readAsDataURL(file);\r\n }\r\n });\r\n }\r\n\r\n private clearPreviews() {\r\n // Revoke object URLs to prevent memory leaks\r\n this.previewUrls().forEach(url => {\r\n if (url.startsWith('blob:')) {\r\n URL.revokeObjectURL(url);\r\n }\r\n });\r\n this.previewUrls.set([]);\r\n }\r\n\r\n private isImageFile(file: File): boolean {\r\n return file.type.startsWith('image/');\r\n }\r\n\r\n private loadFileDetailsFromId(fileId: string): void {\r\n console.log('🔍 [FileInput] Loading file details for ID:', fileId);\r\n if(!fileId) return;\r\n this.fileManagerService?.getFileDetails({ cyfm_id: fileId })?.pipe(\r\n takeUntilDestroyed(this.destroyRef)\r\n ).subscribe({\r\n next: (fileDetails: fileManagerControllerResponse) => {\r\n console.log('📋 [FileInput] File details received:', fileDetails);\r\n \r\n if (fileDetails?.data?.length) {\r\n const fileData = fileDetails.data[0];\r\n console.log('📁 [FileInput] File data:', fileData);\r\n \r\n // Set file name from the details\r\n if (fileData.cyfm_name) {\r\n this.fileNames.set([fileData.cyfm_name]);\r\n console.log('📝 [FileInput] File name set:', fileData.cyfm_name);\r\n }\r\n \r\n // If it's an image and we have base64 data, set preview\r\n if (this.showPreviewSignal() && fileData.cyfm_file_base64) {\r\n // Check if it's an image file based on file name or type\r\n const isImage = this.isImageFileFromName(fileData.cyfm_name || '') || \r\n this.isImageFileFromType(fileData.cyfm_type || '');\r\n \r\n if (isImage) {\r\n // Add data URL prefix if not already present\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 \r\n this.previewUrls.set([base64Data]);\r\n console.log('🖼️ [FileInput] Preview set from base64 data');\r\n }\r\n }\r\n } else {\r\n console.warn('⚠️ [FileInput] No file data found for ID:', fileId);\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FileInput] Error loading file details:', error);\r\n this.notificationService.error(`Failed to load file details: ${error.message || 'Unknown error'}`, { duration: 0 });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Check if the component is in multiple file mode\r\n */\r\n private isMultipleFileMode(): boolean {\r\n // Check if multiple attribute is set or if we have a group ID\r\n return this.multiple || this.groupId() !== null;\r\n }\r\n\r\n /**\r\n * Load files from group ID using the group API\r\n */\r\n private loadFilesFromGroupId(groupId: string): void {\r\n console.log('🔍 [FileInput] Loading files for group ID:', groupId);\r\n if (!groupId) return;\r\n \r\n this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (files) => {\r\n console.log('📋 [FileInput] Files loaded for group:', files.length);\r\n \r\n // Set file names to show count in input\r\n if (files && files.length > 0) {\r\n const fileNames = files.map(file => file.file_name || file.name || 'Unknown file');\r\n this.fileNames.set(fileNames);\r\n console.log('📝 [FileInput] File names set for display:', fileNames);\r\n } else {\r\n this.fileNames.set([]);\r\n }\r\n \r\n // Files are now stored in service state and will be displayed by floating uploader\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FileInput] Failed to load files for group:', error);\r\n this.fileNames.set([]);\r\n }\r\n });\r\n }\r\n\r\n private isImageFileFromName(fileName: string): boolean {\r\n if (!fileName) return false;\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 private isImageFileFromType(fileType: string): boolean {\r\n if (!fileType) return false;\r\n return fileType.startsWith('image/');\r\n }\r\n\r\n removePreview(index: number) {\r\n const currentFiles = this.files();\r\n const currentUrls = this.previewUrls();\r\n \r\n if (currentFiles && currentFiles.length > index) {\r\n // Handle FileList case - remove file from FileList\r\n const dt = new DataTransfer();\r\n Array.from(currentFiles).forEach((file, i) => {\r\n if (i !== index) {\r\n dt.items.add(file);\r\n }\r\n });\r\n \r\n const newFiles = dt.files;\r\n this.files.set(newFiles);\r\n this.fileNames.set(Array.from(newFiles).map(f => f.name));\r\n \r\n // Remove the preview URL\r\n if (currentUrls[index] && currentUrls[index].startsWith('blob:')) {\r\n URL.revokeObjectURL(currentUrls[index]);\r\n }\r\n this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\r\n \r\n this.onChange(newFiles);\r\n this.fileChange.emit(newFiles);\r\n } else if (currentUrls.length > index) {\r\n // Handle uploaded file ID case - clear the preview and set control value to null\r\n console.log('🗑️ [FileInput] Removing preview for uploaded file ID');\r\n \r\n // Clear preview\r\n this.previewUrls.update(urls => urls.filter((_, i) => i !== index));\r\n this.fileNames.set([]);\r\n \r\n // Set control value to null since we're removing the uploaded file\r\n this.onChange(null);\r\n this.fileChange.emit(null);\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up preview URLs to prevent memory leaks\r\n this.clearPreviews();\r\n \r\n // Clean up any active upload notification\r\n const notificationId = this.uploadNotificationId();\r\n if (notificationId) {\r\n this.notificationService.remove(notificationId);\r\n this.uploadNotificationId.set(null);\r\n }\r\n }\r\n\r\n triggerFileSelect() {\r\n const fileInput = document.getElementById('cide-file-input-' + this.id()) as HTMLInputElement;\r\n if (fileInput && !this.disabledSignal()) {\r\n fileInput.click();\r\n }\r\n }\r\n\r\n /**\r\n * Show floating uploader manually\r\n * This can be called to show the floating uploader even when no files are selected\r\n */\r\n showUploader() {\r\n console.log('👁️ [FileInput] Manually showing floating uploader');\r\n \r\n if (!this.showFloatingUploaderSignal()) {\r\n console.log('⚠️ [FileInput] Floating uploader is disabled');\r\n return;\r\n }\r\n \r\n const groupId = this.groupId();\r\n if (groupId) {\r\n console.log(\"✅ [FileInput] Has existing group ID:\", groupId);\r\n // Fetch files for the group and trigger floating uploader to show\r\n this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (files) => {\r\n console.log('✅ [FileInput] Files fetched for floating uploader:', files.length);\r\n // Trigger the floating uploader to show via service with group ID\r\n this.fileManagerService.triggerFloatingUploaderShow(groupId);\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FileInput] Failed to fetch files for floating uploader:', error);\r\n // Still trigger show even if fetch fails, with group ID\r\n this.fileManagerService.triggerFloatingUploaderShow(groupId);\r\n }\r\n });\r\n } else {\r\n console.log('⚠️ [FileInput] No group ID yet - floating uploader will open when user uploads files');\r\n // No group ID yet - don't open floating uploader now\r\n // It will open automatically when user uploads files and group ID is generated\r\n // This prevents the \"No active files\" issue\r\n }\r\n }\r\n\r\n /**\r\n * Get total upload count from file manager service for this component's group ID\r\n * Uses optimized service method for better performance\r\n * Only counts files for this component's specific group ID\r\n */\r\n getUploadCount(): number {\r\n const groupId = this.groupId();\r\n const componentId = this.id();\r\n \r\n if (!groupId) {\r\n // No group ID yet - component hasn't uploaded anything, so count is 0\r\n return 0;\r\n }\r\n \r\n const count = this.fileManagerService.getFileCountForGroup(groupId);\r\n return count;\r\n }\r\n\r\n /**\r\n * Check if there are active uploads for this component's group ID\r\n * Uses optimized service method for better performance\r\n * Only checks files for this component's specific group ID\r\n */\r\n hasActiveUploads(): boolean {\r\n const groupId = this.groupId();\r\n \r\n if (!groupId) {\r\n // No group ID yet - component hasn't uploaded anything, so no active uploads\r\n return false;\r\n }\r\n \r\n return this.fileManagerService.hasActiveUploadsForGroup(groupId);\r\n }\r\n\r\n /**\r\n * Get count of active (non-completed) uploads for this component's group ID\r\n * Only counts files for this component's specific group ID\r\n */\r\n getActiveUploadCount(): number {\r\n const groupId = this.groupId();\r\n \r\n if (!groupId) {\r\n // No group ID yet - component hasn't uploaded anything, so no active uploads\r\n return 0;\r\n }\r\n \r\n return this.fileManagerService.getAllFilesForGroup(groupId)\r\n .filter(file => file.stage !== 'complete').length;\r\n }\r\n\r\n /**\r\n * Show floating uploader (alias for showUploader for template)\r\n */\r\n async showFloatingUploaderDialog() {\r\n console.log('👁️ [FileInput] Opening floating file uploader via dedicated service');\r\n \r\n if (!this.showFloatingUploaderSignal()) {\r\n console.log('⚠️ [FileInput] Floating uploader is disabled');\r\n return;\r\n }\r\n \r\n const groupId = this.groupId();\r\n if (groupId) {\r\n console.log(\"✅ [FileInput] Has existing group ID:\", groupId);\r\n // Use the dedicated floating file uploader service\r\n try {\r\n await this.floatingFileUploaderService.showWithGroupId(groupId, {\r\n allowedTypes: this.acceptSignal() ? this.acceptSignal().split(',') : undefined,\r\n multiple: this.multipleSignal(),\r\n autoUpload: this.autoUploadSignal(),\r\n userId: this.uploadDataSignal().userId\r\n });\r\n console.log('✅ [FileInput] Floating file uploader opened successfully');\r\n } catch (error) {\r\n console.error('❌ [FileInput] Failed to open floating file uploader:', error);\r\n this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\r\n }\r\n } else {\r\n console.log('⚠️ [FileInput] No group ID yet - generating one and opening uploader');\r\n // Generate a new group ID and open the uploader\r\n this.fileManagerService.generateObjectId().subscribe({\r\n next: async (response) => {\r\n const newGroupId = response.data?.objectId as string;\r\n console.log('🆔 [FileInput] Generated new group ID for uploader:', newGroupId);\r\n this.groupId.set(newGroupId);\r\n // Use the dedicated floating file uploader service\r\n try {\r\n await this.floatingFileUploaderService.showWithGroupId(newGroupId, {\r\n allowedTypes: this.acceptSignal() ? this.acceptSignal().split(',') : undefined,\r\n multiple: this.multipleSignal(),\r\n autoUpload: this.autoUploadSignal(),\r\n userId: this.uploadDataSignal().userId\r\n });\r\n console.log('✅ [FileInput] Floating file uploader opened successfully');\r\n } catch (error) {\r\n console.error('❌ [FileInput] Failed to open floating file uploader:', error);\r\n this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\r\n }\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FileInput] Failed to generate group ID for uploader:', error);\r\n this.notificationService.error('❌ Failed to open file uploader', { duration: 0 });\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Get dynamic classes for drag and drop zone\r\n */\r\n getDragDropZoneClasses(): string {\r\n const classes = [];\r\n \r\n if (this.isDragOver()) {\r\n classes.push('!tw-border-blue-500', '!tw-bg-blue-100', 'dark:!tw-bg-blue-900/30', 'tw-scale-[1.01]');\r\n }\r\n \r\n if (this.disabledSignal()) {\r\n classes.push('tw-opacity-50', 'tw-cursor-not-allowed', '!hover:tw-border-gray-300', '!hover:tw-bg-gray-50', 'dark:!hover:tw-bg-gray-800');\r\n }\r\n \r\n if (this.hasFiles()) {\r\n classes.push('!tw-border-emerald-500', '!tw-bg-emerald-50', 'dark:!tw-bg-emerald-900/20', 'hover:!tw-border-emerald-600', 'hover:!tw-bg-emerald-100', 'dark:hover:!tw-bg-emerald-900/30');\r\n }\r\n \r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get dynamic classes for icon\r\n */\r\n getIconClasses(): string {\r\n const classes = ['tw-text-gray-500', 'dark:tw-text-gray-400'];\r\n \r\n if (this.isDragOver()) {\r\n classes.push('!tw-text-blue-500', 'dark:!tw-text-blue-400');\r\n } else if (this.hasFiles()) {\r\n classes.push('!tw-text-emerald-500', 'dark:!tw-text-emerald-400');\r\n }\r\n \r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get dynamic classes for preview box\r\n */\r\n getPreviewBoxClasses(): string {\r\n const classes = [];\r\n \r\n if (this.isDragOver()) {\r\n classes.push('!tw-border-blue-500', '!tw-bg-blue-100', 'dark:!tw-bg-blue-900/30');\r\n }\r\n \r\n if (this.disabledSignal()) {\r\n classes.push('tw-opacity-50', 'tw-cursor-not-allowed', '!hover:tw-border-gray-300', '!hover:tw-bg-gray-50', 'dark:!hover:tw-bg-gray-800');\r\n }\r\n \r\n if (this.hasImages()) {\r\n classes.push('!tw-border-emerald-500', '!tw-bg-emerald-50', 'dark:!tw-bg-emerald-900/20');\r\n }\r\n \r\n return classes.join(' ');\r\n }\r\n\r\n // Drag and Drop Event Handlers\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!this.disabledSignal()) {\r\n this.isDragOver.set(true);\r\n console.log('🔄 [FileInput] Drag over detected');\r\n }\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n console.log('🔄 [FileInput] Drag leave detected');\r\n }\r\n\r\n onDragEnter(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (!this.disabledSignal()) {\r\n this.isDragOver.set(true);\r\n console.log('🔄 [FileInput] Drag enter detected');\r\n }\r\n }\r\n\r\n onDrop(event: DragEvent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n \r\n if (this.disabledSignal()) {\r\n console.log('⏸️ [FileInput] Drop ignored - component is disabled');\r\n return;\r\n }\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n console.log('📁 [FileInput] Files dropped:', Array.from(files).map(f => f.name));\r\n \r\n // Validate file types if accept is specified\r\n if (this.acceptSignal() && !this.validateFileTypes(files)) {\r\n console.log('❌ [FileInput] Invalid file types dropped');\r\n this.notificationService.error('❌ Invalid file type. Please select files of the correct type.', { duration: 0 });\r\n return;\r\n }\r\n\r\n // Handle single vs multiple files\r\n if (!this.multipleSignal() && files.length > 1) {\r\n console.log('⚠️ [FileInput] Multiple files dropped but multiple is disabled');\r\n this.notificationService.warning('⚠️ Only one file is allowed. Using the first file.', { duration: 0 });\r\n // Create a new FileList with only the first file\r\n const dt = new DataTransfer();\r\n dt.items.add(files[0]);\r\n this.handleFileSelection(dt.files);\r\n } else {\r\n this.handleFileSelection(files);\r\n }\r\n }\r\n }\r\n\r\n private validateFileTypes(files: FileList): boolean {\r\n const acceptTypes = this.acceptSignal().split(',').map(type => type.trim());\r\n if (acceptTypes.length === 0 || acceptTypes[0] === '') return true;\r\n\r\n return Array.from(files).every(file => {\r\n return acceptTypes.some(acceptType => {\r\n if (acceptType.startsWith('.')) {\r\n // Extension-based validation\r\n return file.name.toLowerCase().endsWith(acceptType.toLowerCase());\r\n } else if (acceptType.includes('/')) {\r\n // MIME type validation\r\n return file.type === acceptType || file.type.startsWith(acceptType.replace('*', ''));\r\n }\r\n return false;\r\n });\r\n });\r\n }\r\n\r\n private handleFileSelection(files: FileList) {\r\n console.log('🔥 [FileInput] handleFileSelection called with:', files.length, 'files');\r\n \r\n this.files.set(files);\r\n this.fileNames.set(Array.from(files).map(f => f.name));\r\n this.generatePreviews();\r\n \r\n // Reset upload status when new file is selected\r\n this.uploadStatus.set('idle');\r\n \r\n this.onChange(files);\r\n this.fileChange.emit(files);\r\n this.onTouched();\r\n\r\n // Auto upload if enabled\r\n if (this.autoUploadSignal() && files.length > 0) {\r\n console.log('🔥 [FileInput] Auto upload is enabled, proceeding with upload...');\r\n if (this.multipleSignal()) {\r\n this.uploadMultipleFiles(Array.from(files));\r\n } else {\r\n this.uploadFile(files[0]);\r\n }\r\n } else {\r\n console.log('🔥 [FileInput] Auto upload disabled or no files');\r\n }\r\n }\r\n\r\n isRequired(): boolean {\r\n return this.requiredSignal();\r\n }\r\n\r\n /**\r\n * Angular 20: Utility method to get upload data with proper typing\r\n * @returns Properly typed upload data\r\n */\r\n getUploadData(): FileUploadData {\r\n return this.uploadDataSignal();\r\n }\r\n\r\n /**\r\n * Angular 20: Utility method to update upload data with type safety\r\n * @param data Partial upload data to merge with existing data\r\n */\r\n updateUploadData(data: Partial<FileUploadData>): void {\r\n const currentData = this.uploadDataSignal();\r\n const updatedData: FileUploadData = { ...currentData, ...data };\r\n // Note: This would require the uploadData to be a writable signal\r\n // For now, this method serves as a type-safe way to work with upload data\r\n console.log('📝 [FileInput] Upload data updated:', updatedData);\r\n }\r\n\r\n getCurrentState() {\r\n return {\r\n id: this.id(),\r\n label: this.labelSignal(),\r\n required: this.requiredSignal(),\r\n disabled: this.disabledSignal(),\r\n accept: this.acceptSignal(),\r\n multiple: this.multipleSignal(),\r\n showPreview: this.showPreviewSignal(),\r\n autoUpload: this.autoUploadSignal(),\r\n uploadStatus: this.uploadStatus(),\r\n isUploading: this.isUploading(),\r\n uploadProgress: this.uploadProgress(),\r\n files: this.files() ? Array.from(this.files()!).map(f => ({ name: f.name, size: f.size, type: f.type })) : null,\r\n fileNames: this.fileNames(),\r\n previewUrls: this.previewUrls().length,\r\n helperText: this.helperTextSignal(),\r\n errorText: this.errorTextSignal(),\r\n placeholderText: this.placeholderTextSignal(),\r\n placeholderIcon: this.placeholderIconSignal(),\r\n previewWidth: this.previewWidthSignal(),\r\n previewHeight: this.previewHeightSignal(),\r\n previewBoxMode: this.previewBoxModeSignal(),\r\n showFileName: this.showFileNameSignal(),\r\n uploadData: this.uploadDataSignal()\r\n };\r\n }\r\n\r\n async getControlData() {\r\n console.log('🔍 [FileInput] getControlData called');\r\n const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id() });\r\n if (cide_element_data) {\r\n console.log('📋 [FileInput] Element data loaded:', cide_element_data);\r\n \r\n // Note: Since we're using input signals, we can't directly set their values\r\n // This method would need to be refactored to work with the new signal-based approach\r\n // For now, we'll log the data and trigger validation\r\n console.log('✅ [FileInput] Control data received from element service');\r\n console.log('⚠️ [FileInput] Note: Input signals cannot be modified after component initialization');\r\n \r\n // Trigger validation update\r\n this.onValidatorChange();\r\n } else {\r\n console.log('⚠️ [FileInput] No element data found for key:', this.id());\r\n }\r\n }\r\n\r\n // Validator implementation\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n console.log('🔍 [FileInput] validate() called - uploadStatus:', this.uploadStatus(), 'required:', this.requiredSignal(), 'files:', !!this.files(), 'control.value:', control.value);\r\n \r\n // If upload is in progress (start or uploading status), return validation error\r\n if (this.uploadStatus() === 'start' || this.uploadStatus() === 'uploading') {\r\n console.log('⚠️ [FileInput] Validation ERROR: Upload in progress');\r\n return { 'uploadInProgress': { message: 'File upload in progress. Please wait...' } };\r\n }\r\n \r\n // If required and no file is selected and no control value (uploaded file ID), return validation error\r\n if (this.requiredSignal() && !this.files() && !control.value) {\r\n console.log('⚠️ [FileInput] Validation ERROR: File required');\r\n return { 'required': { message: 'Please select a file to upload.' } };\r\n }\r\n \r\n console.log('✅ [FileInput] Validation PASSED: No errors');\r\n return null; // No validation errors\r\n }\r\n\r\n} ","<div class=\"tw-flex tw-flex-col tw-gap-2\">\r\n <!-- Label (shown when not in preview box mode or when preview box mode but no label override) -->\r\n @if (labelSignal() && !isPreviewBoxMode()) {\r\n <label class=\"tw-block tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-200 tw-mb-1.5 tw-leading-5\" [attr.for]=\"'cide-file-input-' + id()\">\r\n {{ labelSignal() }}@if (requiredSignal()) {<span class=\"tw-text-red-500 dark:tw-text-red-400\"> *</span>}\r\n </label>\r\n }\r\n \r\n <!-- Preview Box Mode -->\r\n @if (isPreviewBoxMode()) {\r\n <div class=\"tw-relative\">\r\n <!-- Hidden file input -->\r\n <input\r\n type=\"file\"\r\n [attr.id]=\"'cide-file-input-' + id()\"\r\n [attr.accept]=\"acceptSignal()\"\r\n [attr.multiple]=\"multipleSignal() ? true : null\"\r\n [disabled]=\"disabledSignal()\"\r\n (change)=\"onFileSelected($event)\"\r\n class=\"tw-hidden\"\r\n />\r\n \r\n <!-- Preview Box -->\r\n <div \r\n class=\"tw-border-2 tw-border-dashed tw-border-gray-300 dark:tw-border-gray-600 tw-rounded-lg tw-bg-gray-50 dark:tw-bg-gray-800 tw-cursor-pointer tw-transition-all tw-duration-200 tw-relative tw-overflow-hidden hover:tw-border-blue-500 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20\"\r\n [class]=\"getPreviewBoxClasses()\"\r\n [style.width]=\"previewWidthSignal()\"\r\n [style.height]=\"previewHeightSignal()\"\r\n (click)=\"triggerFileSelect()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n [attr.title]=\"disabledSignal() ? 'File selection disabled' : placeholderTextSignal()\">\r\n \r\n <!-- No Image State -->\r\n @if (!hasImages()) {\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-h-full tw-p-4\">\r\n <div class=\"tw-mb-2\">\r\n <cide-ele-icon class=\"tw-text-gray-400 dark:tw-text-gray-500\" size=\"lg\">{{ isDragOver() ? '📁' : placeholderIconSignal() }}</cide-ele-icon>\r\n </div>\r\n <div class=\"tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-text-center\">\r\n {{ isDragOver() ? 'Drop files here...' : placeholderTextSignal() }}\r\n </div>\r\n </div>\r\n }\r\n \r\n <!-- Image Preview State -->\r\n @if (hasImages()) {\r\n <div class=\"tw-relative tw-w-full tw-h-full\">\r\n <img \r\n [src]=\"previewUrls()[0]\" \r\n [alt]=\"fileNames()[0] || 'Preview image'\"\r\n class=\"tw-w-full tw-h-full tw-object-cover tw-rounded-lg\">\r\n <div class=\"tw-absolute tw-inset-0 tw-bg-black tw-bg-opacity-0 hover:tw-bg-opacity-30 tw-transition-all tw-duration-200 tw-flex tw-items-center tw-justify-center tw-rounded-lg\">\r\n <div class=\"tw-text-white tw-text-sm tw-opacity-0 hover:tw-opacity-100 tw-transition-opacity tw-duration-200\">Click to change</div>\r\n </div>\r\n @if (!disabledSignal()) {\r\n <button \r\n type=\"button\" \r\n class=\"tw-absolute tw-top-2 tw-right-2 tw-w-6 tw-h-6 tw-bg-red-500 hover:tw-bg-red-600 tw-text-white tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-sm tw-font-bold tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer\"\r\n (click)=\"clearFiles(); $event.stopPropagation()\"\r\n title=\"Remove image\">\r\n ×\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n \r\n <!-- File name display for preview box mode -->\r\n @if (hasImages() && fileNames().length && showFileNameSignal()) {\r\n <div class=\"tw-mt-2 tw-text-sm tw-text-gray-600 dark:tw-text-gray-400 tw-text-center tw-truncate\">\r\n {{ fileNames()[0] }}\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Standard Mode -->\r\n @if (!isPreviewBoxMode()) {\r\n <!-- Hidden file input -->\r\n <input\r\n type=\"file\"\r\n [attr.id]=\"'cide-file-input-' + id()\"\r\n [attr.accept]=\"acceptSignal()\"\r\n [attr.multiple]=\"multipleSignal() ? true : null\"\r\n [disabled]=\"disabledSignal()\"\r\n (change)=\"onFileSelected($event)\"\r\n class=\"tw-hidden\"\r\n />\r\n \r\n <!-- Modern Drag and Drop Zone -->\r\n <div \r\n class=\"tw-border-2 tw-border-dashed tw-border-gray-300 dark:tw-border-gray-600 tw-rounded-lg tw-bg-gray-50 dark:tw-bg-gray-800 tw-cursor-pointer tw-transition-all tw-duration-200 tw-min-h-[60px] hover:tw-border-blue-500 hover:tw-bg-blue-50 dark:hover:tw-bg-blue-900/20\"\r\n [class]=\"getDragDropZoneClasses()\"\r\n (click)=\"triggerFileSelect()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\">\r\n \r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-p-3 tw-gap-3\">\r\n <!-- Icon and Text -->\r\n <div class=\"tw-flex tw-items-center tw-gap-2.5 tw-flex-1 tw-min-w-0\">\r\n <cide-ele-icon class=\"tw-flex-shrink-0 tw-transition-colors tw-duration-200\" \r\n [class]=\"getIconClasses()\" \r\n size=\"sm\">\r\n {{ isDragOver() ? 'file_download' : (hasFiles() ? 'check_circle' : 'cloud_upload') }}\r\n </cide-ele-icon>\r\n \r\n <div class=\"tw-flex tw-flex-col tw-gap-0.5 tw-min-w-0\">\r\n @if (isDragOver()) {\r\n <span class=\"tw-text-sm tw-font-medium tw-text-blue-700 dark:tw-text-blue-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">Drop files here</span>\r\n } @else if (hasFiles()) {\r\n <span class=\"tw-text-sm tw-font-medium tw-text-emerald-700 dark:tw-text-emerald-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">\r\n @if (multipleSignal() && fileNames().length > 1) {\r\n {{ fileNames().length }} files selected\r\n } @else {\r\n {{ fileNames()[0] }}\r\n }\r\n </span>\r\n @if (totalFileSize() > 0) {\r\n <span class=\"tw-text-xs tw-text-emerald-600 dark:tw-text-emerald-400\">{{ fileSizeInMB() }} MB</span>\r\n }\r\n } @else {\r\n <span class=\"tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-300 tw-whitespace-nowrap tw-overflow-hidden tw-text-ellipsis\">\r\n {{ multipleSignal() ? 'Choose files or drag here' : 'Choose file or drag here' }}\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n \r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-gap-1 tw-flex-shrink-0\">\r\n @if (hasFiles()) {\r\n <button type=\"button\" \r\n class=\"tw-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-border-none tw-rounded tw-bg-transparent tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-red-600 hover:tw-bg-red-50 dark:hover:tw-bg-red-900/20 hover:tw-text-red-700\" \r\n (click)=\"clearFiles(); $event.stopPropagation()\"\r\n title=\"Clear files\">\r\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n \r\n <!-- Image Preview Section (only for standard mode) -->\r\n @if (isImagePreviewAvailable() && !isPreviewBoxMode()) {\r\n <div class=\"tw-mt-3\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700 dark:tw-text-gray-200 tw-mb-2\">Preview:</div>\r\n <div class=\"tw-flex tw-flex-wrap tw-gap-3\">\r\n @for (previewUrl of previewUrls(); track previewUrl; let i = $index) {\r\n <div \r\n class=\"tw-relative tw-border tw-border-gray-200 dark:tw-border-gray-600 tw-rounded-lg tw-overflow-hidden tw-bg-white dark:tw-bg-gray-800\"\r\n [style.width]=\"previewWidthSignal()\"\r\n [style.height]=\"previewHeightSignal()\">\r\n <button \r\n type=\"button\" \r\n class=\"tw-absolute tw-top-1 tw-right-1 tw-w-5 tw-h-5 tw-bg-red-500 hover:tw-bg-red-600 tw-text-white tw-rounded-full tw-flex tw-items-center tw-justify-center tw-text-xs tw-font-bold tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer tw-z-10\"\r\n (click)=\"removePreview(i)\"\r\n title=\"Remove image\">\r\n ×\r\n </button>\r\n <img \r\n [src]=\"previewUrl\" \r\n [alt]=\"fileNames()[i] || 'Preview image'\"\r\n class=\"tw-w-full tw-h-full tw-object-cover\"\r\n loading=\"lazy\">\r\n <div class=\"tw-absolute tw-bottom-0 tw-left-0 tw-right-0 tw-bg-black tw-bg-opacity-75 tw-text-white tw-text-xs tw-p-1 tw-truncate\">{{ fileNames()[i] }}</div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n \r\n <!-- Upload Status and Show Files Button (only for multiple file inputs) -->\r\n @if (multiple && showFloatingUploaderSignal() && (getUploadCount() > 0 || hasActiveUploads() || hasEverUploaded())) {\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-py-1.5 tw-gap-2\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-blue-600 dark:tw-text-blue-400\" size=\"sm\">cloud_upload</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-700 dark:tw-text-gray-300\">\r\n @if (hasActiveUploads()) {\r\n {{ getActiveUploadCount() }} uploading\r\n } @else if (getUploadCount() > 0) {\r\n {{ getUploadCount() }} completed\r\n } @else if (hasEverUploaded()) {\r\n View uploads\r\n }\r\n </span>\r\n </div>\r\n <button \r\n type=\"button\" \r\n class=\"tw-flex tw-items-center tw-justify-center tw-w-8 tw-h-8 tw-rounded-md tw-bg-gray-100 dark:tw-bg-gray-700 hover:tw-bg-gray-200 dark:hover:tw-bg-gray-600 tw-text-gray-600 dark:tw-text-gray-300 tw-transition-colors tw-duration-200 tw-border-none tw-cursor-pointer\"\r\n (click)=\"showFloatingUploaderDialog()\"\r\n title=\"View upload progress and history\">\r\n <cide-ele-icon size=\"sm\">visibility</cide-ele-icon>\r\n </button>\r\n </div>\r\n }\r\n \r\n @if (errorTextSignal()) {\r\n <div class=\"tw-text-sm tw-text-red-600 dark:tw-text-red-400 tw-mt-1\">{{ errorTextSignal() }}</div>\r\n }\r\n @if (helperTextSignal() && !errorTextSignal()) {\r\n <div class=\"tw-text-sm tw-text-gray-500 dark:tw-text-gray-400 tw-mt-1\">{{ helperTextSignal() }}</div>\r\n }\r\n</div> ","import { Component, signal, computed, DestroyRef, inject, OnInit, OnDestroy, effect, Input } from '@angular/core';\r\nimport { ElementRef, ViewChild } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CideIconComponent } from '../icon/icon.component';\r\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\r\n\r\nexport interface FloatingFileUploaderData {\r\n userId?: string;\r\n groupId?: string;\r\n title?: string;\r\n description?: string;\r\n maxFileSize?: number;\r\n allowedFileTypes?: string[];\r\n multiple?: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-floating-file-uploader',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n CideIconComponent\r\n ],\r\n templateUrl: './floating-file-uploader.component.html',\r\n styleUrls: []\r\n})\r\nexport class CideEleFloatingFileUploaderComponent implements OnInit, OnDestroy {\r\n private destroyRef = inject(DestroyRef);\r\n private fileManagerService = inject(CideEleFileManagerService);\r\n\r\n @ViewChild('fileInput') fileInputRef!: ElementRef<HTMLInputElement>;\r\n\r\n // Input data from floating container\r\n @Input() data: FloatingFileUploaderData = {};\r\n\r\n // Signals for reactive state (simplified for floating container)\r\n isVisible = signal(true); // Set to true by default for floating containers\r\n currentUserId = signal('');\r\n currentGroupId = signal<string | null>(null);\r\n \r\n // Use file manager service as the single source of truth\r\n uploadQueue = computed(() => this.fileManagerService.uploadQueue());\r\n activeUploads = computed(() => this.fileManagerService.activeUploads());\r\n\r\n // Computed values based on service state\r\n hasUploads = computed(() => this.uploadQueue().length > 0 || this.activeUploads().size > 0);\r\n hasActiveUploads = computed(() => this.uploadQueue().length > 0 || Array.from(this.activeUploads().values()).some(upload => upload.stage !== 'complete'));\r\n pendingUploads = computed(() => this.uploadQueue().filter(fileId => !this.activeUploads().has(fileId)));\r\n activeUploadsLocal = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'reading' || upload.stage === 'uploading'));\r\n completedUploads = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'complete'));\r\n failedUploads = computed(() => Array.from(this.activeUploads().values()).filter(upload => upload.stage === 'error'));\r\n \r\n // Get all files for the current group (computed property for reactivity)\r\n allFilesForGroup = computed(() => {\r\n const groupId = this.currentGroupId();\r\n if (!groupId) return [];\r\n \r\n return this.fileManagerService.getAllFilesForGroup(groupId);\r\n });\r\n\r\n // Check if there are any files to display (active uploads OR fetched files for current group)\r\n hasFilesToShow = computed(() => {\r\n return this.hasActiveUploads() || this.allFilesForGroup().length > 0;\r\n });\r\n\r\n // Count methods for template\r\n getUploadingCount(): number {\r\n return this.activeUploadsLocal().length;\r\n }\r\n\r\n getCompletedCount(): number {\r\n return this.completedUploads().length;\r\n }\r\n\r\n getFailedCount(): number {\r\n return this.failedUploads().length;\r\n }\r\n\r\n // Animation states\r\n isAnimating = signal(false);\r\n\r\n // Drag functionality removed - handled by floating container\r\n\r\n // File drag and drop functionality\r\n isDragOver = signal(false);\r\n\r\n // Window resize handler removed - handled by floating container\r\n\r\n // Cached dimensions for performance\r\n // Cached dimensions removed - handled by floating container\r\n\r\n constructor() {\r\n console.log('🚀 [FloatingFileUploader] Component initialized');\r\n \r\n // Position initialization removed - handled by floating container\r\n \r\n // Consolidated effect for all visibility logic - SINGLE SOURCE OF TRUTH\r\n effect(() => {\r\n const hasActiveUploads = this.hasActiveUploads();\r\n const shouldShow = this.fileManagerService.showFloatingUploader();\r\n const triggerGroupId = this.fileManagerService.getTriggerGroupId();\r\n const isCurrentlyVisible = this.isVisible();\r\n \r\n // Show due to active uploads\r\n if (hasActiveUploads && !isCurrentlyVisible) {\r\n this.showWithAnimation();\r\n return;\r\n }\r\n \r\n // Handle manual trigger (show OR switch group ID)\r\n if (shouldShow) {\r\n if (triggerGroupId) {\r\n // Always switch to the new group ID (even if already visible)\r\n console.log('🔄 [FloatingFileUploader] Switching to group ID:', triggerGroupId);\r\n this.currentGroupId.set(triggerGroupId);\r\n \r\n // Fetch files for this group\r\n this.fileManagerService.fetchAndStoreFilesByGroupId(triggerGroupId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: () => {\r\n if (!isCurrentlyVisible) {\r\n this.showWithAnimation();\r\n }\r\n },\r\n error: () => {\r\n if (!isCurrentlyVisible) {\r\n this.showWithAnimation(); // Show anyway\r\n }\r\n }\r\n });\r\n } else if (!isCurrentlyVisible) {\r\n this.showWithAnimation();\r\n }\r\n }\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n // Initialize with input data\r\n this.initializeWithData();\r\n \r\n // Set up drag and drop listeners\r\n this.setupDragAndDrop();\r\n \r\n // Set up file input change listeners\r\n this.setupFileInputListeners();\r\n \r\n // Window resize setup removed - handled by floating container\r\n }\r\n\r\n private initializeWithData() {\r\n console.log('🚀 [FloatingFileUploader] Initializing with data:', this.data);\r\n \r\n // Set user ID if provided\r\n if (this.data.userId) {\r\n this.currentUserId.set(this.data.userId);\r\n console.log('👤 [FloatingFileUploader] User ID set:', this.data.userId);\r\n }\r\n \r\n // Set group ID if provided\r\n if (this.data.groupId) {\r\n this.currentGroupId.set(this.data.groupId);\r\n console.log('🆔 [FloatingFileUploader] Group ID set:', this.data.groupId);\r\n \r\n // Load existing files for this group\r\n this.loadExistingFiles();\r\n }\r\n \r\n // Set visibility to true when component loads\r\n this.isVisible.set(true);\r\n }\r\n\r\n private loadExistingFiles() {\r\n const groupId = this.currentGroupId();\r\n if (!groupId) return;\r\n \r\n console.log('📁 [FloatingFileUploader] Loading existing files for group:', groupId);\r\n \r\n this.fileManagerService.fetchAndStoreFilesByGroupId(groupId)\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: (files) => {\r\n console.log('📋 [FloatingFileUploader] Files loaded:', files.length);\r\n },\r\n error: (error: any) => {\r\n console.error('❌ [FloatingFileUploader] Failed to load files:', error);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n console.log('🧹 [FloatingFileUploader] Component destroyed');\r\n this.removeDragAndDropListeners();\r\n this.removeFileInputListeners();\r\n \r\n // Window resize cleanup removed - handled by floating container\r\n }\r\n\r\n /**\r\n * Set up drag and drop functionality\r\n */\r\n private setupDragAndDrop(): void {\r\n document.addEventListener('dragover', this.handleDragOver.bind(this));\r\n document.addEventListener('dragleave', this.handleDragLeave.bind(this));\r\n document.addEventListener('drop', this.handleDrop.bind(this));\r\n }\r\n\r\n /**\r\n * Remove drag and drop listeners\r\n */\r\n private removeDragAndDropListeners(): void {\r\n document.removeEventListener('dragover', this.handleDragOver.bind(this));\r\n document.removeEventListener('dragleave', this.handleDragLeave.bind(this));\r\n document.removeEventListener('drop', this.handleDrop.bind(this));\r\n }\r\n\r\n /**\r\n * Set up file input change listeners\r\n */\r\n private setupFileInputListeners(): void {\r\n // Listen for file input change events globally\r\n document.addEventListener('change', this.handleFileInputChange.bind(this));\r\n }\r\n\r\n /**\r\n * Remove file input listeners\r\n */\r\n private removeFileInputListeners(): void {\r\n document.removeEventListener('change', this.handleFileInputChange.bind(this));\r\n }\r\n\r\n /**\r\n * Handle file input change events\r\n */\r\n private handleFileInputChange(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n \r\n console.log('🔍 [FloatingFileUploader] File input change event detected:', {\r\n type: target.type,\r\n filesLength: target.files?.length || 0,\r\n element: target\r\n });\r\n \r\n // Check if this is a file input with files\r\n if (target.type === 'file' && target.files && target.files.length > 0) {\r\n console.log('📁 [FloatingFileUploader] File input change detected:', target.files.length, 'files');\r\n \r\n // Check if the input has a data-user-id attribute for user context\r\n const userId = target.getAttribute('data-user-id');\r\n if (userId && userId !== this.currentUserId()) {\r\n this.setCurrentUserId(userId);\r\n }\r\n \r\n // Handle the files\r\n this.handleFiles(Array.from(target.files));\r\n \r\n // Reset the input to allow selecting the same files again\r\n target.value = '';\r\n }\r\n }\r\n\r\n /**\r\n * Handle drag over event\r\n */\r\n private handleDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n // Show floating uploader when files are dragged over\r\n if (event.dataTransfer?.types.includes('Files')) {\r\n this.showWithAnimation();\r\n }\r\n }\r\n\r\n /**\r\n * Handle drag leave event\r\n */\r\n private handleDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n // Only hide if leaving the entire document\r\n if (!event.relatedTarget || event.relatedTarget === document.body) {\r\n this.updateVisibility();\r\n }\r\n }\r\n\r\n /**\r\n * Handle drop event\r\n */\r\n private handleDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n this.handleFiles(Array.from(files));\r\n }\r\n }\r\n\r\n /**\r\n * Handle files from drag and drop or file input\r\n */\r\n private handleFiles(files: File[]): void {\r\n console.log('📁 [FloatingFileUploader] Handling files:', files.length);\r\n \r\n // Use handleFileSelection to avoid duplicate upload paths\r\n this.handleFileSelection(files);\r\n }\r\n\r\n /**\r\n * Update visibility - simplified for notification only\r\n */\r\n updateVisibility() {\r\n // This is just a notification component now\r\n // The actual uploads are handled by the global uploader\r\n }\r\n\r\n /**\r\n * Show with animation\r\n */\r\n private showWithAnimation() {\r\n console.log('🎬 [FloatingFileUploader] showWithAnimation called - setting isVisible to true');\r\n this.isAnimating.set(true);\r\n this.isVisible.set(true);\r\n \r\n // Remove animation class after animation completes\r\n setTimeout(() => {\r\n this.isAnimating.set(false);\r\n console.log('🎬 [FloatingFileUploader] Animation completed, isVisible:', this.isVisible());\r\n }, 300);\r\n }\r\n\r\n /**\r\n * Hide with animation\r\n */\r\n private hideWithAnimation() {\r\n this.isAnimating.set(true);\r\n \r\n // Wait for animation to complete before hiding\r\n setTimeout(() => {\r\n this.isVisible.set(false);\r\n this.isAnimating.set(false);\r\n }, 300);\r\n }\r\n\r\n // Minimize and close functionality removed - handled by floating container\r\n\r\n /**\r\n * Get upload summary text\r\n */\r\n getUploadSummary(): string {\r\n const pending = this.pendingUploads();\r\n const active = this.activeUploadsLocal();\r\n const completed = this.completedUploads();\r\n const failed = this.failedUploads();\r\n\r\n if (active.length > 0) {\r\n return `${active.length} uploading`;\r\n } else if (pending.length > 0) {\r\n return `${pending.length} pending`;\r\n } else if (completed.length > 0 && failed.length === 0) {\r\n return `${completed.length} completed`;\r\n } else if (failed.length > 0) {\r\n return `${completed.length} completed, ${failed.length} failed`;\r\n }\r\n\r\n return 'No uploads';\r\n }\r\n\r\n /**\r\n * Get overall progress percentage\r\n */\r\n getOverallProgress(): number {\r\n const allUploads = Array.from(this.activeUploads().values());\r\n if (allUploads.length === 0) return 0;\r\n\r\n const totalProgress = allUploads.reduce((sum, upload) => sum + (upload.percentage || 0), 0);\r\n return Math.round(totalProgress / allUploads.length);\r\n }\r\n\r\n /**\r\n * Get status icon based on upload stage\r\n */\r\n getStatusIcon(stage: string): string {\r\n switch (stage) {\r\n case 'reading': return 'schedule';\r\n case 'uploading': return 'cloud_upload';\r\n case 'complete': return 'check_circle';\r\n case 'error': return 'error';\r\n default: return 'help';\r\n }\r\n }\r\n\r\n /**\r\n * Get status class based on upload stage\r\n */\r\n getStatusClass(stage: string): string {\r\n switch (stage) {\r\n case 'reading': return 'status-pending';\r\n case 'uploading': return 'status-uploading';\r\n case 'complete': return 'status-completed';\r\n case 'error': return 'status-error';\r\n default: return 'status-unknown';\r\n }\r\n }\r\n\r\n /**\r\n * Cancel upload\r\n */\r\n cancelUpload(fileId: string) {\r\n console.log('🚫 [FloatingFileUploader] Cancelling upload:', fileId);\r\n this.fileManagerService.cancelUpload(fileId);\r\n }\r\n\r\n /**\r\n * Get file name from file ID (extract from the ID format)\r\n */\r\n getFileNameFromId(fileId: string): string {\r\n // Extract filename from the fileId format: filename_size_timestamp\r\n const parts = fileId.split('_');\r\n if (parts.length >= 3) {\r\n // Remove the last two parts (size and timestamp) to get the filename\r\n return parts.slice(0, -2).join('_');\r\n }\r\n return fileId;\r\n }\r\n\r\n /**\r\n * Get all files from service state (pending + active uploads + fetched files)\r\n * This method now uses the computed property for consistency\r\n */\r\n getAllFiles() {\r\n return this.allFilesForGroup();\r\n }\r\n\r\n\r\n /**\r\n * Set current user ID\r\n */\r\n setCurrentUserId(userId: string) {\r\n this.currentUserId.set(userId);\r\n this.fileManagerService.setUserId(userId);\r\n }\r\n\r\n\r\n\r\n /**\r\n * Check if there are any uploads for the current group\r\n */\r\n hasUploadsForCurrentGroup(): boolean {\r\n const groupId = this.currentGroupId();\r\n if (!groupId) {\r\n // If no group filter, show all uploads\r\n return this.hasUploads();\r\n }\r\n \r\n // Check if any uploads belong to the current group\r\n // Note: This would need to be enhanced based on how group IDs are stored in the file manager service\r\n return this.hasUploads();\r\n }\r\n\r\n /**\r\n * Handle drag over event for file drop\r\n */\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(true);\r\n }\r\n\r\n /**\r\n * Handle drag leave event for file drop\r\n */\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n }\r\n\r\n /**\r\n * Handle drop event for file drop\r\n */\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragOver.set(false);\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n this.handleFileSelection(Array.from(files));\r\n }\r\n }\r\n\r\n /**\r\n * Trigger file input click\r\n */\r\n triggerFileInput(): void {\r\n if (this.fileInputRef?.nativeElement) {\r\n this.fileInputRef.nativeElement.click();\r\n }\r\n }\r\n\r\n /**\r\n * Handle file input change\r\n */\r\n onFileInputChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files.length > 0) {\r\n this.handleFileSelection(Array.from(input.files));\r\n input.value = ''; // Reset input\r\n }\r\n }\r\n\r\n /**\r\n * Handle file selection from drag/drop or file input\r\n */\r\n private handleFileSelection(files: File[]): void {\r\n const groupId = this.currentGroupId();\r\n \r\n // Group ID must be provided by the file input component\r\n if (!groupId) {\r\n console.error('❌ [FloatingFileUploader] No group ID available. Files cannot be uploaded without a group ID from the file input component.');\r\n return;\r\n }\r\n \r\n // Upload files using the file manager service\r\n files.forEach((file) => {\r\n this.fileManagerService.uploadFile(file, {\r\n groupId: groupId,\r\n isMultiple: true,\r\n userId: this.currentUserId()\r\n });\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Update cached dimensions (throttled for performance)\r\n */\r\n // Cached dimensions functionality removed - handled by floating container\r\n\r\n /**\r\n * Start dragging the uploader\r\n */\r\n // Drag functionality removed - handled by floating container\r\n\r\n /**\r\n * Handle dragging movement\r\n */\r\n // All drag functionality removed - handled by floating container\r\n\r\n /**\r\n * Set up window resize listener to keep uploader within bounds\r\n */\r\n // Window resize functionality removed - handled by floating container\r\n\r\n /**\r\n * Initialize default position\r\n */\r\n // Position initialization removed - handled by floating container\r\n\r\n}\r\n","<!-- File Uploader Content (No absolute positioning - works within floating container) -->\r\n@if (isVisible()) {\r\n<div class=\"tw-w-full tw-h-full tw-flex tw-flex-col tw-overflow-hidden\">\r\n <!-- Content starts directly - no header needed since floating container provides it -->\r\n\r\n <!-- Content -->\r\n <div class=\"tw-flex-1 tw-overflow-y-auto tw-p-4 tw-pb-4\">\r\n \r\n <!-- Drag and Drop Zone -->\r\n <div class=\"tw-mb-4 tw-p-6 tw-border-2 tw-border-dashed tw-border-gray-300 tw-rounded-lg tw-bg-gray-50 tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-center hover:tw-border-blue-500 hover:tw-bg-blue-50\" \r\n [class.tw-border-blue-500]=\"isDragOver()\"\r\n [class.tw-bg-blue-100]=\"isDragOver()\"\r\n [class.tw-scale-105]=\"isDragOver()\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\" \r\n (drop)=\"onDrop($event)\" \r\n (click)=\"triggerFileInput()\">\r\n \r\n <!-- Hidden file input -->\r\n <input #fileInput \r\n type=\"file\" \r\n [multiple]=\"data.multiple !== false\" \r\n [accept]=\"data.allowedFileTypes?.join(',') || '*/*'\" \r\n (change)=\"onFileInputChange($event)\" \r\n class=\"tw-hidden\">\r\n \r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-gap-2\">\r\n <cide-ele-icon class=\"tw-text-gray-400 tw-transition-colors tw-duration-200\" \r\n [class.tw-text-blue-500]=\"isDragOver()\"\r\n size=\"sm\">cloud_upload</cide-ele-icon>\r\n \r\n <div>\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-700\">\r\n {{ isDragOver() ? 'Drop files here' : 'Drag files here or click to browse' }}\r\n </div>\r\n @if (data.description) {\r\n <div class=\"tw-text-xs tw-text-gray-500 tw-mt-1\">{{ data.description }}</div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Upload Queue - Show files from service state -->\r\n @if (allFilesForGroup().length > 0) {\r\n <div class=\"tw-space-y-2\">\r\n <!-- Show all files from service state -->\r\n @for (file of allFilesForGroup(); track file.fileId) {\r\n <div class=\"tw-flex tw-items-center tw-px-4 tw-py-3 tw-rounded-lg tw-transition-colors tw-duration-200 tw-bg-white tw-border tw-border-gray-200 hover:tw-bg-gray-100 hover:tw-shadow-sm\"\r\n [class.tw-bg-blue-50]=\"file.stage === 'uploading'\"\r\n [class.tw-bg-green-50]=\"file.stage === 'complete'\"\r\n [class.tw-bg-red-50]=\"file.stage === 'error'\">\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-flex-1 tw-min-w-0\">\r\n <cide-ele-icon class=\"tw-flex-shrink-0\" size=\"xs\">{{ getStatusIcon(file.stage) }}</cide-ele-icon>\r\n <div class=\"tw-min-w-0 tw-flex-1\">\r\n <div class=\"tw-text-sm tw-font-medium tw-text-gray-900 tw-truncate\">{{ file.fileName }}</div>\r\n <div class=\"tw-text-xs\">\r\n @switch (file.stage) {\r\n @case ('pending') {\r\n <span class=\"tw-text-yellow-600 tw-font-medium\">Waiting...</span>\r\n }\r\n @case ('reading') {\r\n <span class=\"tw-text-yellow-600 tw-font-medium\">Reading...</span>\r\n }\r\n @case ('uploading') {\r\n <span class=\"tw-text-blue-600 tw-font-medium\">Uploading...</span>\r\n }\r\n @case ('complete') {\r\n <span class=\"tw-text-green-600 tw-font-medium\">Completed</span>\r\n }\r\n @case ('error') {\r\n <span class=\"tw-text-red-600 tw-font-medium\">Failed</span>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Progress Bar (only for uploading files) -->\r\n @if (file.stage === 'uploading' && file.percentage !== undefined) {\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-ml-2 tw-min-w-[80px]\">\r\n <div class=\"tw-flex-1 tw-h-1 tw-bg-gray-200 tw-rounded-full tw-overflow-hidden\">\r\n <div class=\"tw-h-full tw-bg-blue-500 tw-transition-all tw-duration-300\" [style.width.%]=\"file.percentage\"></div>\r\n </div>\r\n <span class=\"tw-text-xs tw-text-gray-500 tw-min-w-[24px] tw-text-right\">{{ file.percentage }}%</span>\r\n </div>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"tw-flex tw-gap-1 tw-ml-2\">\r\n @switch (file.stage) {\r\n @case ('pending') {\r\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \r\n (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('reading') {\r\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \r\n (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('uploading') {\r\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-red-50 hover:tw-text-red-600\" \r\n (click)=\"cancelUpload(file.fileId)\" title=\"Cancel\">\r\n <cide-ele-icon size=\"xs\">cancel</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('complete') {\r\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-text-green-600\" title=\"Completed\">\r\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n </button>\r\n }\r\n @case ('error') {\r\n <button class=\"tw-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-border-none tw-bg-transparent tw-rounded tw-cursor-pointer tw-transition-all tw-duration-200 tw-text-gray-400 hover:tw-bg-blue-50 hover:tw-text-blue-600\" \r\n title=\"Retry\">\r\n <cide-ele-icon size=\"xs\">refresh</cide-ele-icon>\r\n </button>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n } @else {\r\n <!-- No uploads message when manually opened -->\r\n <div class=\"tw-py-8 tw-text-center tw-text-gray-500\">\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-gap-4\">\r\n <cide-ele-icon size=\"md\" class=\"tw-text-gray-300 tw-opacity-70\">cloud_upload</cide-ele-icon>\r\n <div>\r\n <h4 class=\"tw-text-lg tw-font-semibold tw-text-gray-700 tw-mb-2\">No active uploads</h4>\r\n <p class=\"tw-text-sm tw-text-gray-500\">Upload files to see their progress here</p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Status summary - integrated into content -->\r\n @if (hasActiveUploads()) {\r\n <div class=\"tw-px-4 tw-py-2 tw-bg-gray-50\">\r\n <div class=\"tw-flex tw-gap-3 tw-text-xs\">\r\n <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-blue-600\">\r\n <cide-ele-icon size=\"xs\">upload</cide-ele-icon>\r\n <span>{{ getUploadingCount() }} uploading</span>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-green-600\">\r\n <cide-ele-icon size=\"xs\">check_circle</cide-ele-icon>\r\n <span>{{ getCompletedCount() }} completed</span>\r\n </div>\r\n <div class=\"tw-flex tw-items-center tw-gap-1 tw-text-red-600\">\r\n <cide-ele-icon size=\"xs\">error</cide-ele-icon>\r\n <span>{{ getFailedCount() }} failed</span>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n}","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, forwardRef } from '@angular/core';\r\nimport { AbstractControl, ControlValueAccessor, FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms';\r\nimport { themeSize, elementStyleType, labelPlacementType, labelDirType } from 'cloud-ide-lms-model';\r\n\r\n@Component({\r\n selector: 'cide-ele-textarea',\r\n standalone: true,\r\n templateUrl: './textarea.component.html',\r\n styleUrl: './textarea.component.scss',\r\n imports: [CommonModule, FormsModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CideTextareaComponent),\r\n multi: true\r\n },\r\n {\r\n provide: NG_VALIDATORS,\r\n multi: true,\r\n useExisting: forwardRef(() => CideTextareaComponent),\r\n }\r\n ]\r\n})\r\nexport class CideTextareaComponent implements ControlValueAccessor, Validator, OnInit, OnChanges {\r\n @Input() label: string = '';\r\n @Input() labelHide: boolean = false;\r\n @Input() placeholder: string = '';\r\n @Input() helperText: string = '';\r\n @Input() errorText: string = '';\r\n @Input() required: boolean = false;\r\n @Input() disabled: boolean = false;\r\n @Input() minlength: number = 0;\r\n @Input() maxlength: number = 0;\r\n @Input() rows: number | string = 3;\r\n @Input() id: string = '';\r\n @Input() ngModel: string = '';\r\n @Input() size: themeSize = 'sm';\r\n @Input() fill: elementStyleType = 'outline';\r\n @Input() labelPlacement: labelPlacementType = 'fixed';\r\n @Input() labelDir: labelDirType = 'start';\r\n @Input() leadingIcon: string = '';\r\n @Input() trailingIcon: string = '';\r\n @Input() clearInput: boolean = false;\r\n trailingIconInternal: string = '';\r\n isTrailingIconAllwedClick: boolean = false;\r\n @Output() ngModelChange = new EventEmitter<string>();\r\n\r\n isTouched = false;\r\n isValid = true;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n onChange = (value: string) => {};\r\n onTouched = () => {};\r\n onValidate = () => {};\r\n\r\n ngOnInit(): void {\r\n this.validateValue(this.ngModel);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['ngModel']) {\r\n this.validateValue(this.ngModel);\r\n }\r\n }\r\n\r\n writeValue(value: string): void {\r\n this.ngModel = value;\r\n this.validateValue(value);\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 = isDisabled;\r\n }\r\n\r\n validate(control: AbstractControl): ValidationErrors | null {\r\n return this.validateValue(control.value);\r\n }\r\n\r\n validateValue(value: string): ValidationErrors | null {\r\n console.log('validateValue', value);\r\n this.isValid = true;\r\n return null;\r\n }\r\n\r\n onInput(event: Event) {\r\n const value = (event.target as HTMLTextAreaElement).value;\r\n this.ngModel = value;\r\n this.onChange(value);\r\n this.ngModelChange.emit(value);\r\n this.validateValue(value);\r\n }\r\n\r\n onBlur() {\r\n this.isTouched = true;\r\n this.onTouched();\r\n }\r\n\r\n ClearInputValue() {\r\n this.ngModel = '';\r\n this.onChange('');\r\n this.ngModelChange.emit('');\r\n this.validateValue('');\r\n }\r\n\r\n trailingIconClick() {\r\n // For future extensibility (e.g., password visibility)\r\n // For now, just emit event or toggle icon if needed\r\n }\r\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\">\r\n {{ label }}\r\n <span *ngIf=\"required\" class=\"tw-text-red-500 tw-ml-1\">*</span>\r\n </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]=\"{\r\n 'tw-rounded-e-md tw-rounded-es-md': label && labelPlacement === 'fixed',\r\n 'tw-rounded-md': !(label && labelPlacement === 'fixed'),\r\n 'tw-pl-1': !leadingIcon,\r\n 'tw-pr-8': trailingIconInternal,\r\n 'tw-pr-1': !trailingIconInternal,\r\n 'tw-h-8 tw-pt-0.5 tw-pb-0': size === 'md',\r\n '!tw-mt-0': labelHide,\r\n 'tw-opacity-50 tw-cursor-not-allowed': disabled\r\n }\"\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 { Component, Input, Output, EventEmitter, signal, computed, OnInit, OnDestroy, HostListener, inject, effect, input, ChangeDetectionStrategy } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from '../icon/icon.component';\r\n// Breadcrumb service removed; component operates on inputs and local state only\r\n\r\nexport interface BreadcrumbItem {\r\n id: string;\r\n label: string;\r\n icon?: string;\r\n url?: string;\r\n disabled?: boolean;\r\n type?: 'root' | 'category' | 'entity' | 'custom';\r\n metadata?: any;\r\n}\r\n\r\nexport interface BreadcrumbDropdownOption {\r\n id: string;\r\n label: string;\r\n icon?: string;\r\n disabled?: boolean;\r\n action?: () => void;\r\n}\r\n\r\nexport interface BreadcrumbSeparator {\r\n type: 'chevron' | 'slash' | 'arrow' | 'dot' | 'custom';\r\n icon?: string;\r\n text?: string;\r\n}\r\n\r\nexport type BreadcrumbStyle = 'modern' | 'classic' | 'minimal' | 'hierarchical';\r\n\r\nexport interface BreadcrumbConfig {\r\n style: BreadcrumbStyle;\r\n separator: BreadcrumbSeparator;\r\n showHomeIcon: boolean;\r\n homeIcon: string;\r\n maxItems: number;\r\n showDropdownOnOverflow: boolean;\r\n dropdownOptions: BreadcrumbDropdownOption[];\r\n clickableItems: boolean;\r\n showTooltips: boolean;\r\n responsive: boolean;\r\n compact: boolean;\r\n animated: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-breadcrumb',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n templateUrl: './breadcrumb.component.html',\r\n styleUrl: './breadcrumb.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CideEleBreadcrumbComponent implements OnInit, OnDestroy {\r\n // Input signals\r\n items = input<BreadcrumbItem[]>([]);\r\n style = input<BreadcrumbStyle>('modern');\r\n separator = input<BreadcrumbSeparator>({ type: 'chevron' });\r\n showHomeIcon = input<boolean>(true);\r\n homeIcon = input<string>('home');\r\n maxItems = input<number>(5);\r\n showDropdownOnOverflow = input<boolean>(true);\r\n dropdownOptions = input<BreadcrumbDropdownOption[]>([]);\r\n clickableItems = input<boolean>(true);\r\n showTooltips = input<boolean>(true);\r\n responsive = input<boolean>(true);\r\n compact = input<boolean>(false);\r\n animated = input<boolean>(true);\r\n loadingInput = input<boolean>(false);\r\n disabled = input<boolean>(false);\r\n\r\n // Optional context id when used inside tabs/popups; if omitted, uses service active context\r\n contextId = input<string | undefined>(undefined);\r\n // Optional pageCode input for auto-resolving via provided resolver (no service injection needed by consumer)\r\n pageCode = input<string | undefined>(undefined);\r\n\r\n // Output events\r\n @Output() itemClick = new EventEmitter<BreadcrumbItem>();\r\n @Output() dropdownOptionClick = new EventEmitter<BreadcrumbDropdownOption>();\r\n @Output() homeClick = new EventEmitter<void>();\r\n\r\n // Internal state\r\n private showDropdown = signal(false);\r\n private isOverflowing = signal(false);\r\n private visibleItems = signal<BreadcrumbItem[]>([]);\r\n private hiddenItems = signal<BreadcrumbItem[]>([]);\r\n private localItems = signal<BreadcrumbItem[]>([]);\r\n private localLoading = signal<boolean>(false);\r\n\r\n // Computed properties\r\n showDropdownSignal = computed(() => this.showDropdown());\r\n isOverflowingSignal = computed(() => this.isOverflowing());\r\n visibleItemsSignal = computed(() => this.visibleItems());\r\n hiddenItemsSignal = computed(() => this.hiddenItems());\r\n\r\n // Configuration based on style\r\n config = computed(() => this.getConfigForStyle(this.style()));\r\n effectiveLoading = computed(() => this.loadingInput() || this.localLoading());\r\n\r\n // Service for auto-binding when inputs are not provided\r\n // No service injection\r\n private cleanupEffect?: { destroy: () => void };\r\n\r\n constructor() {\r\n // Mirror external input items into local state within injection context\r\n const ref = effect(() => {\r\n const inItems = this.items();\r\n if (inItems && inItems.length > 0) {\r\n this.localItems.set([...inItems]);\r\n this.processItems();\r\n }\r\n });\r\n this.cleanupEffect = { destroy: () => ref.destroy() };\r\n }\r\n\r\n ngOnInit() {\r\n // Initial calculation\r\n this.processItems();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.cleanupEffect?.destroy();\r\n }\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: Event) {\r\n const target = event.target as HTMLElement;\r\n if (!target.closest('.breadcrumb-dropdown-container')) {\r\n this.showDropdown.set(false);\r\n }\r\n }\r\n\r\n // Process items based on maxItems and overflow\r\n private processItems() {\r\n const source = this.localItems();\r\n const max = this.maxItems();\r\n if (source.length <= max) {\r\n this.visibleItems.set([...source]);\r\n this.hiddenItems.set([]);\r\n this.isOverflowing.set(false);\r\n } else {\r\n const visibleCount = this.showDropdownOnOverflow() ? max - 1 : max;\r\n this.visibleItems.set(source.slice(0, visibleCount));\r\n this.hiddenItems.set(source.slice(visibleCount));\r\n this.isOverflowing.set(true);\r\n }\r\n }\r\n\r\n // Get configuration based on style\r\n private getConfigForStyle(style: BreadcrumbStyle): BreadcrumbConfig {\r\n const configs: Record<BreadcrumbStyle, BreadcrumbConfig> = {\r\n modern: {\r\n style: 'modern',\r\n separator: { type: 'chevron' },\r\n showHomeIcon: true,\r\n homeIcon: 'home',\r\n maxItems: 5,\r\n showDropdownOnOverflow: true,\r\n dropdownOptions: [],\r\n clickableItems: true,\r\n showTooltips: true,\r\n responsive: true,\r\n compact: false,\r\n animated: true\r\n },\r\n classic: {\r\n style: 'classic',\r\n separator: { type: 'slash' },\r\n showHomeIcon: false,\r\n homeIcon: 'home',\r\n maxItems: 8,\r\n showDropdownOnOverflow: false,\r\n dropdownOptions: [],\r\n clickableItems: true,\r\n showTooltips: false,\r\n responsive: false,\r\n compact: true,\r\n animated: false\r\n },\r\n minimal: {\r\n style: 'minimal',\r\n separator: { type: 'dot' },\r\n showHomeIcon: false,\r\n homeIcon: 'home',\r\n maxItems: 3,\r\n showDropdownOnOverflow: true,\r\n dropdownOptions: [],\r\n clickableItems: false,\r\n showTooltips: true,\r\n responsive: true,\r\n compact: true,\r\n animated: false\r\n },\r\n hierarchical: {\r\n style: 'hierarchical',\r\n separator: { type: 'chevron' },\r\n showHomeIcon: true,\r\n homeIcon: 'home',\r\n maxItems: 4,\r\n showDropdownOnOverflow: true,\r\n dropdownOptions: [],\r\n clickableItems: true,\r\n showTooltips: false,\r\n responsive: true,\r\n compact: true,\r\n animated: false\r\n }\r\n };\r\n\r\n return configs[style];\r\n }\r\n\r\n // Event handlers\r\n onItemClick(item: BreadcrumbItem) {\r\n if (!item.disabled && this.clickableItems() && !this.disabled()) {\r\n this.itemClick.emit(item);\r\n }\r\n }\r\n\r\n onHomeClick() {\r\n if (!this.disabled()) {\r\n this.homeClick.emit();\r\n }\r\n }\r\n\r\n onDropdownToggle() {\r\n if (!this.disabled()) {\r\n this.showDropdown.set(!this.showDropdown());\r\n }\r\n }\r\n\r\n onDropdownOptionClick(option: BreadcrumbDropdownOption) {\r\n if (!option.disabled && !this.disabled()) {\r\n this.dropdownOptionClick.emit(option);\r\n this.showDropdown.set(false);\r\n }\r\n }\r\n\r\n // Utility methods\r\n getItemClasses(item: BreadcrumbItem, isLast: boolean = false): string {\r\n const classes = ['breadcrumb-item'];\r\n \r\n if (this.config().compact) classes.push('compact');\r\n if (this.config().animated) classes.push('animated');\r\n if (item.disabled) classes.push('disabled');\r\n if (isLast) classes.push('last');\r\n if (this.clickableItems() && !item.disabled) classes.push('clickable');\r\n \r\n return classes.join(' ');\r\n }\r\n\r\n getContainerClasses(): string {\r\n const classes = ['breadcrumb-container'];\r\n \r\n classes.push(`style-${this.style()}`);\r\n if (this.config().compact) classes.push('compact');\r\n if (this.config().responsive) classes.push('responsive');\r\n if (this.config().animated) classes.push('animated');\r\n if (this.effectiveLoading()) classes.push('loading');\r\n if (this.disabled()) classes.push('disabled');\r\n \r\n return classes.join(' ');\r\n }\r\n\r\n getSeparatorIcon(): string {\r\n const separatorMap: Record<string, string> = {\r\n 'chevron': 'chevron_right',\r\n 'slash': 'keyboard_arrow_right',\r\n 'arrow': 'arrow_forward',\r\n 'dot': 'fiber_manual_record'\r\n };\r\n \r\n const sep = this.separator();\r\n return separatorMap[sep.type] || 'chevron_right';\r\n }\r\n\r\n getTooltipText(item: BreadcrumbItem): string {\r\n if (!this.showTooltips) return '';\r\n \r\n let tooltip = item.label;\r\n if (item.type) {\r\n tooltip += ` (${item.type})`;\r\n }\r\n if (item.url) {\r\n tooltip += ` - ${item.url}`;\r\n }\r\n \r\n return tooltip;\r\n }\r\n\r\n // Public methods for external control\r\n public toggleDropdown() {\r\n this.onDropdownToggle();\r\n }\r\n\r\n public closeDropdown() {\r\n this.showDropdown.set(false);\r\n }\r\n\r\n public updateItems(newItems: BreadcrumbItem[]) {\r\n this.localItems.set(newItems);\r\n this.processItems();\r\n }\r\n\r\n public addItem(item: BreadcrumbItem) {\r\n this.localItems.set([...this.localItems(), item]);\r\n this.processItems();\r\n }\r\n\r\n public removeItem(itemId: string) {\r\n this.localItems.set(this.localItems().filter(item => item.id !== itemId));\r\n this.processItems();\r\n }\r\n\r\n public setLoading(value: boolean) {\r\n this.localLoading.set(value);\r\n }\r\n}\r\n","<!-- Breadcrumb Component Template -->\r\n<div [class]=\"getContainerClasses()\" class=\"tw-flex tw-items-center tw-text-xs tw-text-gray-700 tw-py-0\">\r\n \r\n <!-- Loading State -->\r\n @if (effectiveLoading()) {\r\n <div class=\"breadcrumb-loading\">\r\n <cide-ele-icon class=\"animate-spin\">refresh</cide-ele-icon>\r\n <span>Loading...</span>\r\n </div>\r\n }\r\n\r\n <!-- Main Breadcrumb Content -->\r\n @if (!effectiveLoading()) {\r\n <nav class=\"tw-flex tw-items-center tw-p-1 tw-min-w-0 tw-flex-1\" role=\"navigation\" aria-label=\"Breadcrumb\">\r\n <ol class=\"tw-flex tw-items-center tw-list-none tw-m-0 tw-p-0 tw-gap-1 tw-flex-wrap\">\r\n \r\n <!-- Home Icon (if enabled) -->\r\n @if (config().showHomeIcon) {\r\n <li class=\"tw-flex tw-items-center tw-gap-1 tw-px-1 tw-whitespace-nowrap tw-relative\" \r\n [class.tw-cursor-pointer]=\"clickableItems() && !disabled()\"\r\n (click)=\"onHomeClick()\"\r\n [title]=\"showTooltips() ? 'Go to Home' : ''\">\r\n <cide-ele-icon class=\"tw-text-gray-500 tw-text-xs\">\r\n {{ config().homeIcon }}\r\n </cide-ele-icon>\r\n </li>\r\n \r\n <!-- Separator after home -->\r\n @if (visibleItemsSignal().length > 0) {\r\n <li class=\"tw-flex tw-items-center tw-text-gray-300 tw-mx-0.5\">\r\n @if (separator().type === 'custom' && separator().text) {\r\n <span class=\"tw-font-normal tw-text-gray-400\">{{ separator().text }}</span>\r\n } @else {\r\n <cide-ele-icon class=\"tw-text-xs\">\r\n {{ getSeparatorIcon() }}\r\n </cide-ele-icon>\r\n }\r\n </li>\r\n }\r\n }\r\n\r\n <!-- Visible Items -->\r\n @for (item of visibleItemsSignal(); track item.id; let i = $index; let isLast = $last) {\r\n <li class=\"tw-flex tw-items-center tw-gap-1 tw-px-1 tw-whitespace-nowrap tw-relative\"\r\n [class.tw-cursor-pointer]=\"clickableItems() && !disabled()\"\r\n [class.tw-text-gray-400]=\"isLast\"\r\n (click)=\"onItemClick(item)\"\r\n [title]=\"getTooltipText(item)\"\r\n [attr.aria-current]=\"isLast ? 'page' : null\">\r\n \r\n <!-- Item Icon (if provided) -->\r\n @if (item.icon) {\r\n <cide-ele-icon class=\"tw-text-gray-500 tw-text-xs tw-flex-shrink-0\">\r\n {{ item.icon }}\r\n </cide-ele-icon>\r\n }\r\n \r\n <!-- Item Label -->\r\n <span class=\"tw-font-medium tw-text-xs\">\r\n {{ item.label }}\r\n </span>\r\n \r\n <!-- Item Type Badge (for hierarchical style) -->\r\n @if (style() === 'hierarchical' && item.type && item.type !== 'root') {\r\n <span class=\"item-type-badge\" [class]=\"'type-' + item.type\">\r\n {{ item.type }}\r\n </span>\r\n }\r\n </li>\r\n\r\n <!-- Separator (except for last item) -->\r\n @if (!isLast || isOverflowingSignal()) {\r\n <li class=\"tw-flex tw-items-center tw-text-gray-300 tw-mx-0.5\">\r\n @if (separator().type === 'custom' && separator().text) {\r\n <span class=\"tw-font-normal tw-text-gray-400\">{{ separator().text }}</span>\r\n } @else {\r\n <cide-ele-icon class=\"tw-text-xs\">\r\n {{ getSeparatorIcon() }}\r\n </cide-ele-icon>\r\n }\r\n </li>\r\n }\r\n }\r\n\r\n <!-- Overflow Dropdown -->\r\n @if (isOverflowingSignal() && showDropdownOnOverflow()) {\r\n <li class=\"breadcrumb-item overflow-item\">\r\n <div class=\"breadcrumb-dropdown-container\">\r\n <button type=\"button\" \r\n class=\"overflow-button\"\r\n (click)=\"onDropdownToggle()\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-expanded]=\"showDropdownSignal()\"\r\n aria-haspopup=\"true\"\r\n [title]=\"showTooltips() ? 'More items' : ''\">\r\n <cide-ele-icon class=\"overflow-icon\">more_horiz</cide-ele-icon>\r\n <span class=\"overflow-text\" [class.compact]=\"config().compact\">\r\n {{ hiddenItemsSignal().length }}+ more\r\n </span>\r\n </button>\r\n \r\n <!-- Dropdown Menu -->\r\n @if (showDropdownSignal()) {\r\n <div class=\"breadcrumb-dropdown\" role=\"menu\">\r\n <div class=\"dropdown-header\">\r\n <span>Hidden Items</span>\r\n </div>\r\n \r\n <!-- Hidden Items -->\r\n @for (item of hiddenItemsSignal(); track item.id) {\r\n <button type=\"button\" \r\n class=\"dropdown-item\"\r\n (click)=\"onItemClick(item)\"\r\n [disabled]=\"item.disabled || disabled()\"\r\n role=\"menuitem\">\r\n @if (item.icon) {\r\n <cide-ele-icon class=\"dropdown-item-icon\">{{ item.icon }}</cide-ele-icon>\r\n }\r\n <span class=\"dropdown-item-label\">{{ item.label }}</span>\r\n </button>\r\n }\r\n \r\n <!-- Custom Dropdown Options -->\r\n @if (dropdownOptions().length > 0) {\r\n <div class=\"dropdown-divider\"></div>\r\n @for (option of dropdownOptions(); track option.id) {\r\n <button type=\"button\" \r\n class=\"dropdown-option\"\r\n (click)=\"onDropdownOptionClick(option)\"\r\n [disabled]=\"option.disabled || disabled()\"\r\n role=\"menuitem\">\r\n @if (option.icon) {\r\n <cide-ele-icon class=\"dropdown-option-icon\">{{ option.icon }}</cide-ele-icon>\r\n }\r\n <span class=\"dropdown-option-label\">{{ option.label }}</span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </div>\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n }\r\n\r\n</div>\r\n","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 { 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, 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 { Component, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, Renderer2, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideElementsService } from '../../utils';\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-flex tw-items-center tw-justify-center',\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 { 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 { 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 { Injectable, OnDestroy } from '@angular/core';\r\n\r\nexport interface KeyboardShortcut {\r\n id: string;\r\n key: string;\r\n ctrlKey?: boolean;\r\n altKey?: boolean;\r\n shiftKey?: boolean;\r\n metaKey?: boolean;\r\n description?: string;\r\n action: () => void;\r\n preventDefault?: boolean;\r\n stopPropagation?: boolean;\r\n}\r\n\r\nexport interface ShortcutOverride {\r\n shortcutId: string;\r\n newKey: string;\r\n newCtrlKey?: boolean;\r\n newAltKey?: boolean;\r\n newShiftKey?: boolean;\r\n newMetaKey?: boolean;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class KeyboardShortcutService implements OnDestroy {\r\n private shortcuts = new Map<string, KeyboardShortcut>();\r\n private overrides = new Map<string, ShortcutOverride>();\r\n private keydownListener?: (event: KeyboardEvent) => void;\r\n\r\n constructor() {\r\n this.setupGlobalListener();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.removeGlobalListener();\r\n }\r\n\r\n /**\r\n * Register a new keyboard shortcut\r\n */\r\n register(shortcut: KeyboardShortcut): void {\r\n this.shortcuts.set(shortcut.id, shortcut);\r\n console.log(`⌨️ [KeyboardShortcut] Registered shortcut: ${shortcut.id} (${this.getKeyDescription(shortcut)})`);\r\n }\r\n\r\n /**\r\n * Override an existing shortcut with new key combination\r\n */\r\n override(shortcutId: string, newKey: string, options?: {\r\n ctrlKey?: boolean;\r\n altKey?: boolean;\r\n shiftKey?: boolean;\r\n metaKey?: boolean;\r\n }): void {\r\n const originalShortcut = this.shortcuts.get(shortcutId);\r\n if (!originalShortcut) {\r\n console.warn(`⚠️ [KeyboardShortcut] Cannot override shortcut '${shortcutId}' - not found`);\r\n return;\r\n }\r\n\r\n const override: ShortcutOverride = {\r\n shortcutId,\r\n newKey,\r\n newCtrlKey: options?.ctrlKey,\r\n newAltKey: options?.altKey,\r\n newShiftKey: options?.shiftKey,\r\n newMetaKey: options?.metaKey\r\n };\r\n\r\n this.overrides.set(shortcutId, override);\r\n console.log(`🔄 [KeyboardShortcut] Override registered for '${shortcutId}': ${this.getKeyDescription({ ...originalShortcut, ...options, key: newKey })}`);\r\n }\r\n\r\n /**\r\n * Remove a shortcut\r\n */\r\n unregister(shortcutId: string): void {\r\n this.shortcuts.delete(shortcutId);\r\n this.overrides.delete(shortcutId);\r\n console.log(`🗑️ [KeyboardShortcut] Removed shortcut: ${shortcutId}`);\r\n }\r\n\r\n /**\r\n * Remove override for a shortcut (restore original key combination)\r\n */\r\n removeOverride(shortcutId: string): void {\r\n this.overrides.delete(shortcutId);\r\n console.log(`🔄 [KeyboardShortcut] Override removed for: ${shortcutId}`);\r\n }\r\n\r\n /**\r\n * Get all registered shortcuts\r\n */\r\n getAllShortcuts(): KeyboardShortcut[] {\r\n return Array.from(this.shortcuts.values());\r\n }\r\n\r\n /**\r\n * Get shortcuts by category or filter\r\n */\r\n getShortcuts(filter?: (shortcut: KeyboardShortcut) => boolean): KeyboardShortcut[] {\r\n const shortcuts = this.getAllShortcuts();\r\n return filter ? shortcuts.filter(filter) : shortcuts;\r\n }\r\n\r\n /**\r\n * Check if a shortcut is registered\r\n */\r\n hasShortcut(shortcutId: string): boolean {\r\n return this.shortcuts.has(shortcutId);\r\n }\r\n\r\n /**\r\n * Get shortcut information\r\n */\r\n getShortcut(shortcutId: string): KeyboardShortcut | undefined {\r\n return this.shortcuts.get(shortcutId);\r\n }\r\n\r\n /**\r\n * Clear all shortcuts\r\n */\r\n clearAll(): void {\r\n this.shortcuts.clear();\r\n this.overrides.clear();\r\n console.log(`🧹 [KeyboardShortcut] All shortcuts cleared`);\r\n }\r\n\r\n /**\r\n * Set up global keyboard listener\r\n */\r\n private setupGlobalListener(): void {\r\n this.keydownListener = (event: KeyboardEvent) => {\r\n this.handleKeydown(event);\r\n };\r\n \r\n document.addEventListener('keydown', this.keydownListener);\r\n console.log(`🎧 [KeyboardShortcut] Global keyboard listener attached`);\r\n }\r\n\r\n /**\r\n * Remove global keyboard listener\r\n */\r\n private removeGlobalListener(): void {\r\n if (this.keydownListener) {\r\n document.removeEventListener('keydown', this.keydownListener);\r\n this.keydownListener = undefined;\r\n console.log(`🎧 [KeyboardShortcut] Global keyboard listener removed`);\r\n }\r\n }\r\n\r\n /**\r\n * Handle keydown events\r\n */\r\n private handleKeydown(event: KeyboardEvent): void {\r\n for (const [shortcutId, shortcut] of this.shortcuts) {\r\n if (this.matchesShortcut(event, shortcut)) {\r\n // Check for override\r\n const override = this.overrides.get(shortcutId);\r\n if (override && !this.matchesOverride(event, override)) {\r\n continue; // Skip if override doesn't match\r\n }\r\n\r\n if (shortcut.preventDefault !== false) {\r\n event.preventDefault();\r\n }\r\n\r\n if (shortcut.stopPropagation) {\r\n event.stopPropagation();\r\n }\r\n\r\n console.log(`⌨️ [KeyboardShortcut] Executing shortcut: ${shortcutId}`);\r\n shortcut.action();\r\n break; // Only execute one shortcut per keydown\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if event matches shortcut\r\n */\r\n private matchesShortcut(event: KeyboardEvent, shortcut: KeyboardShortcut): boolean {\r\n return event.key === shortcut.key &&\r\n (shortcut.ctrlKey === undefined || event.ctrlKey === shortcut.ctrlKey) &&\r\n (shortcut.altKey === undefined || event.altKey === shortcut.altKey) &&\r\n (shortcut.shiftKey === undefined || event.shiftKey === shortcut.shiftKey) &&\r\n (shortcut.metaKey === undefined || event.metaKey === shortcut.metaKey);\r\n }\r\n\r\n /**\r\n * Check if event matches override\r\n */\r\n private matchesOverride(event: KeyboardEvent, override: ShortcutOverride): boolean {\r\n return event.key === override.newKey &&\r\n (override.newCtrlKey === undefined || event.ctrlKey === override.newCtrlKey) &&\r\n (override.newAltKey === undefined || event.altKey === override.newAltKey) &&\r\n (override.newShiftKey === undefined || event.shiftKey === override.newShiftKey) &&\r\n (override.newMetaKey === undefined || event.metaKey === override.newMetaKey);\r\n }\r\n\r\n /**\r\n * Get human-readable key description\r\n */\r\n private getKeyDescription(shortcut: Partial<KeyboardShortcut>): string {\r\n const modifiers = [];\r\n if (shortcut.ctrlKey) modifiers.push('Ctrl');\r\n if (shortcut.altKey) modifiers.push('Alt');\r\n if (shortcut.shiftKey) modifiers.push('Shift');\r\n if (shortcut.metaKey) modifiers.push('Meta');\r\n \r\n return [...modifiers, shortcut.key].join(' + ');\r\n }\r\n\r\n /**\r\n * Get key description for a shortcut ID\r\n */\r\n getKeyDescriptionForShortcut(shortcutId: string): string {\r\n const shortcut = this.shortcuts.get(shortcutId);\r\n if (!shortcut) return 'Not found';\r\n \r\n const override = this.overrides.get(shortcutId);\r\n if (override) {\r\n return this.getKeyDescription({\r\n key: override.newKey,\r\n ctrlKey: override.newCtrlKey,\r\n altKey: override.newAltKey,\r\n shiftKey: override.newShiftKey,\r\n metaKey: override.newMetaKey\r\n });\r\n }\r\n \r\n return this.getKeyDescription(shortcut);\r\n }\r\n}\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\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 { Directive, ElementRef, Input, OnInit, OnDestroy, inject, DestroyRef } from '@angular/core';\r\nimport { CideEleFileManagerService } from '../../services/file-manager.service';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { fileManagerControllerResponse } from '../../interfaces/core-file-manager.interface';\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 private readonly destroyRef = inject(DestroyRef);\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(this.destroyRef)\r\n ).subscribe({\r\n next: (fileDetails: fileManagerControllerResponse) => {\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 // Use base64 data directly\r\n if (fileData.cyfm_file_base64) {\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 base64 data available for file');\r\n }\r\n }\r\n\r\n}","import { Component, Input, inject, signal, OnInit, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { CideElementsService } from '../../utils/services/elements/elements.service';\r\n\r\n@Component({\r\n selector: 'cide-form-field-error',\r\n standalone: true,\r\n template: `\r\n @if (isFormGroupMode()) {\r\n <!-- Form Group Error Display -->\r\n @if (formErrors().length > 0) {\r\n <div class=\"tw-flex tw-items-center tw-gap-2 tw-text-red-600 tw-text-sm\">\r\n <cide-ele-icon class=\"tw-text-red-500\">error</cide-ele-icon>\r\n <span>{{ getFormGroupErrorMessage() }}</span>\r\n </div>\r\n }\r\n } @else {\r\n <!-- Individual Field Error Display -->\r\n @if (control && control.invalid && (control.dirty || control.touched)) {\r\n <div class=\"tw-text-red-500 tw-text-xs tw-mt-1 tw-flex tw-items-center tw-gap-1\">\r\n <cide-ele-icon class=\"tw-text-xs\">error</cide-ele-icon>\r\n <span>{{ getErrorMessage() }}</span>\r\n </div>\r\n }\r\n }\r\n `,\r\n imports: [CideIconComponent]\r\n})\r\nexport class CideFormFieldErrorComponent implements OnInit, OnChanges {\r\n @Input() control!: AbstractControl;\r\n @Input() formGroup!: FormGroup;\r\n @Input() fieldName: string = '';\r\n @Input() customMessages: { [key: string]: string } = {};\r\n\r\n // Map to store field labels for efficient lookup\r\n private fieldLabelsMap = new Map<string, string>();\r\n \r\n // Inject the element service\r\n private elementService = inject(CideElementsService);\r\n \r\n // Signal to hold form errors\r\n formErrors = signal<string[]>([]);\r\n\r\n ngOnInit(): void {\r\n if (this.isFormGroupMode()) {\r\n this.loadFormErrors();\r\n this.setupFormChangeListener();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['formGroup'] && this.isFormGroupMode()) {\r\n this.loadFormErrors();\r\n this.setupFormChangeListener();\r\n }\r\n }\r\n\r\n private setupFormChangeListener(): void {\r\n if (this.formGroup) {\r\n // Listen to form value changes to update errors\r\n this.formGroup.valueChanges.subscribe(() => {\r\n this.updateFormErrors();\r\n });\r\n \r\n // Listen to form status changes\r\n this.formGroup.statusChanges.subscribe(() => {\r\n this.updateFormErrors();\r\n });\r\n }\r\n }\r\n\r\n private updateFormErrors(): void {\r\n if (this.isFormGroupMode()) {\r\n this.loadFormErrors();\r\n }\r\n }\r\n\r\n private loadFormErrors(): void {\r\n this.getFormGroupErrors().then(errors => {\r\n this.formErrors.set(errors);\r\n });\r\n }\r\n\r\n isFormGroupMode(): boolean {\r\n return !!this.formGroup && !this.control;\r\n }\r\n\r\n getFormGroupErrors(): Promise<string[]> {\r\n if (!this.formGroup) return Promise.resolve([]);\r\n \r\n return this.buildFieldLabelsMap().then(() => {\r\n const errors: string[] = [];\r\n \r\n Object.keys(this.formGroup.controls).forEach(key => {\r\n const control = this.formGroup.get(key);\r\n \r\n if (control && control.invalid) {\r\n const errorMessage = this.getControlErrorMessage(control, key);\r\n if (errorMessage) {\r\n errors.push(errorMessage);\r\n }\r\n }\r\n });\r\n \r\n return errors;\r\n });\r\n }\r\n\r\n private buildFieldLabelsMap(): Promise<void> {\r\n if (this.fieldLabelsMap.size > 0) return Promise.resolve(); // Already built\r\n \r\n const promises = Object.keys(this.formGroup.controls).map(key => {\r\n return this.elementService?.getElementData({ sype_key: key }).then(elementData => {\r\n if (elementData?.sype_label) {\r\n this.fieldLabelsMap.set(key, elementData.sype_label as string);\r\n }\r\n }).catch(error => {\r\n // Silently handle errors - element data might not be available for all fields\r\n });\r\n });\r\n \r\n return Promise.all(promises).then(() => {\r\n // All promises completed\r\n });\r\n }\r\n\r\n\r\n getFormGroupErrorMessage(): string {\r\n const errors = this.formErrors();\r\n if (errors.length === 0) return '';\r\n \r\n if (errors.length === 1) {\r\n return errors[0];\r\n }\r\n \r\n return `Please fix the following errors: ${errors.join(', ')}`;\r\n }\r\n\r\n getControlErrorMessage(control: AbstractControl, fieldName: string): string {\r\n if (!control || !control.errors) {\r\n return '';\r\n }\r\n\r\n const errors = control.errors;\r\n \r\n // Get display name from map first, fallback to conversion\r\n const displayName = this.fieldLabelsMap.get(fieldName) || this.convertToDisplayName(fieldName);\r\n \r\n // Check for custom messages first\r\n for (const errorType in errors) {\r\n if (this.customMessages[errorType]) {\r\n return this.customMessages[errorType];\r\n }\r\n }\r\n\r\n // Default error messages\r\n if (errors['required']) {\r\n return `${displayName} is required`;\r\n }\r\n \r\n if (errors['email']) {\r\n return `${displayName} must be a valid email address`;\r\n }\r\n \r\n if (errors['minlength']) {\r\n return `${displayName} must be at least ${errors['minlength'].requiredLength} characters`;\r\n }\r\n \r\n if (errors['maxlength']) {\r\n return `${displayName} must not exceed ${errors['maxlength'].requiredLength} characters`;\r\n }\r\n \r\n if (errors['pattern']) {\r\n return `${displayName} format is invalid`;\r\n }\r\n\r\n // Fallback to first error\r\n const firstError = Object.keys(errors)[0];\r\n return `${displayName} is invalid`;\r\n }\r\n\r\n getErrorMessage(): string {\r\n if (!this.control || !this.control.errors) {\r\n return '';\r\n }\r\n\r\n const errors = this.control.errors;\r\n \r\n // Check for custom messages first\r\n for (const errorType in errors) {\r\n if (this.customMessages[errorType]) {\r\n return this.customMessages[errorType];\r\n }\r\n }\r\n\r\n // Default error messages\r\n if (errors['required']) {\r\n return `${this.getFieldDisplayName()} is required`;\r\n }\r\n \r\n if (errors['email']) {\r\n return `${this.getFieldDisplayName()} must be a valid email address`;\r\n }\r\n \r\n if (errors['minlength']) {\r\n return `${this.getFieldDisplayName()} must be at least ${errors['minlength'].requiredLength} characters`;\r\n }\r\n \r\n if (errors['maxlength']) {\r\n return `${this.getFieldDisplayName()} must not exceed ${errors['maxlength'].requiredLength} characters`;\r\n }\r\n \r\n if (errors['pattern']) {\r\n return `${this.getFieldDisplayName()} format is invalid`;\r\n }\r\n\r\n // Fallback to first error\r\n const firstError = Object.keys(errors)[0];\r\n return `${this.getFieldDisplayName()} is invalid`;\r\n }\r\n\r\n private getFieldDisplayName(): string {\r\n if (this.fieldName) {\r\n return this.fieldName;\r\n }\r\n \r\n // Convert field name to display name\r\n if (this.control && this.control.parent) {\r\n const fieldName = Object.keys(this.control.parent.controls).find(\r\n key => this.control.parent!.get(key) === this.control\r\n );\r\n \r\n if (fieldName) {\r\n return this.convertToDisplayName(fieldName);\r\n }\r\n }\r\n \r\n return 'This field';\r\n }\r\n\r\n private convertToDisplayName(fieldName: string): string {\r\n // Convert snake_case to Title Case\r\n return fieldName\r\n .split('_')\r\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\r\n .join(' ');\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';\r\nimport { CommonModule } from '@angular/common';\r\nimport { trigger, state, style, transition, animate } from '@angular/animations';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { NotificationService, NotificationItem } from '../../services/notification.service';\r\n\r\n@Component({\r\n selector: 'cide-ele-toast-notification',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n template: `\r\n <!-- Toast Container -->\r\n <div class=\"toast-container\">\r\n <div \r\n *ngFor=\"let notification of activeNotifications(); trackBy: trackByNotification\"\r\n class=\"toast-notification\"\r\n [class]=\"getToastClass(notification)\"\r\n [@toastAnimation]>\r\n \r\n <!-- Toast Content -->\r\n <div class=\"toast-content\">\r\n <!-- Icon -->\r\n <div class=\"toast-icon\" [class]=\"getIconClass(notification.type)\">\r\n <cide-ele-icon size=\"sm\">\r\n {{ notification.icon }}\r\n </cide-ele-icon>\r\n </div>\r\n \r\n <!-- Text Content -->\r\n <div class=\"toast-text\">\r\n <div *ngIf=\"notification.title\" class=\"toast-title\">\r\n {{ notification.title }}\r\n </div>\r\n <div class=\"toast-message\">\r\n {{ notification.message }}\r\n </div>\r\n </div>\r\n \r\n <!-- Close Button -->\r\n <button \r\n type=\"button\"\r\n class=\"toast-close\"\r\n (click)=\"removeNotification(notification.id)\"\r\n aria-label=\"Close notification\">\r\n <cide-ele-icon size=\"xs\">close</cide-ele-icon>\r\n </button>\r\n </div>\r\n \r\n <!-- Undo Button -->\r\n <div *ngIf=\"notification.showUndo\" class=\"toast-actions\">\r\n <button \r\n type=\"button\"\r\n class=\"toast-undo-btn\"\r\n (click)=\"executeUndo(notification.id)\">\r\n {{ notification.undoText }}\r\n </button>\r\n </div>\r\n \r\n <!-- Progress Bar -->\r\n <div \r\n *ngIf=\"notification.duration > 0 && !notification.showProgress\"\r\n class=\"toast-progress\"\r\n [style.animation-duration]=\"notification.duration + 'ms'\">\r\n </div>\r\n \r\n <!-- Custom Progress Bar -->\r\n <div \r\n *ngIf=\"notification.showProgress\"\r\n class=\"toast-custom-progress\">\r\n <div \r\n class=\"toast-custom-progress-bar\"\r\n [style.width.%]=\"notification.progress || 0\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .toast-container {\r\n position: fixed;\r\n top: 80px;\r\n right: 20px;\r\n z-index: 9990;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n max-width: 400px;\r\n width: 100%;\r\n }\r\n\r\n .toast-notification {\r\n background: white;\r\n border-radius: 8px;\r\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\r\n border: 1px solid #e5e7eb;\r\n overflow: hidden;\r\n position: relative;\r\n animation: slideInRight 0.3s ease-out;\r\n }\r\n\r\n .toast-notification.success {\r\n border-left: 4px solid #16a34a;\r\n }\r\n\r\n .toast-notification.error {\r\n border-left: 4px solid #dc2626;\r\n }\r\n\r\n .toast-notification.warning {\r\n border-left: 4px solid #d97706;\r\n }\r\n\r\n .toast-notification.info {\r\n border-left: 4px solid #2563eb;\r\n }\r\n\r\n .toast-content {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n padding: 16px;\r\n }\r\n\r\n .toast-icon {\r\n width: 24px;\r\n height: 24px;\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 margin-top: 2px;\r\n }\r\n\r\n .toast-icon.success {\r\n background-color: #f0fdf4;\r\n color: #16a34a;\r\n }\r\n\r\n .toast-icon.error {\r\n background-color: #fef2f2;\r\n color: #dc2626;\r\n }\r\n\r\n .toast-icon.warning {\r\n background-color: #fffbeb;\r\n color: #d97706;\r\n }\r\n\r\n .toast-icon.info {\r\n background-color: #eff6ff;\r\n color: #2563eb;\r\n }\r\n\r\n .toast-text {\r\n flex: 1;\r\n min-width: 0;\r\n }\r\n\r\n .toast-title {\r\n font-size: 14px;\r\n font-weight: 600;\r\n color: #111827;\r\n margin-bottom: 4px;\r\n line-height: 1.4;\r\n }\r\n\r\n .toast-message {\r\n font-size: 14px;\r\n color: #6b7280;\r\n line-height: 1.4;\r\n }\r\n\r\n .toast-close {\r\n background: none;\r\n border: none;\r\n color: #9ca3af;\r\n cursor: pointer;\r\n padding: 4px;\r\n border-radius: 4px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: all 0.2s ease;\r\n flex-shrink: 0;\r\n }\r\n\r\n .toast-close:hover {\r\n background-color: #f3f4f6;\r\n color: #6b7280;\r\n }\r\n\r\n .toast-actions {\r\n padding: 0 16px 16px;\r\n display: flex;\r\n justify-content: flex-end;\r\n }\r\n\r\n .toast-undo-btn {\r\n background: none;\r\n border: none;\r\n color: #2563eb;\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n transition: all 0.2s ease;\r\n }\r\n\r\n .toast-undo-btn:hover {\r\n background-color: #eff6ff;\r\n }\r\n\r\n .toast-progress {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n height: 3px;\r\n background-color: #e5e7eb;\r\n animation: progressShrink linear forwards;\r\n }\r\n\r\n .toast-notification.success .toast-progress {\r\n background-color: #16a34a;\r\n }\r\n\r\n .toast-notification.error .toast-progress {\r\n background-color: #dc2626;\r\n }\r\n\r\n .toast-notification.warning .toast-progress {\r\n background-color: #d97706;\r\n }\r\n\r\n .toast-notification.info .toast-progress {\r\n background-color: #2563eb;\r\n }\r\n\r\n /* Custom Progress Bar */\r\n .toast-custom-progress {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n height: 3px;\r\n background-color: #e5e7eb;\r\n overflow: hidden;\r\n }\r\n\r\n .toast-custom-progress-bar {\r\n height: 100%;\r\n background-color: #2563eb;\r\n transition: width 0.3s ease;\r\n border-radius: 0 3px 0 0;\r\n }\r\n\r\n .toast-notification.success .toast-custom-progress-bar {\r\n background-color: #16a34a;\r\n }\r\n\r\n .toast-notification.error .toast-custom-progress-bar {\r\n background-color: #dc2626;\r\n }\r\n\r\n .toast-notification.warning .toast-custom-progress-bar {\r\n background-color: #d97706;\r\n }\r\n\r\n .toast-notification.info .toast-custom-progress-bar {\r\n background-color: #2563eb;\r\n }\r\n\r\n /* Animations */\r\n @keyframes slideInRight {\r\n from {\r\n transform: translateX(100%);\r\n opacity: 0;\r\n }\r\n to {\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n }\r\n\r\n @keyframes slideOutRight {\r\n from {\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n to {\r\n transform: translateX(100%);\r\n opacity: 0;\r\n }\r\n }\r\n\r\n @keyframes progressShrink {\r\n from {\r\n width: 100%;\r\n }\r\n to {\r\n width: 0%;\r\n }\r\n }\r\n\r\n /* Responsive Design */\r\n @media (max-width: 640px) {\r\n .toast-container {\r\n top: 80px;\r\n right: 10px;\r\n left: 10px;\r\n max-width: none;\r\n }\r\n\r\n .toast-notification {\r\n border-radius: 6px;\r\n }\r\n\r\n .toast-content {\r\n padding: 12px;\r\n }\r\n\r\n .toast-actions {\r\n padding: 0 12px 12px;\r\n }\r\n }\r\n\r\n /* Focus styles for accessibility */\r\n .toast-close:focus,\r\n .toast-undo-btn:focus {\r\n outline: 2px solid #2563eb;\r\n outline-offset: 2px;\r\n }\r\n `],\r\n animations: [\r\n trigger('toastAnimation', [\r\n state('void', style({\r\n transform: 'translateX(100%)',\r\n opacity: 0\r\n })),\r\n state('*', style({\r\n transform: 'translateX(0)',\r\n opacity: 1\r\n })),\r\n transition('void => *', animate('300ms ease-out')),\r\n transition('* => void', animate('200ms ease-in'))\r\n ])\r\n ]\r\n})\r\nexport class CideEleToastNotificationComponent {\r\n private notificationService = inject(NotificationService);\r\n\r\n // Signals\r\n activeNotifications = this.notificationService.getActiveNotifications();\r\n\r\n // Methods\r\n getToastClass(notification: NotificationItem): string {\r\n return `toast-${notification.type}`;\r\n }\r\n\r\n getIconClass(type: string): string {\r\n return `toast-icon ${type}`;\r\n }\r\n\r\n removeNotification(id: string): void {\r\n this.notificationService.remove(id);\r\n }\r\n\r\n executeUndo(id: string): void {\r\n this.notificationService.executeUndo(id);\r\n }\r\n\r\n trackByNotification(index: number, notification: NotificationItem): string {\r\n return notification.id;\r\n }\r\n}\r\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","// Data Grid Configuration Types for CideEleDataGrid Component\r\n\r\nexport type ColumnType = 'text' | 'number' | 'date' | 'boolean' | 'status' | 'actions' | 'custom' | 'order';\r\nexport type ColumnWidth = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'auto' | string;\r\nexport type TextAlign = 'left' | 'center' | 'right';\r\n\r\nexport interface GridColumn {\r\n key: string;\r\n header: string;\r\n type: ColumnType;\r\n width?: ColumnWidth;\r\n sortable?: boolean;\r\n searchable?: boolean;\r\n truncate?: boolean;\r\n align?: TextAlign;\r\n renderer?: string; // For custom rendering\r\n valueGetter?: string; // Path to nested property (e.g., 'contact.email')\r\n formatter?: GridFormatter;\r\n actions?: GridAction[];\r\n statusConfig?: StatusConfig;\r\n filterable?: boolean; // Enable column filtering\r\n filterType?: 'text' | 'number' | 'date' | 'select' | 'custom'; // Filter type\r\n filterOptions?: Array<{ label: string; value: unknown }>; // Options for select filters\r\n filterRenderer?: string; // Custom filter template renderer\r\n groupable?: boolean; // Enable grouping by this column\r\n aggregatable?: boolean; // Enable aggregation for this column\r\n aggregationType?: 'sum' | 'avg' | 'count' | 'min' | 'max'; // Aggregation type\r\n resizable?: boolean; // Enable column resizing\r\n hideable?: boolean; // Can be hidden/shown\r\n hidden?: boolean; // Initial hidden state\r\n}\r\n\r\nexport interface GridFormatter {\r\n type: 'date' | 'currency' | 'percentage' | 'custom';\r\n format?: string; // Date format, currency code, etc.\r\n customFunction?: string; // Name of custom formatter function\r\n}\r\n\r\nexport interface StatusConfig {\r\n activeValue: string | number | boolean;\r\n activeLabel: string;\r\n inactiveLabel: string;\r\n activeClass: string;\r\n inactiveClass: string;\r\n}\r\n\r\nexport interface GridAction {\r\n key: string;\r\n label: string;\r\n icon: string;\r\n variant: 'ghost' | 'primary' | 'outline' | 'danger';\r\n tooltip?: string;\r\n condition?: string; // Condition to show action (e.g., 'entity.isActive')\r\n onClick: string; // Function name to call\r\n}\r\n\r\nexport interface GridPaginationConfig {\r\n enabled: boolean;\r\n pageSize: number;\r\n pageSizeOptions: number[];\r\n showQuickJump: boolean;\r\n showPageInfo: boolean;\r\n showRefresh: boolean;\r\n}\r\n\r\nexport interface GridSearchConfig {\r\n enabled: boolean;\r\n placeholder: string;\r\n searchableColumns: string[]; // Column keys to search in\r\n debounceMs?: number;\r\n}\r\n\r\nexport interface GridExportConfig {\r\n enabled: boolean;\r\n formats: ('csv' | 'excel' | 'pdf')[];\r\n filename?: string;\r\n}\r\n\r\nexport interface GridLoadingConfig {\r\n useDefer: boolean;\r\n skeletonRows: number;\r\n showOverlay: boolean;\r\n}\r\n\r\nexport interface GridScrollConfig {\r\n enabled: boolean;\r\n maxHeight?: string; // e.g., '400px', '50vh', 'calc(100vh - 200px)'\r\n minHeight?: string; // e.g., '200px'\r\n stickyHeader?: boolean; // Keep header visible when scrolling\r\n virtualScroll?: boolean; // Enable virtual scrolling for large datasets\r\n rowHeight?: number; // Height of each row in pixels (for virtual scroll)\r\n}\r\n\r\nexport interface GridTreeConfig {\r\n enabled: boolean;\r\n primaryKey: string; // Primary key field name (e.g., '_id')\r\n foreignKey: string; // Foreign key field name (e.g., 'syme_id_syme')\r\n childrenKey?: string; // Children array field name (default: 'children')\r\n levelKey?: string; // Level field name (default: 'level')\r\n expandedKey?: string; // Expanded state field name (default: 'isExpanded')\r\n hasChildrenKey?: string; // Has children field name (default: 'hasChildren')\r\n}\r\n\r\nexport interface GridDragDropConfig {\r\n enabled: boolean;\r\n dragHandle?: string; // CSS selector for drag handle (default: 'tr')\r\n orderField?: string; // Field name for storing order (default: 'order')\r\n dragClass?: string; // CSS class to apply to dragged element\r\n dropClass?: string; // CSS class to apply to drop target\r\n}\r\n\r\nexport interface GridColumnMenuConfig {\r\n enabled: boolean;\r\n showSort?: boolean; // Show sort options (Ascending/Descending)\r\n showFilter?: boolean; // Show filter option\r\n showAutosize?: boolean; // Show autosize option\r\n showGroupBy?: boolean; // Show group by column option\r\n showManageColumns?: boolean; // Show manage columns option\r\n showResetColumns?: boolean; // Show reset columns option\r\n showHideColumn?: boolean; // Show hide column option\r\n showAggregation?: boolean; // Show aggregation select option\r\n}\r\n\r\nexport interface ColumnFilter {\r\n columnKey: string;\r\n value: unknown;\r\n operator?: 'equals' | 'contains' | 'startsWith' | 'endsWith' | 'gt' | 'lt' | 'gte' | 'lte' | 'in';\r\n}\r\n\r\nexport interface ColumnSort {\r\n columnKey: string;\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface ColumnGroup<T = Record<string, unknown>> {\r\n columnKey: string;\r\n groups: Map<unknown, T[]>;\r\n}\r\n\r\nexport interface GridConfiguration<T = Record<string, unknown>> {\r\n // Basic Configuration\r\n id: string;\r\n title?: string;\r\n subtitle?: string;\r\n columns: GridColumn[];\r\n \r\n // Data Configuration\r\n data: T[];\r\n trackBy?: string; // Property to track items by (default: 'id' or '_id')\r\n \r\n // Feature Configuration\r\n pagination: GridPaginationConfig;\r\n search: GridSearchConfig;\r\n export?: GridExportConfig;\r\n loading: GridLoadingConfig;\r\n scroll?: GridScrollConfig;\r\n tree?: GridTreeConfig; // Tree structure configuration\r\n dragDrop?: GridDragDropConfig; // Drag and drop configuration\r\n columnMenu?: GridColumnMenuConfig; // Column menu configuration\r\n \r\n // Styling Configuration\r\n responsive: boolean;\r\n striped?: boolean;\r\n bordered?: boolean;\r\n compact?: boolean;\r\n fullHeight?: boolean; // Enable full height mode for empty tables\r\n \r\n // Event Handlers (function names)\r\n onRowClick?: string;\r\n onSort?: string;\r\n onPageChange?: string;\r\n onSearch?: string;\r\n onRefresh?: string;\r\n onExport?: string;\r\n onRowReorder?: string; // Row reorder event handler\r\n \r\n // Custom Classes\r\n tableClass?: string;\r\n headerClass?: string;\r\n rowClass?: string;\r\n cellClass?: string;\r\n}\r\n\r\nexport interface GridState<T = Record<string, unknown>> {\r\n currentPage: number;\r\n pageSize: number;\r\n totalItems: number;\r\n totalPages: number;\r\n searchQuery: string;\r\n sortColumn?: string;\r\n sortDirection?: 'asc' | 'desc';\r\n loading: boolean;\r\n isRefreshing: boolean;\r\n selectedRows: T[];\r\n}\r\n\r\nexport interface GridEvent<T = Record<string, unknown>> {\r\n type: 'rowClick' | 'sort' | 'pageChange' | 'search' | 'refresh' | 'export' | 'action' | 'rowReorder' | \r\n 'columnFilter' | 'columnSort' | 'columnAutosize' | 'columnGroupBy' | 'columnHide' | 'columnShow' | \r\n 'columnReset' | 'columnAggregation' | 'manageColumns';\r\n data: T | T[] | string | number | null | {\r\n sourceItem: T;\r\n sourceIndex: number;\r\n targetItem: T;\r\n targetIndex: number;\r\n newOrder: T[];\r\n allOrders?: T[]; // Complete order for reference when only changed orders are sent\r\n } | ColumnFilter | ColumnFilter[] | ColumnSort | { columnKey: string; aggregationType: string };\r\n column?: GridColumn;\r\n action?: GridAction;\r\n filters?: ColumnFilter[]; // Active filters\r\n sorts?: ColumnSort[]; // Active sorts\r\n}\r\n\r\n// Default configurations\r\nexport const DEFAULT_GRID_CONFIG: Partial<GridConfiguration> = {\r\n pagination: {\r\n enabled: true,\r\n pageSize: 10,\r\n pageSizeOptions: [10, 25, 50, 100],\r\n showQuickJump: true,\r\n showPageInfo: true,\r\n showRefresh: true\r\n },\r\n search: {\r\n enabled: true,\r\n placeholder: 'Search...',\r\n searchableColumns: [],\r\n debounceMs: 300\r\n },\r\n loading: {\r\n useDefer: true,\r\n skeletonRows: 5,\r\n showOverlay: false\r\n },\r\n scroll: {\r\n enabled: false,\r\n maxHeight: '400px',\r\n minHeight: '200px',\r\n stickyHeader: true,\r\n virtualScroll: false,\r\n rowHeight: 40\r\n },\r\n columnMenu: {\r\n enabled: true,\r\n showSort: true,\r\n showFilter: true,\r\n showAutosize: true,\r\n showGroupBy: true,\r\n showManageColumns: true,\r\n showResetColumns: true,\r\n showHideColumn: true,\r\n showAggregation: true\r\n },\r\n responsive: true,\r\n striped: false,\r\n bordered: true,\r\n compact: true,\r\n fullHeight: true\r\n};\r\n\r\n// Utility types for type safety\r\nexport type GridEventHandler<T = Record<string, unknown>> = (event: GridEvent<T>) => void;\r\nexport type GridCustomRenderer<T = Record<string, unknown>> = (value: unknown, row: T, column: GridColumn) => string;\r\nexport type GridCustomFormatter = (value: unknown, format?: string) => string; ","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges, SimpleChange, signal, computed, TemplateRef } from '@angular/core';\r\nimport { CommonModule, NgTemplateOutlet } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { \r\n GridConfiguration, \r\n GridColumn, \r\n GridEvent, \r\n GridAction,\r\n DEFAULT_GRID_CONFIG,\r\n ColumnWidth,\r\n StatusConfig,\r\n ColumnFilter,\r\n ColumnSort,\r\n GridColumnMenuConfig\r\n} from './data-grid.types';\r\nimport { CideInputComponent } from '../../elements/input/input.component';\r\nimport { CideSelectComponent } from '../../elements/select/select.component';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { inputType } from 'cloud-ide-lms-model';\r\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\r\n\r\n// Enhanced types for template support\r\nexport interface TemplateContext<T = Record<string, unknown>> {\r\n $implicit: unknown;\r\n row: T;\r\n value: unknown;\r\n column: GridColumn;\r\n}\r\n\r\nexport type TemplateRenderer<T = Record<string, unknown>> = TemplateRef<TemplateContext<T>>;\r\n\r\n@Component({\r\n selector: 'cide-ele-data-grid',\r\n standalone: true,\r\n imports: [\r\n CommonModule, \r\n NgTemplateOutlet,\r\n FormsModule,\r\n CideInputComponent,\r\n CideSelectComponent,\r\n CideIconComponent,\r\n CideEleButtonComponent\r\n ],\r\n templateUrl: './data-grid.component.html',\r\n styleUrls: ['./data-grid.component.scss']\r\n})\r\nexport class CideEleDataGridComponent<T = Record<string, unknown>> implements OnInit, OnChanges, OnDestroy {\r\n @Input() config!: GridConfiguration<T>;\r\n @Input() templateRenderers: Record<string, unknown> = {};\r\n @Input() customFormatters: Record<string, (value: unknown, format?: string) => string> = {};\r\n @Input() actionHandlers: Record<string, (data: T, action?: GridAction) => void> = {};\r\n @Input() serverSidePagination = false;\r\n @Input() totalServerItems = 0;\r\n @Input() currentServerPage = 1;\r\n @Input() currentServerPageSize = 10;\r\n @Input() dragDropEnabled = false;\r\n\r\n @Output() gridEvent = new EventEmitter<GridEvent<T>>();\r\n\r\n // Internal state using Angular Signals\r\n private internalData = signal<T[]>([]);\r\n private filteredData = signal<T[]>([]);\r\n \r\n // Grid state\r\n currentPage = signal(1);\r\n pageSize = signal(10);\r\n totalItems = signal(0);\r\n totalPages = signal(0);\r\n searchQuery = signal('');\r\n loading = signal(false);\r\n isRefreshing = signal(false);\r\n pageChangeLoading = signal(false);\r\n jumpToPage = 1;\r\n isDragOverRow: number | null = null;\r\n isDragging = signal(false);\r\n hasOrderChanged = signal(false);\r\n private originalOrderIds: string[] = []; // Store only IDs for order tracking\r\n private initialDataOrderIds: string[] = []; // Store only IDs for initial order\r\n private rowOrderMap = new Map<string, { oldPosition: number; newPosition: number }>();\r\n private localReorderedData: T[] = []; // Local data for visual reordering\r\n private searchDebounceTimer?: ReturnType<typeof setTimeout>;\r\n private isDataUpdate = false;\r\n\r\n // Column menu state\r\n openColumnMenu = signal<string | null>(null); // Column key of open menu\r\n columnFilters = signal<ColumnFilter[]>([]); // Active column filters\r\n columnSorts = signal<ColumnSort[]>([]); // Active column sorts\r\n hiddenColumns = signal<string[]>([]); // Hidden column keys\r\n showFilterPanel = signal<string | null>(null); // Column key for active filter panel\r\n filterSearchTerm = signal<string>(''); // Search term for filter values\r\n\r\n // Computed properties\r\n hasNextPage = computed(() => this.currentPage() < this.totalPages());\r\n hasPreviousPage = computed(() => this.currentPage() > 1);\r\n \r\n // Merged configuration with defaults\r\n mergedConfig = signal<GridConfiguration<T>>(this.config);\r\n \r\n // Visible columns (excluding hidden)\r\n visibleColumns = computed(() => {\r\n const hidden = this.hiddenColumns();\r\n return this.mergedConfig().columns.filter(col => !hidden.includes(col.key) && !col.hidden);\r\n });\r\n\r\n ngOnInit() {\r\n this.initializeGrid();\r\n this.initializeOriginalOrder();\r\n \r\n // Add global click listener to close menus when clicking outside\r\n document.addEventListener('click', this.handleGlobalClick.bind(this));\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up search debounce timer\r\n if (this.searchDebounceTimer) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n \r\n // Remove global click listener\r\n document.removeEventListener('click', this.handleGlobalClick.bind(this));\r\n }\r\n \r\n private handleGlobalClick(event: MouseEvent): void {\r\n // Close column menu and filter panel when clicking outside\r\n const target = event.target as HTMLElement;\r\n const isInsideMenu = target.closest('.column-menu-dropdown');\r\n const isMenuTrigger = target.closest('.column-menu-trigger');\r\n \r\n if (!isInsideMenu && !isMenuTrigger) {\r\n this.closeColumnMenu();\r\n this.closeFilterPanel();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if (changes['config']) {\r\n // Store current search query to preserve it during re-initialization\r\n const currentSearchQuery = this.searchQuery();\r\n \r\n this.mergeConfigWithDefaults();\r\n \r\n // Check if this is a data-only update (same config except data)\r\n const isDataOnlyUpdate = this.isDataOnlyUpdate(changes['config']);\r\n \r\n if (isDataOnlyUpdate && this.serverSidePagination) {\r\n console.log('🔄 DataGrid: isDataOnlyUpdate', isDataOnlyUpdate);\r\n // For data-only updates, preserve search query and use updateDataOnly\r\n this.updateDataOnly(changes['config'].currentValue.data || []);\r\n if (currentSearchQuery) {\r\n // this.searchQuery.set(currentSearchQuery);\r\n }\r\n } else {\r\n // For full config changes, use initializeGrid\r\n this.initializeGrid();\r\n \r\n // Restore search query after initialization\r\n if (currentSearchQuery) {\r\n // this.searchQuery.set(currentSearchQuery);\r\n }\r\n }\r\n \r\n // Reinitialize original order when data changes\r\n this.initializeOriginalOrder();\r\n \r\n // Also refresh order tracking to ensure it's up to date\r\n this.refreshOrderTracking();\r\n }\r\n \r\n if (this.serverSidePagination) {\r\n if (changes['totalServerItems']) {\r\n // console.log('🔄 DataGrid: totalServerItems changed:', this.totalServerItems);\r\n this.totalItems.set(this.totalServerItems);\r\n this.updatePaginationState();\r\n }\r\n \r\n if (changes['currentServerPage']) {\r\n // console.log('🔄 DataGrid: currentServerPage changed:', this.currentServerPage);\r\n this.currentPage.set(this.currentServerPage);\r\n }\r\n \r\n if (changes['currentServerPageSize']) {\r\n // console.log('🔄 DataGrid: currentServerPageSize changed:', this.currentServerPageSize);\r\n this.pageSize.set(this.currentServerPageSize);\r\n this.updatePaginationState();\r\n }\r\n \r\n // Clear page change loading when server-side data is updated\r\n if (changes['config'] && this.pageChangeLoading()) {\r\n this.clearPageChangeLoading();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Check if the config change is only a data update\r\n */\r\n private isDataOnlyUpdate(change: SimpleChange): boolean {\r\n if (change.firstChange || !change.previousValue || !change.currentValue) {\r\n return false;\r\n }\r\n \r\n const prev = change.previousValue;\r\n const curr = change.currentValue;\r\n \r\n // Check if all properties except 'data' are the same\r\n const prevWithoutData = { ...prev };\r\n const currWithoutData = { ...curr };\r\n delete prevWithoutData.data;\r\n delete currWithoutData.data;\r\n \r\n return JSON.stringify(prevWithoutData) === JSON.stringify(currWithoutData);\r\n }\r\n\r\n /**\r\n * Update only the data without triggering full grid re-initialization\r\n * This prevents the search input and other UI state from being reset\r\n */\r\n private updateDataOnly(data: T[]) {\r\n let processedData = data;\r\n \r\n // Transform to tree structure if tree config is enabled\r\n if (this.mergedConfig().tree?.enabled) {\r\n // Preserve expansion state from current data before transforming\r\n const currentData = this.internalData();\r\n const expansionState = this.preserveTreeExpansionState(currentData);\r\n \r\n processedData = this.transformToTree(data);\r\n console.log('processedData', processedData);\r\n \r\n // Apply preserved expansion state to new tree data\r\n processedData = this.applyTreeExpansionState(processedData, expansionState);\r\n console.log('processedData with preserved expansion state', processedData);\r\n }\r\n \r\n this.internalData.set(processedData);\r\n console.log('processedData', processedData);\r\n // For server-side pagination, set filtered data directly\r\n if (this.serverSidePagination) {\r\n console.log('processedData', processedData);\r\n this.filteredData.set(processedData);\r\n } else {\r\n // For client-side pagination, apply filters\r\n this.applyFilters();\r\n }\r\n \r\n // Refresh order tracking when data changes\r\n this.refreshOrderTracking();\r\n \r\n this.clearPageChangeLoading();\r\n }\r\n\r\n private mergeConfigWithDefaults() {\r\n this.mergedConfig.set({\r\n ...DEFAULT_GRID_CONFIG,\r\n ...this.config,\r\n pagination: { ...DEFAULT_GRID_CONFIG.pagination!, ...this.config.pagination },\r\n search: { ...DEFAULT_GRID_CONFIG.search!, ...this.config.search },\r\n loading: { ...DEFAULT_GRID_CONFIG.loading!, ...this.config.loading },\r\n scroll: { ...DEFAULT_GRID_CONFIG.scroll!, ...this.config.scroll }\r\n } as GridConfiguration<T>);\r\n }\r\n\r\n private initializeGrid() {\r\n // Ensure we have valid data\r\n let data = this.config?.data || [];\r\n \r\n // Transform to tree structure if tree config is enabled\r\n if (this.mergedConfig().tree?.enabled) {\r\n // Preserve expansion state from current data before transforming\r\n const currentData = this.internalData();\r\n const expansionState = this.preserveTreeExpansionState(currentData);\r\n \r\n data = this.transformToTree(data);\r\n \r\n // Apply preserved expansion state to new tree data\r\n data = this.applyTreeExpansionState(data, expansionState);\r\n }\r\n \r\n this.internalData.set(data);\r\n \r\n // Set pagination values based on mode\r\n if (this.serverSidePagination) {\r\n this.currentPage.set(this.currentServerPage);\r\n this.pageSize.set(this.currentServerPageSize);\r\n this.totalItems.set(this.totalServerItems);\r\n // For server-side pagination, set filtered data directly without applying filters\r\n this.filteredData.set(data);\r\n } else {\r\n // Client-side pagination\r\n const pageSize = this.mergedConfig().pagination?.pageSize || 10;\r\n this.pageSize.set(pageSize);\r\n this.totalItems.set(data.length);\r\n // For client-side pagination, apply filters\r\n this.applyFilters();\r\n }\r\n \r\n this.updatePaginationState();\r\n \r\n // Initialize original order for drag and drop\r\n this.initializeOriginalOrder();\r\n \r\n // Also refresh order tracking to ensure it's up to date\r\n this.refreshOrderTracking();\r\n }\r\n\r\n /**\r\n * Get the unique identifier for an item\r\n */\r\n private getItemId(item: T): string | null {\r\n if (item && typeof item === 'object') {\r\n const id = (item as Record<string, unknown>)['_id'];\r\n return id ? String(id) : null;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Get the order value for an item from the config\r\n */\r\n private getItemOrder(item: T): number {\r\n const dragDropConfig = this.getDragDropConfig();\r\n if (dragDropConfig?.orderField) {\r\n const orderValue = this.getNestedValue(item, dragDropConfig.orderField);\r\n return typeof orderValue === 'number' ? orderValue : 0;\r\n }\r\n return 0;\r\n }\r\n\r\n /**\r\n * Initialize the original order for drag and drop\r\n */\r\n private initializeOriginalOrder(): void {\r\n if (this.isDragDropEnabled()) {\r\n // Get the full dataset from the config (not just displayedData)\r\n const fullData = this.mergedConfig().data || [];\r\n \r\n // Flatten the data to include all items (parents and children) for hierarchical structures\r\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\r\n \r\n // Completely build the order tracking from current data\r\n this.rowOrderMap.clear();\r\n this.initialDataOrderIds = [];\r\n \r\n // Build the order tracking with flattened data\r\n flattenedData.forEach((item, index) => {\r\n const itemId = this.getItemId(item);\r\n if (itemId) {\r\n const actualOrder = this.getItemOrder(item);\r\n this.initialDataOrderIds.push(itemId);\r\n this.rowOrderMap.set(itemId, {\r\n oldPosition: actualOrder || (index + 1), // Use actual order or fallback to index\r\n newPosition: actualOrder || (index + 1)\r\n });\r\n }\r\n });\r\n \r\n // Clear any existing local reordered data\r\n this.localReorderedData = [];\r\n \r\n console.log('🔍 Initial order tracking built from flattened dataset:', this.initialDataOrderIds.length, 'items (including children)');\r\n console.log('🔍 Initial order map created with actual order values:', Array.from(this.rowOrderMap.entries()));\r\n }\r\n }\r\n\r\n /**\r\n * Refresh order tracking with current data (called when data updates)\r\n */\r\n private refreshOrderTracking(): void {\r\n if (this.isDragDropEnabled()) {\r\n // Get the current full dataset\r\n const fullData = this.mergedConfig().data || [];\r\n \r\n // Flatten the data to include all items (parents and children) for hierarchical structures\r\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\r\n \r\n // Completely rebuild the order tracking from current data\r\n this.rowOrderMap.clear();\r\n this.initialDataOrderIds = [];\r\n \r\n // Rebuild the order tracking with flattened data\r\n flattenedData.forEach((item, index) => {\r\n const itemId = this.getItemId(item);\r\n if (itemId) {\r\n const actualOrder = this.getItemOrder(item);\r\n this.initialDataOrderIds.push(itemId);\r\n this.rowOrderMap.set(itemId, {\r\n oldPosition: actualOrder || (index + 1),\r\n newPosition: actualOrder || (index + 1)\r\n });\r\n }\r\n });\r\n \r\n // Clear any local reordered data since data has changed\r\n this.localReorderedData = [];\r\n this.hasOrderChanged.set(false);\r\n \r\n console.log('🔍 Order tracking completely rebuilt with current data:', this.initialDataOrderIds.length, 'items');\r\n }\r\n }\r\n\r\n // ===== Data Processing =====\r\n \r\n private applyFilters() {\r\n let filtered = [...this.internalData()];\r\n \r\n // Apply search filter only for client-side pagination\r\n // For server-side pagination, search is handled by the server\r\n if (!this.serverSidePagination) {\r\n const query = this.searchQuery()?.toLowerCase();\r\n if (query && this.mergedConfig().search.enabled) {\r\n filtered = filtered.filter(item => \r\n this.mergedConfig().search.searchableColumns.some(columnKey => {\r\n const value = this.getNestedValue(item, columnKey);\r\n return String(value || '')?.toLowerCase()?.includes(query);\r\n })\r\n );\r\n }\r\n }\r\n \r\n // Flatten tree structure for display if tree is enabled\r\n if (this.mergedConfig().tree?.enabled) {\r\n filtered = this.flattenTreeForDisplay(filtered);\r\n }\r\n \r\n this.filteredData.set(filtered);\r\n \r\n // For server-side pagination, totalItems should always be totalServerItems\r\n // For client-side pagination, totalItems should be the filtered data length\r\n if (this.serverSidePagination) {\r\n this.totalItems.set(this.totalServerItems);\r\n } else {\r\n this.totalItems.set(filtered.length);\r\n }\r\n \r\n this.updatePaginationState();\r\n }\r\n\r\n /**\r\n * Preserve tree expansion state from current data\r\n */\r\n private preserveTreeExpansionState(currentData: T[]): Map<string, boolean> {\r\n const expansionState = new Map<string, boolean>();\r\n const treeConfig = this.mergedConfig().tree;\r\n if (!treeConfig) return expansionState;\r\n \r\n const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\r\n \r\n const extractExpansionState = (items: T[]) => {\r\n items.forEach(item => {\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n if (itemId) {\r\n const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\r\n expansionState.set(itemId, isExpanded);\r\n }\r\n \r\n // Check for children recursively\r\n const children = this.getNestedValue(item, treeConfig.childrenKey || 'children') as T[] || [];\r\n if (children.length > 0) {\r\n extractExpansionState(children);\r\n }\r\n });\r\n };\r\n \r\n extractExpansionState(currentData);\r\n console.log('🔍 DataGrid: Preserved expansion state for', expansionState.size, 'items');\r\n return expansionState;\r\n }\r\n\r\n /**\r\n * Apply preserved tree expansion state to new data\r\n */\r\n private applyTreeExpansionState(data: T[], expansionState: Map<string, boolean>): T[] {\r\n const treeConfig = this.mergedConfig().tree;\r\n if (!treeConfig) return data;\r\n \r\n const { expandedKey = 'isExpanded', primaryKey, childrenKey = 'children' } = treeConfig;\r\n \r\n const applyToItems = (items: T[]): T[] => {\r\n return items.map(item => {\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n const isExpanded = expansionState.get(itemId) || false;\r\n \r\n const updatedItem = {\r\n ...item,\r\n [expandedKey]: isExpanded\r\n } as T;\r\n \r\n // Apply to children recursively\r\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\r\n if (children.length > 0) {\r\n this.setNestedValue(updatedItem, childrenKey, applyToItems(children));\r\n }\r\n \r\n return updatedItem;\r\n });\r\n };\r\n \r\n return applyToItems(data);\r\n }\r\n\r\n /**\r\n * Transform flat data to tree structure based on foreign key relationships\r\n */\r\n private transformToTree(data: T[]): T[] {\r\n console.log('transformToTree - input data:', data.length, 'items');\r\n const treeConfig = this.mergedConfig().tree;\r\n if (!treeConfig) return data;\r\n\r\n const { primaryKey, foreignKey, childrenKey = 'children', levelKey = 'level', expandedKey = 'isExpanded', hasChildrenKey = 'hasChildren' } = treeConfig;\r\n \r\n // Always add level key to each row during processing\r\n \r\n // Create a map for quick lookup\r\n const itemMap = new Map<string, T>();\r\n const processedItems = new Set<string>();\r\n const rootItems: T[] = [];\r\n\r\n // First pass: create tree items with default properties and level key\r\n data.forEach(item => {\r\n const treeItem = {\r\n ...item,\r\n [levelKey]: 0,\r\n level: 0, // Always add 'level' property for consistent access\r\n [expandedKey]: false,\r\n [hasChildrenKey]: false,\r\n [childrenKey]: []\r\n } as T;\r\n itemMap.set(String(this.getNestedValue(item, primaryKey) || ''), treeItem);\r\n });\r\n\r\n // Multi-pass hierarchy building to handle items in any order\r\n let remainingItems = [...data];\r\n const maxIterations = data.length; // Prevent infinite loops\r\n let iteration = 0;\r\n\r\n while (remainingItems.length > 0 && iteration < maxIterations) {\r\n const itemsToProcess = [...remainingItems];\r\n remainingItems = [];\r\n \r\n console.log(`Iteration ${iteration + 1}: Processing ${itemsToProcess.length} items`);\r\n\r\n itemsToProcess.forEach(item => {\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n const parentIdValue = this.getNestedValue(item, foreignKey);\r\n const parentId = parentIdValue !== null && parentIdValue !== undefined ? String(parentIdValue) : '';\r\n const treeItem = itemMap.get(itemId);\r\n \r\n // Skip if already processed\r\n if (processedItems.has(itemId)) {\r\n return;\r\n }\r\n\r\n if (treeItem && parentId && itemMap.has(parentId)) {\r\n // This is a child item - check if parent is processed or is a root\r\n const parent = itemMap.get(parentId)!;\r\n const parentParentId = this.getNestedValue(parent, foreignKey);\r\n const isParentRoot = !parentParentId || parentParentId === null || parentParentId === undefined;\r\n \r\n if (isParentRoot || processedItems.has(parentId)) {\r\n // Parent is processed or is root, we can process this child\r\n const parentChildren = this.getNestedValue(parent, childrenKey) as T[] || [];\r\n \r\n // Avoid adding duplicates\r\n const childExists = parentChildren.some(child => \r\n String(this.getNestedValue(child, primaryKey) || '') === itemId\r\n );\r\n \r\n if (!childExists) {\r\n // Calculate level based on parent - automatically set level key\r\n const parentLevel = this.getNestedValue(parent, 'level') as number || 0;\r\n const childLevel = parentLevel + 1;\r\n \r\n // Update child item with correct level\r\n const updatedTreeItem = {\r\n ...treeItem,\r\n [levelKey]: childLevel,\r\n level: childLevel // Always add 'level' property for consistent access\r\n } as T;\r\n itemMap.set(itemId, updatedTreeItem);\r\n \r\n // Add updated child to parent's children array\r\n parentChildren.push(updatedTreeItem);\r\n \r\n // Update parent properties\r\n const updatedParent = {\r\n ...parent,\r\n [childrenKey]: parentChildren,\r\n [hasChildrenKey]: true\r\n } as T;\r\n itemMap.set(parentId, updatedParent);\r\n \r\n processedItems.add(itemId);\r\n }\r\n } else {\r\n // Parent not processed yet, defer this item\r\n remainingItems.push(item);\r\n }\r\n } else if (treeItem) {\r\n // This is a root item - automatically set level to 0\r\n const updatedRootItem = {\r\n ...treeItem,\r\n [levelKey]: 0,\r\n level: 0 // Always add 'level' property for consistent access\r\n } as T;\r\n itemMap.set(itemId, updatedRootItem);\r\n \r\n if (!rootItems.some(rootItem => \r\n String(this.getNestedValue(rootItem, primaryKey) || '') === itemId\r\n )) {\r\n rootItems.push(updatedRootItem);\r\n processedItems.add(itemId);\r\n }\r\n }\r\n });\r\n\r\n iteration++;\r\n }\r\n\r\n // Handle any remaining unprocessed items as roots (orphaned items)\r\n remainingItems.forEach(item => {\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n if (!processedItems.has(itemId)) {\r\n const treeItem = itemMap.get(itemId);\r\n if (treeItem && !rootItems.includes(treeItem)) {\r\n console.log(`Adding orphaned item ${itemId} as root`);\r\n rootItems.push(treeItem);\r\n }\r\n }\r\n });\r\n\r\n // Final pass: Update hasChildren property for all items in the tree\r\n const updateHasChildren = (items: T[]) => {\r\n items.forEach((item, index) => {\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\r\n const hasChildren = children.length > 0;\r\n \r\n // Update the item with correct hasChildren property\r\n const updatedItem = {\r\n ...item,\r\n [hasChildrenKey]: hasChildren\r\n } as T;\r\n \r\n // Update in the map\r\n itemMap.set(itemId, updatedItem);\r\n \r\n // Update the item in the array\r\n items[index] = updatedItem;\r\n \r\n // Recursively update children\r\n if (children.length > 0) {\r\n updateHasChildren(children);\r\n }\r\n });\r\n };\r\n\r\n // Get updated root items from the map to ensure we have the latest versions\r\n const updatedRootItems = rootItems.map(rootItem => {\r\n const rootId = String(this.getNestedValue(rootItem, primaryKey) || '');\r\n return itemMap.get(rootId) || rootItem;\r\n });\r\n \r\n // Update all root items and their descendants\r\n updateHasChildren(updatedRootItems);\r\n \r\n console.log('transformToTree - root items:', updatedRootItems.length);\r\n console.log('CC - processed items:', processedItems.size);\r\n console.log('transformToTree - sample root item with level:', updatedRootItems[0]);\r\n return updatedRootItems;\r\n }\r\n\r\n /**\r\n * Recursively calculate item level in hierarchy for unlimited depth support\r\n */\r\n private calculateItemLevel(item: T, itemMap: Map<string, T>, primaryKey: string, foreignKey: string, levelKey: string): number {\r\n // Check if level is already set correctly\r\n const currentLevel = this.getNestedValue(item, levelKey) as number;\r\n if (currentLevel !== undefined && currentLevel > 0) {\r\n return currentLevel;\r\n }\r\n\r\n // Get parent information\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n const parentIdValue = this.getNestedValue(item, foreignKey);\r\n const parentId = parentIdValue !== null && parentIdValue !== undefined ? String(parentIdValue) : '';\r\n \r\n // If no parent, this is a root item (level 0)\r\n if (!parentId || !itemMap.has(parentId)) {\r\n return 0;\r\n }\r\n \r\n // Recursively calculate parent level and add 1\r\n const parent = itemMap.get(parentId)!;\r\n const parentLevel = this.calculateItemLevel(parent, itemMap, primaryKey, foreignKey, levelKey);\r\n \r\n // Update the item's level in the map\r\n const updatedItem = {\r\n ...item,\r\n [levelKey]: parentLevel + 1\r\n } as T;\r\n itemMap.set(itemId, updatedItem);\r\n \r\n return parentLevel + 1;\r\n }\r\n\r\n /**\r\n * Flatten tree structure for display, respecting expansion state with unlimited nesting\r\n */\r\n private flattenTreeForDisplay(treeItems: T[]): T[] {\r\n const result: T[] = [];\r\n const treeConfig = this.mergedConfig().tree;\r\n if (!treeConfig) return treeItems;\r\n \r\n const { childrenKey = 'children', expandedKey = 'isExpanded' } = treeConfig;\r\n \r\n const flatten = (items: T[], currentLevel: number = 0) => {\r\n items.forEach(item => {\r\n result.push(item);\r\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\r\n const isExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\r\n \r\n if (children.length > 0 && isExpanded) {\r\n console.log(`Flattening children for item at level ${currentLevel}, children count: ${children.length}`);\r\n flatten(children, currentLevel + 1);\r\n }\r\n });\r\n };\r\n \r\n flatten(treeItems);\r\n console.log('flattenTreeForDisplay - result:', result.length, 'items');\r\n return result;\r\n }\r\n\r\n /**\r\n * Toggle expand/collapse state of a tree item with unlimited nesting support\r\n */\r\n private toggleTreeExpand(item: T): void {\r\n const treeConfig = this.mergedConfig().tree;\r\n if (!treeConfig) return;\r\n \r\n const { expandedKey = 'isExpanded', primaryKey } = treeConfig;\r\n const currentExpanded = this.getNestedValue(item, expandedKey) as boolean || false;\r\n const itemId = String(this.getNestedValue(item, primaryKey) || '');\r\n \r\n console.log(`toggleTreeExpand - item: ${itemId}, current expanded: ${currentExpanded}`);\r\n \r\n // Update the expanded state\r\n const updatedItem = {\r\n ...item,\r\n [expandedKey]: !currentExpanded\r\n } as T;\r\n \r\n // Update the item in the tree structure recursively\r\n const updateItemInTree = (treeData: T[]): T[] => {\r\n return treeData.map(treeItem => {\r\n const treeItemId = String(this.getNestedValue(treeItem, primaryKey) || '');\r\n \r\n if (treeItemId === itemId) {\r\n console.log(`Found item to update: ${itemId}, new expanded state: ${!currentExpanded}`);\r\n return updatedItem;\r\n }\r\n \r\n // Check children recursively\r\n const children = this.getNestedValue(treeItem, 'children') as T[] || [];\r\n if (children.length > 0) {\r\n const updatedChildren = updateItemInTree(children);\r\n return {\r\n ...treeItem,\r\n children: updatedChildren\r\n } as T;\r\n }\r\n \r\n return treeItem;\r\n });\r\n };\r\n \r\n // Update the internal data\r\n const updatedData = updateItemInTree([...this.internalData()]);\r\n this.internalData.set(updatedData);\r\n \r\n // Re-apply filters to update the display\r\n this.applyFilters();\r\n }\r\n\r\n private updatePaginationState() {\r\n const total = Math.ceil(this.totalItems() / this.pageSize());\r\n this.totalPages.set(total);\r\n \r\n // Ensure current page is within bounds\r\n if (total === 0) {\r\n this.currentPage.set(1);\r\n } else if (this.currentPage() > total) {\r\n this.currentPage.set(total);\r\n }\r\n }\r\n\r\n // ===== Pagination Methods =====\r\n \r\n onPageChange(page: number | string) {\r\n console.log('🔄 DataGrid: onPageChange called with page:', page);\r\n const pageNum = typeof page === 'string' ? parseInt(page, 10) : page;\r\n console.log('🔄 DataGrid: Parsed page number:', pageNum, 'Total pages:', this.totalPages());\r\n \r\n if (pageNum >= 1 && pageNum <= this.totalPages()) {\r\n // Set page change loading state\r\n this.pageChangeLoading.set(true);\r\n console.log('🔄 DataGrid: Set page change loading to true');\r\n \r\n this.currentPage.set(pageNum);\r\n \r\n if (this.serverSidePagination) {\r\n const pageData = { page: pageNum, pageSize: this.pageSize() };\r\n console.log('🔄 DataGrid: Emitting pageChange event for server-side pagination:', pageData);\r\n // Emit page data object for server-side pagination\r\n this.emitEvent('pageChange', pageData as unknown as T);\r\n // Don't clear loading state here - let the parent component handle it\r\n // The loading state will be cleared when new data arrives via ngOnChanges\r\n } else {\r\n console.log('🔄 DataGrid: Emitting pageChange event for client-side pagination:', pageNum);\r\n // Emit simple page number for client-side pagination\r\n this.emitEvent('pageChange', pageNum);\r\n // Clear loading state for client-side pagination\r\n this.clearPageChangeLoading();\r\n }\r\n } else {\r\n console.log('🔄 DataGrid: Page number out of range, not emitting event');\r\n }\r\n }\r\n\r\n onPageSizeChange() {\r\n // Set page change loading state\r\n this.pageChangeLoading.set(true);\r\n \r\n this.currentPage.set(1);\r\n this.updatePaginationState();\r\n \r\n if (this.serverSidePagination) {\r\n // Emit page data object for server-side pagination\r\n this.emitEvent('pageChange', { page: 1, pageSize: this.pageSize() } as unknown as T);\r\n // Don't clear loading state here - let the parent component handle it\r\n // The loading state will be cleared when new data arrives via ngOnChanges\r\n } else {\r\n // Emit simple page number for client-side pagination\r\n this.emitEvent('pageChange', 1);\r\n // Clear loading state for client-side pagination\r\n this.clearPageChangeLoading();\r\n }\r\n }\r\n\r\n updatePageSize(value: string | number | string[]) {\r\n // Handle array case (shouldn't happen for page size, but just in case)\r\n const pageSizeValue = Array.isArray(value) ? value[0] : value;\r\n this.pageSize.set(+pageSizeValue);\r\n this.onPageSizeChange();\r\n }\r\n\r\n previousPage() {\r\n if (this.hasPreviousPage()) {\r\n this.onPageChange(this.currentPage() - 1);\r\n }\r\n }\r\n\r\n nextPage() {\r\n if (this.hasNextPage()) {\r\n this.onPageChange(this.currentPage() + 1);\r\n }\r\n }\r\n\r\n onJumpToPage() {\r\n if (this.jumpToPage >= 1 && this.jumpToPage <= this.totalPages()) {\r\n this.onPageChange(this.jumpToPage);\r\n }\r\n }\r\n\r\n getEnhancedPageNumbers(): (number | string)[] {\r\n const total = this.totalPages();\r\n const current = this.currentPage();\r\n const pages: (number | string)[] = [];\r\n \r\n if (total <= 7) {\r\n for (let i = 1; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push(1);\r\n \r\n if (current <= 4) {\r\n for (let i = 2; i <= 5; i++) {\r\n pages.push(i);\r\n }\r\n pages.push('...');\r\n pages.push(total);\r\n } else if (current >= total - 3) {\r\n pages.push('...');\r\n for (let i = total - 4; i <= total; i++) {\r\n pages.push(i);\r\n }\r\n } else {\r\n pages.push('...');\r\n for (let i = current - 1; i <= current + 1; i++) {\r\n pages.push(i);\r\n }\r\n pages.push('...');\r\n pages.push(total);\r\n }\r\n }\r\n \r\n return pages;\r\n }\r\n\r\n // ===== Search Methods =====\r\n \r\n updateSearchQuery(value: inputType) {\r\n console.log('updateSearchQuery', value);\r\n const searchValue = value as string;\r\n this.searchQuery.set(searchValue);\r\n \r\n // Clear any existing debounce timer\r\n if (this.searchDebounceTimer) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n \r\n // If search is cleared (empty), trigger search immediately without debounce\r\n if (!searchValue || searchValue.trim() === '') {\r\n console.log('Search cleared, triggering immediate search event');\r\n this.currentPage.set(1);\r\n if (this.serverSidePagination) {\r\n this.emitEvent('search', searchValue);\r\n } else {\r\n this.onSearch();\r\n }\r\n return;\r\n }\r\n \r\n // Apply debounce for non-empty search queries\r\n const debounceMs = this.mergedConfig().search.debounceMs || 300;\r\n this.searchDebounceTimer = setTimeout(() => {\r\n // Only emit search event for server-side pagination\r\n // Don't trigger any client-side filtering that might cause re-renders\r\n if (this.serverSidePagination) {\r\n this.currentPage.set(1);\r\n this.emitEvent('search', searchValue);\r\n } else {\r\n this.onSearch();\r\n }\r\n }, debounceMs);\r\n }\r\n \r\n onSearch() {\r\n this.currentPage.set(1);\r\n \r\n if (this.serverSidePagination) {\r\n // For server-side pagination, only emit the search event\r\n // Don't apply client-side filters as the server will handle the search\r\n this.emitEvent('search', this.searchQuery());\r\n } else {\r\n // For client-side pagination, apply filters locally\r\n this.applyFilters();\r\n this.emitEvent('search', this.searchQuery());\r\n }\r\n }\r\n\r\n // ===== Action Methods =====\r\n \r\n onRefresh() {\r\n this.isRefreshing.set(true);\r\n this.emitEvent('refresh', null);\r\n \r\n // The parent component should handle the actual refresh and call setRefreshing(false) when done\r\n // We don't auto-reset here to allow the parent to control the refresh state\r\n }\r\n\r\n // Method to allow parent components to control the refreshing state\r\n setRefreshing(isRefreshing: boolean) {\r\n this.isRefreshing.set(isRefreshing);\r\n }\r\n\r\n // Method to clear page change loading state when new data is received\r\n clearPageChangeLoading() {\r\n this.pageChangeLoading.set(false);\r\n }\r\n\r\n // ===== Tree View Helper Methods =====\r\n \r\n /**\r\n * Check if tree view is enabled\r\n */\r\n isTreeEnabled(): boolean {\r\n const enabled = this.mergedConfig().tree?.enabled || false;\r\n return enabled;\r\n }\r\n\r\n /**\r\n * Get tree configuration\r\n */\r\n getTreeConfig() {\r\n return this.mergedConfig().tree;\r\n }\r\n\r\n /**\r\n * Check if an item has children\r\n */\r\n hasChildren(item: T): boolean {\r\n const treeConfig = this.getTreeConfig();\r\n if (!treeConfig) return false;\r\n \r\n const { hasChildrenKey = 'hasChildren', childrenKey = 'children' } = treeConfig;\r\n \r\n // Check hasChildren property first\r\n const hasChildren = this.getNestedValue(item, hasChildrenKey) as boolean;\r\n if (hasChildren !== undefined) {\r\n return hasChildren;\r\n }\r\n \r\n // Fallback to checking children array\r\n const children = this.getNestedValue(item, childrenKey) as T[];\r\n return children && children.length > 0;\r\n }\r\n\r\n /**\r\n * Get item level in tree\r\n */\r\n getItemLevel(item: T): number {\r\n // Always try to get level from standard 'level' property first (set by transformToTree)\r\n let level = this.getNestedValue(item, 'level') as number;\r\n \r\n // If not found, try tree config level key\r\n if (level === undefined || level === null) {\r\n const treeConfig = this.getTreeConfig();\r\n if (treeConfig) {\r\n const { levelKey = 'level' } = treeConfig;\r\n level = this.getNestedValue(item, levelKey) as number || 0;\r\n } else {\r\n level = 0;\r\n }\r\n }\r\n \r\n return level;\r\n }\r\n\r\n /**\r\n * Check if item is expanded\r\n */\r\n isItemExpanded(item: T): boolean {\r\n const treeConfig = this.getTreeConfig();\r\n if (!treeConfig) return false;\r\n \r\n const { expandedKey = 'isExpanded' } = treeConfig;\r\n return this.getNestedValue(item, expandedKey) as boolean || false;\r\n }\r\n\r\n /**\r\n * Get tree indent style\r\n */\r\n getTreeIndentStyle(item: T): string {\r\n const level = this.getItemLevel(item);\r\n \r\n // Specific padding progression: Level 1=12px, Level 2=22px, Level 3=32px, Level 4=52px\r\n const basePadding = 12; // Base cell padding (replaces tw-px-3)\r\n let levelPadding = 0;\r\n \r\n switch (level) {\r\n case 0: // Level 1 (root)\r\n levelPadding = 0;\r\n break;\r\n case 1: // Level 2\r\n levelPadding = 10;\r\n break;\r\n case 2: // Level 3\r\n levelPadding = 20;\r\n break;\r\n case 3: // Level 4\r\n levelPadding = 40;\r\n break;\r\n default: // Level 5+\r\n levelPadding = 40 + ((level - 3) * 20); // Continue with 20px increments\r\n break;\r\n }\r\n \r\n const totalPadding = `${basePadding + levelPadding}px`;\r\n return totalPadding;\r\n }\r\n\r\n /**\r\n * Get tree level background class for visual distinction\r\n */\r\n getTreeLevelClass(item: T): string {\r\n const level = this.getItemLevel(item);\r\n if (level === 0) return 'tree-level-0'; // Root level\r\n if (level === 1) return 'tree-level-1'; // First child level \r\n if (level === 2) return 'tree-level-2'; // Second child level\r\n return 'tree-level-deep'; // Deep nesting (3+ levels)\r\n }\r\n\r\n // ===== Drag and Drop Helper Methods =====\r\n \r\n /**\r\n * Check if drag and drop is enabled\r\n */\r\n isDragDropEnabled(): boolean {\r\n return this.dragDropEnabled || this.mergedConfig().dragDrop?.enabled || false;\r\n }\r\n\r\n /**\r\n * Get drag and drop configuration\r\n */\r\n getDragDropConfig() {\r\n return this.mergedConfig().dragDrop;\r\n }\r\n\r\n /**\r\n * Handle drag start event\r\n */\r\n onDragStart(event: DragEvent, item: T, index: number): void {\r\n if (!this.isDragDropEnabled()) return;\r\n \r\n this.isDragging.set(true);\r\n \r\n // Store the current order IDs when drag starts for comparison\r\n this.originalOrderIds = this.displayedData.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\r\n console.log('🔍 Drag started, current order IDs stored:', this.originalOrderIds);\r\n \r\n const dragConfig = this.getDragDropConfig();\r\n const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\r\n \r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.setData('text/plain', JSON.stringify({ item, index }));\r\n }\r\n \r\n // Find the closest tr element and apply drag styles\r\n const rowElement = (event.target as HTMLElement).closest('tr');\r\n if (rowElement) {\r\n dragClass.split(' ').forEach(cls => rowElement.classList.add(cls));\r\n // Add additional visual feedback\r\n rowElement.style.transform = 'scale(1.02)';\r\n rowElement.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)';\r\n rowElement.style.zIndex = '1000';\r\n }\r\n }\r\n\r\n /**\r\n * Handle drag over event\r\n */\r\n onDragOver(event: DragEvent): void {\r\n if (!this.isDragDropEnabled()) return;\r\n \r\n event.preventDefault();\r\n event.dataTransfer!.dropEffect = 'move';\r\n \r\n // Find the row index from the closest tr element\r\n const rowElement = (event.target as HTMLElement).closest('tr');\r\n if (rowElement) {\r\n const tbody = rowElement.closest('tbody');\r\n if (tbody) {\r\n const rowIndex = Array.from(tbody.children).indexOf(rowElement);\r\n this.isDragOverRow = rowIndex;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle drag leave event\r\n */\r\n onDragLeave(event: DragEvent): void {\r\n console.log('onDragLeave', event);\r\n if (!this.isDragDropEnabled()) return;\r\n \r\n // Clear drag over row tracking\r\n this.isDragOverRow = null;\r\n }\r\n\r\n /**\r\n * Handle drop event\r\n */\r\n onDrop(event: DragEvent, targetItem: T, targetIndex: number): void {\r\n if (!this.isDragDropEnabled()) return;\r\n \r\n event.preventDefault();\r\n \r\n // Clear drag over row tracking\r\n this.isDragOverRow = null;\r\n \r\n try {\r\n const data = JSON.parse(event.dataTransfer!.getData('text/plain'));\r\n const sourceItem = data.item as T;\r\n const sourceIndex = data.index as number;\r\n \r\n if (sourceIndex !== targetIndex) {\r\n const newOrder = this.getNewOrder(sourceIndex, targetIndex);\r\n console.log('🔍 Drop completed, updating local order only:', { sourceItem, sourceIndex, targetItem, targetIndex, newOrder });\r\n \r\n // Update the row order map with new positions (LOCAL ONLY)\r\n this.updateRowOrderMap(newOrder);\r\n \r\n // Update local data for visual reordering (LOCAL ONLY)\r\n this.updateLocalDataOrder(newOrder);\r\n \r\n // Check if any row has changed position\r\n const hasActuallyChanged = this.checkIfOrderChanged();\r\n this.hasOrderChanged.set(hasActuallyChanged);\r\n console.log('🔍 Local order changed:', hasActuallyChanged);\r\n \r\n // IMPORTANT: DO NOT emit reorder event here - only store locally\r\n // External components will be updated only when \"Save Order\" is clicked\r\n console.log('🔍 Order change stored locally - external components not updated until save');\r\n } else {\r\n console.log('Source and target index are the same, skipping reorder');\r\n }\r\n } catch (error) {\r\n console.error('Error parsing drag data:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Handle drag end event\r\n */\r\n onDragEnd(event: DragEvent): void {\r\n if (!this.isDragDropEnabled()) return;\r\n \r\n this.isDragging.set(false);\r\n \r\n // Check if order has changed after drag ends\r\n const hasActuallyChanged = this.checkIfOrderChanged();\r\n this.hasOrderChanged.set(hasActuallyChanged);\r\n \r\n const dragConfig = this.getDragDropConfig();\r\n const dragClass = dragConfig?.dragClass || 'tw-opacity-50 tw-bg-blue-50';\r\n \r\n // Clear drag over row tracking\r\n this.isDragOverRow = null;\r\n \r\n // Find the closest tr element and remove drag styles\r\n const rowElement = (event.target as HTMLElement).closest('tr');\r\n if (rowElement) {\r\n dragClass.split(' ').forEach(cls => rowElement.classList.remove(cls));\r\n // Remove additional visual feedback\r\n rowElement.style.transform = '';\r\n rowElement.style.boxShadow = '';\r\n rowElement.style.zIndex = '';\r\n }\r\n }\r\n\r\n /**\r\n * Calculate new order after reordering\r\n */\r\n private getNewOrder(sourceIndex: number, targetIndex: number): T[] {\r\n const data = [...this.displayedData];\r\n const [movedItem] = data.splice(sourceIndex, 1);\r\n data.splice(targetIndex, 0, movedItem);\r\n return data;\r\n }\r\n\r\n /**\r\n * Get the current order number for a specific item\r\n */\r\n getCurrentOrderNumber(item: T): number {\r\n const itemId = this.getItemId(item);\r\n if (itemId && this.rowOrderMap.has(itemId)) {\r\n return this.rowOrderMap.get(itemId)!.newPosition;\r\n }\r\n \r\n // Fallback to actual order field value from config\r\n const actualOrder = this.getItemOrder(item);\r\n if (actualOrder > 0) {\r\n return actualOrder;\r\n }\r\n \r\n // Final fallback to index-based calculation\r\n const currentIndex = this.displayedData.findIndex(currentItem => {\r\n if (item && currentItem && typeof item === 'object' && typeof currentItem === 'object') {\r\n const itemId = (item as Record<string, unknown>)['_id'];\r\n const currentItemId = (currentItem as Record<string, unknown>)['_id'];\r\n return itemId && currentItemId && itemId === currentItemId;\r\n }\r\n return item === currentItem;\r\n });\r\n return currentIndex >= 0 ? currentIndex + 1 : 0;\r\n }\r\n\r\n /**\r\n * Update the row order map with new positions after reordering\r\n */\r\n private updateRowOrderMap(newOrder: T[]): void {\r\n newOrder.forEach((item, index) => {\r\n const itemId = this.getItemId(item);\r\n if (itemId && this.rowOrderMap.has(itemId)) {\r\n const currentEntry = this.rowOrderMap.get(itemId)!;\r\n // Calculate new order value based on position and original order field\r\n const dragDropConfig = this.getDragDropConfig();\r\n if (dragDropConfig?.orderField) {\r\n // Use the order field from config to calculate new order values\r\n const baseOrder = Math.min(...this.displayedData.map(item => this.getItemOrder(item)));\r\n const newOrderValue = baseOrder + index;\r\n currentEntry.newPosition = newOrderValue;\r\n \r\n // IMPORTANT: Update the actual sequence value in the item itself\r\n this.setNestedValue(item, dragDropConfig.orderField, newOrderValue);\r\n } else {\r\n // Fallback to index-based position\r\n const newOrderValue = index + 1;\r\n currentEntry.newPosition = newOrderValue;\r\n \r\n // Update the actual sequence value in the item itself\r\n if (dragDropConfig?.orderField) {\r\n this.setNestedValue(item, dragDropConfig.orderField, newOrderValue);\r\n }\r\n }\r\n this.rowOrderMap.set(itemId, currentEntry);\r\n }\r\n });\r\n \r\n console.log('🔍 Row order map updated with new order values:', Array.from(this.rowOrderMap.entries()));\r\n }\r\n\r\n /**\r\n * Check if any row has changed position by comparing old vs new positions\r\n */\r\n private checkIfOrderChanged(): boolean {\r\n for (const [itemId, orderInfo] of this.rowOrderMap) {\r\n if (orderInfo.oldPosition !== orderInfo.newPosition) {\r\n console.log('🔍 Order change detected for item:', itemId, orderInfo);\r\n return true;\r\n }\r\n }\r\n console.log('🔍 No order change detected');\r\n return false;\r\n }\r\n\r\n /**\r\n * Reset the row order map to original positions (for reset action)\r\n * Includes all items from hierarchical structure (parents and children)\r\n */\r\n private resetRowOrderMap(): void {\r\n // Get the current full dataset from the config (not cached data)\r\n const fullData = this.mergedConfig().data || [];\r\n \r\n // Flatten the data to include all items (parents and children) for hierarchical structures\r\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\r\n \r\n // Completely rebuild the order tracking from current data\r\n this.rowOrderMap.clear();\r\n this.initialDataOrderIds = [];\r\n \r\n // Rebuild the order tracking with flattened data\r\n flattenedData.forEach((item, index) => {\r\n const itemId = this.getItemId(item);\r\n if (itemId) {\r\n const actualOrder = this.getItemOrder(item);\r\n this.initialDataOrderIds.push(itemId);\r\n this.rowOrderMap.set(itemId, {\r\n oldPosition: actualOrder || (index + 1),\r\n newPosition: actualOrder || (index + 1)\r\n });\r\n }\r\n });\r\n \r\n // Clear any local reordered data\r\n this.localReorderedData = [];\r\n this.hasOrderChanged.set(false);\r\n \r\n console.log('🔍 Row order map completely rebuilt from flattened data:', this.initialDataOrderIds.length, 'items (including children)');\r\n }\r\n\r\n /**\r\n * Update the row order map baseline to current positions (for save action)\r\n * Includes all items from hierarchical structure (parents and children)\r\n */\r\n private updateRowOrderMapBaseline(): void {\r\n // Get the current full dataset from the config\r\n const fullData = this.mergedConfig().data || [];\r\n \r\n // Flatten the data to include all items (parents and children) for hierarchical structures\r\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\r\n \r\n // Completely rebuild the order tracking from current data\r\n this.rowOrderMap.clear();\r\n this.initialDataOrderIds = [];\r\n \r\n // Rebuild the order tracking with flattened data\r\n flattenedData.forEach((item, index) => {\r\n const itemId = this.getItemId(item);\r\n if (itemId) {\r\n const actualOrder = this.getItemOrder(item);\r\n this.initialDataOrderIds.push(itemId);\r\n this.rowOrderMap.set(itemId, {\r\n oldPosition: actualOrder || (index + 1),\r\n newPosition: actualOrder || (index + 1)\r\n });\r\n }\r\n });\r\n \r\n console.log('🔍 Row order map baseline completely rebuilt from flattened data:', this.initialDataOrderIds.length, 'items (including children)');\r\n }\r\n\r\n /**\r\n * Get the current order array from the row order map\r\n * Includes all items from hierarchical structure (parents and children)\r\n */\r\n private getCurrentOrderFromMap(): T[] {\r\n const orderedItems: Array<{ item: T; newPosition: number }> = [];\r\n \r\n // Get the full dataset from the config (not just displayedData)\r\n const fullData = this.mergedConfig().data || [];\r\n \r\n // Flatten the data to include all items (parents and children) for hierarchical structures\r\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\r\n \r\n // Collect all items with their new positions from the flattened dataset\r\n this.rowOrderMap.forEach((orderInfo, itemId) => {\r\n const item = flattenedData.find(dataItem => this.getItemId(dataItem) === itemId);\r\n if (item) {\r\n orderedItems.push({ item, newPosition: orderInfo.newPosition });\r\n }\r\n });\r\n \r\n // Sort by new position and return items in order\r\n return orderedItems\r\n .sort((a, b) => a.newPosition - b.newPosition)\r\n .map(orderedItem => orderedItem.item);\r\n }\r\n\r\n /**\r\n * Get only the items that have actually changed order\r\n * Includes all items from hierarchical structure (parents and children)\r\n */\r\n private getChangedOrders(): T[] {\r\n const changedItems: T[] = [];\r\n \r\n // Get the full dataset from the config\r\n const fullData = this.mergedConfig().data || [];\r\n \r\n // Flatten the data to include all items (parents and children) for hierarchical structures\r\n const flattenedData = this.flattenAllDataForOrderTracking(fullData);\r\n \r\n // Check each item to see if its position has changed\r\n this.rowOrderMap.forEach((orderInfo, itemId) => {\r\n const item = flattenedData.find(dataItem => this.getItemId(dataItem) === itemId);\r\n if (item && orderInfo.oldPosition !== orderInfo.newPosition) {\r\n changedItems.push(item);\r\n console.log('🔍 Item changed order:', itemId, 'from', orderInfo.oldPosition, 'to', orderInfo.newPosition);\r\n }\r\n });\r\n \r\n return changedItems;\r\n }\r\n\r\n /**\r\n * Flatten all data for order tracking (includes all hierarchical children)\r\n * This method ensures that all items (parents and children) are included in order tracking\r\n */\r\n private flattenAllDataForOrderTracking(data: T[]): T[] {\r\n const flattenedItems: T[] = [];\r\n \r\n const flattenItems = (items: T[]) => {\r\n items.forEach(item => {\r\n flattenedItems.push(item);\r\n \r\n // Check if item has children (for hierarchical data)\r\n const treeConfig = this.mergedConfig().tree;\r\n if (treeConfig?.enabled) {\r\n const childrenKey = treeConfig.childrenKey || 'children';\r\n const children = this.getNestedValue(item, childrenKey) as T[] || [];\r\n if (children.length > 0) {\r\n flattenItems(children);\r\n }\r\n }\r\n });\r\n };\r\n \r\n flattenItems(data);\r\n console.log('🔍 Flattened data for order tracking:', flattenedItems.length, 'items (including children)');\r\n return flattenedItems;\r\n }\r\n\r\n /**\r\n * Update local data order for visual reordering (LOCAL ONLY)\r\n */\r\n private updateLocalDataOrder(newOrder: T[]): void {\r\n // Store the reordered data locally for visual display\r\n this.localReorderedData = [...newOrder];\r\n console.log('🔍 Local data order updated for visual display:', this.localReorderedData.length, 'items');\r\n }\r\n\r\n /**\r\n * Check if the current order has changed from the initial order\r\n */\r\n private checkOrderChanged(currentOrder: T[]): boolean {\r\n if (this.initialDataOrderIds.length !== currentOrder.length) {\r\n return true;\r\n }\r\n \r\n // Create arrays of IDs to compare order\r\n const currentIds = currentOrder.map(item => this.getItemId(item)).filter(id => id !== null) as string[];\r\n \r\n // Compare the sequences\r\n for (let i = 0; i < this.initialDataOrderIds.length; i++) {\r\n if (this.initialDataOrderIds[i] !== currentIds[i]) {\r\n console.log('🔍 Order changed detected:', {\r\n position: i,\r\n initial: this.initialDataOrderIds[i],\r\n current: currentIds[i]\r\n });\r\n return true;\r\n }\r\n }\r\n \r\n console.log('🔍 No order change detected');\r\n return false;\r\n }\r\n\r\n onRowClick(item: T) {\r\n if (this.mergedConfig().onRowClick) {\r\n this.emitEvent('rowClick', item);\r\n }\r\n }\r\n\r\n onActionClick(item: T, action: GridAction) {\r\n // Handle tree expand/collapse actions\r\n if (action.key === 'toggle-expand' && this.mergedConfig().tree?.enabled) {\r\n this.toggleTreeExpand(item);\r\n }\r\n \r\n // Handle order management actions\r\n if (action.key === 'reset-order') {\r\n this.hasOrderChanged.set(false);\r\n // Reset the row order map to current positions (LOCAL ONLY)\r\n this.resetRowOrderMap();\r\n // Clear local reordered data to revert to original display\r\n this.localReorderedData = [];\r\n console.log('🔍 Reset clicked, row order map reset locally, visual display reverted');\r\n } else if (action.key === 'save-order') {\r\n // Check if there are any actual changes before proceeding\r\n const hasActualChanges = this.checkIfOrderChanged();\r\n if (!hasActualChanges) {\r\n console.log('🔍 No actual order changes detected, skipping save');\r\n this.hasOrderChanged.set(false);\r\n return;\r\n }\r\n\r\n // Get only the changed orders and emit them BEFORE clearing local data\r\n const changedOrders = this.getChangedOrders();\r\n if (changedOrders.length > 0) {\r\n console.log('🔍 Emitting rowReorder event with changed orders only:', changedOrders);\r\n console.log('🔍 Number of changed records:', changedOrders.length, 'out of', this.getCurrentOrderFromMap().length, 'total records');\r\n // Use the expected GridEvent structure for rowReorder\r\n this.emitEvent('rowReorder', {\r\n sourceItem: changedOrders[0], // First changed item as source\r\n sourceIndex: 0, // First position as source\r\n targetItem: changedOrders[changedOrders.length - 1], // Last changed item as target\r\n targetIndex: changedOrders.length - 1, // Last position as target\r\n newOrder: changedOrders, // Only the records whose order actually changed\r\n allOrders: this.getCurrentOrderFromMap() // Complete order for reference\r\n });\r\n }\r\n\r\n // DON'T clear the local data or reset the order map here\r\n // Let the parent component handle the data refresh after API call\r\n // The local data will be cleared when new data arrives via ngOnChanges\r\n console.log('🔍 Save clicked, rowReorder event emitted, preserving local data until API response');\r\n }\r\n \r\n if (this.actionHandlers[action.onClick]) {\r\n this.actionHandlers[action.onClick](item, action);\r\n }\r\n this.emitEvent('action', item, undefined, action);\r\n }\r\n\r\n // ===== Column Menu Methods =====\r\n \r\n toggleColumnMenu(columnKey: string, event?: Event) {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n const current = this.openColumnMenu();\r\n this.openColumnMenu.set(current === columnKey ? null : columnKey);\r\n }\r\n\r\n closeColumnMenu() {\r\n this.openColumnMenu.set(null);\r\n }\r\n\r\n isColumnMenuOpen(columnKey: string): boolean {\r\n return this.openColumnMenu() === columnKey;\r\n }\r\n\r\n onColumnSort(column: GridColumn, direction: 'asc' | 'desc') {\r\n const sorts = this.columnSorts();\r\n const existingIndex = sorts.findIndex(s => s.columnKey === column.key);\r\n \r\n if (existingIndex !== -1) {\r\n // Update existing sort\r\n sorts[existingIndex].direction = direction;\r\n } else {\r\n // Add new sort (replace existing for single column sort, or add for multi-column)\r\n sorts.push({ columnKey: column.key, direction });\r\n }\r\n \r\n this.columnSorts.set([...sorts]);\r\n this.emitEvent('columnSort', { columnKey: column.key, direction }, column);\r\n this.closeColumnMenu();\r\n }\r\n\r\n onColumnFilter(column: GridColumn, value: unknown, operator: ColumnFilter['operator'] = 'equals') {\r\n const filters = this.columnFilters();\r\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\r\n \r\n if (value === null || value === undefined || value === '') {\r\n // Remove filter\r\n if (existingIndex !== -1) {\r\n filters.splice(existingIndex, 1);\r\n }\r\n } else {\r\n const filter: ColumnFilter = { columnKey: column.key, value, operator };\r\n if (existingIndex !== -1) {\r\n // Update existing filter\r\n filters[existingIndex] = filter;\r\n } else {\r\n // Add new filter\r\n filters.push(filter);\r\n }\r\n }\r\n \r\n this.columnFilters.set([...filters]);\r\n this.emitEvent('columnFilter', filters, column);\r\n }\r\n\r\n onColumnAutosize(column: GridColumn) {\r\n this.emitEvent('columnAutosize', column.key, column);\r\n this.closeColumnMenu();\r\n }\r\n\r\n onColumnGroupBy(column: GridColumn) {\r\n this.emitEvent('columnGroupBy', column.key, column);\r\n this.closeColumnMenu();\r\n }\r\n\r\n onColumnHide(column: GridColumn) {\r\n const hidden = this.hiddenColumns();\r\n if (!hidden.includes(column.key)) {\r\n this.hiddenColumns.set([...hidden, column.key]);\r\n this.emitEvent('columnHide', column.key, column);\r\n }\r\n this.closeColumnMenu();\r\n }\r\n\r\n onColumnShow(columnKey: string) {\r\n const hidden = this.hiddenColumns();\r\n const index = hidden.indexOf(columnKey);\r\n if (index !== -1) {\r\n hidden.splice(index, 1);\r\n this.hiddenColumns.set([...hidden]);\r\n const column = this.mergedConfig().columns.find(c => c.key === columnKey);\r\n if (column) {\r\n this.emitEvent('columnShow', columnKey, column);\r\n }\r\n }\r\n }\r\n\r\n onColumnReset() {\r\n this.hiddenColumns.set([]);\r\n this.columnFilters.set([]);\r\n this.columnSorts.set([]);\r\n this.emitEvent('columnReset', null);\r\n this.closeColumnMenu();\r\n }\r\n\r\n onColumnAggregation(column: GridColumn, aggregationType: 'sum' | 'avg' | 'count' | 'min' | 'max') {\r\n this.emitEvent('columnAggregation', { columnKey: column.key, aggregationType }, column);\r\n this.closeColumnMenu();\r\n }\r\n\r\n onManageColumns() {\r\n this.emitEvent('manageColumns', null);\r\n this.closeColumnMenu();\r\n }\r\n\r\n getColumnFilterValue(columnKey: string): unknown {\r\n const filter = this.columnFilters().find(f => f.columnKey === columnKey);\r\n return filter?.value;\r\n }\r\n\r\n getColumnSortDirection(columnKey: string): 'asc' | 'desc' | null {\r\n const sort = this.columnSorts().find(s => s.columnKey === columnKey);\r\n return sort?.direction || null;\r\n }\r\n\r\n isColumnFiltered(columnKey: string): boolean {\r\n return this.columnFilters().some(f => f.columnKey === columnKey);\r\n }\r\n\r\n getActiveFilterCount(columnKey: string): number {\r\n const filter = this.columnFilters().find(f => f.columnKey === columnKey);\r\n if (filter && filter.operator === 'in' && Array.isArray(filter.value)) {\r\n return filter.value.length;\r\n }\r\n return 0;\r\n }\r\n\r\n toggleFilterPanel(columnKey: string, event?: Event) {\r\n if (event) {\r\n event.stopPropagation();\r\n }\r\n const current = this.showFilterPanel();\r\n this.showFilterPanel.set(current === columnKey ? null : columnKey);\r\n this.filterSearchTerm.set('');\r\n }\r\n\r\n closeFilterPanel() {\r\n this.showFilterPanel.set(null);\r\n this.filterSearchTerm.set('');\r\n }\r\n\r\n isFilterPanelOpen(columnKey: string): boolean {\r\n return this.showFilterPanel() === columnKey;\r\n }\r\n\r\n getUniqueColumnValues(column: GridColumn): Array<{ value: unknown; label: string; count: number; checked: boolean }> {\r\n const data = this.internalData();\r\n const values = new Map<unknown, number>();\r\n \r\n // Count occurrences of each value\r\n data.forEach(row => {\r\n const value = column.valueGetter \r\n ? this.getNestedValue(row, column.valueGetter)\r\n : (row as Record<string, unknown>)[column.key];\r\n \r\n const count = values.get(value) || 0;\r\n values.set(value, count + 1);\r\n });\r\n\r\n // Get active filter for this column\r\n const activeFilter = this.columnFilters().find(f => f.columnKey === column.key);\r\n const activeValues = activeFilter?.operator === 'in' && Array.isArray(activeFilter.value) \r\n ? activeFilter.value \r\n : [];\r\n\r\n // Convert to array and sort\r\n const result = Array.from(values.entries())\r\n .map(([value, count]) => ({\r\n value,\r\n label: this.formatFilterValue(value, column),\r\n count,\r\n checked: activeValues.length === 0 || activeValues.includes(value)\r\n }))\r\n .sort((a, b) => {\r\n // Sort by label\r\n if (a.label < b.label) return -1;\r\n if (a.label > b.label) return 1;\r\n return 0;\r\n });\r\n\r\n // Filter by search term\r\n const searchTerm = this.filterSearchTerm().toLowerCase();\r\n if (searchTerm) {\r\n return result.filter(item => item.label.toLowerCase().includes(searchTerm));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n formatFilterValue(value: unknown, column: GridColumn): string {\r\n if (value === null || value === undefined) return '(Blank)';\r\n if (typeof value === 'boolean') return value ? 'Yes' : 'No';\r\n if (value instanceof Date) return value.toLocaleDateString();\r\n return String(value);\r\n }\r\n\r\n toggleFilterValue(column: GridColumn, value: unknown, checked: boolean) {\r\n const filters = this.columnFilters();\r\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\r\n \r\n let selectedValues: unknown[] = [];\r\n \r\n if (existingIndex !== -1) {\r\n const existing = filters[existingIndex];\r\n selectedValues = Array.isArray(existing.value) ? [...existing.value] : [];\r\n } else {\r\n // If no filter exists, start with all values\r\n selectedValues = this.getUniqueColumnValues(column).map(v => v.value);\r\n }\r\n\r\n if (checked) {\r\n // Add value if not present\r\n if (!selectedValues.includes(value)) {\r\n selectedValues.push(value);\r\n }\r\n } else {\r\n // Remove value\r\n selectedValues = selectedValues.filter(v => v !== value);\r\n }\r\n\r\n // Apply filter\r\n if (selectedValues.length === 0 || selectedValues.length === this.getUniqueColumnValues(column).length) {\r\n // Remove filter if all or none selected\r\n if (existingIndex !== -1) {\r\n filters.splice(existingIndex, 1);\r\n }\r\n } else {\r\n const filter: ColumnFilter = {\r\n columnKey: column.key,\r\n value: selectedValues,\r\n operator: 'in'\r\n };\r\n \r\n if (existingIndex !== -1) {\r\n filters[existingIndex] = filter;\r\n } else {\r\n filters.push(filter);\r\n }\r\n }\r\n\r\n this.columnFilters.set([...filters]);\r\n this.emitEvent('columnFilter', filters, column);\r\n this.applyFiltersToData();\r\n }\r\n\r\n selectAllFilterValues(column: GridColumn) {\r\n const filters = this.columnFilters();\r\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\r\n \r\n if (existingIndex !== -1) {\r\n filters.splice(existingIndex, 1);\r\n this.columnFilters.set([...filters]);\r\n this.emitEvent('columnFilter', filters, column);\r\n this.applyFiltersToData();\r\n }\r\n }\r\n\r\n deselectAllFilterValues(column: GridColumn) {\r\n const filters = this.columnFilters();\r\n const existingIndex = filters.findIndex(f => f.columnKey === column.key);\r\n \r\n const filter: ColumnFilter = {\r\n columnKey: column.key,\r\n value: [],\r\n operator: 'in'\r\n };\r\n \r\n if (existingIndex !== -1) {\r\n filters[existingIndex] = filter;\r\n } else {\r\n filters.push(filter);\r\n }\r\n\r\n this.columnFilters.set([...filters]);\r\n this.emitEvent('columnFilter', filters, column);\r\n this.applyFiltersToData();\r\n }\r\n\r\n applyFiltersToData() {\r\n let filtered = [...this.internalData()];\r\n \r\n const filters = this.columnFilters();\r\n \r\n filters.forEach(filter => {\r\n const column = this.mergedConfig().columns.find(c => c.key === filter.columnKey);\r\n if (!column) return;\r\n\r\n filtered = filtered.filter(row => {\r\n const value = column.valueGetter \r\n ? this.getNestedValue(row, column.valueGetter)\r\n : (row as Record<string, unknown>)[column.key];\r\n\r\n if (filter.operator === 'in' && Array.isArray(filter.value)) {\r\n return filter.value.includes(value);\r\n }\r\n\r\n return true;\r\n });\r\n });\r\n\r\n this.filteredData.set(filtered);\r\n this.totalItems.set(filtered.length);\r\n this.totalPages.set(Math.ceil(filtered.length / this.pageSize()));\r\n }\r\n\r\n // ===== Utility Methods =====\r\n \r\n private emitEvent(type: GridEvent<T>['type'], data: GridEvent<T>['data'], column?: GridColumn, action?: GridAction) {\r\n this.gridEvent.emit({ \r\n type, \r\n data, \r\n column, \r\n action,\r\n filters: this.columnFilters(),\r\n sorts: this.columnSorts()\r\n } as GridEvent<T>);\r\n }\r\n\r\n /**\r\n * Get nested value from an object\r\n * @param obj - The object to get the nested value from\r\n * @param path - The path to the nested value (e.g., 'contact.email')\r\n * @returns The nested value or undefined if not found\r\n * @example\r\n * const obj = { contact: { email: 'test@example.com' } };\r\n * const value = getNestedValue(obj, 'contact.email');\r\n * // value === 'test@example.com'\r\n */\r\n getNestedValue(obj: T, path: string): unknown {\r\n return path.split('.').reduce((current: unknown, key: string) => {\r\n return current && typeof current === 'object' ? (current as Record<string, unknown>)[key] : undefined;\r\n }, obj);\r\n }\r\n\r\n /**\r\n * Set a nested value in an object using dot notation\r\n * @param obj The object to modify\r\n * @param path The dot notation path (e.g., 'contact.email')\r\n * @param value The value to set\r\n * @example\r\n * const obj = { contact: { email: 'old@example.com' } };\r\n * setNestedValue(obj, 'contact.email', 'new@example.com');\r\n * // obj.contact.email === 'new@example.com'\r\n */\r\n setNestedValue(obj: T, path: string, value: unknown): void {\r\n const keys = path.split('.');\r\n const lastKey = keys.pop()!;\r\n const target = keys.reduce((current: unknown, key: string) => {\r\n if (current && typeof current === 'object') {\r\n if (!(current as Record<string, unknown>)[key]) {\r\n (current as Record<string, unknown>)[key] = {};\r\n }\r\n return (current as Record<string, unknown>)[key];\r\n }\r\n return undefined;\r\n }, obj);\r\n \r\n if (target && typeof target === 'object') {\r\n (target as Record<string, unknown>)[lastKey] = value;\r\n }\r\n }\r\n\r\n /**\r\n * Compare two order arrays to check if they are different\r\n * This method can be used by parent components to check if order has actually changed\r\n * @param currentOrder Current order array\r\n * @param originalOrder Original order array\r\n * @returns true if orders are different, false if they are the same\r\n */\r\n compareOrders(currentOrder: Array<{id: string | undefined, order: number | undefined}>, originalOrder: Array<{id: string | undefined, order: number | undefined}>): boolean {\r\n console.log('🔍 DataGrid: Comparing orders - current length:', currentOrder.length, 'original length:', originalOrder.length);\r\n \r\n // If lengths are different, there are changes\r\n if (currentOrder.length !== originalOrder.length) {\r\n console.log('🔍 DataGrid: Lengths are different, returning true');\r\n return true;\r\n }\r\n\r\n // Compare the order of items by their IDs (not just their sequence values)\r\n // This will detect if items have been reordered even if sequence values are the same\r\n for (let i = 0; i < currentOrder.length; i++) {\r\n const currentItem = currentOrder[i];\r\n const originalItem = originalOrder[i];\r\n \r\n console.log('🔍 DataGrid: Position', i, '- Current ID:', currentItem.id, 'Original ID:', originalItem.id);\r\n \r\n if (currentItem.id !== originalItem.id) {\r\n console.log('🔍 DataGrid: Different item at position', i, 'returning true');\r\n return true;\r\n }\r\n }\r\n\r\n console.log('🔍 DataGrid: No differences found, returning false');\r\n return false;\r\n }\r\n\r\n formatValue(value: unknown, column: GridColumn): string {\r\n if (column.formatter) {\r\n if (column.formatter.type === 'custom' && column.formatter.customFunction) {\r\n const formatter = this.customFormatters[column.formatter.customFunction];\r\n if (formatter) {\r\n return formatter(value, column.formatter.format);\r\n }\r\n }\r\n \r\n // Built-in formatters\r\n switch (column.formatter.type) {\r\n case 'date':\r\n return this.formatDate(value);\r\n case 'currency':\r\n return this.formatCurrency(value, column.formatter.format);\r\n case 'percentage':\r\n return this.formatPercentage(value);\r\n default:\r\n return String(value || '');\r\n }\r\n }\r\n \r\n return String(value || '');\r\n }\r\n\r\n private formatDate(value: unknown): string {\r\n if (!value) return 'N/A';\r\n const date = new Date(value as string);\r\n return isNaN(date.getTime()) ? 'Invalid Date' : date.toLocaleDateString();\r\n }\r\n\r\n private formatCurrency(value: unknown, currency = 'USD'): string {\r\n if (value === null || value === undefined) return 'N/A';\r\n const num = Number(value);\r\n return isNaN(num) ? 'N/A' : new Intl.NumberFormat('en-US', { \r\n style: 'currency', \r\n currency \r\n }).format(num);\r\n }\r\n\r\n private formatPercentage(value: unknown): string {\r\n if (value === null || value === undefined) return 'N/A';\r\n const num = Number(value);\r\n return isNaN(num) ? 'N/A' : `${num}%`;\r\n }\r\n\r\n // Template renderer methods\r\n isTemplateRenderer(rendererKey: string): boolean {\r\n return !!this.templateRenderers[rendererKey];\r\n }\r\n\r\n getTemplateRenderer(rendererKey: string): TemplateRenderer<T> | null {\r\n return this.templateRenderers[rendererKey] as TemplateRenderer<T> | null;\r\n }\r\n\r\n getTemplateContext(value: unknown, row: T, column: GridColumn): TemplateContext<T> {\r\n return {\r\n $implicit: value,\r\n row,\r\n value,\r\n column\r\n };\r\n }\r\n\r\n getColumnWidthClass(width?: ColumnWidth): string {\r\n if (!width || width === 'auto') return '';\r\n \r\n const widthMap = {\r\n 'xs': 'tw-w-16',\r\n 'sm': 'tw-w-24',\r\n 'md': 'tw-w-32',\r\n 'lg': 'tw-w-48',\r\n 'xl': 'tw-w-64'\r\n };\r\n \r\n return widthMap[width as keyof typeof widthMap] || `tw-w-[${width}]`;\r\n }\r\n\r\n getColumnMaxWidthClass(width?: ColumnWidth): string {\r\n if (!width || width === 'auto') return 'tw-max-w-xs';\r\n \r\n const maxWidthMap = {\r\n 'xs': 'tw-max-w-16',\r\n 'sm': 'tw-max-w-24',\r\n 'md': 'tw-max-w-32',\r\n 'lg': 'tw-max-w-48',\r\n 'xl': 'tw-max-w-64'\r\n };\r\n \r\n return maxWidthMap[width as keyof typeof maxWidthMap] || `tw-max-w-[${width}]`;\r\n }\r\n\r\n getStatusClass(value: unknown, statusConfig?: StatusConfig): string {\r\n if (!statusConfig) return '';\r\n return value === statusConfig.activeValue ? statusConfig.activeClass : statusConfig.inactiveClass;\r\n }\r\n\r\n getStatusText(value: unknown, statusConfig?: StatusConfig): string {\r\n if (!statusConfig) return String(value || '');\r\n return value === statusConfig.activeValue ? statusConfig.activeLabel : statusConfig.inactiveLabel;\r\n }\r\n\r\n getItemRangeText(): string {\r\n const total = this.totalItems();\r\n \r\n if (this.serverSidePagination) {\r\n // For server-side pagination, calculate based on actual displayed data\r\n const displayedCount = this.displayedData.length;\r\n const start = (this.currentPage() - 1) * this.pageSize() + 1;\r\n const end = start + displayedCount - 1;\r\n return `${start}-${end} of ${total}`;\r\n } else {\r\n // For client-side pagination, use the original logic\r\n const start = (this.currentPage() - 1) * this.pageSize() + 1;\r\n const end = Math.min(this.currentPage() * this.pageSize(), total);\r\n return `${start}-${end} of ${total}`;\r\n }\r\n }\r\n\r\n getPageSizeOptions() {\r\n return this.mergedConfig().pagination.pageSizeOptions.map(size => ({\r\n value: size,\r\n label: size.toString()\r\n }));\r\n }\r\n\r\n trackByFn(index: number, item: T): unknown {\r\n const trackBy = this.mergedConfig().trackBy || '_id';\r\n return this.getNestedValue(item, trackBy) || index;\r\n }\r\n\r\n getSkeletonArray(): number[] {\r\n return Array.from({ length: this.loadingConfig.skeletonRows }, (_, i) => i);\r\n }\r\n\r\n // ===== Template Helper Methods =====\r\n \r\n get displayedData(): T[] {\r\n // If we have local reordered data (from drag & drop), use that for visual display\r\n if (this.localReorderedData.length > 0 && this.hasOrderChanged()) {\r\n console.log('🔍 Using local reordered data for display:', this.localReorderedData.length, 'items');\r\n return this.localReorderedData;\r\n }\r\n \r\n const data = this.filteredData();\r\n \r\n // For server-side pagination, the server already provides the correct page of data\r\n // For client-side pagination, we need to slice the data\r\n if (this.serverSidePagination) {\r\n return data;\r\n } else {\r\n // If pagination is disabled, return all data\r\n if (!this.mergedConfig().pagination?.enabled) {\r\n return data;\r\n }\r\n // If pagination is enabled, slice the data\r\n const start = (this.currentPage() - 1) * this.pageSize();\r\n const end = start + this.pageSize();\r\n return data.slice(start, end);\r\n }\r\n }\r\n\r\n get columns(): GridColumn[] {\r\n const baseColumns = this.mergedConfig().columns || [];\r\n return baseColumns;\r\n }\r\n\r\n get paginationConfig() {\r\n return this.mergedConfig().pagination;\r\n }\r\n\r\n get searchConfig() {\r\n return this.mergedConfig().search;\r\n }\r\n\r\n get loadingConfig() {\r\n return this.mergedConfig().loading;\r\n }\r\n\r\n get scrollConfig() {\r\n return this.mergedConfig().scroll;\r\n }\r\n} "," <!-- Data Grid Component -->\r\n <div class=\"data-grid-container tw-bg-white tw-shadow tw-rounded-lg tw-overflow-visible tw-flex tw-flex-col\" \r\n [ngClass]=\"[\r\n mergedConfig().tableClass || '',\r\n mergedConfig().fullHeight ? 'tw-h-full' : '',\r\n isDragDropEnabled() ? 'drag-drop-enabled' : '',\r\n isTreeEnabled() ? 'tree-enabled' : ''\r\n ]\">\r\n \r\n <!-- Header Section -->\r\n @if (mergedConfig().title || mergedConfig().subtitle) {\r\n <div class=\"tw-px-3 tw-py-2 tw-border-b tw-border-gray-200\">\r\n @if (mergedConfig().title) {\r\n <h3 class=\"tw-text-base tw-font-semibold tw-text-gray-900\">\r\n {{ mergedConfig().title }}\r\n </h3>\r\n }\r\n @if (mergedConfig().subtitle) {\r\n <p class=\"tw-text-sm tw-text-gray-600 tw-mt-0.5\">\r\n {{ mergedConfig().subtitle }}\r\n </p>\r\n }\r\n </div>\r\n }\r\n\r\n <!-- Search Section -->\r\n @if (searchConfig.enabled) {\r\n <div class=\"tw-px-3 tw-py-1.5 tw-border-b tw-border-gray-200\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between\">\r\n <!-- Left Side: Search Input and Action Icons -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-1.5\">\r\n <!-- Search Input - Apple Style -->\r\n <div class=\"tw-max-w-md data-grid-search-input\">\r\n <cide-ele-input [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\" id=\"search-input\" type=\"text\"\r\n [ngModel]=\"searchQuery()\"\r\n (ngModelChange)=\"updateSearchQuery($event)\"\r\n [placeholder]=\"searchConfig.placeholder\"\r\n [disabled]=\"loading() || isRefreshing()\"\r\n leadingIcon=\"search\"\r\n fill=\"outline\"\r\n size=\"sm\">\r\n </cide-ele-input>\r\n </div>\r\n \r\n <!-- Action Icons (Filter, Sort, Download) - Apple Style Compact -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-1 data-grid-action-buttons\">\r\n <!-- Filter Button -->\r\n <button type=\"button\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200\"\r\n title=\"Filter\"\r\n (click)=\"onActionClick(null, { key: 'filter', label: 'Filter', icon: 'filter_list', variant: 'ghost', onClick: 'filter' })\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">filter_list</cide-ele-icon>\r\n </button>\r\n \r\n <!-- Sort Button -->\r\n <button type=\"button\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200\"\r\n title=\"Sort\"\r\n (click)=\"onActionClick(null, { key: 'sort', label: 'Sort', icon: 'swap_vert', variant: 'ghost', onClick: 'sort' })\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">swap_vert</cide-ele-icon>\r\n </button>\r\n \r\n <!-- Download/Export Button -->\r\n <button type=\"button\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200\"\r\n title=\"Download\"\r\n (click)=\"onActionClick(null, { key: 'download', label: 'Download', icon: 'file_download', variant: 'ghost', onClick: 'download' })\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">file_download</cide-ele-icon>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <!-- Right Side: Drag Order Actions -->\r\n @if (isDragDropEnabled() && (isDragging() || hasOrderChanged())) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <button cideEleButton \r\n variant=\"outline\" \r\n size=\"sm\" \r\n type=\"button\"\r\n (click)=\"onActionClick(null, { key: 'reset-order', label: 'Reset Order', icon: 'undo', variant: 'outline', onClick: 'resetOrder' })\"\r\n class=\"tw-text-blue-700 tw-border-blue-300 hover:tw-bg-blue-100\">\r\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">undo</cide-ele-icon>\r\n Reset Order\r\n </button>\r\n <button cideEleButton \r\n variant=\"primary\" \r\n size=\"sm\" \r\n type=\"button\"\r\n (click)=\"onActionClick(null, { key: 'save-order', label: 'Save Order', icon: 'save', variant: 'primary', onClick: 'saveOrder' })\"\r\n class=\"tw-bg-blue-600 hover:tw-bg-blue-700 tw-text-white\">\r\n <cide-ele-icon size=\"xs\" class=\"tw-w-4 tw-h-4 tw-mr-1\">save</cide-ele-icon>\r\n Save Order\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Table Section -->\r\n <div class=\"tw-overflow-x-auto tw-relative\"\r\n [ngClass]=\"{\r\n 'tw-flex-1 tw-min-h-0': mergedConfig().fullHeight,\r\n 'tw-overflow-y-auto': scrollConfig?.enabled,\r\n 'tw-max-h-full': scrollConfig?.enabled\r\n }\"\r\n [style.maxHeight]=\"scrollConfig?.enabled ? scrollConfig?.maxHeight : null\"\r\n [style.minHeight]=\"scrollConfig?.enabled ? scrollConfig?.minHeight : null\">\r\n <table class=\"tw-min-w-full tw-divide-y tw-divide-gray-200 tw-h-full tw-table-fixed\"\r\n [class.empty-table]=\"displayedData.length === 0\"\r\n [ngClass]=\"{\r\n 'tw-table-striped': mergedConfig().striped,\r\n 'tw-border': mergedConfig().bordered,\r\n 'tw-table-sm': mergedConfig().compact\r\n }\"\r\n style=\"table-layout: fixed;\">\r\n \r\n <!-- Table Header -->\r\n <thead class=\"tw-bg-gray-50\" \r\n [ngClass]=\"[\r\n mergedConfig().headerClass || '',\r\n scrollConfig?.enabled && scrollConfig?.stickyHeader ? 'tw-sticky tw-top-0 tw-z-10' : ''\r\n ]\">\r\n <tr>\r\n @for (column of visibleColumns(); track column.key) {\r\n <th\r\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-relative\"\r\n [ngClass]=\"[\r\n getColumnWidthClass(column.width),\r\n getColumnMaxWidthClass(column.width),\r\n column.align === 'center' ? 'tw-text-center' : '',\r\n column.align === 'right' ? 'tw-text-right' : ''\r\n ]\"\r\n [title]=\"column.header\">\r\n <div class=\"tw-flex tw-items-center tw-justify-between tw-gap-1\">\r\n <span class=\"tw-truncate tw-flex-1\">{{ column.header }}</span>\r\n \r\n <!-- Active Filter Indicator -->\r\n @if (isColumnFiltered(column.key)) {\r\n <div class=\"tw-inline-flex tw-items-center tw-px-1.5 tw-py-0.5 tw-rounded tw-bg-blue-100 tw-text-blue-700 tw-text-xs tw-font-medium tw-mr-1\">\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-mr-0.5\">filter_alt</cide-ele-icon>\r\n {{ getActiveFilterCount(column.key) }}\r\n </div>\r\n }\r\n \r\n <!-- Column Menu Trigger (Three Dots Icon) -->\r\n @if (mergedConfig().columnMenu?.enabled) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-5 tw-h-5 tw-rounded tw-text-gray-600 hover:tw-text-gray-800 hover:tw-bg-gray-100 tw-transition-all column-menu-trigger\"\r\n [class.tw-text-blue-600]=\"isColumnMenuOpen(column.key) || isColumnFiltered(column.key)\"\r\n [class.tw-bg-blue-50]=\"isColumnFiltered(column.key)\"\r\n (click)=\"toggleColumnMenu(column.key, $event)\"\r\n title=\"Column options\">\r\n <cide-ele-icon class=\"tw-w-5 tw-h-4\">more_vert</cide-ele-icon>\r\n </button>\r\n }\r\n </div>\r\n\r\n <!-- Column Menu Dropdown -->\r\n @if (isColumnMenuOpen(column.key)) {\r\n <div class=\"column-menu-dropdown tw-absolute tw-z-50 tw-mt-2 tw-w-56 tw-rounded-lg tw-shadow-lg tw-bg-white tw-ring-1 tw-ring-black tw-ring-opacity-5\">\r\n <div class=\"tw-py-1\">\r\n <!-- Sort Options -->\r\n @if (mergedConfig().columnMenu?.showSort && column.sortable !== false) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnSort(column, 'asc')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_upward</cide-ele-icon>\r\n Ascending\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnSort(column, 'desc')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_downward</cide-ele-icon>\r\n Descending\r\n </button>\r\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\r\n }\r\n\r\n <!-- Filter Option -->\r\n @if (mergedConfig().columnMenu?.showFilter && column.filterable !== false) {\r\n <!-- Check if there's a custom filter renderer template -->\r\n @if (column.filterRenderer && templateRenderers[column.filterRenderer]) {\r\n <div class=\"tw-px-4 tw-py-2\">\r\n <ng-container [ngTemplateOutlet]=\"$any(templateRenderers[column.filterRenderer])\"\r\n [ngTemplateOutletContext]=\"{ $implicit: column, column: column, onFilter: onColumnFilter.bind(this) }\">\r\n </ng-container>\r\n </div>\r\n } @else {\r\n <!-- Excel-style Filter Button -->\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-justify-between tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n [class.tw-bg-blue-50]=\"isFilterPanelOpen(column.key)\"\r\n (click)=\"toggleFilterPanel(column.key, $event)\">\r\n <div class=\"tw-flex tw-items-center\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">filter_list</cide-ele-icon>\r\n Filter\r\n </div>\r\n <cide-ele-icon class=\"tw-w-3 tw-h-3 tw-text-gray-400\">\r\n {{ isFilterPanelOpen(column.key) ? 'expand_less' : 'expand_more' }}\r\n </cide-ele-icon>\r\n </button>\r\n \r\n <!-- Excel-style Filter Panel -->\r\n @if (isFilterPanelOpen(column.key)) {\r\n <div class=\"tw-px-2 tw-py-2 tw-bg-gray-50\" (click)=\"$event.stopPropagation()\">\r\n <!-- Search box -->\r\n <div class=\"tw-px-2 tw-mb-2\">\r\n <input\r\n type=\"text\"\r\n class=\"tw-w-full tw-px-2 tw-py-1 tw-text-xs tw-border tw-border-gray-300 tw-rounded focus:tw-outline-none focus:tw-ring-1 focus:tw-ring-blue-500\"\r\n placeholder=\"Search...\"\r\n [(ngModel)]=\"filterSearchTerm\"\r\n (click)=\"$event.stopPropagation()\">\r\n </div>\r\n \r\n <!-- Select All / Deselect All -->\r\n <div class=\"tw-px-2 tw-mb-1 tw-flex tw-gap-2\">\r\n <button\r\n type=\"button\"\r\n class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-700\"\r\n (click)=\"selectAllFilterValues(column); $event.stopPropagation()\">\r\n Select All\r\n </button>\r\n <span class=\"tw-text-xs tw-text-gray-400\">|</span>\r\n <button\r\n type=\"button\"\r\n class=\"tw-text-xs tw-text-blue-600 hover:tw-text-blue-700\"\r\n (click)=\"deselectAllFilterValues(column); $event.stopPropagation()\">\r\n Clear\r\n </button>\r\n </div>\r\n \r\n <!-- Filter values list -->\r\n <div class=\"tw-max-h-48 tw-overflow-y-auto\">\r\n @for (item of getUniqueColumnValues(column); track item.value) {\r\n <label class=\"tw-flex tw-items-center tw-px-2 tw-py-1 tw-text-xs hover:tw-bg-white tw-cursor-pointer tw-rounded\">\r\n <input\r\n type=\"checkbox\"\r\n class=\"tw-mr-2 tw-rounded tw-border-gray-300 tw-text-blue-600 focus:tw-ring-blue-500\"\r\n [checked]=\"item.checked\"\r\n (change)=\"toggleFilterValue(column, item.value, $any($event.target).checked)\"\r\n (click)=\"$event.stopPropagation()\">\r\n <span class=\"tw-flex-1 tw-truncate\">{{ item.label }}</span>\r\n <span class=\"tw-text-gray-400 tw-ml-1\">({{ item.count }})</span>\r\n </label>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\r\n }\r\n\r\n <!-- Autosize Option -->\r\n @if (mergedConfig().columnMenu?.showAutosize) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnAutosize(column)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">fit_screen</cide-ele-icon>\r\n Autosize\r\n </button>\r\n }\r\n\r\n <!-- Group By Column Option -->\r\n @if (mergedConfig().columnMenu?.showGroupBy && column.groupable !== false) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnGroupBy(column)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">group_work</cide-ele-icon>\r\n Group By Column\r\n </button>\r\n }\r\n\r\n <!-- Manage Columns Option -->\r\n @if (mergedConfig().columnMenu?.showManageColumns) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onManageColumns()\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">view_column</cide-ele-icon>\r\n Manage Columns\r\n </button>\r\n }\r\n\r\n <!-- Reset Columns Option -->\r\n @if (mergedConfig().columnMenu?.showResetColumns) {\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnReset()\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">refresh</cide-ele-icon>\r\n Reset Columns\r\n </button>\r\n }\r\n\r\n <!-- Hide Column Option -->\r\n @if (mergedConfig().columnMenu?.showHideColumn && column.hideable !== false) {\r\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnHide(column)\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">visibility_off</cide-ele-icon>\r\n Hide Column\r\n </button>\r\n }\r\n\r\n <!-- Aggregation Select Option -->\r\n @if (mergedConfig().columnMenu?.showAggregation && column.aggregatable !== false) {\r\n <div class=\"tw-border-t tw-border-gray-100 tw-my-1\"></div>\r\n <div class=\"tw-px-4 tw-py-2 tw-text-xs tw-font-semibold tw-text-gray-500 tw-uppercase\">Aggregation</div>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnAggregation(column, 'sum')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">functions</cide-ele-icon>\r\n Sum\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnAggregation(column, 'avg')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">analytics</cide-ele-icon>\r\n Average\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnAggregation(column, 'count')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">tag</cide-ele-icon>\r\n Count\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnAggregation(column, 'min')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_downward</cide-ele-icon>\r\n Min\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"tw-w-full tw-flex tw-items-center tw-px-4 tw-py-2 tw-text-sm tw-text-gray-700 hover:tw-bg-gray-50 tw-transition-colors\"\r\n (click)=\"onColumnAggregation(column, 'max')\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-mr-3 tw-text-gray-400\">arrow_upward</cide-ele-icon>\r\n Max\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- Table Body -->\r\n <tbody class=\"tw-bg-white tw-divide-y tw-divide-gray-200\">\r\n @if (loading() || isRefreshing() || pageChangeLoading()) {\r\n <!-- Skeleton Loading Rows -->\r\n @for (skeletonItem of getSkeletonArray(); track $index) {\r\n <tr class=\"tw-animate-pulse tw-border-b tw-border-gray-200\">\r\n @for (column of columns; track column.key) {\r\n <td class=\"tw-px-3 tw-py-2 tw-whitespace-nowrap\"\r\n [ngClass]=\"[\r\n getColumnWidthClass(column.width),\r\n getColumnMaxWidthClass(column.width)\r\n ]\">\r\n <div class=\"tw-h-2 tw-bg-gray-200 tw-rounded tw-w-3/4\"></div>\r\n </td>\r\n }\r\n </tr>\r\n }\r\n } @else {\r\n @for (item of displayedData; track trackByFn($index, item)) {\r\n <tr class=\"tw-group hover:tw-bg-gray-50 tw-border-b-2 tw-border-gray-200\"\r\n [ngClass]=\"[\r\n mergedConfig().rowClass || '',\r\n isRefreshing() ? 'tw-opacity-60 tw-pointer-events-none' : '',\r\n isDragDropEnabled() ? 'tw-cursor-move tw-border-2 tw-border-transparent' : '',\r\n !isDragDropEnabled() ? 'tw-transition-colors tw-duration-150' : '',\r\n isTreeEnabled() ? getTreeLevelClass(item) : ''\r\n ]\"\r\n [style.border-color]=\"isDragOverRow === $index ? '#3b82f6' : 'transparent'\"\r\n [style.background-color]=\"isDragOverRow === $index ? '#eff6ff' : ''\"\r\n (click)=\"onRowClick(item)\"\r\n (keydown.enter)=\"onRowClick(item)\"\r\n (keydown.space)=\"onRowClick(item)\"\r\n [class.tw-cursor-pointer]=\"mergedConfig().onRowClick && !isDragDropEnabled()\"\r\n [tabindex]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 0 : -1\"\r\n [attr.role]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'button' : null\"\r\n [attr.aria-label]=\"mergedConfig().onRowClick && !isDragDropEnabled() ? 'Select row' : null\"\r\n [draggable]=\"isDragDropEnabled()\"\r\n (dragstart)=\"onDragStart($event, item, $index)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event, item, $index)\"\r\n (dragend)=\"onDragEnd($event)\">\r\n \r\n @for (column of columns; track column.key) {\r\n <td class=\"tw-pr-3 tw-py-1 tw-relative\"\r\n [ngClass]=\"[\r\n getColumnWidthClass(column.width),\r\n getColumnMaxWidthClass(column.width),\r\n mergedConfig().cellClass || '',\r\n column.align === 'center' ? 'tw-text-center' : '',\r\n column.align === 'right' ? 'tw-text-right' : '',\r\n column.truncate !== false ? 'tw-whitespace-nowrap' : 'tw-whitespace-normal'\r\n ]\"\r\n [style.paddingLeft]=\"isTreeEnabled() && $index === 0 ? getTreeIndentStyle(item) : '12px'\"\r\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'\"\r\n [style.minWidth]=\"isTreeEnabled() && $index === 0 ? '150px' : '100px'\">\r\n <!-- Tree Expand/Collapse Button (only for first column when tree is enabled) -->\r\n @if (isTreeEnabled() && $index === 0) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <!-- Tree Indentation -->\r\n <div class=\"tw-flex tw-items-center\">\r\n @if (hasChildren(item)) {\r\n <button \r\n variant=\"outline\"\r\n size=\"xs\"\r\n type=\"button\"\r\n (click)=\"onActionClick(item, { key: 'toggle-expand', label: 'Toggle', icon: '', variant: 'ghost', onClick: 'toggle-expand' }); $event.stopPropagation()\"\r\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\"\r\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\r\n [title]=\"isItemExpanded(item) ? 'Collapse' : 'Expand'\">\r\n <cide-ele-icon \r\n class=\"tw-w-3 tw-h-3\"\r\n [class.tw-transition-transform]=\"!isDragDropEnabled()\"\r\n [class.tw-rotate-90]=\"isItemExpanded(item)\"\r\n size=\"xs\">\r\n chevron_right\r\n </cide-ele-icon>\r\n </button>\r\n } @else {\r\n <div class=\"tw-w-8 tw-h-5 tw-flex tw-items-center tw-justify-center\">\r\n <!-- <div class=\"tw-w-1 tw-h-1 tw-bg-gray-300 tw-rounded-full\"></div> -->\r\n </div>\r\n }\r\n </div>\r\n \r\n <!-- Cell Content -->\r\n <div class=\"tw-flex-1 tw-w-full\">\r\n @if (column.type === 'text') {\r\n <p class=\"tw-text-sm tw-text-gray-900\"\r\n [class.tw-truncate]=\"column.truncate\"\r\n [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\r\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\r\n </p>\r\n } @else if (column.type === 'number') {\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\r\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\r\n </span>\r\n } @else if (column.type === 'date') {\r\n <span class=\"tw-text-sm tw-text-gray-600\">\r\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\r\n </span>\r\n } @else if (column.type === 'boolean') {\r\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\"\r\n [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\r\n </span>\r\n } @else if (column.type === 'status' && column.statusConfig) {\r\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\"\r\n [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\r\n {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\r\n </span>\r\n } @else if (column.type === 'actions' && column.actions) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @for (action of column.actions; track action.key) {\r\n <button\r\n cideEleButton\r\n [variant]=\"action.variant || 'ghost'\"\r\n size=\"xs\"\r\n type=\"button\"\r\n (click)=\"onActionClick(item, action); $event.stopPropagation()\"\r\n [title]=\"action.tooltip || action.label\"\r\n [disabled]=\"isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\r\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\r\n [ngClass]=\"{\r\n 'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\r\n 'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\r\n 'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\r\n 'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\r\n }\">\r\n @if (action.icon) {\r\n <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path d=\"M10 12l-5-5h10l-5 5z\"/>\r\n </svg>\r\n }\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n } @else if (column.type === 'custom') {\r\n <!-- Template Renderer -->\r\n @if (column.renderer && isTemplateRenderer(column.renderer)) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"getTemplateRenderer(column.renderer)!\"\r\n [ngTemplateOutletContext]=\"getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\r\n </ng-container>\r\n }\r\n <!-- Default rendering -->\r\n @else {\r\n <div>{{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}</div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n } @else {\r\n <!-- Regular cell content (non-tree or non-first column) -->\r\n @if (column.type === 'text') {\r\n <p class=\"tw-text-sm tw-text-gray-900\"\r\n [class.tw-truncate]=\"column.truncate\"\r\n [title]=\"column.truncate ? (getNestedValue(item, column.valueGetter || column.key) || '').toString() : ''\">\r\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\r\n </p>\r\n } @else if (column.type === 'number') {\r\n <span class=\"tw-text-sm tw-text-gray-900 tw-font-mono\">\r\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\r\n </span>\r\n } @else if (column.type === 'date') {\r\n <span class=\"tw-text-sm tw-text-gray-600\">\r\n {{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}\r\n </span>\r\n } @else if (column.type === 'boolean') {\r\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\"\r\n [ngClass]=\"getNestedValue(item, column.valueGetter || column.key) ? 'tw-bg-green-100 tw-text-green-800' : 'tw-bg-red-100 tw-text-red-800'\">\r\n {{ getNestedValue(item, column.valueGetter || column.key) ? 'Yes' : 'No' }}\r\n </span>\r\n } @else if (column.type === 'status' && column.statusConfig) {\r\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\"\r\n [ngClass]=\"getStatusClass(getNestedValue(item, column.valueGetter || column.key), column.statusConfig)\">\r\n {{ getStatusText(getNestedValue(item, column.valueGetter || column.key), column.statusConfig) }}\r\n </span>\r\n } @else if (column.type === 'actions' && column.actions) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n @for (action of column.actions; track action.key) {\r\n <button\r\n cideEleButton\r\n [variant]=\"action.variant || 'ghost'\"\r\n size=\"xs\"\r\n type=\"button\"\r\n (click)=\"onActionClick(item, action); $event.stopPropagation()\"\r\n [title]=\"action.tooltip || action.label\"\r\n [disabled]=\"isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-px-2 tw-py-2 tw-text-xs tw-font-medium tw-rounded\"\r\n [class.tw-transition-colors]=\"!isDragDropEnabled()\"\r\n [ngClass]=\"{\r\n 'tw-text-gray-700 tw-bg-gray-100 hover:tw-bg-gray-200': action.variant === 'ghost',\r\n 'tw-text-white tw-bg-blue-600 hover:tw-bg-blue-700': action.variant === 'primary',\r\n 'tw-text-blue-700 tw-bg-blue-50 tw-border tw-border-blue-200 hover:tw-bg-blue-100': action.variant === 'outline',\r\n 'tw-text-white tw-bg-red-600 hover:tw-bg-red-700': action.variant === 'danger'\r\n }\">\r\n @if (action.icon) {\r\n <svg class=\"tw-w-3 tw-h-3 tw-mr-1\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\r\n <path d=\"M10 12l-5-5h10l-5 5z\"/>\r\n </svg>\r\n }\r\n {{ action.label }}\r\n </button>\r\n }\r\n </div>\r\n } @else if (column.type === 'custom') {\r\n <!-- Template Renderer -->\r\n @if (column.renderer && isTemplateRenderer(column.renderer)) {\r\n <ng-container \r\n [ngTemplateOutlet]=\"getTemplateRenderer(column.renderer)!\"\r\n [ngTemplateOutletContext]=\"getTemplateContext(getNestedValue(item, column.valueGetter || column.key), item, column)\">\r\n </ng-container>\r\n }\r\n <!-- Default rendering -->\r\n @else {\r\n <div>{{ formatValue(getNestedValue(item, column.valueGetter || column.key), column) }}</div>\r\n }\r\n }\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n \r\n <!-- Empty State -->\r\n @if (displayedData.length === 0) {\r\n <tr class=\"tw-h-full\">\r\n <td [attr.colspan]=\"columns.length\" class=\"tw-px-6 tw-py-22 tw-text-center tw-h-full tw-align-middle\">\r\n <div class=\"tw-text-gray-500 tw-flex tw-flex-col tw-items-center tw-justify-center tw-min-h-[300px]\">\r\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\">\r\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>\r\n </svg>\r\n <h3 class=\"tw-mt-2 tw-text-sm tw-font-medium tw-text-gray-900\">No data found</h3>\r\n <p class=\"tw-mt-1 tw-text-sm tw-text-gray-500\">\r\n @if (searchQuery()) {\r\n No results match your search criteria.\r\n } @else {\r\n There are no items to display.\r\n }\r\n </p>\r\n </div>\r\n </td>\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <!-- Pagination Section -->\r\n @if (paginationConfig.enabled && totalItems() > 0) {\r\n <div class=\"tw-px-3 tw-py-0 tw-border-t tw-border-gray-200 tw-bg-white tw-relative tw-z-20\"\r\n [class.tw-opacity-60]=\"isRefreshing()\">\r\n \r\n <!-- Results Info and Page Size -->\r\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-1 sm:tw-space-y-0\">\r\n \r\n <!-- Results Info -->\r\n @if (paginationConfig.showPageInfo) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-3\">\r\n <p class=\"tw-text-sm tw-text-gray-700\">\r\n Showing {{ getItemRangeText() }} results\r\n </p>\r\n \r\n <!-- Page Size Selector -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4 tw-text-gray-500\">view_list</cide-ele-icon>\r\n <span class=\"tw-text-sm tw-text-gray-700\">Per page:</span>\r\n <div class=\"tw-w-16 tw-relative\">\r\n <cide-ele-select\r\n [labelHide]=\"true\"\r\n [ngModel]=\"pageSize()\"\r\n (ngModelChange)=\"updatePageSize($event)\"\r\n [options]=\"getPageSizeOptions()\"\r\n [disabled]=\"isRefreshing()\"\r\n fill=\"outline\"\r\n size=\"xs\"\r\n class=\"tw-z-30\">\r\n </cide-ele-select>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n <!-- Pagination Controls -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2\">\r\n \r\n <!-- Previous/Next and Page Numbers -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\r\n \r\n <!-- First Page -->\r\n <button\r\n type=\"button\"\r\n (click)=\"onPageChange(1)\"\r\n [disabled]=\"currentPage() === 1 || isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n title=\"First page\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">first_page</cide-ele-icon>\r\n </button>\r\n \r\n <!-- Previous Page -->\r\n <button\r\n type=\"button\"\r\n (click)=\"previousPage()\"\r\n [disabled]=\"!hasPreviousPage() || isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n title=\"Previous page\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">chevron_left</cide-ele-icon>\r\n </button>\r\n \r\n <!-- Page Numbers -->\r\n @for (page of getEnhancedPageNumbers(); track page) {\r\n @if (page === '...') {\r\n <span class=\"tw-px-2 tw-py-2 tw-text-sm tw-text-gray-500\">...</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n (click)=\"onPageChange(page)\"\r\n [disabled]=\"isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-p-0 tw-rounded tw-text-xs tw-font-medium tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n [ngClass]=\"{\r\n 'tw-bg-blue-600 tw-text-white hover:tw-bg-blue-700': currentPage() === page,\r\n 'tw-bg-white tw-text-gray-700 tw-border tw-border-gray-300 hover:tw-bg-gray-50': currentPage() !== page\r\n }\"\r\n [title]=\"'Page ' + page\">\r\n {{ page }}\r\n </button>\r\n }\r\n }\r\n \r\n <!-- Next Page -->\r\n <button\r\n type=\"button\"\r\n (click)=\"nextPage()\"\r\n [disabled]=\"!hasNextPage() || isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n title=\"Next page\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">chevron_right</cide-ele-icon>\r\n </button>\r\n \r\n <!-- Last Page -->\r\n <button\r\n type=\"button\"\r\n (click)=\"onPageChange(totalPages())\"\r\n [disabled]=\"currentPage() === totalPages() || isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n title=\"Last page\">\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">last_page</cide-ele-icon>\r\n </button>\r\n \r\n </div>\r\n\r\n <!-- Quick Jump and Refresh -->\r\n @if (paginationConfig.showQuickJump || paginationConfig.showRefresh) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-1 tw-border-l tw-border-gray-200 tw-pl-2\">\r\n \r\n <!-- Quick Jump -->\r\n @if (paginationConfig.showQuickJump) {\r\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\r\n <span class=\"tw-text-sm tw-text-gray-700\">Go to:</span>\r\n <div class=\"tw-w-16\">\r\n <cide-ele-input id=\"jump-to-page-input\" type=\"number\" [labelHide]=\"true\" [hideHelperAndErrorText]=\"true\"\r\n [(ngModel)]=\"jumpToPage\" [min]=\"1\" [max]=\"totalPages()\"\r\n [disabled]=\"isRefreshing()\"\r\n size=\"xs\"\r\n (keydown.enter)=\"onJumpToPage()\">\r\n </cide-ele-input>\r\n </div>\r\n <button\r\n type=\"button\"\r\n (click)=\"onJumpToPage()\"\r\n [disabled]=\"isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-6 tw-h-6 tw-p-0 tw-rounded tw-text-xs tw-font-medium tw-bg-gray-100 tw-text-gray-700 tw-border tw-border-gray-300 hover:tw-bg-gray-200 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n title=\"Go to page\">\r\n Go\r\n </button>\r\n </div>\r\n }\r\n \r\n <!-- Refresh Button -->\r\n @if (paginationConfig.showRefresh) {\r\n <button\r\n type=\"button\"\r\n (click)=\"onRefresh()\"\r\n [disabled]=\"isRefreshing()\"\r\n class=\"tw-inline-flex tw-items-center tw-justify-center tw-w-7 tw-h-7 tw-p-0 tw-rounded-md tw-text-gray-500 hover:tw-text-gray-700 hover:tw-bg-gray-100 tw-transition-all tw-duration-200 disabled:tw-opacity-50 disabled:tw-cursor-not-allowed\"\r\n title=\"Refresh\">\r\n @if (isRefreshing()) {\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4 tw-animate-spin\">refresh</cide-ele-icon>\r\n } @else {\r\n <cide-ele-icon class=\"tw-w-[22px] tw-h-4\">refresh</cide-ele-icon>\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n \r\n </div>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","import { Component, Input, Output, EventEmitter, signal, viewChild, TemplateRef, ElementRef, HostListener, DestroyRef, inject, OnInit, OnDestroy, ViewContainerRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { DropdownManagerService, DropdownInstance } from '../../services/dropdown-manager.service';\r\nimport { PortalService } from '../../services/portal.service';\r\n\r\nexport interface DropdownItem {\r\n id: string;\r\n label: string;\r\n icon?: string;\r\n iconColor?: string;\r\n textColor?: string;\r\n hoverBgColor?: string;\r\n disabled?: boolean;\r\n divider?: boolean;\r\n}\r\n\r\nexport interface DropdownConfig {\r\n triggerIcon?: string;\r\n triggerSize?: 'xs' | 'sm' | 'md' | 'lg';\r\n triggerColor?: string;\r\n triggerHoverColor?: string;\r\n triggerHoverBgColor?: string;\r\n menuWidth?: string;\r\n menuPosition?: 'left' | 'right' | 'auto';\r\n showArrow?: boolean;\r\n forcePosition?: 'top' | 'bottom' | 'left' | 'right';\r\n offsetX?: number;\r\n offsetY?: number;\r\n minWidth?: number;\r\n usePortal?: boolean; // New property to enable portal mode\r\n}\r\n\r\nexport interface DropdownPosition {\r\n vertical: 'top' | 'bottom';\r\n horizontal: 'left' | 'right';\r\n spaceAvailable: {\r\n top: number;\r\n bottom: number;\r\n left: number;\r\n right: number;\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-dropdown',\r\n standalone: true,\r\n imports: [CommonModule, CideIconComponent],\r\n template: `\r\n <div class=\"tw-relative\" #dropdownContainer>\r\n <!-- Trigger Button -->\r\n <button \r\n type=\"button\" \r\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\"\r\n [class]=\"getTriggerClasses()\"\r\n (click)=\"toggleDropdown($event)\"\r\n [title]=\"config.triggerIcon === 'more_vert' ? 'More actions' : 'Options'\">\r\n \r\n <!-- Custom Trigger Template -->\r\n @if (triggerTemplate) {\r\n <ng-container *ngTemplateOutlet=\"triggerTemplate; context: { $implicit: isOpen() }\">\r\n </ng-container>\r\n } @else {\r\n <!-- Default Trigger -->\r\n <cide-ele-icon \r\n [class]=\"getTriggerIconClasses()\"\r\n [size]=\"config.triggerSize || 'sm'\">\r\n {{ config.triggerIcon || 'more_vert' }}\r\n </cide-ele-icon>\r\n }\r\n </button>\r\n \r\n <!-- Dropdown Menu (Non-Portal) -->\r\n @if (isOpen() && !getSafeConfig().usePortal) {\r\n <div \r\n #dropdownMenu\r\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\"\r\n [class]=\"getMenuClasses()\"\r\n [style]=\"getMenuStyles()\"\r\n role=\"menu\">\r\n <ng-container *ngTemplateOutlet=\"dropdownMenuTemplate; context: { $implicit: items }\">\r\n </ng-container>\r\n </div>\r\n }\r\n </div>\r\n \r\n <!-- Dropdown Menu Template (for both portal and non-portal) -->\r\n <ng-template #dropdownMenuTemplate let-context=\"context\">\r\n <!-- Custom Menu Template -->\r\n @if (menuTemplate) {\r\n <ng-container *ngTemplateOutlet=\"menuTemplate; context: { $implicit: context?.items }\">\r\n </ng-container>\r\n } @else {\r\n <!-- Default Menu -->\r\n <div class=\"tw-py-1\" role=\"none\">\r\n @for (item of context?.items; track item.id) {\r\n @if (item.divider) {\r\n <!-- Divider Item -->\r\n <hr class=\"tw-border-t tw-border-gray-200 tw-my-1\" role=\"separator\">\r\n } @else {\r\n <!-- Regular Menu Item -->\r\n <button \r\n type=\"button\"\r\n [class]=\"getItemClasses(item)\"\r\n [disabled]=\"item.disabled\"\r\n (click)=\"onItemClick(item, $event)\"\r\n [attr.data-item-id]=\"item.id\">\r\n \r\n <!-- Item Icon -->\r\n @if (item.icon) {\r\n <cide-ele-icon \r\n class=\"tw-w-4 tw-h-4 tw-mr-2\"\r\n [class]=\"item.iconColor || 'tw-text-gray-400'\"\r\n size=\"xs\">\r\n {{ item.icon }}\r\n </cide-ele-icon>\r\n }\r\n \r\n <!-- Item Label -->\r\n <span [class]=\"item.textColor || 'tw-text-gray-700'\">\r\n {{ item.label }}\r\n </span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n }\r\n </ng-template>\r\n `,\r\n styles: [`\r\n .dropdown-menu {\r\n transform-origin: top right;\r\n }\r\n `]\r\n})\r\nexport class CideEleDropdownComponent implements OnInit, OnDestroy {\r\n private destroyRef = inject(DestroyRef);\r\n private dropdownManager = inject(DropdownManagerService);\r\n private portalService = inject(PortalService);\r\n private viewContainerRef = inject(ViewContainerRef);\r\n private dropdownId = `dropdown-${Math.random().toString(36).substr(2, 9)}`;\r\n private portalId = `dropdown-portal-${this.dropdownId}`;\r\n\r\n // ViewChild for container reference\r\n dropdownContainer = viewChild.required<ElementRef>('dropdownContainer');\r\n dropdownMenu = viewChild<ElementRef>('dropdownMenu');\r\n dropdownMenuTemplate = viewChild<TemplateRef<any>>('dropdownMenuTemplate');\r\n\r\n // Inputs\r\n @Input() set items(value: DropdownItem[]) {\r\n this._items = value;\r\n }\r\n get items(): DropdownItem[] {\r\n return this._items;\r\n }\r\n private _items: DropdownItem[] = [];\r\n\r\n @Input() config: DropdownConfig = {};\r\n @Input() triggerTemplate?: TemplateRef<{ $implicit: boolean }>;\r\n @Input() menuTemplate?: TemplateRef<{ $implicit: DropdownItem[] }>;\r\n\r\n // Outputs\r\n @Output() itemClick = new EventEmitter<DropdownItem>();\r\n @Output() dropdownToggle = new EventEmitter<boolean>();\r\n\r\n // Signals\r\n isOpen = signal(false);\r\n currentPosition = signal<DropdownPosition>({\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\r\n });\r\n\r\n ngOnInit(): void {\r\n // Setup cleanup on destroy\r\n this.destroyRef.onDestroy(() => {\r\n this.dropdownManager.unregisterDropdown(this.dropdownId);\r\n });\r\n }\r\n\r\n // Methods\r\n getTriggerClasses(): string {\r\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';\r\n\r\n const colorClasses = this.config?.triggerColor || 'tw-text-gray-400';\r\n const hoverColorClasses = this.config?.triggerHoverColor || 'hover:tw-text-gray-600';\r\n const hoverBgClasses = this.config?.triggerHoverBgColor || 'hover:tw-bg-gray-100';\r\n\r\n return `${baseClasses} ${colorClasses} ${hoverColorClasses} ${hoverBgClasses}`;\r\n }\r\n\r\n getTriggerIconClasses(): string {\r\n return this.config?.triggerColor || 'tw-text-gray-400';\r\n }\r\n\r\n getMenuClasses(): string {\r\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';\r\n const widthClass = this.config?.menuWidth || 'tw-w-44';\r\n\r\n return `${baseClasses} ${widthClass}`;\r\n }\r\n\r\n getMenuStyles(): string {\r\n const position = this.currentPosition();\r\n const offsetX = this.config?.offsetX || 0;\r\n const offsetY = this.config?.offsetY || 4;\r\n\r\n let styles = 'position: absolute; z-index: 9999;';\r\n\r\n // Vertical positioning\r\n if (position.vertical === 'bottom') {\r\n styles += `top: calc(100% + ${offsetY}px);`;\r\n } else {\r\n styles += `bottom: calc(100% + ${offsetY}px);`;\r\n }\r\n\r\n // Horizontal positioning\r\n if (position.horizontal === 'right') {\r\n styles += `right: ${offsetX}px;`;\r\n } else {\r\n styles += `left: ${offsetX}px;`;\r\n }\r\n\r\n return styles;\r\n }\r\n\r\n calculatePosition(): DropdownPosition {\r\n const container = this.dropdownContainer();\r\n if (!container) {\r\n return {\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n spaceAvailable: { top: 0, bottom: 0, left: 0, right: 0 }\r\n };\r\n }\r\n\r\n const rect = container.nativeElement.getBoundingClientRect();\r\n const viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight\r\n };\r\n\r\n // Calculate available space in each direction\r\n const spaceAvailable = {\r\n top: rect.top,\r\n bottom: viewport.height - rect.bottom,\r\n left: rect.left,\r\n right: viewport.width - rect.right\r\n };\r\n\r\n // Estimated dropdown menu dimensions (adjust based on your needs)\r\n const menuWidth = this.getMenuWidth();\r\n const menuHeight = this.getEstimatedMenuHeight();\r\n\r\n // Determine vertical position\r\n let vertical: 'top' | 'bottom' = 'bottom';\r\n if (this.config?.forcePosition === 'top' || this.config?.forcePosition === 'bottom') {\r\n vertical = this.config.forcePosition;\r\n } else {\r\n // Check if there's enough space below\r\n if (spaceAvailable.bottom < menuHeight && spaceAvailable.top > menuHeight) {\r\n vertical = 'top';\r\n }\r\n }\r\n\r\n // Determine horizontal position \r\n let horizontal: 'left' | 'right' = 'right';\r\n if (this.config?.forcePosition === 'left' || this.config?.forcePosition === 'right') {\r\n horizontal = this.config.forcePosition;\r\n } else if (this.config?.menuPosition === 'left') {\r\n horizontal = 'left';\r\n } else if (this.config?.menuPosition === 'auto') {\r\n // Auto-detect best horizontal position\r\n if (spaceAvailable.right < menuWidth && spaceAvailable.left > menuWidth) {\r\n horizontal = 'left';\r\n }\r\n }\r\n\r\n return {\r\n vertical,\r\n horizontal,\r\n spaceAvailable\r\n };\r\n }\r\n\r\n private getMenuWidth(): number {\r\n // Parse width from config or use default\r\n const configWidth = this.config?.menuWidth || 'tw-w-44';\r\n if (configWidth.includes('tw-w-')) {\r\n const widthMap: { [key: string]: number } = {\r\n 'tw-w-32': 128, 'tw-w-36': 144, 'tw-w-40': 160,\r\n 'tw-w-44': 176, 'tw-w-48': 192, 'tw-w-52': 208,\r\n 'tw-w-56': 224, 'tw-w-60': 240, 'tw-w-64': 256\r\n };\r\n return widthMap[configWidth] || 176;\r\n }\r\n return 176; // Default width\r\n }\r\n\r\n protected getSafeConfig(): DropdownConfig {\r\n return {\r\n triggerIcon: 'more_vert',\r\n triggerSize: 'sm',\r\n menuWidth: 'tw-w-44',\r\n menuPosition: 'auto',\r\n showArrow: false,\r\n offsetX: 0,\r\n offsetY: 4,\r\n usePortal: true, // Default to portal mode\r\n ...this.config // Override with provided config\r\n };\r\n }\r\n\r\n private getEstimatedMenuHeight(): number {\r\n // Estimate height based on number of items\r\n const itemHeight = 40; // Approximate height per item\r\n const padding = 8; // Top and bottom padding\r\n return (this.items.length * itemHeight) + padding;\r\n }\r\n\r\n toggleDropdown(event: Event): void {\r\n console.log('🔵 toggleDropdown called, current state:', this.isOpen());\r\n console.log('🔵 Items:', this.items);\r\n console.log('🔵 Config:', this.getSafeConfig());\r\n event.stopPropagation();\r\n\r\n if (!this.isOpen()) {\r\n this.openDropdown();\r\n } else {\r\n setTimeout(() => {\r\n this.closeDropdown();\r\n }, 100);\r\n }\r\n }\r\n\r\n private openDropdown(): void {\r\n console.log('🔵 openDropdown called');\r\n console.log('🔵 Items:', this.items);\r\n console.log('🔵 Config:', this.getSafeConfig());\r\n console.log('🔵 Template available:', !!this.dropdownMenuTemplate());\r\n \r\n // Calculate position before opening\r\n const newPosition = this.calculatePosition();\r\n this.currentPosition.set(newPosition);\r\n\r\n this.isOpen.set(true);\r\n\r\n // Create portal if usePortal is enabled\r\n if (this.getSafeConfig().usePortal && this.dropdownMenuTemplate()) {\r\n console.log('🔵 Creating portal dropdown...');\r\n this.createPortalDropdown();\r\n } else {\r\n console.log('🔵 Not creating portal - usePortal:', this.getSafeConfig().usePortal, 'template:', !!this.dropdownMenuTemplate());\r\n }\r\n\r\n // Register with dropdown manager\r\n const dropdownInstance: DropdownInstance = {\r\n id: this.dropdownId,\r\n close: () => this.closeDropdown(),\r\n element: this.dropdownContainer().nativeElement\r\n };\r\n\r\n this.dropdownManager.registerDropdown(dropdownInstance);\r\n\r\n console.log('🔵 Dropdown opened:', this.dropdownId);\r\n console.log('🔵 Position:', this.currentPosition());\r\n this.dropdownToggle.emit(true);\r\n }\r\n\r\n testMouseDown(item: DropdownItem): void {\r\n console.log('🔵 Mouse down detected: ' + item.label);\r\n // Don't close dropdown on mousedown\r\n }\r\n\r\n onItemClick(item: DropdownItem, event: Event): void {\r\n console.log('🔵 Dropdown onItemClick called with:', item);\r\n\r\n // Simple event handling\r\n event.stopPropagation();\r\n\r\n if (item.disabled || item.divider) {\r\n console.log('🔵 Item is disabled or divider, returning');\r\n return;\r\n }\r\n\r\n console.log('🔵 Emitting itemClick event');\r\n this.itemClick.emit(item);\r\n\r\n // Close dropdown after a small delay to ensure click is processed\r\n setTimeout(() => {\r\n this.closeDropdown();\r\n }, 50);\r\n }\r\n\r\n private createPortalDropdown(): void {\r\n const triggerElement = this.dropdownContainer().nativeElement;\r\n const template = this.dropdownMenuTemplate();\r\n\r\n if (!template) {\r\n console.warn('🔵 Dropdown menu template not found for portal creation');\r\n return;\r\n }\r\n\r\n console.log('🔵 Creating portal dropdown with items:', this.items);\r\n console.log('🔵 Trigger element:', triggerElement);\r\n console.log('🔵 Template:', template);\r\n console.log('🔵 Config:', this.config);\r\n\r\n try {\r\n const safeConfig = this.getSafeConfig();\r\n const portalElement = this.portalService.createTemplatePortal(this.portalId, {\r\n triggerElement,\r\n template,\r\n viewContainerRef: this.viewContainerRef,\r\n context: { items: this.items },\r\n className: `dropdown-menu tw-bg-white tw-shadow-lg tw-border tw-border-gray-200 tw-rounded-md tw-text-black ${this.getMenuClasses()}`,\r\n position: this.currentPosition().vertical === 'top' ? 'top' : 'bottom',\r\n align: this.currentPosition().horizontal === 'left' ? 'left' : 'right',\r\n offsetX: safeConfig.offsetX || 0,\r\n offsetY: safeConfig.offsetY || 4,\r\n minWidth: safeConfig.minWidth || this.getMenuWidth(),\r\n maxHeight: 300,\r\n closeOnClickOutside: true,\r\n closeOnEscape: true\r\n });\r\n\r\n console.log('🔵 Portal dropdown created:', this.portalId);\r\n console.log('🔵 Portal element:', portalElement);\r\n console.log('🔵 Portal element styles:', {\r\n position: portalElement.style.position,\r\n top: portalElement.style.top,\r\n left: portalElement.style.left,\r\n zIndex: portalElement.style.zIndex,\r\n display: portalElement.style.display,\r\n visibility: portalElement.style.visibility\r\n });\r\n } catch (error) {\r\n console.error('🔵 Failed to create portal dropdown:', error);\r\n }\r\n }\r\n\r\n private destroyPortalDropdown(): void {\r\n try {\r\n this.portalService.destroyPortal(this.portalId);\r\n console.log('🔵 Portal dropdown destroyed:', this.portalId);\r\n } catch (error) {\r\n console.error('🔵 Failed to destroy portal dropdown:', error);\r\n }\r\n }\r\n\r\n closeDropdown(): void {\r\n console.log('🔵 closeDropdown called, setting isOpen to false');\r\n setTimeout(() => {\r\n this.isOpen.set(false);\r\n\r\n // Destroy portal if it exists\r\n if (this.getSafeConfig().usePortal) {\r\n this.destroyPortalDropdown();\r\n }\r\n\r\n this.dropdownManager.unregisterDropdown(this.dropdownId);\r\n this.dropdownToggle.emit(false);\r\n }, 100);\r\n }\r\n\r\n getItemClasses(item: DropdownItem): string {\r\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';\r\n\r\n if (item.disabled) {\r\n return `${baseClasses} tw-text-gray-400 tw-cursor-not-allowed`;\r\n }\r\n\r\n const textColor = item.textColor || 'tw-text-gray-700';\r\n const hoverBg = item.hoverBgColor || 'hover:tw-bg-gray-100';\r\n const hoverText = item.textColor || 'hover:tw-text-gray-900';\r\n\r\n return `${baseClasses} ${textColor} ${hoverBg} ${hoverText}`;\r\n }\r\n\r\n // Host listeners for window events (position recalculation only)\r\n // Note: Click outside and escape key handling is now managed by DropdownManagerService\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n if (this.isOpen()) {\r\n // Recalculate position on window resize\r\n const newPosition = this.calculatePosition();\r\n this.currentPosition.set(newPosition);\r\n }\r\n }\r\n\r\n @HostListener('window:scroll')\r\n onWindowScroll(): void {\r\n if (this.isOpen()) {\r\n // Recalculate position on scroll\r\n const newPosition = this.calculatePosition();\r\n this.currentPosition.set(newPosition);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Cleanup portal if it exists\r\n if (this.getSafeConfig().usePortal) {\r\n this.destroyPortalDropdown();\r\n }\r\n\r\n // Close dropdown and unregister\r\n if (this.isOpen()) {\r\n this.closeDropdown();\r\n }\r\n\r\n // Ensure dropdown is unregistered\r\n this.dropdownManager.unregisterDropdown(this.dropdownId);\r\n }\r\n} ","import { Component, Input, Output, EventEmitter, signal, computed, ElementRef, ViewChild, AfterViewInit, OnDestroy, effect, Signal } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\nimport { CideSpinnerComponent } from '../../elements/spinner/spinner.component';\r\n\r\nexport interface FloatingContainerConfig {\r\n id: string;\r\n title: string;\r\n icon?: string;\r\n headerColor?: string;\r\n width?: string;\r\n height?: string;\r\n minWidth?: string;\r\n minHeight?: string;\r\n maxWidth?: string;\r\n maxHeight?: string;\r\n resizable?: boolean;\r\n draggable?: boolean;\r\n closable?: boolean;\r\n minimizable?: boolean;\r\n maximizable?: boolean;\r\n isMinimized?: boolean;\r\n isMaximized?: boolean;\r\n // Dynamic component support\r\n componentId?: string;\r\n componentConfig?: {\r\n inputs?: { [key: string]: Signal<any> };\r\n outputs?: { [key: string]: (event: Signal<any>) => void };\r\n };\r\n}\r\n\r\n@Component({\r\n selector: 'cide-ele-floating-container',\r\n standalone: true,\r\n imports: [CommonModule, CideEleButtonComponent, CideIconComponent, CideSpinnerComponent],\r\n template: `\r\n <div \r\n #container\r\n class=\"tw-fixed tw-bg-gray-50 tw-bg-opacity-90 tw-backdrop-blur-sm tw-border tw-border-gray-200 tw-border-opacity-50 tw-rounded-xl tw-shadow-lg tw-transition-all tw-duration-200 tw-flex tw-flex-col\"\r\n [style.left.px]=\"isMaximized() ? 20 : position().x\"\r\n [style.top.px]=\"isMaximized() ? 20 : position().y\"\r\n [style.width]=\"isMaximized() ? 'calc(100vw - 40px)' : (config().width || '400px')\"\r\n [style.height]=\"isMaximized() ? 'calc(100vh - 40px)' : (isMinimized() ? 'auto' : (savedHeight || config().height || '500px'))\"\r\n [style.min-width]=\"config().minWidth || '300px'\"\r\n [style.min-height]=\"isMinimized() ? 'auto' : (config().minHeight || '200px')\"\r\n [style.max-width]=\"config().maxWidth || '90vw'\"\r\n [style.max-height]=\"config().maxHeight || '90vh'\"\r\n [style.z-index]=\"zIndex()\"\r\n [class.tw-cursor-move]=\"isDragging()\"\r\n [class.tw-select-none]=\"true\"\r\n (mousedown)=\"onMouseDown($event)\"\r\n (mousemove)=\"onMouseMove($event)\"\r\n (mouseup)=\"onMouseUp($event)\"\r\n (mouseleave)=\"onMouseUp($event)\">\r\n \r\n <!-- Header -->\r\n <div \r\n class=\"tw-flex tw-items-center tw-justify-between tw-px-3 tw-py-2 tw-border-b tw-border-gray-200 tw-border-opacity-30 tw-rounded-t-xl tw-cursor-move tw-transition-all tw-duration-200 tw-shadow-sm tw-flex-shrink-0\"\r\n [style.background]=\"getHeaderBackground()\"\r\n (mousedown)=\"startDrag($event)\"\r\n (click)=\"onHeaderClick($event)\">\r\n \r\n <!-- Title Section -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-2 tw-text-white\">\r\n @if (config().icon) {\r\n <cide-ele-icon class=\"tw-w-4 tw-h-4\">{{ config().icon }}</cide-ele-icon>\r\n }\r\n <h2 class=\"tw-text-sm tw-font-medium tw-truncate\">{{ config().title }}</h2>\r\n @if (isMinimized()) {\r\n <span class=\"tw-text-xs tw-opacity-75\">(Click to restore)</span>\r\n }\r\n </div>\r\n \r\n <!-- Action Buttons -->\r\n <div class=\"tw-flex tw-items-center tw-space-x-1\">\r\n @if (config().minimizable !== false) {\r\n <button \r\n cideEleButton \r\n variant=\"ghost\" \r\n size=\"xs\" \r\n type=\"button\" \r\n (click)=\"minimize(); $event.stopPropagation()\" \r\n class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\r\n [title]=\"isMinimized() ? 'Restore' : 'Minimize'\">\r\n <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">{{ isMinimized() ? 'open_in_full' : 'remove' }}</cide-ele-icon>\r\n </button>\r\n }\r\n @if (config().maximizable !== false) {\r\n <button \r\n cideEleButton \r\n variant=\"ghost\" \r\n size=\"xs\" \r\n type=\"button\" \r\n (click)=\"toggleMaximize(); $event.stopPropagation()\" \r\n class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\r\n [title]=\"isMaximized() ? 'Restore' : 'Maximize'\">\r\n <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">{{ isMaximized() ? 'fullscreen_exit' : 'fullscreen' }}</cide-ele-icon>\r\n </button>\r\n }\r\n @if (config().closable !== false) {\r\n <button \r\n cideEleButton \r\n variant=\"ghost\" \r\n size=\"xs\" \r\n type=\"button\" \r\n (click)=\"close(); $event.stopPropagation()\" \r\n class=\"tw-w-6 tw-h-6 tw-rounded-lg tw-text-white hover:tw-bg-white hover:tw-bg-opacity-20 tw-transition-all tw-duration-200\"\r\n title=\"Close\">\r\n <cide-ele-icon class=\"tw-w-[1.38rem] tw-h-3\">close</cide-ele-icon>\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n \r\n <!-- Content with @defer for performance -->\r\n @if (!isMinimized()) {\r\n <div \r\n class=\"tw-flex-1 tw-overflow-auto tw-overflow-x-hidden floating-container-content tw-bg-gray-50 tw-bg-opacity-90\"\r\n [style.height]=\"isMaximized() ? 'calc(100vh - 100px)' : 'auto'\"\r\n [style.min-height]=\"'200px'\">\r\n @defer (when !isMinimized() && isVisible()) {\r\n <div class=\"tw-p-0 tw-min-h-full\">\r\n <ng-content></ng-content>\r\n </div>\r\n } @placeholder {\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-p-4 tw-min-h-[200px]\">\r\n <cide-ele-spinner size=\"sm\"></cide-ele-spinner>\r\n <span class=\"tw-ml-2 tw-text-sm tw-text-gray-600\">Loading content...</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n \r\n <!-- Resize Handle (if resizable) -->\r\n @if (config().resizable !== false) {\r\n <div \r\n class=\"tw-absolute tw-bottom-0 tw-right-0 tw-w-[1.38rem] tw-h-3 tw-cursor-se-resize tw-bg-gray-300 tw-opacity-50 hover:tw-opacity-100\"\r\n (mousedown)=\"startResize($event)\">\r\n </div>\r\n }\r\n </div>\r\n `,\r\n styles: [`\r\n .tw-cursor-move {\r\n cursor: move !important;\r\n }\r\n .tw-cursor-se-resize {\r\n cursor: se-resize !important;\r\n }\r\n .floating-container-content {\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n scrollbar-width: thin;\r\n scrollbar-color: #cbd5e1 #f1f5f9;\r\n position: relative;\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n }\r\n .floating-container-content::-webkit-scrollbar {\r\n width: 8px;\r\n }\r\n .floating-container-content::-webkit-scrollbar-track {\r\n background: #f8fafc;\r\n border-radius: 4px;\r\n margin: 4px;\r\n }\r\n .floating-container-content::-webkit-scrollbar-thumb {\r\n background: #cbd5e1;\r\n border-radius: 4px;\r\n transition: background-color 0.2s ease;\r\n border: 1px solid #e2e8f0;\r\n }\r\n .floating-container-content::-webkit-scrollbar-thumb:hover {\r\n background: #94a3b8;\r\n border-color: #cbd5e1;\r\n }\r\n .floating-container-content::-webkit-scrollbar-thumb:active {\r\n background: #64748b;\r\n }\r\n `]\r\n})\r\nexport class CideEleFloatingContainerComponent implements AfterViewInit, OnDestroy {\r\n @Input() config = signal<FloatingContainerConfig>({\r\n id: '',\r\n title: 'Floating Container',\r\n icon: 'widgets',\r\n headerColor: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\r\n width: '400px',\r\n height: 'auto',\r\n minWidth: '300px',\r\n minHeight: '200px',\r\n maxWidth: '90vw',\r\n maxHeight: '90vh',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true\r\n });\r\n @Input() isMinimized!: Signal<boolean>;\r\n @Input() isMaximized!: Signal<boolean>;\r\n @Input() isVisible!: Signal<boolean>;\r\n @Input() zIndex!: Signal<number>;\r\n\r\n @Output() closeEvent = new EventEmitter<string>();\r\n @Output() minimizeEvent = new EventEmitter<string>();\r\n @Output() maximizeEvent = new EventEmitter<string>();\r\n @Output() clickEvent = new EventEmitter<string>();\r\n\r\n @ViewChild('container') containerRef!: ElementRef<HTMLDivElement>;\r\n\r\n // State signals\r\n position = signal({ x: 100, y: 100 });\r\n isDragging = signal(false);\r\n isResizing = signal(false);\r\n\r\n // Computed properties\r\n computedConfig = computed(() => this.config());\r\n\r\n private dragStart = { x: 0, y: 0 };\r\n private resizeStart = { x: 0, y: 0, width: 0, height: 0 };\r\n private originalPosition = { x: 0, y: 0 };\r\n private originalSize = { width: 0, height: 0 };\r\n private savedPosition = { x: 100, y: 100 }; // Store position before maximizing\r\n savedHeight = ''; // Store height before maximizing\r\n\r\n ngAfterViewInit() {\r\n // Only center the container if it's at the default position (100, 100)\r\n // This prevents position jumping when containers are focused\r\n const currentPos = this.position();\r\n if (currentPos.x === 100 && currentPos.y === 100) {\r\n this.centerContainer();\r\n }\r\n }\r\n\r\n constructor() {\r\n // Watch for maximize state changes\r\n effect(() => {\r\n const isMaximized = this.isMaximized();\r\n if (isMaximized && !this.savedHeight) {\r\n // Save current height when maximizing\r\n this.savedHeight = this.containerRef?.nativeElement?.style.height || this.config().height || '500px';\r\n } else if (!isMaximized && this.savedHeight) {\r\n // Restore height when unmaximizing\r\n this.savedHeight = '';\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n // Clean up any event listeners if needed\r\n }\r\n\r\n centerContainer() {\r\n if (this.containerRef?.nativeElement) {\r\n if (this.isMaximized()) {\r\n // For maximized state, position with equal margins (20px from all sides)\r\n this.position.set({ x: 20, y: 20 });\r\n } else {\r\n // For normal state, center based on container size\r\n const rect = this.containerRef.nativeElement.getBoundingClientRect();\r\n const centerX = (window.innerWidth - rect.width) / 2;\r\n const centerY = (window.innerHeight - rect.height) / 2;\r\n this.position.set({ x: Math.max(0, centerX), y: Math.max(0, centerY) });\r\n }\r\n }\r\n }\r\n\r\n startDrag(event: MouseEvent) {\r\n if (!this.computedConfig().draggable) return;\r\n \r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n this.isDragging.set(true);\r\n this.dragStart = { x: event.clientX, y: event.clientY };\r\n this.originalPosition = { ...this.position() };\r\n \r\n document.addEventListener('mousemove', this.onDragMove.bind(this));\r\n document.addEventListener('mouseup', this.onDragEnd.bind(this));\r\n }\r\n\r\n onDragMove(event: MouseEvent) {\r\n if (!this.isDragging()) return;\r\n \r\n const deltaX = event.clientX - this.dragStart.x;\r\n const deltaY = event.clientY - this.dragStart.y;\r\n \r\n const newX = Math.max(0, Math.min(window.innerWidth - 300, this.originalPosition.x + deltaX));\r\n const newY = Math.max(0, Math.min(window.innerHeight - 100, this.originalPosition.y + deltaY));\r\n \r\n this.position.set({ x: newX, y: newY });\r\n }\r\n\r\n onDragEnd() {\r\n this.isDragging.set(false);\r\n document.removeEventListener('mousemove', this.onDragMove.bind(this));\r\n document.removeEventListener('mouseup', this.onDragEnd.bind(this));\r\n }\r\n\r\n startResize(event: MouseEvent) {\r\n if (!this.computedConfig().resizable) return;\r\n \r\n event.preventDefault();\r\n event.stopPropagation();\r\n \r\n this.isResizing.set(true);\r\n this.resizeStart = { \r\n x: event.clientX, \r\n y: event.clientY, \r\n width: this.containerRef.nativeElement.offsetWidth,\r\n height: this.containerRef.nativeElement.offsetHeight\r\n };\r\n this.originalSize = { ...this.resizeStart };\r\n \r\n document.addEventListener('mousemove', this.onResizeMove.bind(this));\r\n document.addEventListener('mouseup', this.onResizeEnd.bind(this));\r\n }\r\n\r\n onResizeMove(event: MouseEvent) {\r\n if (!this.isResizing()) return;\r\n \r\n const deltaX = event.clientX - this.resizeStart.x;\r\n const deltaY = event.clientY - this.resizeStart.y;\r\n \r\n const newWidth = Math.max(300, this.originalSize.width + deltaX);\r\n const newHeight = Math.max(200, this.originalSize.height + deltaY);\r\n \r\n this.containerRef.nativeElement.style.width = `${newWidth}px`;\r\n this.containerRef.nativeElement.style.height = `${newHeight}px`;\r\n }\r\n\r\n onResizeEnd() {\r\n this.isResizing.set(false);\r\n document.removeEventListener('mousemove', this.onResizeMove.bind(this));\r\n document.removeEventListener('mouseup', this.onResizeEnd.bind(this));\r\n }\r\n\r\n // Mouse event handlers for container\r\n onMouseDown(event: MouseEvent) {\r\n // Prevent text selection during drag\r\n event.preventDefault();\r\n }\r\n\r\n onMouseMove(event: MouseEvent) {\r\n // Handle any additional mouse move logic if needed\r\n }\r\n\r\n onMouseUp(event: MouseEvent) {\r\n // Handle any additional mouse up logic if needed\r\n }\r\n\r\n // Action methods\r\n onHeaderClick(event: MouseEvent) {\r\n // Emit click event to bring container to front\r\n this.clickEvent.emit(this.computedConfig().id);\r\n \r\n // Only minimize if clicking on the header itself, not on buttons\r\n if (this.isMinimized() && !(event.target as HTMLElement).closest('button')) {\r\n this.minimize();\r\n }\r\n }\r\n\r\n minimize() {\r\n this.minimizeEvent.emit(this.computedConfig().id);\r\n }\r\n\r\n bringToFront() {\r\n // This will be handled by the container service through the manager component\r\n // The manager component will call the service's bringToFront method\r\n console.log(`🎯 [FloatingContainer] Container '${this.computedConfig().id}' clicked - bringing to front`);\r\n \r\n // Preserve current position to prevent jumping\r\n const currentPos = this.position();\r\n console.log(`🎯 [FloatingContainer] Preserving position: x=${currentPos.x}, y=${currentPos.y}`);\r\n }\r\n\r\n toggleMaximize() {\r\n this.maximizeEvent.emit(this.computedConfig().id);\r\n }\r\n\r\n close() {\r\n this.closeEvent.emit(this.computedConfig().id);\r\n }\r\n\r\n getHeaderBackground(): string {\r\n return 'linear-gradient(135deg, var(--cide-theme-primary-color) 0%, var(--tw-blue-400) 100%)';\r\n }\r\n}\r\n","import { Component, inject, computed } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CideEleFloatingContainerComponent } from './floating-container.component';\r\nimport { CideEleFloatingContainerService } from './floating-container.service';\r\nimport { CideEleFloatingContainerDynamicDirective } from './floating-container-dynamic.directive';\r\nimport { CideSpinnerComponent } from '../../elements/spinner/spinner.component';\r\nimport { CideEleButtonComponent } from '../../elements/button/cide-ele-button.component';\r\nimport { CideIconComponent } from '../../elements/icon/icon.component';\r\n\r\n@Component({\r\n selector: 'cide-ele-floating-container-manager',\r\n standalone: true,\r\n imports: [CommonModule, CideEleFloatingContainerComponent, CideEleFloatingContainerDynamicDirective, CideSpinnerComponent, CideEleButtonComponent, CideIconComponent],\r\n template: `\r\n @for (container of visibleContainers(); track container.id) {\r\n <cide-ele-floating-container\r\n [config]=\"containerService.getConfigSignal(container.config)\"\r\n [isMinimized]=\"containerService.getMinimizedSignal(container.id)\"\r\n [isMaximized]=\"containerService.getMaximizedSignal(container.id)\"\r\n [isVisible]=\"containerService.getVisibleSignal(container.id)\"\r\n [zIndex]=\"containerService.getZIndexSignal(container.id)\"\r\n (closeEvent)=\"containerService.onClose($event)\"\r\n (minimizeEvent)=\"containerService.onMinimize($event)\"\r\n (maximizeEvent)=\"containerService.onMaximize($event)\"\r\n (clickEvent)=\"containerService.bringToFront($event)\">\r\n \r\n <!-- Dynamic content loading with @defer for performance -->\r\n @defer (when container.isVisible) {\r\n <div \r\n cideEleFloatingDynamic\r\n [componentId]=\"container.config.componentId || container.config.id\"\r\n [componentConfig]=\"containerService.getComponentConfig(container.config)\"\r\n [isVisible]=\"container.isVisible\">\r\n </div>\r\n } @placeholder {\r\n <div class=\"tw-flex tw-items-center tw-justify-center tw-p-4\">\r\n <cide-ele-spinner size=\"sm\"></cide-ele-spinner>\r\n <span class=\"tw-ml-2 tw-text-sm tw-text-gray-600\">Loading component...</span>\r\n </div>\r\n } @error {\r\n <div class=\"tw-flex tw-flex-col tw-items-center tw-justify-center tw-p-4 tw-text-center\">\r\n <cide-ele-icon class=\"tw-w-8 tw-h-8 tw-text-red-500 tw-mb-2\">error</cide-ele-icon>\r\n <p class=\"tw-text-red-600 tw-font-medium\">Failed to load component</p>\r\n <p class=\"tw-text-gray-500 tw-text-sm\">Component \"{{ container.config.componentId || container.config.id }}\" is not available</p>\r\n <button \r\n cideEleButton \r\n variant=\"outline\" \r\n size=\"xs\" \r\n (click)=\"containerService.onClose(container.id)\"\r\n class=\"tw-mt-2\">\r\n Close\r\n </button>\r\n </div>\r\n }\r\n </cide-ele-floating-container>\r\n }\r\n `,\r\n styles: []\r\n})\r\nexport class CideEleFloatingContainerManagerComponent {\r\n containerService = inject(CideEleFloatingContainerService);\r\n\r\n // Computed properties\r\n visibleContainers = computed(() => this.containerService.visibleContainers());\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { KeyboardShortcutService } from '../../services/keyboard-shortcut.service';\r\nimport { CideEleFloatingContainerService } from './floating-container.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class FloatingContainerShortcutsService {\r\n private keyboardShortcutService = inject(KeyboardShortcutService);\r\n private containerService = inject(CideEleFloatingContainerService);\r\n\r\n // Z-index layers for different container states\r\n private readonly Z_INDEX_LAYERS = {\r\n HIDDEN: 100, // Hidden containers (behind everything)\r\n BACKGROUND: 1000, // Background containers\r\n NORMAL: 2000, // Normal visible containers\r\n FOCUSED: 3000, // Focused containers\r\n MODAL: 4000, // Modal containers\r\n TOOLTIP: 5000 // Tooltips and overlays\r\n };\r\n\r\n constructor() {\r\n this.registerDefaultShortcuts();\r\n }\r\n\r\n /**\r\n * Register default floating container shortcuts\r\n */\r\n private registerDefaultShortcuts(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Registering default shortcuts');\r\n\r\n // Alt + 1, Alt + 2, etc. - Focus specific containers\r\n this.registerNumberShortcuts();\r\n\r\n // Alt + N - New container\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-new',\r\n key: 'n',\r\n altKey: true,\r\n description: 'Create new floating container',\r\n action: () => this.openNewContainer(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + P - Previous container\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-previous',\r\n key: 'p',\r\n altKey: true,\r\n description: 'Focus previous container',\r\n action: () => this.focusPreviousContainer(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + H - Hide all containers\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-hide-all',\r\n key: 'h',\r\n altKey: true,\r\n description: 'Hide all containers',\r\n action: () => this.hideAllContainers(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + S - Show all containers\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-show-all',\r\n key: 's',\r\n altKey: true,\r\n description: 'Show all containers',\r\n action: () => this.showAllContainers(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + M - Minimize all containers\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-minimize-all',\r\n key: 'm',\r\n altKey: true,\r\n description: 'Minimize all containers',\r\n action: () => this.minimizeAllContainers(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + W - Close current container\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-close-current',\r\n key: 'w',\r\n altKey: true,\r\n description: 'Close current container',\r\n action: () => this.closeCurrentContainer(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + D - Duplicate current container\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-duplicate',\r\n key: 'd',\r\n altKey: true,\r\n description: 'Duplicate current container',\r\n action: () => this.duplicateCurrentContainer(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + T - Toggle container visibility\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-toggle-visibility',\r\n key: 't',\r\n altKey: true,\r\n description: 'Toggle container visibility',\r\n action: () => this.toggleContainerVisibility(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + O - Open file uploader\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-open-file-uploader',\r\n key: 'o',\r\n altKey: true,\r\n description: 'Open file uploader',\r\n action: () => this.openFileUploader(),\r\n preventDefault: true\r\n });\r\n\r\n // Alt + R - Open entity rights sharing\r\n this.keyboardShortcutService.register({\r\n id: 'floating-container-open-entity-rights',\r\n key: 'r',\r\n altKey: true,\r\n description: 'Open entity rights sharing',\r\n action: () => this.openEntityRightsSharing(),\r\n preventDefault: true\r\n });\r\n\r\n console.log('✅ [FloatingContainerShortcuts] Default shortcuts registered');\r\n }\r\n\r\n /**\r\n * Register number shortcuts (Alt + 1, Alt + 2, etc.)\r\n */\r\n private registerNumberShortcuts(): void {\r\n for (let i = 1; i <= 9; i++) {\r\n this.keyboardShortcutService.register({\r\n id: `floating-container-focus-${i}`,\r\n key: i.toString(),\r\n altKey: true,\r\n description: `Focus container ${i}`,\r\n action: () => this.focusContainerByIndex(i - 1),\r\n preventDefault: true\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Open new floating container\r\n */\r\n private openNewContainer(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Opening new container');\r\n const containerId = this.containerService.show({\r\n id: 'new-container-' + Date.now(),\r\n title: 'New Container',\r\n width: '400px',\r\n height: '300px'\r\n });\r\n console.log('✅ [FloatingContainerShortcuts] New container created:', containerId);\r\n }\r\n\r\n /**\r\n * Focus previous container\r\n */\r\n private focusPreviousContainer(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Focusing previous container');\r\n const containers = this.containerService.visibleContainers();\r\n if (containers.length > 0) {\r\n // For now, just focus the last container\r\n const previousIndex = containers.length - 1;\r\n this.containerService.bringToFront(containers[previousIndex].id);\r\n }\r\n }\r\n\r\n /**\r\n * Hide all containers\r\n */\r\n private hideAllContainers(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Hiding all containers');\r\n const containers = this.containerService.visibleContainers();\r\n containers.forEach(container => {\r\n this.containerService.setZIndex(container.id, this.Z_INDEX_LAYERS.HIDDEN);\r\n });\r\n console.log('✅ [FloatingContainerShortcuts] All containers hidden');\r\n }\r\n\r\n /**\r\n * Show all containers\r\n */\r\n private showAllContainers(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Showing all containers');\r\n const containers = this.containerService.visibleContainers();\r\n containers.forEach((container, index) => {\r\n this.containerService.setZIndex(container.id, this.Z_INDEX_LAYERS.NORMAL + index);\r\n });\r\n console.log('✅ [FloatingContainerShortcuts] All containers shown');\r\n }\r\n\r\n /**\r\n * Minimize all containers\r\n */\r\n private minimizeAllContainers(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Minimizing all containers');\r\n const containers = this.containerService.visibleContainers();\r\n containers.forEach(container => {\r\n // Implement minimize logic here\r\n console.log('📦 [FloatingContainerShortcuts] Minimizing container:', container.id);\r\n });\r\n console.log('✅ [FloatingContainerShortcuts] All containers minimized');\r\n }\r\n\r\n /**\r\n * Focus container by index\r\n */\r\n private focusContainerByIndex(index: number): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Focusing container at index:', index);\r\n const containers = this.containerService.visibleContainers();\r\n if (containers[index]) {\r\n this.containerService.bringToFront(containers[index].id);\r\n console.log('✅ [FloatingContainerShortcuts] Container focused:', containers[index].id);\r\n } else {\r\n console.warn('⚠️ [FloatingContainerShortcuts] Container not found at index:', index);\r\n }\r\n }\r\n\r\n /**\r\n * Open file uploader\r\n */\r\n private openFileUploader(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Opening file uploader');\r\n // Implement file uploader opening logic here\r\n console.log('✅ [FloatingContainerShortcuts] File uploader opened');\r\n }\r\n\r\n /**\r\n * Open entity rights sharing\r\n */\r\n private openEntityRightsSharing(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Opening entity rights sharing');\r\n // Implement entity rights sharing opening logic here\r\n console.log('✅ [FloatingContainerShortcuts] Entity rights sharing opened');\r\n }\r\n\r\n /**\r\n * Duplicate current container\r\n */\r\n private duplicateCurrentContainer(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Duplicating current container');\r\n const containers = this.containerService.visibleContainers();\r\n if (containers.length > 0) {\r\n const containerToDuplicate = containers[containers.length - 1]; // Use last container\r\n const newContainerId = this.containerService.show({\r\n id: 'duplicate-' + Date.now(),\r\n title: `${containerToDuplicate.config.title} (Copy)`,\r\n width: containerToDuplicate.config.width,\r\n height: containerToDuplicate.config.height\r\n });\r\n console.log('✅ [FloatingContainerShortcuts] Container duplicated:', newContainerId);\r\n } else {\r\n console.warn('⚠️ [FloatingContainerShortcuts] No container to duplicate');\r\n }\r\n }\r\n\r\n /**\r\n * Close current container\r\n */\r\n private closeCurrentContainer(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Closing current container');\r\n const containers = this.containerService.visibleContainers();\r\n if (containers.length > 0) {\r\n const containerToClose = containers[containers.length - 1]; // Use last container\r\n this.containerService.hide(containerToClose.id);\r\n console.log('✅ [FloatingContainerShortcuts] Container closed:', containerToClose.id);\r\n } else {\r\n console.warn('⚠️ [FloatingContainerShortcuts] No container to close');\r\n }\r\n }\r\n\r\n /**\r\n * Toggle container visibility\r\n */\r\n private toggleContainerVisibility(): void {\r\n console.log('🎯 [FloatingContainerShortcuts] Toggling container visibility');\r\n const containers = this.containerService.visibleContainers();\r\n if (containers.length > 0) {\r\n const containerToToggle = containers[containers.length - 1]; // Use last container\r\n const currentZIndex = this.containerService.getZIndexSignal(containerToToggle.id)();\r\n if (currentZIndex === this.Z_INDEX_LAYERS.HIDDEN) {\r\n this.containerService.setZIndex(containerToToggle.id, this.Z_INDEX_LAYERS.NORMAL);\r\n console.log('✅ [FloatingContainerShortcuts] Container shown:', containerToToggle.id);\r\n } else {\r\n this.containerService.setZIndex(containerToToggle.id, this.Z_INDEX_LAYERS.HIDDEN);\r\n console.log('✅ [FloatingContainerShortcuts] Container hidden:', containerToToggle.id);\r\n }\r\n } else {\r\n console.warn('⚠️ [FloatingContainerShortcuts] No container to toggle');\r\n }\r\n }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { CideEleFloatingContainerService, FloatingContainerConfig } from './floating-container.service';\r\nimport { FloatingContainerShortcutsService } from './floating-container-shortcuts.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CideEleFloatingFeaturesService {\r\n private containerService = inject(CideEleFloatingContainerService);\r\n private shortcutsService = inject(FloatingContainerShortcutsService);\r\n\r\n constructor() {\r\n // File uploader is handled by its own dedicated service\r\n // Entity rights sharing is handled by its own dedicated service\r\n }\r\n\r\n\r\n\r\n // Generic method to show any floating feature\r\n showFeature(featureId: string, config: FloatingContainerConfig): string {\r\n return this.containerService.show({ ...config, id: featureId });\r\n }\r\n\r\n // Generic method for showing any component dynamically\r\n showComponent(\r\n containerId: string,\r\n componentId: string,\r\n title: string,\r\n componentType?: any,\r\n config: Partial<FloatingContainerConfig> = {}\r\n ): string {\r\n const containerConfig: FloatingContainerConfig = {\r\n id: containerId,\r\n title,\r\n icon: 'widgets',\r\n width: '400px',\r\n height: '500px',\r\n minWidth: '300px',\r\n minHeight: '200px',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n componentId,\r\n ...config\r\n };\r\n\r\n // Register component if provided\r\n if (componentType) {\r\n this.registerComponent(componentId, componentType);\r\n }\r\n\r\n return this.containerService.show(containerConfig);\r\n }\r\n\r\n /**\r\n * Generic method for showing any component with input data\r\n * \r\n * @example\r\n * // Pass data to a component\r\n * this.floatingFeaturesService.showComponentWithData(\r\n * 'my-component-container',\r\n * 'my-component',\r\n * 'My Component Title',\r\n * {\r\n * data: {\r\n * userId: '123',\r\n * userName: 'John Doe',\r\n * settings: { theme: 'dark' }\r\n * },\r\n * outputs: {\r\n * onSave: (data) => console.log('Save event:', data),\r\n * onCancel: () => console.log('Cancel clicked')\r\n * }\r\n * },\r\n * {\r\n * width: '600px',\r\n * height: '400px',\r\n * icon: 'settings'\r\n * }\r\n * );\r\n */\r\n showComponentWithData(\r\n containerId: string,\r\n componentId: string,\r\n title: string,\r\n componentData: {\r\n data: { [key: string]: any };\r\n outputs?: { [key: string]: (event: any) => void };\r\n },\r\n containerConfig: Partial<FloatingContainerConfig> = {}\r\n ): string {\r\n const config: FloatingContainerConfig = {\r\n id: containerId,\r\n title,\r\n icon: 'widgets',\r\n width: '400px',\r\n height: '500px',\r\n minWidth: '300px',\r\n minHeight: '200px',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n componentId,\r\n componentConfig: {\r\n inputs: componentData.data,\r\n outputs: componentData.outputs || {}\r\n },\r\n ...containerConfig\r\n };\r\n\r\n return this.containerService.show(config);\r\n }\r\n\r\n // Show multiple instances of the same component\r\n showMultipleInstances(\r\n componentId: string,\r\n titlePrefix: string,\r\n count: number,\r\n config: Partial<FloatingContainerConfig> = {}\r\n ): string[] {\r\n const containerIds: string[] = [];\r\n \r\n for (let i = 1; i <= count; i++) {\r\n const containerId = `${componentId}-instance-${i}-${Date.now()}`;\r\n const title = `${titlePrefix} ${i}`;\r\n \r\n const containerConfig: FloatingContainerConfig = {\r\n id: containerId,\r\n title,\r\n icon: 'widgets',\r\n width: '400px',\r\n height: '500px',\r\n minWidth: '300px',\r\n minHeight: '200px',\r\n resizable: true,\r\n draggable: true,\r\n closable: true,\r\n minimizable: true,\r\n maximizable: true,\r\n componentId,\r\n ...config\r\n };\r\n\r\n const id = this.containerService.show(containerConfig);\r\n containerIds.push(id);\r\n }\r\n \r\n return containerIds;\r\n }\r\n\r\n // Get all instances of a component type\r\n getInstancesOfType(componentType: string) {\r\n return this.containerService.getInstancesByComponentType(componentType);\r\n }\r\n\r\n // Get active instances of a component type\r\n getActiveInstancesOfType(componentType: string) {\r\n return this.containerService.getActiveInstancesByComponentType(componentType);\r\n }\r\n\r\n // Close all instances of a component type\r\n closeAllInstancesOfType(componentType: string): void {\r\n this.containerService.closeAllInstancesOfType(componentType);\r\n }\r\n\r\n // Minimize all instances of a component type\r\n minimizeAllInstancesOfType(componentType: string): void {\r\n this.containerService.minimizeAllInstancesOfType(componentType);\r\n }\r\n\r\n // Get instance count for a component type\r\n getInstanceCount(componentType: string): number {\r\n return this.containerService.getInstanceCount(componentType);\r\n }\r\n\r\n // Get active instance count for a component type\r\n getActiveInstanceCount(componentType: string): number {\r\n return this.containerService.getActiveInstanceCount(componentType);\r\n }\r\n\r\n // Register a component for dynamic loading\r\n registerComponent(componentId: string, componentType: any): void {\r\n this.containerService.registerComponent(componentId, componentType);\r\n }\r\n\r\n // Unregister a component\r\n unregisterComponent(componentId: string): void {\r\n this.containerService.unregisterComponent(componentId);\r\n }\r\n\r\n hideFeature(featureId: string): void {\r\n this.containerService.hide(featureId);\r\n }\r\n\r\n // Utility methods\r\n bringToFront(featureId: string): void {\r\n this.containerService.bringToFront(featureId);\r\n }\r\n\r\n minimize(featureId: string): void {\r\n this.containerService.minimize(featureId);\r\n }\r\n\r\n maximize(featureId: string): void {\r\n this.containerService.maximize(featureId);\r\n }\r\n\r\n isVisible(featureId: string): boolean {\r\n return this.containerService.isVisible(featureId);\r\n }\r\n\r\n hideAll(): void {\r\n this.containerService.hideAll();\r\n }\r\n\r\n minimizeAll(): void {\r\n this.containerService.minimizeAll();\r\n }\r\n\r\n}\r\n","import { Directive, Input, OnInit, OnDestroy, ViewContainerRef, ComponentRef } from '@angular/core';\r\nimport { CideEleFloatingContainerService, FloatingComponentConfig } from './floating-container.service';\r\n\r\n@Directive({\r\n selector: '[cideEleFloatingDynamic]',\r\n standalone: true\r\n})\r\nexport class CideEleFloatingContainerDynamicDirective implements OnInit, OnDestroy {\r\n @Input() componentId!: string;\r\n @Input() componentConfig?: FloatingComponentConfig;\r\n @Input() isVisible: boolean = true;\r\n\r\n private componentRef: ComponentRef<any> | null = null;\r\n\r\n constructor(\r\n private viewContainer: ViewContainerRef,\r\n private containerService: CideEleFloatingContainerService\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n if (this.isVisible && this.componentId) {\r\n this.loadComponent();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyComponent();\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (this.isVisible && this.componentId && !this.componentRef) {\r\n this.loadComponent();\r\n } else if (!this.isVisible && this.componentRef) {\r\n this.destroyComponent();\r\n }\r\n }\r\n\r\n private loadComponent(): void {\r\n if (this.componentId && this.containerService.isComponentRegistered(this.componentId)) {\r\n this.componentRef = this.containerService.loadComponent(\r\n this.componentId,\r\n this.viewContainer,\r\n this.componentConfig\r\n );\r\n } else {\r\n console.warn(`Component '${this.componentId}' is not registered. Available components:`, this.containerService.getRegisteredComponentIds());\r\n \r\n // Retry after a short delay in case registration is still in progress\r\n setTimeout(() => {\r\n if (this.containerService.isComponentRegistered(this.componentId)) {\r\n this.componentRef = this.containerService.loadComponent(\r\n this.componentId,\r\n this.viewContainer,\r\n this.componentConfig\r\n );\r\n } else {\r\n console.error(`Component '${this.componentId}' still not registered after retry`);\r\n }\r\n }, 100);\r\n }\r\n }\r\n\r\n private destroyComponent(): void {\r\n if (this.componentRef) {\r\n this.componentRef.destroy();\r\n this.componentRef = null;\r\n }\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} ","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","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.CideElementsService","i2","catchError","i1","i1.CideEleFloatingContainerService"],"mappings":"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"}