@handsontable/angular-wrapper
Version:
Best Data Grid for Angular with Spreadsheet Look and Feel.
1 lines • 62.8 kB
Source Map (JSON)
{"version":3,"file":"handsontable-angular-wrapper.mjs","sources":["../../../projects/hot-table/src/lib/editor/custom-editor-placeholder.component.ts","../../../projects/hot-table/src/lib/editor/base-editor-adapter.ts","../../../projects/hot-table/src/lib/renderer/hot-cell-renderer.component.ts","../../../projects/hot-table/src/lib/renderer/hot-dynamic-renderer-component.service.ts","../../../projects/hot-table/src/lib/services/hot-settings-resolver.service.ts","../../../projects/hot-table/src/lib/services/hot-global-config.service.ts","../../../projects/hot-table/src/lib/hot-table.component.ts","../../../projects/hot-table/src/lib/hot-table.module.ts","../../../projects/hot-table/src/lib/editor/hot-cell-editor.component.ts","../../../projects/hot-table/src/public-api.ts","../../../projects/hot-table/src/handsontable-angular-wrapper.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ComponentRef,\n Input,\n ViewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { HotCellEditorComponent } from './hot-cell-editor.component';\n\n/**\n * Component representing a placeholder for a custom editor in Handsontable.\n * It is used only within the wrapper.\n */\n@Component({\n template: ` <div\n class=\"handsontableInputHolder ht_clone_master\"\n [style.display]=\"display\"\n [style.width.px]=\"width\"\n [style.height.px]=\"height\"\n [style.maxWidth.px]=\"width\"\n [style.maxHeight.px]=\"height\"\n [style.top.px]=\"top\"\n [style.left.px]=\"left\"\n >\n <ng-template #inputPlaceholder></ng-template>\n </div>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false,\n})\nexport class CustomEditorPlaceholderComponent {\n /** The top position of the editor. */\n @Input() top: number;\n\n /** The left position of the editor. */\n @Input() left: number;\n\n /** The height of the editor. */\n @Input() height: number;\n\n /** The width of the editor. */\n @Input() width: number;\n\n @Input()\n set isVisible(value: boolean) {\n this._isVisible = value;\n }\n\n /** The reference to the component instance of the editor. */\n @Input() set componentRef(\n hotEditorComponentRef: ComponentRef<HotCellEditorComponent<any>>\n ) {\n if (hotEditorComponentRef) {\n this.container.insert(hotEditorComponentRef.hostView);\n }\n }\n\n /** The container for the editor's input placeholder. */\n @ViewChild('inputPlaceholder', { read: ViewContainerRef, static: true }) container: ViewContainerRef;\n\n /** The display style of the editor. */\n get display(): string {\n return this._isVisible ? 'block' : 'none';\n }\n\n private _isVisible = false;\n\n /**\n * Detaches the container from the Handsontable.\n */\n detachEditor(): void {\n this.container.detach();\n }\n}\n","import Handsontable from 'handsontable/base';\nimport {\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n} from '@angular/core';\nimport { CustomEditorPlaceholderComponent } from './custom-editor-placeholder.component';\nimport { ColumnSettingsInternal } from '../models/column-settings';\nimport { HotCellEditorComponent } from './hot-cell-editor.component';\nimport { Subscription } from 'rxjs';\nimport { take } from 'rxjs/operators';\n\n/**\n * Adapter for BaseEditor from Handsontable.\n */\nexport class BaseEditorAdapter extends Handsontable.editors.BaseEditor {\n /** Reference to the custom editor component. */\n private _componentRef?: ComponentRef<HotCellEditorComponent<any>>;\n\n /** Reference to the editor placeholder component. */\n private _editorPlaceHolderRef: ComponentRef<CustomEditorPlaceholderComponent>;\n\n /** Flag indicating whether the placeholder is ready. */\n private _isPlaceholderReady = false;\n\n /** Subscription for the finish edit event. */\n private _finishEditSubscription?: Subscription;\n\n /** Subscription for the cancel edit event. */\n private _cancelEditSubscription?: Subscription;\n\n /**\n * Creates an instance of BaseEditorAdapter.\n * @param instance The Handsontable instance.\n */\n constructor(instance: Handsontable.Core) {\n super(instance);\n\n this.hot.addHook('afterRowResize', this.onAfterRowResize.bind(this));\n this.hot.addHook('afterColumnResize', this.onAfterColumnResize.bind(this));\n this.hot.addHook('afterDestroy', this.onAfterDestroy.bind(this));\n }\n\n /**\n * Prepares the editor for editing. Parameters are passed from Handsontable.\n * @param row The row index.\n * @param column The column index.\n * @param prop The property name.\n * @param TD The table cell element.\n * @param originalValue The original value of the cell.\n * @param cellProperties The cell properties.\n */\n override prepare(\n row: number,\n column: number,\n prop: string | number,\n TD: HTMLTableCellElement,\n originalValue: any,\n cellProperties: Handsontable.CellProperties\n ): void {\n if (!this.isOpened()) {\n super.prepare(row, column, prop, TD, originalValue, cellProperties);\n const columnMeta: ColumnSettingsInternal = this.hot.getColumnMeta(\n column\n ) as ColumnSettingsInternal;\n\n if (!this._isPlaceholderReady) {\n this.createEditorPlaceholder(columnMeta._environmentInjector);\n this._isPlaceholderReady = true;\n }\n\n this._componentRef = columnMeta._editorComponentReference;\n\n if (this._finishEditSubscription) {\n this._finishEditSubscription.unsubscribe();\n this._finishEditSubscription = undefined;\n }\n\n if (this._cancelEditSubscription) {\n this._cancelEditSubscription.unsubscribe();\n this._cancelEditSubscription = undefined;\n }\n\n this._finishEditSubscription = this._componentRef.instance.finishEdit\n .pipe(take(1))\n .subscribe(() => {\n this.finishEditing();\n });\n\n this._cancelEditSubscription = this._componentRef.instance.cancelEdit\n .pipe(take(1))\n .subscribe(() => {\n this.cancelChanges();\n });\n }\n }\n\n /**\n * Closes the editor. This event is triggered by Handsontable.\n */\n close(): void {\n if (this.isOpened()) {\n this.resetEditorState();\n this._editorPlaceHolderRef.changeDetectorRef.detectChanges();\n this._editorPlaceHolderRef.instance.detachEditor();\n this._componentRef.instance.onClose();\n }\n }\n\n /**\n * Focuses the editor. This event is triggered by Handsontable.\n */\n focus(): void {\n this._componentRef.instance.onFocus();\n }\n\n /**\n * Gets the value from the editor.\n * @returns The value from the editor.\n */\n getValue(): any {\n return this._componentRef.instance?.getValue();\n }\n\n /**\n * Opens the editor. This event is triggered by Handsontable.\n * When opening, we set the shortcut context to 'editor'.\n * This allows the built-in keyboard shortcuts to operate within the editor.\n * @param event The event that triggered the opening of the editor.\n * @remarks When entering edit mode using double-click, keyboard shortcuts do not work.\n */\n open(event?: Event): void {\n this.hot.getShortcutManager().setActiveContextName('editor');\n this.applyPropsToEditor();\n this._componentRef.instance.onOpen(event);\n }\n\n /**\n * Sets the value for the custom editor.\n * @param newValue The value to set.\n */\n setValue(newValue?: any): void {\n this._componentRef.instance?.setValue(newValue);\n this._componentRef.changeDetectorRef.detectChanges();\n }\n\n /**\n * Applies properties to the custom editor and editor placeholder.\n */\n private applyPropsToEditor(): void {\n const rect = this.getEditedCellRect();\n\n if (!this.isInFullEditMode()) {\n this._componentRef.instance.setValue(null);\n }\n\n this._componentRef.setInput('originalValue', this.originalValue);\n this._componentRef.setInput('row', this.row);\n this._componentRef.setInput('column', this.col);\n this._componentRef.setInput('prop', this.prop);\n this._componentRef.setInput('cellProperties', this.cellProperties);\n\n this._editorPlaceHolderRef.setInput('top', rect.top);\n this._editorPlaceHolderRef.setInput('left', rect.start);\n this._editorPlaceHolderRef.setInput('height', rect.height);\n this._editorPlaceHolderRef.setInput('width', rect.width);\n this._editorPlaceHolderRef.setInput('isVisible', true);\n this._editorPlaceHolderRef.setInput('componentRef', this._componentRef);\n this._editorPlaceHolderRef.changeDetectorRef.detectChanges();\n }\n\n /**\n * Creates the editor placeholder and append it to hot rootElement.\n * @param injector The environment injector.\n */\n private createEditorPlaceholder(injector: EnvironmentInjector): void {\n this._editorPlaceHolderRef = createComponent(\n CustomEditorPlaceholderComponent,\n {\n environmentInjector: injector as EnvironmentInjector,\n }\n );\n\n this.hot.rootElement.appendChild(\n this._editorPlaceHolderRef.location.nativeElement\n );\n }\n\n /**\n * Handles the after column resize event.\n * Helps adjust the editor size to the column size and update its position.\n */\n private onAfterColumnResize(): void {\n if (this.isOpened()) {\n this.applyPropsToEditor();\n }\n }\n\n /**\n * Handles the after row resize event.\n * Helps adjust the editor size to the column size and update its position.\n */\n private onAfterRowResize(): void {\n if (this.isOpened()) {\n this.applyPropsToEditor();\n }\n }\n\n /**\n * Handles the after destroy event.\n */\n private onAfterDestroy(): void {\n this._editorPlaceHolderRef?.destroy();\n }\n\n /**\n * Resets the editor placeholder state.\n * We need to reset the editor placeholder state because we use it\n * to store multiple references to the custom editor.\n */\n private resetEditorState(): void {\n this._editorPlaceHolderRef.setInput('top', undefined);\n this._editorPlaceHolderRef.setInput('left', undefined);\n this._editorPlaceHolderRef.setInput('height', undefined);\n this._editorPlaceHolderRef.setInput('width', undefined);\n this._editorPlaceHolderRef.setInput('isVisible', false);\n this._editorPlaceHolderRef.setInput('componentRef', undefined);\n }\n}\n","import Handsontable from 'handsontable/base';\nimport {Component, Input} from '@angular/core';\n\n/**\n * Abstract base component for creating custom cell renderer components for Handsontable.\n *\n * This class provides a common interface and properties required by any custom cell renderer.\n *\n * @template TValue - The type of the component renderer.\n * @template TProps - The type of additional renderer properties.\n */\n@Component({\n selector: 'hot-cell-renderer',\n template: `<!-- This is an abstract component. Extend this component and provide your own template. -->`\n})\nexport abstract class HotCellRendererComponent<TValue extends string | number | boolean = string, TProps extends {} = any> {\n static readonly RENDERER_MARKER = Symbol('HotCellRendererComponent');\n\n @Input() value: TValue = '' as TValue;\n\n @Input() instance: Handsontable;\n @Input() td: HTMLTableCellElement;\n @Input() row: number;\n @Input() col: number;\n @Input() prop: string;\n\n /**\n * The cell properties provided by Handsontable, extended with optional renderer-specific properties.\n */\n @Input() cellProperties: Handsontable.CellProperties & { rendererProps?: TProps };\n\n /**\n * Retrieves the renderer-specific properties from the cell properties.\n *\n * @returns The additional properties for the renderer.\n */\n public getProps(): TProps {\n return this.cellProperties?.rendererProps ?? ({} as TProps);\n }\n}\n","import {\n ApplicationRef, ComponentRef, createComponent,\n EmbeddedViewRef, EnvironmentInjector, Injectable,\n TemplateRef, Type\n} from '@angular/core';\nimport {baseRenderer, BaseRenderer} from 'handsontable/renderers';\nimport Handsontable from 'handsontable/base';\nimport {HotCellRendererComponent} from './hot-cell-renderer.component';\n\ntype BaseRendererParameters = Parameters<BaseRenderer>;\n\nexport const INVALID_RENDERER_WARNING =\n 'The provided renderer component was not recognized as a valid custom renderer. ' +\n 'It must either extend HotCellRendererComponent or be a valid TemplateRef. ' +\n 'Please ensure that your custom renderer is implemented correctly and imported from the proper source.';\n\n/**\n * An object representing the parameters passed to a Handsontable renderer.\n */\ninterface BaseRendererParametersObject {\n instance: Handsontable.Core;\n td: HTMLTableCellElement;\n row: number;\n col: number;\n prop: string | number;\n value: any;\n cellProperties: Handsontable.CellProperties;\n}\n\n/**\n * Type guard that checks if the given object is a TemplateRef.\n *\n * @param obj - The object to check.\n * @returns True if the object is a TemplateRef; otherwise, false.\n */\nexport function isTemplateRef<T>(obj: any): obj is TemplateRef<T> {\n return obj && typeof obj.createEmbeddedView === 'function';\n}\n\n/**\n * Type guard to check if an object is an instance of HotCellRendererComponent.\n *\n * @param obj - The object to check.\n * @returns True if the object is a HotCellRendererComponent, false otherwise.\n */\nexport function isHotCellRendererComponent(obj: any): obj is Type<HotCellRendererComponent> {\n return obj?.RENDERER_MARKER === HotCellRendererComponent.RENDERER_MARKER;\n}\n\n/**\n * Service for dynamically creating Angular components or templates as custom renderers for Handsontable.\n *\n * This service allows you to create a renderer function that wraps a given Angular component or TemplateRef\n * so that it can be used as a Handsontable renderer.\n *\n * @example\n * const customRenderer = dynamicComponentService.createRendererFromComponent(MyRendererComponent, { someProp: value });\n * // Use customRenderer in your Handsontable configuration\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class DynamicComponentService {\n constructor(\n private appRef: ApplicationRef,\n private environmentInjector: EnvironmentInjector\n ) {}\n\n /**\n * Creates a custom renderer function for Handsontable from an Angular component or TemplateRef.\n * The generated renderer function will be used by Handsontable to render cell content.\n *\n * @param component - The Angular component type or TemplateRef to use as renderer.\n * @param componentProps - An object containing additional properties to use by the renderer.\n * @param register - If true, registers the renderer with Handsontable using the component's name.\n * @returns A renderer function that can be used in Handsontable's configuration.\n */\n createRendererFromComponent(\n component: Type<HotCellRendererComponent> | TemplateRef<any>,\n componentProps: Record<string, any> = {},\n register: boolean = false\n ) {\n return (\n instance: Handsontable.Core,\n td: HTMLTableCellElement,\n row: number,\n col: number,\n prop: string | number,\n value: any,\n cellProperties: Handsontable.CellProperties\n ) => {\n const properties: BaseRendererParametersObject = {\n value, instance, td, row, col, prop, cellProperties\n };\n\n if (componentProps) {\n Object.assign(cellProperties, {rendererProps: componentProps});\n }\n\n const rendererParameters: BaseRendererParameters = [\n instance, td, row, col, prop, value, cellProperties\n ];\n\n baseRenderer.apply(this, rendererParameters);\n\n td.innerHTML = '';\n\n if (isTemplateRef(component)) {\n this.attachTemplateToElement(component, td, properties);\n } else if (isHotCellRendererComponent(component)){\n const componentRef = this.createComponent(component, properties);\n this.attachComponentToElement(componentRef, td);\n } else {\n console.warn(INVALID_RENDERER_WARNING)\n }\n\n if (register && isHotCellRendererComponent(component)) {\n Handsontable.renderers.registerRenderer(\n component.constructor.name,\n component as any as BaseRenderer\n );\n }\n\n return td;\n };\n }\n\n /**\n * Attaches an embedded view created from a TemplateRef to a given DOM element.\n *\n * @param template - The TemplateRef to create an embedded view from.\n * @param tdEl - The target DOM element (a table cell) to which the view will be appended.\n * @param properties - Context object providing properties to be used within the template.\n */\n private attachTemplateToElement(\n template: TemplateRef<any>,\n tdEl: HTMLTableCellElement,\n properties: BaseRendererParametersObject\n ) {\n const embeddedView: EmbeddedViewRef<any> = template.createEmbeddedView({\n $implicit: properties.value,\n ...properties,\n });\n embeddedView.detectChanges();\n\n embeddedView.rootNodes.forEach((node) => {\n tdEl.appendChild(node);\n });\n }\n\n /**\n * Dynamically creates an Angular component of the given type.\n *\n * @param component - The Angular component type to be created.\n * @param rendererParameters - An object containing input properties to assign to the component instance.\n * @returns The ComponentRef of the dynamically created component.\n */\n private createComponent<T extends HotCellRendererComponent>(\n component: Type<T>,\n rendererParameters: BaseRendererParametersObject\n ): ComponentRef<T> {\n const componentRef = createComponent(component, {\n environmentInjector: this.environmentInjector\n });\n\n Object.keys(rendererParameters).forEach(key => {\n if (rendererParameters.hasOwnProperty(key)) {\n componentRef.setInput(key, rendererParameters[key])\n } else {\n console.warn(`Input property \"${key}\" does not exist on component instance: ${component?.name}.`);\n }\n })\n componentRef.changeDetectorRef.detectChanges();\n\n this.appRef.attachView(componentRef.hostView);\n\n return componentRef;\n }\n\n /**\n * Attaches a dynamically created component's view to a specified DOM container element.\n *\n * @param componentRef - The reference to the dynamically created component.\n * @param container - The target DOM element to which the component's root node will be appended.\n */\n private attachComponentToElement<T>(\n componentRef: ComponentRef<T>,\n container: HTMLElement\n ): void {\n const domElem = (componentRef.hostView as EmbeddedViewRef<T>)\n .rootNodes[0] as HTMLElement;\n container.appendChild(domElem);\n }\n\n /**\n * Destroys a dynamically created component and detaches its view from the Angular application.\n *\n * @param componentRef - The reference to the component to be destroyed.\n */\n destroyComponent<T>(componentRef: ComponentRef<T>): void {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n }\n}\n","import {createComponent, EnvironmentInjector, Injectable, NgZone, TemplateRef, Type} from '@angular/core';\nimport { DynamicComponentService } from '../renderer/hot-dynamic-renderer-component.service';\nimport { BaseEditorAdapter } from '../editor/base-editor-adapter';\nimport { GridSettings, GridSettingsInternal } from '../models/grid-settings';\nimport { CustomValidatorFn, ColumnSettings } from '../models/column-settings';\nimport { HotCellRendererComponent } from '../renderer/hot-cell-renderer.component';\nimport { HotCellEditorComponent } from '../editor/hot-cell-editor.component';\nimport Handsontable from 'handsontable/base';\n\nconst AVAILABLE_OPTIONS: string[] = Object.keys(Handsontable.DefaultSettings);\nconst AVAILABLE_HOOKS: string[] = Handsontable.hooks.getRegistered();\n\n/**\n * Service to resolve and apply custom settings for Handsontable settings object.\n */\n@Injectable()\nexport class HotSettingsResolver {\n constructor(private dynamicComponentService: DynamicComponentService, private readonly environmentInjector: EnvironmentInjector) {}\n\n /**\n * Applies custom settings to the provided GridSettings.\n * @param settings The original grid settings.\n * @param ngZone The NgZone instance to run hooks inside the zone context.\n * @returns The merged grid settings with custom settings applied.\n */\n applyCustomSettings(settings: GridSettings, ngZone: NgZone): GridSettingsInternal {\n const mergedSettings: GridSettings = settings;\n\n this.updateColumnRendererForGivenCustomRenderer(mergedSettings);\n this.updateColumnEditorForGivenCustomEditor(mergedSettings);\n this.updateColumnValidatorForGivenCustomValidator(mergedSettings);\n\n this.wrapHooksInNgZone(mergedSettings, ngZone);\n\n return (mergedSettings as GridSettingsInternal) ?? {};\n }\n\n /**\n * Ensures that hook callbacks in the provided grid settings run inside Angular's zone.\n *\n * @param settings The original grid settings.\n * @param ngZone The NgZone instance to run hooks inside the zone context.\n */\n private wrapHooksInNgZone(settings: GridSettings, ngZone: NgZone) {\n const options = AVAILABLE_HOOKS.concat(AVAILABLE_OPTIONS);\n\n options.forEach(key => {\n const isHook = AVAILABLE_HOOKS.indexOf(key) > -1;\n let option;\n\n if (isHook) {\n option = settings[key];\n }\n\n if (option === void 0) {\n return;\n\n } else if (!!ngZone && (typeof option === 'function' && isHook)) {\n settings[key] = function(...args: any) {\n return ngZone.run(() => option.apply(this, args));\n };\n\n } else {\n settings[key] = option;\n }\n });\n }\n\n /**\n * Updates the column renderer for columns with a custom renderer.\n * @param mergedSettings The merged grid settings.\n */\n private updateColumnRendererForGivenCustomRenderer(mergedSettings: GridSettings): void {\n if (!Array.isArray(mergedSettings?.columns)) {\n return;\n }\n\n (mergedSettings?.columns as ColumnSettings[])\n ?.filter((settings) => this.isRendererComponentRefType(settings.renderer) || this.isTemplateRef(settings.renderer))\n ?.forEach((cellSettings) => {\n const renderer = this.isTemplateRef(cellSettings.renderer)\n ? (cellSettings.renderer as TemplateRef<any>)\n : (cellSettings.renderer as Type<HotCellRendererComponent<any, any>>);\n const props: any = cellSettings.rendererProps ?? {};\n cellSettings.renderer = this.dynamicComponentService.createRendererFromComponent(renderer, props);\n });\n }\n\n /**\n * Updates the column editor for columns with a custom editor.\n * @param mergedSettings The merged grid settings.\n */\n private updateColumnEditorForGivenCustomEditor(mergedSettings: GridSettings): void {\n if (!Array.isArray(mergedSettings?.columns)) {\n return;\n }\n\n (mergedSettings?.columns as ColumnSettings[])\n ?.filter((settings) => this.isEditorComponentRefType(settings.editor))\n ?.forEach((cellSettings) => {\n const customEditor = cellSettings.editor as Type<HotCellEditorComponent<any>>;\n cellSettings['_editorComponentReference'] = createComponent(customEditor, {\n environmentInjector: this.environmentInjector,\n });\n cellSettings['_environmentInjector'] = this.environmentInjector;\n cellSettings.editor = BaseEditorAdapter;\n });\n }\n\n /**\n * Updates the column validator for columns with a custom validator.\n * @param mergedSettings The merged grid settings.\n */\n private updateColumnValidatorForGivenCustomValidator(mergedSettings: GridSettings): void {\n if (!Array.isArray(mergedSettings?.columns)) {\n return;\n }\n\n (mergedSettings?.columns as ColumnSettings[])\n ?.filter((settings) => this.isCustomValidatorFn(settings.validator))\n ?.forEach((cellSettings) => {\n const customValidatorFn = cellSettings.validator as CustomValidatorFn<any>;\n\n cellSettings.validator = (value: any, callback: (result: boolean) => void) => {\n callback(customValidatorFn(value));\n };\n });\n }\n\n private isCustomValidatorFn(validator: unknown): validator is CustomValidatorFn<any> {\n return typeof validator === 'function' && validator.length === 1;\n }\n\n private isEditorComponentRefType(editor: any): editor is Type<HotCellEditorComponent<any>> {\n // ecmp - we need it to check if the editor is a component\n return typeof editor === 'function' && !!(editor as any)?.ɵcmp;\n }\n\n private isRendererComponentRefType(renderer: any): renderer is Type<HotCellRendererComponent<any, any>> {\n // ecmp - we need it to check if the renderer is a component\n return typeof renderer === 'function' && !!(renderer as any)?.ɵcmp;\n }\n\n private isTemplateRef(renderer: any): renderer is TemplateRef<any> {\n return renderer && typeof renderer.createEmbeddedView === 'function';\n }\n}\n","import {Injectable, InjectionToken, Inject} from '@angular/core';\nimport {BehaviorSubject, Observable} from 'rxjs';\n\n/**\n * A constant representing the non-commercial and evaluation license.\n * */\nexport const NON_COMMERCIAL_LICENSE = 'non-commercial-and-evaluation';\n\n/**\n * Type representing a theme name.\n * Possible values include predefined themes and any custom string.\n */\nexport enum PredefinedTheme {\n Main = 'ht-theme-main',\n MainDark = 'ht-theme-main-dark',\n MainDarkAuto = 'ht-theme-main-dark-auto',\n Horizon = 'ht-theme-horizon',\n HorizonDark = 'ht-theme-horizon-dark',\n HorizonDarkAuto = 'ht-theme-horizon-dark-auto'\n}\n\nexport type ThemeName = PredefinedTheme | string;\n\n/**\n * Interface for the Handsontable global configuration.\n */\nexport interface HotGlobalConfig {\n /**\n * The license key for Handsontable.\n */\n license?: string;\n\n /**\n * The name of the theme to be used.\n */\n themeName?: ThemeName;\n\n /**\n * The language code to be used for localization.\n * For example, 'en-US', 'pl-PL', etc.\n * **Note:** The language must be chosen from the languages supported by Handsontable and registered in the application.\n */\n language?: string;\n\n /**\n * The layout direction for the Handsontable instance.\n * This property defines whether the layout should be left-to-right ('ltr'), right-to-left ('rtl'),\n * or inherit the direction from the parent element ('inherit').\n */\n layoutDirection?: 'ltr' | 'rtl' | 'inherit';\n}\n\n/**\n * Injection token for providing a global default configuration.\n */\nexport const HOT_GLOBAL_CONFIG = new InjectionToken<HotGlobalConfig>('HOT_GLOBAL_CONFIG', {\n providedIn: 'root',\n factory: () => ({})\n});\n\n/**\n * Service for configuring Handsontable settings.\n * This service allows setting and retrieving global configuration.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class HotGlobalConfigService {\n\n /**\n * The default configuration object for Handsontable.\n *\n * This object is used as the initial value for the configuration BehaviorSubject.\n * It can be overridden by a global configuration provided through the\n * {@link HOT_GLOBAL_CONFIG} injection token.\n *\n * @private\n * @type {HotGlobalConfig}\n */\n private defaultConfig: HotGlobalConfig = {\n license: undefined,\n themeName: ''\n };\n\n /**\n * A BehaviorSubject that holds the current Handsontable configuration.\n *\n * New configuration values can be emitted by calling next() on this subject.\n * This allows subscribers to react to configuration changes dynamically.\n *\n * @private\n * @type {BehaviorSubject<HotGlobalConfig>}\n */\n private configSubject = new BehaviorSubject<HotGlobalConfig>(this.defaultConfig);\n\n /**\n * An Observable stream of the current Handsontable configuration.\n *\n * Components can subscribe to this observable to receive updates whenever the configuration changes.\n *\n * @returns The configuration as an observable stream.\n */\n get config$(): Observable<HotGlobalConfig> {\n return this.configSubject.asObservable();\n }\n\n constructor(\n @Inject(HOT_GLOBAL_CONFIG) globalConfig: HotGlobalConfig\n ) {\n // Merge global configuration (if provided) into defaultConfig immutably.\n this.defaultConfig = { ...this.defaultConfig, ...globalConfig };\n this.configSubject.next(this.defaultConfig);\n }\n\n /**\n * Sets the global configuration for Handsontable.\n *\n * @param config - An object containing configuration options.\n * Each Handsontable instance can override this configuration by providing its own settings.\n */\n setConfig(config: HotGlobalConfig) {\n this.configSubject.next({ ...this.defaultConfig, ...config });\n }\n\n /**\n * Retrieves the current Handsontable configuration.\n *\n * @returns An object with the current settings.\n */\n getConfig(): HotGlobalConfig {\n return this.configSubject.value;\n }\n\n /**\n * Resets the configuration to the default settings.\n * This method updates the configuration BehaviorSubject with the default configuration.\n */\n resetConfig(): void {\n this.configSubject.next({ ...this.defaultConfig });\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport Handsontable from 'handsontable/base';\nimport { HotSettingsResolver } from './services/hot-settings-resolver.service';\nimport { HotGlobalConfigService } from './services/hot-global-config.service';\nimport { GridSettings } from './models/grid-settings';\nimport { Subscription } from 'rxjs';\n\nexport const HOT_DESTROYED_WARNING = 'The Handsontable instance bound to this component was destroyed and cannot be' + ' used properly.';\n\n@Component({\n selector: 'hot-table',\n template: '<div #container></div>',\n encapsulation: ViewEncapsulation.None,\n providers: [HotSettingsResolver],\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class HotTableComponent implements AfterViewInit, OnChanges, OnDestroy {\n // component inputs\n /** The data for the Handsontable instance. */\n @Input() data: Handsontable.GridSettings['data'] | null = null;\n /** The settings for the Handsontable instance. */\n @Input() settings: GridSettings = {};\n\n /** The container element for the Handsontable instance. */\n @ViewChild('container', { static: false })\n public container: ElementRef<HTMLDivElement>;\n\n /** The Handsontable instance. */\n private __hotInstance: Handsontable | null = null;\n private configSubscription: Subscription;\n\n constructor(private _hotSettingsResolver: HotSettingsResolver, private _hotConfig: HotGlobalConfigService, public ngZone: NgZone) {}\n\n /**\n * Gets the Handsontable instance.\n * @returns The Handsontable instance or `null` if it's not yet been created or has been destroyed.\n */\n public get hotInstance(): Handsontable | null {\n if (!this.__hotInstance || (this.__hotInstance && !this.__hotInstance.isDestroyed)) {\n // Will return the Handsontable instance or `null` if it's not yet been created.\n return this.__hotInstance;\n } else {\n console.warn(HOT_DESTROYED_WARNING);\n return null;\n }\n }\n\n /**\n * Sets the Handsontable instance.\n * @param hotInstance The Handsontable instance to set.\n */\n private set hotInstance(hotInstance) {\n this.__hotInstance = hotInstance;\n }\n\n /**\n * Initializes the Handsontable instance after the view has been initialized.\n * The initial settings of the table are also prepared here\n */\n ngAfterViewInit(): void {\n let options: Handsontable.GridSettings = this._hotSettingsResolver.applyCustomSettings(this.settings, this.ngZone);\n\n const negotiatedSettings = this.getNegotiatedSettings(options);\n options = { ...options, ...negotiatedSettings, data: this.data };\n\n this.ngZone.runOutsideAngular(() => {\n this.hotInstance = new Handsontable.Core(this.container.nativeElement, options);\n\n this.hotInstance.init();\n });\n\n this.configSubscription = this._hotConfig.config$.subscribe((config) => {\n if (this.hotInstance) {\n const negotiatedSettings = this.getNegotiatedSettings(this.settings);\n this.updateHotTable(negotiatedSettings);\n }\n });\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.hotInstance === null) {\n return;\n }\n\n if (changes.settings && !changes.settings.firstChange) {\n const newOptions: Handsontable.GridSettings = this._hotSettingsResolver.applyCustomSettings(\n changes.settings.currentValue,\n this.ngZone\n );\n\n this.updateHotTable(newOptions);\n }\n\n if (changes.data && !changes.data.firstChange) {\n this.hotInstance?.updateData(changes.data.currentValue);\n }\n }\n\n /**\n * Destroys the Handsontable instance and clears the columns from custom editors.\n */\n ngOnDestroy(): void {\n this.ngZone.runOutsideAngular(() => {\n if (!this.hotInstance) {\n return;\n }\n\n const columns = this.hotInstance.getSettings().columns;\n\n if (columns && Array.isArray(columns)) {\n columns.forEach((column) => {\n if (column._editorComponentReference) {\n column._editorComponentReference.destroy();\n }\n });\n }\n\n this.hotInstance.destroy();\n });\n\n this.configSubscription.unsubscribe();\n }\n\n /**\n * Updates the Handsontable instance with new settings.\n * @param newSettings The new settings to apply to the Handsontable instance.\n */\n private updateHotTable(newSettings: Handsontable.GridSettings): void {\n if (!this.hotInstance) {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n this.hotInstance?.updateSettings(newSettings, false);\n });\n }\n\n /**\n * Merges the provided Handsontable grid settings with the global configuration.\n *\n * This method retrieves the global configuration from the HotGlobalConfigService and negotiates the final\n * Handsontable settings by giving precedence to the provided settings.\n * Additionally, the `layoutDirection` is only merged if the Handsontable instance has not yet been initialized.\n *\n * @param settings - The grid settings provided by the user or component.\n * @returns The final negotiated grid settings after merging with global defaults.\n */\n private getNegotiatedSettings(settings: GridSettings): Handsontable.GridSettings {\n const hotConfig = this._hotConfig.getConfig();\n const negotiatedSettings: Handsontable.GridSettings = {};\n\n negotiatedSettings.licenseKey = settings.licenseKey ?? hotConfig.license;\n negotiatedSettings.themeName = settings.themeName ?? hotConfig.themeName;\n negotiatedSettings.language = settings.language ?? hotConfig.language;\n\n // settings that can be set only before the Handsontable instance is initialized\n if (!this.__hotInstance) {\n negotiatedSettings.layoutDirection = settings.layoutDirection ?? hotConfig.layoutDirection;\n }\n\n return negotiatedSettings;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { HotTableComponent } from './hot-table.component';\nimport { CustomEditorPlaceholderComponent } from './editor/custom-editor-placeholder.component';\n\n@NgModule({\n declarations: [HotTableComponent, CustomEditorPlaceholderComponent],\n imports: [],\n exports: [HotTableComponent],\n})\nexport class HotTableModule {\n /**\n * Placeholder for the library version.\n * Replaced automatically during the pre-build/post-build process.\n */\n static version = '16.1.1';\n\n constructor() {}\n\n public static forRoot(): ModuleWithProviders<HotTableModule> {\n return {\n ngModule: HotTableModule,\n };\n }\n}\n","import { Directive, EventEmitter, HostBinding, Input, Output } from '@angular/core';\nimport { CellProperties } from 'handsontable/settings';\n\n/**\n * Abstract class representing a Handsontable editor in angular.\n */\n@Directive()\nexport abstract class HotCellEditorComponent<T extends string | number | boolean> {\n /** The tabindex attribute for the editor. */\n @HostBinding('attr.tabindex') protected tabindex = -1;\n\n /** The data-hot-input attribute for the editor. */\n @HostBinding('attr.data-hot-input') protected dataHotInput = '';\n\n /** The handsontableInput class for the editor. */\n @HostBinding('class.handsontableInput') protected handsontableInputClass = true;\n\n /** The height of the editor as a percentage of the parent container. */\n @HostBinding('style.height.%') protected heightFitParentContainer = 100;\n\n /** The width of the editor as a percentage of the parent container. */\n @HostBinding('style.width.%') protected widthFitParentContainer = 100;\n\n /** The row index of the cell being edited. */\n @Input() row: number;\n\n /** The column index of the cell being edited. */\n @Input() column: number;\n\n /** The property name of the cell being edited. */\n @Input() prop: string | number;\n\n /** The original value of the cell being edited. */\n @Input() originalValue: T;\n\n /** The cell properties of the cell being edited. */\n @Input() cellProperties: CellProperties;\n\n /** Event emitted when the edit is finished.\n * The data will be saved to the model.\n */\n @Output() finishEdit = new EventEmitter<void>();\n\n /** Event emitted when the edit is canceled.\n * The entered data will be reverted to the original value.\n */\n @Output() cancelEdit = new EventEmitter<void>();\n\n /** The current value of the editor. */\n private _value: T;\n\n /** Event triggered by Handsontable on closing the editor.\n * The user can define their own actions for\n * the custom editor to be called after the base logic. */\n onClose(): void {}\n\n /** Event triggered by Handsontable on open the editor.\n * The user can define their own actions for\n * the custom editor to be called after the base logic. */\n onOpen(event?: Event): void {}\n\n /** Event triggered by Handsontable on focus the editor.\n * The user have to define focus logic.\n * @example\n * ```typescript\n * component({\n * template: `<input #inputElement>`\n * })\n * class CustomEditor extends HotEditor<string> {\n * @ViewChild('inputElement') inputElement!: ElementRef;\n *\n * onFocus(): void {\n * this.inputElement.nativeElement.focus();\n * }\n * }\n * ```\n */\n abstract onFocus(): void;\n\n /**\n * Gets the current value of the editor.\n * @returns The current value of the editor.\n */\n getValue(): T {\n return this._value;\n }\n\n /**\n * Sets the current value of the editor.\n * @param value The value to set.\n */\n setValue(value: T): void {\n this._value = value;\n }\n}\n","/*\n * Public API Surface of hot-table\n */\n\nexport * from './lib/hot-table.component';\nexport * from './lib/services/hot-settings-resolver.service';\nexport * from './lib/hot-table.module';\nexport * from './lib/services/hot-global-config.service';\nexport * from './lib/renderer/hot-dynamic-renderer-component.service';\nexport * from './lib/renderer/hot-cell-renderer.component';\nexport * from './lib/editor/hot-cell-editor.component';\nexport { GridSettings } from './lib/models/grid-settings';\nexport { ColumnSettings, CustomValidatorFn } from './lib/models/column-settings';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.DynamicComponentService","i1.HotSettingsResolver","i2.HotGlobalConfigService"],"mappings":"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