@osdk/react-components 0.2.0-beta.16 → 0.2.0-beta.17

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.
Files changed (100) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +5 -3
  3. package/build/browser/base-components/tooltip/Tooltip.js +91 -0
  4. package/build/browser/base-components/tooltip/Tooltip.js.map +1 -0
  5. package/build/browser/base-components/tooltip/Tooltip.module.css +70 -0
  6. package/build/browser/base-components/tooltip/Tooltip.module.css.js +11 -0
  7. package/build/browser/base-components/tooltip/index.js +18 -0
  8. package/build/browser/base-components/tooltip/index.js.map +1 -0
  9. package/build/browser/filter-list/hooks/useFilterListState.js +5 -6
  10. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  11. package/build/browser/filter-list/utils/filterStateToWhereClause.js +18 -3
  12. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  13. package/build/browser/object-table/DefaultCellRenderer.js +6 -1
  14. package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
  15. package/build/browser/object-table/EditableCell.js +76 -9
  16. package/build/browser/object-table/EditableCell.js.map +1 -1
  17. package/build/browser/object-table/EditableCell.module.css +47 -8
  18. package/build/browser/object-table/EditableCell.module.css.js +5 -1
  19. package/build/browser/object-table/MultiColumnSortDialog.js +4 -1
  20. package/build/browser/object-table/MultiColumnSortDialog.js.map +1 -1
  21. package/build/browser/object-table/ObjectTable.js +4 -1
  22. package/build/browser/object-table/ObjectTable.js.map +1 -1
  23. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  24. package/build/browser/object-table/SelectionCells.js +1 -0
  25. package/build/browser/object-table/SelectionCells.js.map +1 -1
  26. package/build/browser/object-table/Table.js +2 -2
  27. package/build/browser/object-table/Table.js.map +1 -1
  28. package/build/browser/object-table/TableBody.js +1 -1
  29. package/build/browser/object-table/TableBody.js.map +1 -1
  30. package/build/browser/object-table/TableEditContainer.js +27 -16
  31. package/build/browser/object-table/TableEditContainer.js.map +1 -1
  32. package/build/browser/object-table/TableEditContainer.module.css +27 -0
  33. package/build/browser/object-table/TableEditContainer.module.css.js +5 -1
  34. package/build/browser/object-table/TableRow.js +2 -2
  35. package/build/browser/object-table/TableRow.js.map +1 -1
  36. package/build/browser/object-table/hooks/useColumnDefs.js +2 -1
  37. package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
  38. package/build/browser/object-table/hooks/useEditableTable.js +21 -2
  39. package/build/browser/object-table/hooks/useEditableTable.js.map +1 -1
  40. package/build/browser/object-table/utils/types.js.map +1 -1
  41. package/build/browser/styles.css +147 -8
  42. package/build/cjs/public/experimental.cjs +969 -772
  43. package/build/cjs/public/experimental.cjs.map +1 -1
  44. package/build/cjs/public/experimental.css +103 -8
  45. package/build/cjs/public/experimental.css.map +1 -1
  46. package/build/cjs/public/experimental.d.cts +18 -4
  47. package/build/esm/base-components/tooltip/Tooltip.js +91 -0
  48. package/build/esm/base-components/tooltip/Tooltip.js.map +1 -0
  49. package/build/esm/base-components/tooltip/Tooltip.module.css +70 -0
  50. package/build/esm/base-components/tooltip/index.js +18 -0
  51. package/build/esm/base-components/tooltip/index.js.map +1 -0
  52. package/build/esm/filter-list/hooks/useFilterListState.js +5 -6
  53. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  54. package/build/esm/filter-list/utils/filterStateToWhereClause.js +18 -3
  55. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  56. package/build/esm/object-table/DefaultCellRenderer.js +6 -1
  57. package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
  58. package/build/esm/object-table/EditableCell.js +76 -9
  59. package/build/esm/object-table/EditableCell.js.map +1 -1
  60. package/build/esm/object-table/EditableCell.module.css +47 -8
  61. package/build/esm/object-table/MultiColumnSortDialog.js +4 -1
  62. package/build/esm/object-table/MultiColumnSortDialog.js.map +1 -1
  63. package/build/esm/object-table/ObjectTable.js +4 -1
  64. package/build/esm/object-table/ObjectTable.js.map +1 -1
  65. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  66. package/build/esm/object-table/SelectionCells.js +1 -0
  67. package/build/esm/object-table/SelectionCells.js.map +1 -1
  68. package/build/esm/object-table/Table.js +2 -2
  69. package/build/esm/object-table/Table.js.map +1 -1
  70. package/build/esm/object-table/TableBody.js +1 -1
  71. package/build/esm/object-table/TableBody.js.map +1 -1
  72. package/build/esm/object-table/TableEditContainer.js +27 -16
  73. package/build/esm/object-table/TableEditContainer.js.map +1 -1
  74. package/build/esm/object-table/TableEditContainer.module.css +27 -0
  75. package/build/esm/object-table/TableRow.js +2 -2
  76. package/build/esm/object-table/TableRow.js.map +1 -1
  77. package/build/esm/object-table/hooks/useColumnDefs.js +2 -1
  78. package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
  79. package/build/esm/object-table/hooks/useEditableTable.js +21 -2
  80. package/build/esm/object-table/hooks/useEditableTable.js.map +1 -1
  81. package/build/esm/object-table/utils/types.js.map +1 -1
  82. package/build/types/base-components/tooltip/Tooltip.d.ts +31 -0
  83. package/build/types/base-components/tooltip/Tooltip.d.ts.map +1 -0
  84. package/build/types/base-components/tooltip/index.d.ts +1 -0
  85. package/build/types/base-components/tooltip/index.d.ts.map +1 -0
  86. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
  87. package/build/types/object-table/EditableCell.d.ts +8 -2
  88. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  89. package/build/types/object-table/ObjectTableApi.d.ts +7 -0
  90. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  91. package/build/types/object-table/Table.d.ts +4 -0
  92. package/build/types/object-table/Table.d.ts.map +1 -1
  93. package/build/types/object-table/TableEditContainer.d.ts +1 -1
  94. package/build/types/object-table/TableEditContainer.d.ts.map +1 -1
  95. package/build/types/object-table/TableRow.d.ts +2 -2
  96. package/build/types/object-table/TableRow.d.ts.map +1 -1
  97. package/build/types/object-table/hooks/useEditableTable.d.ts.map +1 -1
  98. package/build/types/object-table/utils/types.d.ts +7 -4
  99. package/build/types/object-table/utils/types.d.ts.map +1 -1
  100. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","names":["classNames","React","useCallback","useEffect","useRef","useState","LoadingStateTable","NonIdealState","styles","TableBody","TableEditContainer","TableHeader","BaseTable","table","isLoading","fetchNextPage","onRowClick","rowHeight","renderCellContextMenu","className","error","headerMenuFeatureFlags","editableConfig","tableContainerRef","isLoadingMore","setIsLoadingMore","focusedRowId","setFocusedRowId","fetchingRef","fetchMoreOnEndReached","containerRefElement","current","scrollHeight","scrollTop","clientHeight","handleScroll","e","currentTarget","rows","getRowModel","headerGroups","getHeaderGroups","hasData","length","hasEditableColumns","getAllColumns","some","column","columnDef","meta","editable","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","createElement","osdkTableWrapper","ref","osdkTableContainer","onScroll","Fragment","isInEditMode","editMode","isActive","message"],"sources":["Table.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 { Cell, RowData, Table } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, {\n type ReactElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { LoadingStateTable } from \"./LoadingStateTable.js\";\nimport { NonIdealState } from \"./NonIdealState.js\";\nimport styles from \"./Table.module.css\";\nimport { TableBody } from \"./TableBody.js\";\nimport { TableEditContainer } from \"./TableEditContainer.js\";\nimport { TableHeader } from \"./TableHeader.js\";\nimport type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport type { CellEditInfo, EditableConfig } from \"./utils/types.js\";\n\ndeclare module \"@tanstack/react-table\" {\n interface ColumnMeta<TData extends RowData = unknown, TValue = unknown> {\n columnName?: string;\n isVisible?: boolean;\n editable?: boolean;\n dataType?: string;\n }\n interface TableMeta<TData extends RowData = unknown> {\n onCellEdit?: (\n cellId: string,\n info: CellEditInfo<TData, unknown>,\n ) => void;\n cellEdits?: Record<string, CellEditInfo<TData, unknown>>;\n isInEditMode?: boolean;\n }\n}\n\nexport interface BaseTableProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n isLoading?: boolean;\n fetchNextPage?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n rowHeight?: number;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n className?: string;\n error?: Error;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n editableConfig?: EditableConfig<TData, unknown>;\n}\n\nexport function BaseTable<\n TData extends RowData,\n>(\n {\n table,\n isLoading,\n fetchNextPage,\n onRowClick,\n rowHeight,\n renderCellContextMenu,\n className,\n error,\n headerMenuFeatureFlags,\n editableConfig,\n }: BaseTableProps<TData>,\n): ReactElement {\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [focusedRowId, setFocusedRowId] = useState<string | null>(null);\n\n // Using a ref to prevent duplicate fetches from rapid scroll events while a fetch is in-flight\n const fetchingRef = useRef(false);\n\n useEffect(() => {\n if (!isLoading || fetchNextPage == null) {\n setIsLoadingMore(false);\n }\n }, [isLoading, fetchNextPage]);\n\n const fetchMoreOnEndReached = useCallback(\n async (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement && !fetchingRef.current && !isLoadingMore) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n if (\n scrollHeight - scrollTop - clientHeight < 100\n && !isLoading && fetchNextPage != null\n ) {\n fetchingRef.current = true;\n setIsLoadingMore(true);\n try {\n await fetchNextPage();\n } finally {\n fetchingRef.current = false;\n }\n }\n }\n },\n [fetchNextPage, isLoading, isLoadingMore],\n );\n\n const handleScroll = useCallback(\n async (e: React.UIEvent<HTMLDivElement>) => {\n await fetchMoreOnEndReached(e.currentTarget);\n },\n [fetchMoreOnEndReached],\n );\n\n const rows = table.getRowModel().rows;\n const headerGroups = table.getHeaderGroups();\n const hasData = rows.length > 0;\n\n const hasEditableColumns = table\n .getAllColumns()\n .some(column => column.columnDef.meta?.editable === true);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n tableContainerRef.current\n && !tableContainerRef.current.contains(event.target as Node)\n ) {\n setFocusedRowId(null);\n }\n };\n\n document.addEventListener(\"click\", handleClickOutside);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside);\n };\n }, []);\n\n return (\n <div className={classNames(styles.osdkTableWrapper, className)}>\n <div\n ref={tableContainerRef}\n className={styles.osdkTableContainer}\n onScroll={handleScroll}\n >\n <table>\n {isLoading && !hasData\n ? (\n <LoadingStateTable\n table={table}\n headerGroups={headerGroups}\n rowHeight={rowHeight}\n tableContainerRef={tableContainerRef}\n />\n )\n : (\n <>\n <TableHeader\n table={table}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n />\n <TableBody\n rows={rows}\n tableContainerRef={tableContainerRef}\n onRowClick={onRowClick}\n rowHeight={rowHeight}\n renderCellContextMenu={renderCellContextMenu}\n isLoadingMore={isLoadingMore}\n headerGroups={headerGroups}\n focusedRowId={focusedRowId}\n setFocusedRowId={setFocusedRowId}\n isInEditMode={editableConfig?.editMode.isActive}\n />\n </>\n )}\n </table>\n {!hasData && error == null && <NonIdealState message={\"No Data\"} />}\n {error != null && (\n <NonIdealState message={`Error Loading Data: ${error.message}`} />\n )}\n </div>\n {hasEditableColumns && (\n <TableEditContainer\n editableConfig={editableConfig}\n focusedRowId={focusedRowId}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Table.js","names":["classNames","React","useCallback","useEffect","useRef","useState","LoadingStateTable","NonIdealState","styles","TableBody","TableEditContainer","TableHeader","BaseTable","table","isLoading","fetchNextPage","onRowClick","rowHeight","renderCellContextMenu","className","error","headerMenuFeatureFlags","editableConfig","tableContainerRef","isLoadingMore","setIsLoadingMore","focusedRowId","setFocusedRowId","fetchingRef","fetchMoreOnEndReached","containerRefElement","current","scrollHeight","scrollTop","clientHeight","handleScroll","e","currentTarget","rows","getRowModel","headerGroups","getHeaderGroups","hasData","length","hasEditableColumns","getAllColumns","some","column","columnDef","meta","editable","handleClickOutside","event","contains","target","document","addEventListener","removeEventListener","createElement","osdkTableWrapper","ref","osdkTableContainer","onScroll","Fragment","isInEditMode","editModeState","isActive","message"],"sources":["Table.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 { Cell, RowData, Table } from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, {\n type ReactElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { LoadingStateTable } from \"./LoadingStateTable.js\";\nimport { NonIdealState } from \"./NonIdealState.js\";\nimport styles from \"./Table.module.css\";\nimport { TableBody } from \"./TableBody.js\";\nimport { TableEditContainer } from \"./TableEditContainer.js\";\nimport { TableHeader } from \"./TableHeader.js\";\nimport type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport type { CellEditInfo, EditableConfig } from \"./utils/types.js\";\n\ndeclare module \"@tanstack/react-table\" {\n interface ColumnMeta<TData extends RowData = unknown, TValue = unknown> {\n columnName?: string;\n isVisible?: boolean;\n editable?: boolean;\n dataType?: string;\n validateEdit?: (value: unknown) => Promise<string | undefined>;\n }\n interface TableMeta<TData extends RowData = unknown> {\n onCellEdit?: (\n cellId: string,\n info: CellEditInfo<TData, unknown>,\n ) => void;\n onCellValidationError?: (\n cellId: string,\n error: string,\n ) => void;\n clearCellValidationError?: (cellId: string) => void;\n cellEdits?: Record<string, CellEditInfo<TData, unknown>>;\n isInEditMode?: boolean;\n validationErrors?: Map<string, string>;\n }\n}\n\nexport interface BaseTableProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n isLoading?: boolean;\n fetchNextPage?: () => Promise<void>;\n onRowClick?: (row: TData) => void;\n rowHeight?: number;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n className?: string;\n error?: Error;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n editableConfig?: EditableConfig<TData, unknown>;\n}\n\nexport function BaseTable<\n TData extends RowData,\n>(\n {\n table,\n isLoading,\n fetchNextPage,\n onRowClick,\n rowHeight,\n renderCellContextMenu,\n className,\n error,\n headerMenuFeatureFlags,\n editableConfig,\n }: BaseTableProps<TData>,\n): ReactElement {\n const tableContainerRef = useRef<HTMLDivElement>(null);\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [focusedRowId, setFocusedRowId] = useState<string | null>(null);\n\n // Using a ref to prevent duplicate fetches from rapid scroll events while a fetch is in-flight\n const fetchingRef = useRef(false);\n\n useEffect(() => {\n if (!isLoading || fetchNextPage == null) {\n setIsLoadingMore(false);\n }\n }, [isLoading, fetchNextPage]);\n\n const fetchMoreOnEndReached = useCallback(\n async (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement && !fetchingRef.current && !isLoadingMore) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n if (\n scrollHeight - scrollTop - clientHeight < 100\n && !isLoading && fetchNextPage != null\n ) {\n fetchingRef.current = true;\n setIsLoadingMore(true);\n try {\n await fetchNextPage();\n } finally {\n fetchingRef.current = false;\n }\n }\n }\n },\n [fetchNextPage, isLoading, isLoadingMore],\n );\n\n const handleScroll = useCallback(\n async (e: React.UIEvent<HTMLDivElement>) => {\n await fetchMoreOnEndReached(e.currentTarget);\n },\n [fetchMoreOnEndReached],\n );\n\n const rows = table.getRowModel().rows;\n const headerGroups = table.getHeaderGroups();\n const hasData = rows.length > 0;\n\n const hasEditableColumns = table\n .getAllColumns()\n .some(column => column.columnDef.meta?.editable === true);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n tableContainerRef.current\n && !tableContainerRef.current.contains(event.target as Node)\n ) {\n setFocusedRowId(null);\n }\n };\n\n document.addEventListener(\"click\", handleClickOutside);\n return () => {\n document.removeEventListener(\"click\", handleClickOutside);\n };\n }, []);\n\n return (\n <div className={classNames(styles.osdkTableWrapper, className)}>\n <div\n ref={tableContainerRef}\n className={styles.osdkTableContainer}\n onScroll={handleScroll}\n >\n <table>\n {isLoading && !hasData\n ? (\n <LoadingStateTable\n table={table}\n headerGroups={headerGroups}\n rowHeight={rowHeight}\n tableContainerRef={tableContainerRef}\n />\n )\n : (\n <>\n <TableHeader\n table={table}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n />\n <TableBody\n rows={rows}\n tableContainerRef={tableContainerRef}\n onRowClick={onRowClick}\n rowHeight={rowHeight}\n renderCellContextMenu={renderCellContextMenu}\n isLoadingMore={isLoadingMore}\n headerGroups={headerGroups}\n focusedRowId={focusedRowId}\n setFocusedRowId={setFocusedRowId}\n isInEditMode={editableConfig?.editModeState.isActive}\n />\n </>\n )}\n </table>\n {!hasData && error == null && <NonIdealState message={\"No Data\"} />}\n {error != null && (\n <NonIdealState message={`Error Loading Data: ${error.message}`} />\n )}\n </div>\n {hasEditableColumns && editableConfig && (\n <TableEditContainer\n editableConfig={editableConfig}\n focusedRowId={focusedRowId}\n />\n )}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -59,7 +59,7 @@ export function TableBody({
59
59
  virtualRow: virtualRow,
60
60
  onRowClick: onRowClick,
61
61
  renderCellContextMenu: renderCellContextMenu,
62
- focusedRowId: focusedRowId,
62
+ isFocused: focusedRowId === row.id,
63
63
  setFocusedRowId: setFocusedRowId,
64
64
  isInEditMode: isInEditMode
65
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"TableBody.js","names":["useVirtualizer","React","useLayoutEffect","LoadingRow","styles","TableRow","TableBody","rows","tableContainerRef","onRowClick","renderCellContextMenu","rowHeight","isLoadingMore","headerGroups","focusedRowId","setFocusedRowId","isInEditMode","rowVirtualizer","count","length","estimateSize","getScrollElement","current","overscan","measure","totalSize","getTotalSize","bodyHeight","headers","createElement","className","osdkTableBody","style","height","getVirtualItems","map","virtualRow","row","index","key","id","translateY","columnCount"],"sources":["TableBody.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 { Cell, HeaderGroup, Row, RowData } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport React, { useLayoutEffect } from \"react\";\nimport { LoadingRow } from \"./LoadingRow.js\";\nimport styles from \"./TableBody.module.css\";\nimport { TableRow } from \"./TableRow.js\";\n\ninterface TableBodyProps<TData extends RowData> {\n rows: Array<Row<TData>>;\n tableContainerRef: React.RefObject<HTMLDivElement>;\n onRowClick?: (row: TData) => void;\n rowHeight?: number;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n isLoadingMore?: boolean;\n headerGroups?: Array<HeaderGroup<TData>>;\n focusedRowId?: string | null;\n setFocusedRowId?: (rowId: string | null) => void;\n isInEditMode?: boolean;\n}\n\nexport function TableBody<TData extends RowData>({\n rows,\n tableContainerRef,\n onRowClick,\n renderCellContextMenu,\n rowHeight = 40,\n isLoadingMore = false,\n headerGroups = [],\n focusedRowId,\n setFocusedRowId,\n isInEditMode,\n}: TableBodyProps<TData>): React.ReactElement {\n // Important: Keep the row virtualizer in the lowest component possible to avoid unnecessary re-renders.\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: () => rowHeight,\n getScrollElement: () => tableContainerRef.current,\n overscan: 5,\n });\n\n // Measure the virtualizer after the DOM has been laid out to ensure proper dimensions\n useLayoutEffect(() => {\n rowVirtualizer.measure();\n }, [rowVirtualizer, rows.length]);\n\n const totalSize = rowVirtualizer.getTotalSize();\n const bodyHeight = isLoadingMore\n ? totalSize + rowHeight\n : totalSize;\n\n const headers = headerGroups[0]?.headers ?? [];\n\n return (\n <tbody\n className={styles.osdkTableBody}\n style={{\n height: `${bodyHeight}px`,\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const row = rows[virtualRow.index];\n\n return (\n <TableRow\n key={row.id}\n row={row}\n virtualRow={virtualRow}\n onRowClick={onRowClick}\n renderCellContextMenu={renderCellContextMenu}\n focusedRowId={focusedRowId}\n setFocusedRowId={setFocusedRowId}\n isInEditMode={isInEditMode}\n />\n );\n })}\n {isLoadingMore && (\n <LoadingRow\n headers={headers}\n translateY={totalSize}\n rowHeight={rowHeight}\n columnCount={headers.length}\n />\n )}\n </tbody>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,cAAc,QAAQ,yBAAyB;AACxD,OAAOC,KAAK,IAAIC,eAAe,QAAQ,OAAO;AAC9C,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,OAAOC,MAAM,MAAM,wBAAwB;AAC3C,SAASC,QAAQ,QAAQ,eAAe;AAkBxC,OAAO,SAASC,SAASA,CAAwB;EAC/CC,IAAI;EACJC,iBAAiB;EACjBC,UAAU;EACVC,qBAAqB;EACrBC,SAAS,GAAG,EAAE;EACdC,aAAa,GAAG,KAAK;EACrBC,YAAY,GAAG,EAAE;EACjBC,YAAY;EACZC,eAAe;EACfC;AACqB,CAAC,EAAsB;EAC5C;EACA,MAAMC,cAAc,GAAGjB,cAAc,CAAsC;IACzEkB,KAAK,EAAEX,IAAI,CAACY,MAAM;IAClBC,YAAY,EAAEA,CAAA,KAAMT,SAAS;IAC7BU,gBAAgB,EAAEA,CAAA,KAAMb,iBAAiB,CAACc,OAAO;IACjDC,QAAQ,EAAE;EACZ,CAAC,CAAC;;EAEF;EACArB,eAAe,CAAC,MAAM;IACpBe,cAAc,CAACO,OAAO,CAAC,CAAC;EAC1B,CAAC,EAAE,CAACP,cAAc,EAAEV,IAAI,CAACY,MAAM,CAAC,CAAC;EAEjC,MAAMM,SAAS,GAAGR,cAAc,CAACS,YAAY,CAAC,CAAC;EAC/C,MAAMC,UAAU,GAAGf,aAAa,GAC5Ba,SAAS,GAAGd,SAAS,GACrBc,SAAS;EAEb,MAAMG,OAAO,GAAGf,YAAY,CAAC,CAAC,CAAC,EAAEe,OAAO,IAAI,EAAE;EAE9C,oBACE3B,KAAA,CAAA4B,aAAA;IACEC,SAAS,EAAE1B,MAAM,CAAC2B,aAAc;IAChCC,KAAK,EAAE;MACLC,MAAM,EAAE,GAAGN,UAAU;IACvB;EAAE,GAEDV,cAAc,CAACiB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,UAAU,IAAK;IACpD,MAAMC,GAAG,GAAG9B,IAAI,CAAC6B,UAAU,CAACE,KAAK,CAAC;IAElC,oBACErC,KAAA,CAAA4B,aAAA,CAACxB,QAAQ;MACPkC,GAAG,EAAEF,GAAG,CAACG,EAAG;MACZH,GAAG,EAAEA,GAAI;MACTD,UAAU,EAAEA,UAAW;MACvB3B,UAAU,EAAEA,UAAW;MACvBC,qBAAqB,EAAEA,qBAAsB;MAC7CI,YAAY,EAAEA,YAAa;MAC3BC,eAAe,EAAEA,eAAgB;MACjCC,YAAY,EAAEA;IAAa,CAC5B,CAAC;EAEN,CAAC,CAAC,EACDJ,aAAa,iBACZX,KAAA,CAAA4B,aAAA,CAAC1B,UAAU;IACTyB,OAAO,EAAEA,OAAQ;IACjBa,UAAU,EAAEhB,SAAU;IACtBd,SAAS,EAAEA,SAAU;IACrB+B,WAAW,EAAEd,OAAO,CAACT;EAAO,CAC7B,CAEE,CAAC;AAEZ","ignoreList":[]}
1
+ {"version":3,"file":"TableBody.js","names":["useVirtualizer","React","useLayoutEffect","LoadingRow","styles","TableRow","TableBody","rows","tableContainerRef","onRowClick","renderCellContextMenu","rowHeight","isLoadingMore","headerGroups","focusedRowId","setFocusedRowId","isInEditMode","rowVirtualizer","count","length","estimateSize","getScrollElement","current","overscan","measure","totalSize","getTotalSize","bodyHeight","headers","createElement","className","osdkTableBody","style","height","getVirtualItems","map","virtualRow","row","index","key","id","isFocused","translateY","columnCount"],"sources":["TableBody.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 { Cell, HeaderGroup, Row, RowData } from \"@tanstack/react-table\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport React, { useLayoutEffect } from \"react\";\nimport { LoadingRow } from \"./LoadingRow.js\";\nimport styles from \"./TableBody.module.css\";\nimport { TableRow } from \"./TableRow.js\";\n\ninterface TableBodyProps<TData extends RowData> {\n rows: Array<Row<TData>>;\n tableContainerRef: React.RefObject<HTMLDivElement>;\n onRowClick?: (row: TData) => void;\n rowHeight?: number;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n isLoadingMore?: boolean;\n headerGroups?: Array<HeaderGroup<TData>>;\n focusedRowId?: string | null;\n setFocusedRowId?: (rowId: string | null) => void;\n isInEditMode?: boolean;\n}\n\nexport function TableBody<TData extends RowData>({\n rows,\n tableContainerRef,\n onRowClick,\n renderCellContextMenu,\n rowHeight = 40,\n isLoadingMore = false,\n headerGroups = [],\n focusedRowId,\n setFocusedRowId,\n isInEditMode,\n}: TableBodyProps<TData>): React.ReactElement {\n // Important: Keep the row virtualizer in the lowest component possible to avoid unnecessary re-renders.\n const rowVirtualizer = useVirtualizer<HTMLDivElement, HTMLTableRowElement>({\n count: rows.length,\n estimateSize: () => rowHeight,\n getScrollElement: () => tableContainerRef.current,\n overscan: 5,\n });\n\n // Measure the virtualizer after the DOM has been laid out to ensure proper dimensions\n useLayoutEffect(() => {\n rowVirtualizer.measure();\n }, [rowVirtualizer, rows.length]);\n\n const totalSize = rowVirtualizer.getTotalSize();\n const bodyHeight = isLoadingMore\n ? totalSize + rowHeight\n : totalSize;\n\n const headers = headerGroups[0]?.headers ?? [];\n\n return (\n <tbody\n className={styles.osdkTableBody}\n style={{\n height: `${bodyHeight}px`,\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const row = rows[virtualRow.index];\n\n return (\n <TableRow\n key={row.id}\n row={row}\n virtualRow={virtualRow}\n onRowClick={onRowClick}\n renderCellContextMenu={renderCellContextMenu}\n isFocused={focusedRowId === row.id}\n setFocusedRowId={setFocusedRowId}\n isInEditMode={isInEditMode}\n />\n );\n })}\n {isLoadingMore && (\n <LoadingRow\n headers={headers}\n translateY={totalSize}\n rowHeight={rowHeight}\n columnCount={headers.length}\n />\n )}\n </tbody>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,cAAc,QAAQ,yBAAyB;AACxD,OAAOC,KAAK,IAAIC,eAAe,QAAQ,OAAO;AAC9C,SAASC,UAAU,QAAQ,iBAAiB;AAC5C,OAAOC,MAAM,MAAM,wBAAwB;AAC3C,SAASC,QAAQ,QAAQ,eAAe;AAkBxC,OAAO,SAASC,SAASA,CAAwB;EAC/CC,IAAI;EACJC,iBAAiB;EACjBC,UAAU;EACVC,qBAAqB;EACrBC,SAAS,GAAG,EAAE;EACdC,aAAa,GAAG,KAAK;EACrBC,YAAY,GAAG,EAAE;EACjBC,YAAY;EACZC,eAAe;EACfC;AACqB,CAAC,EAAsB;EAC5C;EACA,MAAMC,cAAc,GAAGjB,cAAc,CAAsC;IACzEkB,KAAK,EAAEX,IAAI,CAACY,MAAM;IAClBC,YAAY,EAAEA,CAAA,KAAMT,SAAS;IAC7BU,gBAAgB,EAAEA,CAAA,KAAMb,iBAAiB,CAACc,OAAO;IACjDC,QAAQ,EAAE;EACZ,CAAC,CAAC;;EAEF;EACArB,eAAe,CAAC,MAAM;IACpBe,cAAc,CAACO,OAAO,CAAC,CAAC;EAC1B,CAAC,EAAE,CAACP,cAAc,EAAEV,IAAI,CAACY,MAAM,CAAC,CAAC;EAEjC,MAAMM,SAAS,GAAGR,cAAc,CAACS,YAAY,CAAC,CAAC;EAC/C,MAAMC,UAAU,GAAGf,aAAa,GAC5Ba,SAAS,GAAGd,SAAS,GACrBc,SAAS;EAEb,MAAMG,OAAO,GAAGf,YAAY,CAAC,CAAC,CAAC,EAAEe,OAAO,IAAI,EAAE;EAE9C,oBACE3B,KAAA,CAAA4B,aAAA;IACEC,SAAS,EAAE1B,MAAM,CAAC2B,aAAc;IAChCC,KAAK,EAAE;MACLC,MAAM,EAAE,GAAGN,UAAU;IACvB;EAAE,GAEDV,cAAc,CAACiB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,UAAU,IAAK;IACpD,MAAMC,GAAG,GAAG9B,IAAI,CAAC6B,UAAU,CAACE,KAAK,CAAC;IAElC,oBACErC,KAAA,CAAA4B,aAAA,CAACxB,QAAQ;MACPkC,GAAG,EAAEF,GAAG,CAACG,EAAG;MACZH,GAAG,EAAEA,GAAI;MACTD,UAAU,EAAEA,UAAW;MACvB3B,UAAU,EAAEA,UAAW;MACvBC,qBAAqB,EAAEA,qBAAsB;MAC7C+B,SAAS,EAAE3B,YAAY,KAAKuB,GAAG,CAACG,EAAG;MACnCzB,eAAe,EAAEA,eAAgB;MACjCC,YAAY,EAAEA;IAAa,CAC5B,CAAC;EAEN,CAAC,CAAC,EACDJ,aAAa,iBACZX,KAAA,CAAA4B,aAAA,CAAC1B,UAAU;IACTyB,OAAO,EAAEA,OAAQ;IACjBc,UAAU,EAAEjB,SAAU;IACtBd,SAAS,EAAEA,SAAU;IACrBgC,WAAW,EAAEf,OAAO,CAACT;EAAO,CAC7B,CAEE,CAAC;AAEZ","ignoreList":[]}
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { Error } from "@blueprintjs/icons";
17
18
  import React, { useCallback, useState } from "react";
18
19
  import { ActionButton } from "../base-components/action-button/ActionButton.js";
19
20
  import styles from "./TableEditContainer.module.css";
@@ -25,42 +26,52 @@ export function TableEditContainer({
25
26
  cellEdits,
26
27
  onSubmitEdits,
27
28
  clearEdits,
28
- editMode
29
- } = editableConfig ?? {};
29
+ editModeState,
30
+ validationErrors
31
+ } = editableConfig;
30
32
  const hasEdits = Object.keys(cellEdits ?? {}).length > 0;
33
+ const hasValidationError = (validationErrors?.size ?? 0) > 0;
31
34
  const [isSubmitting, setIsSubmitting] = useState(false);
32
- const isInEditMode = editMode?.isActive;
33
- const canToggleEditMode = editMode?.type === "manual";
35
+ const isInEditMode = editModeState.isActive;
36
+ const canToggleEditMode = editModeState.type === "manual";
34
37
  const handleSubmitEdits = useCallback(async () => {
35
38
  setIsSubmitting(true);
36
39
  try {
37
40
  const success = await onSubmitEdits?.();
38
41
  if (success) {
39
42
  clearEdits?.();
40
- if (editMode?.type === "manual") {
41
- editMode.setActive(false);
43
+ if (editModeState?.type === "manual") {
44
+ editModeState.setActive(false);
42
45
  }
43
46
  }
44
47
  } finally {
45
48
  setIsSubmitting(false);
46
49
  }
47
- }, [editMode, onSubmitEdits, clearEdits]);
50
+ }, [editModeState, onSubmitEdits, clearEdits]);
48
51
  const handleCancelEdits = useCallback(() => {
49
52
  clearEdits?.();
50
- if (editMode?.type === "manual") {
51
- editMode.setActive(false);
53
+ if (editModeState?.type === "manual") {
54
+ editModeState.setActive(false);
52
55
  }
53
- }, [clearEdits, editMode]);
56
+ }, [clearEdits, editModeState]);
54
57
  const handleEnterEditMode = useCallback(() => {
55
- if (editMode?.type === "manual") {
56
- editMode.setActive(true);
58
+ if (editModeState?.type === "manual") {
59
+ editModeState.setActive(true);
57
60
  }
58
- }, [editMode]);
61
+ }, [editModeState]);
59
62
  return /*#__PURE__*/React.createElement("div", {
60
63
  className: styles.tableEditContainer
61
- }, hasEdits ? /*#__PURE__*/React.createElement("div", {
64
+ }, hasEdits || hasValidationError ? /*#__PURE__*/React.createElement("div", {
65
+ className: styles.editsInfoContainer
66
+ }, hasEdits && /*#__PURE__*/React.createElement("div", {
62
67
  className: styles.modificationCount
63
- }, `${cellEdits ? Object.keys(cellEdits).length : 0} modifications`) : isInEditMode && !focusedRowId && /*#__PURE__*/React.createElement("div", {
68
+ }, `${cellEdits ? Object.keys(cellEdits).length : 0} modifications`), hasEdits && hasValidationError && /*#__PURE__*/React.createElement("div", {
69
+ className: styles.divider
70
+ }), hasValidationError && /*#__PURE__*/React.createElement("div", {
71
+ className: styles.validationError
72
+ }, /*#__PURE__*/React.createElement(Error, {
73
+ className: styles.errorIcon
74
+ }), "Validation error")) : isInEditMode && !focusedRowId && /*#__PURE__*/React.createElement("div", {
64
75
  className: styles.placeholder
65
76
  }, "Select a row to edit data\u2026"), /*#__PURE__*/React.createElement("div", {
66
77
  className: styles.editButtons
@@ -73,7 +84,7 @@ export function TableEditContainer({
73
84
  }, "Cancel"), isInEditMode && !!onSubmitEdits && /*#__PURE__*/React.createElement(ActionButton, {
74
85
  variant: "primary",
75
86
  onClick: handleSubmitEdits,
76
- disabled: !hasEdits || isSubmitting
87
+ disabled: !hasEdits || isSubmitting || hasValidationError
77
88
  }, "Submit Edits")));
78
89
  }
79
90
  //# sourceMappingURL=TableEditContainer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableEditContainer.js","names":["React","useCallback","useState","ActionButton","styles","TableEditContainer","editableConfig","focusedRowId","cellEdits","onSubmitEdits","clearEdits","editMode","hasEdits","Object","keys","length","isSubmitting","setIsSubmitting","isInEditMode","isActive","canToggleEditMode","type","handleSubmitEdits","success","setActive","handleCancelEdits","handleEnterEditMode","createElement","className","tableEditContainer","modificationCount","placeholder","editButtons","variant","onClick","disabled"],"sources":["TableEditContainer.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { RowData } from \"@tanstack/react-table\";\nimport React, { type ReactElement, useCallback, useState } from \"react\";\nimport { ActionButton } from \"../base-components/action-button/ActionButton.js\";\nimport styles from \"./TableEditContainer.module.css\";\nimport type { EditableConfig } from \"./utils/types.js\";\n\ninterface TableEditContainerProps<\n TData extends RowData,\n> {\n editableConfig?: EditableConfig<TData, unknown>;\n focusedRowId?: string | null;\n}\n\nexport function TableEditContainer<\n TData extends RowData,\n>({\n editableConfig,\n focusedRowId,\n}: TableEditContainerProps<TData>): ReactElement {\n const {\n cellEdits,\n onSubmitEdits,\n clearEdits,\n editMode,\n } = editableConfig ?? {};\n\n const hasEdits = Object.keys(cellEdits ?? {}).length > 0;\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isInEditMode = editMode?.isActive;\n const canToggleEditMode = editMode?.type === \"manual\";\n\n const handleSubmitEdits = useCallback(async () => {\n setIsSubmitting(true);\n try {\n const success = await onSubmitEdits?.();\n if (success) {\n clearEdits?.();\n if (editMode?.type === \"manual\") {\n editMode.setActive(false);\n }\n }\n } finally {\n setIsSubmitting(false);\n }\n }, [editMode, onSubmitEdits, clearEdits]);\n\n const handleCancelEdits = useCallback(() => {\n clearEdits?.();\n if (editMode?.type === \"manual\") {\n editMode.setActive(false);\n }\n }, [clearEdits, editMode]);\n\n const handleEnterEditMode = useCallback(() => {\n if (editMode?.type === \"manual\") {\n editMode.setActive(true);\n }\n }, [editMode]);\n\n return (\n <div className={styles.tableEditContainer}>\n {hasEdits\n ? (\n <div className={styles.modificationCount}>\n {`${cellEdits ? Object.keys(cellEdits).length : 0} modifications`}\n </div>\n )\n : (isInEditMode && !focusedRowId && (\n <div className={styles.placeholder}>\n Select a row to edit data…\n </div>\n ))}\n <div className={styles.editButtons}>\n {!isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"primary\"\n onClick={handleEnterEditMode}\n >\n Edit Table\n </ActionButton>\n )}\n {isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"secondary\"\n onClick={handleCancelEdits}\n >\n Cancel\n </ActionButton>\n )}\n {isInEditMode && !!onSubmitEdits && (\n <ActionButton\n variant=\"primary\"\n onClick={handleSubmitEdits}\n disabled={!hasEdits || isSubmitting}\n >\n Submit Edits\n </ActionButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TableEditContainer.js","names":["Error","React","useCallback","useState","ActionButton","styles","TableEditContainer","editableConfig","focusedRowId","cellEdits","onSubmitEdits","clearEdits","editModeState","validationErrors","hasEdits","Object","keys","length","hasValidationError","size","isSubmitting","setIsSubmitting","isInEditMode","isActive","canToggleEditMode","type","handleSubmitEdits","success","setActive","handleCancelEdits","handleEnterEditMode","createElement","className","tableEditContainer","editsInfoContainer","modificationCount","divider","validationError","errorIcon","placeholder","editButtons","variant","onClick","disabled"],"sources":["TableEditContainer.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { Error } from \"@blueprintjs/icons\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport React, { type ReactElement, useCallback, useState } from \"react\";\nimport { ActionButton } from \"../base-components/action-button/ActionButton.js\";\nimport styles from \"./TableEditContainer.module.css\";\nimport type { EditableConfig } from \"./utils/types.js\";\n\ninterface TableEditContainerProps<\n TData extends RowData,\n> {\n editableConfig: EditableConfig<TData, unknown>;\n focusedRowId?: string | null;\n}\n\nexport function TableEditContainer<\n TData extends RowData,\n>({\n editableConfig,\n focusedRowId,\n}: TableEditContainerProps<TData>): ReactElement {\n const {\n cellEdits,\n onSubmitEdits,\n clearEdits,\n editModeState,\n validationErrors,\n } = editableConfig;\n\n const hasEdits = Object.keys(cellEdits ?? {}).length > 0;\n const hasValidationError = (validationErrors?.size ?? 0) > 0;\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isInEditMode = editModeState.isActive;\n const canToggleEditMode = editModeState.type === \"manual\";\n\n const handleSubmitEdits = useCallback(async () => {\n setIsSubmitting(true);\n try {\n const success = await onSubmitEdits?.();\n if (success) {\n clearEdits?.();\n if (editModeState?.type === \"manual\") {\n editModeState.setActive(false);\n }\n }\n } finally {\n setIsSubmitting(false);\n }\n }, [editModeState, onSubmitEdits, clearEdits]);\n\n const handleCancelEdits = useCallback(() => {\n clearEdits?.();\n if (editModeState?.type === \"manual\") {\n editModeState.setActive(false);\n }\n }, [clearEdits, editModeState]);\n\n const handleEnterEditMode = useCallback(() => {\n if (editModeState?.type === \"manual\") {\n editModeState.setActive(true);\n }\n }, [editModeState]);\n\n return (\n <div className={styles.tableEditContainer}>\n {hasEdits || hasValidationError\n ? (\n <div className={styles.editsInfoContainer}>\n {hasEdits && (\n <div className={styles.modificationCount}>\n {`${\n cellEdits ? Object.keys(cellEdits).length : 0\n } modifications`}\n </div>\n )}\n {hasEdits && hasValidationError && (\n <div className={styles.divider} />\n )}\n {hasValidationError && (\n <div className={styles.validationError}>\n <Error className={styles.errorIcon} />\n Validation error\n </div>\n )}\n </div>\n )\n : (isInEditMode && !focusedRowId && (\n <div className={styles.placeholder}>\n Select a row to edit data…\n </div>\n ))}\n <div className={styles.editButtons}>\n {!isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"primary\"\n onClick={handleEnterEditMode}\n >\n Edit Table\n </ActionButton>\n )}\n {isInEditMode && canToggleEditMode && (\n <ActionButton\n variant=\"secondary\"\n onClick={handleCancelEdits}\n >\n Cancel\n </ActionButton>\n )}\n {isInEditMode && !!onSubmitEdits && (\n <ActionButton\n variant=\"primary\"\n onClick={handleSubmitEdits}\n disabled={!hasEdits || isSubmitting || hasValidationError}\n >\n Submit Edits\n </ActionButton>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -30,6 +30,15 @@
30
30
  padding: calc(var(--osdk-surface-spacing) * 2) 0;
31
31
  }
