@weaver-apps/data-grid 0.3.0 → 0.3.1

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
@@ -25,4 +25,6 @@ npm i ag-grid-community@^36.2 ag-grid-angular@^36.2 @ag-grid-community/locale@^3
25
25
  `ListingRequest` (`offset`, `limit`, `sort`, `filters`) and reports the total of the latest query only.
26
26
  - `ListFilter`: a column filter for picking any number of values, given `options` and, for rows held in the
27
27
  browser, a `rowValue`.
28
+ - `openOnRow(open, { except })`: grid options that open a row on a click or on Enter, show the rows as
29
+ clickable, and leave alone the columns named in `except`, controls inside a cell and rows still loading.
28
30
  - `dataGridTheme`, `dataGridModules`, `dataGridLocaleText` for a grid that is built without `DataGrid`.
@@ -826,6 +826,24 @@ function sortOf(sortModel) {
826
826
  descending: first.sort === "desc"
827
827
  } : null;
828
828
  }
829
- export { DATA_GRID_BLOCK_SIZE, DATA_GRID_MAX_BLOCKS, DATA_GRID_ROW_HEIGHT_PX, DataGrid, ListFilter, dataGridLocaleText, dataGridModules, dataGridTheme, dataGridThemeParams, listingDatasource, registerDataGridModules };
829
+ const controlSelector = "button, input, select, textarea, a";
830
+ function openOnRow(open, { except = [] } = {}) {
831
+ const opens = (row, columnId, event) => {
832
+ if (!row || except.includes(columnId) || fromControl(event)) return;
833
+ open(row);
834
+ };
835
+ return {
836
+ rowClass: "cursor-pointer",
837
+ onCellClicked: (event) => opens(event.data, event.column.getColId(), event.event),
838
+ onCellKeyDown: (event) => {
839
+ if (!("column" in event) || event.event?.key !== "Enter") return;
840
+ opens(event.data, event.column.getColId(), event.event);
841
+ }
842
+ };
843
+ }
844
+ function fromControl(event) {
845
+ return event?.target instanceof Element && event.target.closest(controlSelector) !== null;
846
+ }
847
+ export { DATA_GRID_BLOCK_SIZE, DATA_GRID_MAX_BLOCKS, DATA_GRID_ROW_HEIGHT_PX, DataGrid, ListFilter, dataGridLocaleText, dataGridModules, dataGridTheme, dataGridThemeParams, listingDatasource, openOnRow, registerDataGridModules };
830
848
 
831
849
  //# sourceMappingURL=weaver-apps-data-grid.mjs.map
@@ -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"],"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"],"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 } 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weaver-apps/data-grid",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
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": {
@@ -574,6 +574,11 @@ type DataGridLocaleText = Readonly<Record<string, string>>;
574
574
  export declare function dataGridLocaleText(language: string, overrides?: DataGridLocaleText): DataGridLocaleText;
575
575
  export declare const dataGridModules: readonly Module[];
576
576
  export declare function registerDataGridModules(): void;
577
+ interface OpenOnRowOptions {
578
+ readonly except?: readonly string[];
579
+ }
580
+ type RowOpening<TRow> = Required<Pick<GridOptions<TRow>, 'rowClass' | 'onCellClicked' | 'onCellKeyDown'>>;
581
+ export declare function openOnRow<TRow>(open: (row: TRow) => void, { except }?: OpenOnRowOptions): RowOpening<TRow>;
577
582
  export declare const DATA_GRID_ROW_HEIGHT_PX = 36;
578
583
  export declare const dataGridThemeParams: {
579
584
  readonly backgroundColor: "var(--lw-surface)";
@@ -598,4 +603,4 @@ export declare const dataGridThemeParams: {
598
603
  readonly wrapperBorderRadius: "0.5rem";
599
604
  };
600
605
  export declare const dataGridTheme: import("ag-stack").Theme<import("ag-grid-community").ThemeDefaultParams>;
601
- export type { DataGridLocaleText, ListFilterModel, ListFilterOption, ListFilterParams, ListingAnswer, ListingDatasourceOptions, ListingFetch, ListingRequest, ListingSort };
606
+ export type { DataGridLocaleText, ListFilterModel, ListFilterOption, ListFilterParams, ListingAnswer, ListingDatasourceOptions, ListingFetch, ListingRequest, ListingSort, OpenOnRowOptions, RowOpening };