@tanstack/angular-table
Version:
Headless UI for building powerful tables & datagrids for Angular.
1 lines • 53.5 kB
Source Map (JSON)
{"version":3,"file":"tanstack-angular-table.mjs","sources":["../../../src/lazy-signal-initializer.ts","../../../src/proxy.ts","../../../src/flex-render/context.ts","../../../src/flex-render/flags.ts","../../../src/flex-render/flex-render-component.ts","../../../src/flex-render/flex-render-component-ref.ts","../../../src/flex-render/view.ts","../../../src/flex-render.ts","../../../src/index.ts","../../../src/tanstack-angular-table.ts"],"sourcesContent":["import { untracked } from '@angular/core'\n\n/**\n * Implementation from @tanstack/angular-query\n * {@link https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}\n */\nexport function lazyInit<T extends object>(initializer: () => T): T {\n let object: T | null = null\n\n const initializeObject = () => {\n if (!object) {\n object = untracked(() => initializer())\n }\n }\n\n queueMicrotask(() => initializeObject())\n\n const table = () => {}\n\n return new Proxy<T>(table as T, {\n apply(target: T, thisArg: any, argArray: any[]): any {\n initializeObject()\n if (typeof object === 'function') {\n return Reflect.apply(object, thisArg, argArray)\n }\n return Reflect.apply(target as any, thisArg, argArray)\n },\n get(_, prop, receiver) {\n initializeObject()\n return Reflect.get(object as T, prop, receiver)\n },\n has(_, prop) {\n initializeObject()\n return Reflect.has(object as T, prop)\n },\n ownKeys() {\n initializeObject()\n return Reflect.ownKeys(object as T)\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n","import { computed, type Signal, untracked } from '@angular/core'\nimport { type Table } from '@tanstack/table-core'\n\ntype TableSignal<T> = Table<T> & Signal<Table<T>>\n\nexport function proxifyTable<T>(\n tableSignal: Signal<Table<T>>\n): Table<T> & Signal<Table<T>> {\n const internalState = tableSignal as TableSignal<T>\n\n return new Proxy(internalState, {\n apply() {\n return tableSignal()\n },\n get(target, property: keyof Table<T>): any {\n if (target[property]) {\n return target[property]\n }\n const table = untracked(tableSignal)\n /**\n * Attempt to convert all accessors into computed ones,\n * excluding handlers as they do not retain any reactive value\n */\n if (\n property.startsWith('get') &&\n !property.endsWith('Handler')\n // e.g. getCoreRowModel, getSelectedRowModel etc.\n // We need that after a signal change even `rowModel` may mark the view as dirty.\n // This allows to always get the latest `getContext` value while using flexRender\n // && !property.endsWith('Model')\n ) {\n const maybeFn = table[property] as Function | never\n if (typeof maybeFn === 'function') {\n Object.defineProperty(target, property, {\n value: toComputed(tableSignal, maybeFn),\n configurable: true,\n enumerable: true,\n })\n return target[property]\n }\n }\n // @ts-expect-error\n return (target[property] = table[property])\n },\n has(_, prop: keyof Table<T>) {\n return !!untracked(tableSignal)[prop]\n },\n ownKeys() {\n return Reflect.ownKeys(untracked(tableSignal))\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n\n/**\n * Here we'll handle all type of accessors:\n * - 0 argument -> e.g. table.getCanNextPage())\n * - 0~1 arguments -> e.g. table.getIsSomeRowsPinned(position?)\n * - 1 required argument -> e.g. table.getColumn(columnId)\n * - 1+ argument -> e.g. table.getRow(id, searchAll?)\n *\n * Since we are not able to detect automatically the accessors parameters,\n * we'll wrap all accessors into a cached function wrapping a computed\n * that return it's value based on the given parameters\n */\nfunction toComputed<T>(signal: Signal<Table<T>>, fn: Function) {\n const hasArgs = fn.length > 0\n if (!hasArgs) {\n return computed(() => {\n void signal()\n return fn()\n })\n }\n\n const computedCache: Record<string, Signal<unknown>> = {}\n\n return (...argsArray: any[]) => {\n const serializedArgs = serializeArgs(...argsArray)\n if (computedCache.hasOwnProperty(serializedArgs)) {\n return computedCache[serializedArgs]?.()\n }\n const computedSignal = computed(() => {\n void signal()\n return fn(...argsArray)\n })\n\n computedCache[serializedArgs] = computedSignal\n\n return computedSignal()\n }\n}\n\nfunction serializeArgs(...args: any[]) {\n return JSON.stringify(args)\n}\n","import { inject, InjectionToken } from '@angular/core'\n\nexport const FlexRenderComponentProps = new InjectionToken<\n NonNullable<unknown>\n>('[@tanstack/angular-table] Flex render component context props')\n\nexport function injectFlexRenderContext<T extends NonNullable<unknown>>(): T {\n return inject<T>(FlexRenderComponentProps)\n}\n","/**\n * Flags used to manage and optimize the rendering lifecycle of content of the cell,\n * while using FlexRenderDirective.\n */\nexport enum FlexRenderFlags {\n /**\n * Indicates that the view is being created for the first time or will be cleared during the next update phase.\n * This is the initial state and will transition after the first ngDoCheck.\n */\n ViewFirstRender = 1 << 0,\n /**\n * Represents a state where the view is not dirty, meaning no changes require rendering updates.\n */\n Pristine = 1 << 1,\n /**\n * Indicates the `content` property has been modified or the view requires a complete re-render.\n * When this flag is enabled, the view will be cleared and recreated from scratch.\n */\n ContentChanged = 1 << 2,\n /**\n * Indicates that the `props` property reference has changed.\n * When this flag is enabled, the view context is updated based on the type of the content.\n *\n * For Component view, inputs will be updated and view will be marked as dirty.\n * For TemplateRef and primitive values, view will be marked as dirty\n */\n PropsReferenceChanged = 1 << 3,\n /**\n * Indicates that the current rendered view needs to be checked for changes.\n */\n DirtyCheck = 1 << 4,\n /**\n * Indicates that a signal within the `content(props)` result has changed\n */\n DirtySignal = 1 << 5,\n /**\n * Indicates that the first render effect has been checked at least one time.\n */\n RenderEffectChecked = 1 << 6,\n}\n","import {\n ComponentMirror,\n Injector,\n InputSignal,\n OutputEmitterRef,\n reflectComponentType,\n Type,\n} from '@angular/core'\n\ntype Inputs<T> = {\n [K in keyof T as T[K] extends InputSignal<infer R>\n ? K\n : never]?: T[K] extends InputSignal<infer R> ? R : never\n}\n\ntype Outputs<T> = {\n [K in keyof T as T[K] extends OutputEmitterRef<infer R>\n ? K\n : never]?: T[K] extends OutputEmitterRef<infer R>\n ? OutputEmitterRef<R>['emit']\n : never\n}\n\ntype OptionalKeys<T, K = keyof T> = K extends keyof T\n ? T[K] extends Required<T>[K]\n ? undefined extends T[K]\n ? K\n : never\n : K\n : never\n\ninterface FlexRenderRequiredOptions<\n TInputs extends Record<string, any>,\n TOutputs extends Record<string, any>,\n> {\n /**\n * Component instance inputs. They will be set via [componentRef.setInput API](https://angular.dev/api/core/ComponentRef#setInput)\n */\n inputs: TInputs\n /**\n * Component instance outputs.\n */\n outputs?: TOutputs\n /**\n * Optional {@link Injector} that will be used when rendering the component\n */\n injector?: Injector\n}\n\ninterface FlexRenderOptions<\n TInputs extends Record<string, any>,\n TOutputs extends Record<string, any>,\n> {\n /**\n * Component instance inputs. They will be set via [componentRef.setInput API](https://angular.dev/api/core/ComponentRef#setInput)\n */\n inputs?: TInputs\n /**\n * Component instance outputs.\n */\n outputs?: TOutputs\n /**\n * Optional {@link Injector} that will be used when rendering the component\n */\n injector?: Injector\n}\n\n/**\n * Helper function to create a [@link FlexRenderComponent] instance, with better type-safety.\n *\n * - options object must be passed when the given component instance contains at least one required signal input.\n * - options/inputs is typed with the given component inputs\n * - options/outputs is typed with the given component outputs\n */\nexport function flexRenderComponent<\n TComponent = any,\n TInputs extends Inputs<TComponent> = Inputs<TComponent>,\n TOutputs extends Outputs<TComponent> = Outputs<TComponent>,\n>(\n component: Type<TComponent>,\n ...options: OptionalKeys<TInputs> extends never\n ? [FlexRenderOptions<TInputs, TOutputs>?]\n : [FlexRenderRequiredOptions<TInputs, TOutputs>]\n) {\n const { inputs, injector, outputs } = options?.[0] ?? {}\n return new FlexRenderComponent(component, inputs, injector, outputs)\n}\n\n/**\n * Wrapper class for a component that will be used as content for {@link FlexRenderDirective}\n *\n * Prefer {@link flexRenderComponent} helper for better type-safety\n */\nexport class FlexRenderComponent<TComponent = any> {\n readonly mirror: ComponentMirror<TComponent>\n readonly allowedInputNames: string[] = []\n readonly allowedOutputNames: string[] = []\n\n constructor(\n readonly component: Type<TComponent>,\n readonly inputs?: Inputs<TComponent>,\n readonly injector?: Injector,\n readonly outputs?: Outputs<TComponent>\n ) {\n const mirror = reflectComponentType(component)\n if (!mirror) {\n throw new Error(\n `[@tanstack-table/angular] The provided symbol is not a component`\n )\n }\n this.mirror = mirror\n for (const input of this.mirror.inputs) {\n this.allowedInputNames.push(input.propName)\n }\n for (const output of this.mirror.outputs) {\n this.allowedOutputNames.push(output.propName)\n }\n }\n}\n","import {\n ChangeDetectorRef,\n ComponentRef,\n inject,\n Injectable,\n Injector,\n KeyValueDiffer,\n KeyValueDiffers,\n OutputEmitterRef,\n OutputRefSubscription,\n ViewContainerRef,\n} from '@angular/core'\nimport { FlexRenderComponent } from './flex-render-component'\n\n@Injectable()\nexport class FlexRenderComponentFactory {\n #viewContainerRef = inject(ViewContainerRef)\n\n createComponent<T>(\n flexRenderComponent: FlexRenderComponent<T>,\n componentInjector: Injector\n ): FlexRenderComponentRef<T> {\n const componentRef = this.#viewContainerRef.createComponent(\n flexRenderComponent.component,\n {\n injector: componentInjector,\n }\n )\n const view = new FlexRenderComponentRef(\n componentRef,\n flexRenderComponent,\n componentInjector\n )\n\n const { inputs, outputs } = flexRenderComponent\n\n if (inputs) view.setInputs(inputs)\n if (outputs) view.setOutputs(outputs)\n\n return view\n }\n}\n\nexport class FlexRenderComponentRef<T> {\n readonly #keyValueDiffersFactory: KeyValueDiffers\n #componentData: FlexRenderComponent<T>\n #inputValueDiffer: KeyValueDiffer<string, unknown>\n\n readonly #outputRegistry: FlexRenderComponentOutputManager\n\n constructor(\n readonly componentRef: ComponentRef<T>,\n componentData: FlexRenderComponent<T>,\n readonly componentInjector: Injector\n ) {\n this.#componentData = componentData\n this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers)\n\n this.#outputRegistry = new FlexRenderComponentOutputManager(\n this.#keyValueDiffersFactory,\n this.outputs\n )\n\n this.#inputValueDiffer = this.#keyValueDiffersFactory\n .find(this.inputs)\n .create()\n this.#inputValueDiffer.diff(this.inputs)\n\n this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll())\n }\n\n get component() {\n return this.#componentData.component\n }\n\n get inputs() {\n return this.#componentData.inputs ?? {}\n }\n\n get outputs() {\n return this.#componentData.outputs ?? {}\n }\n\n /**\n * Get component input and output diff by the given item\n */\n diff(item: FlexRenderComponent<T>) {\n return {\n inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}),\n outputDiff: this.#outputRegistry.diff(item.outputs ?? {}),\n }\n }\n /**\n *\n * @param compare Whether the current ref component instance is the same as the given one\n */\n eqType(compare: FlexRenderComponent<T>): boolean {\n return compare.component === this.component\n }\n\n /**\n * Tries to update current component refs input by the new given content component.\n */\n update(content: FlexRenderComponent<T>) {\n const eq = this.eqType(content)\n if (!eq) return\n const { inputDiff, outputDiff } = this.diff(content)\n if (inputDiff) {\n inputDiff.forEachAddedItem(item =>\n this.setInput(item.key, item.currentValue)\n )\n inputDiff.forEachChangedItem(item =>\n this.setInput(item.key, item.currentValue)\n )\n inputDiff.forEachRemovedItem(item => this.setInput(item.key, undefined))\n }\n if (outputDiff) {\n outputDiff.forEachAddedItem(item => {\n this.setOutput(item.key, item.currentValue)\n })\n outputDiff.forEachChangedItem(item => {\n if (item.currentValue) {\n this.#outputRegistry.setListener(item.key, item.currentValue)\n } else {\n this.#outputRegistry.unsubscribe(item.key)\n }\n })\n outputDiff.forEachRemovedItem(item => {\n this.#outputRegistry.unsubscribe(item.key)\n })\n }\n\n this.#componentData = content\n }\n\n markAsDirty(): void {\n this.componentRef.injector.get(ChangeDetectorRef).markForCheck()\n }\n\n setInputs(inputs: Record<string, unknown>) {\n for (const prop in inputs) {\n this.setInput(prop, inputs[prop])\n }\n }\n\n setInput(key: string, value: unknown) {\n if (this.#componentData.allowedInputNames.includes(key)) {\n this.componentRef.setInput(key, value)\n }\n }\n\n setOutputs(\n outputs: Record<\n string,\n OutputEmitterRef<unknown>['emit'] | null | undefined\n >\n ) {\n this.#outputRegistry.unsubscribeAll()\n for (const prop in outputs) {\n this.setOutput(prop, outputs[prop])\n }\n }\n\n setOutput(\n outputName: string,\n emit: OutputEmitterRef<unknown>['emit'] | undefined | null\n ): void {\n if (!this.#componentData.allowedOutputNames.includes(outputName)) return\n if (!emit) {\n this.#outputRegistry.unsubscribe(outputName)\n return\n }\n\n const hasListener = this.#outputRegistry.hasListener(outputName)\n this.#outputRegistry.setListener(outputName, emit)\n\n if (hasListener) {\n return\n }\n\n const instance = this.componentRef.instance\n const output = instance[outputName as keyof typeof instance]\n if (output && output instanceof OutputEmitterRef) {\n output.subscribe(value => {\n this.#outputRegistry.getListener(outputName)?.(value)\n })\n }\n }\n}\n\nclass FlexRenderComponentOutputManager {\n readonly #outputSubscribers: Record<string, OutputRefSubscription> = {}\n readonly #outputListeners: Record<string, (...args: any[]) => void> = {}\n\n readonly #valueDiffer: KeyValueDiffer<\n string,\n undefined | null | OutputEmitterRef<unknown>['emit']\n >\n\n constructor(keyValueDiffers: KeyValueDiffers, initialOutputs: any) {\n this.#valueDiffer = keyValueDiffers.find(initialOutputs).create()\n if (initialOutputs) {\n this.#valueDiffer.diff(initialOutputs)\n }\n }\n\n hasListener(outputName: string) {\n return outputName in this.#outputListeners\n }\n\n setListener(outputName: string, callback: (...args: any[]) => void) {\n this.#outputListeners[outputName] = callback\n }\n\n getListener(outputName: string) {\n return this.#outputListeners[outputName]\n }\n\n unsubscribeAll(): void {\n for (const prop in this.#outputSubscribers) {\n this.unsubscribe(prop)\n }\n }\n\n unsubscribe(outputName: string) {\n if (outputName in this.#outputSubscribers) {\n this.#outputSubscribers[outputName]?.unsubscribe()\n delete this.#outputSubscribers[outputName]\n delete this.#outputListeners[outputName]\n }\n }\n\n diff(outputs: Record<string, OutputEmitterRef<unknown>['emit'] | undefined>) {\n return this.#valueDiffer.diff(outputs ?? {})\n }\n}\n","import { FlexRenderComponentRef } from './flex-render-component-ref'\nimport { EmbeddedViewRef, TemplateRef, Type } from '@angular/core'\nimport type { FlexRenderContent } from '../flex-render'\nimport { FlexRenderComponent } from './flex-render-component'\n\nexport type FlexRenderTypedContent =\n | { kind: 'null' }\n | {\n kind: 'primitive'\n content: string | number | Record<string, any>\n }\n | { kind: 'flexRenderComponent'; content: FlexRenderComponent<unknown> }\n | { kind: 'templateRef'; content: TemplateRef<unknown> }\n | { kind: 'component'; content: Type<unknown> }\n\nexport function mapToFlexRenderTypedContent(\n content: FlexRenderContent<any>\n): FlexRenderTypedContent {\n if (content === null || content === undefined) {\n return { kind: 'null' }\n }\n if (typeof content === 'string' || typeof content === 'number') {\n return { kind: 'primitive', content }\n }\n if (content instanceof FlexRenderComponent) {\n return { kind: 'flexRenderComponent', content }\n } else if (content instanceof TemplateRef) {\n return { kind: 'templateRef', content }\n } else if (content instanceof Type) {\n return { kind: 'component', content }\n } else {\n return { kind: 'primitive', content }\n }\n}\n\nexport abstract class FlexRenderView<\n TView extends FlexRenderComponentRef<any> | EmbeddedViewRef<unknown> | null,\n> {\n readonly view: TView\n #previousContent: FlexRenderTypedContent | undefined\n #content: FlexRenderTypedContent\n\n protected constructor(\n initialContent: Exclude<FlexRenderTypedContent, { kind: 'null' }>,\n view: TView\n ) {\n this.#content = initialContent\n this.view = view\n }\n\n get previousContent(): FlexRenderTypedContent {\n return this.#previousContent ?? { kind: 'null' }\n }\n\n get content() {\n return this.#content\n }\n\n set content(content: FlexRenderTypedContent) {\n this.#previousContent = this.#content\n this.#content = content\n }\n\n abstract updateProps(props: Record<string, any>): void\n\n abstract dirtyCheck(): void\n\n abstract onDestroy(callback: Function): void\n}\n\nexport class FlexRenderTemplateView extends FlexRenderView<\n EmbeddedViewRef<unknown>\n> {\n constructor(\n initialContent: Extract<\n FlexRenderTypedContent,\n { kind: 'primitive' | 'templateRef' }\n >,\n view: EmbeddedViewRef<unknown>\n ) {\n super(initialContent, view)\n }\n\n override updateProps(props: Record<string, any>) {\n this.view.markForCheck()\n }\n\n override dirtyCheck() {\n // Basically a no-op. When the view is created via EmbeddedViewRef, we don't need to do any manual update\n // since this type of content has a proxy as a context, then every time the root component is checked for changes,\n // the property getter will be re-evaluated.\n //\n // If in a future we need to manually mark the view as dirty, just uncomment next line\n // this.view.markForCheck()\n }\n\n override onDestroy(callback: Function) {\n this.view.onDestroy(callback)\n }\n}\n\nexport class FlexRenderComponentView extends FlexRenderView<\n FlexRenderComponentRef<unknown>\n> {\n constructor(\n initialContent: Extract<\n FlexRenderTypedContent,\n { kind: 'component' | 'flexRenderComponent' }\n >,\n view: FlexRenderComponentRef<unknown>\n ) {\n super(initialContent, view)\n }\n\n override updateProps(props: Record<string, any>) {\n switch (this.content.kind) {\n case 'component': {\n this.view.setInputs(props)\n break\n }\n case 'flexRenderComponent': {\n // No-op. When FlexRenderFlags.PropsReferenceChanged is set,\n // FlexRenderComponent will be updated into `dirtyCheck`.\n break\n }\n }\n }\n\n override dirtyCheck() {\n switch (this.content.kind) {\n case 'component': {\n // Component context is currently valuated with the cell context. Since it's reference\n // shouldn't change, we force mark the component as dirty in order to re-evaluate function invocation in view.\n // NOTE: this should behave like having a component with ChangeDetectionStrategy.Default\n this.view.markAsDirty()\n break\n }\n case 'flexRenderComponent': {\n // Given context instance will always have a different reference than the previous one,\n // so instead of recreating the entire view, we will only update the current view\n if (this.view.eqType(this.content.content)) {\n this.view.update(this.content.content)\n }\n this.view.markAsDirty()\n break\n }\n }\n }\n\n override onDestroy(callback: Function) {\n this.view.componentRef.onDestroy(callback)\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n DoCheck,\n effect,\n type EffectRef,\n Inject,\n inject,\n Injector,\n Input,\n OnChanges,\n runInInjectionContext,\n SimpleChanges,\n TemplateRef,\n Type,\n ViewContainerRef,\n} from '@angular/core'\nimport { FlexRenderComponentProps } from './flex-render/context'\nimport { FlexRenderFlags } from './flex-render/flags'\nimport {\n flexRenderComponent,\n FlexRenderComponent,\n} from './flex-render/flex-render-component'\nimport { FlexRenderComponentFactory } from './flex-render/flex-render-component-ref'\nimport {\n FlexRenderComponentView,\n FlexRenderTemplateView,\n type FlexRenderTypedContent,\n FlexRenderView,\n mapToFlexRenderTypedContent,\n} from './flex-render/view'\nimport { memo } from '@tanstack/table-core'\n\nexport {\n injectFlexRenderContext,\n type FlexRenderComponentProps,\n} from './flex-render/context'\n\nexport type FlexRenderContent<TProps extends NonNullable<unknown>> =\n | string\n | number\n | Type<TProps>\n | FlexRenderComponent<TProps>\n | TemplateRef<{ $implicit: TProps }>\n | null\n | Record<any, any>\n | undefined\n\n@Directive({\n selector: '[flexRender]',\n standalone: true,\n providers: [FlexRenderComponentFactory],\n})\nexport class FlexRenderDirective<TProps extends NonNullable<unknown>>\n implements OnChanges, DoCheck\n{\n readonly #flexRenderComponentFactory = inject(FlexRenderComponentFactory)\n readonly #changeDetectorRef = inject(ChangeDetectorRef)\n\n @Input({ required: true, alias: 'flexRender' })\n content:\n | number\n | string\n | ((props: TProps) => FlexRenderContent<TProps>)\n | null\n | undefined = undefined\n\n @Input({ required: true, alias: 'flexRenderProps' })\n props: TProps = {} as TProps\n\n @Input({ required: false, alias: 'flexRenderInjector' })\n injector: Injector = inject(Injector)\n\n renderFlags = FlexRenderFlags.ViewFirstRender\n renderView: FlexRenderView<any> | null = null\n\n readonly #latestContent = () => {\n const { content, props } = this\n return typeof content !== 'function'\n ? content\n : runInInjectionContext(this.injector, () => content(props))\n }\n\n #getContentValue = memo(\n () => [this.#latestContent(), this.props, this.content],\n latestContent => {\n return mapToFlexRenderTypedContent(latestContent)\n },\n { key: 'flexRenderContentValue', debug: () => false }\n )\n\n constructor(\n @Inject(ViewContainerRef)\n private readonly viewContainerRef: ViewContainerRef,\n @Inject(TemplateRef)\n private readonly templateRef: TemplateRef<any>\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['props']) {\n this.renderFlags |= FlexRenderFlags.PropsReferenceChanged\n }\n if (changes['content']) {\n this.renderFlags |=\n FlexRenderFlags.ContentChanged | FlexRenderFlags.ViewFirstRender\n this.update()\n }\n }\n\n ngDoCheck(): void {\n if (this.renderFlags & FlexRenderFlags.ViewFirstRender) {\n // On the initial render, the view is created during the `ngOnChanges` hook.\n // Since `ngDoCheck` is called immediately afterward, there's no need to check for changes in this phase.\n this.renderFlags &= ~FlexRenderFlags.ViewFirstRender\n return\n }\n\n this.renderFlags |= FlexRenderFlags.DirtyCheck\n\n const latestContent = this.#getContentValue()\n if (latestContent.kind === 'null' || !this.renderView) {\n this.renderFlags |= FlexRenderFlags.ContentChanged\n } else {\n this.renderView.content = latestContent\n const { kind: previousKind } = this.renderView.previousContent\n if (latestContent.kind !== previousKind) {\n this.renderFlags |= FlexRenderFlags.ContentChanged\n }\n }\n this.update()\n }\n\n update() {\n if (\n this.renderFlags &\n (FlexRenderFlags.ContentChanged | FlexRenderFlags.ViewFirstRender)\n ) {\n this.render()\n return\n }\n if (this.renderFlags & FlexRenderFlags.PropsReferenceChanged) {\n if (this.renderView) this.renderView.updateProps(this.props)\n this.renderFlags &= ~FlexRenderFlags.PropsReferenceChanged\n }\n if (\n this.renderFlags &\n (FlexRenderFlags.DirtyCheck | FlexRenderFlags.DirtySignal)\n ) {\n if (this.renderView) this.renderView.dirtyCheck()\n this.renderFlags &= ~(\n FlexRenderFlags.DirtyCheck | FlexRenderFlags.DirtySignal\n )\n }\n }\n\n #currentEffectRef: EffectRef | null = null\n\n render() {\n if (this.#shouldRecreateEntireView() && this.#currentEffectRef) {\n this.#currentEffectRef.destroy()\n this.#currentEffectRef = null\n this.renderFlags &= ~FlexRenderFlags.RenderEffectChecked\n }\n\n this.viewContainerRef.clear()\n this.renderFlags =\n FlexRenderFlags.Pristine |\n (this.renderFlags & FlexRenderFlags.ViewFirstRender) |\n (this.renderFlags & FlexRenderFlags.RenderEffectChecked)\n\n const resolvedContent = this.#getContentValue()\n if (resolvedContent.kind === 'null') {\n this.renderView = null\n } else {\n this.renderView = this.#renderViewByContent(resolvedContent)\n }\n\n // If the content is a function `content(props)`, we initialize an effect\n // in order to react to changes if the given definition use signals.\n if (!this.#currentEffectRef && typeof this.content === 'function') {\n this.#currentEffectRef = effect(\n () => {\n this.#latestContent()\n if (!(this.renderFlags & FlexRenderFlags.RenderEffectChecked)) {\n this.renderFlags |= FlexRenderFlags.RenderEffectChecked\n return\n }\n this.renderFlags |= FlexRenderFlags.DirtySignal\n // This will mark the view as changed,\n // so we'll try to check for updates into ngDoCheck\n this.#changeDetectorRef.markForCheck()\n },\n { injector: this.viewContainerRef.injector }\n )\n }\n }\n\n #shouldRecreateEntireView() {\n return (\n this.renderFlags &\n FlexRenderFlags.ContentChanged &\n FlexRenderFlags.ViewFirstRender\n )\n }\n\n #renderViewByContent(\n content: FlexRenderTypedContent\n ): FlexRenderView<any> | null {\n if (content.kind === 'primitive') {\n return this.#renderStringContent(content)\n } else if (content.kind === 'templateRef') {\n return this.#renderTemplateRefContent(content)\n } else if (content.kind === 'flexRenderComponent') {\n return this.#renderComponent(content)\n } else if (content.kind === 'component') {\n return this.#renderCustomComponent(content)\n } else {\n return null\n }\n }\n\n #renderStringContent(\n template: Extract<FlexRenderTypedContent, { kind: 'primitive' }>\n ): FlexRenderTemplateView {\n const context = () => {\n return typeof this.content === 'string' ||\n typeof this.content === 'number'\n ? this.content\n : this.content?.(this.props)\n }\n const ref = this.viewContainerRef.createEmbeddedView(this.templateRef, {\n get $implicit() {\n return context()\n },\n })\n return new FlexRenderTemplateView(template, ref)\n }\n\n #renderTemplateRefContent(\n template: Extract<FlexRenderTypedContent, { kind: 'templateRef' }>\n ): FlexRenderTemplateView {\n const latestContext = () => this.props\n const view = this.viewContainerRef.createEmbeddedView(template.content, {\n get $implicit() {\n return latestContext()\n },\n })\n return new FlexRenderTemplateView(template, view)\n }\n\n #renderComponent(\n flexRenderComponent: Extract<\n FlexRenderTypedContent,\n { kind: 'flexRenderComponent' }\n >\n ): FlexRenderComponentView {\n const { inputs, outputs, injector } = flexRenderComponent.content\n\n const getContext = () => this.props\n const proxy = new Proxy(this.props, {\n get: (_, key) => getContext()[key as keyof typeof _],\n })\n const componentInjector = Injector.create({\n parent: injector ?? this.injector,\n providers: [{ provide: FlexRenderComponentProps, useValue: proxy }],\n })\n const view = this.#flexRenderComponentFactory.createComponent(\n flexRenderComponent.content,\n componentInjector\n )\n return new FlexRenderComponentView(flexRenderComponent, view)\n }\n\n #renderCustomComponent(\n component: Extract<FlexRenderTypedContent, { kind: 'component' }>\n ): FlexRenderComponentView {\n const view = this.#flexRenderComponentFactory.createComponent(\n flexRenderComponent(component.content, {\n inputs: this.props,\n injector: this.injector,\n }),\n this.injector\n )\n return new FlexRenderComponentView(component, view)\n }\n}\n","import { computed, type Signal, signal } from '@angular/core'\nimport {\n RowData,\n TableOptions,\n TableOptionsResolved,\n TableState,\n createTable,\n type Table,\n} from '@tanstack/table-core'\nimport { lazyInit } from './lazy-signal-initializer'\nimport { proxifyTable } from './proxy'\n\nexport * from '@tanstack/table-core'\n\nexport {\n type FlexRenderContent,\n FlexRenderDirective,\n FlexRenderDirective as FlexRender,\n injectFlexRenderContext,\n type FlexRenderComponentProps,\n} from './flex-render'\n\nexport {\n FlexRenderComponent,\n flexRenderComponent,\n} from './flex-render/flex-render-component'\n\nexport function createAngularTable<TData extends RowData>(\n options: () => TableOptions<TData>\n): Table<TData> & Signal<Table<TData>> {\n return lazyInit(() => {\n const resolvedOptions = {\n state: {},\n onStateChange: () => {},\n renderFallbackValue: null,\n ...options(),\n }\n\n const table = createTable(resolvedOptions)\n\n // By default, manage table state here using the table's initial state\n const state = signal<TableState>(table.initialState)\n\n // Compose table options using computed.\n // This is to allow `tableSignal` to listen and set table option\n const updatedOptions = computed<TableOptionsResolved<TData>>(() => {\n // listen to table state changed\n const tableState = state()\n // listen to input options changed\n const tableOptions = options()\n return {\n ...table.options,\n ...resolvedOptions,\n ...tableOptions,\n state: { ...tableState, ...tableOptions.state },\n onStateChange: updater => {\n const value =\n updater instanceof Function ? updater(tableState) : updater\n state.set(value)\n resolvedOptions.onStateChange?.(updater)\n },\n }\n })\n\n // convert table instance to signal for proxify to listen to any table state and options changes\n const tableSignal = computed(\n () => {\n table.setOptions(updatedOptions())\n return table\n },\n {\n equal: () => false,\n }\n )\n\n // proxify Table instance to provide ability for consumer to listen to any table state changes\n return proxifyTable(tableSignal)\n })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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