@weaver-apps/data-grid 0.3.1 → 0.3.2

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.
package/README.md CHANGED
@@ -20,7 +20,8 @@ npm i ag-grid-community@^36.2 ag-grid-angular@^36.2 @ag-grid-community/locale@^3
20
20
 
21
21
  - `DataGrid` (`<wa-data-grid [options]>`): the themed grid. It registers the AG Grid modules it needs once,
22
22
  follows the active Transloco language, and scrolls a server listing in blocks of `DATA_GRID_BLOCK_SIZE` rows
23
- unless the options ask for `rowModelType: 'clientSide'`.
23
+ unless the options ask for `rowModelType: 'clientSide'`. An `initialState` in the options sets only what it
24
+ names, so a column keeps what its definition says otherwise, `pinned` included.
24
25
  - `listingDatasource(fetch, { answered, failed })`: turns the grid's window, sort and filters into one
25
26
  `ListingRequest` (`offset`, `limit`, `sort`, `filters`) and reports the total of the latest query only.
26
27
  - `ListFilter`: a column filter for picking any number of values, given `options` and, for rows held in the
@@ -80,6 +80,7 @@ var DataGrid = class DataGrid {
80
80
  suppressColumnVirtualisation: true,
81
81
  tooltipShowDelay: TOOLTIP_DELAY_MS,
82
82
  ...this.options(),
83
+ initialState: this.initialState(),
83
84
  localeText: { ...dataGridLocaleText(language, this.localeOverrides()) }
84
85
  }
85
86
  }];
