@reforgium/data-grid 1.1.0 → 2.0.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"reforgium-data-grid.mjs","sources":["../../../../libs/data-grid/src/directives/type-cell.directive.ts","../../../../libs/data-grid/src/directives/data-cell.directive.ts","../../../../libs/data-grid/src/directives/header.directive.ts","../../../../libs/data-grid/src/directives/placeholders.directive.ts","../../../../libs/data-grid/src/directives/icons.directive.ts","../../../../libs/data-grid/src/data-grid.paginator.ts","../../../../libs/data-grid/src/data-grid.constants.ts","../../../../libs/data-grid/src/helpers/layout-columns/layout-columns.helper.ts","../../../../libs/data-grid/src/helpers/scrollbar/scrollbar.helper.ts","../../../../libs/data-grid/src/helpers/scrollbar/scroll-direction.helper.ts","../../../../libs/data-grid/src/helpers/sticky/sticky-split.helper.ts","../../../../libs/data-grid/src/data-grid.vm.ts","../../../../libs/data-grid/src/data-grid-cell.component.ts","../../../../libs/data-grid/src/helpers/selection/selection.helper.ts","../../../../libs/data-grid/src/icons/checkbox.icon.ts","../../../../libs/data-grid/src/icons/expand.icon.ts","../../../../libs/data-grid/src/icons/sort.icon.ts","../../../../libs/data-grid/src/data-grid.component.ts","../../../../libs/data-grid/src/data-grid.component.html","../../../../libs/data-grid/src/reforgium-data-grid.ts"],"sourcesContent":["import { Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\nimport { RenderTemplateData } from '../data-grid.models';\r\n\r\n/**\r\n * Directive for defining type-specific cell templates in a data grid.\r\n *\r\n * This directive allows developers to create custom cell renderers for specific data types\r\n * within the data grid component. It binds a template to a type identifier, enabling\r\n * the grid to dynamically select and render the appropriate template based on column type.\r\n *\r\n * Example usage:\r\n * ```html\r\n * <ng-template reDataGridTypeCell=\"date\" let-data>\r\n * {{ data.value | date }}\r\n * </ng-template>\r\n * ```\r\n *\r\n * The directive captures the template reference and makes it available to the parent\r\n * data grid component for rendering cells of the specified type.\r\n */\r\n@Directive({ selector: 'ng-template[reDataGridTypeCell]' })\r\nexport class DataGridTypeCellTemplateDirective {\r\n /**\r\n * The type identifier for this cell template.\r\n *\r\n * Specifies which data type this template should be used for.\r\n * When the data grid encounters a column with a matching type,\r\n * it will use this template to render cells in that column.\r\n *\r\n * @default ''\r\n */\r\n type = input<string>('', { alias: 'reDataGridTypeCell' });\r\n\r\n /**\r\n * Reference to the template defined in the directive.\r\n *\r\n * This template will be rendered for each cell of the matching type,\r\n * receiving `RenderTemplateData` as its context with cell-specific information.\r\n */\r\n public tpl = inject(TemplateRef<RenderTemplateData>);\r\n}\r\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\nimport { RenderTemplateData } from '../data-grid.models';\r\n\r\n@Directive({ selector: 'ng-template[reDataGridCell]' })\r\nexport class DataGridCellTemplateDirective {\r\n key = input<string>('', { alias: 'reDataGridCell' });\r\n\r\n /**\r\n * The injected template reference containing the custom cell template.\r\n * The template context is of the type `DataGridCellTemplateDirective`.\r\n */\r\n public tpl = inject(TemplateRef<RenderTemplateData>);\r\n}\r\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\r\n\r\nimport { HeaderTemplateData } from '../data-grid.models';\r\n\r\n/**\r\n * Directive for defining custom header templates in data grid columns.\r\n *\r\n * This directive allows you to specify a custom template for rendering column headers\r\n * in the data grid. The template is associated with a column key and receives\r\n * header-specific context data.\r\n *\r\n * @example\r\n * ```html\r\n * <ng-template reDataGridHeader=\"username\" let-header>\r\n * <div class=\"custom-header\">{{ header.label }}</div>\r\n * </ng-template>\r\n * ```\r\n */\r\n@Directive({ selector: 'ng-template[reDataGridHeader]' })\r\nexport class DataGridHeaderTemplateDirective {\r\n /**\r\n * The column key this header template is associated with.\r\n * Uses the `reDataGridHeader` directive attribute as an alias.\r\n * Defaults to an empty string if not provided.\r\n */\r\n key = input<string>('', { alias: 'reDataGridHeader' });\r\n\r\n /**\r\n * The injected template reference containing the custom header template.\r\n * The template context is of the type `HeaderTemplateData`.\r\n */\r\n public tpl = inject(TemplateRef<HeaderTemplateData>);\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\n/**\r\n * Directive for providing a custom template to display when the data grid has no data.\r\n *\r\n * Used as a structural directive on `<ng-template>` elements within data grid components.\r\n * The template receives a boolean context value indicating the empty state.\r\n *\r\n * Example:\r\n * ```html\r\n * <ng-template reDataGridEmpty let-isEmpty>\r\n * <div *ngIf=\"isEmpty\">No data available</div>\r\n * </ng-template>\r\n * ```\r\n *\r\n * Template context:\r\n * - `$implicit: boolean` — indicates whether the grid is in an empty state\r\n */\r\n@Directive({ selector: 'ng-template[reDataGridEmpty]' })\r\nexport class DataGridCellEmptyDirective {\r\n public tpl = inject(TemplateRef<{ $implicit: boolean }>);\r\n}\r\n\r\n/**\r\n * Directive for providing a custom template to display when the data grid is loading data.\r\n *\r\n * Used as a structural directive on `<ng-template>` elements within data grid components.\r\n * The template receives a boolean context value indicating the loading state.\r\n *\r\n * Example:\r\n * ```html\r\n * <ng-template reDataGridLoading let-isLoading>\r\n * <div *ngIf=\"isLoading\">Loading...</div>\r\n * </ng-template>\r\n * ```\r\n *\r\n * Template context:\r\n * - `$implicit: boolean` — indicates whether the grid is in loading state\r\n */\r\n@Directive({ selector: 'ng-template[reDataGridLoading]' })\r\nexport class DataGridCellLoadingDirective {\r\n public tpl = inject(TemplateRef<{ $implicit: boolean }>);\r\n}\r\n","import { Directive, inject, TemplateRef } from '@angular/core';\r\n\r\nimport { GridSortOrder } from '../data-grid.models';\r\n\r\n@Directive({ selector: 'ng-template[reDataGridSortIcon]' })\r\nexport class DataGridSortIconDirective {\r\n public tpl = inject(TemplateRef<{ $implicit: GridSortOrder | undefined }>);\r\n}\r\n\r\n@Directive({ selector: 'ng-template[reDataGridExpanderIcon]' })\r\nexport class DataGridExpanderIconDirective {\r\n public tpl = inject(TemplateRef<{ $implicit: boolean }>);\r\n}\r\n","// noinspection CssUnresolvedCustomProperty\r\n\r\nimport { Component, computed, input, numberAttribute, output } from '@angular/core';\r\n\r\n@Component({\r\n selector: 're-data-grid-paginator',\r\n template: `\r\n @for (page of pages(); track $index) {\r\n @if (page === -1) {\r\n <span class=\"re-paginator-gap\">...</span>\r\n } @else {\r\n <button\r\n class=\"re-paginator-page\"\r\n [class.re-paginator-page--active]=\"page === current()\"\r\n (click)=\"pageChange.emit(page)\"\r\n >\r\n {{ page + 1 }}\r\n </button>\r\n }\r\n }\r\n `,\r\n styles: `\r\n :host {\r\n --re-data-grid-paginator-gap: 0.5rem;\r\n\r\n --re-data-grid-paginator-page-size: 1.75rem;\r\n --re-data-grid-paginator-page-border: 1px solid var(--re-data-grid-paginator-separator-color, #e2e8f0);\r\n --re-data-grid-paginator-page-separator-color: var(--re-data-grid-separator-color, --border-color);\r\n --re-data-grid-paginator-page-rounded: var(--re-data-grid-rounded, --radius-md);\r\n --re-data-grid-paginator-page-surface: var(--re-data-grid-surface, white);\r\n --re-data-grid-paginator-page-color: var(--text-primary, #1e293b);\r\n --re-data-grid-paginator-page-font-size: 0.875rem;\r\n\r\n --re-data-grid-paginator-page-active-surface: var(--re-data-grid-active, #3b82f6);\r\n --re-data-grid-paginator-page-active-color: white;\r\n --re-data-grid-paginator-page-hover-surface: var(--re-data-grid-active, #3b82f6);\r\n --re-data-grid-paginator-page-hover-color: white;\r\n\r\n display: flex;\r\n align-items: center;\r\n gap: var(--re-data-grid-paginator-gap);\r\n }\r\n\r\n .re-paginator-page {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: var(--re-data-grid-paginator-page-size);\r\n height: var(--re-data-grid-paginator-page-size);\r\n border-radius: var(--re-data-grid-paginator-page-rounded);\r\n border: var(--re-data-grid-paginator-page-border);\r\n font-size: var(--re-data-grid-paginator-page-font-size);\r\n background: var(--re-data-grid-paginator-page-surface);\r\n color: var(--re-data-grid-paginator-page-color);\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n }\r\n\r\n .re-paginator-page:hover:not(.re-paginator-page--active) {\r\n background: var(--re-data-grid-paginator-page-hover-surface);\r\n color: var(--re-data-grid-paginator-page-hover-color);\r\n }\r\n\r\n .re-paginator-page--active {\r\n border-color: var(--re-data-grid-paginator-active-surface);\r\n background: var(--re-data-grid-paginator-page-active-surface);\r\n color: var(--re-data-grid-paginator-page-active-color);\r\n }\r\n\r\n .re-paginator-gap {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: var(--re-data-grid-paginator-page-paddings);\r\n color: var(--re-data-grid-paginator-page-color);\r\n }\r\n `,\r\n})\r\nexport class DataGridPaginator {\r\n current = input<number, number | string | undefined>(0, { transform: numberAttribute });\r\n totalElements = input<number, number | string | undefined>(0, { transform: numberAttribute });\r\n pageSize = input<number, number | string | undefined>(0, { transform: numberAttribute });\r\n maxShowPages = input<number, number | string | undefined>(7, { transform: numberAttribute });\r\n\r\n pageChange = output<number>();\r\n\r\n totalPages = computed(() => {\r\n const size = this.pageSize();\r\n\r\n return size > 0 ? Math.ceil(this.totalElements() / size) : 0;\r\n });\r\n\r\n pages = computed(() => {\r\n const current = this.current();\r\n const total = this.totalPages();\r\n const max = this.maxShowPages();\r\n\r\n if (total <= max) {\r\n return Array.from({ length: total }, (_, i) => i);\r\n }\r\n\r\n const pages: number[] = [];\r\n const sidePages = Math.floor((max - 3) / 2);\r\n\r\n pages.push(0);\r\n\r\n let start = Math.max(1, current - sidePages);\r\n let end = Math.min(total - 2, current + sidePages);\r\n\r\n if (current <= sidePages + 1) {\r\n end = max - 3;\r\n } else if (current >= total - sidePages - 2) {\r\n start = total - max + 2;\r\n }\r\n\r\n if (start > 1) {\r\n pages.push(-1);\r\n }\r\n\r\n for (let i = start; i <= end; i++) {\r\n pages.push(i);\r\n }\r\n\r\n if (end < total - 2) {\r\n pages.push(-1);\r\n }\r\n\r\n pages.push(total - 1);\r\n\r\n return pages;\r\n });\r\n}\r\n","import { GridColumn } from './data-grid.models';\r\n\r\nexport const GRID_INDEX_COLUMN: GridColumn = {\r\n key: '_index',\r\n type: 'index',\r\n align: 'center',\r\n header: '№',\r\n width: 72,\r\n sticky: true,\r\n};\r\n\r\nexport const GRID_CHECKBOX_COLUMN: GridColumn = {\r\n key: '_checkbox',\r\n type: 'checkbox',\r\n align: 'center',\r\n header: 'checkbox',\r\n width: 44,\r\n sticky: true,\r\n};\r\n","import { ColumnLike, LayoutResult } from './layout-columns.models';\r\n\r\n/**\r\n * Calculates and distributes column widths within a container based on column configuration.\r\n *\r\n * The function implements a flexible layout algorithm that:\r\n * - Respects fixed-width columns (with `width` property set)\r\n * - Distributes remaining space among auto-sized columns based on their `flex` ratios\r\n * - Enforces `minWidth` and `maxWidth` constraints\r\n * - Uses a \"water-fill\" algorithm to grow columns proportionally\r\n * - Handles rounding errors to ensure total width matches container width\r\n *\r\n * @param columns - Array of column configuration objects with properties\r\n * like `visible`, `width`, `minWidth`, `maxWidth`, `flex`, and `key`\r\n * @param containerWidth - Available width in pixels for all columns\r\n * @param defaultCol - Default minimum width for auto-sized columns without explicit `minWidth`\r\n * @returns Layout result containing computed widths array, total width, and width lookup by column key\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = layoutColumns(\r\n * [\r\n * { key: 'id', width: 50, visible: true },\r\n * { key: 'name', minWidth: 100, flex: 2, visible: true },\r\n * { key: 'age', minWidth: 80, flex: 1, visible: true }\r\n * ],\r\n * 800,\r\n * 100\r\n * );\r\n * // result.widths = [50, 500, 250]\r\n * // result.total = 800\r\n * // result.byKey = { id: 50, name: 500, age: 250 }\r\n * ```\r\n */\r\nexport function layoutColumns(columns: ColumnLike[], containerWidth: number, defaultCol: number): LayoutResult {\r\n const idx = visibleIndexes(columns);\r\n const { fixedIdx, autoIdx } = splitFixed(columns, idx);\r\n\r\n const fixedWidths = computeFixedWidths(columns, fixedIdx);\r\n const baseAuto = computeBaseAuto(columns, autoIdx, defaultCol);\r\n\r\n const sumFixed = sum(fixedWidths);\r\n const sumBase = sum(baseAuto.map((w) => w.width));\r\n const free = Math.max(containerWidth - sumFixed - sumBase, 0);\r\n\r\n const grownAuto = distributeFree(columns, baseAuto, free); // water-fill\r\n const widths = new Array<number>(columns.length).fill(0);\r\n\r\n if (containerWidth <= 0) {\r\n const byKey: Record<string, number> = {};\r\n\r\n for (let i = 0; i < columns.length; i++) {\r\n // noinspection PointlessBooleanExpressionJS\r\n columns[i].visible !== false && (byKey[columns[i].key] = 0);\r\n }\r\n\r\n return { widths, total: 0, byKey };\r\n }\r\n\r\n for (const { index, width } of fixedWidths) {\r\n widths[index] = width;\r\n }\r\n\r\n for (const { index, width } of grownAuto) {\r\n widths[index] = width;\r\n }\r\n\r\n roundAndFix(columns, widths, fixedIdx, autoIdx, containerWidth);\r\n\r\n let total = 0;\r\n const byKey: Record<string, number> = {};\r\n\r\n for (const i of idx) {\r\n total += widths[i];\r\n byKey[columns[i].key] = widths[i];\r\n }\r\n\r\n return { widths, total, byKey };\r\n}\r\n\r\n/**\r\n * Filters and returns indexes of visible columns.\r\n *\r\n * A column is considered visible if its `visible` property is not explicitly set to `false`.\r\n *\r\n * @param cols - Array of column configurations\r\n * @returns Array of indexes for columns that should be displayed\r\n */\r\nfunction visibleIndexes(cols: ColumnLike[]): number[] {\r\n const out: number[] = [];\r\n\r\n for (let i = 0; i < cols.length; i++) {\r\n // noinspection PointlessBooleanExpressionJS\r\n cols[i].visible !== false && out.push(i);\r\n }\r\n\r\n return out;\r\n}\r\n\r\n/**\r\n * Splits visible column indexes into fixed-width and auto-sized groups.\r\n *\r\n * Fixed columns have an explicit `width` property defined.\r\n * Auto-sized columns have `width` as `undefined` and will grow to fill available space.\r\n *\r\n * @param cols - Array of column configurations\r\n * @param visibleIdx - Array of visible column indexes\r\n * @returns Object with `fixedIdx` (fixed-width column indexes) and `autoIdx` (auto-sized column indexes)\r\n */\r\nfunction splitFixed(cols: ColumnLike[], visibleIdx: number[]) {\r\n const fixedIdx: number[] = [];\r\n const autoIdx: number[] = [];\r\n\r\n for (const i of visibleIdx) {\r\n cols[i].width === undefined ? autoIdx.push(i) : fixedIdx.push(i);\r\n }\r\n\r\n return { fixedIdx, autoIdx };\r\n}\r\n\r\n/**\r\n * Computes actual widths for fixed-width columns, respecting min/max constraints.\r\n *\r\n * Takes the explicit `width` value and clamps it between `minWidth` and `maxWidth`.\r\n *\r\n * @param cols - Array of column configurations\r\n * @param fixedIdx - Array of fixed-width column indexes\r\n * @returns Array of objects with column index and computed width\r\n */\r\nconst computeFixedWidths = (cols: ColumnLike[], fixedIdx: number[]) =>\r\n fixedIdx.map((index) => {\r\n const col = cols[index];\r\n const width = clamp(col.width!, col.minWidth, col.maxWidth);\r\n\r\n return { index, width };\r\n });\r\n\r\n/**\r\n * Computes base (minimum) widths for auto-sized columns before distribution of free space.\r\n *\r\n * Uses column's `minWidth` if specified, otherwise falls back to the default value.\r\n * The base width is clamped between `minWidth` and `maxWidth` constraints.\r\n *\r\n * @param cols - Array of column configurations\r\n * @param autoIdx - Array of auto-sized column indexes\r\n * @param def - Default minimum width to use when column's `minWidth` is not specified\r\n * @returns Array of objects with column index and base width\r\n */\r\nconst computeBaseAuto = (cols: ColumnLike[], autoIdx: number[], def: number) =>\r\n autoIdx.map((index) => {\r\n const c = cols[index];\r\n const base = clamp(c.minWidth ?? def, c.minWidth, c.maxWidth);\r\n\r\n return { index, width: base };\r\n });\r\n\r\n/**\r\n * Distributes free space among auto-sized columns using a \"water-fill\" algorithm.\r\n *\r\n * The algorithm works iteratively:\r\n * 1. Identifies columns that can still grow (haven't reached `maxWidth`)\r\n * 2. Distributes remaining space proportionally based on each column's `flex` ratio\r\n * 3. Respects `maxWidth` constraints by capping growth\r\n * 4. Repeats until no space remains or no columns can grow further\r\n *\r\n * This ensures that columns with higher `flex` values receive proportionally more space,\r\n * while respecting all width constraints.\r\n *\r\n * @param cols - Array of column configurations\r\n * @param base - Array of column indexes with their base widths before distribution\r\n * @param free - Amount of free space (in pixels) to distribute among columns\r\n * @returns Array of objects with column index and final width after distribution\r\n */\r\nfunction distributeFree(cols: ColumnLike[], base: { index: number; width: number }[], free: number) {\r\n if (free <= 0 || base.length === 0) {\r\n return base;\r\n }\r\n\r\n const widths = base.map((b) => ({ ...b }));\r\n let remaining = free;\r\n\r\n let growable = widths.filter((w) => widthsCanGrow(cols, w.index, w.width)).map((w) => w.index);\r\n\r\n while (remaining > 0 && growable.length > 0) {\r\n const flexSum = growable.reduce((s, i) => s + (cols[i].flex ?? 1), 0) || 1;\r\n let distributed = 0;\r\n\r\n for (const i of growable) {\r\n const rec = widths.find((w) => w.index === i)!;\r\n const cap = (cols[i].maxWidth ?? Infinity) - rec.width;\r\n\r\n if (cap <= 0) {\r\n continue;\r\n }\r\n\r\n const ideal = remaining * ((cols[i].flex ?? 1) / flexSum);\r\n const add = ideal < cap ? ideal : cap;\r\n\r\n if (add > 0) {\r\n rec.width += add;\r\n distributed += add;\r\n }\r\n }\r\n\r\n if (distributed <= 1e-6) {\r\n break;\r\n }\r\n\r\n remaining -= distributed;\r\n\r\n growable = widths.filter((w) => widthsCanGrow(cols, w.index, w.width)).map((w) => w.index);\r\n }\r\n\r\n return widths;\r\n}\r\n\r\n/**\r\n * Checks whether a column can grow beyond its current width.\r\n *\r\n * A column can grow if its current width is less than its `maxWidth` constraint\r\n * (or `Infinity` if no max is specified), with a small epsilon tolerance.\r\n *\r\n * @param cols - Array of column configurations\r\n * @param i - Column index to check\r\n * @param cur - Current width of the column\r\n * @returns `true` if the column can grow, `false` otherwise\r\n */\r\nfunction widthsCanGrow(cols: ColumnLike[], i: number, cur: number) {\r\n const max = cols[i].maxWidth ?? Infinity;\r\n\r\n return cur < max - 1e-6;\r\n}\r\n\r\n/**\r\n * Rounds auto-sized column widths to integers and distributes any remaining pixels to match container width exactly.\r\n *\r\n * This function handles rounding errors that occur when distributing fractional widths:\r\n * 1. Floors all auto-sized column widths to integers\r\n * 2. Calculates how many pixels are needed to reach the exact container width\r\n * 3. Distributes remaining pixels one-by-one to columns (right-to-left) that haven't reached their `maxWidth`\r\n *\r\n * Fixed-width columns are not modified. This ensures the total width matches the container precisely.\r\n *\r\n * @param cols - Array of column configurations\r\n * @param widths - Array of column widths to be modified in place\r\n * @param fixedIdx - Array of fixed-width column indexes (not modified)\r\n * @param autoIdx - Array of auto-sized column indexes (will be rounded and adjusted)\r\n * @param containerWidth - Target total width that must be matched exactly\r\n */\r\nfunction roundAndFix(\r\n cols: ColumnLike[],\r\n widths: number[],\r\n fixedIdx: number[],\r\n autoIdx: number[],\r\n containerWidth: number,\r\n) {\r\n const sumFixed = fixedIdx.reduce((s, i) => s + widths[i], 0);\r\n let sumAuto = 0;\r\n\r\n for (const i of autoIdx) {\r\n widths[i] = Math.floor(widths[i]);\r\n sumAuto += widths[i];\r\n }\r\n\r\n let need = Math.round(Math.max(containerWidth - sumFixed - sumAuto, 0));\r\n\r\n if (need === 0) {\r\n return;\r\n }\r\n\r\n for (let k = autoIdx.length - 1; k >= 0 && need > 0; k--) {\r\n const i = autoIdx[k];\r\n const max = cols[i].maxWidth ?? Infinity;\r\n\r\n if (widths[i] + 1 <= max) {\r\n widths[i] += 1;\r\n need--;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Clamps a numeric value between optional minimum and maximum bounds.\r\n *\r\n * If `min` is provided and the value is less than it, returns `min`.\r\n * If `max` is provided and the value is greater than it, returns `max`.\r\n * Otherwise returns the original value.\r\n *\r\n * @param v - Value to clamp\r\n * @param min - Optional minimum bound\r\n * @param max - Optional maximum bound\r\n * @returns Clamped value\r\n */\r\nfunction clamp(v: number, min?: number, max?: number) {\r\n min != null && v < min && (v = min);\r\n max != null && v > max && (v = max);\r\n\r\n return v;\r\n}\r\n\r\n/**\r\n * Calculates the sum of numeric values or width properties in an array.\r\n *\r\n * Supports two input formats:\r\n * - Array of numbers: sums all numeric values\r\n * - Array of objects with `width` property: sums all `width` values\r\n *\r\n * @param items - Array of numbers or objects with `width` property\r\n * @returns Sum of all values\r\n */\r\nfunction sum(items: { width: number }[] | number[]) {\r\n if (Array.isArray(items) && typeof items[0] === 'number') {\r\n return (items as number[]).reduce((s, x) => s + x, 0);\r\n }\r\n\r\n return (items as { width: number }[]).reduce((s, x) => s + x.width, 0);\r\n}\r\n","import { ScrollbarState } from './scrollbar.models';\r\n\r\n/**\r\n * Calculates the visual state of an overlay scrollbar. All arguments are raw DOM numbers.\r\n * Returns a state describing the visibility, size, and position of the thumb.\r\n */\r\nexport function computeScrollbarState(\r\n scrollHeight: number = 0,\r\n clientHeight: number = 0,\r\n scrollTop: number = 0,\r\n minThumb = 24,\r\n): ScrollbarState {\r\n const safeClient = toSafe(clientHeight);\r\n const safeScrollH = toSafe(scrollHeight);\r\n const safeTop = clamp(scrollTop, 0, Math.max(0, safeScrollH - safeClient));\r\n\r\n if (safeClient <= 0 || !isFinite(safeClient)) {\r\n return hiddenState();\r\n }\r\n\r\n if (safeScrollH <= safeClient + 1) {\r\n return hiddenState(safeClient);\r\n }\r\n\r\n const track = safeClient;\r\n const ratio = track / safeScrollH;\r\n const thumb = Math.max(minThumb, Math.floor(track * ratio));\r\n\r\n const maxScrollTop = Math.max(1, safeScrollH - track);\r\n const maxThumbTop = Math.max(1, track - thumb);\r\n const topRaw = Math.round((safeTop / maxScrollTop) * maxThumbTop);\r\n const thumbTop = clamp(isFinite(topRaw) ? topRaw : 0, 0, maxThumbTop);\r\n\r\n return {\r\n visible: true,\r\n thumbHeight: thumb,\r\n thumbTop,\r\n track,\r\n maxThumbTop,\r\n maxScrollTop,\r\n };\r\n}\r\n\r\n/** Converts thumb position thumbTop (0..maxThumbTop) to scroll position scrollTop (0..maxScrollTop) */\r\nexport function mapThumbTopToScrollTop(thumbTop: number, maxThumbTop: number, maxScrollTop: number): number {\r\n const mt = Math.max(1, toSafe(maxThumbTop));\r\n const ms = Math.max(1, toSafe(maxScrollTop));\r\n const tt = clamp(toSafe(thumbTop), 0, mt);\r\n\r\n return (tt / mt) * ms;\r\n}\r\n\r\n/** Clamps the new thumb position within the bounds 0..maxThumbTop */\r\nexport function clampThumbTop(value: number, maxThumbTop: number): number {\r\n const mt = Math.max(1, toSafe(maxThumbTop));\r\n\r\n return clamp(toSafe(value), 0, mt);\r\n}\r\n\r\nfunction hiddenState(track = 0): ScrollbarState {\r\n return {\r\n visible: false,\r\n thumbHeight: 0,\r\n thumbTop: 0,\r\n track,\r\n maxThumbTop: 1,\r\n maxScrollTop: 1,\r\n };\r\n}\r\n\r\nfunction toSafe(n: number): number {\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\nfunction clamp(v: number, min: number, max: number): number {\r\n if (v < min) {\r\n return min;\r\n }\r\n\r\n if (v > max) {\r\n return max;\r\n }\r\n\r\n return v;\r\n}\r\n","/**\r\n * Represents the direction of scroll movement.\r\n *\r\n * - `'horizontal'` — scrolling along the X-axis\r\n * - `'vertical'` — scrolling along the Y-axis\r\n * - `'none'` — no scroll movement detected\r\n */\r\nexport type ScrollDirection = 'horizontal' | 'vertical' | 'none';\r\n\r\n/**\r\n * Detects the primary scroll direction of an HTML element.\r\n *\r\n * Compares the current scroll position with the previous one to determine\r\n * whether the user is scrolling horizontally, vertically, or not at all.\r\n *\r\n * Example:\r\n * ```typescript\r\n * const detector = new ScrollDirectionDetector(scrollableDiv);\r\n *\r\n * scrollableDiv.addEventListener('scroll', () => {\r\n * const direction = detector.detect();\r\n * console.log('Scroll direction:', direction); // 'horizontal' | 'vertical' | 'none'\r\n * });\r\n * ```\r\n *\r\n * The detector stores the previous scroll position internally and updates it\r\n * on each `detect()` call to track movement deltas.\r\n */\r\nexport class ScrollDirectionDetector {\r\n /**\r\n * Previously recorded vertical scroll position (scrollTop).\r\n * @private\r\n */\r\n #prevTop = 0;\r\n /**\r\n * Previously recorded horizontal scroll position (scrollLeft).\r\n * @private\r\n */\r\n #prevLeft = 0;\r\n\r\n /**\r\n * Creates a new scroll direction detector for the given HTML element.\r\n *\r\n * @param el - The HTML element whose scroll direction will be tracked.\r\n * The element must be scrollable (have overflow content).\r\n */\r\n constructor(private readonly el: HTMLElement) {\r\n this.#prevTop = el.scrollTop;\r\n this.#prevLeft = el.scrollLeft;\r\n }\r\n\r\n /**\r\n * Detects the primary scroll direction based on position changes since the last call.\r\n *\r\n * Compares the absolute deltas of horizontal and vertical scroll positions.\r\n * The direction with the greater delta is considered the primary scroll direction.\r\n *\r\n * @returns The detected scroll direction:\r\n * - `'horizontal'` if horizontal movement is greater\r\n * - `'vertical'` if vertical movement is greater\r\n * - `'none'` if no scroll movement occurred or deltas are equal\r\n */\r\n detect(): ScrollDirection {\r\n const { scrollTop, scrollLeft } = this.el;\r\n\r\n const deltaX = Math.abs(scrollLeft - this.#prevLeft);\r\n const deltaY = Math.abs(scrollTop - this.#prevTop);\r\n\r\n this.#prevTop = scrollTop;\r\n this.#prevLeft = scrollLeft;\r\n\r\n if (deltaX === 0 && deltaY === 0) return 'none';\r\n if (deltaX > deltaY) return 'horizontal';\r\n if (deltaY > deltaX) return 'vertical';\r\n\r\n return 'none';\r\n }\r\n}\r\n","// noinspection ES6PreferShortImport\r\nimport { GridColumn } from '../../data-grid.models';\r\nimport { AnyDict } from '../../utils.models';\r\n\r\n/**\r\n * Splits an array of grid columns into sticky left, sticky right, and all visible columns.\r\n *\r\n * This function filters columns by visibility, then divides them at the midpoint\r\n * to identify which sticky columns should be pinned to the left versus right side\r\n * of the data grid.\r\n *\r\n * @template Data - The data type extending `AnyDict` that the grid columns are based on.\r\n * @param cols - Array of grid columns to be split.\r\n * @returns An object containing:\r\n * - `left`: Array of sticky columns from the first half of visible columns.\r\n * - `right`: Array of sticky columns from the second half of visible columns.\r\n * - `visible`: Array of all visible columns (filtered by `visible !== false`).\r\n *\r\n * @example\r\n * ```typescript\r\n * const columns: GridColumn<User>[] = [...];\r\n * const { left, right, visible } = splitSticky(columns);\r\n * ```\r\n */\r\nexport function splitSticky<Data extends AnyDict>(cols: GridColumn<Data>[]) {\r\n const visible = cols.filter((c) => c.visible !== false);\r\n\r\n const middleIndex = Math.floor(visible.length / 2);\r\n const left = visible.slice(0, middleIndex).filter((col) => col.sticky);\r\n const right = visible.slice(middleIndex, visible.length).filter((col) => col.sticky);\r\n\r\n return { left, right, visible };\r\n}\r\n","import { computed, effect, ElementRef, Injectable, signal, TemplateRef } from '@angular/core';\r\n\r\nimport { GridCellRendererType, GridColumn, GridPinnedRow } from './data-grid.models';\r\nimport { layoutColumns } from './helpers/layout-columns';\r\nimport { computeScrollbarState } from './helpers/scrollbar';\r\nimport { splitSticky } from './helpers/sticky';\r\nimport { AnyDict } from './utils.models';\r\n\r\n/**\r\n * View model for the data grid component.\r\n *\r\n * Manages grid state including column layout, sticky positioning, scrollbar calculations,\r\n * and pinned rows. Automatically recomputes column widths based on container size and\r\n * handles sticky column offsets for left and right pinned columns.\r\n *\r\n * @template Data - Type of data objects in the grid, must extend AnyDict\r\n *\r\n * @example\r\n * ```typescript\r\n * const gridVm = inject(DataGridVm<MyDataType>);\r\n * gridVm.columns.set([{ key: 'name', title: 'Name' }]);\r\n * gridVm.containerWidth.set(800);\r\n * ```\r\n */\r\n@Injectable()\r\nexport class DataGridVm<Data extends AnyDict> {\r\n /**\r\n * Reference to the scrollable container element.\r\n *\r\n * Used for scrollbar calculations and scroll position management.\r\n */\r\n scrollEl = signal<ElementRef<HTMLDivElement> | undefined>(undefined);\r\n\r\n /**\r\n * Array of column configurations for the grid.\r\n *\r\n * Defines all columns including their keys, titles, sticky positioning, and widths.\r\n * Value is reactive and triggers column layout recalculation when changed.\r\n */\r\n columns = signal<GridColumn<Data>[]>([]);\r\n\r\n /**\r\n * Array of pinned row configurations.\r\n *\r\n * Defines rows that remain fixed at the top or bottom of the grid during scrolling.\r\n * Each row includes data, position ('top' or 'bottom'), and optional ordering.\r\n */\r\n pinnedRows = signal<GridPinnedRow<Data>[]>([]);\r\n\r\n /**\r\n * Current width of the grid container in pixels.\r\n *\r\n * Used for column width calculations and layout adjustments.\r\n * Value is reactive and triggers column layout recalculation when changed.\r\n */\r\n containerWidth = signal<number>(0);\r\n\r\n /**\r\n * Flag indicating whether the custom scrollbar should be visible.\r\n *\r\n * Automatically computed based on content height vs. container height.\r\n */\r\n scrollbarVisible = signal(false);\r\n\r\n /**\r\n * Height of the scrollbar thumb in pixels.\r\n *\r\n * Proportional to the ratio of visible content to total content height.\r\n */\r\n thumbHeightPx = signal(0);\r\n\r\n /**\r\n * Top position of the scrollbar thumb in pixels.\r\n *\r\n * Corresponds to the current scroll position within the scrollable area.\r\n */\r\n thumbTopPx = signal(0);\r\n\r\n /**\r\n * Flag indicating whether the user is currently dragging the scrollbar thumb.\r\n *\r\n * Used to track active scroll drag interactions.\r\n */\r\n dragging = false;\r\n\r\n /**\r\n * Map of global cell renderer templates by type.\r\n *\r\n * Stores reusable template references for different cell renderer types\r\n * that can be shared across multiple columns.\r\n */\r\n globalTypeCellTpls = new Map<GridCellRendererType, TemplateRef<Data>>();\r\n globalDataCellTpls = new Map<keyof Data | string, TemplateRef<Data>>();\r\n\r\n #byKey = signal<Record<string, number>>({});\r\n #defaultColWidth = 140;\r\n #stickyLeftMap = new Map<string, number>();\r\n #stickyRightMap = new Map<string, number>();\r\n\r\n /**\r\n * Computed an array of non-sticky columns to display in the scrollable area.\r\n *\r\n * Automatically splits columns into left-sticky, visible, and right-sticky groups,\r\n * recomputes sticky offsets, and returns only the scrollable middle section.\r\n * Recalculates whenever columns or container width changes.\r\n */\r\n columnsToShow = computed<GridColumn<Data>[]>(() => {\r\n this.containerWidth();\r\n\r\n const cols = this.columns() ?? [];\r\n const { left, visible, right } = splitSticky<Data>(cols);\r\n\r\n this.recomputeStickyOffsets(left, right);\r\n\r\n return visible;\r\n });\r\n\r\n /**\r\n * Computed array of rows pinned to the top of the grid.\r\n *\r\n * Filters pinned rows by 'top' position and sorts them by order property.\r\n * Rows with lower order values appear first.\r\n */\r\n pinnedTop = computed<GridPinnedRow<Data>[]>(() =>\r\n (this.pinnedRows() ?? []).filter((r) => r.position === 'top').sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\r\n );\r\n\r\n /**\r\n * Computed array of rows pinned to the bottom of the grid.\r\n *\r\n * Filters pinned rows by 'bottom' position and sorts them by order property.\r\n * Rows with lower order values appear first.\r\n */\r\n pinnedBottom = computed<GridPinnedRow<Data>[]>(() =>\r\n (this.pinnedRows() ?? []).filter((r) => r.position === 'bottom').sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n const cols = this.columns();\r\n const width = this.containerWidth();\r\n\r\n if (!cols.length || !width) {\r\n return;\r\n }\r\n\r\n const res = layoutColumns(cols, width, this.#defaultColWidth);\r\n\r\n this.#byKey.set(res.byKey);\r\n });\r\n }\r\n\r\n /**\r\n * Returns the computed width for a column by its key.\r\n *\r\n * If the column width has not been calculated, returns the default column width.\r\n *\r\n * @param key - The unique identifier for the column\r\n * @returns Width in pixels\r\n */\r\n widthByKey = (key: string) => this.#byKey()[key] ?? this.#defaultColWidth;\r\n\r\n /**\r\n * Checks if a column is pinned to the left side of the grid.\r\n *\r\n * @param key - The unique identifier for the column\r\n * @returns `true` if the column is sticky on the left, `false` otherwise\r\n */\r\n isStickyLeft = (key: string) => this.#stickyLeftMap.has(key);\r\n\r\n /**\r\n * Checks if a column is pinned to the right side of the grid.\r\n *\r\n * @param key - The unique identifier for the column\r\n * @returns `true` if the column is sticky on the right, `false` otherwise\r\n */\r\n isStickyRight = (key: string) => this.#stickyRightMap.has(key);\r\n\r\n /**\r\n * Returns the horizontal offset for a sticky column.\r\n *\r\n * Calculates the distance from the specified edge (left or right) where the column\r\n * should be positioned. Returns `null` if the column is not sticky in the given direction.\r\n *\r\n * @param key - The unique identifier for the column\r\n * @param dir - The direction to check ('left' or 'right')\r\n * @returns Offset in pixels, or `null` if not sticky in the specified direction\r\n */\r\n stickyOffset = (key: string, dir: 'left' | 'right') =>\r\n dir === 'left' && this.isStickyLeft(key)\r\n ? (this.#stickyLeftMap.get(key) ?? null)\r\n : dir === 'right' && this.isStickyRight(key)\r\n ? (this.#stickyRightMap.get(key) ?? null)\r\n : null;\r\n\r\n /**\r\n * Calculates and updates scrollbar state based on the current scroll position.\r\n *\r\n * Computes whether the scrollbar should be visible, and if so, determines\r\n * the thumb height and position based on scroll height, client height, and scroll position.\r\n * Updates the corresponding signal properties with the calculated values.\r\n */\r\n calcScrollbar(): void {\r\n const el = this.scrollEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n const state = computeScrollbarState(el.scrollHeight, el.clientHeight, el.scrollTop);\r\n\r\n if (!state.visible) {\r\n this.scrollbarVisible.set(false);\r\n this.thumbHeightPx.set(0);\r\n this.thumbTopPx.set(0);\r\n\r\n return;\r\n }\r\n\r\n this.thumbHeightPx.set(state.thumbHeight);\r\n this.thumbTopPx.set(state.thumbTop);\r\n }\r\n\r\n private recomputeStickyOffsets(leftCols: GridColumn<Data>[], rightCols: GridColumn<Data>[]): void {\r\n let acc = 0;\r\n\r\n this.#stickyLeftMap.clear();\r\n\r\n for (const col of leftCols) {\r\n this.#stickyLeftMap.set(col.key, acc);\r\n acc += this.widthByKey(col.key);\r\n }\r\n\r\n acc = 0;\r\n this.#stickyRightMap.clear();\r\n\r\n for (let i = rightCols.length - 1; i >= 0; i--) {\r\n const col = rightCols[i];\r\n\r\n this.#stickyRightMap.set(col.key, acc);\r\n acc += this.widthByKey(col.key);\r\n }\r\n }\r\n}\r\n","import { DatePipe, DecimalPipe, NgTemplateOutlet } from '@angular/common';\r\nimport { Component, computed, inject, input } from '@angular/core';\r\n\r\nimport { GridColumn } from './data-grid.models';\r\nimport { DataGridVm } from './data-grid.vm';\r\nimport { AnyDict } from './utils.models';\r\n\r\n/**\r\n * Component for rendering individual data grid cells.\r\n *\r\n * Handles different cell rendering strategies based on column configuration:\r\n * - Custom templates via `renderTemplate`\r\n * - Global type-specific templates registered in DataGridVm\r\n * - Built-in formatters for dates and numbers\r\n * - Index display (1-based row numbering)\r\n * - Plain text for simple values\r\n *\r\n * The component automatically determines the appropriate rendering method\r\n * based on column properties and applies Angular pipes when needed.\r\n *\r\n * @template Data - Type of data objects in the grid row\r\n *\r\n * @example\r\n * ```html\r\n * <re-data-grid-cell\r\n * [index]=\"0\"\r\n * [item]=\"rowData\"\r\n * [column]=\"columnConfig\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 're-data-grid-cell',\r\n template: `\r\n @let row = item();\r\n @let col = column();\r\n @let val = value();\r\n\r\n @switch (type()) {\r\n @case ('tpl') {\r\n <ng-container\r\n [ngTemplateOutlet]=\"$any(col).renderTemplate\"\r\n [ngTemplateOutletContext]=\"{ $implicit: val, value: val, row, col, index: index() }\"\r\n />\r\n }\r\n @case ('globalTypeTpl') {\r\n <ng-container\r\n [ngTemplateOutlet]=\"vm.globalTypeCellTpls.get($any(col).type)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: val, value: val, row, col }\"\r\n />\r\n }\r\n @case ('globalDataTpl') {\r\n <ng-container\r\n [ngTemplateOutlet]=\"vm.globalDataCellTpls.get($any(col).key)\"\r\n [ngTemplateOutletContext]=\"{ $implicit: val, value: val, row, col }\"\r\n />\r\n }\r\n @case ('date') {\r\n {{ val | date: $any(col)?.typeParams }}\r\n }\r\n @case ('number') {\r\n {{ val | number: $any(col)?.typeParams }}\r\n }\r\n @case ('index') {\r\n {{ index() + 1 }}\r\n }\r\n @default {\r\n {{ val }}\r\n }\r\n }\r\n `,\r\n styles: `\r\n :host {\r\n width: 100%;\r\n text-align: inherit;\r\n }\r\n `,\r\n imports: [NgTemplateOutlet, DatePipe, DecimalPipe],\r\n})\r\nexport class DataGridCellComponent<Data extends AnyDict> {\r\n /**\r\n * Zero-based index of the current row in the data grid.\r\n *\r\n * Used for rendering row numbers (displayed as 1-based in 'index' type columns)\r\n * and passed to custom templates as context.\r\n */\r\n index = input.required<number>();\r\n\r\n /**\r\n * Data object for the current row.\r\n *\r\n * Contains the complete row data that can be accessed by column value functions\r\n * or custom render templates. Type-safe according to the Data generic parameter.\r\n */\r\n item = input.required<Data>();\r\n\r\n /**\r\n * Column configuration object.\r\n *\r\n * Defines how the cell should be rendered, including key mapping, type,\r\n * custom templates, or value transformation functions.\r\n */\r\n column = input.required<GridColumn<Data>>();\r\n\r\n /**\r\n * Injected DataGridVm service instance.\r\n *\r\n * Provides access to global type-specific cell templates registered\r\n * at the grid level via `globalTypeCellTpls` map.\r\n */\r\n vm = inject(DataGridVm);\r\n\r\n /**\r\n * Computed rendering strategy for the current cell.\r\n *\r\n * Determines which template block to use based on column configuration:\r\n * - `'tpl'` - Custom column template (`renderTemplate` property exists)\r\n * - `'globalTypeTpl'` - Global type template (registered in DataGridVm)\r\n * - `'date'`, `'number'`, `'index'` - Built-in formatters\r\n * - `'plain'` - Default text rendering\r\n *\r\n * The value is reactive and updates when column configuration changes.\r\n */\r\n type = computed(() => {\r\n const col = this.column();\r\n\r\n if ('renderTemplate' in col) {\r\n return 'tpl';\r\n }\r\n\r\n if ('type' in col && this.vm.globalTypeCellTpls.has(col.type!)) {\r\n return 'globalTypeTpl';\r\n }\r\n\r\n if (this.vm.globalDataCellTpls.has(col.key)) {\r\n return 'globalDataTpl';\r\n }\r\n\r\n return 'type' in col ? col['type'] : 'plain';\r\n });\r\n\r\n /**\r\n * Computed cell value extracted from row data.\r\n *\r\n * Returns the cell's display value by either:\r\n * - Calling the `value` function from column configuration (if defined)\r\n * - Directly accessing the row property using the column's `key`\r\n *\r\n * The value is reactive and updates when row data or column configuration changes.\r\n * Used as input for templates, pipes, and default text rendering.\r\n */\r\n value = computed(() => {\r\n const col = this.column();\r\n const row = this.item();\r\n\r\n return 'value' in col ? col.value(row) : row[col.key];\r\n });\r\n}\r\n","import { computed, signal } from '@angular/core';\r\n\r\nimport { _Selectfull, GridSelection } from '../../data-grid.models';\r\nimport { AnyDict, DataKey } from '../../utils.models';\r\n\r\n/**\r\n * Service class for managing row selection in a data grid.\r\n *\r\n * Handles selection state and operations for grid rows, supporting multiple selection modes\r\n * (none, single, multi). Provides reactive signals for tracking selected items and\r\n * computed values for selection state.\r\n *\r\n * @template Data - The type of data objects in the grid, must extend `AnyDict`.\r\n *\r\n * @example\r\n * ```typescript\r\n * const selector = new Selector<User>();\r\n * selector.data.set(users);\r\n * selector.selection.set({ mode: 'multi', key: 'id' });\r\n * selector.select(users[0]);\r\n * console.log(selector.selectedKeys()); // ['user-id']\r\n * ```\r\n */\r\nexport class Selector<Data extends AnyDict> {\r\n /**\r\n * Signal containing the full dataset of grid rows.\r\n *\r\n * This signal holds all data items that can be selected.\r\n * Defaults to an empty array.\r\n */\r\n data = signal<Data[]>([]);\r\n /**\r\n * Signal containing the current selection configuration.\r\n *\r\n * Defines the selection mode and the key property used for identifying rows.\r\n * Defaults to `{ mode: 'none' }` which disables selection.\r\n */\r\n selection = signal<GridSelection>({ mode: 'none' });\r\n\r\n /**\r\n * Signal containing the array of currently selected row keys.\r\n *\r\n * Stores the keys of all selected rows based on the key property\r\n * defined in the selection configuration.\r\n * Defaults to an empty array.\r\n */\r\n selectedKeys = signal<DataKey<Data>[]>([]);\r\n\r\n /**\r\n * Computed signal indicating the overall selection state of all rows.\r\n *\r\n * Returns:\r\n * - `true` if all rows are selected\r\n * - `false` if no rows are selected\r\n * - `'mixed'` if some but not all rows are selected\r\n *\r\n * Useful for implementing \"select all\" checkbox with indeterminate state.\r\n */\r\n isAllSelected = computed(() => {\r\n const selectedCount = this.selectedKeys().length;\r\n\r\n return selectedCount === this.data().length ? true : selectedCount === 0 ? false : 'mixed';\r\n });\r\n\r\n /**\r\n * Checks whether a specific row is currently selected.\r\n *\r\n * Compares the row's key value against the list of selected keys.\r\n * Returns `false` if selection mode is 'none' or key is not configured.\r\n *\r\n * @param row - The data row to check selection status for.\r\n * @returns `true` if the row is selected, `false` otherwise.\r\n */\r\n isSelected(row: Data) {\r\n const selection = this.selection();\r\n const selected = this.selectedKeys();\r\n\r\n return 'key' in selection ? selected.includes(row[selection.key]) : false;\r\n }\r\n\r\n /**\r\n * Toggles selection of all rows.\r\n *\r\n * If all rows are selected, deselects all.\r\n * If no rows or some rows are selected, selects all.\r\n *\r\n * This method only works in `'multi'` selection mode and throws an error\r\n * if called in any other mode.\r\n *\r\n * @returns The updated array of selected keys.\r\n * @throws {Error} If selection mode is not `'multi'`.\r\n */\r\n selectAll() {\r\n if (this.selection().mode !== 'multi') {\r\n throw new Error('Cannot select all in not \"multi\" mode');\r\n }\r\n\r\n const selection = this.selection() as _Selectfull<Data>;\r\n const state = this.isAllSelected();\r\n const nextState = state === false || state === 'mixed';\r\n\r\n this.selectedKeys.set(!nextState ? [] : this.data().map((row) => row[selection.key]));\r\n\r\n return this.selectedKeys();\r\n }\r\n\r\n /**\r\n * Selects or deselects a specific row.\r\n *\r\n * Behavior depends on the selection mode:\r\n * - In `'single'` mode: replaces current selection with the specified row.\r\n * - In `'multi'` mode: toggles the row's selection state (adds if not selected, removes if selected).\r\n * - In `'none'` mode: throws an error.\r\n *\r\n * @param row - The data row to select or deselect.\r\n * @returns The updated array of selected keys after the operation.\r\n * @throws {Error} If selection mode is `'none'`.\r\n */\r\n select(row: Data) {\r\n if (this.selection().mode === 'none') {\r\n throw new Error('Cannot select row in \"none\" mode');\r\n }\r\n\r\n const selection = this.selection() as _Selectfull<Data>;\r\n\r\n if (this.selection().mode === 'single') {\r\n const selected = [row[selection.key]];\r\n\r\n this.selectedKeys.set(selected);\r\n\r\n return selected;\r\n } else {\r\n const selectedKeys = this.selectedKeys();\r\n const has = selectedKeys.some((it) => it === row[selection.key]);\r\n const selected = has\r\n ? selectedKeys.filter((it) => it !== row[selection.key])\r\n : [...selectedKeys, row[selection.key]];\r\n\r\n this.selectedKeys.set(selected);\r\n\r\n return selected;\r\n }\r\n }\r\n}\r\n","// noinspection CssUnresolvedCustomProperty\r\n\r\nimport { ChangeDetectionStrategy, Component, effect, ElementRef, input, viewChild } from '@angular/core';\r\n\r\nexport type TriState = boolean | 'mixed';\r\n\r\n@Component({\r\n selector: 're-checkbox-ic',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n template: `\r\n <label class=\"cb\" [class.cb--disabled]=\"disabled()\">\r\n <input\r\n #box\r\n class=\"cb__input\"\r\n type=\"checkbox\"\r\n aria-hidden=\"true\"\r\n [disabled]=\"disabled()\"\r\n [checked]=\"state() === true\"\r\n [attr.data-indeterminate]=\"state() === 'mixed' ? 'true' : 'false'\"\r\n (click)=\"$event.stopPropagation()\"\r\n />\r\n <span class=\"cb__box\" aria-hidden=\"true\"></span>\r\n </label>\r\n `,\r\n styles: `\r\n :host {\r\n --re-data-grid-checkbox-size: 20px;\r\n --re-data-grid-checkbox-stroke: 2px;\r\n --re-data-grid-checkbox-border: var(--border-color, #9aa3af);\r\n --re-data-grid-checkbox-tick: var(--surface-neutral, #fff);\r\n --re-data-grid-checkbox-surface: var(--surface-neutral, #fff);\r\n --re-data-grid-checkbox-active-color: var(--primary-color, #2563eb);\r\n\r\n display: inline-block;\r\n width: var(--re-data-grid-checkbox-size);\r\n height: var(--re-data-grid-checkbox-size);\r\n user-select: none;\r\n }\r\n\r\n .cb {\r\n cursor: default;\r\n display: inline-block;\r\n }\r\n .cb--disabled {\r\n opacity: 0.6;\r\n }\r\n\r\n .cb__input {\r\n position: absolute;\r\n width: 0;\r\n height: 0;\r\n opacity: 0;\r\n pointer-events: none;\r\n }\r\n\r\n .cb__box {\r\n position: relative;\r\n display: inline-block;\r\n width: var(--re-data-grid-checkbox-size);\r\n height: var(--re-data-grid-checkbox-size);\r\n border: var(--re-data-grid-checkbox-stroke) solid var(--re-data-grid-checkbox-border);\r\n border-radius: 4px;\r\n background: var(--re-data-grid-checkbox-surface);\r\n transition:\r\n background 0.25s,\r\n border-color 0.25s;\r\n }\r\n\r\n .cb__input:checked + .cb__box {\r\n border-color: var(--re-data-grid-checkbox-active-color);\r\n background: var(--re-data-grid-checkbox-active-color);\r\n }\r\n .cb__input:checked + .cb__box::after {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n margin: auto;\r\n width: 10px;\r\n height: 6px;\r\n border: 2px solid var(--re-data-grid-checkbox-tick);\r\n border-top: 0;\r\n border-right: 0;\r\n transform: rotate(-45deg) translate(1px, -1px) scale(0.8);\r\n opacity: 0;\r\n animation: tick 0.25s forwards ease;\r\n }\r\n\r\n /* mixed */\r\n .cb__input[data-indeterminate='true'] + .cb__box {\r\n background: var(--re-data-grid-checkbox-active-color);\r\n border-color: var(--re-data-grid-checkbox-active-color);\r\n }\r\n .cb__input[data-indeterminate='true'] + .cb__box::after {\r\n content: '';\r\n position: absolute;\r\n left: 3px;\r\n right: 3px;\r\n top: 50%;\r\n border-top: 2px solid var(--re-data-grid-checkbox-tick);\r\n transform: translateY(-50%) scaleX(0.3);\r\n opacity: 0;\r\n animation: dash 0.25s forwards ease;\r\n }\r\n\r\n @keyframes tick {\r\n to {\r\n opacity: 1;\r\n transform: rotate(-45deg) translate(1px, -1px) scale(1);\r\n }\r\n }\r\n @keyframes dash {\r\n to {\r\n opacity: 1;\r\n transform: translateY(-50%) scaleX(1);\r\n }\r\n }\r\n `,\r\n})\r\nexport class CheckboxIcon {\r\n state = input<TriState>(false);\r\n disabled = input(false);\r\n\r\n private boxRef = viewChild(ElementRef<HTMLInputElement>);\r\n\r\n constructor() {\r\n effect(() => {\r\n const el = this.boxRef()?.nativeElement;\r\n\r\n if (!el) {\r\n return;\r\n }\r\n\r\n const state = this.state();\r\n\r\n if (state === 'mixed') {\r\n el.indeterminate = true;\r\n el.checked = false;\r\n el.dataset.indeterminate = 'true';\r\n } else if (state) {\r\n el.indeterminate = false;\r\n el.checked = true;\r\n el.dataset.indeterminate = 'false';\r\n } else {\r\n el.indeterminate = false;\r\n el.checked = false;\r\n el.dataset.indeterminate = 'false';\r\n }\r\n });\r\n }\r\n}\r\n","/* eslint-disable max-len */\r\nimport { booleanAttribute, Component, input } from '@angular/core';\r\n\r\n@Component({\r\n selector: 're-expand-ic',\r\n template: `\r\n @if (expanded()) {\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <path\r\n d=\"M15.5 8C15.5 9.48336 15.0601 10.9334 14.236 12.1668C13.4119 13.4001 12.2406 14.3614 10.8701 14.9291C9.49968 15.4968 7.99168 15.6453 6.53683 15.3559C5.08197 15.0665 3.7456 14.3522 2.6967 13.3033C1.64781 12.2544 0.933503 10.918 0.644114 9.46318C0.354725 8.00832 0.50325 6.50032 1.07091 5.12987C1.63856 3.75943 2.59986 2.58809 3.83323 1.76398C5.0666 0.939867 6.51664 0.5 8 0.5C8.98492 0.5 9.96019 0.693993 10.8701 1.0709C11.7801 1.44781 12.6069 2.00026 13.3033 2.6967C13.9997 3.39314 14.5522 4.21993 14.9291 5.12987C15.306 6.03982 15.5 7.01509 15.5 8ZM12.5 8C12.5 7.80109 12.421 7.61032 12.2803 7.46967C12.1397 7.32902 11.9489 7.25 11.75 7.25H4.25C4.05109 7.25 3.86033 7.32902 3.71967 7.46967C3.57902 7.61032 3.5 7.80109 3.5 8C3.5 8.19891 3.57902 8.38968 3.71967 8.53033C3.86033 8.67098 4.05109 8.75 4.25 8.75H11.75C11.9489 8.75 12.1397 8.67098 12.2803 8.53033C12.421 8.38968 12.5 8.19891 12.5 8Z\"\r\n fill=\"var(--re-data-grid-expander-color)\"\r\n />\r\n </svg>\r\n } @else {\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\r\n <path\r\n d=\"M8 0.5C6.51664 0.5 5.0666 0.939867 3.83323 1.76398C2.59986 2.58809 1.63856 3.75943 1.07091 5.12987C0.50325 6.50032 0.354725 8.00832 0.644114 9.46318C0.933503 10.918 1.64781 12.2544 2.6967 13.3033C3.7456 14.3522 5.08197 15.0665 6.53683 15.3559C7.99168 15.6453 9.49968 15.4968 10.8701 14.9291C12.2406 14.3614 13.4119 13.4001 14.236 12.1668C15.0601 10.9334 15.5 9.48336 15.5 8C15.5 7.01509 15.306 6.03982 14.9291 5.12987C14.5522 4.21993 13.9997 3.39314 13.3033 2.6967C12.6069 2.00026 11.7801 1.44781 10.8701 1.0709C9.96019 0.693993 8.98492 0.5 8 0.5ZM11.75 8.75H8.75V11.75C8.75 11.9489 8.67099 12.1397 8.53033 12.2803C8.38968 12.421 8.19892 12.5 8 12.5C7.80109 12.5 7.61033 12.421 7.46967 12.2803C7.32902 12.1397 7.25 11.9489 7.25 11.75V8.75H4.25C4.05109 8.75 3.86033 8.67098 3.71967 8.53033C3.57902 8.38968 3.5 8.19891 3.5 8C3.5 7.80109 3.57902 7.61032 3.71967 7.46967C3.86033 7.32902 4.05109 7.25 4.25 7.25H7.25V4.25C7.25 4.05109 7.32902 3.86032 7.46967 3.71967C7.61033 3.57902 7.80109 3.5 8 3.5C8.19892 3.5 8.38968 3.57902 8.53033 3.71967C8.67099 3.86032 8.75 4.05109 8.75 4.25V7.25H11.75C11.9489 7.25 12.1397 7.32902 12.2803 7.46967C12.421 7.61032 12.5 7.80109 12.5 8C12.5 8.19891 12.421 8.38968 12.2803 8.53033C12.1397 8.67098 11.9489 8.75 11.75 8.75Z\"\r\n fill=\"var(--re-data-grid-expander-color)\"\r\n />\r\n </svg>\r\n }\r\n `,\r\n styles: '',\r\n})\r\nexport class ExpandIcon {\r\n expanded = input<boolean, boolean | string | undefined>(false, { transform: booleanAttribute });\r\n}\r\n","/* eslint-disable max-len */\r\nimport { Component, input } from '@angular/core';\r\n\r\nimport { GridSortOrder } from '../data-grid.models';\r\n\r\n@Component({\r\n selector: 're-sort-ic',\r\n template: `\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" class=\"{{ direction() }}\">\r\n <path\r\n d=\"M12.84 8.51259L9.66754 11.6851V4.59009C9.66754 4.39118 9.58852 4.20041 9.44787 4.05976C9.30722 3.91911 9.11645 3.84009 8.91754 3.84009C8.71863 3.84009 8.52786 3.91911 8.38721 4.05976C8.24656 4.20041 8.16754 4.39118 8.16754 4.59009V11.6851L4.99504 8.51259C4.92511 8.44266 4.84209 8.38719 4.75073 8.34934C4.65936 8.3115 4.56144 8.29202 4.46254 8.29202C4.36365 8.29202 4.26572 8.3115 4.17435 8.34934C4.08299 8.38719 3.99997 8.44266 3.93004 8.51259C3.86011 8.58252 3.80464 8.66553 3.7668 8.7569C3.72895 8.84827 3.70947 8.94619 3.70947 9.04509C3.70947 9.14398 3.72895 9.24191 3.7668 9.33327C3.80464 9.42464 3.86011 9.50766 3.93004 9.57759L8.38504 14.0251C8.45349 14.0952 8.53503 14.1513 8.62504 14.1901C8.71842 14.2256 8.81762 14.2435 8.91754 14.2426C9.01505 14.2438 9.11186 14.226 9.20254 14.1901C9.29255 14.1513 9.37409 14.0952 9.44254 14.0251L13.8975 9.57759C13.9678 9.50787 14.0236 9.42491 14.0617 9.33352C14.0998 9.24213 14.1194 9.1441 14.1194 9.04509C14.1194 8.94608 14.0998 8.84805 14.0617 8.75666C14.0236 8.66526 13.9678 8.58231 13.8975 8.51259C13.757 8.3729 13.5669 8.29449 13.3688 8.29449C13.1707 8.29449 12.9806 8.3729 12.84 8.51259Z\"\r\n fill=\"currentColor\"\r\n />\r\n </svg>\r\n `,\r\n styles: `\r\n svg {\r\n transition: transform 300ms ease-in-out;\r\n\r\n &:not(.asc):not(.desc) {\r\n display: none;\r\n }\r\n }\r\n\r\n .asc {\r\n transform: rotate(-180deg);\r\n }\r\n\r\n .desc {\r\n transform: rotate(0deg);\r\n }\r\n `,\r\n})\r\nexport class SortIcon {\r\n direction = input<GridSortOrder | undefined>('asc');\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterRenderEffect,\r\n booleanAttribute,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n effect,\r\n ElementRef,\r\n inject,\r\n input,\r\n numberAttribute,\r\n output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n} from '@angular/core';\r\nimport { auditTime, fromEvent, Subscription } from 'rxjs';\r\n\r\nimport { GRID_CHECKBOX_COLUMN, GRID_INDEX_COLUMN } from './data-grid.constants';\r\nimport {\r\n GridCellClickEvent,\r\n GridPageChangeEvent,\r\n GridRowClickEvent,\r\n GridSelectEvent,\r\n GridSortEvent,\r\n} from './data-grid.events.models';\r\nimport {\r\n GridCellRendererType,\r\n GridColumn,\r\n GridPaginationMode,\r\n GridPinnedRow,\r\n GridSelection,\r\n GridSortOrder,\r\n} from './data-grid.models';\r\nimport { DataGridVm } from './data-grid.vm';\r\nimport { DataGridCellComponent } from './data-grid-cell.component';\r\nimport { DataGridCellTemplateDirective } from './directives/data-cell.directive';\r\nimport { DataGridHeaderTemplateDirective } from './directives/header.directive';\r\nimport { DataGridExpanderIconDirective, DataGridSortIconDirective } from './directives/icons.directive';\r\nimport { DataGridCellEmptyDirective, DataGridCellLoadingDirective } from './directives/placeholders.directive';\r\nimport { DataGridTypeCellTemplateDirective } from './directives/type-cell.directive';\r\nimport {\r\n clampThumbTop,\r\n computeScrollbarState,\r\n mapThumbTopToScrollTop,\r\n ScrollDirectionDetector,\r\n} from './helpers/scrollbar';\r\nimport { Selector } from './helpers/selection';\r\nimport { CheckboxIcon } from './icons/checkbox.icon';\r\nimport { ExpandIcon } from './icons/expand.icon';\r\nimport { SortIcon } from './icons/sort.icon';\r\nimport { AnyDict, AnyType, DataKey, RowKeyFn } from './utils.models';\r\n\r\n/**\r\n * Data grid component with virtual scrolling, sorting, selection, and pagination support.\r\n *\r\n * Provides high-performance rendering of large datasets with features like:\r\n * - Virtual scrolling for efficient DOM management\r\n * - Column sorting and expandable columns\r\n * - Row selection (single/multiple)\r\n * - Pagination modes: none, pagination, or infinite scroll\r\n * - Pinned rows\r\n * - Custom cell and header templates\r\n *\r\n * @example\r\n * ```html\r\n * <re-data-grid\r\n * [data]=\"users\"\r\n * [columns]=\"columns\"\r\n * [selection]=\"{ mode: 'multiple' }\"\r\n * (sortChange)=\"onSort($event)\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 're-data-grid',\r\n templateUrl: 'data-grid.component.html',\r\n styleUrl: 'data-grid.component.scss',\r\n imports: [NgTemplateOutlet, DataGridCellComponent, SortIcon, ExpandIcon, CheckboxIcon],\r\n providers: [DataGridVm],\r\n})\r\nexport class DataGrid<Data extends AnyDict> {\r\n /**\r\n * Array of data to display in the table.\r\n *\r\n * Each item represents a single row. The component will efficiently render\r\n * only visible rows using virtual scrolling.\r\n */\r\n data = input<Data[]>([]);\r\n\r\n /**\r\n * Column configuration for the table.\r\n *\r\n * Defines how each column should be rendered, sorted, and styled.\r\n * Supports custom templates, sorting keys, and expandable columns.\r\n */\r\n columns = input<GridColumn<Data>[]>([]);\r\n\r\n /**\r\n * Pagination mode: 'none', 'pagination', or 'infinity'.\r\n *\r\n * - `none` - No pagination, all data is rendered\r\n * - `pagination` - Classic page-based pagination with fixed page size\r\n * - `infinity` - Infinite scroll mode, loads more data as user scrolls\r\n */\r\n mode = input<GridPaginationMode>('none');\r\n\r\n /**\r\n * Array of pinned rows that remain visible at the top or bottom.\r\n *\r\n * Pinned rows stay fixed while the rest of the content scrolls.\r\n * Useful for totals, summaries, or always-visible items.\r\n */\r\n pinnedRows = input<GridPinnedRow<Data>[]>([]);\r\n\r\n /**\r\n * Whether to add an index column showing row numbers.\r\n *\r\n * When enabled, it automatically adds a column displaying sequential row numbers.\r\n */\r\n hasIndexColumn = input<boolean, number | string | undefined>(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Row selection configuration.\r\n *\r\n * Controls whether users can select rows and in what mode:\r\n * - `{ mode: 'none' }` - No selection\r\n * - `{ mode: 'single' }` - Single row selection\r\n * - `{ mode: 'multi' }` - Multiple row selection with checkboxes\r\n *\r\n * When selection is enabled, a `key` must be provided to identify rows.\r\n */\r\n selection = input<GridSelection>({ mode: 'none' });\r\n\r\n /**\r\n * Number of items per page.\r\n *\r\n * Used in pagination and infinity scroll modes to control\r\n * how many rows are loaded at once. Default is 20.\r\n */\r\n pageSize = input<number, number | string | undefined>(20, { transform: numberAttribute });\r\n\r\n /**\r\n * Height of each row in pixels.\r\n *\r\n * Used for virtual scrolling calculations. Must be consistent\r\n * across all rows for accurate scrolling. Default is 40.\r\n */\r\n rowHeight = input<number, number | string | undefined>(40, { transform: numberAttribute });\r\n\r\n /**\r\n * Grid height configuration.\r\n *\r\n * - `number` - Fixed height in pixels\r\n * - `'full'` - Fill container height (100%), can be managed by host component style\r\n * - `'default'` - Height by CSS var (--re-data-grid-height)\r\n */\r\n height = input<number | 'full' | 'default'>('default');\r\n\r\n /**\r\n * Size of the virtual scroll buffer.\r\n *\r\n * Number of extra rows to render above and below the viewport\r\n * to reduce flickering during fast scrolling. Default is 6.\r\n */\r\n virtualBuffer = input(6);\r\n\r\n /**\r\n * Loading state indicator.\r\n *\r\n * When true, displays loading template instead of data.\r\n * Useful during async data fetching operations.\r\n */\r\n loading = input<boolean, boolean | string | undefined>(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Function or property name for obtaining a unique row key.\r\n *\r\n * Used for efficient change detection and row tracking.\r\n * Can be a property name (string) or a function that returns a unique identifier.\r\n */\r\n rowKey = input<RowKeyFn<Data> | undefined>(undefined);\r\n\r\n /**\r\n * Whether to start a page count from 0 (true) or 1 (false).\r\n *\r\n * Controls the numbering scheme for pagination events.\r\n * Default is true (0-based indexing).\r\n */\r\n pageStartFromZero = input<boolean, boolean | string | undefined>(true, { transform: booleanAttribute });\r\n\r\n /**\r\n * Event emitted when requesting data for a new page.\r\n *\r\n * Fired in pagination and infinity scroll modes when the user navigates\r\n * to a different page or scrolls near the end of current data.\r\n *\r\n * @example\r\n * ```typescript\r\n * onPageChange(event: GridPageChangeEvent) {\r\n * this.loadData(event.page, event.rows);\r\n * }\r\n * ```\r\n */\r\n pageChange = output<GridPageChangeEvent>();\r\n\r\n /**\r\n * Event emitted when sort order changes.\r\n *\r\n * Fired when a user clicks on a sortable column header.\r\n * Contains the sort key and direction (asc/desc).\r\n *\r\n * @example\r\n * ```typescript\r\n * onSortChange(event: GridSortEvent<User>) {\r\n * this.data = sortBy(this.data, event.key, event.order);\r\n * }\r\n * ```\r\n */\r\n sortChange = output<GridSortEvent<Data>>();\r\n\r\n /**\r\n * Event emitted when selected rows change.\r\n *\r\n * Fired when a user selects or deselects rows.\r\n * Contains an array of currently selected row keys.\r\n */\r\n selectChange = output<GridSelectEvent<Data>>();\r\n\r\n /**\r\n * Event emitted when a row is clicked.\r\n *\r\n * Contains the clicked row data and its index.\r\n */\r\n rowClick = output<GridRowClickEvent<Data>>();\r\n\r\n /**\r\n * Event emitted when a cell is clicked.\r\n *\r\n * Contains the clicked row, column configuration, and row index.\r\n */\r\n cellClick = output<GridCellClickEvent<Data>>();\r\n\r\n vm = inject<DataGridVm<Data>>(DataGridVm<Data>);\r\n selector = new Selector<Data>();\r\n\r\n private rootEl = viewChild<ElementRef<HTMLDivElement>>('root');\r\n private scrollEl = viewChild<ElementRef<HTMLDivElement>>('scroll');\r\n private headerEl = viewChild<ElementRef<HTMLDivElement>>('header');\r\n\r\n private cellTypedSlotRefs = contentChildren(DataGridTypeCellTemplateDirective);\r\n private cellDataSlotRefs = contentChildren(DataGridCellTemplateDirective);\r\n private headerSlotRefs = contentChildren(DataGridHeaderTemplateDirective);\r\n private emptySlotRefs = contentChildren(DataGridCellEmptyDirective);\r\n private loadingSlotRefs = contentChildren(DataGridCellLoadingDirective);\r\n private sortIcSlotRefs = contentChildren(DataGridSortIconDirective);\r\n private expanderIcSlotRefs = contentChildren(DataGridExpanderIconDirective);\r\n\r\n protected emptyTpl = computed(() => this.emptySlotRefs()?.[0]);\r\n protected loadingTpl = computed(() => this.loadingSlotRefs()?.[0]);\r\n protected sortTpl = computed(() => this.sortIcSlotRefs()?.at(0));\r\n protected expanderTpl = computed(() => this.expanderIcSlotRefs()?.at(0));\r\n\r\n protected visibleRows = signal<Data[]>([]);\r\n protected startIndex = 0;\r\n\r\n protected headerHeight = signal(40);\r\n // todo someday\r\n // protected fillHeight = signal<number | null>(null);\r\n\r\n protected expanderMap = signal<Map<DataKey<Data>, boolean>>(new Map());\r\n protected extendedColumns = computed<GridColumn<Data>[]>(() => {\r\n const hasSelection = this.selection().mode !== 'none';\r\n const hasIndex = this.hasIndexColumn();\r\n\r\n const newColumns: GridColumn<Data>[] = [];\r\n\r\n hasSelection && newColumns.push(GRID_CHECKBOX_COLUMN);\r\n hasIndex && newColumns.push(GRID_INDEX_COLUMN);\r\n\r\n return [...newColumns, ...this.columns()];\r\n });\r\n /**\r\n * Computed CSS height value based on height setting.\r\n */\r\n styleHeight = computed(() => {\r\n const height = this.height();\r\n\r\n if (typeof height === 'number') {\r\n return `${height}px`;\r\n // todo someday\r\n // } else if (height === 'fill') {\r\n // const h = this.fillHeight();\r\n //\r\n // return h === null ? null : `${h}px`;\r\n } else if (height === 'full') {\r\n return '100%';\r\n }\r\n\r\n return 'var(--re-data-grid-height)';\r\n });\r\n\r\n private hideSbTimeout?: AnyType;\r\n\r\n currentSortField?: string;\r\n currentSortOrder: GridSortOrder = 'asc';\r\n\r\n private subscription = new Subscription();\r\n private observer: ResizeObserver;\r\n\r\n constructor() {\r\n afterRenderEffect(() => {\r\n this.initRefs();\r\n this.initHeader();\r\n this.initScroll();\r\n this.initObserver();\r\n });\r\n\r\n afterRenderEffect(() => this.initSelector());\r\n\r\n afterRenderEffect(() => {\r\n this.initVm();\r\n this.initSort();\r\n this.initExpander();\r\n });\r\n\r\n effect(() => {\r\n this.data();\r\n this.rowHeight();\r\n this.pinnedRows();\r\n this.vm.containerWidth();\r\n\r\n this.onVerticalScroll(true);\r\n });\r\n\r\n effect(() => {\r\n const selection = this.selection();\r\n\r\n if ('defaultSelected' in selection) {\r\n this.selector.selectedKeys.set(selection.defaultSelected || []);\r\n }\r\n });\r\n\r\n inject(DestroyRef).onDestroy(() => {\r\n this.subscription.unsubscribe();\r\n this.observer?.disconnect();\r\n clearTimeout(this.hideSbTimeout);\r\n });\r\n }\r\n\r\n protected resolvePinnedData(pr: GridPinnedRow): Partial<Data> {\r\n return typeof pr.data === 'function' ? pr.data() : (pr.data as Partial<Data>);\r\n }\r\n\r\n /**\r\n * Handles column header click for sorting.\r\n *\r\n * Toggles sort order between ascending and descending for the clicked column.\r\n * If a different column is clicked, it resets to ascending order.\r\n * Emits sortChange event with the current sort state.\r\n *\r\n * @param col - Column configuration that was clicked\r\n */\r\n protected onSort(col: GridColumn<Data>) {\r\n if (!col.sortKey) {\r\n return;\r\n }\r\n\r\n if (this.currentSortField === col.sortKey) {\r\n this.currentSortOrder = this.currentSortOrder === 'asc' ? 'desc' : 'asc';\r\n } else {\r\n this.currentSortField = col.sortKey;\r\n this.currentSortOrder = 'asc';\r\n }\r\n\r\n this.sortChange.emit({ key: this.currentSortField, order: this.currentSortOrder });\r\n }\r\n\r\n /**\r\n * Handles cell click events.\r\n *\r\n * Emits cellClick event and handles row selection if selection mode is enabled.\r\n * Updates the selection state and emits selectChange event accordingly.\r\n *\r\n * @param row - Data row that was clicked\r\n * @param col - Column configuration of the clicked cell\r\n * @param index - Row index in the dataset\r\n */\r\n protected onCellClick(row: Data, col: GridColumn<Data>, index: number) {\r\n this.cellClick.emit({ row, col, index });\r\n\r\n if (this.selection().mode !== 'none') {\r\n const selected = this.selector.select(row);\r\n\r\n this.selectChange.emit({ selected });\r\n }\r\n }\r\n\r\n protected isExpandable(column: GridColumn<Data>) {\r\n const keys = this.expanderMap();\r\n\r\n return keys.has(column.key);\r\n }\r\n\r\n /**\r\n * Handles column expand/collapse toggle.\r\n *\r\n * Toggles the expanded state of a column and updates the visibility\r\n * of all dependent columns that reference this column via expandBy property.\r\n *\r\n * @param column - Column configuration to expand or collapse\r\n */\r\n protected onExpand(column: GridColumn<Data>) {\r\n const expanded = !this.expanderMap().get(column.key);\r\n\r\n this.expanderMap.update((prev) => {\r\n const map = new Map(prev);\r\n\r\n map.set(column.key, expanded);\r\n\r\n return map;\r\n });\r\n\r\n const columns = this.extendedColumns().map((col) =>\r\n col.expandBy === column.key ? { ...col, visible: expanded } : col,\r\n );\r\n\r\n this.vm.columns.set(columns);\r\n }\r\n\r\n /**\r\n * Handles vertical scroll events and updates visible rows.\r\n *\r\n * Implements virtual scrolling by calculating which rows should be rendered\r\n * based on the current scroll position. Also handles infinite scroll data loading\r\n * when the user scrolls near the end of available data.\r\n *\r\n * @param initial - Whether this is the initial scroll calculation\r\n */\r\n protected onVerticalScroll(initial = false): void {\r\n const el = this.scrollEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n const scrollTop = el.scrollTop ?? 0;\r\n const viewportHeight = el.clientHeight ?? 0;\r\n const data = this.data() ?? [];\r\n const total = data.length ?? 0;\r\n const rowHeight = Math.max(1, this.rowHeight());\r\n const virtualBuffer = Math.max(0, this.virtualBuffer());\r\n\r\n const limit = this.mode() === 'pagination';\r\n const cap = limit ? Math.max(1, this.pageSize()) : Number.POSITIVE_INFINITY;\r\n\r\n const viewportRows = Math.ceil(viewportHeight / rowHeight);\r\n const visibleCount = Math.min(viewportRows + virtualBuffer, cap);\r\n\r\n const start = Math.max(0, Math.floor(scrollTop / rowHeight) - Math.floor(virtualBuffer / 2));\r\n const end = Math.min(total, start + visibleCount);\r\n\r\n if (!el || viewportHeight <= 0 || !isFinite(viewportHeight) || !isFinite(rowHeight)) {\r\n this.visibleRows.set(data);\r\n this.vm.calcScrollbar();\r\n this.showScrollbar();\r\n this.hideScrollbarSoon();\r\n\r\n return;\r\n }\r\n\r\n this.startIndex = start;\r\n this.visibleRows.set(data.slice(start, end));\r\n\r\n if (!initial && this.mode() === 'infinity') {\r\n const threshold = Math.max(0, total - Math.max(1, Math.floor(visibleCount * 1.5)));\r\n const nearEnd = start + visibleCount >= threshold;\r\n\r\n if (nearEnd && !this.loading()) {\r\n const modifier = this.pageStartFromZero() ? 0 : 1;\r\n const page = Math.floor(total / this.pageSize()) + modifier;\r\n\r\n this.pageChange.emit({ page, rows: this.pageSize() });\r\n }\r\n }\r\n\r\n this.vm.calcScrollbar();\r\n this.showScrollbar();\r\n this.hideScrollbarSoon();\r\n }\r\n\r\n protected onHorizontalScroll(): void {}\r\n\r\n /**\r\n * Handles mouse down event on scrollbar thumb for drag scrolling.\r\n *\r\n * Initiates dragging mode and sets up mouse move/up event listeners\r\n * to track thumb position and update scroll position accordingly.\r\n * Automatically cleans up listeners when dragging ends.\r\n *\r\n * @param e - Mouse down event from a scrollbar thumb element\r\n */\r\n protected onThumbDown(e: MouseEvent): void {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n const el = this.scrollEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n this.vm.dragging = true;\r\n this.showScrollbar();\r\n\r\n const startY = e.clientY;\r\n const startTop = this.vm.thumbTopPx();\r\n\r\n const state = computeScrollbarState(el.scrollHeight || 1, el.clientHeight || 1, el.scrollTop || 0);\r\n const maxThumbTop = state.maxThumbTop || 1;\r\n const maxScrollTop = state.maxScrollTop || 1;\r\n\r\n const onMove = (ev: MouseEvent) => {\r\n const delta = ev.clientY - startY;\r\n const newTop = clampThumbTop(startTop + delta, maxThumbTop);\r\n\r\n this.vm.thumbTopPx.set(newTop);\r\n el.scrollTop = mapThumbTopToScrollTop(newTop, maxThumbTop, maxScrollTop);\r\n\r\n this.vm.calcScrollbar();\r\n this.showScrollbar();\r\n };\r\n\r\n const onUp = () => {\r\n window.removeEventListener('mousemove', onMove);\r\n window.removeEventListener('mouseup', onUp);\r\n this.vm.dragging = false;\r\n this.hideScrollbarSoon();\r\n };\r\n\r\n window.addEventListener('mousemove', onMove);\r\n window.addEventListener('mouseup', onUp);\r\n }\r\n\r\n protected showScrollbar(): void {\r\n this.vm.scrollbarVisible.set(true);\r\n\r\n clearTimeout(this.hideSbTimeout);\r\n }\r\n\r\n protected hideScrollbarSoon(delay = 1200): void {\r\n if (this.vm.dragging) {\r\n return;\r\n }\r\n\r\n clearTimeout(this.hideSbTimeout);\r\n this.hideSbTimeout = setTimeout(() => this.vm.scrollbarVisible.set(false), delay);\r\n }\r\n\r\n // todo\r\n protected trackPinnedRow = (row: GridPinnedRow) => row.order;\r\n\r\n protected trackByRow = (row: Data) => {\r\n const rowKey = this.rowKey();\r\n\r\n if (!rowKey) {\r\n return row;\r\n }\r\n\r\n return typeof rowKey === 'function' ? rowKey(row) : row[rowKey];\r\n };\r\n\r\n protected cellClass(col: GridColumn<Data>, row: Data): string | undefined {\r\n if (typeof col.cellClass === 'function') {\r\n return col.cellClass(row);\r\n }\r\n\r\n return col.cellClass;\r\n }\r\n\r\n protected ariaSort(col: GridColumn<Data>): 'ascending' | 'descending' | 'none' {\r\n if (this.currentSortField !== col.sortKey) {\r\n return 'none';\r\n }\r\n\r\n return this.currentSortOrder === 'asc' ? 'ascending' : 'descending';\r\n }\r\n\r\n private initVm(): void {\r\n this.vm.scrollEl.set(this.scrollEl());\r\n this.vm.columns.set(this.extendedColumns());\r\n this.vm.pinnedRows.set(this.pinnedRows());\r\n }\r\n\r\n private initSelector(): void {\r\n this.selector.data.set(this.data());\r\n this.selector.selection.set(this.selection());\r\n }\r\n\r\n private initRefs(): void {\r\n this.cellTypedSlotRefs()?.forEach((dir) =>\r\n this.vm.globalTypeCellTpls.set(dir.type() as GridCellRendererType, dir.tpl),\r\n );\r\n this.cellDataSlotRefs()?.forEach((dir) => this.vm.globalDataCellTpls.set(dir.key(), dir.tpl));\r\n\r\n const headerMap = new Map<string, TemplateRef<AnyType>>();\r\n const cellsMap = new Map<string, TemplateRef<AnyType>>();\r\n\r\n this.headerSlotRefs()?.forEach((h) => headerMap.set(h.key(), h.tpl));\r\n this.cellDataSlotRefs()?.forEach((h) => cellsMap.set(h.key(), h.tpl));\r\n\r\n this.extendedColumns()?.forEach((c) => {\r\n if (!c.headerTemplate && headerMap.has(c.key)) {\r\n c.headerTemplate = headerMap.get(c.key)!;\r\n }\r\n });\r\n }\r\n\r\n private initSort() {\r\n const firstSortable = this.extendedColumns()?.find((c) => !!c.sortKey);\r\n\r\n if (firstSortable) {\r\n this.currentSortField = firstSortable.sortKey;\r\n this.currentSortOrder = 'asc';\r\n }\r\n }\r\n\r\n private initHeader() {\r\n const el = this.headerEl()?.nativeElement;\r\n\r\n if (!el) return;\r\n\r\n this.headerHeight.set(el.offsetHeight);\r\n }\r\n\r\n private initScroll() {\r\n const scrollEl = this.scrollEl()?.nativeElement;\r\n\r\n if (scrollEl) {\r\n const scrollDetector = new ScrollDirectionDetector(scrollEl);\r\n\r\n this.subscription = fromEvent(scrollEl, 'scroll')\r\n .pipe(auditTime(16))\r\n .subscribe(() => {\r\n const direction = scrollDetector.detect();\r\n\r\n direction === 'vertical' ? this.onVerticalScroll() : this.onHorizontalScroll();\r\n });\r\n }\r\n\r\n queueMicrotask(() => this.onVerticalScroll(true));\r\n }\r\n\r\n private initObserver() {\r\n const root = this.rootEl();\r\n\r\n if (!root) return;\r\n\r\n this.observer = new ResizeObserver((entries) => {\r\n const width = entries[0].contentRect.width;\r\n\r\n this.onVerticalScroll(true);\r\n this.onHorizontalScroll();\r\n this.vm.calcScrollbar();\r\n this.vm.containerWidth.set(width);\r\n });\r\n\r\n this.observer.observe(root.nativeElement);\r\n }\r\n\r\n private initExpander() {\r\n const map: Map<DataKey<Data>, boolean> = new Map();\r\n\r\n const columns = untracked(() =>\r\n this.vm.columns().map((col) => {\r\n col.expandBy && map.set(col.expandBy, false);\r\n\r\n return { ...col, visible: col.expandBy ? false : col.visible };\r\n }),\r\n );\r\n\r\n this.vm.columns.set(columns);\r\n this.expanderMap.set(map);\r\n }\r\n}\r\n","@let items = data();\n@let empty = !loading() && !items?.length;\n@let notEmpty = !!items?.length;\n\n@let pinnedTopH = vm.pinnedTop().length * rowHeight();\n@let pinnedBottomH = vm.pinnedBottom().length * rowHeight();\n\n<div\n #root\n class=\"re-dg-root\"\n [class.loading]=\"loading()\"\n [style.height]=\"styleHeight()\"\n role=\"table\"\n>\n @if (loading()) {\n <div class=\"re-dg-loader\">\n @let loadingTemplate = loadingTpl();\n\n @if (loadingTemplate?.tpl) {\n <ng-container [ngTemplateOutlet]=\"loadingTemplate!.tpl\" />\n } @else {\n <span class=\"re-dg-loader-text\">Загрузка…</span>\n }\n </div>\n }\n\n <div\n #scroll\n class=\"re-dg-body\"\n role=\"rowgroup\"\n (mouseenter)=\"showScrollbar()\"\n (mouseleave)=\"hideScrollbarSoon()\"\n >\n <div class=\"re-dg-header\" role=\"rowgroup\">\n <div #header class=\"re-dg-row re-dg-header-row\" role=\"row\">\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-header-cell\"\n role=\"columnheader\"\n [class.sortable]=\"!!col.sortKey\"\n [class.active-sort]=\"currentSortField && (currentSortField === col.sortKey)\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n [style.min-width.px]=\"col.minWidth || null\"\n [style.max-width.px]=\"col.maxWidth || null\"\n [style.justify-content]=\"col.align || 'left'\"\n [attr.aria-sort]=\"ariaSort(col)\"\n [attr.tabindex]=\"col.sortKey ? 0 : -1\"\n [title]=\"col.header\"\n (click)=\"col.sortKey && onSort(col)\"\n (keydown.enter)=\"col.sortKey && onSort(col)\"\n >\n @if (col.headerTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"col.headerTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: col.header }\"\n />\n } @else {\n @let isCheckbox = 'type' in col && col.type === 'checkbox';\n @let isMultiSelect = selection().mode === 'multi';\n\n @if (isCheckbox && isMultiSelect) {\n <re-checkbox-ic [state]=\"selector.isAllSelected()\" (click)=\"selector.selectAll()\" />\n } @else {\n <span class=\"re-dg-header-text\">{{ col.header }}</span>\n }\n\n @if (col.sortKey) {\n <span class=\"re-dg-sort-ind\">\n @let direction = currentSortField === col.sortKey ? currentSortOrder : undefined;\n\n @if (sortTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"sortTpl()!.tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: direction }\"\n />\n } @else {\n <re-sort-ic [direction]=\"direction\" />\n }\n </span>\n }\n\n @if (isExpandable(col)) {\n <button (click)=\"$event.stopPropagation(); onExpand(col)\">\n @let expanded = expanderMap().get(col.key);\n\n @if (expanderTpl()) {\n <ng-container\n [ngTemplateOutlet]=\"expanderTpl()!.tpl\"\n [ngTemplateOutletContext]=\"{ $implicit: expanded }\" />\n } @else {\n <re-expand-ic [expanded]=\"expanded\" />\n }\n </button>\n }\n }\n </div>\n }\n </div>\n\n <!-- PINNED TOP ROWS -->\n @if (notEmpty) {\n @for (pr of vm.pinnedTop(); track trackPinnedRow(pr)) {\n <div class=\"re-dg-row re-dg-pinned re-dg-top\" role=\"row\">\n @if (pr.rowTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"pr.rowTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: resolvePinnedData(pr) }\"\n />\n } @else {\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-cell\"\n role=\"cell\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.justify-items]=\"col.align || 'left'\"\n [style.height.px]=\"rowHeight()\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n >\n {{ resolvePinnedData(pr)[col.key] ?? '' }}\n </div>\n }\n }\n </div>\n }\n }\n </div>\n\n @if (empty) {\n @let emptyTemplate = emptyTpl()?.tpl;\n\n <div class=\"re-dg-empty\">\n @if (emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"emptyTemplate\" />\n } @else {\n <span class=\"re-dg-empty-text\">Нет данных</span>\n }\n </div>\n }\n\n <!-- Content -->\n @if (notEmpty) {\n <div class=\"re-dg-spacer\" [style.height.px]=\"items.length * rowHeight() - pinnedBottomH\"></div>\n\n @for (row of visibleRows(); track trackByRow(row); let vi = $index) {\n <div\n class=\"re-dg-row re-dg-data-row\"\n role=\"row\"\n [style.height.px]=\"rowHeight()\"\n [style.top.px]=\"(startIndex + vi) * rowHeight() + pinnedTopH + headerHeight()\"\n [attr.tabindex]=\"0\"\n (click)=\"$event.stopPropagation(); rowClick.emit({ row, index: startIndex + vi })\"\n (keydown.enter)=\"$event.stopPropagation(); rowClick.emit({ row, index: startIndex + vi })\"\n >\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-cell\"\n role=\"cell\"\n [class.expanded]=\"!!col.expandBy\"\n [class]=\"cellClass(col, row)\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.justify-items]=\"col.align || 'left'\"\n [style.text-align]=\"col.align || 'left'\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n [attr.tabindex]=\"0\"\n (click)=\"onCellClick(row, col, startIndex + vi);\"\n (keydown.enter)=\"onCellClick(row, col, startIndex + vi)\"\n >\n @let isCheckbox = 'type' in col && col.type === 'checkbox';\n\n @if (isCheckbox) {\n <re-checkbox-ic [state]=\"selector.isSelected(row)\" />\n } @else {\n <re-data-grid-cell [index]=\"startIndex + vi\" [item]=\"row\" [column]=\"col\" />\n }\n </div>\n }\n </div>\n }\n }\n\n <!-- PINNED BOTTOM ROWS -->\n @if (notEmpty) {\n <div class=\"re-dg-footer\" role=\"rowgroup\">\n @for (pr of vm.pinnedBottom(); track trackPinnedRow(pr)) {\n <div class=\"re-dg-row re-dg-pinned re-dg-bottom\" role=\"row\">\n @if (pr.rowTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"pr.rowTemplate!\"\n [ngTemplateOutletContext]=\"{ $implicit: resolvePinnedData(pr) }\"\n />\n } @else {\n @for (col of vm.columnsToShow(); track col.key) {\n <div\n class=\"re-dg-cell\"\n role=\"cell\"\n [class.sticky-left]=\"vm.isStickyLeft(col.key)\"\n [class.sticky-right]=\"vm.isStickyRight(col.key)\"\n [style.left.px]=\"vm.stickyOffset(col.key, 'left')\"\n [style.right.px]=\"vm.stickyOffset(col.key, 'right')\"\n [style.justify-items]=\"col.align || 'left'\"\n [style.height.px]=\"rowHeight()\"\n [style.width.px]=\"vm.widthByKey(col.key)\"\n >\n {{ resolvePinnedData(pr)[col.key] ?? '' }}\n </div>\n }\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Overlay scrollbar -->\n <div class=\"re-dg-scrollbar\" [class.visible]=\"vm.scrollbarVisible()\">\n <div\n class=\"re-dg-scrollbar-thumb\"\n role=\"scrollbar\"\n aria-orientation=\"vertical\"\n aria-hidden=\"false\"\n [style.height.px]=\"vm.thumbHeightPx()\"\n [style.transform]=\"'translateY(' + vm.thumbTopPx() + 'px)'\"\n (mousedown)=\"onThumbDown($event)\"\n ></div>\n </div>\n</div>\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["clamp"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"reforgium-data-grid.d.ts","sources":["../../../../libs/data-grid/src/directives/type-cell.directive.ts","../../../../libs/data-grid/src/directives/data-cell.directive.ts","../../../../libs/data-grid/src/directives/header.directive.ts","../../../../libs/data-grid/src/directives/placeholders.directive.ts","../../../../libs/data-grid/src/directives/icons.directive.ts","../../../../libs/data-grid/src/data-grid.paginator.ts","../../../../libs/data-grid/src/utils.models.ts","../../../../libs/data-grid/src/data-grid.models.ts","../../../../libs/data-grid/src/data-grid.events.models.ts","../../../../libs/data-grid/src/data-grid.vm.ts","../../../../libs/data-grid/src/helpers/selection/selection.helper.ts","../../../../libs/data-grid/src/data-grid.component.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}