@guiexpert/angular-table 22.1.98 → 22.1.100

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":"guiexpert-angular-table.mjs","names":["i1.DomService"],"sources":["../../lib/src/lib/service/dom-service.ts","../../lib/src/lib/table.component.ts","../../lib/src/lib/service/renderer-wrapper.ts","../../lib/src/lib/service/render-wrapper-factory.ts","../../lib/src/lib/service/detail-renderer-wrapper.ts","../../lib/src/lib/service/detail-render-wrapper-factory.ts"],"sourcesContent":["import {Injectable, Renderer2} from \"@angular/core\";\nimport {DomServiceIf} from \"@guiexpert/table\";\n\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class DomService implements DomServiceIf {\n\n constructor(\n readonly renderer: Renderer2,\n ) {\n }\n\n setStyle(el: any, style: string, value: any): any {\n this.renderer.setStyle(el, style, value);\n return el;\n };\n\n\n appendText(parent: HTMLDivElement, text: string): HTMLDivElement {\n const div = this.renderer.createText(text);\n this.renderer.appendChild(parent, div);\n return div;\n }\n\n\n addClass(div: HTMLDivElement, clazz: string) {\n if (clazz.includes(' ')) {\n clazz.split(' ').forEach(c => this.renderer.addClass(div, c))\n } else {\n this.renderer.addClass(div, clazz);\n }\n return div;\n }\n\n removeClass(div: HTMLDivElement, clazz: string) {\n if (clazz.includes(\" \")) {\n clazz.split(\" \").forEach(c => div.classList.remove(c));\n } else {\n div.classList.remove(clazz);\n }\n return div;\n }\n\n appendChild(parent: HTMLElement, child: HTMLElement): void {\n this.renderer.appendChild(parent, child);\n }\n\n createElement<T>(name: string): T {\n return this.renderer.createElement(name);\n }\n\n createText(text: string): HTMLElement {\n return this.renderer.createText(text);\n }\n\n setAttribute(ele: HTMLElement, key: string, value: string): void {\n this.renderer.setAttribute(ele, key, value);\n }\n\n removeAttribute(ele: HTMLElement, key: string): void {\n this.renderer.removeAttribute(ele, key);\n }\n\n\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n Renderer2,\n SimpleChanges,\n ViewEncapsulation\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { debounceTime, Subject, takeWhile } from \"rxjs\";\nimport {\n EventListenerIf, FocusModelIf,\n GeBatchEditEvent, GeDetailEvent, GeModelChangeEvent, GeRowDragEvent, GeScrollEvent, GeStateChangeEvent,\n GeMouseEvent, SelectionModelIf,\n TableApi,\n TableModelIf,\n TableOptions,\n TableOptionsIf,\n TableScope\n} from '@guiexpert/table';\nimport { DomService } from \"./service/dom-service\";\n\n\n@Component({\n selector: \"guiexpert-table\",\n standalone: true,\n imports: [CommonModule],\n providers: [DomService],\n template: \"\",\n styleUrls: [\n \"./table.component.css\"\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TableComponent implements OnInit, OnChanges, OnDestroy, EventListenerIf {\n\n @Output()\n tableReady = new Subject<TableApi>();\n\n @Output()\n scroll: Subject<GeScrollEvent> = new Subject<GeScrollEvent>();\n\n @Output()\n mouseMoved: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n mouseDragging: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n mouseDraggingEnded: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n contextmenu: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n mouseClicked: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n modelChanged: Subject<GeModelChangeEvent> = new Subject<GeModelChangeEvent>();\n\n @Output()\n selectionChanged: Subject<SelectionModelIf> = new Subject<SelectionModelIf>();\n\n @Output()\n focusChanged: Subject<FocusModelIf> = new Subject<FocusModelIf>();\n\n @Output()\n checkboxChanged: Subject<any[]> = new Subject<any[]>();\n\n /**\n * The state changed (column layout, sorting, scroll position, tree, checked/selected rows …) – once after the\n * changes settled. Save `evt.state` and pass it back as `tableOptions.initialState`.\n *\n * @since 1.1.92\n */\n @Output()\n stateChanged: Subject<GeStateChangeEvent> = new Subject<GeStateChangeEvent>();\n\n /**\n * Row drag (handles via `ColumnDef.rowDrag`): a drag started. `evt.preventDefault()` cancels it.\n *\n * @since 1.1.95\n */\n @Output()\n rowDragStart: Subject<GeRowDragEvent> = new Subject<GeRowDragEvent>();\n\n /**\n * Row drag: the drop target changed. `evt.preventDefault()` marks it as invalid.\n *\n * @since 1.1.95\n */\n @Output()\n rowDragMove: Subject<GeRowDragEvent> = new Subject<GeRowDragEvent>();\n\n /**\n * Row drag: dropped (`evt.type` \"end\", managed: after the move) or cancelled (\"cancel\"). Save the new order here.\n *\n * @since 1.1.95\n */\n @Output()\n rowDragEnd: Subject<GeRowDragEvent> = new Subject<GeRowDragEvent>();\n\n /**\n * Batch edit: values were marked, set back, written or discarded – e.g. to enable a \"Save\" button.\n *\n * @since 1.1.96\n */\n @Output()\n batchEditChanged: Subject<GeBatchEditEvent> = new Subject<GeBatchEditEvent>();\n\n /**\n * Master/detail: a detail row was expanded or collapsed.\n *\n * @since 1.1.97\n */\n @Output()\n detailExpandedChanged: Subject<GeDetailEvent> = new Subject<GeDetailEvent>();\n\n @Input()\n tableModel?: TableModelIf;\n\n @Input()\n tableOptions: TableOptionsIf = new TableOptions();\n\n @Input()\n debounceMouseClickDelay: number = 150;\n\n /**\n * `true` shows the loading overlay (\"Loading…\" with a CSS spinner) over the body, `false` hides it\n * (`TableApi.showLoadingOverlay()` / `hideOverlay()`). Changing it does **not** re-create the table;\n * a re-created table (new model) keeps showing it. Texts: `tableOptions.overlayOptions`.\n *\n * @since 1.1.92\n */\n @Input()\n loading: boolean = false;\n\n private debounceMouseClick: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n private tableScope?: TableScope;\n private alive = true;\n private initialized = false;\n\n\n constructor(\n private readonly renderer: Renderer2,\n private readonly elementRef: ElementRef,\n private readonly zone: NgZone,\n private readonly domService: DomService\n ) {\n }\n\n onSelectionChanged(model: SelectionModelIf): void {\n this.selectionChanged.next(model);\n }\n\n onFocusChanged(model: FocusModelIf): void {\n this.focusChanged.next(model);\n }\n\n onContextmenu(evt: GeMouseEvent): void {\n this.contextmenu.next(evt);\n }\n\n onScroll(evt: GeScrollEvent): void {\n this.scroll.next(evt);\n }\n\n onStateChanged(evt: GeStateChangeEvent): void {\n this.stateChanged.next(evt);\n }\n\n onRowDragStart(evt: GeRowDragEvent): void {\n this.rowDragStart.next(evt);\n }\n\n onRowDragMove(evt: GeRowDragEvent): void {\n this.rowDragMove.next(evt);\n }\n\n onRowDragEnd(evt: GeRowDragEvent): void {\n this.rowDragEnd.next(evt);\n }\n\n onBatchEditChanged(evt: GeBatchEditEvent): void {\n this.batchEditChanged.next(evt);\n }\n\n onDetailExpandedChanged(evt: GeDetailEvent): void {\n this.detailExpandedChanged.next(evt);\n }\n\n onMouseMoved(evt: GeMouseEvent): void {\n this.mouseMoved.next(evt);\n }\n\n // will be called by table-scope:\n onMouseClicked(evt: GeMouseEvent): void {\n this.debounceMouseClick.next(evt);\n }\n\n onCheckboxChanged(arr: any[]): void {\n this.checkboxChanged.next(arr);\n }\n\n onModelChanged(evt: GeModelChangeEvent): void {\n this.modelChanged.next(evt);\n }\n\n /**\n * A new `tableModel` or `tableOptions` object re-creates the table (the previous one is released\n * with `TableScope.destroy()`). The first values are handled by `ngOnInit`.\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (this.initialized && (changes[\"tableModel\"] || changes[\"tableOptions\"])) {\n this.initModel(); // applies `loading` to the new table\n } else if (this.initialized && changes[\"loading\"]) {\n this.zone.runOutsideAngular(() => this.applyLoading());\n }\n }\n\n ngOnInit(): void {\n this.initialized = true;\n this.initModel();\n this.debounceMouseClick\n .pipe(\n debounceTime(this.debounceMouseClickDelay),\n takeWhile(() => this.alive)\n )\n .subscribe((value) => {\n this.zone.run(() => {\n this.mouseClicked.next(value);\n });\n });\n }\n\n ngOnDestroy(): void {\n this.alive = false;\n this.tableScope?.destroy();\n this.tableScope = undefined;\n }\n\n\n onMouseDragging(evt: GeMouseEvent): void {\n this.mouseDragging.next(evt);\n }\n\n onMouseDraggingEnd(evt: GeMouseEvent): void {\n this.mouseDraggingEnded.next(evt);\n }\n\n\n private initModel() {\n this.zone.runOutsideAngular(this.init.bind(this));\n }\n\n private init() {\n this.tableScope?.destroy();\n this.tableScope = undefined;\n if (this.tableModel) {\n this.tableScope = new TableScope(\n this.elementRef.nativeElement, this.tableModel, this.domService, this.tableOptions, this\n );\n this.tableScope.firstInit();\n this.shownByInput = false;\n this.applyLoading();\n this.tableReady.next(this.tableScope.getApi());\n }\n }\n\n /** the overlay was shown by the `loading` input: `false` hides only that one (not one the app showed itself) */\n private shownByInput = false;\n\n private applyLoading() {\n if (this.loading) {\n this.tableScope?.showLoadingOverlay();\n this.shownByInput = true;\n } else if (this.shownByInput) {\n this.tableScope?.hideOverlay();\n this.shownByInput = false;\n }\n }\n\n\n}\n","import {AreaIdent, AreaModelIf, CellRendererIf, DomServiceIf, RendererCleanupFnType} from \"@guiexpert/table\";\nimport {\n ApplicationRef,\n ChangeDetectorRef,\n createComponent,\n EnvironmentInjector,\n EventEmitter,\n NgZone,\n Type\n} from \"@angular/core\";\nimport {ComponentRendererIf} from \"../component-renderer.if\";\nimport {Observable, Subject, takeUntil} from \"rxjs\";\n\n\nfunction isObservable(value: any): value is Observable<any> {\n return value instanceof Observable || value instanceof EventEmitter;\n}\n\nexport class RendererWrapper<T extends ComponentRendererIf<T>>\n implements CellRendererIf {\n\n public readonly event$ = new EventEmitter<any>();\n private readonly closed$ = new Subject<number>();\n\n constructor(\n private componentType: Type<ComponentRendererIf<T>>,\n private appRef: ApplicationRef,\n private injector: EnvironmentInjector,\n private cdr: ChangeDetectorRef,\n private readonly zone: NgZone\n ) {\n }\n\n render(\n cellDiv: HTMLDivElement,\n rowIndex: number,\n columnIndex: number,\n areaIdent: AreaIdent,\n areaModel: AreaModelIf,\n cellValue: any,\n domService: DomServiceIf): RendererCleanupFnType | undefined {\n\n const componentRef = createComponent(this.componentType, {\n environmentInjector: this.injector\n });\n componentRef.instance.setData(\n rowIndex,\n columnIndex,\n areaIdent,\n areaModel,\n cellValue);\n\n\n const emmiterNames = Object.keys(componentRef.instance)\n .filter(key => {\n const value = (componentRef.instance as any)[key];\n return value && isObservable(value);\n });\n\n const observables: (Observable<any>|EventEmitter<any>)[] = (emmiterNames.map(key => ((componentRef.instance as any)[key] as Observable<any>)));\n observables.forEach(obs => obs\n .pipe(\n takeUntil(this.closed$)\n )\n .subscribe((event: any) => {\n this.event$.next(event);\n })\n );\n\n if (cellDiv) cellDiv.appendChild(componentRef.location.nativeElement);\n\n this.appRef.attachView(componentRef.hostView);\n\n this.zone.run(() => {\n this.cdr.detectChanges();\n });\n\n return () => {\n // clean up:\n this.appRef.detachView(componentRef.hostView);\n this.closed$.next(Date.now());\n };\n }\n\n\n}\n","import {ApplicationRef, ChangeDetectorRef, EnvironmentInjector, Injectable, NgZone, Type} from \"@angular/core\";\nimport {ComponentRendererIf} from \"../component-renderer.if\";\nimport {RendererWrapper} from \"./renderer-wrapper\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class RenderWrapperFactory {\n\n constructor(\n private readonly appRef: ApplicationRef,\n private readonly injector: EnvironmentInjector,\n private readonly zone: NgZone\n ) {\n }\n\n create<T>(\n componentType: Type<ComponentRendererIf<T>>,\n cdr: ChangeDetectorRef\n ) {\n return new RendererWrapper(componentType, this.appRef, this.injector, cdr, this.zone);\n }\n\n}\n","import { DetailRenderContextIf, DetailRendererIf } from \"@guiexpert/table\";\nimport { ApplicationRef, createComponent, EnvironmentInjector, NgZone, Type } from \"@angular/core\";\nimport { DetailComponentRendererIf } from \"../detail-component-renderer.if\";\n\n/**\n * Renders an Angular component as the content of a detail row (master/detail). Created once when the detail row\n * becomes visible, kept while scrolling, destroyed (`ComponentRef.destroy()`) when the row is collapsed.\n *\n * @since 1.1.97\n */\nexport class DetailRendererWrapper<T = any> implements DetailRendererIf<T> {\n\n constructor(\n private readonly componentType: Type<DetailComponentRendererIf<T>>,\n private readonly appRef: ApplicationRef,\n private readonly injector: EnvironmentInjector,\n private readonly zone: NgZone\n ) {\n }\n\n render(container: HTMLDivElement, row: T, context: DetailRenderContextIf<T>): () => void {\n return this.zone.run(() => {\n const componentRef = createComponent(this.componentType, { environmentInjector: this.injector });\n componentRef.instance.setDetail(row, context);\n container.appendChild(componentRef.location.nativeElement);\n this.appRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n return () => this.zone.run(() => {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n });\n });\n }\n}\n","import { ApplicationRef, EnvironmentInjector, Injectable, NgZone, Type } from \"@angular/core\";\nimport { DetailComponentRendererIf } from \"../detail-component-renderer.if\";\nimport { DetailRendererWrapper } from \"./detail-renderer-wrapper\";\n\n/**\n * Creates the `detailRenderer` of master/detail from an Angular component (`tableOptions.masterDetail`).\n *\n * @example\n * constructor(private readonly detailFactory: DetailRenderWrapperFactory) {}\n * tableOptions = { ...new TableOptions(), masterDetail: { detailHeight: 180, detailRenderer: this.detailFactory.create(OrderItemsComponent) } };\n *\n * @since 1.1.97\n */\n@Injectable({\n providedIn: \"root\"\n})\nexport class DetailRenderWrapperFactory {\n\n constructor(\n private readonly appRef: ApplicationRef,\n private readonly injector: EnvironmentInjector,\n private readonly zone: NgZone\n ) {\n }\n\n create<T = any>(componentType: Type<DetailComponentRendererIf<T>>): DetailRendererWrapper<T> {\n return new DetailRendererWrapper<T>(componentType, this.appRef, this.injector, this.zone);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"guiexpert-angular-table.mjs","names":["i1.DomService"],"sources":["../../lib/src/lib/service/dom-service.ts","../../lib/src/lib/table.component.ts","../../lib/src/lib/service/renderer-wrapper.ts","../../lib/src/lib/service/render-wrapper-factory.ts","../../lib/src/lib/service/detail-renderer-wrapper.ts","../../lib/src/lib/service/detail-render-wrapper-factory.ts","../../lib/src/lib/table-signal.component.ts"],"sourcesContent":["import {Injectable, Renderer2} from \"@angular/core\";\nimport {DomServiceIf} from \"@guiexpert/table\";\n\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class DomService implements DomServiceIf {\n\n constructor(\n readonly renderer: Renderer2,\n ) {\n }\n\n setStyle(el: any, style: string, value: any): any {\n this.renderer.setStyle(el, style, value);\n return el;\n };\n\n\n appendText(parent: HTMLDivElement, text: string): HTMLDivElement {\n const div = this.renderer.createText(text);\n this.renderer.appendChild(parent, div);\n return div;\n }\n\n\n addClass(div: HTMLDivElement, clazz: string) {\n if (clazz.includes(' ')) {\n clazz.split(' ').forEach(c => this.renderer.addClass(div, c))\n } else {\n this.renderer.addClass(div, clazz);\n }\n return div;\n }\n\n removeClass(div: HTMLDivElement, clazz: string) {\n if (clazz.includes(\" \")) {\n clazz.split(\" \").forEach(c => div.classList.remove(c));\n } else {\n div.classList.remove(clazz);\n }\n return div;\n }\n\n appendChild(parent: HTMLElement, child: HTMLElement): void {\n this.renderer.appendChild(parent, child);\n }\n\n createElement<T>(name: string): T {\n return this.renderer.createElement(name);\n }\n\n createText(text: string): HTMLElement {\n return this.renderer.createText(text);\n }\n\n setAttribute(ele: HTMLElement, key: string, value: string): void {\n this.renderer.setAttribute(ele, key, value);\n }\n\n removeAttribute(ele: HTMLElement, key: string): void {\n this.renderer.removeAttribute(ele, key);\n }\n\n\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n Renderer2,\n SimpleChanges,\n ViewEncapsulation\n} from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { debounceTime, Subject, takeWhile } from \"rxjs\";\nimport {\n EventListenerIf, FocusModelIf,\n GeBatchEditEvent, GeDetailEvent, GeEditEvent, GeModelChangeEvent, GeRowDragEvent, GeScrollEvent, GeStateChangeEvent, GeUndoEvent,\n GeMouseEvent, SelectionModelIf,\n TableApi,\n TableModelIf,\n TableOptions,\n TableOptionsIf,\n TableScope\n} from '@guiexpert/table';\nimport { DomService } from \"./service/dom-service\";\n\n\n@Component({\n selector: \"guiexpert-table\",\n standalone: true,\n imports: [CommonModule],\n providers: [DomService],\n template: \"\",\n styleUrls: [\n \"./table.component.css\"\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TableComponent implements OnInit, OnChanges, OnDestroy, EventListenerIf {\n\n @Output()\n tableReady = new Subject<TableApi>();\n\n @Output()\n scroll: Subject<GeScrollEvent> = new Subject<GeScrollEvent>();\n\n @Output()\n mouseMoved: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n mouseDragging: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n mouseDraggingEnded: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n contextmenu: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n mouseClicked: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n @Output()\n modelChanged: Subject<GeModelChangeEvent> = new Subject<GeModelChangeEvent>();\n\n @Output()\n selectionChanged: Subject<SelectionModelIf> = new Subject<SelectionModelIf>();\n\n @Output()\n focusChanged: Subject<FocusModelIf> = new Subject<FocusModelIf>();\n\n @Output()\n checkboxChanged: Subject<any[]> = new Subject<any[]>();\n\n /**\n * The state changed (column layout, sorting, scroll position, tree, checked/selected rows …) – once after the\n * changes settled. Save `evt.state` and pass it back as `tableOptions.initialState`.\n *\n * @since 1.1.92\n */\n @Output()\n stateChanged: Subject<GeStateChangeEvent> = new Subject<GeStateChangeEvent>();\n\n /**\n * Row drag (handles via `ColumnDef.rowDrag`): a drag started. `evt.preventDefault()` cancels it.\n *\n * @since 1.1.95\n */\n @Output()\n rowDragStart: Subject<GeRowDragEvent> = new Subject<GeRowDragEvent>();\n\n /**\n * Row drag: the drop target changed. `evt.preventDefault()` marks it as invalid.\n *\n * @since 1.1.95\n */\n @Output()\n rowDragMove: Subject<GeRowDragEvent> = new Subject<GeRowDragEvent>();\n\n /**\n * Row drag: dropped (`evt.type` \"end\", managed: after the move) or cancelled (\"cancel\"). Save the new order here.\n *\n * @since 1.1.95\n */\n @Output()\n rowDragEnd: Subject<GeRowDragEvent> = new Subject<GeRowDragEvent>();\n\n /**\n * Batch edit: values were marked, set back, written or discarded – e.g. to enable a \"Save\" button.\n *\n * @since 1.1.96\n */\n @Output()\n batchEditChanged: Subject<GeBatchEditEvent> = new Subject<GeBatchEditEvent>();\n\n /**\n * Master/detail: a detail row was expanded or collapsed.\n *\n * @since 1.1.97\n */\n @Output()\n detailExpandedChanged: Subject<GeDetailEvent> = new Subject<GeDetailEvent>();\n\n /**\n * The cell editor opened, its text changed (Excel-style editing), it committed or it was cancelled.\n *\n * @since 1.1.99\n */\n @Output()\n editingChanged: Subject<GeEditEvent> = new Subject<GeEditEvent>();\n\n @Input()\n tableModel?: TableModelIf;\n\n @Input()\n tableOptions: TableOptionsIf = new TableOptions();\n\n @Input()\n debounceMouseClickDelay: number = 150;\n\n /**\n * `true` shows the loading overlay (\"Loading…\" with a CSS spinner) over the body, `false` hides it\n * (`TableApi.showLoadingOverlay()` / `hideOverlay()`). Changing it does **not** re-create the table;\n * a re-created table (new model) keeps showing it. Texts: `tableOptions.overlayOptions`.\n *\n * @since 1.1.92\n */\n @Input()\n loading: boolean = false;\n\n private debounceMouseClick: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n private tableScope?: TableScope;\n private alive = true;\n private initialized = false;\n\n\n constructor(\n private readonly renderer: Renderer2,\n private readonly elementRef: ElementRef,\n private readonly zone: NgZone,\n private readonly domService: DomService\n ) {\n }\n\n onSelectionChanged(model: SelectionModelIf): void {\n this.selectionChanged.next(model);\n }\n\n onFocusChanged(model: FocusModelIf): void {\n this.focusChanged.next(model);\n }\n\n onContextmenu(evt: GeMouseEvent): void {\n this.contextmenu.next(evt);\n }\n\n onScroll(evt: GeScrollEvent): void {\n this.scroll.next(evt);\n }\n\n onStateChanged(evt: GeStateChangeEvent): void {\n this.stateChanged.next(evt);\n }\n\n onRowDragStart(evt: GeRowDragEvent): void {\n this.rowDragStart.next(evt);\n }\n\n onRowDragMove(evt: GeRowDragEvent): void {\n this.rowDragMove.next(evt);\n }\n\n onRowDragEnd(evt: GeRowDragEvent): void {\n this.rowDragEnd.next(evt);\n }\n\n onBatchEditChanged(evt: GeBatchEditEvent): void {\n this.batchEditChanged.next(evt);\n }\n\n onDetailExpandedChanged(evt: GeDetailEvent): void {\n this.detailExpandedChanged.next(evt);\n }\n\n onEditingChanged(evt: GeEditEvent): void {\n this.editingChanged.next(evt);\n }\n\n /**\n * The undo history changed (undo and redo) – to enable and label own buttons.\n *\n * @since 1.1.99\n */\n @Output()\n undoStackChanged: Subject<GeUndoEvent> = new Subject<GeUndoEvent>();\n\n onUndoStackChanged(evt: GeUndoEvent): void {\n this.undoStackChanged.next(evt);\n }\n\n onMouseMoved(evt: GeMouseEvent): void {\n this.mouseMoved.next(evt);\n }\n\n // will be called by table-scope:\n onMouseClicked(evt: GeMouseEvent): void {\n this.debounceMouseClick.next(evt);\n }\n\n onCheckboxChanged(arr: any[]): void {\n this.checkboxChanged.next(arr);\n }\n\n onModelChanged(evt: GeModelChangeEvent): void {\n this.modelChanged.next(evt);\n }\n\n /**\n * A new `tableModel` or `tableOptions` object re-creates the table (the previous one is released\n * with `TableScope.destroy()`). The first values are handled by `ngOnInit`.\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (this.initialized && (changes[\"tableModel\"] || changes[\"tableOptions\"])) {\n this.initModel(); // applies `loading` to the new table\n } else if (this.initialized && changes[\"loading\"]) {\n this.zone.runOutsideAngular(() => this.applyLoading());\n }\n }\n\n ngOnInit(): void {\n this.initialized = true;\n this.initModel();\n this.debounceMouseClick\n .pipe(\n debounceTime(this.debounceMouseClickDelay),\n takeWhile(() => this.alive)\n )\n .subscribe((value) => {\n this.zone.run(() => {\n this.mouseClicked.next(value);\n });\n });\n }\n\n ngOnDestroy(): void {\n this.alive = false;\n this.tableScope?.destroy();\n this.tableScope = undefined;\n }\n\n\n onMouseDragging(evt: GeMouseEvent): void {\n this.mouseDragging.next(evt);\n }\n\n onMouseDraggingEnd(evt: GeMouseEvent): void {\n this.mouseDraggingEnded.next(evt);\n }\n\n\n private initModel() {\n this.zone.runOutsideAngular(this.init.bind(this));\n }\n\n private init() {\n this.tableScope?.destroy();\n this.tableScope = undefined;\n if (this.tableModel) {\n this.tableScope = new TableScope(\n this.elementRef.nativeElement, this.tableModel, this.domService, this.tableOptions, this\n );\n this.tableScope.firstInit();\n this.shownByInput = false;\n this.applyLoading();\n this.tableReady.next(this.tableScope.getApi());\n }\n }\n\n /** the overlay was shown by the `loading` input: `false` hides only that one (not one the app showed itself) */\n private shownByInput = false;\n\n private applyLoading() {\n if (this.loading) {\n this.tableScope?.showLoadingOverlay();\n this.shownByInput = true;\n } else if (this.shownByInput) {\n this.tableScope?.hideOverlay();\n this.shownByInput = false;\n }\n }\n\n\n}\n","import {AreaIdent, AreaModelIf, CellRendererIf, DomServiceIf, RendererCleanupFnType} from \"@guiexpert/table\";\nimport {\n ApplicationRef,\n ChangeDetectorRef,\n createComponent,\n EnvironmentInjector,\n EventEmitter,\n NgZone,\n Type\n} from \"@angular/core\";\nimport {ComponentRendererIf} from \"../component-renderer.if\";\nimport {Observable, Subject, takeUntil} from \"rxjs\";\n\n\nfunction isObservable(value: any): value is Observable<any> {\n return value instanceof Observable || value instanceof EventEmitter;\n}\n\nexport class RendererWrapper<T extends ComponentRendererIf<T>>\n implements CellRendererIf {\n\n public readonly event$ = new EventEmitter<any>();\n private readonly closed$ = new Subject<number>();\n\n constructor(\n private componentType: Type<ComponentRendererIf<T>>,\n private appRef: ApplicationRef,\n private injector: EnvironmentInjector,\n private cdr: ChangeDetectorRef,\n private readonly zone: NgZone\n ) {\n }\n\n render(\n cellDiv: HTMLDivElement,\n rowIndex: number,\n columnIndex: number,\n areaIdent: AreaIdent,\n areaModel: AreaModelIf,\n cellValue: any,\n domService: DomServiceIf): RendererCleanupFnType | undefined {\n\n const componentRef = createComponent(this.componentType, {\n environmentInjector: this.injector\n });\n componentRef.instance.setData(\n rowIndex,\n columnIndex,\n areaIdent,\n areaModel,\n cellValue);\n\n\n const emmiterNames = Object.keys(componentRef.instance)\n .filter(key => {\n const value = (componentRef.instance as any)[key];\n return value && isObservable(value);\n });\n\n const observables: (Observable<any>|EventEmitter<any>)[] = (emmiterNames.map(key => ((componentRef.instance as any)[key] as Observable<any>)));\n observables.forEach(obs => obs\n .pipe(\n takeUntil(this.closed$)\n )\n .subscribe((event: any) => {\n this.event$.next(event);\n })\n );\n\n if (cellDiv) cellDiv.appendChild(componentRef.location.nativeElement);\n\n this.appRef.attachView(componentRef.hostView);\n\n this.zone.run(() => {\n this.cdr.detectChanges();\n });\n\n return () => {\n // clean up:\n this.appRef.detachView(componentRef.hostView);\n this.closed$.next(Date.now());\n };\n }\n\n\n}\n","import {ApplicationRef, ChangeDetectorRef, EnvironmentInjector, Injectable, NgZone, Type} from \"@angular/core\";\nimport {ComponentRendererIf} from \"../component-renderer.if\";\nimport {RendererWrapper} from \"./renderer-wrapper\";\n\n@Injectable({\n providedIn: \"root\"\n})\nexport class RenderWrapperFactory {\n\n constructor(\n private readonly appRef: ApplicationRef,\n private readonly injector: EnvironmentInjector,\n private readonly zone: NgZone\n ) {\n }\n\n create<T>(\n componentType: Type<ComponentRendererIf<T>>,\n cdr: ChangeDetectorRef\n ) {\n return new RendererWrapper(componentType, this.appRef, this.injector, cdr, this.zone);\n }\n\n}\n","import { DetailRenderContextIf, DetailRendererIf } from \"@guiexpert/table\";\nimport { ApplicationRef, createComponent, EnvironmentInjector, NgZone, Type } from \"@angular/core\";\nimport { DetailComponentRendererIf } from \"../detail-component-renderer.if\";\n\n/**\n * Renders an Angular component as the content of a detail row (master/detail). Created once when the detail row\n * becomes visible, kept while scrolling, destroyed (`ComponentRef.destroy()`) when the row is collapsed.\n *\n * @since 1.1.97\n */\nexport class DetailRendererWrapper<T = any> implements DetailRendererIf<T> {\n\n constructor(\n private readonly componentType: Type<DetailComponentRendererIf<T>>,\n private readonly appRef: ApplicationRef,\n private readonly injector: EnvironmentInjector,\n private readonly zone: NgZone\n ) {\n }\n\n render(container: HTMLDivElement, row: T, context: DetailRenderContextIf<T>): () => void {\n return this.zone.run(() => {\n const componentRef = createComponent(this.componentType, { environmentInjector: this.injector });\n componentRef.instance.setDetail(row, context);\n container.appendChild(componentRef.location.nativeElement);\n this.appRef.attachView(componentRef.hostView);\n componentRef.changeDetectorRef.detectChanges();\n return () => this.zone.run(() => {\n this.appRef.detachView(componentRef.hostView);\n componentRef.destroy();\n });\n });\n }\n}\n","import { ApplicationRef, EnvironmentInjector, Injectable, NgZone, Type } from \"@angular/core\";\nimport { DetailComponentRendererIf } from \"../detail-component-renderer.if\";\nimport { DetailRendererWrapper } from \"./detail-renderer-wrapper\";\n\n/**\n * Creates the `detailRenderer` of master/detail from an Angular component (`tableOptions.masterDetail`).\n *\n * @example\n * constructor(private readonly detailFactory: DetailRenderWrapperFactory) {}\n * tableOptions = { ...new TableOptions(), masterDetail: { detailHeight: 180, detailRenderer: this.detailFactory.create(OrderItemsComponent) } };\n *\n * @since 1.1.97\n */\n@Injectable({\n providedIn: \"root\"\n})\nexport class DetailRenderWrapperFactory {\n\n constructor(\n private readonly appRef: ApplicationRef,\n private readonly injector: EnvironmentInjector,\n private readonly zone: NgZone\n ) {\n }\n\n create<T = any>(componentType: Type<DetailComponentRendererIf<T>>): DetailRendererWrapper<T> {\n return new DetailRendererWrapper<T>(componentType, this.appRef, this.injector, this.zone);\n }\n}\n","// @since-angular 22\n// ^ scripts/sync-angular-src.mjs copies this file only into the builds for Angular 22 and later (ng22, ng23 …).\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n input,\n isDevMode,\n model,\n NgZone,\n OnDestroy,\n output,\n PLATFORM_ID,\n untracked,\n ViewEncapsulation\n} from \"@angular/core\";\nimport { isPlatformBrowser } from \"@angular/common\";\nimport {\n EventListenerIf,\n FocusModelIf,\n GeBatchEditEvent,\n GeDetailEvent,\n GeEditEvent,\n GeModelChangeEvent,\n GeMouseEvent,\n GeRowDragEvent,\n GeScrollEvent,\n GeStateChangeEvent,\n GeUndoEvent,\n SelectionModelIf,\n TableApi,\n TableModelIf,\n TableOptions,\n TableOptionsIf,\n TableScope\n} from \"@guiexpert/table\";\nimport { DomService } from \"./service/dom-service\";\n\n\n/**\n * The signal-native GuiExpert table for **Angular 22 and later**: signal inputs (`input()`), the {@link TableApi} as a\n * signal (`model()`, two-way binding `[(tableApi)]`), signal outputs (`output()`), reactivity with `effect()` instead\n * of `ngOnChanges` – no RxJS, works with and without Zone.js (`provideZonelessChangeDetection()`).\n *\n * The classic `TableComponent` (`<guiexpert-table>`, Angular 14 – 22+) stays available unchanged. Differences:\n * the API comes as a signal (`[(tableApi)]` / `(tableApiChange)` – there is no `tableReady` output) and the output\n * `contextMenu` (instead of `contextmenu`: an output named like a DOM event also receives the native event that\n * bubbles out of the table – the handler would run twice).\n *\n * Rules:\n * - The host needs a height (`.table-div { display: block; height: 500px }`).\n * - A new `tableModel` or `tableOptions` value re-creates the table (`tableApi` switches to the new API directly);\n * `loading` shows / hides the loading overlay without re-creating it.\n * - `tableApi` is set by the table – a value written from outside is replaced (warning in dev mode).\n * - Outputs are emitted outside the Angular zone (no change detection per `mousemove`). Write a **signal** in the\n * handler – that schedules change detection with and without Zone.js; plain fields need `markForCheck()`.\n * - On the server (SSR) no table is created; it is built in the browser.\n *\n * @since 1.1.100 (`@guiexpert/angular-table@22.1.100`)\n *\n * @example\n * import { Component, computed, effect, signal } from \"@angular/core\";\n * import { TableSignalComponent } from \"@guiexpert/angular-table\";\n * import { TableApi, TableFactory } from \"@guiexpert/table\";\n *\n * @Component({\n * selector: \"app-orders\",\n * imports: [TableSignalComponent],\n * template: `\n * <guiexpert-table-signal class=\"table-div\" [tableModel]=\"model\" [(tableApi)]=\"api\" />\n * <button [disabled]=\"!ready()\" (click)=\"api()?.downloadExcel('orders.xlsx', 'me')\">Excel</button>`\n * })\n * export class OrdersComponent {\n * readonly model = TableFactory.createTableModel({ rows: [{ id: 1, customer: \"Acme\" }], properties: [\"id\", \"customer\"] });\n * readonly api = signal<TableApi | undefined>(undefined);\n * readonly ready = computed(() => !!this.api());\n * constructor() {\n * effect(() => this.api()?.scrollToIndex(0, 0));\n * }\n * }\n */\n@Component({\n selector: \"guiexpert-table-signal\",\n providers: [DomService],\n template: \"\",\n styleUrls: [\n \"./table.component.css\" // the same generated stylesheet as TableComponent – added to the document only once\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class TableSignalComponent implements OnDestroy {\n\n // ---------------------------------------------------------------- inputs\n\n /** The table model. A new value re-creates the table; `undefined` = no table (e.g. while the data is loading). */\n readonly tableModel = input<TableModelIf | undefined>(undefined);\n\n /** The table options (default: `new TableOptions()`). A new value re-creates the table. */\n readonly tableOptions = input<TableOptionsIf>(new TableOptions());\n\n /**\n * `true` shows the loading overlay (\"Loading…\" with a CSS spinner) over the body, `false` hides it again – without\n * re-creating the table. An overlay the app showed itself (`tableApi()?.showNoRowsOverlay()`) is not hidden.\n */\n readonly loading = input<boolean>(false);\n\n /** Delay of `mouseClicked` in ms (a double click reports only once). `0` = emitted synchronously. Default 150. */\n readonly debounceMouseClickDelay = input<number>(150);\n\n // ---------------------------------------------------------------- the API as a signal\n\n /**\n * The {@link TableApi} of the current table, `undefined` before the first table and after the component was\n * destroyed. Two-way binding: `[(tableApi)]=\"api\"` with `api = signal<TableApi | undefined>(undefined)`; also\n * `(tableApiChange)=\"…\"` or `viewChild(TableSignalComponent)?.tableApi()`.\n *\n * @example\n * // template: <guiexpert-table-signal [tableModel]=\"model\" [(tableApi)]=\"api\" />\n * // readonly api = signal<TableApi | undefined>(undefined);\n * // readonly rowCount = computed(() => this.api()?.getDisplayedRowCount() ?? 0);\n */\n readonly tableApi = model<TableApi | undefined>(undefined);\n\n // ---------------------------------------------------------------- outputs\n\n /** Mouse click on a cell (debounced: `debounceMouseClickDelay`). */\n readonly mouseClicked = output<GeMouseEvent>();\n /** Mouse moved over the table. */\n readonly mouseMoved = output<GeMouseEvent>();\n /** Mouse dragged (button pressed). */\n readonly mouseDragging = output<GeMouseEvent>();\n /** Mouse drag ended. */\n readonly mouseDraggingEnded = output<GeMouseEvent>();\n /**\n * Right click / context menu key on the table (`TableComponent`: `contextmenu`). Call\n * `evt.originalEvent?.preventDefault()` to suppress the browser menu.\n */\n readonly contextMenu = output<GeMouseEvent>();\n /** The table was scrolled. */\n readonly scroll = output<GeScrollEvent>();\n /** Cell values were changed (editor, fill handle, paste, API …). */\n readonly modelChanged = output<GeModelChangeEvent>();\n /** The selection changed. */\n readonly selectionChanged = output<SelectionModelIf>();\n /** The focused cell changed. */\n readonly focusChanged = output<FocusModelIf>();\n /** Row checkboxes changed – the checked rows. */\n readonly checkboxChanged = output<any[]>();\n /** The table state changed (columns, sorting, scroll position …) – once after the changes settled. */\n readonly stateChanged = output<GeStateChangeEvent>();\n /** Row drag started. `evt.preventDefault()` cancels it. */\n readonly rowDragStart = output<GeRowDragEvent>();\n /** Row drag: the drop target changed. */\n readonly rowDragMove = output<GeRowDragEvent>();\n /** Row drag: dropped or cancelled. */\n readonly rowDragEnd = output<GeRowDragEvent>();\n /** Batch edit: values were marked, written or discarded. */\n readonly batchEditChanged = output<GeBatchEditEvent>();\n /** Master/detail: a detail row was expanded or collapsed. */\n readonly detailExpandedChanged = output<GeDetailEvent>();\n /** The cell editor opened, changed, committed or was cancelled. */\n readonly editingChanged = output<GeEditEvent>();\n /** The undo history changed. */\n readonly undoStackChanged = output<GeUndoEvent>();\n\n // ---------------------------------------------------------------- internals\n\n private readonly elementRef = inject<ElementRef<HTMLDivElement>>(ElementRef); // the host element (TableScope types it as a div)\n private readonly zone = inject(NgZone);\n private readonly domService = inject(DomService);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private tableScope?: TableScope;\n private destroyed = false;\n /** the overlay was shown by the `loading` input: `false` hides only that one */\n private shownByInput = false;\n private clickTimer?: ReturnType<typeof setTimeout>;\n private pendingClick?: GeMouseEvent;\n private warnedExternalWrite = false;\n\n /** Forwards the events of the core to the outputs (a separate object: no `onXxx` methods on the component). */\n private readonly listener: EventListenerIf = {\n onMouseClicked: evt => this.onMouseClicked(evt),\n onMouseMoved: evt => this.mouseMoved.emit(evt),\n onMouseDragging: evt => this.mouseDragging.emit(evt),\n onMouseDraggingEnd: evt => this.mouseDraggingEnded.emit(evt),\n onContextmenu: evt => this.contextMenu.emit(evt),\n onScroll: evt => this.scroll.emit(evt),\n onModelChanged: evt => this.modelChanged.emit(evt),\n onSelectionChanged: sm => this.selectionChanged.emit(sm),\n onFocusChanged: fm => this.focusChanged.emit(fm),\n onCheckboxChanged: rows => this.checkboxChanged.emit(rows),\n onStateChanged: evt => this.emitUnlessDestroyed(() => this.stateChanged.emit(evt)),\n onRowDragStart: evt => this.rowDragStart.emit(evt),\n onRowDragMove: evt => this.rowDragMove.emit(evt),\n onRowDragEnd: evt => this.emitUnlessDestroyed(() => this.rowDragEnd.emit(evt)),\n onBatchEditChanged: evt => this.batchEditChanged.emit(evt),\n onDetailExpandedChanged: evt => this.detailExpandedChanged.emit(evt),\n onEditingChanged: evt => this.emitUnlessDestroyed(() => this.editingChanged.emit(evt)),\n onUndoStackChanged: evt => this.emitUnlessDestroyed(() => this.undoStackChanged.emit(evt)),\n };\n\n constructor() {\n // 1) model / options → (re-)create the table. Runs like ngOnInit: during change detection, host in the DOM.\n effect(() => {\n const tableModel = this.tableModel();\n const tableOptions = this.tableOptions();\n untracked(() => this.createTable(tableModel, tableOptions));\n });\n\n // 2) loading → overlay, without re-creating the table\n effect(() => {\n const loading = this.loading();\n untracked(() => this.zone.runOutsideAngular(() => this.applyLoading(loading)));\n });\n\n // 3) tableApi is output-only: a value written from outside is replaced by the real API\n effect(() => {\n const value = this.tableApi();\n untracked(() => {\n const api = this.currentApi();\n if (value !== api && !this.destroyed) {\n if (isDevMode() && !this.warnedExternalWrite) {\n this.warnedExternalWrite = true;\n console.warn(\"guiexpert-table-signal: tableApi is set by the table; a value written from outside is replaced.\");\n }\n this.tableApi.set(api);\n }\n });\n });\n }\n\n /** Releases the table (all listeners, observers, renderer cleanups) and sets `tableApi` to `undefined`. */\n ngOnDestroy(): void {\n // ngOnDestroy runs before the outputs are released (DestroyRef callbacks): a pending stateChanged of\n // TableScope.destroy() can still be emitted here.\n this.clearClickTimer();\n this.tableScope?.destroy();\n this.tableScope = undefined;\n this.destroyed = true;\n this.tableApi.set(undefined);\n }\n\n private currentApi(): TableApi | undefined {\n return this.tableScope?.getApi();\n }\n\n private createTable(tableModel: TableModelIf | undefined, tableOptions: TableOptionsIf): void {\n if (!this.isBrowser || this.destroyed) {\n return;\n }\n this.zone.runOutsideAngular(() => {\n this.clearClickTimer();\n this.tableScope?.destroy();\n this.tableScope = undefined;\n if (tableModel) {\n this.tableScope = new TableScope(\n this.elementRef.nativeElement, tableModel, this.domService, tableOptions, this.listener\n );\n this.tableScope.firstInit();\n this.shownByInput = false;\n this.applyLoading(untracked(() => this.loading()));\n }\n });\n this.tableApi.set(this.currentApi()); // directly the new API – no `undefined` in between\n }\n\n private applyLoading(loading: boolean): void {\n if (!this.tableScope) {\n return;\n }\n if (loading) {\n if (!this.shownByInput) {\n this.tableScope.showLoadingOverlay();\n this.shownByInput = true;\n }\n } else if (this.shownByInput) {\n this.tableScope.hideOverlay();\n this.shownByInput = false;\n }\n }\n\n private onMouseClicked(evt: GeMouseEvent): void {\n const delay = untracked(() => this.debounceMouseClickDelay());\n if (delay <= 0) {\n this.mouseClicked.emit(evt);\n return;\n }\n this.pendingClick = evt;\n this.clearClickTimer();\n this.clickTimer = setTimeout(() => {\n this.clickTimer = undefined;\n const pending = this.pendingClick;\n this.pendingClick = undefined;\n if (pending && !this.destroyed) {\n this.mouseClicked.emit(pending);\n }\n }, delay);\n }\n\n private clearClickTimer(): void {\n if (this.clickTimer !== undefined) {\n clearTimeout(this.clickTimer);\n this.clickTimer = undefined;\n }\n }\n\n /** events the core can still send while it is released (TableScope.destroy()) – never after the component */\n private emitUnlessDestroyed(emit: () => void): void {\n if (!this.destroyed) {\n emit();\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@guiexpert/angular-table",
3
- "version": "22.1.98",
3
+ "version": "22.1.100",
4
4
  "license": "MIT",