@@ -90,6 +91,13 @@ var DataGrid = class DataGrid {
90
91
  announce(event) {
91
92
  this.ready.emit(event.api);
92
93
  }
94
+ initialState() {
95
+ const state = this.options().initialState;
96
+ return state && {
97
+ ...state,
98
+ partialColumnState: true
99
+ };
100
+ }
93
101
  rowModel() {
94
102
  if (this.options().rowModelType === "clientSide") return { rowModelType: "clientSide" };
95
103
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"weaver-apps-data-grid.mjs","names":[],"sources":["../../../../libs/data-grid/src/lib/locale.ts","../../../../libs/data-grid/src/lib/modules.ts","../../../../libs/data-grid/src/lib/theme.ts","../../../../libs/data-grid/src/lib/grid/data-grid.ts","../../../../libs/data-grid/src/lib/grid/data-grid.html","../../../../libs/data-grid/src/lib/list-filter/list-filter.ts","../../../../libs/data-grid/src/lib/list-filter/list-filter.html","../../../../libs/data-grid/src/lib/listing-datasource.ts","../../../../libs/data-grid/src/lib/open-on-row.ts"],"sourcesContent":["import { AG_GRID_LOCALE_DE, AG_GRID_LOCALE_EN } from '@ag-grid-community/locale';\n\nexport type DataGridLocaleText = Readonly<Record<string, string>>;\n\nconst locales: Readonly<Record<string, DataGridLocaleText>> = {\n de: AG_GRID_LOCALE_DE,\n en: AG_GRID_LOCALE_EN,\n};\n\nexport const DATA_GRID_FALLBACK_LANGUAGE = 'en';\n\nexport function dataGridLocaleText(language: string, overrides: DataGridLocaleText = {}): DataGridLocaleText {\n const base = locales[language.slice(0, 2).toLowerCase()] ?? locales[DATA_GRID_FALLBACK_LANGUAGE];\n return { ...base, ...overrides };\n}\n","import { isDevMode } from '@angular/core';\nimport {\n CellStyleModule,\n ClientSideRowModelModule,\n ColumnApiModule,\n CustomFilterModule,\n GridStateModule,\n InfiniteRowModelModule,\n LocaleModule,\n type Module,\n ModuleRegistry,\n RowStyleModule,\n TextFilterModule,\n TooltipModule,\n ValidationModule,\n} from 'ag-grid-community';\n\nexport const dataGridModules: readonly Module[] = [\n InfiniteRowModelModule,\n ClientSideRowModelModule,\n ColumnApiModule,\n TextFilterModule,\n CustomFilterModule,\n GridStateModule,\n LocaleModule,\n CellStyleModule,\n RowStyleModule,\n TooltipModule,\n];\n\nlet registered = false;\n\nexport function registerDataGridModules(): void {\n if (registered) {\n return;\n }\n ModuleRegistry.registerModules(isDevMode() ? [...dataGridModules, ValidationModule] : [...dataGridModules]);\n registered = true;\n}\n","import { themeQuartz } from 'ag-grid-community';\n\nexport const DATA_GRID_ROW_HEIGHT_PX = 36;\n\nexport const dataGridThemeParams = {\n backgroundColor: 'var(--lw-surface)',\n foregroundColor: 'var(--lw-content)',\n cellTextColor: 'var(--lw-content)',\n headerTextColor: 'var(--lw-content-muted)',\n headerBackgroundColor: 'var(--lw-surface-raised)',\n chromeBackgroundColor: 'var(--lw-surface-raised)',\n menuBackgroundColor: 'var(--lw-surface-overlay)',\n borderColor: 'var(--lw-border)',\n accentColor: 'var(--lw-brand)',\n rowHoverColor: 'color-mix(in srgb, var(--lw-brand) 8%, transparent)',\n oddRowBackgroundColor: 'var(--lw-surface)',\n inputBackgroundColor: 'var(--lw-field)',\n invalidColor: 'var(--lw-negative)',\n browserColorScheme: 'inherit',\n fontFamily: 'var(--lw-font-sans)',\n fontSize: '0.875rem',\n rowHeight: DATA_GRID_ROW_HEIGHT_PX,\n headerHeight: DATA_GRID_ROW_HEIGHT_PX,\n focusShadow: '0 0 0 2px var(--lw-brand)',\n wrapperBorderRadius: '0.5rem',\n} as const;\n\nexport const dataGridTheme = themeQuartz.withParams(dataGridThemeParams);\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { AgGridAngular } from 'ag-grid-angular';\nimport type { GridApi, GridOptions, GridReadyEvent } from 'ag-grid-community';\nimport { type DataGridLocaleText, dataGridLocaleText } from '../locale';\nimport { registerDataGridModules } from '../modules';\nimport { DATA_GRID_ROW_HEIGHT_PX, dataGridTheme } from '../theme';\n\nexport const DATA_GRID_BLOCK_SIZE = 100;\nexport const DATA_GRID_MAX_BLOCKS = 20;\nconst TOOLTIP_DELAY_MS = 600;\n\n@Component({\n selector: 'wa-data-grid',\n imports: [AgGridAngular],\n templateUrl: './data-grid.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block h-full w-full' },\n})\nexport class DataGrid<TRow> {\n private readonly transloco = inject(TranslocoService);\n private readonly language = toSignal(this.transloco.langChanges$, { initialValue: this.transloco.getActiveLang() });\n\n readonly options = input.required<GridOptions<TRow>>();\n readonly localeOverrides = input<DataGridLocaleText>({});\n readonly ready = output<GridApi<TRow>>();\n\n protected readonly grids = computed(() => {\n const language = this.language();\n return [\n {\n language,\n options: {\n theme: dataGridTheme,\n ...this.rowModel(),\n rowHeight: DATA_GRID_ROW_HEIGHT_PX,\n headerHeight: DATA_GRID_ROW_HEIGHT_PX,\n suppressMultiSort: true,\n suppressMovableColumns: true,\n suppressColumnVirtualisation: true,\n tooltipShowDelay: TOOLTIP_DELAY_MS,\n ...this.options(),\n localeText: { ...dataGridLocaleText(language, this.localeOverrides()) },\n } satisfies GridOptions<TRow>,\n },\n ];\n });\n\n constructor() {\n registerDataGridModules();\n }\n\n protected announce(event: GridReadyEvent<TRow>): void {\n this.ready.emit(event.api);\n }\n\n private rowModel(): Pick<GridOptions<TRow>, 'rowModelType' | 'cacheBlockSize' | 'maxBlocksInCache'> {\n if (this.options().rowModelType === 'clientSide') {\n return { rowModelType: 'clientSide' };\n }\n return { rowModelType: 'infinite', cacheBlockSize: DATA_GRID_BLOCK_SIZE, maxBlocksInCache: DATA_GRID_MAX_BLOCKS };\n }\n}\n","@for (grid of grids(); track grid) {\n <ag-grid-angular class=\"block h-full w-full\" [gridOptions]=\"grid.options\" (gridReady)=\"announce($event)\" />\n}\n","import { ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, Component, type ElementRef, computed, signal, viewChild } from '@angular/core';\nimport { AG_GRID_LOCALE_EN } from '@ag-grid-community/locale';\nimport type { IFilterAngularComp } from 'ag-grid-angular';\nimport type { IAfterGuiAttachedParams, IDoesFilterPassParams, IFilterParams } from 'ag-grid-community';\nimport type { ListFilterModel, ListFilterOption, ListFilterParams } from './list-filter-model';\n\nconst TEXT_KEYS = {\n search: 'searchOoo',\n selectAll: 'selectAll',\n clear: 'clearFilter',\n empty: 'noMatches',\n} as const;\n\nconst FALLBACK_TEXTS: Readonly<Record<keyof typeof TEXT_KEYS, string>> = textsOf(AG_GRID_LOCALE_EN);\n\nlet nextInstance = 0;\n\n@Component({\n selector: 'wa-list-filter',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './list-filter.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListFilter implements IFilterAngularComp {\n private readonly searchBox = viewChild<ElementRef<HTMLInputElement>>('searchBox');\n private params: (IFilterParams & ListFilterParams) | null = null;\n\n protected readonly id = `wa-list-filter-${nextInstance++}`;\n protected readonly legend = signal('');\n protected readonly texts = signal(FALLBACK_TEXTS);\n protected readonly options = signal<readonly ListFilterOption[]>([]);\n protected readonly selected = signal<ReadonlySet<string>>(new Set());\n protected readonly search = signal('');\n protected readonly shown = computed(() => {\n const needle = this.search().trim().toLocaleLowerCase();\n return needle ? this.options().filter((option) => option.label.toLocaleLowerCase().includes(needle)) : this.options();\n });\n protected readonly allShownSelected = computed(\n () => this.shown().length > 0 && this.shown().every((option) => this.selected().has(option.value)),\n );\n\n agInit(params: IFilterParams & ListFilterParams): void {\n this.params = params;\n this.legend.set(params.api.getDisplayNameForColumn(params.column, 'filterToolPanel') ?? '');\n this.readOptions();\n }\n\n isFilterActive(): boolean {\n return this.selected().size > 0;\n }\n\n doesFilterPass(params: IDoesFilterPassParams): boolean {\n const rowValue = this.params?.rowValue as ((row: unknown) => string) | undefined;\n return !rowValue || this.selected().has(rowValue(params.data));\n }\n\n getModel(): ListFilterModel | null {\n return this.isFilterActive() ? { values: [...this.selected()] } : null;\n }\n\n setModel(model: ListFilterModel | null): void {\n this.selected.set(new Set(model?.values ?? []));\n }\n\n afterGuiAttached(params?: IAfterGuiAttachedParams): void {\n this.readOptions();\n if (!params?.suppressFocus) {\n this.searchBox()?.nativeElement.focus();\n }\n }\n\n protected isSelected(option: ListFilterOption): boolean {\n return this.selected().has(option.value);\n }\n\n protected toggle(option: ListFilterOption, checked: boolean): void {\n const next = new Set(this.selected());\n if (checked) {\n next.add(option.value);\n } else {\n next.delete(option.value);\n }\n this.apply(next);\n }\n\n protected toggleAll(checked: boolean): void {\n const shown = this.shown().map((option) => option.value);\n const next = new Set(this.selected());\n for (const value of shown) {\n if (checked) {\n next.add(value);\n } else {\n next.delete(value);\n }\n }\n this.apply(next);\n }\n\n protected clear(): void {\n this.search.set('');\n this.apply(new Set());\n }\n\n private readOptions(): void {\n if (!this.params) {\n return;\n }\n this.options.set(this.params.options());\n this.texts.set(textsOf(this.params.api.getGridOption('localeText') ?? {}));\n }\n\n private apply(next: ReadonlySet<string>): void {\n this.selected.set(next);\n this.params?.filterChangedCallback();\n }\n}\n\nfunction textsOf(\n localeText: Readonly<Record<string, string>>,\n fallback: Readonly<Record<string, string>> = AG_GRID_LOCALE_EN,\n): Readonly<Record<keyof typeof TEXT_KEYS, string>> {\n const text = (key: string) => localeText[key] ?? fallback[key] ?? key;\n return {\n search: text(TEXT_KEYS.search),\n selectAll: text(TEXT_KEYS.selectAll),\n clear: text(TEXT_KEYS.clear),\n empty: text(TEXT_KEYS.empty),\n };\n}\n","<fieldset class=\"m-0 flex w-64 flex-col gap-2 border-0 p-3 text-sm text-content\" data-testid=\"list-filter\">\n <legend class=\"mb-1 p-0 font-medium\">{{ legend() }}</legend>\n\n <label class=\"sr-only\" [attr.for]=\"id + '-search'\">{{ texts().search }}</label>\n <input\n #searchBox\n type=\"search\"\n class=\"lw-field h-9\"\n [id]=\"id + '-search'\"\n [placeholder]=\"texts().search\"\n [value]=\"search()\"\n (input)=\"search.set(searchBox.value)\"\n />\n\n @if (shown().length === 0) {\n <p class=\"m-0 text-content-muted\">{{ texts().empty }}</p>\n } @else {\n <label class=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n class=\"lw-checkbox\"\n data-testid=\"list-filter-all\"\n [checked]=\"allShownSelected()\"\n (change)=\"toggleAll($any($event.target).checked)\"\n />\n <span>{{ texts().selectAll }}</span>\n </label>\n <ul class=\"m-0 flex max-h-64 list-none flex-col gap-1 overflow-y-auto p-0\">\n @for (option of shown(); track option.value) {\n <li>\n <label class=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n class=\"lw-checkbox\"\n [attr.data-testid]=\"'list-filter-option-' + option.value\"\n [checked]=\"isSelected(option)\"\n (change)=\"toggle(option, $any($event.target).checked)\"\n />\n <span>{{ option.label }}</span>\n </label>\n </li>\n }\n </ul>\n }\n\n <button type=\"button\" class=\"lw-btn self-end\" data-testid=\"list-filter-clear\" (click)=\"clear()\">{{ texts().clear }}</button>\n</fieldset>\n","import type { IDatasource, IGetRowsParams, SortModelItem } from 'ag-grid-community';\n\nexport interface ListingRequest<TFilterModel> {\n readonly offset: number;\n readonly limit: number;\n readonly sort: ListingSort | null;\n readonly filters: TFilterModel;\n}\n\nexport interface ListingSort {\n readonly column: string;\n readonly descending: boolean;\n}\n\nexport interface ListingAnswer<TRow> {\n readonly items: readonly TRow[];\n readonly total: number;\n}\n\nexport type ListingFetch<TRow, TFilterModel> = (request: ListingRequest<TFilterModel>) => Promise<ListingAnswer<TRow>>;\n\nexport interface ListingDatasourceOptions<TRow> {\n readonly answered?: (answer: ListingAnswer<TRow>) => void;\n readonly failed?: (error: unknown) => void;\n}\n\nexport function listingDatasource<TRow, TFilterModel = Record<string, unknown>>(\n fetch: ListingFetch<TRow, TFilterModel>,\n options: ListingDatasourceOptions<TRow> = {},\n): IDatasource {\n let latest = '';\n return {\n getRows(params: IGetRowsParams<TRow>): void {\n const asked = queryOf(params.filterModel, params.sortModel);\n latest = asked;\n const request: ListingRequest<TFilterModel> = {\n offset: params.startRow,\n limit: params.endRow - params.startRow,\n sort: sortOf(params.sortModel),\n filters: (params.filterModel ?? {}) as TFilterModel,\n };\n const current = () => asked === latest && !params.api?.isDestroyed();\n fetch(request).then(\n (answer) => {\n if (!current()) {\n return;\n }\n options.answered?.(answer);\n params.successCallback([...answer.items], answer.total);\n },\n (error: unknown) => {\n if (!current()) {\n return;\n }\n options.failed?.(error);\n params.failCallback();\n },\n );\n },\n };\n}\n\nfunction queryOf(filterModel: unknown, sortModel: readonly SortModelItem[]): string {\n return JSON.stringify({ filters: filterModel ?? {}, sort: sortModel.map(({ colId, sort }) => ({ colId, sort })) });\n}\n\nfunction sortOf(sortModel: readonly SortModelItem[]): ListingSort | null {\n const first = sortModel[0];\n return first ? { column: first.colId, descending: first.sort === 'desc' } : null;\n}\n","import type { GridOptions } from 'ag-grid-community';\n\nexport interface OpenOnRowOptions {\n readonly except?: readonly string[];\n}\n\nexport type RowOpening<TRow> = Required<Pick<GridOptions<TRow>, 'rowClass' | 'onCellClicked' | 'onCellKeyDown'>>;\n\nconst controlSelector = 'button, input, select, textarea, a';\n\nexport function openOnRow<TRow>(open: (row: TRow) => void, { except = [] }: OpenOnRowOptions = {}): RowOpening<TRow> {\n const opens = (row: TRow | undefined, columnId: string, event: Event | null | undefined): void => {\n if (!row || except.includes(columnId) || fromControl(event)) {\n return;\n }\n open(row);\n };\n return {\n rowClass: 'cursor-pointer',\n onCellClicked: (event) => opens(event.data, event.column.getColId(), event.event),\n onCellKeyDown: (event) => {\n if (!('column' in event) || (event.event as KeyboardEvent | null | undefined)?.key !== 'Enter') {\n return;\n }\n opens(event.data, event.column.getColId(), event.event);\n },\n };\n}\n\nfunction fromControl(event: Event | null | undefined): boolean {\n return event?.target instanceof Element && event.target.closest(controlSelector) !== null;\n}\n"],"mappings":"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IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;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"}
1
+ {"version":3,"file":"weaver-apps-data-grid.mjs","names":[],"sources":["../../../../libs/data-grid/src/lib/locale.ts","../../../../libs/data-grid/src/lib/modules.ts","../../../../libs/data-grid/src/lib/theme.ts","../../../../libs/data-grid/src/lib/grid/data-grid.ts","../../../../libs/data-grid/src/lib/grid/data-grid.html","../../../../libs/data-grid/src/lib/list-filter/list-filter.ts","../../../../libs/data-grid/src/lib/list-filter/list-filter.html","../../../../libs/data-grid/src/lib/listing-datasource.ts","../../../../libs/data-grid/src/lib/open-on-row.ts"],"sourcesContent":["import { AG_GRID_LOCALE_DE, AG_GRID_LOCALE_EN } from '@ag-grid-community/locale';\n\nexport type DataGridLocaleText = Readonly<Record<string, string>>;\n\nconst locales: Readonly<Record<string, DataGridLocaleText>> = {\n de: AG_GRID_LOCALE_DE,\n en: AG_GRID_LOCALE_EN,\n};\n\nexport const DATA_GRID_FALLBACK_LANGUAGE = 'en';\n\nexport function dataGridLocaleText(language: string, overrides: DataGridLocaleText = {}): DataGridLocaleText {\n const base = locales[language.slice(0, 2).toLowerCase()] ?? locales[DATA_GRID_FALLBACK_LANGUAGE];\n return { ...base, ...overrides };\n}\n","import { isDevMode } from '@angular/core';\nimport {\n CellStyleModule,\n ClientSideRowModelModule,\n ColumnApiModule,\n CustomFilterModule,\n GridStateModule,\n InfiniteRowModelModule,\n LocaleModule,\n type Module,\n ModuleRegistry,\n RowStyleModule,\n TextFilterModule,\n TooltipModule,\n ValidationModule,\n} from 'ag-grid-community';\n\nexport const dataGridModules: readonly Module[] = [\n InfiniteRowModelModule,\n ClientSideRowModelModule,\n ColumnApiModule,\n TextFilterModule,\n CustomFilterModule,\n GridStateModule,\n LocaleModule,\n CellStyleModule,\n RowStyleModule,\n TooltipModule,\n];\n\nlet registered = false;\n\nexport function registerDataGridModules(): void {\n if (registered) {\n return;\n }\n ModuleRegistry.registerModules(isDevMode() ? [...dataGridModules, ValidationModule] : [...dataGridModules]);\n registered = true;\n}\n","import { themeQuartz } from 'ag-grid-community';\n\nexport const DATA_GRID_ROW_HEIGHT_PX = 36;\n\nexport const dataGridThemeParams = {\n backgroundColor: 'var(--lw-surface)',\n foregroundColor: 'var(--lw-content)',\n cellTextColor: 'var(--lw-content)',\n headerTextColor: 'var(--lw-content-muted)',\n headerBackgroundColor: 'var(--lw-surface-raised)',\n chromeBackgroundColor: 'var(--lw-surface-raised)',\n menuBackgroundColor: 'var(--lw-surface-overlay)',\n borderColor: 'var(--lw-border)',\n accentColor: 'var(--lw-brand)',\n rowHoverColor: 'color-mix(in srgb, var(--lw-brand) 8%, transparent)',\n oddRowBackgroundColor: 'var(--lw-surface)',\n inputBackgroundColor: 'var(--lw-field)',\n invalidColor: 'var(--lw-negative)',\n browserColorScheme: 'inherit',\n fontFamily: 'var(--lw-font-sans)',\n fontSize: '0.875rem',\n rowHeight: DATA_GRID_ROW_HEIGHT_PX,\n headerHeight: DATA_GRID_ROW_HEIGHT_PX,\n focusShadow: '0 0 0 2px var(--lw-brand)',\n wrapperBorderRadius: '0.5rem',\n} as const;\n\nexport const dataGridTheme = themeQuartz.withParams(dataGridThemeParams);\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { AgGridAngular } from 'ag-grid-angular';\nimport type { GridApi, GridOptions, GridReadyEvent, GridState } from 'ag-grid-community';\nimport { type DataGridLocaleText, dataGridLocaleText } from '../locale';\nimport { registerDataGridModules } from '../modules';\nimport { DATA_GRID_ROW_HEIGHT_PX, dataGridTheme } from '../theme';\n\nexport const DATA_GRID_BLOCK_SIZE = 100;\nexport const DATA_GRID_MAX_BLOCKS = 20;\nconst TOOLTIP_DELAY_MS = 600;\n\n@Component({\n selector: 'wa-data-grid',\n imports: [AgGridAngular],\n templateUrl: './data-grid.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'block h-full w-full' },\n})\nexport class DataGrid<TRow> {\n private readonly transloco = inject(TranslocoService);\n private readonly language = toSignal(this.transloco.langChanges$, { initialValue: this.transloco.getActiveLang() });\n\n readonly options = input.required<GridOptions<TRow>>();\n readonly localeOverrides = input<DataGridLocaleText>({});\n readonly ready = output<GridApi<TRow>>();\n\n protected readonly grids = computed(() => {\n const language = this.language();\n return [\n {\n language,\n options: {\n theme: dataGridTheme,\n ...this.rowModel(),\n rowHeight: DATA_GRID_ROW_HEIGHT_PX,\n headerHeight: DATA_GRID_ROW_HEIGHT_PX,\n suppressMultiSort: true,\n suppressMovableColumns: true,\n suppressColumnVirtualisation: true,\n tooltipShowDelay: TOOLTIP_DELAY_MS,\n ...this.options(),\n initialState: this.initialState(),\n localeText: { ...dataGridLocaleText(language, this.localeOverrides()) },\n } satisfies GridOptions<TRow>,\n },\n ];\n });\n\n constructor() {\n registerDataGridModules();\n }\n\n protected announce(event: GridReadyEvent<TRow>): void {\n this.ready.emit(event.api);\n }\n\n private initialState(): GridState | undefined {\n const state = this.options().initialState;\n return state && { ...state, partialColumnState: true };\n }\n\n private rowModel(): Pick<GridOptions<TRow>, 'rowModelType' | 'cacheBlockSize' | 'maxBlocksInCache'> {\n if (this.options().rowModelType === 'clientSide') {\n return { rowModelType: 'clientSide' };\n }\n return { rowModelType: 'infinite', cacheBlockSize: DATA_GRID_BLOCK_SIZE, maxBlocksInCache: DATA_GRID_MAX_BLOCKS };\n }\n}\n","@for (grid of grids(); track grid) {\n <ag-grid-angular class=\"block h-full w-full\" [gridOptions]=\"grid.options\" (gridReady)=\"announce($event)\" />\n}\n","import { ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, Component, type ElementRef, computed, signal, viewChild } from '@angular/core';\nimport { AG_GRID_LOCALE_EN } from '@ag-grid-community/locale';\nimport type { IFilterAngularComp } from 'ag-grid-angular';\nimport type { IAfterGuiAttachedParams, IDoesFilterPassParams, IFilterParams } from 'ag-grid-community';\nimport type { ListFilterModel, ListFilterOption, ListFilterParams } from './list-filter-model';\n\nconst TEXT_KEYS = {\n search: 'searchOoo',\n selectAll: 'selectAll',\n clear: 'clearFilter',\n empty: 'noMatches',\n} as const;\n\nconst FALLBACK_TEXTS: Readonly<Record<keyof typeof TEXT_KEYS, string>> = textsOf(AG_GRID_LOCALE_EN);\n\nlet nextInstance = 0;\n\n@Component({\n selector: 'wa-list-filter',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './list-filter.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ListFilter implements IFilterAngularComp {\n private readonly searchBox = viewChild<ElementRef<HTMLInputElement>>('searchBox');\n private params: (IFilterParams & ListFilterParams) | null = null;\n\n protected readonly id = `wa-list-filter-${nextInstance++}`;\n protected readonly legend = signal('');\n protected readonly texts = signal(FALLBACK_TEXTS);\n protected readonly options = signal<readonly ListFilterOption[]>([]);\n protected readonly selected = signal<ReadonlySet<string>>(new Set());\n protected readonly search = signal('');\n protected readonly shown = computed(() => {\n const needle = this.search().trim().toLocaleLowerCase();\n return needle ? this.options().filter((option) => option.label.toLocaleLowerCase().includes(needle)) : this.options();\n });\n protected readonly allShownSelected = computed(\n () => this.shown().length > 0 && this.shown().every((option) => this.selected().has(option.value)),\n );\n\n agInit(params: IFilterParams & ListFilterParams): void {\n this.params = params;\n this.legend.set(params.api.getDisplayNameForColumn(params.column, 'filterToolPanel') ?? '');\n this.readOptions();\n }\n\n isFilterActive(): boolean {\n return this.selected().size > 0;\n }\n\n doesFilterPass(params: IDoesFilterPassParams): boolean {\n const rowValue = this.params?.rowValue as ((row: unknown) => string) | undefined;\n return !rowValue || this.selected().has(rowValue(params.data));\n }\n\n getModel(): ListFilterModel | null {\n return this.isFilterActive() ? { values: [...this.selected()] } : null;\n }\n\n setModel(model: ListFilterModel | null): void {\n this.selected.set(new Set(model?.values ?? []));\n }\n\n afterGuiAttached(params?: IAfterGuiAttachedParams): void {\n this.readOptions();\n if (!params?.suppressFocus) {\n this.searchBox()?.nativeElement.focus();\n }\n }\n\n protected isSelected(option: ListFilterOption): boolean {\n return this.selected().has(option.value);\n }\n\n protected toggle(option: ListFilterOption, checked: boolean): void {\n const next = new Set(this.selected());\n if (checked) {\n next.add(option.value);\n } else {\n next.delete(option.value);\n }\n this.apply(next);\n }\n\n protected toggleAll(checked: boolean): void {\n const shown = this.shown().map((option) => option.value);\n const next = new Set(this.selected());\n for (const value of shown) {\n if (checked) {\n next.add(value);\n } else {\n next.delete(value);\n }\n }\n this.apply(next);\n }\n\n protected clear(): void {\n this.search.set('');\n this.apply(new Set());\n }\n\n private readOptions(): void {\n if (!this.params) {\n return;\n }\n this.options.set(this.params.options());\n this.texts.set(textsOf(this.params.api.getGridOption('localeText') ?? {}));\n }\n\n private apply(next: ReadonlySet<string>): void {\n this.selected.set(next);\n this.params?.filterChangedCallback();\n }\n}\n\nfunction textsOf(\n localeText: Readonly<Record<string, string>>,\n fallback: Readonly<Record<string, string>> = AG_GRID_LOCALE_EN,\n): Readonly<Record<keyof typeof TEXT_KEYS, string>> {\n const text = (key: string) => localeText[key] ?? fallback[key] ?? key;\n return {\n search: text(TEXT_KEYS.search),\n selectAll: text(TEXT_KEYS.selectAll),\n clear: text(TEXT_KEYS.clear),\n empty: text(TEXT_KEYS.empty),\n };\n}\n","<fieldset class=\"m-0 flex w-64 flex-col gap-2 border-0 p-3 text-sm text-content\" data-testid=\"list-filter\">\n <legend class=\"mb-1 p-0 font-medium\">{{ legend() }}</legend>\n\n <label class=\"sr-only\" [attr.for]=\"id + '-search'\">{{ texts().search }}</label>\n <input\n #searchBox\n type=\"search\"\n class=\"lw-field h-9\"\n [id]=\"id + '-search'\"\n [placeholder]=\"texts().search\"\n [value]=\"search()\"\n (input)=\"search.set(searchBox.value)\"\n />\n\n @if (shown().length === 0) {\n <p class=\"m-0 text-content-muted\">{{ texts().empty }}</p>\n } @else {\n <label class=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n class=\"lw-checkbox\"\n data-testid=\"list-filter-all\"\n [checked]=\"allShownSelected()\"\n (change)=\"toggleAll($any($event.target).checked)\"\n />\n <span>{{ texts().selectAll }}</span>\n </label>\n <ul class=\"m-0 flex max-h-64 list-none flex-col gap-1 overflow-y-auto p-0\">\n @for (option of shown(); track option.value) {\n <li>\n <label class=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n class=\"lw-checkbox\"\n [attr.data-testid]=\"'list-filter-option-' + option.value\"\n [checked]=\"isSelected(option)\"\n (change)=\"toggle(option, $any($event.target).checked)\"\n />\n <span>{{ option.label }}</span>\n </label>\n </li>\n }\n </ul>\n }\n\n <button type=\"button\" class=\"lw-btn self-end\" data-testid=\"list-filter-clear\" (click)=\"clear()\">{{ texts().clear }}</button>\n</fieldset>\n","import type { IDatasource, IGetRowsParams, SortModelItem } from 'ag-grid-community';\n\nexport interface ListingRequest<TFilterModel> {\n readonly offset: number;\n readonly limit: number;\n readonly sort: ListingSort | null;\n readonly filters: TFilterModel;\n}\n\nexport interface ListingSort {\n readonly column: string;\n readonly descending: boolean;\n}\n\nexport interface ListingAnswer<TRow> {\n readonly items: readonly TRow[];\n readonly total: number;\n}\n\nexport type ListingFetch<TRow, TFilterModel> = (request: ListingRequest<TFilterModel>) => Promise<ListingAnswer<TRow>>;\n\nexport interface ListingDatasourceOptions<TRow> {\n readonly answered?: (answer: ListingAnswer<TRow>) => void;\n readonly failed?: (error: unknown) => void;\n}\n\nexport function listingDatasource<TRow, TFilterModel = Record<string, unknown>>(\n fetch: ListingFetch<TRow, TFilterModel>,\n options: ListingDatasourceOptions<TRow> = {},\n): IDatasource {\n let latest = '';\n return {\n getRows(params: IGetRowsParams<TRow>): void {\n const asked = queryOf(params.filterModel, params.sortModel);\n latest = asked;\n const request: ListingRequest<TFilterModel> = {\n offset: params.startRow,\n limit: params.endRow - params.startRow,\n sort: sortOf(params.sortModel),\n filters: (params.filterModel ?? {}) as TFilterModel,\n };\n const current = () => asked === latest && !params.api?.isDestroyed();\n fetch(request).then(\n (answer) => {\n if (!current()) {\n return;\n }\n options.answered?.(answer);\n params.successCallback([...answer.items], answer.total);\n },\n (error: unknown) => {\n if (!current()) {\n return;\n }\n options.failed?.(error);\n params.failCallback();\n },\n );\n },\n };\n}\n\nfunction queryOf(filterModel: unknown, sortModel: readonly SortModelItem[]): string {\n return JSON.stringify({ filters: filterModel ?? {}, sort: sortModel.map(({ colId, sort }) => ({ colId, sort })) });\n}\n\nfunction sortOf(sortModel: readonly SortModelItem[]): ListingSort | null {\n const first = sortModel[0];\n return first ? { column: first.colId, descending: first.sort === 'desc' } : null;\n}\n","import type { GridOptions } from 'ag-grid-community';\n\nexport interface OpenOnRowOptions {\n readonly except?: readonly string[];\n}\n\nexport type RowOpening<TRow> = Required<Pick<GridOptions<TRow>, 'rowClass' | 'onCellClicked' | 'onCellKeyDown'>>;\n\nconst controlSelector = 'button, input, select, textarea, a';\n\nexport function openOnRow<TRow>(open: (row: TRow) => void, { except = [] }: OpenOnRowOptions = {}): RowOpening<TRow> {\n const opens = (row: TRow | undefined, columnId: string, event: Event | null | undefined): void => {\n if (!row || except.includes(columnId) || fromControl(event)) {\n return;\n }\n open(row);\n };\n return {\n rowClass: 'cursor-pointer',\n onCellClicked: (event) => opens(event.data, event.column.getColId(), event.event),\n onCellKeyDown: (event) => {\n if (!('column' in event) || (event.event as KeyboardEvent | null | undefined)?.key !== 'Enter') {\n return;\n }\n opens(event.data, event.column.getColId(), event.event);\n },\n };\n}\n\nfunction fromControl(event: Event | null | undefined): boolean {\n return event?.target instanceof Element && event.target.closest(controlSelector) !== null;\n}\n"],"mappings":"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;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;GAAA,SAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;IAAA;GAAA;EAAA,CAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAKZ,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAQ,YAAA,CAAA;EAPpB,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAc,SACf,CAAC,aAAa;GAAC,iBAEP,wBAAwB;GAAM,MACzC,EAAE,OAAO,sBAAqB;GAAE,UAAA;EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AEZxC,MAAM,YAAY;CAChB,QAAQ;CACR,WAAW;CACX,OAAO;CACP,OAAO;AACC;AAEV,MAAM,iBAAmE,QAAQ,iBAAiB;AAElG,IAAI,eAAe;AAQnB,IAAa,aAAb,MAAa,WAAU;CACJ,YAAY,UAAwC,aAAY,GAAA,YAAA,CAAA,EAAA,WAAA,YAAA,CAAA,+BAAA,CAAA,CAAA;CACzE,SAAoD;CAEzC,KAAK,kBAAkB;CACvB,SAAS,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACnB,QAAQ,OAAO,gBAAe,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAC9B,UAAU,OAAoC,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,WAAW,uBAA4B,IAAI,IAAG,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACjD,SAAS,OAAO,IAAG,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACnB,QAAQ,eAAc;EACvC,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC,KAAI,CAAE,CAAC,kBAAiB;EACrD,OAAO,SAAS,KAAK,QAAO,CAAE,CAAC,QAAQ,WAAW,OAAO,MAAM,kBAAiB,CAAE,CAAC,SAAS,MAAM,CAAC,IAAI,KAAK,QAAO;CACrH,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CACiB,mBAAmB,eAC9B,KAAK,MAAK,CAAE,CAAC,SAAS,KAAK,KAAK,MAAK,CAAE,CAAC,OAAO,WAAW,KAAK,SAAQ,CAAE,CAAC,IAAI,OAAO,KAAK,CAAC,GAClG,GAAA,YAAA,CAAA,EAAA,WAAA,mBAAA,CAAA,+BAAA,CAAA,CAAA;CAED,OAAO,QAAwC;EAC7C,KAAK,SAAS;EACd,KAAK,OAAO,IAAI,OAAO,IAAI,wBAAwB,OAAO,QAAQ,iBAAiB,KAAK,EAAE;EAC1F,KAAK,YAAW;CAClB;CAEA,iBAAc;EACZ,OAAO,KAAK,SAAQ,CAAE,CAAC,OAAO;CAChC;CAEA,eAAe,QAA6B;EAC1C,MAAM,WAAW,KAAK,QAAQ;EAC9B,OAAO,CAAC,YAAY,KAAK,SAAQ,CAAE,CAAC,IAAI,SAAS,OAAO,IAAI,CAAC;CAC/D;CAEA,WAAQ;EACN,OAAO,KAAK,eAAc,IAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,SAAQ,CAAE,EAAC,IAAK;CACpE;CAEA,SAAS,OAA6B;EACpC,KAAK,SAAS,IAAI,IAAI,IAAI,OAAO,UAAU,CAAA,CAAE,CAAC;CAChD;CAEA,iBAAiB,QAAgC;EAC/C,KAAK,YAAW;EAChB,IAAI,CAAC,QAAQ,eACX,KAAK,UAAS,CAAE,EAAE,cAAc,MAAK;CAEzC;CAEU,WAAW,QAAwB;EAC3C,OAAO,KAAK,SAAQ,CAAE,CAAC,IAAI,OAAO,KAAK;CACzC;CAEU,OAAO,QAA0B,SAAgB;EACzD,MAAM,OAAO,IAAI,IAAI,KAAK,SAAQ,CAAE;EACpC,IAAI,SACF,KAAK,IAAI,OAAO,KAAK;OAErB,KAAK,OAAO,OAAO,KAAK;EAE1B,KAAK,MAAM,IAAI;CACjB;CAEU,UAAU,SAAgB;EAClC,MAAM,QAAQ,KAAK,MAAK,CAAE,CAAC,KAAK,WAAW,OAAO,KAAK;EACvD,MAAM,OAAO,IAAI,IAAI,KAAK,SAAQ,CAAE;EACpC,KAAK,MAAM,SAAS,OAClB,IAAI,SACF,KAAK,IAAI,KAAK;OAEd,KAAK,OAAO,KAAK;EAGrB,KAAK,MAAM,IAAI;CACjB;CAEU,QAAK;EACb,KAAK,OAAO,IAAI,EAAE;EAClB,KAAK,sBAAM,IAAI,IAAG,CAAE;CACtB;CAEQ,cAAW;EACjB,IAAI,CAAC,KAAK,QACR;EAEF,KAAK,QAAQ,IAAI,KAAK,OAAO,QAAO,CAAE;EACtC,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,cAAc,YAAY,KAAK,CAAA,CAAE,CAAC;CAC3E;CAEQ,MAAM,MAAyB;EACrC,KAAK,SAAS,IAAI,IAAI;EACtB,KAAK,QAAQ,sBAAqB;CACpC;CA3FW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,WAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UCvBvB;EA+CA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;ADxBa,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EANtB,MAAA;EACW,MAAA,CAAA;GAAA,UAAA;GAAgB,SACjB,CAAC,sBAAsB;GAAC,iBAEhB,wBAAwB;GAAM,UAAA;EAAA,CAAA;CAGsB,CAAA;CAAA,gBAAA,EAAA,WAAA,CAAA;EAAA,MAAA,GAAA;EAAA,MAAA,CAAA,aAAW,EAAA,UAAA,KAAA,CAAA;CAAA,CAAA,EAAA;AAAA,CAAA;AA6FlF,SAAS,QACP,YACA,WAA6C,mBAAiB;CAE9D,MAAM,QAAQ,QAAgB,WAAW,QAAQ,SAAS,QAAQ;CAClE,OAAO;EACL,QAAQ,KAAK,UAAU,MAAM;EAC7B,WAAW,KAAK,UAAU,SAAS;EACnC,OAAO,KAAK,UAAU,KAAK;EAC3B,OAAO,KAAK,UAAU,KAAK;CAC5B;AACH;AEtGA,SAAgB,kBACd,OACA,UAA0C,CAAA,GAAE;CAE5C,IAAI,SAAS;CACb,OAAO,EACL,QAAQ,QAA4B;EAClC,MAAM,QAAQ,QAAQ,OAAO,aAAa,OAAO,SAAS;EAC1D,SAAS;EACT,MAAM,UAAwC;GAC5C,QAAQ,OAAO;GACf,OAAO,OAAO,SAAS,OAAO;GAC9B,MAAM,OAAO,OAAO,SAAS;GAC7B,SAAU,OAAO,eAAe,CAAA;EACjC;EACD,MAAM,gBAAgB,UAAU,UAAU,CAAC,OAAO,KAAK,YAAW;EAClE,MAAM,OAAO,CAAC,CAAC,MACZ,WAAU;GACT,IAAI,CAAC,QAAO,GACV;GAEF,QAAQ,WAAW,MAAM;GACzB,OAAO,gBAAgB,CAAC,GAAG,OAAO,KAAK,GAAG,OAAO,KAAK;EACxD,IACC,UAAkB;GACjB,IAAI,CAAC,QAAO,GACV;GAEF,QAAQ,SAAS,KAAK;GACtB,OAAO,aAAY;EACrB,CAAC;CAEL,EACD;AACH;AAEA,SAAS,QAAQ,aAAsB,WAAmC;CACxE,OAAO,KAAK,UAAU;EAAE,SAAS,eAAe,CAAA;EAAI,MAAM,UAAU,KAAK,EAAE,OAAO,YAAY;GAAE;GAAO;EAAI,EAAG;CAAC,CAAE;AACnH;AAEA,SAAS,OAAO,WAAmC;CACjD,MAAM,QAAQ,UAAU;CACxB,OAAO,QAAQ;EAAE,QAAQ,MAAM;EAAO,YAAY,MAAM,SAAS;CAAM,IAAK;AAC9E;AC7DA,MAAM,kBAAkB;AAExB,SAAgB,UAAgB,MAA2B,EAAE,SAAS,CAAA,MAAyB,CAAA,GAAE;CAC/F,MAAM,SAAS,KAAuB,UAAkB,UAAyC;EAC/F,IAAI,CAAC,OAAO,OAAO,SAAS,QAAQ,KAAK,YAAY,KAAK,GACxD;EAEF,KAAK,GAAG;CACV;CACA,OAAO;EACL,UAAU;EACV,gBAAgB,UAAU,MAAM,MAAM,MAAM,MAAM,OAAO,SAAQ,GAAI,MAAM,KAAK;EAChF,gBAAgB,UAAS;GACvB,IAAI,EAAE,YAAY,UAAW,MAAM,OAA4C,QAAQ,SACrF;GAEF,MAAM,MAAM,MAAM,MAAM,OAAO,SAAQ,GAAI,MAAM,KAAK;EACxD;CACD;AACH;AAEA,SAAS,YAAY,OAA+B;CAClD,OAAO,OAAO,kBAAkB,WAAW,MAAM,OAAO,QAAQ,eAAe,MAAM;AACvF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weaver-apps/data-grid",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "The list grid the Weaver Apps weavers share: AG Grid Community on LoomWeaver's tokens, with scrolling through a server listing and a multi-select list filter.",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {
@@ -1,4 +1,4 @@
1
- import { GridApi, GridOptions, GridReadyEvent, IAfterGuiAttachedParams, IDatasource, IDoesFilterPassParams, IFilterParams, Module } from "ag-grid-community";
1
+ import { GridApi, GridOptions, GridReadyEvent, GridState, IAfterGuiAttachedParams, IDatasource, IDoesFilterPassParams, IFilterParams, Module } from "ag-grid-community";
2
2
  import * as i0 from "@angular/core";
3
3
  import { IFilterAngularComp } from "ag-grid-angular";
4
4
  export declare const DATA_GRID_BLOCK_SIZE = 100;
@@ -12,6 +12,7 @@ export declare class DataGrid<TRow> {
12
12
  protected readonly grids: import("@angular/core").Signal<{
13
13
  language: string;
14
14
  options: {
15
+ initialState: GridState | undefined;
15
16
  localeText: {
16
17
  [x: string]: string;
17
18
  };
@@ -318,7 +319,6 @@ export declare class DataGrid<TRow> {
318
319
  deltaSort?: boolean;
319
320
  treeDataDisplayType?: import("ag-grid-community").TreeDataDisplayType;
320
321
  enableGroupEdit?: boolean;
321
- initialState?: import("ag-grid-community").GridState;
322
322
  reactiveCustomComponents?: boolean;
323
323
  renderingMode?: "default" | "legacy";
324
324
  theme: import("ag-stack").Theme<import("ag-grid-community").ThemeDefaultParams> | "legacy";
@@ -496,6 +496,7 @@ export declare class DataGrid<TRow> {
496
496
  }[]>;
497
497
  constructor();
498
498
  protected announce(event: GridReadyEvent<TRow>): void;
499
+ private initialState;
499
500
  private rowModel;
500
501
  static ɵfac: i0.ɵɵFactoryDeclaration<DataGrid<any>, never>;
501
502
  static ɵcmp: i0.ɵɵComponentDeclaration<DataGrid<any>, "wa-data-grid", never, {