@hexclave/dashboard-ui-components 1.0.53 → 1.0.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/data-grid/data-grid-export-dialog.d.ts +1 -1
- package/dist/components/data-grid/data-grid-sizing.d.ts +1 -1
- package/dist/components/data-grid/data-grid-toolbar.d.ts +1 -1
- package/dist/components/data-grid/data-grid-toolbar.js +37 -29
- package/dist/components/data-grid/data-grid-toolbar.js.map +1 -1
- package/dist/components/data-grid/data-grid.d.ts +1 -1
- package/dist/components/data-grid/data-grid.js +96 -12
- package/dist/components/data-grid/data-grid.js.map +1 -1
- package/dist/components/data-grid/data-grid.test.js +101 -2
- package/dist/components/data-grid/data-grid.test.js.map +1 -1
- package/dist/components/data-grid/index.d.ts +8 -8
- package/dist/components/data-grid/state.d.ts +1 -1
- package/dist/components/data-grid/strings.d.ts +1 -1
- package/dist/components/data-grid/types.d.ts +1 -1
- package/dist/components/data-grid/use-data-source.d.ts +1 -1
- package/dist/components/data-grid/use-url-state.d.ts +1 -1
- package/dist/dashboard-ui-components.global.js +21283 -4277
- package/dist/dashboard-ui-components.global.js.map +4 -4
- package/dist/{data-grid-AJi1TNDa.d.ts → data-grid-DWHAjaNo.d.ts} +2 -2
- package/dist/data-grid-DWHAjaNo.d.ts.map +1 -0
- package/dist/{data-grid-sizing-S1ixcZKo.d.ts → data-grid-sizing-D9y1xwaq.d.ts} +2 -2
- package/dist/{data-grid-sizing-S1ixcZKo.d.ts.map → data-grid-sizing-D9y1xwaq.d.ts.map} +1 -1
- package/dist/{data-grid-toolbar-BGSNGDpT.d.ts → data-grid-toolbar-dgvnYEpC.d.ts} +10 -6
- package/dist/data-grid-toolbar-dgvnYEpC.d.ts.map +1 -0
- package/dist/esm/components/data-grid/data-grid-toolbar.d.ts +8 -4
- package/dist/esm/components/data-grid/data-grid-toolbar.d.ts.map +1 -1
- package/dist/esm/components/data-grid/data-grid-toolbar.js +38 -30
- package/dist/esm/components/data-grid/data-grid-toolbar.js.map +1 -1
- package/dist/esm/components/data-grid/data-grid.d.ts.map +1 -1
- package/dist/esm/components/data-grid/data-grid.js +96 -12
- package/dist/esm/components/data-grid/data-grid.js.map +1 -1
- package/dist/esm/components/data-grid/data-grid.test.js +102 -3
- package/dist/esm/components/data-grid/data-grid.test.js.map +1 -1
- package/dist/esm/components/data-grid/types.d.ts +7 -0
- package/dist/esm/components/data-grid/types.d.ts.map +1 -1
- package/dist/esm/package.json +12 -0
- package/dist/index.d.ts +8 -8
- package/dist/{state-6LW8ACh5.d.ts → state-D5wpAg_G.d.ts} +2 -2
- package/dist/{state-6LW8ACh5.d.ts.map → state-D5wpAg_G.d.ts.map} +1 -1
- package/dist/{strings-CACVtKlq.d.ts → strings-DsIJ_o4-.d.ts} +2 -2
- package/dist/{strings-CACVtKlq.d.ts.map → strings-DsIJ_o4-.d.ts.map} +1 -1
- package/dist/{types-1-eOd1JF.d.ts → types-D8o47V7M.d.ts} +8 -1
- package/dist/{types-1-eOd1JF.d.ts.map → types-D8o47V7M.d.ts.map} +1 -1
- package/dist/{use-data-source-BVFynerX.d.ts → use-data-source-CAZPhl8e.d.ts} +2 -2
- package/dist/{use-data-source-BVFynerX.d.ts.map → use-data-source-CAZPhl8e.d.ts.map} +1 -1
- package/dist/{use-url-state-B4_wnBjm.d.ts → use-url-state-97YdV81Q.d.ts} +2 -2
- package/dist/{use-url-state-B4_wnBjm.d.ts.map → use-url-state-97YdV81Q.d.ts.map} +1 -1
- package/package.json +3 -3
- package/src/components/data-grid/data-grid-toolbar.tsx +20 -6
- package/src/components/data-grid/data-grid.test.tsx +127 -1
- package/src/components/data-grid/data-grid.tsx +174 -37
- package/src/components/data-grid/types.ts +7 -0
- package/dist/data-grid-AJi1TNDa.d.ts.map +0 -1
- package/dist/data-grid-toolbar-BGSNGDpT.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-grid.test.js","names":[],"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 DataGrid,\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\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() {\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 />\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-grid.test.js","names":[],"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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"}
|
|
@@ -239,6 +239,13 @@ type DataGridProps<TRow> = {
|
|
|
239
239
|
*/
|
|
240
240
|
fillHeight?: boolean; /** Top offset for the sticky toolbar + header (px or CSS string). */
|
|
241
241
|
stickyTop?: number | string;
|
|
242
|
+
/**
|
|
243
|
+
* Where the horizontal scrollbar is shown when columns overflow.
|
|
244
|
+
* - `"bottom"` (default): on the row scrollport, under the last visible rows.
|
|
245
|
+
* - `"top"`: under the column headers (top of the table body), so wide
|
|
246
|
+
* tables stay reachable without scrolling to the bottom first.
|
|
247
|
+
*/
|
|
248
|
+
horizontalScrollbarPosition?: "top" | "bottom";
|
|
242
249
|
} & DataGridCallbacks<TRow> & {
|
|
243
250
|
/** Custom toolbar renderer. When `false`, toolbar is hidden entirely. */toolbar?: false | ((ctx: DataGridToolbarContext<TRow>) => ReactNode);
|
|
244
251
|
/** Extra content rendered inside the default toolbar row, to the left of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/components/data-grid/types.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../../src/components/data-grid/types.ts"],"mappings":";;;;;KAKY,KAAA;AAAA,KAGA,kBAAA;AAAA,KASA,mBAAA;AAAA,KAEA,iBAAA;AAdK;AAGjB;;AAHiB,KAmBL,mBAAA;;AAhBkB;AAS9B;KAYY,kBAAA;EACV,QAAA,IAAY,IAAA,EAAM,IAAA;EAClB,QAAA,IAAY,IAAA,EAAM,IAAI;AAAA;AAZxB;AAAA,KAgBY,mBAAA;EACV,GAAA,EAAK,IAAA;EACL,KAAA,EAAO,KAAA;EACP,QAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EAjB6B;AAAA;AAK/B;EAgBE,WAAA,EAAa,mBAAA;AAAA;;KAIH,qBAAA;EACV,QAAA;EACA,SAAA,EAAW,iBAAiB,CAAC,IAAA;EAC7B,QAAA;EACA,SAAA;AAAA;;KAIU,iBAAA;EAtBA,yCAwBV,EAAA,UAxB6B;EA2B7B,MAAA,aAAmB,GAAA,EAAK,qBAAA,CAAsB,IAAA,MAAU,SAAA;EAzBjD;;EA6BP,QAAA,SAAiB,IAAA,KAAS,GAAA,EAAK,IAAA,eArBC;EAwBhC,UAAA,IAAc,GAAA,EAAK,mBAAA,CAAoB,IAAA,MAAU,SAAA,EAjCjD;EAqCA,KAAA,WApCA;EAsCA,QAAA,WArCA;EAuCA,QAAA;EArCA;;EAwCA,IAAA;EAGA,QAAA;EACA,SAAA;EACA,QAAA,YApCU;EAsCV,GAAA,GAAM,iBAAA;EAGN,KAAA,GAAQ,mBAAA,EAvCoB;EAyC5B,IAAA,GAAO,kBAAA,EA1CP;EA4CA,YAAA,YAAwB,oBAAA;EA3Cb;;;;;EAmDX,YAAA;EA7CU;;EAkDV,cAAA,IAAkB,CAAA,WAAY,CAAA;EA7CgB;;EAgD9C,WAAA,IAAe,KAAA,WAAgB,GAAA,EAAK,IAAA;EA5CnB;;;;EAmDjB,UAAA,IAAc,KAAA,cAAmB,IAAA,SA9B3B;EAgCN,UAAA,GAAa,kBAAA,EA3BN;EA+BP,WAAA,IAAe,GAAA,EAAK,mBAAA,CAAoB,IAAA,GAAO,KAAA,EAAO,KAAA,CAAM,UAAA,WAbxB;EAepC,iBAAA,IAAqB,GAAA,EAAK,mBAAA,CAAoB,IAAA,GAAO,KAAA,EAAO,KAAA,CAAM,UAAA;AAAA;AAAA,KAGxD,oBAAA;EACV,KAAA;EACA,KAAK;AAAA;AAAA,KAIK,gBAAA;EACV,QAAA;EACA,SAAS;AAAA;AAAA,KAEC,iBAAA,YAA6B,gBAAgB;AAAA,KAG7C,qBAAA;AAAA,KAEA,sBAAA;EACV,WAAA,EAAa,WAAA,CAAY,KAAA,GAlFqB;EAoF9C,QAAA,EAAU,KAAA;AAAA;AAAA,KAIA,wBAAA,GAA2B,MAAM;AAAA,KAEjC,qBAAA;EACV,IAAA;EACA,KAAK;AAAA;;KAKK,sBAAA;;KAGA,0BAAA;AAAA,KAEA,uBAAA;EACV,SAAA;EACA,QAAQ;AAAA;AAAA,KAIE,aAAA;EACV,OAAA,EAAS,iBAAA;EACT,gBAAA,EAAkB,wBAAA;EAClB,YAAA,EAAc,MAAA;EACd,aAAA,EAAe,qBAAA;EACf,WAAA;EACA,UAAA,EAAY,uBAAA;EACZ,SAAA,EAAW,sBAAA;EArFJ;;;EAyFP,WAAA,EAAa,mBAAA;EA1Eb;;;;;;EAiFA,WAAA;AAAA;;KAKU,mBAAA;EACV,OAAA,EAAS,iBAAA;EACT,UAAA,EAAY,uBAAuB;EAxEnC;;;;EA6EA,WAAA,UA7E4D;EA+E5D,MAAA;AAAA;;KAIU,mBAAA;EACV,IAAA,EAAM,IAAI,IAlFkD;EAoF5D,aAAA,WApFqD;EAsFrD,UAAA,YAtF4E;EAwF5E,OAAA;AAAA;;;AAnFK;KAyFK,kBAAA,UACV,MAAA,EAAQ,mBAAA,KACL,cAAA,CAAe,mBAAA,CAAoB,IAAA;AAAA,KAG5B,oBAAA;AAAA,KAEA,mBAAA;AAAA,KAEA,mBAAA;EACV,GAAA;EACA,KAAA;EACA,OAAA;EACA,QAAA,GAAW,GAAA,EAAK,IAAI;AAAA;AAAA,KAGV,yBAAA;EACV,KAAA,EAAO,mBAAmB;EAC1B,UAAA,GAAa,OAAA;AAAA;AAAA,KAGH,qBAAA;EACV,KAAA;EACA,WAAA,GAAc,SAAA;EACd,UAAA;EACA,gBAAA;EACA,cAAA;EACA,MAAA,YAAkB,mBAAA,CAAoB,IAAA;EACtC,SAAA,IAAa,OAAA,EAAS,yBAAA,KAA8B,OAAA,UAAiB,IAAA;EACrE,gBAAA;EACA,sBAAA;EACA,aAAA,GAAgB,SAAA;EAChB,kBAAA,GAAqB,SAAA;EACrB,oBAAA,WA1GA;EA4GA,YAAA,GAAe,mBAAA;AAAA;AAAA,KAIL,iBAAA;EACV,UAAA,IAAc,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,UAAA;EACpD,gBAAA,IAAoB,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,UAAA;EAC1D,WAAA,IAAe,GAAA,EAAK,IAAA,EAAM,QAAA,UAAkB,KAAA,WAAgB,KAAA,EAAO,KAAA,CAAM,UAAA;EA/G9B;AAAA;AAE7C;;;;AAEO;AAKP;EA+GE,iBAAA,IAAqB,WAAA,EAAa,WAAA,CAAY,KAAA,GAAQ,YAAA,EAAc,IAAA;EACpE,YAAA,IAAgB,KAAA,EAAO,iBAAA;EACvB,cAAA,IAAkB,QAAA,UAAkB,KAAA;EACpC,wBAAA,IAA4B,KAAA,EAAO,wBAAA;AAAA;AAAA,KAIzB,aAAA;4BAEV,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EArHA;AAEtC;EAwHE,IAAA,WAAe,IAAA;EAEf,QAAA,GAAW,GAAA,EAAK,IAAA,KAAS,KAAA,EAxHjB;EA0HR,aAAA,WAtHuB;EAwHvB,SAAA,YAvHS;EAyHT,YAAA,YAvHc;EA2Hd,OAAA,YAxHY;EA0HZ,aAAA,YArHa;EAuHb,UAAA;EAGA,KAAA,EAAO,aAAA;EACP,QAAA,EAAU,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,aAAA;EArIrC;;;EA2IT,cAAA,6BAzIc;EA2Id,aAAA,GAAgB,qBAAA,EA1ID;EA4If,SAAA;EA1IA;;;;;;;;AAYW;AAKb;EAsIE,SAAA;;;;;EAKA,kBAAA,WAzIY;EA2IZ,YAAA,WApIA;EAsIA,QAAA,WAtIM;EAwIN,SAAA;EApI6B;;;;;EA0I7B,UAAA,YAvIA;EAyIA,SAAA;EArIA;;AAAO;AAMT;;;EAsIE,2BAAA;AAAA,IAGE,iBAAA,CAAkB,IAAA;EAvIF,yEA0IlB,OAAA,aAAoB,GAAA,EAAK,sBAAA,CAAuB,IAAA,MAAU,SAAA;EA1IzC;;;;;EAgJjB,YAAA,GAAe,SAAA,KAAc,GAAA,EAAK,sBAAA,CAAuB,IAAA,MAAU,SAAA,GAhJjD;EAkJlB,UAAA,GAAa,SAAA,EAlJ6B;EAoJ1C,YAAA,GAAe,SAAA,EAjJL;EAmJV,MAAA,aAAmB,GAAA,EAAK,qBAAA,CAAsB,IAAA,MAAU,SAAA;EAExD,WAAA,GAAc,SAAA,KAAc,GAAA,EAAK,qBAAA,CAAsB,IAAA,MAAU,SAAA,GArJnC;EAwJ9B,cAAA;EAtJ6B;;EAyJ7B,aAAA,GAAgB,qBAAA,CAAsB,IAAA,GAzJT;EA2J7B,OAAA,GAAU,OAAA,CAAQ,eAAA;EAElB,SAAA;AAAA;AAAA,KAIU,sBAAA;EACV,KAAA,EAAO,aAAA;EACP,QAAA,EAAU,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,aAAA;EAC9C,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EACpC,cAAA,WAAyB,iBAAA,CAAkB,IAAA;EAC3C,aAAA;EACA,gBAAA;EACA,OAAA,EAAS,eAAA,EAlKW;EAoKpB,SAAA;AAAA;AAAA,KAGU,qBAAA;EACV,KAAA,EAAO,aAAA;EACP,aAAA;EACA,eAAA;EACA,gBAAA;EACA,cAAA,EAAgB,sBAAA;EAChB,OAAA,EAAS,eAAA;AAAA;AAAA,KAIC,eAAA;EAEV,iBAAA;EACA,OAAA;EACA,MAAA;EACA,OAAA;EAEA,OAAA;EACA,OAAA;EACA,YAAA;EAEA,UAAA;EACA,kBAAA;EACA,kBAAA;EAEA,YAAA,GAAe,KAAA;EAEf,WAAA;EACA,MAAA,GAAS,IAAA,UAAc,KAAA;EAEvB,MAAA;EACA,OAAA;EACA,WAAA;EAEA,SAAA;EACA,YAAA;EAEA,OAAA;EACA,QAAA;EACA,MAAA;EAEA,OAAA;EACA,QAAA;EACA,KAAA;EACA,UAAA;AAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -15,14 +15,14 @@ import { DesignChartLegendContent } from "./components/chart-legend.js";
|
|
|
15
15
|
import { DESIGN_CHART_AXIS_TICK_STYLE, DESIGN_CHART_COLORS, DESIGN_CHART_GRID_COLOR, DesignChartColorEntry, DesignChartColorName, getDesignChartColor } from "./components/chart-theme.js";
|
|
16
16
|
import { DesignChartTooltip, DesignChartTooltipContent } from "./components/chart-tooltip.js";
|
|
17
17
|
import { CursorBlastEffect, CursorBlastEffectProps } from "./components/cursor-blast-effect.js";
|
|
18
|
-
import { A as DataGridState, C as DataGridPaginationModel, D as DataGridSelectionModel, E as DataGridSelectionMode, M as DataGridToolbarContext, N as RowId, O as DataGridSortItem, S as DataGridPaginationMode, T as DataGridSelectOption, _ as DataGridExportScope, a as DataGridColumnPin, b as DataGridFooterContext, c as DataGridColumnVisibility, d as DataGridDateDisplay, f as DataGridDateFormat, g as DataGridExportRowsOptions, h as DataGridExportOptions, i as DataGridColumnDef, j as DataGridStrings, k as DataGridSortModel, l as DataGridDataPaginationMode, m as DataGridExportFormat, n as DataGridCellContext, o as DataGridColumnPinning, p as DataGridExportField, r as DataGridColumnAlign, s as DataGridColumnType, t as DataGridCallbacks, u as DataGridDataSource, v as DataGridFetchParams, w as DataGridProps, x as DataGridHeaderContext, y as DataGridFetchResult } from "./types-
|
|
19
|
-
import { a as getEffectiveMinWidth, i as getEffectiveMaxWidth, n as DEFAULT_MAX_COL_WIDTH, r as clampColumnWidth, t as DEFAULT_COL_WIDTH } from "./data-grid-sizing-
|
|
20
|
-
import { t as DataGridToolbar } from "./data-grid-toolbar-
|
|
21
|
-
import { n as isDataGridInteractiveRowClickTarget, t as DataGrid } from "./data-grid-
|
|
22
|
-
import { n as useDataSource, t as UseDataSourceResult } from "./use-data-source-
|
|
23
|
-
import { t as useDataGridUrlState } from "./use-url-state-
|
|
24
|
-
import { a as defaultFormatRelative, c as exportToCsv, d as resolveColumnValue, i as defaultFormatAbsolute, l as formatGridDate, n as buildRowComparator, o as defaultMatchRow, r as createDefaultDataGridState, s as defaultParseDate, t as applyQuickSearch, u as paginateRows } from "./state-
|
|
25
|
-
import { n as resolveDataGridStrings, t as DATA_GRID_DEFAULT_STRINGS } from "./strings-
|
|
18
|
+
import { A as DataGridState, C as DataGridPaginationModel, D as DataGridSelectionModel, E as DataGridSelectionMode, M as DataGridToolbarContext, N as RowId, O as DataGridSortItem, S as DataGridPaginationMode, T as DataGridSelectOption, _ as DataGridExportScope, a as DataGridColumnPin, b as DataGridFooterContext, c as DataGridColumnVisibility, d as DataGridDateDisplay, f as DataGridDateFormat, g as DataGridExportRowsOptions, h as DataGridExportOptions, i as DataGridColumnDef, j as DataGridStrings, k as DataGridSortModel, l as DataGridDataPaginationMode, m as DataGridExportFormat, n as DataGridCellContext, o as DataGridColumnPinning, p as DataGridExportField, r as DataGridColumnAlign, s as DataGridColumnType, t as DataGridCallbacks, u as DataGridDataSource, v as DataGridFetchParams, w as DataGridProps, x as DataGridHeaderContext, y as DataGridFetchResult } from "./types-D8o47V7M.js";
|
|
19
|
+
import { a as getEffectiveMinWidth, i as getEffectiveMaxWidth, n as DEFAULT_MAX_COL_WIDTH, r as clampColumnWidth, t as DEFAULT_COL_WIDTH } from "./data-grid-sizing-D9y1xwaq.js";
|
|
20
|
+
import { t as DataGridToolbar } from "./data-grid-toolbar-dgvnYEpC.js";
|
|
21
|
+
import { n as isDataGridInteractiveRowClickTarget, t as DataGrid } from "./data-grid-DWHAjaNo.js";
|
|
22
|
+
import { n as useDataSource, t as UseDataSourceResult } from "./use-data-source-CAZPhl8e.js";
|
|
23
|
+
import { t as useDataGridUrlState } from "./use-url-state-97YdV81Q.js";
|
|
24
|
+
import { a as defaultFormatRelative, c as exportToCsv, d as resolveColumnValue, i as defaultFormatAbsolute, l as formatGridDate, n as buildRowComparator, o as defaultMatchRow, r as createDefaultDataGridState, s as defaultParseDate, t as applyQuickSearch, u as paginateRows } from "./state-D5wpAg_G.js";
|
|
25
|
+
import { n as resolveDataGridStrings, t as DATA_GRID_DEFAULT_STRINGS } from "./strings-DsIJ_o4-.js";
|
|
26
26
|
import { a as DesignDialogRoot, c as DesignDialogTrigger, d as designDialogGlassmorphicSurfaceClass, i as DesignDialogProps, l as DesignDialogVariant, n as DesignDialogClose, o as DesignDialogSize, r as DesignDialogDescription, s as DesignDialogTitle, t as DesignDialog, u as designDialogGlassmorphicOverlayClass } from "./dialog-CCtTH7s6.js";
|
|
27
27
|
import { DesignEditMode, useDesignEditMode } from "./components/edit-mode.js";
|
|
28
28
|
import { DesignEmptyState, DesignEmptyStateProps } from "./components/empty-state.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as DataGridState, C as DataGridPaginationModel, d as DataGridDateDisplay, f as DataGridDateFormat, i as DataGridColumnDef, k as DataGridSortModel } from "./types-
|
|
1
|
+
import { A as DataGridState, C as DataGridPaginationModel, d as DataGridDateDisplay, f as DataGridDateFormat, i as DataGridColumnDef, k as DataGridSortModel } from "./types-D8o47V7M.js";
|
|
2
2
|
|
|
3
3
|
//#region src/components/data-grid/state.d.ts
|
|
4
4
|
/**
|
|
@@ -31,4 +31,4 @@ declare function formatGridDate(value: unknown, mode: DataGridDateDisplay, opts?
|
|
|
31
31
|
declare function exportToCsv<TRow>(rows: readonly TRow[], columns: readonly DataGridColumnDef<TRow>[], filename: string): void;
|
|
32
32
|
//#endregion
|
|
33
33
|
export { defaultFormatRelative as a, exportToCsv as c, resolveColumnValue as d, defaultFormatAbsolute as i, formatGridDate as l, buildRowComparator as n, defaultMatchRow as o, createDefaultDataGridState as r, defaultParseDate as s, applyQuickSearch as t, paginateRows as u };
|
|
34
|
-
//# sourceMappingURL=state-
|
|
34
|
+
//# sourceMappingURL=state-D5wpAg_G.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-
|
|
1
|
+
{"version":3,"file":"state-D5wpAg_G.d.ts","names":[],"sources":["../src/components/data-grid/state.ts"],"mappings":";;;;;AAqBA;;;;;;;;iBAAgB,0BAAA,CACd,OAAA,WAAkB,iBAAA,UACjB,aAAa;AAAA,iBAwBA,kBAAA,OACd,GAAA,EAAK,iBAAA,CAAkB,IAAA,GACvB,GAAA,EAAK,IAAA;AAAA,iBAkBS,kBAAA,OACd,SAAA,EAAW,iBAAA,EACX,OAAA,WAAkB,iBAAA,CAAkB,IAAA,QACjC,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA;AAAA,iBAkBD,YAAA,OACd,IAAA,WAAe,IAAA,IACf,UAAA,EAAY,uBAAA,GACX,IAAA;;iBAQa,eAAA,OACd,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;AAAA,iBAUtB,gBAAA,OACd,IAAA,WAAe,IAAA,IACf,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA,2BAE5B,IAAA;AAAA,iBAQI,gBAAA,CAAiB,KAAA,YAAiB,IAAI;AAAA,iBA+BtC,qBAAA,CAAsB,IAAU,EAAJ,IAAI;AAAA,iBAYhC,qBAAA,CAAsB,IAAU,EAAJ,IAAI;AAAA,iBAIhC,cAAA,CACd,KAAA,WACA,IAAA,EAAM,mBAAA,EACN,IAAA;EACE,UAAA,IAAc,KAAA,cAAmB,IAAA;EACjC,UAAA,GAAa,kBAAA;AAAA;EAEZ,OAAA;EAAwB,OAAA;AAAA;AAAA,iBAab,WAAA,OACd,IAAA,WAAe,IAAA,IACf,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,QAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { j as DataGridStrings } from "./types-
|
|
1
|
+
import { j as DataGridStrings } from "./types-D8o47V7M.js";
|
|
2
2
|
|
|
3
3
|
//#region src/components/data-grid/strings.d.ts
|
|
4
4
|
declare const DATA_GRID_DEFAULT_STRINGS: DataGridStrings;
|
|
5
5
|
declare function resolveDataGridStrings(override: Partial<DataGridStrings> | undefined): DataGridStrings;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { resolveDataGridStrings as n, DATA_GRID_DEFAULT_STRINGS as t };
|
|
8
|
-
//# sourceMappingURL=strings-
|
|
8
|
+
//# sourceMappingURL=strings-DsIJ_o4-.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"strings-
|
|
1
|
+
{"version":3,"file":"strings-DsIJ_o4-.d.ts","names":[],"sources":["../src/components/data-grid/strings.ts"],"mappings":";;;cAEa,yBAAA,EAA2B,eAmCvC;AAAA,iBAEe,sBAAA,CACd,QAAA,EAAU,OAAA,CAAQ,eAAA,gBACjB,eAAA"}
|
|
@@ -239,6 +239,13 @@ type DataGridProps<TRow> = {
|
|
|
239
239
|
*/
|
|
240
240
|
fillHeight?: boolean; /** Top offset for the sticky toolbar + header (px or CSS string). */
|
|
241
241
|
stickyTop?: number | string;
|
|
242
|
+
/**
|
|
243
|
+
* Where the horizontal scrollbar is shown when columns overflow.
|
|
244
|
+
* - `"bottom"` (default): on the row scrollport, under the last visible rows.
|
|
245
|
+
* - `"top"`: under the column headers (top of the table body), so wide
|
|
246
|
+
* tables stay reachable without scrolling to the bottom first.
|
|
247
|
+
*/
|
|
248
|
+
horizontalScrollbarPosition?: "top" | "bottom";
|
|
242
249
|
} & DataGridCallbacks<TRow> & {
|
|
243
250
|
/** Custom toolbar renderer. When `false`, toolbar is hidden entirely. */toolbar?: false | ((ctx: DataGridToolbarContext<TRow>) => ReactNode);
|
|
244
251
|
/** Extra content rendered inside the default toolbar row, to the left of
|
|
@@ -305,4 +312,4 @@ type DataGridStrings = {
|
|
|
305
312
|
};
|
|
306
313
|
//#endregion
|
|
307
314
|
export { DataGridState as A, DataGridPaginationModel as C, DataGridSelectionModel as D, DataGridSelectionMode as E, DataGridToolbarContext as M, RowId as N, DataGridSortItem as O, DataGridPaginationMode as S, DataGridSelectOption as T, DataGridExportScope as _, DataGridColumnPin as a, DataGridFooterContext as b, DataGridColumnVisibility as c, DataGridDateDisplay as d, DataGridDateFormat as f, DataGridExportRowsOptions as g, DataGridExportOptions as h, DataGridColumnDef as i, DataGridStrings as j, DataGridSortModel as k, DataGridDataPaginationMode as l, DataGridExportFormat as m, DataGridCellContext as n, DataGridColumnPinning as o, DataGridExportField as p, DataGridColumnAlign as r, DataGridColumnType as s, DataGridCallbacks as t, DataGridDataSource as u, DataGridFetchParams as v, DataGridProps as w, DataGridHeaderContext as x, DataGridFetchResult as y };
|
|
308
|
-
//# sourceMappingURL=types-
|
|
315
|
+
//# sourceMappingURL=types-D8o47V7M.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-D8o47V7M.d.ts","names":[],"sources":["../src/components/data-grid/types.ts"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as DataGridPaginationModel, N as RowId, i as DataGridColumnDef, k as DataGridSortModel, l as DataGridDataPaginationMode, u as DataGridDataSource } from "./types-
|
|
1
|
+
import { C as DataGridPaginationModel, N as RowId, i as DataGridColumnDef, k as DataGridSortModel, l as DataGridDataPaginationMode, u as DataGridDataSource } from "./types-D8o47V7M.js";
|
|
2
2
|
|
|
3
3
|
//#region src/components/data-grid/use-data-source.d.ts
|
|
4
4
|
type UseDataSourceResult<TRow> = {
|
|
@@ -82,4 +82,4 @@ declare function useDataSource<TRow>(opts: {
|
|
|
82
82
|
}): UseDataSourceResult<TRow>;
|
|
83
83
|
//#endregion
|
|
84
84
|
export { useDataSource as n, UseDataSourceResult as t };
|
|
85
|
-
//# sourceMappingURL=use-data-source-
|
|
85
|
+
//# sourceMappingURL=use-data-source-CAZPhl8e.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-data-source-
|
|
1
|
+
{"version":3,"file":"use-data-source-CAZPhl8e.d.ts","names":[],"sources":["../src/components/data-grid/use-data-source.ts"],"mappings":";;;KAkBY,mBAAA;4EAEV,IAAA,WAAe,IAAA,IAFc;EAI7B,aAAA,sBAkBY;EAhBZ,SAAA,WAJA;EAMA,YAAA,WAJA;EAMA,aAAA,WAFA;EAIA,QAAA;EAEA,OAAA,WAEA;EAAA,MAAA;EAMO;;AAAK;AAuYd;;EAvYE,KAAA,EAAO,KAAK;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwZc;;;iBAjBZ,aAAA,OAAoB,IAAA;EAClC,IAAA,YAAgB,IAAA;EAChB,UAAA,GAAa,kBAAA,CAAmB,IAAA;EAChC,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EACpC,QAAA,GAAW,GAAA,EAAK,IAAA,KAAS,KAAA;EACzB,OAAA,EAAS,iBAAA;EAET,WAAA;;;EAGA,QAAA,IACE,GAAA,EAAK,IAAA,EACL,KAAA,UACA,OAAA,WAAkB,iBAAA,CAAkB,IAAA;EAEtC,UAAA,EAAY,uBAAA;EACZ,cAAA,EAAgB,0BAAA;AAAA,IACd,mBAAA,CAAoB,IAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as DataGridState, i as DataGridColumnDef } from "./types-
|
|
1
|
+
import { A as DataGridState, i as DataGridColumnDef } from "./types-D8o47V7M.js";
|
|
2
2
|
|
|
3
3
|
//#region src/components/data-grid/use-url-state.d.ts
|
|
4
4
|
type UrlStateOptions = {
|
|
@@ -35,4 +35,4 @@ type UrlStateOptions = {
|
|
|
35
35
|
declare function useDataGridUrlState<TRow>(columns: readonly DataGridColumnDef<TRow>[], opts?: UrlStateOptions): [DataGridState, React.Dispatch<React.SetStateAction<DataGridState>>];
|
|
36
36
|
//#endregion
|
|
37
37
|
export { useDataGridUrlState as t };
|
|
38
|
-
//# sourceMappingURL=use-url-state-
|
|
38
|
+
//# sourceMappingURL=use-url-state-97YdV81Q.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-url-state-
|
|
1
|
+
{"version":3,"file":"use-url-state-97YdV81Q.d.ts","names":[],"sources":["../src/components/data-grid/use-url-state.ts"],"mappings":";;;KAqJK,eAAA;;AA3IY;EA8If,WAAA;;;;;EAKA,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,aAAA;AAAA;;;;;;;AAAa;AAwBtC;;;;;;;;;;;;;;iBAAgB,mBAAA,OACd,OAAA,WAAkB,iBAAA,CAAkB,IAAA,KACpC,IAAA,GAAO,eAAA,IACL,aAAA,EAAe,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,cAAA,CAAe,aAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hexclave/dashboard-ui-components",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.55",
|
|
4
4
|
"repository": "https://github.com/hexclave/hexclave",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -47,8 +47,8 @@
|
|
|
47
47
|
"@tanstack/react-table": "^8.21.3",
|
|
48
48
|
"@tanstack/react-virtual": "^3.13.0",
|
|
49
49
|
"class-variance-authority": "^0.7.0",
|
|
50
|
-
"@hexclave/shared": "1.0.
|
|
51
|
-
"@hexclave/ui": "1.0.
|
|
50
|
+
"@hexclave/shared": "1.0.55",
|
|
51
|
+
"@hexclave/ui": "1.0.55"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/react": "^19.0.0",
|
|
@@ -271,13 +271,13 @@ export function DataGridToolbar<TRow>({
|
|
|
271
271
|
ctx,
|
|
272
272
|
extra,
|
|
273
273
|
extraLeading,
|
|
274
|
+
extraActions,
|
|
274
275
|
hideQuickSearch,
|
|
275
276
|
}: {
|
|
276
277
|
ctx: DataGridToolbarContext<TRow>;
|
|
277
|
-
/** Extra content
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
* the default actions. */
|
|
278
|
+
/** Extra content in the leading cluster, after search / `extraLeading`
|
|
279
|
+
* (filters, status badges, row counts). Stays with the search side so
|
|
280
|
+
* it doesn't compete with the trailing icon actions. */
|
|
281
281
|
extra?: React.ReactNode;
|
|
282
282
|
/** Extra content rendered at the START of the toolbar row — occupies
|
|
283
283
|
* the same position as the built-in quick search (after it, if the
|
|
@@ -285,6 +285,10 @@ export function DataGridToolbar<TRow>({
|
|
|
285
285
|
* to fully replace the quick search with a custom input, e.g. an
|
|
286
286
|
* AI-powered search bar. */
|
|
287
287
|
extraLeading?: React.ReactNode;
|
|
288
|
+
/** Extra content in the trailing action cluster, immediately before
|
|
289
|
+
* the built-in columns / export buttons (e.g. a labeled Refresh).
|
|
290
|
+
* When present, a hairline divider separates it from those icons. */
|
|
291
|
+
extraActions?: React.ReactNode;
|
|
288
292
|
/** Whether to hide the built-in quick-search input. When `true`,
|
|
289
293
|
* callers are expected to provide their own search UI via
|
|
290
294
|
* `extraLeading`. */
|
|
@@ -326,9 +330,10 @@ export function DataGridToolbar<TRow>({
|
|
|
326
330
|
() => columns.some((c) => c.type === "date" || c.type === "dateTime"),
|
|
327
331
|
[columns],
|
|
328
332
|
);
|
|
333
|
+
const hasExtraActions = React.Children.toArray(extraActions).length > 0;
|
|
329
334
|
|
|
330
335
|
return (
|
|
331
|
-
<div className="flex w-full min-w-0 flex-col gap-2 px-2.5 py-2.5 border-b border-foreground/[0.06] sm:flex-row sm:items-center sm:gap-2">
|
|
336
|
+
<div className="flex w-full min-w-0 flex-col gap-2 px-2.5 py-2.5 pr-3 border-b border-foreground/[0.06] sm:flex-row sm:items-center sm:gap-2">
|
|
332
337
|
<div className="flex min-w-0 flex-1 flex-wrap items-center gap-2">
|
|
333
338
|
{!hideQuickSearch && (
|
|
334
339
|
<QuickSearch
|
|
@@ -340,7 +345,16 @@ export function DataGridToolbar<TRow>({
|
|
|
340
345
|
{extraLeading}
|
|
341
346
|
{extra}
|
|
342
347
|
</div>
|
|
343
|
-
<div className="flex shrink-0 items-center justify-end gap-
|
|
348
|
+
<div className="flex shrink-0 items-center justify-end gap-1.5">
|
|
349
|
+
{hasExtraActions && (
|
|
350
|
+
<>
|
|
351
|
+
{extraActions}
|
|
352
|
+
<div
|
|
353
|
+
className="mx-0.5 hidden h-4 w-px bg-foreground/[0.1] sm:block"
|
|
354
|
+
aria-hidden
|
|
355
|
+
/>
|
|
356
|
+
</>
|
|
357
|
+
)}
|
|
344
358
|
<div className="relative shrink-0" ref={columnPopover.ref}>
|
|
345
359
|
<ToolbarButton
|
|
346
360
|
onClick={() => columnPopover.setOpen(!columnPopover.open)}
|
|
@@ -5,7 +5,9 @@ import { useMemo, useState } from "react";
|
|
|
5
5
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
6
6
|
import {
|
|
7
7
|
createDefaultDataGridState,
|
|
8
|
+
DATA_GRID_DEFAULT_STRINGS,
|
|
8
9
|
DataGrid,
|
|
10
|
+
DataGridToolbar,
|
|
9
11
|
isDataGridInteractiveRowClickTarget,
|
|
10
12
|
useDataSource,
|
|
11
13
|
type DataGridColumnDef,
|
|
@@ -49,6 +51,41 @@ const wideColumns: DataGridColumnDef<Row>[] = [
|
|
|
49
51
|
},
|
|
50
52
|
];
|
|
51
53
|
|
|
54
|
+
describe("DataGridToolbar action divider", () => {
|
|
55
|
+
const ctx = {
|
|
56
|
+
state: createDefaultDataGridState(columns),
|
|
57
|
+
onChange: vi.fn(),
|
|
58
|
+
columns,
|
|
59
|
+
visibleColumns: columns,
|
|
60
|
+
totalRowCount: 1,
|
|
61
|
+
selectedRowCount: 0,
|
|
62
|
+
strings: DATA_GRID_DEFAULT_STRINGS,
|
|
63
|
+
exportCsv: vi.fn(),
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
afterEach(cleanup);
|
|
67
|
+
|
|
68
|
+
it("does not render a divider for an empty React node", () => {
|
|
69
|
+
const { container } = render(
|
|
70
|
+
<DataGridToolbar ctx={ctx} extraActions={false} />,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
expect(container.querySelector(".mx-0\\.5.h-4.w-px")).toBeNull();
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("renders the divider when an action is visible", () => {
|
|
77
|
+
const { container, getByRole } = render(
|
|
78
|
+
<DataGridToolbar
|
|
79
|
+
ctx={ctx}
|
|
80
|
+
extraActions={<button type="button">Refresh</button>}
|
|
81
|
+
/>,
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
expect(getByRole("button", { name: "Refresh" })).not.toBeNull();
|
|
85
|
+
expect(container.querySelector(".mx-0\\.5.h-4.w-px")).not.toBeNull();
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
52
89
|
type ObserverRecord = {
|
|
53
90
|
options?: IntersectionObserverInit,
|
|
54
91
|
};
|
|
@@ -204,7 +241,9 @@ function InteractiveDataGridHarness(props: {
|
|
|
204
241
|
);
|
|
205
242
|
}
|
|
206
243
|
|
|
207
|
-
function WideDataGridHarness(
|
|
244
|
+
function WideDataGridHarness(props: {
|
|
245
|
+
horizontalScrollbarPosition?: "top" | "bottom",
|
|
246
|
+
} = {}) {
|
|
208
247
|
const [state, setState] = useState(() => createDefaultDataGridState(wideColumns));
|
|
209
248
|
|
|
210
249
|
return (
|
|
@@ -215,6 +254,7 @@ function WideDataGridHarness() {
|
|
|
215
254
|
getRowId={(row) => row.id}
|
|
216
255
|
state={state}
|
|
217
256
|
onChange={setState}
|
|
257
|
+
horizontalScrollbarPosition={props.horizontalScrollbarPosition}
|
|
218
258
|
/>
|
|
219
259
|
</div>
|
|
220
260
|
);
|
|
@@ -578,4 +618,90 @@ describe("DataGrid horizontal scrolling", () => {
|
|
|
578
618
|
expect((stickyChrome as HTMLElement).className).toContain("overflow-visible");
|
|
579
619
|
expect(container.textContent).toContain("Email");
|
|
580
620
|
});
|
|
621
|
+
|
|
622
|
+
it("puts the horizontal scrollbar under the column headers when position is top", () => {
|
|
623
|
+
const { container } = render(<WideDataGridHarness horizontalScrollbarPosition="top" />);
|
|
624
|
+
|
|
625
|
+
const stickyChrome = container.querySelector('[role="grid"]')?.firstElementChild;
|
|
626
|
+
expect(stickyChrome).toBeInstanceOf(HTMLElement);
|
|
627
|
+
const headerScroll = stickyChrome?.querySelector(".overflow-x-auto");
|
|
628
|
+
expect(headerScroll).toBeInstanceOf(HTMLElement);
|
|
629
|
+
|
|
630
|
+
const bodyScroll = container.querySelector('[role="grid"]')?.children.item(1);
|
|
631
|
+
expect(bodyScroll).toBeInstanceOf(HTMLElement);
|
|
632
|
+
expect((bodyScroll as HTMLElement).className).toContain("overflow-x-hidden");
|
|
633
|
+
expect((bodyScroll as HTMLElement).className).toContain("overflow-y-auto");
|
|
634
|
+
|
|
635
|
+
Object.defineProperty(headerScroll as HTMLElement, "scrollLeft", {
|
|
636
|
+
configurable: true,
|
|
637
|
+
writable: true,
|
|
638
|
+
value: 0,
|
|
639
|
+
});
|
|
640
|
+
Object.defineProperty(bodyScroll as HTMLElement, "scrollLeft", {
|
|
641
|
+
configurable: true,
|
|
642
|
+
writable: true,
|
|
643
|
+
value: 0,
|
|
644
|
+
});
|
|
645
|
+
|
|
646
|
+
(headerScroll as HTMLElement).scrollLeft = 120;
|
|
647
|
+
fireEvent.scroll(headerScroll as HTMLElement);
|
|
648
|
+
expect((bodyScroll as HTMLElement).scrollLeft).toBe(120);
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
describe("DataGrid loading skeleton", () => {
|
|
653
|
+
beforeEach(() => {
|
|
654
|
+
vi.stubGlobal("ResizeObserver", MockResizeObserver);
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
afterEach(() => {
|
|
658
|
+
cleanup();
|
|
659
|
+
vi.restoreAllMocks();
|
|
660
|
+
vi.unstubAllGlobals();
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
it("shows a full-width shimmer when loading before any columns are known", () => {
|
|
664
|
+
function SchemaPendingHarness() {
|
|
665
|
+
const [state, setState] = useState(() => createDefaultDataGridState([]));
|
|
666
|
+
return (
|
|
667
|
+
<DataGrid<Row>
|
|
668
|
+
columns={[]}
|
|
669
|
+
rows={[]}
|
|
670
|
+
getRowId={(row) => row.id}
|
|
671
|
+
state={state}
|
|
672
|
+
onChange={setState}
|
|
673
|
+
isLoading
|
|
674
|
+
/>
|
|
675
|
+
);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
const { container } = render(<SchemaPendingHarness />);
|
|
679
|
+
|
|
680
|
+
const skeleton = container.querySelector("[data-data-grid-schema-pending-skeleton]");
|
|
681
|
+
expect(skeleton).toBeInstanceOf(HTMLElement);
|
|
682
|
+
// Five placeholder columns × 10 rows → visible shimmer cells, not an empty pane.
|
|
683
|
+
expect(skeleton?.querySelectorAll("[role='row']").length).toBe(10);
|
|
684
|
+
});
|
|
685
|
+
|
|
686
|
+
it("uses per-column skeleton rows once the schema is known", () => {
|
|
687
|
+
function KnownSchemaHarness() {
|
|
688
|
+
const [state, setState] = useState(() => createDefaultDataGridState(columns));
|
|
689
|
+
return (
|
|
690
|
+
<DataGrid<Row>
|
|
691
|
+
columns={columns}
|
|
692
|
+
rows={[]}
|
|
693
|
+
getRowId={(row) => row.id}
|
|
694
|
+
state={state}
|
|
695
|
+
onChange={setState}
|
|
696
|
+
isLoading
|
|
697
|
+
/>
|
|
698
|
+
);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
const { container } = render(<KnownSchemaHarness />);
|
|
702
|
+
|
|
703
|
+
expect(container.querySelector("[data-data-grid-schema-pending-skeleton]")).toBeNull();
|
|
704
|
+
const rowsClip = container.querySelector("[data-data-grid-rows-clip]");
|
|
705
|
+
expect(rowsClip?.querySelectorAll("[role='row']").length).toBe(8);
|
|
706
|
+
});
|
|
581
707
|
});
|