5
5
  "author": "Dr. Marc Kronberg <info@gui.expert> (https://gui.expert)",
6
6
  "peerDependencies": {
7
7
  "@angular/common": "^22.0.1",
8
8
  "@angular/core": "^22.0.1",
9
- "@guiexpert/table": "^1.1.98"
9
+ "@guiexpert/table": "^1.1.100"
10
10
  },
11
11
  "dependencies": {
12
12
  "tslib": "^2.3.0"
@@ -1,7 +1,7 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { ApplicationRef, ChangeDetectorRef, ElementRef, EnvironmentInjector, EventEmitter, NgZone, OnChanges, OnDestroy, OnInit, Renderer2, SimpleChanges, Type } from "@angular/core";
3
3
  import { Subject } from "rxjs";
4
- import { AreaIdent, AreaModelIf, CellRendererIf, DetailRenderContextIf, DetailRendererIf, DomServiceIf, EventListenerIf, FocusModelIf, GeBatchEditEvent, GeDetailEvent, GeModelChangeEvent, GeMouseEvent, GeRowDragEvent, GeScrollEvent, GeStateChangeEvent, RendererCleanupFnType, SelectionModelIf, TableApi, TableModelIf, TableOptionsIf } from "@guiexpert/table";
4
+ import { AreaIdent, AreaModelIf, CellRendererIf, DetailRenderContextIf, DetailRendererIf, DomServiceIf, EventListenerIf, FocusModelIf, GeBatchEditEvent, GeDetailEvent, GeEditEvent, GeModelChangeEvent, GeMouseEvent, GeRowDragEvent, GeScrollEvent, GeStateChangeEvent, GeUndoEvent, RendererCleanupFnType, SelectionModelIf, TableApi, TableModelIf, TableOptionsIf } from "@guiexpert/table";
5
5
  export declare class DomService implements DomServiceIf {
6
6
  readonly renderer: Renderer2;
7
7
  constructor(renderer: Renderer2);
@@ -70,6 +70,12 @@ export declare class TableComponent implements OnInit, OnChanges, OnDestroy, Eve
70
70
  * @since 1.1.97
71
71
  */
72
72
  detailExpandedChanged: Subject<GeDetailEvent>;
73
+ /**
74
+ * The cell editor opened, its text changed (Excel-style editing), it committed or it was cancelled.
75
+ *
76
+ * @since 1.1.99
77
+ */
78
+ editingChanged: Subject<GeEditEvent>;
73
79
  tableModel?: TableModelIf;
74
80
  tableOptions: TableOptionsIf;
75
81
  debounceMouseClickDelay: number;
@@ -96,6 +102,14 @@ export declare class TableComponent implements OnInit, OnChanges, OnDestroy, Eve
96
102
  onRowDragEnd(evt: GeRowDragEvent): void;
97
103
  onBatchEditChanged(evt: GeBatchEditEvent): void;
98
104
  onDetailExpandedChanged(evt: GeDetailEvent): void;
105
+ onEditingChanged(evt: GeEditEvent): void;
106
+ /**
107
+ * The undo history changed (undo and redo) – to enable and label own buttons.
108
+ *
109
+ * @since 1.1.99
110
+ */
111
+ undoStackChanged: Subject<GeUndoEvent>;
112
+ onUndoStackChanged(evt: GeUndoEvent): void;
99
113
  onMouseMoved(evt: GeMouseEvent): void;
100
114
  onMouseClicked(evt: GeMouseEvent): void;
101
115
  onCheckboxChanged(arr: any[]): void;
@@ -150,6 +164,8 @@ export declare class TableComponent implements OnInit, OnChanges, OnDestroy, Eve
150
164
  "rowDragEnd": "rowDragEnd";
151
165
  "batchEditChanged": "batchEditChanged";
152
166
  "detailExpandedChanged": "detailExpandedChanged";
167
+ "editingChanged": "editingChanged";
168
+ "undoStackChanged": "undoStackChanged";
153
169
  }, never, never, true, never>;
154
170
  }
