@guiexpert/angular-table 22.1.100 → 22.1.101

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.
@@ -84,6 +84,7 @@ var TableComponent = class TableComponent {
84
84
  this.mouseDragging = new Subject();
85
85
  this.mouseDraggingEnded = new Subject();
86
86
  this.contextmenu = new Subject();
87
+ this.contextMenu = new Subject();
87
88
  this.mouseClicked = new Subject();
88
89
  this.modelChanged = new Subject();
89
90
  this.selectionChanged = new Subject();
@@ -113,6 +114,7 @@ var TableComponent = class TableComponent {
113
114
  }
114
115
  onContextmenu(evt) {
115
116
  this.contextmenu.next(evt);
117
+ this.contextMenu.next(evt);
116
118
  }
117
119
  onScroll(evt) {
118
120
  this.scroll.next(evt);
@@ -235,6 +237,7 @@ var TableComponent = class TableComponent {
235
237
  mouseDragging: "mouseDragging",
236
238
  mouseDraggingEnded: "mouseDraggingEnded",
237
239
  contextmenu: "contextmenu",
240
+ contextMenu: "contextMenu",
238
241
  mouseClicked: "mouseClicked",
239
242
  modelChanged: "modelChanged",
240
243
  selectionChanged: "selectionChanged",
@@ -295,6 +298,7 @@ i0.ɵɵngDeclareClassMetadata({
295
298
  mouseDragging: [{ type: Output }],
296
299
  mouseDraggingEnded: [{ type: Output }],
297
300
  contextmenu: [{ type: Output }],
301
+ contextMenu: [{ type: Output }],
298
302
  mouseClicked: [{ type: Output }],
299
303
  modelChanged: [{ type: Output }],
300
304
  selectionChanged: [{ type: Output }],
@@ -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","../../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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"}
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 /**\n * Right click / context menu key on the table.\n *\n * @deprecated since 1.1.101 – use `contextMenu`. Angular binds an output named like a DOM event to the output\n * **and** to the native event of the host element: `(contextmenu)=\"…\"` runs twice, first with the browser's\n * `MouseEvent`, then with the `GeMouseEvent`. Kept for compatibility.\n */\n @Output()\n contextmenu: Subject<GeMouseEvent> = new Subject<GeMouseEvent>();\n\n /**\n * Right click / context menu key on the table – exactly once per event, always a `GeMouseEvent`\n * (replaces `contextmenu`, which also receives the native `MouseEvent`). Call `evt.originalEvent?.preventDefault()`\n * to suppress the browser menu.\n *\n * @example\n * ```html\n * <guiexpert-table [tableModel]=\"tableModel\" (contextMenu)=\"onContextMenu($event)\" />\n * ```\n *\n * @since 1.1.101\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 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.100",
3
+ "version": "22.1.101",
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.100"
9
+ "@guiexpert/table": "^1.1.101"
10
10
  },
11
11
  "dependencies": {
12
12
  "tslib": "^2.3.0"
@@ -27,7 +27,27 @@ export declare class TableComponent implements OnInit, OnChanges, OnDestroy, Eve
27
27
  mouseMoved: Subject<GeMouseEvent>;
28
28
  mouseDragging: Subject<GeMouseEvent>;
29
29
  mouseDraggingEnded: Subject<GeMouseEvent>;
30
+ /**
31
+ * Right click / context menu key on the table.
32
+ *
33
+ * @deprecated since 1.1.101 – use `contextMenu`. Angular binds an output named like a DOM event to the output
34
+ * **and** to the native event of the host element: `(contextmenu)="…"` runs twice, first with the browser's
35
+ * `MouseEvent`, then with the `GeMouseEvent`. Kept for compatibility.
36
+ */
30
37
  contextmenu: Subject<GeMouseEvent>;
38
+ /**
39
+ * Right click / context menu key on the table – exactly once per event, always a `GeMouseEvent`
40
+ * (replaces `contextmenu`, which also receives the native `MouseEvent`). Call `evt.originalEvent?.preventDefault()`
41
+ * to suppress the browser menu.
42
+ *
43
+ * @example
44
+ * ```html
45
+ * <guiexpert-table [tableModel]="tableModel" (contextMenu)="onContextMenu($event)" />
46
+ * ```
47
+ *
48
+ * @since 1.1.101
49
+ */
50
+ contextMenu: Subject<GeMouseEvent>;
31
51
  mouseClicked: Subject<GeMouseEvent>;
32
52
  modelChanged: Subject<GeModelChangeEvent>;
33
53
  selectionChanged: Subject<SelectionModelIf>;
@@ -153,6 +173,7 @@ export declare class TableComponent implements OnInit, OnChanges, OnDestroy, Eve
153
173
  "mouseDragging": "mouseDragging";
154
174
  "mouseDraggingEnded": "mouseDraggingEnded";
155
175
  "contextmenu": "contextmenu";
176
+ "contextMenu": "contextMenu";
156
177
  "mouseClicked": "mouseClicked";
157
178
  "modelChanged": "modelChanged";
158
179
  "selectionChanged": "selectionChanged";