32
32
 
33
+ .editsInfoContainer {
34
+ display: flex;
35
+ align-items: center;
36
+ justify-content: center;
37
+ flex-direction: row;
38
+ gap: calc(var(--osdk-surface-spacing) * 3);
39
+ font-size: var(--osdk-typography-size-body-small);
40
+ }
41
+
33
42
  .modificationCount {
34
43
  color: var(--osdk-intent-primary-rest);
35
44
  font-size: var(--osdk-typography-size-body-small);
@@ -42,3 +51,21 @@
42
51
  gap: 8px;
43
52
  flex: 1;
44
53
  }
54
+
55
+ .validationError {
56
+ display: flex;
57
+ align-items: center;
58
+ gap: calc(var(--osdk-surface-spacing) * 2);
59
+ color: var(--osdk-intent-danger-rest);
60
+ }
61
+
62
+ .errorIcon {
63
+ color: var(--osdk-intent-danger-rest);
64
+ }
65
+
66
+ .divider {
67
+ width: 1px;
68
+ height: 8px;
69
+ background-color: var(--osdk-surface-border-color-default);
70
+ align-self: center;
71
+ }
@@ -22,7 +22,7 @@ export function TableRow({
22
22
  virtualRow,
23
23
  onRowClick,
24
24
  renderCellContextMenu,
25
- focusedRowId,
25
+ isFocused,
26
26
  setFocusedRowId,
27
27
  isInEditMode
28
28
  }) {
@@ -34,7 +34,7 @@ export function TableRow({
34
34
  }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);
35
35
  return /*#__PURE__*/React.createElement("tr", {
36
36
  "data-selected": row.getIsSelected(),
37
- "data-focused": focusedRowId === row.id,
37
+ "data-focused": isFocused,
38
38
  className: styles.osdkTableRow,
39
39
  style: {
40
40
  height: `${virtualRow.size}px`,
@@ -1 +1 @@
1
- {"version":3,"file":"TableRow.js","names":["React","useCallback","TableCell","styles","TableRow","row","virtualRow","onRowClick","renderCellContextMenu","focusedRowId","setFocusedRowId","isInEditMode","handleClick","id","original","createElement","getIsSelected","className","osdkTableRow","style","height","size","transform","start","onClick","getVisibleCells","map","cell","key"],"sources":["TableRow.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 { Cell, Row, RowData } from \"@tanstack/react-table\";\nimport type { VirtualItem } from \"@tanstack/react-virtual\";\nimport React, { useCallback } from \"react\";\nimport { TableCell } from \"./TableCell.js\";\nimport styles from \"./TableRow.module.css\";\n\ninterface TableRowProps<TData extends RowData> {\n row: Row<TData>;\n virtualRow: VirtualItem;\n onRowClick?: (row: TData) => void;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n focusedRowId?: string | null;\n setFocusedRowId?: (rowId: string | null) => void;\n isInEditMode?: boolean;\n}\n\nexport function TableRow<TData extends RowData>({\n row,\n virtualRow,\n onRowClick,\n renderCellContextMenu,\n focusedRowId,\n setFocusedRowId,\n isInEditMode,\n}: TableRowProps<TData>): React.ReactElement {\n const handleClick = useCallback(() => {\n setFocusedRowId?.(row.id);\n\n if (!isInEditMode) {\n onRowClick?.(row.original);\n }\n }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);\n\n return (\n <tr\n data-selected={row.getIsSelected()}\n data-focused={focusedRowId === row.id}\n className={styles.osdkTableRow}\n style={{\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n onClick={handleClick}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n cell={cell}\n renderCellContextMenu={renderCellContextMenu}\n />\n ))}\n </tr>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,OAAOC,MAAM,MAAM,uBAAuB;AAe1C,OAAO,SAASC,QAAQA,CAAwB;EAC9CC,GAAG;EACHC,UAAU;EACVC,UAAU;EACVC,qBAAqB;EACrBC,YAAY;EACZC,eAAe;EACfC;AACoB,CAAC,EAAsB;EAC3C,MAAMC,WAAW,GAAGX,WAAW,CAAC,MAAM;IACpCS,eAAe,GAAGL,GAAG,CAACQ,EAAE,CAAC;IAEzB,IAAI,CAACF,YAAY,EAAE;MACjBJ,UAAU,GAAGF,GAAG,CAACS,QAAQ,CAAC;IAC5B;EACF,CAAC,EAAE,CAACH,YAAY,EAAEJ,UAAU,EAAEF,GAAG,CAACS,QAAQ,EAAET,GAAG,CAACQ,EAAE,EAAEH,eAAe,CAAC,CAAC;EAErE,oBACEV,KAAA,CAAAe,aAAA;IACE,iBAAeV,GAAG,CAACW,aAAa,CAAC,CAAE;IACnC,gBAAcP,YAAY,KAAKJ,GAAG,CAACQ,EAAG;IACtCI,SAAS,EAAEd,MAAM,CAACe,YAAa;IAC/BC,KAAK,EAAE;MACLC,MAAM,EAAE,GAAGd,UAAU,CAACe,IAAI,IAAI;MAC9BC,SAAS,EAAE,cAAchB,UAAU,CAACiB,KAAK;IAC3C,CAAE;IACFC,OAAO,EAAEZ;EAAY,GAEpBP,GAAG,CAACoB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,IAAI,iBAC9B3B,KAAA,CAAAe,aAAA,CAACb,SAAS;IACR0B,GAAG,EAAED,IAAI,CAACd,EAAG;IACbc,IAAI,EAAEA,IAAK;IACXnB,qBAAqB,EAAEA;EAAsB,CAC9C,CACF,CACC,CAAC;AAET","ignoreList":[]}
1
+ {"version":3,"file":"TableRow.js","names":["React","useCallback","TableCell","styles","TableRow","row","virtualRow","onRowClick","renderCellContextMenu","isFocused","setFocusedRowId","isInEditMode","handleClick","id","original","createElement","getIsSelected","className","osdkTableRow","style","height","size","transform","start","onClick","getVisibleCells","map","cell","key"],"sources":["TableRow.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 { Cell, Row, RowData } from \"@tanstack/react-table\";\nimport type { VirtualItem } from \"@tanstack/react-virtual\";\nimport React, { useCallback } from \"react\";\nimport { TableCell } from \"./TableCell.js\";\nimport styles from \"./TableRow.module.css\";\n\ninterface TableRowProps<TData extends RowData> {\n row: Row<TData>;\n virtualRow: VirtualItem;\n onRowClick?: (row: TData) => void;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n isFocused: boolean;\n setFocusedRowId?: (rowId: string | null) => void;\n isInEditMode?: boolean;\n}\n\nexport function TableRow<TData extends RowData>({\n row,\n virtualRow,\n onRowClick,\n renderCellContextMenu,\n isFocused,\n setFocusedRowId,\n isInEditMode,\n}: TableRowProps<TData>): React.ReactElement {\n const handleClick = useCallback(() => {\n setFocusedRowId?.(row.id);\n\n if (!isInEditMode) {\n onRowClick?.(row.original);\n }\n }, [isInEditMode, onRowClick, row.original, row.id, setFocusedRowId]);\n\n return (\n <tr\n data-selected={row.getIsSelected()}\n data-focused={isFocused}\n className={styles.osdkTableRow}\n style={{\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n onClick={handleClick}\n >\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n cell={cell}\n renderCellContextMenu={renderCellContextMenu}\n />\n ))}\n </tr>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,OAAOC,MAAM,MAAM,uBAAuB;AAe1C,OAAO,SAASC,QAAQA,CAAwB;EAC9CC,GAAG;EACHC,UAAU;EACVC,UAAU;EACVC,qBAAqB;EACrBC,SAAS;EACTC,eAAe;EACfC;AACoB,CAAC,EAAsB;EAC3C,MAAMC,WAAW,GAAGX,WAAW,CAAC,MAAM;IACpCS,eAAe,GAAGL,GAAG,CAACQ,EAAE,CAAC;IAEzB,IAAI,CAACF,YAAY,EAAE;MACjBJ,UAAU,GAAGF,GAAG,CAACS,QAAQ,CAAC;IAC5B;EACF,CAAC,EAAE,CAACH,YAAY,EAAEJ,UAAU,EAAEF,GAAG,CAACS,QAAQ,EAAET,GAAG,CAACQ,EAAE,EAAEH,eAAe,CAAC,CAAC;EAErE,oBACEV,KAAA,CAAAe,aAAA;IACE,iBAAeV,GAAG,CAACW,aAAa,CAAC,CAAE;IACnC,gBAAcP,SAAU;IACxBQ,SAAS,EAAEd,MAAM,CAACe,YAAa;IAC/BC,KAAK,EAAE;MACLC,MAAM,EAAE,GAAGd,UAAU,CAACe,IAAI,IAAI;MAC9BC,SAAS,EAAE,cAAchB,UAAU,CAACiB,KAAK;IAC3C,CAAE;IACFC,OAAO,EAAEZ;EAAY,GAEpBP,GAAG,CAACoB,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,IAAI,iBAC9B3B,KAAA,CAAAe,aAAA,CAACb,SAAS;IACR0B,GAAG,EAAED,IAAI,CAACd,EAAG;IACbc,IAAI,EAAEA,IAAK;IACXnB,qBAAqB,EAAEA;EAAsB,CAC9C,CACF,CACC,CAAC;AAET","ignoreList":[]}
@@ -68,7 +68,8 @@ function getColumnsFromColumnDefinitions(columnDefinitions, objectProperties) {
68
68
  columnName: columnName || propertyMetadata?.displayName,
69
69
  isVisible: col.isVisible !== false,
70
70
  editable,
71
- dataType
71
+ dataType,
72
+ validateEdit: col.validateEdit
72
73
  },
73
74
  size: width,
74
75
  ...(minWidth ? {
@@ -1 +1 @@
1
- {"version":3,"file":"useColumnDefs.js","names":["useOsdkMetadata","useMemo","renderDefaultCell","useColumnDefs","objectType","columnDefinitions","metadata","loading","error","columns","objectProperties","properties","getColumnsFromColumnDefinitions","getDefaultColumns","map","col","locator","width","minWidth","maxWidth","resizable","orderable","filterable","editable","renderCell","renderHeader","columnName","propertyMetadata","type","id","undefined","colKey","dataType","colDef","accessorKey","header","displayName","meta","isVisible","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","cell","cellContext","object","row","original","Object","entries","key","property"],"sources":["useColumnDefs.ts"],"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 ObjectMetadata,\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport type { AccessorColumnDef } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { renderDefaultCell } from \"../DefaultCellRenderer.js\";\nimport type { ColumnDefinition } from \"../ObjectTableApi.js\";\n\ninterface UseColumnDefsResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n> {\n columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[];\n\n loading: boolean;\n\n error: string | undefined;\n}\n\n/**\n * Hook which builds column definitions for tanstack-table given the objectSet\n */\nexport function useColumnDefs<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n objectType: Q,\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): UseColumnDefsResult<Q, RDPs> {\n const { metadata, loading, error } = useOsdkMetadata(objectType);\n\n const columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[] = useMemo(() => {\n const objectProperties = metadata?.properties;\n // If columnDefinitions is provided, construct colDefs with it\n if (columnDefinitions) {\n return getColumnsFromColumnDefinitions<Q, RDPs, FunctionColumns>(\n columnDefinitions,\n objectProperties,\n );\n }\n\n // If not, return the default columns from the object properties\n return getDefaultColumns<Q, RDPs>(objectProperties);\n }, [columnDefinitions, metadata?.properties]);\n\n return { columns, loading, error };\n}\n\nfunction getColumnsFromColumnDefinitions<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n return columnDefinitions.map((col) => {\n const {\n locator,\n width,\n minWidth,\n maxWidth,\n resizable,\n orderable,\n filterable,\n editable,\n renderCell,\n renderHeader,\n columnName,\n } = col;\n\n const propertyMetadata = locator.type === \"property\"\n ? objectProperties?.[locator.id]\n : undefined;\n\n const colKey = locator.id as string;\n\n const dataType =\n propertyMetadata?.type && typeof propertyMetadata.type === \"string\"\n ? propertyMetadata.type\n : undefined;\n\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n id: colKey,\n accessorKey: colKey,\n header: renderHeader ?? (columnName || propertyMetadata?.displayName),\n meta: {\n columnName: columnName || propertyMetadata?.displayName,\n isVisible: col.isVisible !== false,\n editable,\n dataType,\n },\n size: width,\n ...(minWidth ? { minSize: minWidth } : {}),\n ...(maxWidth ? { maxSize: maxWidth } : {}),\n enableResizing: resizable,\n enableSorting: orderable,\n enableColumnFilter: filterable,\n cell: (cellContext) => {\n const object: Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n > = cellContext.row.original;\n\n if (renderCell) {\n return renderCell(object, locator);\n }\n\n return renderDefaultCell(cellContext);\n },\n };\n\n return colDef;\n });\n}\n\nfunction getDefaultColumns<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n>(\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n if (!objectProperties) return [];\n\n return Object.entries(objectProperties).map(([key, property]) => {\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n accessorKey: key,\n header: property.displayName ?? key,\n };\n return colDef;\n });\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,eAAe,QAAQ,aAAa;AAE7C,SAASC,OAAO,QAAQ,OAAO;AAC/B,SAASC,iBAAiB,QAAQ,2BAA2B;AAgB7D;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAW3BC,UAAa,EACbC,iBAAqE,EACvC;EAC9B,MAAM;IAAEC,QAAQ;IAAEC,OAAO;IAAEC;EAAM,CAAC,GAAGR,eAAe,CAACI,UAAU,CAAC;EAEhE,MAAMK,OAEH,GAAGR,OAAO,CAAC,MAAM;IAClB,MAAMS,gBAAgB,GAAGJ,QAAQ,EAAEK,UAAU;IAC7C;IACA,IAAIN,iBAAiB,EAAE;MACrB,OAAOO,+BAA+B,CACpCP,iBAAiB,EACjBK,gBACF,CAAC;IACH;;IAEA;IACA,OAAOG,iBAAiB,CAAUH,gBAAgB,CAAC;EACrD,CAAC,EAAE,CAACL,iBAAiB,EAAEC,QAAQ,EAAEK,UAAU,CAAC,CAAC;EAE7C,OAAO;IAAEF,OAAO;IAAEF,OAAO;IAAEC;EAAM,CAAC;AACpC;AAEA,SAASI,+BAA+BA,CAWtCP,iBAAoE,EACpEK,gBAAuD,EAKvD;EACA,OAAOL,iBAAiB,CAACS,GAAG,CAAEC,GAAG,IAAK;IACpC,MAAM;MACJC,OAAO;MACPC,KAAK;MACLC,QAAQ;MACRC,QAAQ;MACRC,SAAS;MACTC,SAAS;MACTC,UAAU;MACVC,QAAQ;MACRC,UAAU;MACVC,YAAY;MACZC;IACF,CAAC,GAAGX,GAAG;IAEP,MAAMY,gBAAgB,GAAGX,OAAO,CAACY,IAAI,KAAK,UAAU,GAChDlB,gBAAgB,GAAGM,OAAO,CAACa,EAAE,CAAC,GAC9BC,SAAS;IAEb,MAAMC,MAAM,GAAGf,OAAO,CAACa,EAAY;IAEnC,MAAMG,QAAQ,GACZL,gBAAgB,EAAEC,IAAI,IAAI,OAAOD,gBAAgB,CAACC,IAAI,KAAK,QAAQ,GAC/DD,gBAAgB,CAACC,IAAI,GACrBE,SAAS;IAEf,MAAMG,MAEL,GAAG;MACFJ,EAAE,EAAEE,MAAM;MACVG,WAAW,EAAEH,MAAM;MACnBI,MAAM,EAAEV,YAAY,KAAKC,UAAU,IAAIC,gBAAgB,EAAES,WAAW,CAAC;MACrEC,IAAI,EAAE;QACJX,UAAU,EAAEA,UAAU,IAAIC,gBAAgB,EAAES,WAAW;QACvDE,SAAS,EAAEvB,GAAG,CAACuB,SAAS,KAAK,KAAK;QAClCf,QAAQ;QACRS;MACF,CAAC;MACDO,IAAI,EAAEtB,KAAK;MACX,IAAIC,QAAQ,GAAG;QAAEsB,OAAO,EAAEtB;MAAS,CAAC,GAAG,CAAC,CAAC,CAAC;MAC1C,IAAIC,QAAQ,GAAG;QAAEsB,OAAO,EAAEtB;MAAS,CAAC,GAAG,CAAC,CAAC,CAAC;MAC1CuB,cAAc,EAAEtB,SAAS;MACzBuB,aAAa,EAAEtB,SAAS;MACxBuB,kBAAkB,EAAEtB,UAAU;MAC9BuB,IAAI,EAAGC,WAAW,IAAK;QACrB,MAAMC,MAKL,GAAGD,WAAW,CAACE,GAAG,CAACC,QAAQ;QAE5B,IAAIzB,UAAU,EAAE;UACd,OAAOA,UAAU,CAACuB,MAAM,EAAE/B,OAAO,CAAC;QACpC;QAEA,OAAOd,iBAAiB,CAAC4C,WAAW,CAAC;MACvC;IACF,CAAC;IAED,OAAOb,MAAM;EACf,CAAC,CAAC;AACJ;AAEA,SAASpB,iBAAiBA,CAOxBH,gBAAuD,EAKvD;EACA,IAAI,CAACA,gBAAgB,EAAE,OAAO,EAAE;EAEhC,OAAOwC,MAAM,CAACC,OAAO,CAACzC,gBAAgB,CAAC,CAACI,GAAG,CAAC,CAAC,CAACsC,GAAG,EAAEC,QAAQ,CAAC,KAAK;IAC/D,MAAMpB,MAEL,GAAG;MACFC,WAAW,EAAEkB,GAAG;MAChBjB,MAAM,EAAEkB,QAAQ,CAACjB,WAAW,IAAIgB;IAClC,CAAC;IACD,OAAOnB,MAAM;EACf,CAAC,CAAC;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"useColumnDefs.js","names":["useOsdkMetadata","useMemo","renderDefaultCell","useColumnDefs","objectType","columnDefinitions","metadata","loading","error","columns","objectProperties","properties","getColumnsFromColumnDefinitions","getDefaultColumns","map","col","locator","width","minWidth","maxWidth","resizable","orderable","filterable","editable","renderCell","renderHeader","columnName","propertyMetadata","type","id","undefined","colKey","dataType","colDef","accessorKey","header","displayName","meta","isVisible","validateEdit","size","minSize","maxSize","enableResizing","enableSorting","enableColumnFilter","cell","cellContext","object","row","original","Object","entries","key","property"],"sources":["useColumnDefs.ts"],"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 ObjectMetadata,\n ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport type { AccessorColumnDef } from \"@tanstack/react-table\";\nimport { useMemo } from \"react\";\nimport { renderDefaultCell } from \"../DefaultCellRenderer.js\";\nimport type { ColumnDefinition } from \"../ObjectTableApi.js\";\n\ninterface UseColumnDefsResult<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<string, never>,\n> {\n columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[];\n\n loading: boolean;\n\n error: string | undefined;\n}\n\n/**\n * Hook which builds column definitions for tanstack-table given the objectSet\n */\nexport function useColumnDefs<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n objectType: Q,\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n): UseColumnDefsResult<Q, RDPs> {\n const { metadata, loading, error } = useOsdkMetadata(objectType);\n\n const columns: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >[] = useMemo(() => {\n const objectProperties = metadata?.properties;\n // If columnDefinitions is provided, construct colDefs with it\n if (columnDefinitions) {\n return getColumnsFromColumnDefinitions<Q, RDPs, FunctionColumns>(\n columnDefinitions,\n objectProperties,\n );\n }\n\n // If not, return the default columns from the object properties\n return getDefaultColumns<Q, RDPs>(objectProperties);\n }, [columnDefinitions, metadata?.properties]);\n\n return { columns, loading, error };\n}\n\nfunction getColumnsFromColumnDefinitions<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>(\n columnDefinitions: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>,\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n return columnDefinitions.map((col) => {\n const {\n locator,\n width,\n minWidth,\n maxWidth,\n resizable,\n orderable,\n filterable,\n editable,\n renderCell,\n renderHeader,\n columnName,\n } = col;\n\n const propertyMetadata = locator.type === \"property\"\n ? objectProperties?.[locator.id]\n : undefined;\n\n const colKey = locator.id as string;\n\n const dataType =\n propertyMetadata?.type && typeof propertyMetadata.type === \"string\"\n ? propertyMetadata.type\n : undefined;\n\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n id: colKey,\n accessorKey: colKey,\n header: renderHeader ?? (columnName || propertyMetadata?.displayName),\n meta: {\n columnName: columnName || propertyMetadata?.displayName,\n isVisible: col.isVisible !== false,\n editable,\n dataType,\n validateEdit: col.validateEdit,\n },\n size: width,\n ...(minWidth ? { minSize: minWidth } : {}),\n ...(maxWidth ? { maxSize: maxWidth } : {}),\n enableResizing: resizable,\n enableSorting: orderable,\n enableColumnFilter: filterable,\n cell: (cellContext) => {\n const object: Osdk.Instance<\n Q,\n \"$allBaseProperties\",\n PropertyKeys<Q>,\n RDPs\n > = cellContext.row.original;\n\n if (renderCell) {\n return renderCell(object, locator);\n }\n\n return renderDefaultCell(cellContext);\n },\n };\n\n return colDef;\n });\n}\n\nfunction getDefaultColumns<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n>(\n objectProperties?: Record<any, ObjectMetadata.Property>,\n): Array<\n AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >\n> {\n if (!objectProperties) return [];\n\n return Object.entries(objectProperties).map(([key, property]) => {\n const colDef: AccessorColumnDef<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n > = {\n accessorKey: key,\n header: property.displayName ?? key,\n };\n return colDef;\n });\n}\n"],"mappings":"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","ignoreList":[]}
@@ -22,6 +22,14 @@ export function useEditableTable({
22
22
  }) {
23
23
  const [isActive, setActive] = useState(editMode === "always");
24
24
  const [cellEdits, setCellEdits] = useState({});
25
+ const [validationErrors, setValidationErrors] = useState(new Map());
26
+ const clearCellValidationError = useCallback(cellId => {
27
+ setValidationErrors(prev => {
28
+ const newErrors = new Map(prev);
29
+ newErrors.delete(cellId);
30
+ return newErrors;
31
+ });
32
+ }, []);
25
33
  const handleCellEdit = useCallback((cellId, info) => {
26
34
  // If value is changed back to original, remove it from edits
27
35
  if (info.newValue === info.oldValue) {
@@ -42,12 +50,20 @@ export function useEditableTable({
42
50
  }, [onCellValueChanged]);
43
51
  const clearEdits = useCallback(() => {
44
52
  setCellEdits({});
53
+ setValidationErrors(new Map());
45
54
  }, []);
46
55
  const handleSubmitEdits = useCallback(async () => {
47
56
  const edits = Object.values(cellEdits);
48
57
  return onSubmitEdits ? onSubmitEdits(edits) : false;
49
58
  }, [cellEdits, onSubmitEdits]);
50
- const editModeConfig = editMode === "always" ? {
59
+ const onCellValidationError = useCallback((cellId, error) => {
60
+ setValidationErrors(prev => {
61
+ const newErrors = new Map(prev);
62
+ newErrors.set(cellId, error);
63
+ return newErrors;
64
+ });
65
+ }, []);
66
+ const editModeState = editMode === "always" ? {
51
67
  type: "always",
52
68
  isActive: true
53
69
  } : {
@@ -60,7 +76,10 @@ export function useEditableTable({
60
76
  onCellEdit: handleCellEdit,
61
77
  onSubmitEdits: onSubmitEdits ? handleSubmitEdits : undefined,
62
78
  clearEdits,
63
- editMode: editModeConfig
79
+ editModeState,
80
+ onCellValidationError,
81
+ validationErrors,
82
+ clearCellValidationError
64
83
  };
65
84
  }
66
85
  //# sourceMappingURL=useEditableTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useEditableTable.js","names":["useCallback","useState","useEditableTable","editMode","onCellValueChanged","onSubmitEdits","isActive","setActive","cellEdits","setCellEdits","handleCellEdit","cellId","info","newValue","oldValue","prev","_","rest","clearEdits","handleSubmitEdits","edits","Object","values","editModeConfig","type","onCellEdit","undefined"],"sources":["useEditableTable.ts"],"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 ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useCallback, useState } from \"react\";\nimport type { ObjectTableProps } from \"../ObjectTableApi.js\";\nimport type { CellEditInfo, EditableConfig, EditMode } from \"../utils/types.js\";\n\nexport interface UseEditableTableProps<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n editMode?: \"always\" | \"manual\";\n\n onCellValueChanged?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onCellValueChanged\"];\n\n onSubmitEdits?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onSubmitEdits\"];\n}\n\nexport function useEditableTable<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>({\n editMode = \"manual\",\n onCellValueChanged,\n onSubmitEdits,\n}: UseEditableTableProps<Q, RDPs, FunctionColumns>): EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n> {\n const [isActive, setActive] = useState(editMode === \"always\");\n const [cellEdits, setCellEdits] = useState<\n Record<\n string,\n CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >\n >\n >(\n {},\n );\n\n const handleCellEdit = useCallback(\n (\n cellId: string,\n info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n // If value is changed back to original, remove it from edits\n if (info.newValue === info.oldValue) {\n setCellEdits(prev => {\n const { [cellId]: _, ...rest } = prev;\n return rest;\n });\n } else {\n setCellEdits(prev => ({\n ...prev,\n [cellId]: info,\n }));\n }\n\n onCellValueChanged?.(info);\n },\n [onCellValueChanged],\n );\n\n const clearEdits = useCallback(() => {\n setCellEdits({});\n }, []);\n\n const handleSubmitEdits = useCallback(async () => {\n const edits = Object.values(cellEdits);\n return onSubmitEdits ? onSubmitEdits(edits) : false;\n }, [cellEdits, onSubmitEdits]);\n\n const editModeConfig: EditMode = editMode === \"always\"\n ? { type: \"always\", isActive: true }\n : { type: \"manual\", isActive, setActive };\n\n return {\n cellEdits,\n onCellEdit: handleCellEdit,\n onSubmitEdits: onSubmitEdits ? handleSubmitEdits : undefined,\n clearEdits,\n editMode: editModeConfig,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AA8B7C,OAAO,SAASC,gBAAgBA,CAU9B;EACAC,QAAQ,GAAG,QAAQ;EACnBC,kBAAkB;EAClBC;AAC+C,CAAC,EAGhD;EACA,MAAM,CAACC,QAAQ,EAAEC,SAAS,CAAC,GAAGN,QAAQ,CAACE,QAAQ,KAAK,QAAQ,CAAC;EAC7D,MAAM,CAACK,SAAS,EAAEC,YAAY,CAAC,GAAGR,QAAQ,CASxC,CAAC,CACH,CAAC;EAED,MAAMS,cAAc,GAAGV,WAAW,CAChC,CACEW,MAAc,EACdC,IAGC,KACE;IACH;IACA,IAAIA,IAAI,CAACC,QAAQ,KAAKD,IAAI,CAACE,QAAQ,EAAE;MACnCL,YAAY,CAACM,IAAI,IAAI;QACnB,MAAM;UAAE,CAACJ,MAAM,GAAGK,CAAC;UAAE,GAAGC;QAAK,CAAC,GAAGF,IAAI;QACrC,OAAOE,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,MAAM;MACLR,YAAY,CAACM,IAAI,KAAK;QACpB,GAAGA,IAAI;QACP,CAACJ,MAAM,GAAGC;MACZ,CAAC,CAAC,CAAC;IACL;IAEAR,kBAAkB,GAAGQ,IAAI,CAAC;EAC5B,CAAC,EACD,CAACR,kBAAkB,CACrB,CAAC;EAED,MAAMc,UAAU,GAAGlB,WAAW,CAAC,MAAM;IACnCS,YAAY,CAAC,CAAC,CAAC,CAAC;EAClB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMU,iBAAiB,GAAGnB,WAAW,CAAC,YAAY;IAChD,MAAMoB,KAAK,GAAGC,MAAM,CAACC,MAAM,CAACd,SAAS,CAAC;IACtC,OAAOH,aAAa,GAAGA,aAAa,CAACe,KAAK,CAAC,GAAG,KAAK;EACrD,CAAC,EAAE,CAACZ,SAAS,EAAEH,aAAa,CAAC,CAAC;EAE9B,MAAMkB,cAAwB,GAAGpB,QAAQ,KAAK,QAAQ,GAClD;IAAEqB,IAAI,EAAE,QAAQ;IAAElB,QAAQ,EAAE;EAAK,CAAC,GAClC;IAAEkB,IAAI,EAAE,QAAQ;IAAElB,QAAQ;IAAEC;EAAU,CAAC;EAE3C,OAAO;IACLC,SAAS;IACTiB,UAAU,EAAEf,cAAc;IAC1BL,aAAa,EAAEA,aAAa,GAAGc,iBAAiB,GAAGO,SAAS;IAC5DR,UAAU;IACVf,QAAQ,EAAEoB;EACZ,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"file":"useEditableTable.js","names":["useCallback","useState","useEditableTable","editMode","onCellValueChanged","onSubmitEdits","isActive","setActive","cellEdits","setCellEdits","validationErrors","setValidationErrors","Map","clearCellValidationError","cellId","prev","newErrors","delete","handleCellEdit","info","newValue","oldValue","_","rest","clearEdits","handleSubmitEdits","edits","Object","values","onCellValidationError","error","set","editModeState","type","onCellEdit","undefined"],"sources":["useEditableTable.ts"],"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 ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport { useCallback, useState } from \"react\";\nimport type { ObjectTableProps } from \"../ObjectTableApi.js\";\nimport type {\n CellEditInfo,\n EditableConfig,\n EditModeState,\n} from \"../utils/types.js\";\n\nexport interface UseEditableTableProps<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n> {\n editMode?: \"always\" | \"manual\";\n\n onCellValueChanged?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onCellValueChanged\"];\n\n onSubmitEdits?: ObjectTableProps<\n Q,\n RDPs,\n FunctionColumns\n >[\"onSubmitEdits\"];\n}\n\nexport function useEditableTable<\n Q extends ObjectOrInterfaceDefinition,\n RDPs extends Record<string, SimplePropertyDef> = Record<\n string,\n never\n >,\n FunctionColumns extends Record<string, QueryDefinition<{}>> = Record<\n string,\n never\n >,\n>({\n editMode = \"manual\",\n onCellValueChanged,\n onSubmitEdits,\n}: UseEditableTableProps<Q, RDPs, FunctionColumns>): EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n> {\n const [isActive, setActive] = useState<boolean>(\n editMode === \"always\",\n );\n const [cellEdits, setCellEdits] = useState<\n Record<\n string,\n CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >\n >\n >(\n {},\n );\n const [validationErrors, setValidationErrors] = useState<\n Map<string, string>\n >(\n new Map(),\n );\n\n const clearCellValidationError = useCallback((cellId: string) => {\n setValidationErrors(prev => {\n const newErrors = new Map(prev);\n newErrors.delete(cellId);\n return newErrors;\n });\n }, []);\n\n const handleCellEdit = useCallback(\n (\n cellId: string,\n info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n // If value is changed back to original, remove it from edits\n if (info.newValue === info.oldValue) {\n setCellEdits(prev => {\n const { [cellId]: _, ...rest } = prev;\n return rest;\n });\n } else {\n setCellEdits(prev => ({\n ...prev,\n [cellId]: info,\n }));\n }\n\n onCellValueChanged?.(info);\n },\n [onCellValueChanged],\n );\n\n const clearEdits = useCallback(() => {\n setCellEdits({});\n setValidationErrors(new Map());\n }, []);\n\n const handleSubmitEdits = useCallback(async () => {\n const edits = Object.values(cellEdits);\n return onSubmitEdits ? onSubmitEdits(edits) : false;\n }, [cellEdits, onSubmitEdits]);\n\n const onCellValidationError = useCallback(\n (cellId: string, error: string) => {\n setValidationErrors(prev => {\n const newErrors = new Map(prev);\n newErrors.set(cellId, error);\n return newErrors;\n });\n },\n [],\n );\n\n const editModeState: EditModeState = editMode === \"always\"\n ? { type: \"always\", isActive: true }\n : { type: \"manual\", isActive, setActive };\n\n return {\n cellEdits,\n onCellEdit: handleCellEdit,\n onSubmitEdits: onSubmitEdits ? handleSubmitEdits : undefined,\n clearEdits,\n editModeState,\n onCellValidationError,\n validationErrors,\n clearCellValidationError,\n };\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAkC7C,OAAO,SAASC,gBAAgBA,CAU9B;EACAC,QAAQ,GAAG,QAAQ;EACnBC,kBAAkB;EAClBC;AAC+C,CAAC,EAGhD;EACA,MAAM,CAACC,QAAQ,EAAEC,SAAS,CAAC,GAAGN,QAAQ,CACpCE,QAAQ,KAAK,QACf,CAAC;EACD,MAAM,CAACK,SAAS,EAAEC,YAAY,CAAC,GAAGR,QAAQ,CASxC,CAAC,CACH,CAAC;EACD,MAAM,CAACS,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGV,QAAQ,CAGtD,IAAIW,GAAG,CAAC,CACV,CAAC;EAED,MAAMC,wBAAwB,GAAGb,WAAW,CAAEc,MAAc,IAAK;IAC/DH,mBAAmB,CAACI,IAAI,IAAI;MAC1B,MAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACG,IAAI,CAAC;MAC/BC,SAAS,CAACC,MAAM,CAACH,MAAM,CAAC;MACxB,OAAOE,SAAS;IAClB,CAAC,CAAC;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,cAAc,GAAGlB,WAAW,CAChC,CACEc,MAAc,EACdK,IAGC,KACE;IACH;IACA,IAAIA,IAAI,CAACC,QAAQ,KAAKD,IAAI,CAACE,QAAQ,EAAE;MACnCZ,YAAY,CAACM,IAAI,IAAI;QACnB,MAAM;UAAE,CAACD,MAAM,GAAGQ,CAAC;UAAE,GAAGC;QAAK,CAAC,GAAGR,IAAI;QACrC,OAAOQ,IAAI;MACb,CAAC,CAAC;IACJ,CAAC,MAAM;MACLd,YAAY,CAACM,IAAI,KAAK;QACpB,GAAGA,IAAI;QACP,CAACD,MAAM,GAAGK;MACZ,CAAC,CAAC,CAAC;IACL;IAEAf,kBAAkB,GAAGe,IAAI,CAAC;EAC5B,CAAC,EACD,CAACf,kBAAkB,CACrB,CAAC;EAED,MAAMoB,UAAU,GAAGxB,WAAW,CAAC,MAAM;IACnCS,YAAY,CAAC,CAAC,CAAC,CAAC;IAChBE,mBAAmB,CAAC,IAAIC,GAAG,CAAC,CAAC,CAAC;EAChC,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMa,iBAAiB,GAAGzB,WAAW,CAAC,YAAY;IAChD,MAAM0B,KAAK,GAAGC,MAAM,CAACC,MAAM,CAACpB,SAAS,CAAC;IACtC,OAAOH,aAAa,GAAGA,aAAa,CAACqB,KAAK,CAAC,GAAG,KAAK;EACrD,CAAC,EAAE,CAAClB,SAAS,EAAEH,aAAa,CAAC,CAAC;EAE9B,MAAMwB,qBAAqB,GAAG7B,WAAW,CACvC,CAACc,MAAc,EAAEgB,KAAa,KAAK;IACjCnB,mBAAmB,CAACI,IAAI,IAAI;MAC1B,MAAMC,SAAS,GAAG,IAAIJ,GAAG,CAACG,IAAI,CAAC;MAC/BC,SAAS,CAACe,GAAG,CAACjB,MAAM,EAAEgB,KAAK,CAAC;MAC5B,OAAOd,SAAS;IAClB,CAAC,CAAC;EACJ,CAAC,EACD,EACF,CAAC;EAED,MAAMgB,aAA4B,GAAG7B,QAAQ,KAAK,QAAQ,GACtD;IAAE8B,IAAI,EAAE,QAAQ;IAAE3B,QAAQ,EAAE;EAAK,CAAC,GAClC;IAAE2B,IAAI,EAAE,QAAQ;IAAE3B,QAAQ;IAAEC;EAAU,CAAC;EAE3C,OAAO;IACLC,SAAS;IACT0B,UAAU,EAAEhB,cAAc;IAC1Bb,aAAa,EAAEA,aAAa,GAAGoB,iBAAiB,GAAGU,SAAS;IAC5DX,UAAU;IACVQ,aAAa;IACbH,qBAAqB;IACrBnB,gBAAgB;IAChBG;EACF,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["types.ts"],"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 { RowData } from \"@tanstack/react-table\";\n\nexport interface ColumnOption {\n id: string;\n name: string;\n canSort: boolean;\n}\n\nexport interface CellIdentifier {\n rowId: string;\n columnId: string;\n}\n\nexport interface CellEditInfo<\n TData extends RowData = unknown,\n CellValue = unknown,\n> extends CellIdentifier {\n newValue: CellValue;\n oldValue: CellValue;\n originalRowData: TData;\n}\n\nexport type EditMode =\n | { type: \"always\"; isActive: true }\n | { type: \"manual\"; isActive: boolean; setActive: (value: boolean) => void };\n\nexport interface EditableConfig<\n TData extends RowData = unknown,\n CellValue = unknown,\n> {\n cellEdits: Record<string, CellEditInfo<TData, CellValue>>;\n onCellEdit: (\n cellId: string,\n info: CellEditInfo<TData, CellValue>,\n ) => void;\n onSubmitEdits?: () => Promise<boolean>;\n clearEdits: () => void;\n editMode: EditMode;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["types.ts"],"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 { RowData } from \"@tanstack/react-table\";\n\nexport interface ColumnOption {\n id: string;\n name: string;\n canSort: boolean;\n}\n\nexport interface CellIdentifier {\n rowId: string;\n columnId: string;\n}\n\nexport interface CellEditInfo<\n TData extends RowData = unknown,\n CellValue = unknown,\n> extends CellIdentifier {\n newValue: CellValue | null;\n oldValue: CellValue | null;\n originalRowData: TData;\n}\n\nexport type EditModeState =\n | { type: \"always\"; isActive: true }\n | { type: \"manual\"; isActive: boolean; setActive: (value: boolean) => void };\n\nexport interface EditableConfig<\n TData extends RowData = unknown,\n CellValue = unknown,\n> {\n cellEdits: Record<string, CellEditInfo<TData, CellValue>>;\n onCellEdit: (\n cellId: string,\n info: CellEditInfo<TData, CellValue>,\n ) => void;\n onSubmitEdits?: () => Promise<boolean>;\n clearEdits: () => void;\n editModeState: EditModeState;\n onCellValidationError: (\n cellId: string,\n error: string,\n ) => void;\n validationErrors: Map<string, string>;\n clearCellValidationError: (cellId: string) => void;\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,31 @@
1
+ import { Tooltip as BaseUITooltip, type TooltipPopupProps, type TooltipPositionerProps, type TooltipProviderProps, type TooltipRootProps, type TooltipTriggerProps } from "@base-ui/react/tooltip";
2
+ import React from "react";
3
+ export interface TooltipProps extends Omit<TooltipRootProps, "className"> {}
4
+ declare function TooltipRoot({ children,...rest }: TooltipProps): React.ReactElement;
5
+ interface TooltipProviderComponentProps extends Omit<TooltipProviderProps, "className"> {
6
+ className?: string;
7
+ }
8
+ declare function TooltipProvider({ children,...rest }: TooltipProviderComponentProps): React.ReactElement;
9
+ interface TooltipTriggerComponentProps extends Omit<TooltipTriggerProps, "className"> {
10
+ className?: string;
11
+ }
12
+ declare function TooltipTrigger({ className, children,...rest }: TooltipTriggerComponentProps): React.ReactElement;
13
+ interface TooltipPositionerComponentProps extends Omit<TooltipPositionerProps, "className"> {
14
+ className?: string;
15
+ }
16
+ declare function TooltipPositioner({ className, children, sideOffset,...rest }: TooltipPositionerComponentProps): React.ReactElement;
17
+ interface TooltipPopupComponentProps extends Omit<TooltipPopupProps, "className"> {
18
+ className?: string;
19
+ }
20
+ declare function TooltipPopup({ className, children,...rest }: TooltipPopupComponentProps): React.ReactElement;
21
+ export declare function TooltipArrow(): React.ReactElement;
22
+ export declare const Tooltip: {
23
+ Root: typeof TooltipRoot
24
+ Provider: typeof TooltipProvider
25
+ Trigger: typeof TooltipTrigger
26
+ Portal: typeof BaseUITooltip.Portal
27
+ Positioner: typeof TooltipPositioner
28
+ Popup: typeof TooltipPopup
29
+ Arrow: typeof TooltipArrow
30
+ };
31
+ export {};
@@ -0,0 +1 @@
1
+ {"mappings":"AAgBA,SACE,WAAW,oBACN,wBACA,6BACA,2BACA,uBACA,2BACA,wBAAyB;AAEhC,OAAO,WAAW,OAAQ;AAG1B,iBAAiB,qBAAqB,KAAK,kBAAkB,aAAa,CAAE;AAE5E,iBAAS,YAAY,EACnB,SACA,GAAG,MACU,EAAZ,eAAe,MAAM;UAQd,sCACA,KAAK,sBAAsB,aACrC;CACE;AACD;AAED,iBAAS,gBAAgB,EACvB,SACA,GAAG,MAC2B,EAA7B,gCAAgC,MAAM;UAU/B,qCACA,KAAK,qBAAqB,aACpC;CACE;AACD;AAED,iBAAS,eAAe,EACtB,WACA,SACA,GAAG,MAC0B,EAA5B,+BAA+B,MAAM;UAW9B,wCACA,KAAK,wBAAwB,aACvC;CACE;AACD;AAED,iBAAS,kBAAkB,EACzB,WACA,UACA,WACA,GAAG,MAC6B,EAA/B,kCAAkC,MAAM;UAYjC,mCACA,KAAK,mBAAmB,aAClC;CACE;AACD;AAED,iBAAS,aAAa,EACpB,WACA,SACA,GAAG,MACwB,EAA1B,6BAA6B,MAAM;AAWtC,OAAO,iBAAS,gBAAgB,MAAM;AAuBtC,OAAO,cAAMA,SAAS;CACpB,aAAa;CACb,iBAAiB;CACjB,gBAAgB;CAChB,eAAe,cAAc;CAC7B,mBAAmB;CACnB,cAAc;CACd,cAAc;AACf","names":["Tooltip: {\n Root: typeof TooltipRoot;\n Provider: typeof TooltipProvider;\n Trigger: typeof TooltipTrigger;\n Portal: typeof BaseUITooltip.Portal;\n Positioner: typeof TooltipPositioner;\n Popup: typeof TooltipPopup;\n Arrow: typeof TooltipArrow;\n}"],"sources":["../../../../src/base-components/tooltip/Tooltip.tsx"],"version":3,"file":"Tooltip.d.ts"}
@@ -0,0 +1 @@
1
+ export { Tooltip, TooltipArrow, type TooltipProps } from "./Tooltip.js";
@@ -0,0 +1 @@
1
+ {"mappings":"AAgBA,SAAS,SAAS,mBAAmB,oBAAoB","names":[],"sources":["../../../../src/base-components/tooltip/index.ts"],"version":3,"file":"index.d.ts"}
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cAAc,sBAAsB,mBAAmB,WAAY;AACnE,cAAc,6BAA6B,qBAAsB;AACjE,cAAc,mBAAmB,yBAA0B;;;;;;;;;;;;;AAmK3D,OAAO,iBAAS,iBAAiB,UAAU,sBACzCA,aAAa,MAAM,sBAAsB,iBACzCC,cAAc,YAAY,cAC1BC,UAAU,QAAQ,MAClBC,aAAa,GACbC,4BACC,YAAY","names":["definitions: Array<FilterDefinitionUnion<Q>> | undefined","filterStates: Map<string, FilterState>","operator: \"and\" | \"or\"","objectType?: Q","excludeFilterKey?: string"],"sources":["../../../../src/filter-list/utils/filterStateToWhereClause.ts"],"version":3,"file":"filterStateToWhereClause.d.ts"}
1
+ {"mappings":"AAgBA,cAAc,sBAAsB,mBAAmB,WAAY;AACnE,cAAc,6BAA6B,qBAAsB;AACjE,cAAc,mBAAmB,yBAA0B;;;;;;;;;;;;;AA0L3D,OAAO,iBAAS,iBAAiB,UAAU,sBACzCA,aAAa,MAAM,sBAAsB,iBACzCC,cAAc,YAAY,cAC1BC,UAAU,QAAQ,MAClBC,aAAa,GACbC,4BACC,YAAY","names":["definitions: Array<FilterDefinitionUnion<Q>> | undefined","filterStates: Map<string, FilterState>","operator: \"and\" | \"or\"","objectType?: Q","excludeFilterKey?: string"],"sources":["../../../../src/filter-list/utils/filterStateToWhereClause.ts"],"version":3,"file":"filterStateToWhereClause.d.ts"}
@@ -10,11 +10,17 @@ export interface EditableCellProps<
10
10
  cellId: string;
11
11
  dataType?: string;
12
12
  onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;
13
+ onCellValidationError?: (cellId: string, error: string) => void;
14
+ clearCellValidationError?: (cellId: string) => void;
15
+ validationError?: string;
13
16
  originalRowData: TData;
14
17
  rowId: string;
15
18
  columnId: string;
19
+ validateEdit?: (value: unknown) => Promise<string | undefined>;
16
20
  }
17
- export declare function EditableCell<
21
+ declare function EditableCellInner<
18
22
  TData extends RowData,
19
23
  CellValue = unknown
20
- >({ initialValue, currentValue, cellId, dataType, onCellEdit, originalRowData, rowId, columnId }: EditableCellProps<TData, CellValue>): React.ReactElement;
24
+ >({ initialValue, currentValue, cellId, dataType, onCellEdit, onCellValidationError, clearCellValidationError, originalRowData, rowId, columnId, validateEdit, validationError }: EditableCellProps<TData, CellValue>): React.ReactElement;
25
+ export declare const EditableCell: typeof EditableCellInner;
26
+ export {};
@@ -1 +1 @@
1
- {"mappings":"AAiBA,cAAc,eAAe,uBAAwB;AAErD,OAAO,WAAyD,OAAQ;AAExE,cAAc,oBAAoB,kBAAmB;AAErD,iBAAiB;CAAkB,cAAc;CAAS;EAAqB;CAC7E,cAAc;CACd,cAAc;CACd;CACA;CACA,aAAaA,gBAAgBC,MAAM,aAAa,OAAO;CACvD,iBAAiB;CACjB;CACA;AACD;AA4CD,OAAO,iBAAS;CAAa,cAAc;CAAS;EAAqB,EACvE,cACA,cACA,QACA,UACA,YACA,iBACA,OACA,UACoC,EAAnC,kBAAkB,OAAO,aAAa,MAAM","names":["cellId: string","info: CellEditInfo<TData, CellValue>"],"sources":["../../../src/object-table/EditableCell.tsx"],"version":3,"file":"EditableCell.d.ts"}
1
+ {"mappings":"AAkBA,cAAc,eAAe,uBAAwB;AAErD,OAAO,WAAyD,OAAQ;AAGxE,cAAc,oBAAoB,kBAAmB;AAErD,iBAAiB;CAAkB,cAAc;CAAS;EAAqB;CAC7E,cAAc;CACd,cAAc;CACd;CACA;CACA,aAAaA,gBAAgBC,MAAM,aAAa,OAAO;CACvD,yBACED,gBACAE;CAEF,4BAA4BF;CAC5B;CACA,iBAAiB;CACjB;CACA;CACA,gBAAgBG,mBAAmB;AACpC;AA8CD,iBAAS;CAAkB,cAAc;CAAS;EAAqB,EACrE,cACA,cACA,QACA,UACA,YACA,uBACA,0BACA,iBACA,OACA,UACA,cACA,iBACoC,EAAnC,kBAAkB,OAAO,aAAa,MAAM;AA6J/C,OAAO,cAAM,qBAED","names":["cellId: string","info: CellEditInfo<TData, CellValue>","error: string","value: unknown"],"sources":["../../../src/object-table/EditableCell.tsx"],"version":3,"file":"EditableCell.d.ts"}
@@ -22,6 +22,13 @@ export type ColumnDefinition<
22
22
  orderable?: boolean
23
23
  filterable?: boolean
24
24
  editable?: boolean
25
+ /**
26
+ * Additional function to validate the cell value during edit
27
+ *
28
+ * @param value the current cell value
29
+ * @returns a promise that resolves to an error message string if validation fails, or undefined if validation succeeds
30
+ */
31
+ validateEdit?: (value: unknown) => Promise<string | undefined>
25
32
  renderCell?: (object: Osdk.Instance<Q, "$allBaseProperties", PropertyKeys<Q>, RDPs>, locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>) => React.ReactNode
26
33
  /**
27
34
  * If provided, this will be used in the column header.
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cACE,iBACA,6BACA,WACA,MACA,gBACA,cACA,iBACA,mBACA,mBACK,WAAY;AACnB,iBAAiB,WAAW,OAAQ;AACpC,cAAc,oBAAoB,kBAAmB;AAErD,YAAY;CACV,UAAU;CACV,aAAa,eAAe,qBAAqB;CACjD,wBAAwB,eAAe,gBAAgB,CAAE,MAAK;IAI5D;CACF,SAAS,wBAAwB,GAAG,MAAM;;;;CAK1C;;;;CAKA,SAAS,SAAS,UAAU;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,cACEA,QAAQ,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI,OAChEC,SAAS,wBAAwB,GAAG,MAAM,qBACvC,MAAM;;;;;;;;;;CAWX;;;;;CAMA,qBAAqB,MAAM;AAC5B;AAED,YAAY;CACV,UAAU;CACV,aAAa,eAAe,qBAAqB;CACjD,wBAAwB,eAAe,gBAAgB,CAAE,MAAK;IAK5D;CACA,MAAM;CACN,IAAI,aAAa;AAClB,IACC;CACA,MAAM;CACN,UAAU;AACX,IACC;CACA,MAAM;CACN,UAAU;CACV,SAAS,gBAAgB,QAAQ,GAAG,WAAW;AAChD,IACC;CACA,MAAM;CACN;AACD;AAEH,iBAAiB;CACf,UAAU;CACV,aAAa,eAAe,qBAAqB;CACjD,wBAAwB,eAAe,gBAAgB,CAAE,MAAK;EAI9D;;;;;CAKA,YAAY;;;;;CAMZ,YAAY,UAAU;CAEtB,mBAAmB,iBAAiB;;;;;;CAOpC,oBAAoB,MAAM,iBAAiB,GAAG,MAAM;;;;;;CAOpD;;;;;CAMA,SAAS,YAAY,GAAG;;;;;;;CAQxB,mBAAmBC,UAAU,YAAY,GAAG;;;;;;CAO5C;;;;;;CAOA;;;;;;CAOA;;;;;;CAOA;;;;;;;;CASA,WAAW,WAAW;;;;;;CAOtB,iBAAiB,MAAM;EACrB,UAAU,aAAa;EACvB,WAAW,QAAQ;CACpB;;;;;;CAOD,UAAU,MAAM;EACd,UAAU,aAAa;EACvB,WAAW,QAAQ;CACpB;;;;;;;CAQD,oBACEC,YAAY,MAAM;EAChB,UAAU,aAAa;EACvB,WAAW,QAAQ;CACpB;;;;;;;CASH,sBACEC,MAAM,aACJ,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI;;;;;;;;CAY5D,iBAAiBC,OAAO,aACtB,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI,sBAElD;;;;;;;;CASR,6BACEC,WAAW,MAAM;EACf,UAAU,aAAa,WAAW,aAAa;EAC/C;CACD;;;;;;;;CAUH,0BACEC,WAAW,MAAM;EACf,UAAU,aAAa,WAAW,aAAa;EAC/C,QAAQ,SAAS,UAAU;CAC5B;;;;;;;CASH,kBACEC,UAAU,aAAa,WAAW,aAAa,iBAC/CC;;;;;;CAQF,cACET,QAAQ,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI;;;;;;;;;CAWlE,gBAAgB,WAAW,aAAa;;;;;CAMxC,eAAe,eAAe;;;;;CAM9B;;;;;;;;CASA,kBACEU,gBAAgB,eAAe,MAC/BC;;;;CAKF,yBACEC,KAAK,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI,OAC7DC,uBACG,MAAM;;;;;;CAOX;CAEA;AACD;AAED,iBAAiB,iBACf,UAAU,6BACV;;;;CAIA,QAAQ,UAAU;;;;CAKlB,YAAY,UAAU;;;;CAKtB,WAAW,UAAU;AACtB","names":["object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>","locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>","newWhere: WhereClause<Q, RDPs>","newOrderBy: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>","info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >","edits: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >[]","newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n isVisible: boolean;\n }>","newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n pinned: \"left\" | \"right\" | \"none\";\n }>","columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns","newWidth: number | null","selectedRowIds: PrimaryKeyType<Q>[]","isSelectAll?: boolean","row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>","cellValue: unknown"],"sources":["../../../src/object-table/ObjectTableApi.ts"],"version":3,"file":"ObjectTableApi.d.ts"}
1
+ {"mappings":"AAgBA,cACE,iBACA,6BACA,WACA,MACA,gBACA,cACA,iBACA,mBACA,mBACK,WAAY;AACnB,iBAAiB,WAAW,OAAQ;AACpC,cAAc,oBAAoB,kBAAmB;AAErD,YAAY;CACV,UAAU;CACV,aAAa,eAAe,qBAAqB;CACjD,wBAAwB,eAAe,gBAAgB,CAAE,MAAK;IAI5D;CACF,SAAS,wBAAwB,GAAG,MAAM;;;;CAK1C;;;;CAKA,SAAS,SAAS,UAAU;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;;;;;;;CAQA,gBACEA,mBACG;CAEL,cACEC,QAAQ,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI,OAChEC,SAAS,wBAAwB,GAAG,MAAM,qBACvC,MAAM;;;;;;;;;;CAWX;;;;;CAMA,qBAAqB,MAAM;AAC5B;AAED,YAAY;CACV,UAAU;CACV,aAAa,eAAe,qBAAqB;CACjD,wBAAwB,eAAe,gBAAgB,CAAE,MAAK;IAK5D;CACA,MAAM;CACN,IAAI,aAAa;AAClB,IACC;CACA,MAAM;CACN,UAAU;AACX,IACC;CACA,MAAM;CACN,UAAU;CACV,SAAS,gBAAgB,QAAQ,GAAG,WAAW;AAChD,IACC;CACA,MAAM;CACN;AACD;AAEH,iBAAiB;CACf,UAAU;CACV,aAAa,eAAe,qBAAqB;CACjD,wBAAwB,eAAe,gBAAgB,CAAE,MAAK;EAI9D;;;;;CAKA,YAAY;;;;;CAMZ,YAAY,UAAU;CAEtB,mBAAmB,iBAAiB;;;;;;CAOpC,oBAAoB,MAAM,iBAAiB,GAAG,MAAM;;;;;;CAOpD;;;;;CAMA,SAAS,YAAY,GAAG;;;;;;;CAQxB,mBAAmBC,UAAU,YAAY,GAAG;;;;;;CAO5C;;;;;;CAOA;;;;;;CAOA;;;;;;CAOA;;;;;;;;CASA,WAAW,WAAW;;;;;;CAOtB,iBAAiB,MAAM;EACrB,UAAU,aAAa;EACvB,WAAW,QAAQ;CACpB;;;;;;CAOD,UAAU,MAAM;EACd,UAAU,aAAa;EACvB,WAAW,QAAQ;CACpB;;;;;;;CAQD,oBACEC,YAAY,MAAM;EAChB,UAAU,aAAa;EACvB,WAAW,QAAQ;CACpB;;;;;;;CASH,sBACEC,MAAM,aACJ,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI;;;;;;;;CAY5D,iBAAiBC,OAAO,aACtB,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI,sBAElD;;;;;;;;CASR,6BACEC,WAAW,MAAM;EACf,UAAU,aAAa,WAAW,aAAa;EAC/C;CACD;;;;;;;;CAUH,0BACEC,WAAW,MAAM;EACf,UAAU,aAAa,WAAW,aAAa;EAC/C,QAAQ,SAAS,UAAU;CAC5B;;;;;;;CASH,kBACEC,UAAU,aAAa,WAAW,aAAa,iBAC/CC;;;;;;CAQF,cACET,QAAQ,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI;;;;;;;;;CAWlE,gBAAgB,WAAW,aAAa;;;;;CAMxC,eAAe,eAAe;;;;;CAM9B;;;;;;;;CASA,kBACEU,gBAAgB,eAAe,MAC/BC;;;;CAKF,yBACEC,KAAK,KAAK,SAAS,GAAG,sBAAsB,aAAa,IAAI,OAC7DC,uBACG,MAAM;;;;;;CAOX;CAEA;AACD;AAED,iBAAiB,iBACf,UAAU,6BACV;;;;CAIA,QAAQ,UAAU;;;;CAKlB,YAAY,UAAU;;;;CAKtB,WAAW,UAAU;AACtB","names":["value: unknown","object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>","locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>","newWhere: WhereClause<Q, RDPs>","newOrderBy: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>","info: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >","edits: CellEditInfo<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >[]","newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n isVisible: boolean;\n }>","newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n pinned: \"left\" | \"right\" | \"none\";\n }>","columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns","newWidth: number | null","selectedRowIds: PrimaryKeyType<Q>[]","isSelectAll?: boolean","row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>","cellValue: unknown"],"sources":["../../../src/object-table/ObjectTableApi.ts"],"version":3,"file":"ObjectTableApi.d.ts"}
@@ -11,11 +11,15 @@ declare module "@tanstack/react-table" {
11
11
  isVisible?: boolean;
12
12
  editable?: boolean;
13
13
  dataType?: string;
14
+ validateEdit?: (value: unknown) => Promise<string | undefined>;
14
15
  }
15
16
  interface TableMeta<TData extends RowData = unknown> {
16
17
  onCellEdit?: (cellId: string, info: CellEditInfo<TData, unknown>) => void;
18
+ onCellValidationError?: (cellId: string, error: string) => void;
19
+ clearCellValidationError?: (cellId: string) => void;
17
20
  cellEdits?: Record<string, CellEditInfo<TData, unknown>>;
18
21
  isInEditMode?: boolean;
22
+ validationErrors?: Map<string, string>;
19
23
  }
20
24
  }
21
25
  export interface BaseTableProps<TData extends RowData> {
@@ -1 +1 @@
1
- {"mappings":"AAgBA,cAAc,MAAM,SAAS,aAAa,uBAAwB;AAElE,OAAO,cACA,oBAKA,OAAQ;AAOf,cAAc,8BAA8B,6BAA8B;AAC1E,cAAc,cAAc,sBAAsB,kBAAmB;eAEtD,wBAAwB;WAC3B;EAAW,cAAc;EAAmB;GAAkB;EACtE;EACA;EACA;EACA;CACD;WACS,UAAU,cAAc,mBAAmB;EACnD,cACEA,gBACAC,MAAM,aAAa;EAErB,YAAY,eAAe,aAAa;EACxC;CACD;AACF;AAED,iBAAiB,eACf,cAAc,SACd;CACA,OAAO,MAAM;CACb;CACA,sBAAsB;CACtB,cAAcC,KAAK;CACnB;CACA,yBACEA,KAAK,OACLC,MAAM,KAAK,oBACR,MAAM;CACX;CACA,QAAQ;CACR,yBAAyB;CACzB,iBAAiB,eAAe;AACjC;AAED,OAAO,iBAAS,UACd,cAAc,SAEd,EACE,OACA,WACA,eACA,YACA,WACA,uBACA,WACA,OACA,wBACA,gBACsB,EAArB,eAAe,SACjB","names":["cellId: string","info: CellEditInfo<TData, unknown>","row: TData","cell: Cell<TData, unknown>"],"sources":["../../../src/object-table/Table.tsx"],"version":3,"file":"Table.d.ts"}
1
+ {"mappings":"AAgBA,cAAc,MAAM,SAAS,aAAa,uBAAwB;AAElE,OAAO,cACA,oBAKA,OAAQ;AAOf,cAAc,8BAA8B,6BAA8B;AAC1E,cAAc,cAAc,sBAAsB,kBAAmB;eAEtD,wBAAwB;WAC3B;EAAW,cAAc;EAAmB;GAAkB;EACtE;EACA;EACA;EACA;EACA,gBAAgBA,mBAAmB;CACpC;WACS,UAAU,cAAc,mBAAmB;EACnD,cACEC,gBACAC,MAAM,aAAa;EAErB,yBACED,gBACAE;EAEF,4BAA4BF;EAC5B,YAAY,eAAe,aAAa;EACxC;EACA,mBAAmB;CACpB;AACF;AAED,iBAAiB,eACf,cAAc,SACd;CACA,OAAO,MAAM;CACb;CACA,sBAAsB;CACtB,cAAcG,KAAK;CACnB;CACA,yBACEA,KAAK,OACLC,MAAM,KAAK,oBACR,MAAM;CACX;CACA,QAAQ;CACR,yBAAyB;CACzB,iBAAiB,eAAe;AACjC;AAED,OAAO,iBAAS,UACd,cAAc,SAEd,EACE,OACA,WACA,eACA,YACA,WACA,uBACA,WACA,OACA,wBACA,gBACsB,EAArB,eAAe,SACjB","names":["value: unknown","cellId: string","info: CellEditInfo<TData, unknown>","error: string","row: TData","cell: Cell<TData, unknown>"],"sources":["../../../src/object-table/Table.tsx"],"version":3,"file":"Table.d.ts"}