import type { UniComponent } from '../../../_common/components/uni-component/uni-component.js'; import { createUniComponentFromWebComponent } from '../../../_common/components/uni-component/uni-component.js'; import type { BaseCellRenderer } from './base-cell.js'; import type { CellRenderer, DataViewCellComponent } from './manager.js'; export interface Renderer< Data extends NonNullable = NonNullable, Value = unknown, > { type: string; icon?: UniComponent; cellRenderer: CellRenderer; detailCellRenderer?: CellRenderer; } export class ColumnRendererHelper { private _columns = new Map(); register(renderer: Renderer) { const columns = this._columns; if (columns.has(renderer.type)) { throw new Error('cannot register twice for ' + renderer.type); } columns.set(renderer.type, renderer); } get(type: Renderer['type']): Renderer { const renderer = this._columns.get(type); if (!renderer) { throw new Error(`cannot find renderer of ${type}`); } return renderer; } list(): Renderer[] { return Array.from(this._columns.values()); } } export const columnRenderer = new ColumnRendererHelper(); export const createFromBaseCellRenderer = < Value, Data extends Record = Record, >( renderer: new () => BaseCellRenderer ): DataViewCellComponent => { return createUniComponentFromWebComponent(renderer as never) as never; };