155
171
  export interface ComponentRendererIf<T> {
@@ -216,4 +232,180 @@ export declare class DetailRenderWrapperFactory {
216
232
  create<T = any>(componentType: Type<DetailComponentRendererIf<T>>): DetailRendererWrapper<T>;
217
233
  static ɵfac: i0.ɵɵFactoryDeclaration<DetailRenderWrapperFactory, never>;
218
234
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
235
+ }
236
+ /**
237
+ * The signal-native GuiExpert table for **Angular 22 and later**: signal inputs (`input()`), the {@link TableApi} as a
238
+ * signal (`model()`, two-way binding `[(tableApi)]`), signal outputs (`output()`), reactivity with `effect()` instead
239
+ * of `ngOnChanges` – no RxJS, works with and without Zone.js (`provideZonelessChangeDetection()`).
240
+ *
241
+ * The classic `TableComponent` (`<guiexpert-table>`, Angular 14 – 22+) stays available unchanged. Differences:
242
+ * the API comes as a signal (`[(tableApi)]` / `(tableApiChange)` – there is no `tableReady` output) and the output
243
+ * `contextMenu` (instead of `contextmenu`: an output named like a DOM event also receives the native event that
244
+ * bubbles out of the table – the handler would run twice).
245
+ *
246
+ * Rules:
247
+ * - The host needs a height (`.table-div { display: block; height: 500px }`).
248
+ * - A new `tableModel` or `tableOptions` value re-creates the table (`tableApi` switches to the new API directly);
249
+ * `loading` shows / hides the loading overlay without re-creating it.
250
+ * - `tableApi` is set by the table – a value written from outside is replaced (warning in dev mode).
251
+ * - Outputs are emitted outside the Angular zone (no change detection per `mousemove`). Write a **signal** in the
252
+ * handler – that schedules change detection with and without Zone.js; plain fields need `markForCheck()`.
253
+ * - On the server (SSR) no table is created; it is built in the browser.
254
+ *
255
+ * @since 1.1.100 (`@guiexpert/angular-table@22.1.100`)
256
+ *
257
+ * @example
258
+ * import { Component, computed, effect, signal } from "@angular/core";
259
+ * import { TableSignalComponent } from "@guiexpert/angular-table";
260
+ * import { TableApi, TableFactory } from "@guiexpert/table";
261
+ *
262
+ * @Component({
263
+ * selector: "app-orders",
264
+ * imports: [TableSignalComponent],
265
+ * template: `
266
+ * <guiexpert-table-signal class="table-div" [tableModel]="model" [(tableApi)]="api" />
267
+ * <button [disabled]="!ready()" (click)="api()?.downloadExcel('orders.xlsx', 'me')">Excel</button>`
268
+ * })
269
+ * export class OrdersComponent {
270
+ * readonly model = TableFactory.createTableModel({ rows: [{ id: 1, customer: "Acme" }], properties: ["id", "customer"] });
271
+ * readonly api = signal<TableApi | undefined>(undefined);
272
+ * readonly ready = computed(() => !!this.api());
273
+ * constructor() {
274
+ * effect(() => this.api()?.scrollToIndex(0, 0));
275
+ * }
276
+ * }
277
+ */
278
+ export declare class TableSignalComponent implements OnDestroy {
279
+ /** The table model. A new value re-creates the table; `undefined` = no table (e.g. while the data is loading). */
280
+ readonly tableModel: import("@angular/core").InputSignal<TableModelIf | undefined>;
281
+ /** The table options (default: `new TableOptions()`). A new value re-creates the table. */
282
+ readonly tableOptions: import("@angular/core").InputSignal<TableOptionsIf>;
283
+ /**
284
+ * `true` shows the loading overlay ("Loading…" with a CSS spinner) over the body, `false` hides it again – without
285
+ * re-creating the table. An overlay the app showed itself (`tableApi()?.showNoRowsOverlay()`) is not hidden.
286
+ */
287
+ readonly loading: import("@angular/core").InputSignal<boolean>;
288
+ /** Delay of `mouseClicked` in ms (a double click reports only once). `0` = emitted synchronously. Default 150. */
289
+ readonly debounceMouseClickDelay: import("@angular/core").InputSignal<number>;
290
+ /**
291
+ * The {@link TableApi} of the current table, `undefined` before the first table and after the component was
292
+ * destroyed. Two-way binding: `[(tableApi)]="api"` with `api = signal<TableApi | undefined>(undefined)`; also
293
+ * `(tableApiChange)="…"` or `viewChild(TableSignalComponent)?.tableApi()`.
294
+ *
295
+ * @example
296
+ * // template: <guiexpert-table-signal [tableModel]="model" [(tableApi)]="api" />
297
+ * // readonly api = signal<TableApi | undefined>(undefined);
298
+ * // readonly rowCount = computed(() => this.api()?.getDisplayedRowCount() ?? 0);
299
+ */
300
+ readonly tableApi: import("@angular/core").ModelSignal<TableApi | undefined>;
301
+ /** Mouse click on a cell (debounced: `debounceMouseClickDelay`). */
302
+ readonly mouseClicked: import("@angular/core").OutputEmitterRef<GeMouseEvent>;
303
+ /** Mouse moved over the table. */
304
+ readonly mouseMoved: import("@angular/core").OutputEmitterRef<GeMouseEvent>;
305
+ /** Mouse dragged (button pressed). */
306
+ readonly mouseDragging: import("@angular/core").OutputEmitterRef<GeMouseEvent>;
307
+ /** Mouse drag ended. */
308
+ readonly mouseDraggingEnded: import("@angular/core").OutputEmitterRef<GeMouseEvent>;
309
+ /**
310
+ * Right click / context menu key on the table (`TableComponent`: `contextmenu`). Call
311
+ * `evt.originalEvent?.preventDefault()` to suppress the browser menu.
312
+ */
313
+ readonly contextMenu: import("@angular/core").OutputEmitterRef<GeMouseEvent>;
314
+ /** The table was scrolled. */
315
+ readonly scroll: import("@angular/core").OutputEmitterRef<GeScrollEvent>;
316
+ /** Cell values were changed (editor, fill handle, paste, API …). */
317
+ readonly modelChanged: import("@angular/core").OutputEmitterRef<GeModelChangeEvent>;
318
+ /** The selection changed. */
319
+ readonly selectionChanged: import("@angular/core").OutputEmitterRef<SelectionModelIf>;
320
+ /** The focused cell changed. */
321
+ readonly focusChanged: import("@angular/core").OutputEmitterRef<FocusModelIf>;
322
+ /** Row checkboxes changed – the checked rows. */
323
+ readonly checkboxChanged: import("@angular/core").OutputEmitterRef<any[]>;
324
+ /** The table state changed (columns, sorting, scroll position …) – once after the changes settled. */
325
+ readonly stateChanged: import("@angular/core").OutputEmitterRef<GeStateChangeEvent>;
326
+ /** Row drag started. `evt.preventDefault()` cancels it. */
327
+ readonly rowDragStart: import("@angular/core").OutputEmitterRef<GeRowDragEvent<any>>;
328
+ /** Row drag: the drop target changed. */
329
+ readonly rowDragMove: import("@angular/core").OutputEmitterRef<GeRowDragEvent<any>>;
330
+ /** Row drag: dropped or cancelled. */
331
+ readonly rowDragEnd: import("@angular/core").OutputEmitterRef<GeRowDragEvent<any>>;
332
+ /** Batch edit: values were marked, written or discarded. */
333
+ readonly batchEditChanged: import("@angular/core").OutputEmitterRef<GeBatchEditEvent>;
334
+ /** Master/detail: a detail row was expanded or collapsed. */
335
+ readonly detailExpandedChanged: import("@angular/core").OutputEmitterRef<GeDetailEvent<any>>;
336
+ /** The cell editor opened, changed, committed or was cancelled. */
337
+ readonly editingChanged: import("@angular/core").OutputEmitterRef<GeEditEvent>;
338
+ /** The undo history changed. */
339
+ readonly undoStackChanged: import("@angular/core").OutputEmitterRef<GeUndoEvent>;
340
+ private readonly elementRef;
341
+ private readonly zone;
342
+ private readonly domService;
343
+ private readonly isBrowser;
344
+ private tableScope?;
345
+ private destroyed;
346
+ /** the overlay was shown by the `loading` input: `false` hides only that one */
347
+ private shownByInput;
348
+ private clickTimer?;
349
+ private pendingClick?;
350
+ private warnedExternalWrite;
351
+ /** Forwards the events of the core to the outputs (a separate object: no `onXxx` methods on the component). */
352
+ private readonly listener;
353
+ constructor();
354
+ /** Releases the table (all listeners, observers, renderer cleanups) and sets `tableApi` to `undefined`. */
355
+ ngOnDestroy(): void;
356
+ private currentApi;
357
+ private createTable;
358
+ private applyLoading;
359
+ private onMouseClicked;
360
+ private clearClickTimer;
361
+ /** events the core can still send while it is released (TableScope.destroy()) – never after the component */
362
+ private emitUnlessDestroyed;
363
+ static ɵfac: i0.ɵɵFactoryDeclaration<TableSignalComponent, never>;
364
+ static ɵcmp: i0.ɵɵComponentDeclaration<TableSignalComponent, "guiexpert-table-signal", never, {
365
+ "tableModel": {
366
+ "alias": "tableModel";
367
+ "required": false;
368
+ "isSignal": true;
369
+ };
370
+ "tableOptions": {
371
+ "alias": "tableOptions";
372
+ "required": false;
373
+ "isSignal": true;
374
+ };
375
+ "loading": {
376
+ "alias": "loading";
377
+ "required": false;
378
+ "isSignal": true;
379
+ };
380
+ "debounceMouseClickDelay": {
381
+ "alias": "debounceMouseClickDelay";
382
+ "required": false;
383
+ "isSignal": true;
384
+ };
385
+ "tableApi": {
386
+ "alias": "tableApi";
387
+ "required": false;
388
+ "isSignal": true;
389
+ };
390
+ }, {
391
+ "tableApi": "tableApiChange";
392
+ "mouseClicked": "mouseClicked";
393
+ "mouseMoved": "mouseMoved";
394
+ "mouseDragging": "mouseDragging";
395
+ "mouseDraggingEnded": "mouseDraggingEnded";
396
+ "contextMenu": "contextMenu";
397
+ "scroll": "scroll";
398
+ "modelChanged": "modelChanged";
399
+ "selectionChanged": "selectionChanged";
400
+ "focusChanged": "focusChanged";
401
+ "checkboxChanged": "checkboxChanged";
402
+ "stateChanged": "stateChanged";
403
+ "rowDragStart": "rowDragStart";
404
+ "rowDragMove": "rowDragMove";
405
+ "rowDragEnd": "rowDragEnd";
406
+ "batchEditChanged": "batchEditChanged";
407
+ "detailExpandedChanged": "detailExpandedChanged";
408
+ "editingChanged": "editingChanged";
409
+ "undoStackChanged": "undoStackChanged";
410
+ }, never, never, true, never>;
219
411
  }