@osdk/react-components 0.2.0-beta.11 → 0.2.0-beta.13
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/AGENTS.md +105 -0
- package/CHANGELOG.md +30 -0
- package/build/browser/base-components/draggable-list/DraggableList.module.css +2 -2
- package/build/browser/filter-list/FilterListApi.js.map +1 -1
- package/build/browser/filter-list/base/DragHandleIcon.js +51 -0
- package/build/browser/filter-list/base/DragHandleIcon.js.map +1 -0
- package/build/browser/filter-list/base/FilterList.js +3 -1
- package/build/browser/filter-list/base/FilterList.js.map +1 -1
- package/build/browser/filter-list/base/FilterListContent.js +143 -3
- package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
- package/build/browser/filter-list/base/FilterListContent.module.css +6 -0
- package/build/browser/filter-list/base/FilterListContent.module.css.js +2 -1
- package/build/browser/filter-list/base/FilterListItem.js +11 -18
- package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
- package/build/browser/filter-list/base/FilterListItem.module.css +32 -0
- package/build/browser/filter-list/base/FilterListItem.module.css.js +3 -1
- package/build/browser/filter-list/base/SortableFilterListItem.js +63 -0
- package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -0
- package/build/browser/filter-list/utils/getFilterLabel.js +36 -0
- package/build/browser/filter-list/utils/getFilterLabel.js.map +1 -0
- package/build/browser/object-table/EditableCell.js +1 -2
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/TableRow.js +1 -2
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/styles.css +40 -2
- package/build/cjs/public/experimental.cjs +905 -677
- package/build/cjs/public/experimental.cjs.map +1 -1
- package/build/cjs/public/experimental.css +34 -2
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/experimental.d.cts +7 -0
- package/build/esm/base-components/draggable-list/DraggableList.module.css +2 -2
- package/build/esm/filter-list/FilterListApi.js.map +1 -1
- package/build/esm/filter-list/base/DragHandleIcon.js +51 -0
- package/build/esm/filter-list/base/DragHandleIcon.js.map +1 -0
- package/build/esm/filter-list/base/FilterList.js +3 -1
- package/build/esm/filter-list/base/FilterList.js.map +1 -1
- package/build/esm/filter-list/base/FilterListContent.js +143 -3
- package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
- package/build/esm/filter-list/base/FilterListContent.module.css +6 -0
- package/build/esm/filter-list/base/FilterListItem.js +11 -18
- package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
- package/build/esm/filter-list/base/FilterListItem.module.css +32 -0
- package/build/esm/filter-list/base/SortableFilterListItem.js +63 -0
- package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -0
- package/build/esm/filter-list/utils/getFilterLabel.js +36 -0
- package/build/esm/filter-list/utils/getFilterLabel.js.map +1 -0
- package/build/esm/object-table/EditableCell.js +1 -2
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/TableRow.js +1 -2
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/types/filter-list/FilterListApi.d.ts +7 -0
- package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
- package/build/types/filter-list/base/DragHandleIcon.d.ts +2 -0
- package/build/types/filter-list/base/DragHandleIcon.d.ts.map +1 -0
- package/build/types/filter-list/base/FilterListContent.d.ts +2 -1
- package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
- package/build/types/filter-list/base/FilterListItem.d.ts +4 -1
- package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
- package/build/types/filter-list/base/SortableFilterListItem.d.ts +16 -0
- package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -0
- package/build/types/filter-list/utils/getFilterLabel.d.ts +3 -0
- package/build/types/filter-list/utils/getFilterLabel.d.ts.map +1 -0
- package/build/types/object-table/EditableCell.d.ts +1 -3
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- package/build/types/object-table/TableRow.d.ts +1 -2
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/package.json +6 -5
- package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
- package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/dateUtils.test.js +0 -55
- package/build/browser/filter-list/__tests__/dateUtils.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
- package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/getFilterKey.test.js +0 -53
- package/build/browser/filter-list/__tests__/getFilterKey.test.js.map +0 -1
- package/build/browser/filter-list/__tests__/testUtils.js +0 -203
- package/build/browser/filter-list/__tests__/testUtils.js.map +0 -1
- package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
- package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
- package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
- package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
- package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
- package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js +0 -292
- package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
- package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
- package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
- package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
- package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
- package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
- package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/dateUtils.test.js +0 -55
- package/build/esm/filter-list/__tests__/dateUtils.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
- package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/getFilterKey.test.js +0 -53
- package/build/esm/filter-list/__tests__/getFilterKey.test.js.map +0 -1
- package/build/esm/filter-list/__tests__/testUtils.js +0 -203
- package/build/esm/filter-list/__tests__/testUtils.js.map +0 -1
- package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
- package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
- package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
- package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
- package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
- package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js +0 -292
- package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
- package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
- package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
- package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
- package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
- package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
- package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/dateUtils.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/dateUtils.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/getFilterKey.test.d.ts +0 -1
- package/build/types/filter-list/__tests__/getFilterKey.test.d.ts.map +0 -1
- package/build/types/filter-list/__tests__/testUtils.d.ts +0 -65
- package/build/types/filter-list/__tests__/testUtils.d.ts.map +0 -1
- package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts +0 -1
- package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +0 -1
- package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +0 -1
- package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useObjectTableData.test.js","names":["OsdkProvider","useObjectSet","useOsdkObjects","renderHook","React","beforeEach","describe","expect","it","vi","useObjectTableData","TestObjectType","type","apiName","mock","fn","objectType","options","data","isLoading","error","undefined","fetchMore","isOptimistic","_testOptions","objectSet","totalCount","TestInterfaceType","mocked","mockClear","wrapper","client","children","createElement","mockObjectSet","$objectSetInternals","def","filterClause","name","orderBy","id","desc","result","mockResult","current","where","toEqual","withProperties","toBeUndefined","pageSize","toBe","columnDefinitions","locator","mockRdpCreator1","mockRdpCreator2","creator","rdp1","rdp2","mockRdpCreator","rerender","colDefs","initialProps","firstMockResult","firstWithProperties","secondMockResult","toHaveProperty","toHaveBeenCalledWith","objectContaining","enabled","anything","sorting","objectSetOptions","union","intersect","subtract"],"sources":["useObjectTableData.test.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n DerivedProperty,\n InterfaceDefinition,\n ObjectSet,\n ObjectTypeDefinition,\n PropertyKeys,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type { Client } from \"@osdk/client\";\nimport { OsdkProvider } from \"@osdk/react\";\nimport type { UseOsdkListResult } from \"@osdk/react/experimental\";\nimport { useObjectSet, useOsdkObjects } from \"@osdk/react/experimental\";\nimport type { SortingState } from \"@tanstack/react-table\";\nimport { renderHook } from \"@testing-library/react\";\nimport * as React from \"react\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { ColumnDefinition } from \"../../ObjectTableApi.js\";\nimport { useObjectTableData } from \"../useObjectTableData.js\";\n\nconst TestObjectType = {\n type: \"object\",\n apiName: \"TestObject\",\n} as const satisfies ObjectTypeDefinition;\n\ntype TestObject = typeof TestObjectType;\ntype TestObjectKeys = PropertyKeys<TestObject>;\n\ninterface MockReturnType extends UseOsdkListResult<TestObject> {\n _testOptions: {\n withProperties?: Record<string, unknown>;\n pageSize: number;\n where?: WhereClause<any>;\n enabled?: boolean;\n orderBy?: Record<string, \"asc\" | \"desc\">;\n };\n}\n\nvi.mock(\"@osdk/react/experimental\", () => ({\n useOsdkObjects: vi.fn((objectType, options): MockReturnType => {\n return {\n data: [],\n isLoading: false,\n error: undefined,\n fetchMore: undefined,\n isOptimistic: false,\n // Return the options to verify they were passed correctly\n _testOptions: options,\n };\n }),\n useObjectSet: vi.fn((objectSet, options): MockReturnType => {\n return {\n data: [],\n isLoading: false,\n error: undefined,\n fetchMore: vi.fn(),\n totalCount: undefined,\n // Return the options to verify they were passed correctly\n _testOptions: options,\n isOptimistic: false,\n };\n }),\n}));\n\nconst TestInterfaceType = {\n type: \"interface\",\n apiName: \"TestInterface\",\n} as const satisfies InterfaceDefinition;\n\ndescribe(useObjectTableData, () => {\n beforeEach(() => {\n vi.mocked(useOsdkObjects).mockClear();\n vi.mocked(useObjectSet).mockClear();\n });\n const createWrapper = (client: Client) => {\n return ({ children }: React.PropsWithChildren) => {\n return <OsdkProvider client={client}>{children}</OsdkProvider>;\n };\n };\n\n const fakeClient = {} as unknown as Client;\n const wrapper = createWrapper(fakeClient);\n\n const mockObjectSet = {\n $objectSetInternals: {\n def: TestObjectType,\n },\n } as unknown as ObjectSet<TestObject>;\n\n it(\"calls useOsdkObjects with filter clause and orderBy provided\", () => {\n const filterClause = {\n name: \"John\",\n } as unknown as WhereClause<TestObject>;\n const orderBy: SortingState = [{\n id: \"name\",\n desc: false,\n }];\n const { result } = renderHook(\n () =>\n useObjectTableData(TestObjectType, undefined, filterClause, orderBy),\n { wrapper },\n );\n\n const mockResult = result.current as unknown as MockReturnType;\n expect(mockResult._testOptions.where).toEqual(filterClause);\n expect(mockResult._testOptions.orderBy).toEqual({\n \"name\": \"asc\",\n });\n });\n\n it(\"calls useOsdkObjects without withProperties when no columnDefinitions provided\", () => {\n const { result } = renderHook(\n () => useObjectTableData(TestObjectType, undefined),\n { wrapper },\n );\n\n const mockResult = result.current as unknown as MockReturnType;\n expect(mockResult._testOptions.withProperties).toBeUndefined();\n expect(mockResult._testOptions.pageSize).toBe(50);\n });\n\n it(\"calls useOsdkObjects without withProperties when columnDefinitions have no RDP columns\", () => {\n const columnDefinitions: Array<ColumnDefinition<TestObject, {}, {}>> = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n },\n {\n locator: { type: \"property\", id: \"email\" as TestObjectKeys },\n },\n ];\n\n const { result } = renderHook(\n () => useObjectTableData(TestObjectType, columnDefinitions),\n { wrapper },\n );\n\n const mockResult = result.current as unknown as MockReturnType;\n expect(mockResult._testOptions.withProperties).toBeUndefined();\n expect(mockResult._testOptions.pageSize).toBe(50);\n });\n\n it(\"extracts RDP creators and passes them to useOsdkObjects\", () => {\n const mockRdpCreator1 = vi.fn() as unknown as DerivedProperty.Creator<\n TestObject,\n SimplePropertyDef\n >;\n const mockRdpCreator2 = vi.fn() as unknown as DerivedProperty.Creator<\n TestObject,\n SimplePropertyDef\n >;\n\n const columnDefinitions: Array<\n ColumnDefinition<\n TestObject,\n { rdp1: any; rdp2: any },\n { myFunction: any }\n >\n > = [\n {\n locator: { type: \"property\", id: \"name\" as TestObjectKeys },\n },\n {\n locator: { type: \"rdp\", id: \"rdp1\", creator: mockRdpCreator1 },\n },\n {\n locator: { type: \"rdp\", id: \"rdp2\", creator: mockRdpCreator2 },\n },\n {\n locator: { type: \"function\", id: \"myFunction\" },\n },\n ];\n\n const { result } = renderHook(\n () => useObjectTableData(TestObjectType, columnDefinitions),\n { wrapper },\n );\n\n const mockResult = result.current as unknown as MockReturnType;\n expect(mockResult._testOptions.withProperties).toEqual({\n rdp1: mockRdpCreator1,\n rdp2: mockRdpCreator2,\n });\n });\n\n it(\"memoizes withProperties based on columnDefinitions\", () => {\n const mockRdpCreator = vi.fn() as unknown as DerivedProperty.Creator<\n TestObject,\n SimplePropertyDef\n >;\n\n const columnDefinitions: Array<\n ColumnDefinition<TestObject, { myRdp: any }, {}>\n > = [\n {\n locator: { type: \"rdp\", id: \"myRdp\", creator: mockRdpCreator },\n },\n ];\n\n const { result, rerender } = renderHook(\n ({ colDefs }) => useObjectTableData(TestObjectType, colDefs),\n {\n initialProps: { colDefs: columnDefinitions },\n wrapper,\n },\n );\n\n const firstMockResult = result\n .current as unknown as MockReturnType;\n const firstWithProperties = firstMockResult._testOptions.withProperties;\n\n // Rerender with same columnDefinitions reference\n rerender({ colDefs: columnDefinitions });\n\n // Should be the same reference (memoized)\n const secondMockResult = result\n .current as unknown as MockReturnType;\n expect(secondMockResult._testOptions.withProperties).toBe(\n firstWithProperties,\n );\n });\n\n it(\"updates withProperties when columnDefinitions change\", () => {\n const mockRdpCreator1 = vi.fn() as unknown as DerivedProperty.Creator<\n TestObject,\n SimplePropertyDef\n >;\n const mockRdpCreator2 = vi.fn() as unknown as DerivedProperty.Creator<\n TestObject,\n SimplePropertyDef\n >;\n\n const initialColumnDefinitions: Array<\n ColumnDefinition<TestObject, { rdp1: any }, {}>\n > = [\n {\n locator: { type: \"rdp\", id: \"rdp1\", creator: mockRdpCreator1 },\n },\n ];\n\n type ColDefs =\n | Array<\n ColumnDefinition<TestObject, Record<string, SimplePropertyDef>, {}>\n >\n | undefined;\n\n const { result, rerender } = renderHook(\n ({ colDefs }: { colDefs: ColDefs }) =>\n useObjectTableData(TestObjectType, colDefs),\n {\n initialProps: { colDefs: initialColumnDefinitions as ColDefs },\n wrapper,\n },\n );\n\n const firstMockResult = result\n .current as unknown as MockReturnType;\n expect(firstMockResult._testOptions.withProperties).toEqual({\n rdp1: mockRdpCreator1,\n });\n\n const updatedColumnDefinitions: Array<\n ColumnDefinition<TestObject, { rdp2: SimplePropertyDef }, {}>\n > = [\n {\n locator: { type: \"rdp\", id: \"rdp2\", creator: mockRdpCreator2 },\n },\n ];\n\n rerender({ colDefs: updatedColumnDefinitions as ColDefs });\n\n const secondMockResult = result\n .current as unknown as MockReturnType;\n expect(secondMockResult._testOptions.withProperties).toEqual({\n rdp2: mockRdpCreator2,\n });\n });\n\n it(\"returns useOsdkObjects result structure\", () => {\n const { result } = renderHook(\n () => useObjectTableData(TestObjectType),\n { wrapper },\n );\n\n expect(result.current).toHaveProperty(\"data\");\n expect(result.current).toHaveProperty(\"isLoading\");\n expect(result.current).toHaveProperty(\"error\");\n expect(result.current).toHaveProperty(\"fetchMore\");\n });\n\n it(\"when no objectSet provided, only enables useOsdkObjects\", () => {\n const { result } = renderHook(\n () => useObjectTableData(TestObjectType),\n { wrapper },\n );\n\n expect(useOsdkObjects).toHaveBeenCalledWith(\n TestObjectType,\n expect.objectContaining({\n enabled: true,\n pageSize: 50,\n }),\n );\n\n expect(useObjectSet).toHaveBeenCalledWith(\n undefined,\n expect.objectContaining({\n enabled: false,\n pageSize: 50,\n }),\n );\n });\n\n it(\" when objectSet is provided, only enables useObjectSet\", () => {\n const { result } = renderHook(\n () =>\n useObjectTableData(\n TestObjectType,\n undefined,\n undefined,\n undefined,\n mockObjectSet,\n ),\n { wrapper },\n );\n\n expect(useOsdkObjects).toHaveBeenCalledWith(\n TestObjectType,\n expect.objectContaining({\n enabled: false,\n pageSize: 50,\n }),\n );\n\n expect(useObjectSet).toHaveBeenCalledWith(\n expect.anything(),\n expect.objectContaining({\n enabled: true,\n pageSize: 50,\n }),\n );\n });\n\n it(\"when objectSet is provided but type is interface, only enables useOsdkObjects \", () => {\n renderHook(\n () =>\n useObjectTableData(\n TestInterfaceType,\n undefined,\n undefined,\n undefined,\n mockObjectSet as any,\n ),\n { wrapper },\n );\n\n expect(useOsdkObjects).toHaveBeenCalledWith(\n TestInterfaceType,\n expect.objectContaining({\n enabled: true,\n pageSize: 50,\n }),\n );\n\n expect(useObjectSet).toHaveBeenCalledWith(\n undefined,\n expect.objectContaining({\n enabled: false,\n pageSize: 50,\n }),\n );\n });\n\n it(\"passes filter, orderBy and objectSetOptions to useObjectSet\", () => {\n const filterClause = {\n name: \"John\",\n } as unknown as WhereClause<TestObject>;\n const sorting: SortingState = [\n {\n id: \"name\",\n desc: false,\n },\n ];\n const objectSetOptions = {\n union: [mockObjectSet],\n intersect: [],\n subtract: [],\n };\n\n renderHook(\n () =>\n useObjectTableData(\n TestObjectType,\n undefined,\n filterClause,\n sorting,\n mockObjectSet,\n objectSetOptions,\n ),\n { wrapper },\n );\n\n expect(useObjectSet).toHaveBeenCalledWith(\n expect.anything(),\n expect.objectContaining({\n enabled: true,\n pageSize: 50,\n where: filterClause,\n orderBy: { name: \"asc\" },\n union: objectSetOptions.union,\n intersect: objectSetOptions.intersect,\n subtract: objectSetOptions.subtract,\n }),\n );\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,596 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2025 Palantir Technologies, Inc. All rights reserved.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
import { act, renderHook } from "@testing-library/react";
|
|
18
|
-
import { describe, expect, it, vi } from "vitest";
|
|
19
|
-
import { useRowSelection } from "../useRowSelection.js";
|
|
20
|
-
const TestObjectType = {
|
|
21
|
-
type: "object",
|
|
22
|
-
apiName: "TestObject"
|
|
23
|
-
};
|
|
24
|
-
// Helper to create mock data
|
|
25
|
-
function createMockData(count) {
|
|
26
|
-
return Array.from({
|
|
27
|
-
length: count
|
|
28
|
-
}, (_, i) => ({
|
|
29
|
-
$primaryKey: `item-${i}`,
|
|
30
|
-
$objectType: "TestObject",
|
|
31
|
-
$apiName: "TestObject",
|
|
32
|
-
$title: `Item ${i}`
|
|
33
|
-
}));
|
|
34
|
-
}
|
|
35
|
-
describe("useRowSelection", () => {
|
|
36
|
-
describe("disabled mode (selectionMode: 'none')", () => {
|
|
37
|
-
it("returns empty selection state", () => {
|
|
38
|
-
const data = createMockData(5);
|
|
39
|
-
const {
|
|
40
|
-
result
|
|
41
|
-
} = renderHook(() => useRowSelection({
|
|
42
|
-
selectionMode: "none",
|
|
43
|
-
data
|
|
44
|
-
}));
|
|
45
|
-
expect(result.current.rowSelection).toEqual({});
|
|
46
|
-
expect(result.current.isAllSelected).toBe(false);
|
|
47
|
-
expect(result.current.hasSelection).toBe(false);
|
|
48
|
-
expect(result.current.enableRowSelection).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
it("does not respond to toggle operations", () => {
|
|
51
|
-
const data = createMockData(5);
|
|
52
|
-
const {
|
|
53
|
-
result
|
|
54
|
-
} = renderHook(() => useRowSelection({
|
|
55
|
-
selectionMode: "none",
|
|
56
|
-
data
|
|
57
|
-
}));
|
|
58
|
-
act(() => {
|
|
59
|
-
result.current.onToggleRow("item-0", 0);
|
|
60
|
-
});
|
|
61
|
-
expect(result.current.rowSelection).toEqual({});
|
|
62
|
-
expect(result.current.hasSelection).toBe(false);
|
|
63
|
-
act(() => {
|
|
64
|
-
result.current.onToggleAll();
|
|
65
|
-
});
|
|
66
|
-
expect(result.current.rowSelection).toEqual({});
|
|
67
|
-
expect(result.current.hasSelection).toBe(false);
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
describe("uncontrolled mode", () => {
|
|
71
|
-
describe("single selection mode", () => {
|
|
72
|
-
it("selects a single row and calls onRowSelection", () => {
|
|
73
|
-
const data = createMockData(5);
|
|
74
|
-
const onRowSelection = vi.fn();
|
|
75
|
-
const {
|
|
76
|
-
result
|
|
77
|
-
} = renderHook(() => useRowSelection({
|
|
78
|
-
selectionMode: "single",
|
|
79
|
-
onRowSelection,
|
|
80
|
-
data
|
|
81
|
-
}));
|
|
82
|
-
act(() => {
|
|
83
|
-
result.current.onToggleRow("item-0", 0);
|
|
84
|
-
});
|
|
85
|
-
expect(result.current.enableRowSelection).toBe(true);
|
|
86
|
-
expect(result.current.rowSelection).toEqual({
|
|
87
|
-
"item-0": true
|
|
88
|
-
});
|
|
89
|
-
expect(result.current.hasSelection).toBe(true);
|
|
90
|
-
expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey]);
|
|
91
|
-
});
|
|
92
|
-
it("deselects when toggling selected row and calls onRowSelection", () => {
|
|
93
|
-
const data = createMockData(5);
|
|
94
|
-
const onRowSelection = vi.fn();
|
|
95
|
-
const {
|
|
96
|
-
result
|
|
97
|
-
} = renderHook(() => useRowSelection({
|
|
98
|
-
selectionMode: "single",
|
|
99
|
-
onRowSelection,
|
|
100
|
-
data
|
|
101
|
-
}));
|
|
102
|
-
|
|
103
|
-
// Select
|
|
104
|
-
act(() => {
|
|
105
|
-
result.current.onToggleRow("item-0", 0);
|
|
106
|
-
});
|
|
107
|
-
expect(result.current.rowSelection).toEqual({
|
|
108
|
-
"item-0": true
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
// Deselect
|
|
112
|
-
act(() => {
|
|
113
|
-
result.current.onToggleRow("item-0", 0);
|
|
114
|
-
});
|
|
115
|
-
expect(result.current.rowSelection).toEqual({});
|
|
116
|
-
expect(result.current.hasSelection).toBe(false);
|
|
117
|
-
expect(onRowSelection).toHaveBeenLastCalledWith([]);
|
|
118
|
-
});
|
|
119
|
-
it("replaces selection when selecting different row", () => {
|
|
120
|
-
const data = createMockData(5);
|
|
121
|
-
const {
|
|
122
|
-
result
|
|
123
|
-
} = renderHook(() => useRowSelection({
|
|
124
|
-
selectionMode: "single",
|
|
125
|
-
data
|
|
126
|
-
}));
|
|
127
|
-
act(() => {
|
|
128
|
-
result.current.onToggleRow("item-0", 0);
|
|
129
|
-
});
|
|
130
|
-
expect(result.current.rowSelection).toEqual({
|
|
131
|
-
"item-0": true
|
|
132
|
-
});
|
|
133
|
-
act(() => {
|
|
134
|
-
result.current.onToggleRow("item-1", 1);
|
|
135
|
-
});
|
|
136
|
-
expect(result.current.rowSelection).toEqual({
|
|
137
|
-
"item-1": true
|
|
138
|
-
});
|
|
139
|
-
expect(result.current.hasSelection).toBe(true);
|
|
140
|
-
});
|
|
141
|
-
it("treats shift-click as a normal click", () => {
|
|
142
|
-
const data = createMockData(5);
|
|
143
|
-
const {
|
|
144
|
-
result
|
|
145
|
-
} = renderHook(() => useRowSelection({
|
|
146
|
-
selectionMode: "single",
|
|
147
|
-
data
|
|
148
|
-
}));
|
|
149
|
-
// First click as the lastSelectedRow
|
|
150
|
-
act(() => {
|
|
151
|
-
result.current.onToggleRow("item-0", 0);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
// Shift-click
|
|
155
|
-
act(() => {
|
|
156
|
-
result.current.onToggleRow("item-2", 2, true);
|
|
157
|
-
});
|
|
158
|
-
expect(result.current.rowSelection).toEqual({
|
|
159
|
-
"item-2": true
|
|
160
|
-
});
|
|
161
|
-
});
|
|
162
|
-
});
|
|
163
|
-
describe("multiple selection mode", () => {
|
|
164
|
-
it("selects multiple rows independently and calls onRowSelection", () => {
|
|
165
|
-
const data = createMockData(5);
|
|
166
|
-
const onRowSelection = vi.fn();
|
|
167
|
-
const {
|
|
168
|
-
result
|
|
169
|
-
} = renderHook(() => useRowSelection({
|
|
170
|
-
selectionMode: "multiple",
|
|
171
|
-
onRowSelection,
|
|
172
|
-
data
|
|
173
|
-
}));
|
|
174
|
-
act(() => {
|
|
175
|
-
result.current.onToggleRow("item-0", 0);
|
|
176
|
-
});
|
|
177
|
-
expect(result.current.rowSelection).toEqual({
|
|
178
|
-
"item-0": true
|
|
179
|
-
});
|
|
180
|
-
act(() => {
|
|
181
|
-
result.current.onToggleRow("item-2", 2);
|
|
182
|
-
});
|
|
183
|
-
expect(result.current.enableRowSelection).toBe(true);
|
|
184
|
-
expect(result.current.rowSelection).toEqual({
|
|
185
|
-
"item-0": true,
|
|
186
|
-
"item-2": true
|
|
187
|
-
});
|
|
188
|
-
expect(result.current.isAllSelected).toBe(false);
|
|
189
|
-
expect(onRowSelection).toHaveBeenLastCalledWith([data[0].$primaryKey, data[2].$primaryKey]);
|
|
190
|
-
});
|
|
191
|
-
it("deselects individual rows", () => {
|
|
192
|
-
const data = createMockData(5);
|
|
193
|
-
const {
|
|
194
|
-
result
|
|
195
|
-
} = renderHook(() => useRowSelection({
|
|
196
|
-
selectionMode: "multiple",
|
|
197
|
-
data
|
|
198
|
-
}));
|
|
199
|
-
|
|
200
|
-
// Select two rows
|
|
201
|
-
act(() => {
|
|
202
|
-
result.current.onToggleRow("item-0", 0);
|
|
203
|
-
});
|
|
204
|
-
act(() => {
|
|
205
|
-
result.current.onToggleRow("item-1", 1);
|
|
206
|
-
});
|
|
207
|
-
expect(result.current.rowSelection).toEqual({
|
|
208
|
-
"item-0": true,
|
|
209
|
-
"item-1": true
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
// Deselect one
|
|
213
|
-
act(() => {
|
|
214
|
-
result.current.onToggleRow("item-0", 0);
|
|
215
|
-
});
|
|
216
|
-
expect(result.current.rowSelection).toEqual({
|
|
217
|
-
"item-1": true
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
it("selects range with shift-click and calls onRowSelection", () => {
|
|
221
|
-
const data = createMockData(5);
|
|
222
|
-
const onRowSelection = vi.fn();
|
|
223
|
-
const {
|
|
224
|
-
result
|
|
225
|
-
} = renderHook(() => useRowSelection({
|
|
226
|
-
selectionMode: "multiple",
|
|
227
|
-
onRowSelection,
|
|
228
|
-
data
|
|
229
|
-
}));
|
|
230
|
-
|
|
231
|
-
// First click
|
|
232
|
-
act(() => {
|
|
233
|
-
result.current.onToggleRow("item-1", 1);
|
|
234
|
-
});
|
|
235
|
-
|
|
236
|
-
// Shift-click to select range
|
|
237
|
-
act(() => {
|
|
238
|
-
result.current.onToggleRow("item-3", 3, true);
|
|
239
|
-
});
|
|
240
|
-
expect(result.current.rowSelection).toEqual({
|
|
241
|
-
"item-1": true,
|
|
242
|
-
"item-2": true,
|
|
243
|
-
"item-3": true
|
|
244
|
-
});
|
|
245
|
-
expect(onRowSelection).toHaveBeenLastCalledWith([data[1].$primaryKey, data[2].$primaryKey, data[3].$primaryKey]);
|
|
246
|
-
});
|
|
247
|
-
it("selects range in reverse order (shift-click up)", () => {
|
|
248
|
-
const data = createMockData(5);
|
|
249
|
-
const {
|
|
250
|
-
result
|
|
251
|
-
} = renderHook(() => useRowSelection({
|
|
252
|
-
selectionMode: "multiple",
|
|
253
|
-
data
|
|
254
|
-
}));
|
|
255
|
-
|
|
256
|
-
// First click on row 3
|
|
257
|
-
act(() => {
|
|
258
|
-
result.current.onToggleRow("item-3", 3);
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
// Shift-click to row 1 (upward)
|
|
262
|
-
act(() => {
|
|
263
|
-
result.current.onToggleRow("item-1", 1, true);
|
|
264
|
-
});
|
|
265
|
-
expect(result.current.rowSelection).toEqual({
|
|
266
|
-
"item-1": true,
|
|
267
|
-
"item-2": true,
|
|
268
|
-
"item-3": true
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
it("shift-click without previous selection does not select range", () => {
|
|
272
|
-
const data = createMockData(5);
|
|
273
|
-
const {
|
|
274
|
-
result
|
|
275
|
-
} = renderHook(() => useRowSelection({
|
|
276
|
-
selectionMode: "multiple",
|
|
277
|
-
data
|
|
278
|
-
}));
|
|
279
|
-
|
|
280
|
-
// Shift-click without previous selection
|
|
281
|
-
act(() => {
|
|
282
|
-
result.current.onToggleRow("item-2", 2, true);
|
|
283
|
-
});
|
|
284
|
-
expect(result.current.rowSelection).toEqual({
|
|
285
|
-
"item-2": true
|
|
286
|
-
});
|
|
287
|
-
});
|
|
288
|
-
it("merges range selection with existing selections", () => {
|
|
289
|
-
const data = createMockData(10);
|
|
290
|
-
const {
|
|
291
|
-
result
|
|
292
|
-
} = renderHook(() => useRowSelection({
|
|
293
|
-
selectionMode: "multiple",
|
|
294
|
-
data
|
|
295
|
-
}));
|
|
296
|
-
|
|
297
|
-
// Select row 0
|
|
298
|
-
act(() => {
|
|
299
|
-
result.current.onToggleRow("item-0", 0);
|
|
300
|
-
});
|
|
301
|
-
|
|
302
|
-
// Select row 5
|
|
303
|
-
act(() => {
|
|
304
|
-
result.current.onToggleRow("item-5", 5);
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
// Shift-click to row 7 (should keep row 0)
|
|
308
|
-
act(() => {
|
|
309
|
-
result.current.onToggleRow("item-7", 7, true);
|
|
310
|
-
});
|
|
311
|
-
expect(result.current.rowSelection).toEqual({
|
|
312
|
-
"item-0": true,
|
|
313
|
-
"item-5": true,
|
|
314
|
-
"item-6": true,
|
|
315
|
-
"item-7": true
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
it("shift-click after deselection should select from the last selected row", () => {
|
|
319
|
-
const data = createMockData(7);
|
|
320
|
-
const {
|
|
321
|
-
result
|
|
322
|
-
} = renderHook(() => useRowSelection({
|
|
323
|
-
selectionMode: "multiple",
|
|
324
|
-
data
|
|
325
|
-
}));
|
|
326
|
-
|
|
327
|
-
// Select rows 0, 1, 2
|
|
328
|
-
act(() => {
|
|
329
|
-
result.current.onToggleRow("item-0", 0);
|
|
330
|
-
});
|
|
331
|
-
act(() => {
|
|
332
|
-
result.current.onToggleRow("item-1", 1);
|
|
333
|
-
});
|
|
334
|
-
act(() => {
|
|
335
|
-
result.current.onToggleRow("item-2", 2);
|
|
336
|
-
});
|
|
337
|
-
expect(result.current.rowSelection).toEqual({
|
|
338
|
-
"item-0": true,
|
|
339
|
-
"item-1": true,
|
|
340
|
-
"item-2": true
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
// Deselect row 1 (clears lastSelectedRowIndex)
|
|
344
|
-
act(() => {
|
|
345
|
-
result.current.onToggleRow("item-1", 1);
|
|
346
|
-
});
|
|
347
|
-
expect(result.current.rowSelection).toEqual({
|
|
348
|
-
"item-0": true,
|
|
349
|
-
"item-2": true
|
|
350
|
-
});
|
|
351
|
-
|
|
352
|
-
// Shift-click row 4 - should select from row 2 to row 4
|
|
353
|
-
act(() => {
|
|
354
|
-
result.current.onToggleRow("item-4", 4, true);
|
|
355
|
-
});
|
|
356
|
-
expect(result.current.rowSelection).toEqual({
|
|
357
|
-
"item-0": true,
|
|
358
|
-
"item-2": true,
|
|
359
|
-
"item-3": true,
|
|
360
|
-
"item-4": true
|
|
361
|
-
});
|
|
362
|
-
});
|
|
363
|
-
it("toggles all rows", () => {
|
|
364
|
-
const data = createMockData(3);
|
|
365
|
-
const onRowSelection = vi.fn();
|
|
366
|
-
const {
|
|
367
|
-
result
|
|
368
|
-
} = renderHook(() => useRowSelection({
|
|
369
|
-
selectionMode: "multiple",
|
|
370
|
-
onRowSelection,
|
|
371
|
-
data
|
|
372
|
-
}));
|
|
373
|
-
expect(result.current.isAllSelected).toBe(false);
|
|
374
|
-
|
|
375
|
-
// Select all
|
|
376
|
-
act(() => {
|
|
377
|
-
result.current.onToggleAll();
|
|
378
|
-
});
|
|
379
|
-
expect(result.current.rowSelection).toEqual({
|
|
380
|
-
"item-0": true,
|
|
381
|
-
"item-1": true,
|
|
382
|
-
"item-2": true
|
|
383
|
-
});
|
|
384
|
-
expect(result.current.isAllSelected).toBe(true);
|
|
385
|
-
expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey, data[1].$primaryKey, data[2].$primaryKey]);
|
|
386
|
-
|
|
387
|
-
// Deselect all
|
|
388
|
-
act(() => {
|
|
389
|
-
result.current.onToggleAll();
|
|
390
|
-
});
|
|
391
|
-
expect(result.current.rowSelection).toEqual({});
|
|
392
|
-
expect(result.current.isAllSelected).toBe(false);
|
|
393
|
-
expect(onRowSelection).toHaveBeenLastCalledWith([]);
|
|
394
|
-
});
|
|
395
|
-
});
|
|
396
|
-
});
|
|
397
|
-
describe("controlled mode", () => {
|
|
398
|
-
describe("single selection mode", () => {
|
|
399
|
-
it("uses selectedRows prop for selection state", () => {
|
|
400
|
-
const data = createMockData(5);
|
|
401
|
-
const {
|
|
402
|
-
result
|
|
403
|
-
} = renderHook(() => useRowSelection({
|
|
404
|
-
selectionMode: "single",
|
|
405
|
-
selectedRows: [data[1].$primaryKey],
|
|
406
|
-
data
|
|
407
|
-
}));
|
|
408
|
-
expect(result.current.rowSelection).toEqual({
|
|
409
|
-
"item-1": true
|
|
410
|
-
});
|
|
411
|
-
expect(result.current.hasSelection).toBe(true);
|
|
412
|
-
});
|
|
413
|
-
it("calls onRowSelection when toggling but does not update internal state", () => {
|
|
414
|
-
const data = createMockData(5);
|
|
415
|
-
const onRowSelection = vi.fn();
|
|
416
|
-
const {
|
|
417
|
-
result,
|
|
418
|
-
rerender
|
|
419
|
-
} = renderHook(({
|
|
420
|
-
selectedRows
|
|
421
|
-
}) => useRowSelection({
|
|
422
|
-
selectionMode: "single",
|
|
423
|
-
selectedRows,
|
|
424
|
-
onRowSelection,
|
|
425
|
-
data
|
|
426
|
-
}), {
|
|
427
|
-
initialProps: {
|
|
428
|
-
selectedRows: []
|
|
429
|
-
}
|
|
430
|
-
});
|
|
431
|
-
expect(result.current.rowSelection).toEqual({});
|
|
432
|
-
|
|
433
|
-
// Click row
|
|
434
|
-
act(() => {
|
|
435
|
-
result.current.onToggleRow("item-0", 0);
|
|
436
|
-
});
|
|
437
|
-
|
|
438
|
-
// Callback is called
|
|
439
|
-
expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey]);
|
|
440
|
-
|
|
441
|
-
// State doesn't change (controlled)
|
|
442
|
-
expect(result.current.rowSelection).toEqual({});
|
|
443
|
-
|
|
444
|
-
// Parent updates prop
|
|
445
|
-
rerender({
|
|
446
|
-
selectedRows: [data[0].$primaryKey]
|
|
447
|
-
});
|
|
448
|
-
|
|
449
|
-
// Now state reflects the prop
|
|
450
|
-
expect(result.current.rowSelection).toEqual({
|
|
451
|
-
"item-0": true
|
|
452
|
-
});
|
|
453
|
-
});
|
|
454
|
-
});
|
|
455
|
-
describe("multiple selection mode", () => {
|
|
456
|
-
it("uses selectedRows prop for selection state", () => {
|
|
457
|
-
const data = createMockData(5);
|
|
458
|
-
const {
|
|
459
|
-
result
|
|
460
|
-
} = renderHook(() => useRowSelection({
|
|
461
|
-
selectionMode: "multiple",
|
|
462
|
-
selectedRows: [data[0].$primaryKey, data[2].$primaryKey],
|
|
463
|
-
data
|
|
464
|
-
}));
|
|
465
|
-
expect(result.current.rowSelection).toEqual({
|
|
466
|
-
"item-0": true,
|
|
467
|
-
"item-2": true
|
|
468
|
-
});
|
|
469
|
-
});
|
|
470
|
-
it("calls onRowSelection when toggling rows", () => {
|
|
471
|
-
const data = createMockData(5);
|
|
472
|
-
const onRowSelection = vi.fn();
|
|
473
|
-
const {
|
|
474
|
-
result
|
|
475
|
-
} = renderHook(() => useRowSelection({
|
|
476
|
-
selectionMode: "multiple",
|
|
477
|
-
selectedRows: [data[0].$primaryKey],
|
|
478
|
-
onRowSelection,
|
|
479
|
-
data
|
|
480
|
-
}));
|
|
481
|
-
|
|
482
|
-
// Add selection to selectedRows
|
|
483
|
-
act(() => {
|
|
484
|
-
result.current.onToggleRow("item-2", 2);
|
|
485
|
-
});
|
|
486
|
-
expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey, data[2].$primaryKey]);
|
|
487
|
-
|
|
488
|
-
// Remove selection from selectedRows
|
|
489
|
-
act(() => {
|
|
490
|
-
result.current.onToggleRow("item-0", 0);
|
|
491
|
-
});
|
|
492
|
-
expect(onRowSelection).toHaveBeenCalledWith([]);
|
|
493
|
-
});
|
|
494
|
-
it("calls onRowSelection for shift-click range selection", () => {
|
|
495
|
-
const data = createMockData(5);
|
|
496
|
-
const onRowSelection = vi.fn();
|
|
497
|
-
const {
|
|
498
|
-
result
|
|
499
|
-
} = renderHook(() => useRowSelection({
|
|
500
|
-
selectionMode: "multiple",
|
|
501
|
-
selectedRows: [],
|
|
502
|
-
onRowSelection,
|
|
503
|
-
data
|
|
504
|
-
}));
|
|
505
|
-
|
|
506
|
-
// First click
|
|
507
|
-
act(() => {
|
|
508
|
-
result.current.onToggleRow("item-1", 1);
|
|
509
|
-
});
|
|
510
|
-
|
|
511
|
-
// Shift-click
|
|
512
|
-
act(() => {
|
|
513
|
-
result.current.onToggleRow("item-3", 3, true);
|
|
514
|
-
});
|
|
515
|
-
expect(onRowSelection).toHaveBeenLastCalledWith([data[1].$primaryKey, data[2].$primaryKey, data[3].$primaryKey]);
|
|
516
|
-
});
|
|
517
|
-
it("calls onRowSelection when toggling all rows", () => {
|
|
518
|
-
const data = createMockData(3);
|
|
519
|
-
const onRowSelection = vi.fn();
|
|
520
|
-
const {
|
|
521
|
-
result
|
|
522
|
-
} = renderHook(() => useRowSelection({
|
|
523
|
-
selectionMode: "multiple",
|
|
524
|
-
selectedRows: [],
|
|
525
|
-
onRowSelection,
|
|
526
|
-
data
|
|
527
|
-
}));
|
|
528
|
-
act(() => {
|
|
529
|
-
result.current.onToggleAll();
|
|
530
|
-
});
|
|
531
|
-
expect(onRowSelection).toHaveBeenCalledWith([data[0].$primaryKey, data[1].$primaryKey, data[2].$primaryKey]);
|
|
532
|
-
});
|
|
533
|
-
it("updates when selectedRows prop changes", () => {
|
|
534
|
-
const data = createMockData(5);
|
|
535
|
-
const {
|
|
536
|
-
result,
|
|
537
|
-
rerender
|
|
538
|
-
} = renderHook(({
|
|
539
|
-
selectedRows
|
|
540
|
-
}) => useRowSelection({
|
|
541
|
-
selectionMode: "multiple",
|
|
542
|
-
selectedRows,
|
|
543
|
-
data
|
|
544
|
-
}), {
|
|
545
|
-
initialProps: {
|
|
546
|
-
selectedRows: [data[0].$primaryKey]
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
expect(result.current.rowSelection).toEqual({
|
|
550
|
-
"item-0": true
|
|
551
|
-
});
|
|
552
|
-
rerender({
|
|
553
|
-
selectedRows: [data[1].$primaryKey, data[2].$primaryKey]
|
|
554
|
-
});
|
|
555
|
-
expect(result.current.rowSelection).toEqual({
|
|
556
|
-
"item-1": true,
|
|
557
|
-
"item-2": true
|
|
558
|
-
});
|
|
559
|
-
});
|
|
560
|
-
});
|
|
561
|
-
});
|
|
562
|
-
describe("edge cases", () => {
|
|
563
|
-
it("handles undefined data gracefully", () => {
|
|
564
|
-
const {
|
|
565
|
-
result
|
|
566
|
-
} = renderHook(() => useRowSelection({
|
|
567
|
-
selectionMode: "multiple",
|
|
568
|
-
data: undefined
|
|
569
|
-
}));
|
|
570
|
-
expect(result.current.rowSelection).toEqual({});
|
|
571
|
-
expect(result.current.isAllSelected).toBe(false);
|
|
572
|
-
expect(result.current.hasSelection).toBe(false);
|
|
573
|
-
|
|
574
|
-
// Should not crash
|
|
575
|
-
act(() => {
|
|
576
|
-
result.current.onToggleAll();
|
|
577
|
-
result.current.onToggleRow("item-0", 0);
|
|
578
|
-
});
|
|
579
|
-
});
|
|
580
|
-
it("handles empty data array", () => {
|
|
581
|
-
const {
|
|
582
|
-
result
|
|
583
|
-
} = renderHook(() => useRowSelection({
|
|
584
|
-
selectionMode: "multiple",
|
|
585
|
-
data: []
|
|
586
|
-
}));
|
|
587
|
-
expect(result.current.rowSelection).toEqual({});
|
|
588
|
-
expect(result.current.isAllSelected).toBe(false);
|
|
589
|
-
act(() => {
|
|
590
|
-
result.current.onToggleAll();
|
|
591
|
-
});
|
|
592
|
-
expect(result.current.rowSelection).toEqual({});
|
|
593
|
-
});
|
|
594
|
-
});
|
|
595
|
-
});
|
|
596
|
-
//# sourceMappingURL=useRowSelection.test.js.map
|