@hexclave/dashboard-ui-components 1.0.82 → 1.0.84

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 +1 @@
1
- {"version":3,"file":"data-grid.test.js","names":["vi","DATA_GRID_DEFAULT_STRINGS","cleanup","DataGridToolbar","DataGrid"],"sources":["../../../src/components/data-grid/data-grid.test.tsx"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { act, cleanup, fireEvent, render, waitFor } from \"@testing-library/react\";\nimport { useMemo, useState } from \"react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n createDefaultDataGridState,\n DATA_GRID_DEFAULT_STRINGS,\n DataGrid,\n DataGridToolbar,\n isDataGridInteractiveRowClickTarget,\n useDataSource,\n type DataGridColumnDef,\n type DataGridDataSource,\n type DataGridProps,\n} from \"./index\";\n\ntype Row = {\n id: string,\n name: string,\n};\n\nconst columns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 160,\n minWidth: 80,\n sortable: true,\n type: \"string\",\n },\n];\n\nconst wideColumns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 320,\n minWidth: 80,\n type: \"string\",\n },\n {\n id: \"email\",\n header: \"Email\",\n accessor: (row) => `${row.name.toLowerCase().replaceAll(\" \", \".\")}@example.com`,\n width: 420,\n minWidth: 80,\n type: \"string\",\n },\n];\n\ndescribe(\"DataGridToolbar action divider\", () => {\n const ctx = {\n state: createDefaultDataGridState(columns),\n onChange: vi.fn(),\n columns,\n visibleColumns: columns,\n totalRowCount: 1,\n selectedRowCount: 0,\n strings: DATA_GRID_DEFAULT_STRINGS,\n exportCsv: vi.fn(),\n };\n\n afterEach(cleanup);\n\n it(\"does not render a divider for an empty React node\", () => {\n const { container } = render(\n <DataGridToolbar ctx={ctx} extraActions={false} />,\n );\n\n expect(container.querySelector(\".mx-0\\\\.5.h-4.w-px\")).toBeNull();\n });\n\n it(\"renders the divider when an action is visible\", () => {\n const { container, getByRole } = render(\n <DataGridToolbar\n ctx={ctx}\n extraActions={<button type=\"button\">Refresh</button>}\n />,\n );\n\n expect(getByRole(\"button\", { name: \"Refresh\" })).not.toBeNull();\n expect(container.querySelector(\".mx-0\\\\.5.h-4.w-px\")).not.toBeNull();\n });\n});\n\ntype ObserverRecord = {\n options?: IntersectionObserverInit,\n};\n\nlet intersectionObserverRecords: ObserverRecord[] = [];\nlet intersectionObserverInstances: MockIntersectionObserver[] = [];\n\nclass MockIntersectionObserver implements IntersectionObserver {\n readonly root: Element | Document | null;\n readonly rootMargin: string;\n readonly scrollMargin: string;\n readonly thresholds: ReadonlyArray<number>;\n private readonly callback: IntersectionObserverCallback;\n private readonly record: ObserverRecord;\n\n constructor(\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n ) {\n this.callback = callback;\n this.root = options?.root ?? null;\n this.rootMargin = options?.rootMargin ?? \"\";\n this.scrollMargin = \"\";\n this.thresholds = Array.isArray(options?.threshold)\n ? options.threshold\n : [options?.threshold ?? 0];\n this.record = { options };\n intersectionObserverRecords.push(this.record);\n intersectionObserverInstances.push(this);\n }\n\n disconnect() {}\n observe() {}\n takeRecords(): IntersectionObserverEntry[] {\n return [];\n }\n unobserve() {}\n\n trigger(entry: Partial<IntersectionObserverEntry> = {}) {\n this.callback(\n [\n {\n boundingClientRect: {} as DOMRectReadOnly,\n intersectionRatio: 1,\n intersectionRect: {} as DOMRectReadOnly,\n isIntersecting: true,\n rootBounds: null,\n target: document.createElement(\"div\"),\n time: 0,\n ...entry,\n },\n ],\n this,\n );\n }\n}\n\nclass MockResizeObserver implements ResizeObserver {\n private readonly callback: ResizeObserverCallback;\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n }\n\n disconnect() {}\n observe(target: Element) {\n const el = target instanceof HTMLElement ? target : null;\n const parentWidth = el?.parentElement instanceof HTMLElement ? el.parentElement.clientWidth : 0;\n const width = (el?.clientWidth ?? 0) > 0 ? (el?.clientWidth ?? 320) : parentWidth > 0 ? parentWidth : 320;\n const height = (el?.clientHeight ?? 0) > 0 ? (el?.clientHeight ?? 400) : 400;\n this.callback(\n [\n {\n target,\n contentRect: {\n x: 0,\n y: 0,\n width,\n height,\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n toJSON() {\n return this;\n },\n } as DOMRectReadOnly,\n borderBoxSize: [],\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n },\n ],\n this,\n );\n }\n unobserve() {}\n}\n\nfunction DataGridHarness(props: { fillHeight?: boolean }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore\n fillHeight={props.fillHeight}\n />\n </div>\n );\n}\n\nfunction PaginatedDataGridHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"paginated\"\n fillHeight={false}\n />\n </div>\n );\n}\n\nfunction InteractiveDataGridHarness(props: {\n onSortChange?: DataGridProps<Row>[\"onSortChange\"],\n onSelectionChange?: DataGridProps<Row>[\"onSelectionChange\"],\n}) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n selectionMode=\"multiple\"\n onSortChange={props.onSortChange}\n onSelectionChange={props.onSelectionChange}\n />\n );\n}\n\nfunction WideDataGridHarness(props: {\n horizontalScrollbarPosition?: \"top\" | \"bottom\",\n} = {}) {\n const [state, setState] = useState(() => createDefaultDataGridState(wideColumns));\n\n return (\n <div style={{ width: 320 }}>\n <DataGrid<Row>\n columns={wideColumns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n horizontalScrollbarPosition={props.horizontalScrollbarPosition}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"observes against the grid body when the grid owns vertical scrolling\", async () => {\n const { container } = render(<DataGridHarness fillHeight />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n // Regression: an infinite grid left unbounded (`fillHeight={false}`, no `maxHeight`) used to\n // grow its scroll container to fit every loaded row, which defeats virtualization (the\n // virtualizer measures the container as fully visible and mounts every row) and OOMs the tab on\n // large datasets. Such grids now fall back to a default `maxHeight`, so the grid owns its own\n // bounded scroll container and observes against it rather than the viewport.\n it(\"bounds an unbounded infinite grid and observes against its own scroll container\", async () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n it(\"applies a default maxHeight to an otherwise-unbounded infinite grid\", () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"calc(100dvh - 16rem)\");\n });\n\n it(\"does not force a maxHeight onto a paginated grid\", () => {\n const { container } = render(<PaginatedDataGridHarness />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"\");\n });\n});\n\n// Drives a real `useDataSource` infinite-scroll grid whose data source\n// always reports `hasMore: true`, mirroring a project with a long\n// transaction / customer history (e.g. the transactions table and customers\n// tab). Used to prove the sentinel doesn't thrash its IntersectionObserver.\nfunction InfiniteScrollLoadMoreHarness({ onFetch }: { onFetch: () => void }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n const dataSource = useMemo<DataGridDataSource<Row>>(\n () => {\n let page = 0;\n return async function* () {\n onFetch();\n const current = page++;\n yield {\n rows: [{ id: `row-${current}`, name: `Row ${current}` }],\n hasMore: true,\n nextCursor: `cursor-${current}`,\n };\n };\n },\n [onFetch],\n );\n\n const gridData = useDataSource<Row>({\n dataSource,\n columns,\n getRowId: (row) => row.id,\n sorting: state.sorting,\n quickSearch: state.quickSearch,\n pagination: state.pagination,\n paginationMode: \"infinite\",\n });\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={gridData.rows}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore={gridData.hasMore}\n isLoading={gridData.isLoading}\n isLoadingMore={gridData.isLoadingMore}\n onLoadMore={gridData.loadMore}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer stability\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n intersectionObserverInstances = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n // Regression: the sentinel used to re-create its IntersectionObserver every\n // time the `onLoadMore` callback changed identity (which happens on every\n // `isLoadingMore` / `hasMore` toggle). A freshly-created observer re-reports\n // the sentinel's current intersection state, so a sentinel that stays in\n // view fires `onLoadMore` again after every page — auto-loading the entire\n // history back-to-back and OOM-crashing the tab (\"Aw snap\") on large\n // datasets. The observer must stay stable across load-more cycles.\n it(\"does not re-create the observer on load-more cycles\", async () => {\n const onFetch = vi.fn();\n render(<InfiniteScrollLoadMoreHarness onFetch={onFetch} />);\n\n // Initial page load, after which the sentinel (and its observer) mounts.\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(1));\n await waitFor(() => expect(intersectionObserverInstances.length).toBeGreaterThan(0));\n\n const observersBeforeLoadMore = intersectionObserverInstances.length;\n\n // Simulate the sentinel scrolling into view exactly once.\n await act(async () => {\n intersectionObserverInstances.at(-1)?.trigger();\n await Promise.resolve();\n });\n\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(2));\n\n // A single scroll-in must trigger a single fetch, without spawning new\n // observers — otherwise each new observer would re-fire and runaway.\n expect(intersectionObserverInstances.length).toBe(observersBeforeLoadMore);\n });\n});\n\ndescribe(\"DataGrid controlled callbacks\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"fires onSortChange from the current controlled sort state\", () => {\n const onSortChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSortChange={onSortChange} />);\n\n fireEvent.click(getByRole(\"columnheader\", { name: /name/i }));\n\n expect(onSortChange).toHaveBeenCalledTimes(1);\n expect(onSortChange).toHaveBeenCalledWith([{ columnId: \"name\", direction: \"asc\" }]);\n });\n\n it(\"fires onSelectionChange when selecting all rows\", () => {\n const onSelectionChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSelectionChange={onSelectionChange} />);\n\n fireEvent.click(getByRole(\"checkbox\", { name: /select all rows/i }));\n\n expect(onSelectionChange).toHaveBeenCalledTimes(1);\n const [selectedIds, selectedRows] = onSelectionChange.mock.calls[0];\n expect([...selectedIds]).toEqual([\"row-1\"]);\n expect(selectedRows).toEqual([{ id: \"row-1\", name: \"Row 1\" }]);\n });\n\n it(\"identifies nested interactive controls as row-click blockers\", () => {\n const cell = document.createElement(\"div\");\n const button = document.createElement(\"button\");\n const label = document.createElement(\"span\");\n label.textContent = \"Open menu\";\n button.append(label);\n cell.append(button);\n\n expect(isDataGridInteractiveRowClickTarget(label.firstChild)).toBe(true);\n expect(isDataGridInteractiveRowClickTarget(cell)).toBe(false);\n });\n});\n\ndescribe(\"DataGrid horizontal scrolling\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n Object.defineProperty(HTMLElement.prototype, \"clientWidth\", {\n configurable: true,\n get() {\n return 320;\n },\n });\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"sizes the sticky clipping layer to the full row width\", () => {\n const { container } = render(<WideDataGridHarness />);\n\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n\n expect(rowsClip).toBeInstanceOf(HTMLElement);\n expect((rowsClip as HTMLElement).style.minWidth).toBe(\"740px\");\n });\n\n it(\"lets the columns popover escape the sticky toolbar bounds\", () => {\n const { container, getByTitle } = render(<WideDataGridHarness />);\n\n fireEvent.click(getByTitle(\"Columns\"));\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n expect((stickyChrome as HTMLElement).className).toContain(\"overflow-visible\");\n expect(container.textContent).toContain(\"Email\");\n });\n\n it(\"puts the horizontal scrollbar under the column headers when position is top\", () => {\n const { container } = render(<WideDataGridHarness horizontalScrollbarPosition=\"top\" />);\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n const headerScroll = stickyChrome?.querySelector(\".overflow-x-auto\");\n expect(headerScroll).toBeInstanceOf(HTMLElement);\n\n const bodyScroll = container.querySelector('[role=\"grid\"]')?.children.item(1);\n expect(bodyScroll).toBeInstanceOf(HTMLElement);\n expect((bodyScroll as HTMLElement).className).toContain(\"overflow-x-hidden\");\n expect((bodyScroll as HTMLElement).className).toContain(\"overflow-y-auto\");\n\n Object.defineProperty(headerScroll as HTMLElement, \"scrollLeft\", {\n configurable: true,\n writable: true,\n value: 0,\n });\n Object.defineProperty(bodyScroll as HTMLElement, \"scrollLeft\", {\n configurable: true,\n writable: true,\n value: 0,\n });\n\n (headerScroll as HTMLElement).scrollLeft = 120;\n fireEvent.scroll(headerScroll as HTMLElement);\n expect((bodyScroll as HTMLElement).scrollLeft).toBe(120);\n });\n});\n\ndescribe(\"DataGrid loading skeleton\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"shows a full-width shimmer when loading before any columns are known\", () => {\n function SchemaPendingHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState([]));\n return (\n <DataGrid<Row>\n columns={[]}\n rows={[]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n isLoading\n />\n );\n }\n\n const { container } = render(<SchemaPendingHarness />);\n\n const skeleton = container.querySelector(\"[data-data-grid-schema-pending-skeleton]\");\n expect(skeleton).toBeInstanceOf(HTMLElement);\n // Five placeholder columns × 10 rows → visible shimmer cells, not an empty pane.\n expect(skeleton?.querySelectorAll(\"[role='row']\").length).toBe(10);\n });\n\n it(\"uses per-column skeleton rows once the schema is known\", () => {\n function KnownSchemaHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n isLoading\n />\n );\n }\n\n const { container } = render(<KnownSchemaHarness />);\n\n expect(container.querySelector(\"[data-data-grid-schema-pending-skeleton]\")).toBeNull();\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n expect(rowsClip?.querySelectorAll(\"[role='row']\").length).toBe(8);\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"data-grid.test.js","names":["vi","DATA_GRID_DEFAULT_STRINGS","cleanup","DataGridToolbar","DataGrid"],"sources":["../../../src/components/data-grid/data-grid.test.tsx"],"sourcesContent":["// @vitest-environment jsdom\n\nimport { act, cleanup, fireEvent, render, waitFor } from \"@testing-library/react\";\nimport { useMemo, useState } from \"react\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport {\n createDefaultDataGridState,\n DATA_GRID_DEFAULT_STRINGS,\n DataGrid,\n DataGridToolbar,\n isDataGridInteractiveRowClickTarget,\n useDataSource,\n type DataGridColumnDef,\n type DataGridDataSource,\n type DataGridProps,\n} from \"./index\";\n\ntype Row = {\n id: string,\n name: string,\n};\n\nconst columns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 160,\n minWidth: 80,\n sortable: true,\n type: \"string\",\n },\n];\n\nconst wideColumns: DataGridColumnDef<Row>[] = [\n {\n id: \"name\",\n header: \"Name\",\n accessor: (row) => row.name,\n width: 320,\n minWidth: 80,\n type: \"string\",\n },\n {\n id: \"email\",\n header: \"Email\",\n accessor: (row) => `${row.name.toLowerCase().replaceAll(\" \", \".\")}@example.com`,\n width: 420,\n minWidth: 80,\n type: \"string\",\n },\n];\n\ndescribe(\"DataGridToolbar action divider\", () => {\n const ctx = {\n state: createDefaultDataGridState(columns),\n onChange: vi.fn(),\n columns,\n visibleColumns: columns,\n totalRowCount: 1,\n selectedRowCount: 0,\n strings: DATA_GRID_DEFAULT_STRINGS,\n exportCsv: vi.fn(),\n };\n\n afterEach(cleanup);\n\n it(\"does not render a divider for an empty React node\", () => {\n const { container } = render(\n <DataGridToolbar ctx={ctx} extraActions={false} />,\n );\n\n expect(container.querySelector(\".mx-0\\\\.5.h-4.w-px\")).toBeNull();\n });\n\n it(\"renders the divider when an action is visible\", () => {\n const { container, getByRole } = render(\n <DataGridToolbar\n ctx={ctx}\n extraActions={<button type=\"button\">Refresh</button>}\n />,\n );\n\n expect(getByRole(\"button\", { name: \"Refresh\" })).not.toBeNull();\n expect(container.querySelector(\".mx-0\\\\.5.h-4.w-px\")).not.toBeNull();\n });\n});\n\ntype ObserverRecord = {\n options?: IntersectionObserverInit,\n};\n\nlet intersectionObserverRecords: ObserverRecord[] = [];\nlet intersectionObserverInstances: MockIntersectionObserver[] = [];\n\nclass MockIntersectionObserver implements IntersectionObserver {\n readonly root: Element | Document | null;\n readonly rootMargin: string;\n readonly scrollMargin: string;\n readonly thresholds: ReadonlyArray<number>;\n private readonly callback: IntersectionObserverCallback;\n private readonly record: ObserverRecord;\n\n constructor(\n callback: IntersectionObserverCallback,\n options?: IntersectionObserverInit,\n ) {\n this.callback = callback;\n this.root = options?.root ?? null;\n this.rootMargin = options?.rootMargin ?? \"\";\n this.scrollMargin = \"\";\n this.thresholds = Array.isArray(options?.threshold)\n ? options.threshold\n : [options?.threshold ?? 0];\n this.record = { options };\n intersectionObserverRecords.push(this.record);\n intersectionObserverInstances.push(this);\n }\n\n disconnect() {}\n observe() {}\n takeRecords(): IntersectionObserverEntry[] {\n return [];\n }\n unobserve() {}\n\n trigger(entry: Partial<IntersectionObserverEntry> = {}) {\n this.callback(\n [\n {\n boundingClientRect: {} as DOMRectReadOnly,\n intersectionRatio: 1,\n intersectionRect: {} as DOMRectReadOnly,\n isIntersecting: true,\n rootBounds: null,\n target: document.createElement(\"div\"),\n time: 0,\n ...entry,\n },\n ],\n this,\n );\n }\n}\n\nclass MockResizeObserver implements ResizeObserver {\n private readonly callback: ResizeObserverCallback;\n\n constructor(callback: ResizeObserverCallback) {\n this.callback = callback;\n }\n\n disconnect() {}\n observe(target: Element) {\n const el = target instanceof HTMLElement ? target : null;\n const parentWidth = el?.parentElement instanceof HTMLElement ? el.parentElement.clientWidth : 0;\n const width = (el?.clientWidth ?? 0) > 0 ? (el?.clientWidth ?? 320) : parentWidth > 0 ? parentWidth : 320;\n const height = (el?.clientHeight ?? 0) > 0 ? (el?.clientHeight ?? 400) : 400;\n this.callback(\n [\n {\n target,\n contentRect: {\n x: 0,\n y: 0,\n width,\n height,\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n toJSON() {\n return this;\n },\n } as DOMRectReadOnly,\n borderBoxSize: [],\n contentBoxSize: [],\n devicePixelContentBoxSize: [],\n },\n ],\n this,\n );\n }\n unobserve() {}\n}\n\nfunction DataGridHarness(props: { fillHeight?: boolean }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore\n fillHeight={props.fillHeight}\n />\n </div>\n );\n}\n\nfunction PaginatedDataGridHarness(props: { stickyTop?: number | string } = {}) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"paginated\"\n fillHeight={false}\n stickyTop={props.stickyTop}\n />\n </div>\n );\n}\n\nfunction InteractiveDataGridHarness(props: {\n onSortChange?: DataGridProps<Row>[\"onSortChange\"],\n onSelectionChange?: DataGridProps<Row>[\"onSelectionChange\"],\n}) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n selectionMode=\"multiple\"\n onSortChange={props.onSortChange}\n onSelectionChange={props.onSelectionChange}\n />\n );\n}\n\nfunction WideDataGridHarness(props: {\n horizontalScrollbarPosition?: \"top\" | \"bottom\",\n} = {}) {\n const [state, setState] = useState(() => createDefaultDataGridState(wideColumns));\n\n return (\n <div style={{ width: 320 }}>\n <DataGrid<Row>\n columns={wideColumns}\n rows={[{ id: \"row-1\", name: \"Row 1\" }]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n horizontalScrollbarPosition={props.horizontalScrollbarPosition}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"observes against the grid body when the grid owns vertical scrolling\", async () => {\n const { container } = render(<DataGridHarness fillHeight />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n // Regression: an infinite grid left unbounded (`fillHeight={false}`, no `maxHeight`) used to\n // grow its scroll container to fit every loaded row, which defeats virtualization (the\n // virtualizer measures the container as fully visible and mounts every row) and OOMs the tab on\n // large datasets. Such grids now fall back to a default `maxHeight`, so the grid owns its own\n // bounded scroll container and observes against it rather than the viewport.\n it(\"bounds an unbounded infinite grid and observes against its own scroll container\", async () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n await waitFor(() => {\n expect(intersectionObserverRecords.length).toBeGreaterThan(0);\n });\n\n const grid = container.querySelector('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n const scrollContainer = grid?.children.item(1);\n\n expect(intersectionObserverRecords.at(-1)?.options?.root).toBe(scrollContainer);\n });\n\n it(\"applies a default maxHeight to an otherwise-unbounded infinite grid\", () => {\n const { container } = render(<DataGridHarness fillHeight={false} />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"calc(100dvh - 16rem)\");\n });\n\n it(\"does not force a maxHeight onto a paginated grid\", () => {\n const { container } = render(<PaginatedDataGridHarness />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid).not.toBeNull();\n expect(grid?.style.maxHeight).toBe(\"\");\n });\n\n it(\"writes an explicit sticky offset to the grid contract\", () => {\n const { container } = render(<PaginatedDataGridHarness stickyTop={0} />);\n\n const grid = container.querySelector<HTMLElement>('[role=\"grid\"]');\n expect(grid?.style.getPropertyValue(\"--data-grid-sticky-top\")).toBe(\"0px\");\n });\n});\n\n// Drives a real `useDataSource` infinite-scroll grid whose data source\n// always reports `hasMore: true`, mirroring a project with a long\n// transaction / customer history (e.g. the transactions table and customers\n// tab). Used to prove the sentinel doesn't thrash its IntersectionObserver.\nfunction InfiniteScrollLoadMoreHarness({ onFetch }: { onFetch: () => void }) {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n const dataSource = useMemo<DataGridDataSource<Row>>(\n () => {\n let page = 0;\n return async function* () {\n onFetch();\n const current = page++;\n yield {\n rows: [{ id: `row-${current}`, name: `Row ${current}` }],\n hasMore: true,\n nextCursor: `cursor-${current}`,\n };\n };\n },\n [onFetch],\n );\n\n const gridData = useDataSource<Row>({\n dataSource,\n columns,\n getRowId: (row) => row.id,\n sorting: state.sorting,\n quickSearch: state.quickSearch,\n pagination: state.pagination,\n paginationMode: \"infinite\",\n });\n\n return (\n <div style={{ height: 400 }}>\n <DataGrid<Row>\n columns={columns}\n rows={gridData.rows}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n paginationMode=\"infinite\"\n hasMore={gridData.hasMore}\n isLoading={gridData.isLoading}\n isLoadingMore={gridData.isLoadingMore}\n onLoadMore={gridData.loadMore}\n />\n </div>\n );\n}\n\ndescribe(\"DataGrid infinite scroll observer stability\", () => {\n beforeEach(() => {\n intersectionObserverRecords = [];\n intersectionObserverInstances = [];\n\n vi.stubGlobal(\"IntersectionObserver\", MockIntersectionObserver);\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n // Regression: the sentinel used to re-create its IntersectionObserver every\n // time the `onLoadMore` callback changed identity (which happens on every\n // `isLoadingMore` / `hasMore` toggle). A freshly-created observer re-reports\n // the sentinel's current intersection state, so a sentinel that stays in\n // view fires `onLoadMore` again after every page — auto-loading the entire\n // history back-to-back and OOM-crashing the tab (\"Aw snap\") on large\n // datasets. The observer must stay stable across load-more cycles.\n it(\"does not re-create the observer on load-more cycles\", async () => {\n const onFetch = vi.fn();\n render(<InfiniteScrollLoadMoreHarness onFetch={onFetch} />);\n\n // Initial page load, after which the sentinel (and its observer) mounts.\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(1));\n await waitFor(() => expect(intersectionObserverInstances.length).toBeGreaterThan(0));\n\n const observersBeforeLoadMore = intersectionObserverInstances.length;\n\n // Simulate the sentinel scrolling into view exactly once.\n await act(async () => {\n intersectionObserverInstances.at(-1)?.trigger();\n await Promise.resolve();\n });\n\n await waitFor(() => expect(onFetch).toHaveBeenCalledTimes(2));\n\n // A single scroll-in must trigger a single fetch, without spawning new\n // observers — otherwise each new observer would re-fire and runaway.\n expect(intersectionObserverInstances.length).toBe(observersBeforeLoadMore);\n });\n});\n\ndescribe(\"DataGrid controlled callbacks\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"fires onSortChange from the current controlled sort state\", () => {\n const onSortChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSortChange={onSortChange} />);\n\n fireEvent.click(getByRole(\"columnheader\", { name: /name/i }));\n\n expect(onSortChange).toHaveBeenCalledTimes(1);\n expect(onSortChange).toHaveBeenCalledWith([{ columnId: \"name\", direction: \"asc\" }]);\n });\n\n it(\"fires onSelectionChange when selecting all rows\", () => {\n const onSelectionChange = vi.fn();\n const { getByRole } = render(<InteractiveDataGridHarness onSelectionChange={onSelectionChange} />);\n\n fireEvent.click(getByRole(\"checkbox\", { name: /select all rows/i }));\n\n expect(onSelectionChange).toHaveBeenCalledTimes(1);\n const [selectedIds, selectedRows] = onSelectionChange.mock.calls[0];\n expect([...selectedIds]).toEqual([\"row-1\"]);\n expect(selectedRows).toEqual([{ id: \"row-1\", name: \"Row 1\" }]);\n });\n\n it(\"identifies nested interactive controls as row-click blockers\", () => {\n const cell = document.createElement(\"div\");\n const button = document.createElement(\"button\");\n const label = document.createElement(\"span\");\n label.textContent = \"Open menu\";\n button.append(label);\n cell.append(button);\n\n expect(isDataGridInteractiveRowClickTarget(label.firstChild)).toBe(true);\n expect(isDataGridInteractiveRowClickTarget(cell)).toBe(false);\n });\n});\n\ndescribe(\"DataGrid horizontal scrolling\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n Object.defineProperty(HTMLElement.prototype, \"clientWidth\", {\n configurable: true,\n get() {\n return 320;\n },\n });\n vi.spyOn(HTMLElement.prototype, \"getBoundingClientRect\").mockImplementation(\n function getBoundingClientRect() {\n return {\n x: 0,\n y: 0,\n width: 320,\n height: 44,\n top: 0,\n left: 0,\n right: 320,\n bottom: 44,\n toJSON() {\n return this;\n },\n } as DOMRect;\n },\n );\n Object.defineProperty(HTMLElement.prototype, \"clientHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n Object.defineProperty(HTMLElement.prototype, \"scrollHeight\", {\n configurable: true,\n get() {\n return 400;\n },\n });\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"sizes the sticky clipping layer to the full row width\", () => {\n const { container } = render(<WideDataGridHarness />);\n\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n\n expect(rowsClip).toBeInstanceOf(HTMLElement);\n expect((rowsClip as HTMLElement).style.minWidth).toBe(\"740px\");\n });\n\n it(\"lets the columns popover escape the sticky toolbar bounds\", () => {\n const { container, getByTitle } = render(<WideDataGridHarness />);\n\n fireEvent.click(getByTitle(\"Columns\"));\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n expect((stickyChrome as HTMLElement).className).toContain(\"overflow-visible\");\n expect(container.textContent).toContain(\"Email\");\n });\n\n it(\"puts the horizontal scrollbar under the column headers when position is top\", () => {\n const { container } = render(<WideDataGridHarness horizontalScrollbarPosition=\"top\" />);\n\n const stickyChrome = container.querySelector('[role=\"grid\"]')?.firstElementChild;\n expect(stickyChrome).toBeInstanceOf(HTMLElement);\n const headerScroll = stickyChrome?.querySelector(\".overflow-x-auto\");\n expect(headerScroll).toBeInstanceOf(HTMLElement);\n\n const bodyScroll = container.querySelector('[role=\"grid\"]')?.children.item(1);\n expect(bodyScroll).toBeInstanceOf(HTMLElement);\n expect((bodyScroll as HTMLElement).className).toContain(\"overflow-x-hidden\");\n expect((bodyScroll as HTMLElement).className).toContain(\"overflow-y-auto\");\n\n Object.defineProperty(headerScroll as HTMLElement, \"scrollLeft\", {\n configurable: true,\n writable: true,\n value: 0,\n });\n Object.defineProperty(bodyScroll as HTMLElement, \"scrollLeft\", {\n configurable: true,\n writable: true,\n value: 0,\n });\n\n (headerScroll as HTMLElement).scrollLeft = 120;\n fireEvent.scroll(headerScroll as HTMLElement);\n expect((bodyScroll as HTMLElement).scrollLeft).toBe(120);\n });\n});\n\ndescribe(\"DataGrid loading skeleton\", () => {\n beforeEach(() => {\n vi.stubGlobal(\"ResizeObserver\", MockResizeObserver);\n });\n\n afterEach(() => {\n cleanup();\n vi.restoreAllMocks();\n vi.unstubAllGlobals();\n });\n\n it(\"shows a full-width shimmer when loading before any columns are known\", () => {\n function SchemaPendingHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState([]));\n return (\n <DataGrid<Row>\n columns={[]}\n rows={[]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n isLoading\n />\n );\n }\n\n const { container } = render(<SchemaPendingHarness />);\n\n const skeleton = container.querySelector(\"[data-data-grid-schema-pending-skeleton]\");\n expect(skeleton).toBeInstanceOf(HTMLElement);\n // Five placeholder columns × 10 rows → visible shimmer cells, not an empty pane.\n expect(skeleton?.querySelectorAll(\"[role='row']\").length).toBe(10);\n });\n\n it(\"uses per-column skeleton rows once the schema is known\", () => {\n function KnownSchemaHarness() {\n const [state, setState] = useState(() => createDefaultDataGridState(columns));\n return (\n <DataGrid<Row>\n columns={columns}\n rows={[]}\n getRowId={(row) => row.id}\n state={state}\n onChange={setState}\n isLoading\n />\n );\n }\n\n const { container } = render(<KnownSchemaHarness />);\n\n expect(container.querySelector(\"[data-data-grid-schema-pending-skeleton]\")).toBeNull();\n const rowsClip = container.querySelector(\"[data-data-grid-rows-clip]\");\n expect(rowsClip?.querySelectorAll(\"[role='row']\").length).toBe(8);\n });\n});\n"],"mappings":"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"}
@@ -7879,6 +7879,7 @@ attempted value: ${formattedValue}
7879
7879
  var allProviderTypes = [...standardProviders, "custom_oidc"];
7880
7880
 
7881
7881
  // ../shared/dist/esm/utils/uuids.js
7882
+ var uuidV7RandomMask = (1n << 74n) - 1n;
7882
7883
  function isUuid(str) {
7883
7884
  return /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(str);
7884
7885
  }
@@ -40319,11 +40320,14 @@ ${colorConfig.map(([key, itemConfig]) => {
40319
40320
  }, [visibleColumns, columnSizes, selectionMode]);
40320
40321
  const cssVars = (0, import_react155.useMemo)(() => {
40321
40322
  const vars = { "--grid-total-w": `${totalContentWidth}px` };
40323
+ if (stickyTop != null) {
40324
+ vars["--data-grid-sticky-top"] = typeof stickyTop === "number" ? `${stickyTop}px` : stickyTop;
40325
+ }
40322
40326
  for (const col of visibleColumns) {
40323
40327
  vars[`--col-${col.id}-size`] = columnSizes[col.id];
40324
40328
  }
40325
40329
  return vars;
40326
- }, [visibleColumns, columnSizes, totalContentWidth]);
40330
+ }, [stickyTop, visibleColumns, columnSizes, totalContentWidth]);
40327
40331
  const fireSelection = (0, import_react155.useCallback)(
40328
40332
  (next) => {
40329
40333
  onChange((s8) => ({ ...s8, selection: next }));
@@ -40391,6 +40395,7 @@ ${colorConfig.map(([key, itemConfig]) => {
40391
40395
  clipEl.style.setProperty("--data-grid-sticky-overlap", `${overlap}px`);
40392
40396
  };
40393
40397
  updateClip();
40398
+ const frame = requestAnimationFrame(updateClip);
40394
40399
  bodyEl.addEventListener("scroll", updateClip);
40395
40400
  window.addEventListener("scroll", updateClip, true);
40396
40401
  window.addEventListener("resize", updateClip);
@@ -40402,9 +40407,10 @@ ${colorConfig.map(([key, itemConfig]) => {
40402
40407
  bodyEl.removeEventListener("scroll", updateClip);
40403
40408
  window.removeEventListener("scroll", updateClip, true);
40404
40409
  window.removeEventListener("resize", updateClip);
40410
+ cancelAnimationFrame(frame);
40405
40411
  observer.disconnect();
40406
40412
  };
40407
- }, []);
40413
+ }, [isLoading, rows.length, totalRowCount, visibleColumns.length]);
40408
40414
  const isSyncingHorizontalScrollRef = (0, import_react155.useRef)(false);
40409
40415
  const syncHorizontalScroll = (0, import_react155.useCallback)((source) => {
40410
40416
  const body = scrollContainerRef.current;