@osdk/react-components 0.1.0-beta.4 → 0.1.0-beta.6

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 (145) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/build/browser/action-form/ActionFormApi.js +2 -0
  3. package/build/browser/action-form/ActionFormApi.js.map +1 -0
  4. package/build/browser/action-form/FormFieldApi.js +2 -0
  5. package/build/browser/action-form/FormFieldApi.js.map +1 -0
  6. package/build/browser/base-components/checkbox/Checkbox.module.css +1 -2
  7. package/build/browser/object-table/ObjectTable.js +35 -9
  8. package/build/browser/object-table/ObjectTable.js.map +1 -1
  9. package/build/browser/object-table/ObjectTableApi.js.map +1 -1
  10. package/build/browser/object-table/Table.js +1 -1
  11. package/build/browser/object-table/Table.js.map +1 -1
  12. package/build/browser/object-table/Table.module.css +1 -0
  13. package/build/browser/object-table/TableCell.js +7 -4
  14. package/build/browser/object-table/TableCell.js.map +1 -1
  15. package/build/browser/object-table/TableCell.module.css +18 -1
  16. package/build/browser/object-table/TableHeader.js +28 -13
  17. package/build/browser/object-table/TableHeader.js.map +1 -1
  18. package/build/browser/object-table/TableHeader.module.css +17 -0
  19. package/build/browser/object-table/TableHeaderContent.js +27 -0
  20. package/build/browser/object-table/TableHeaderContent.js.map +1 -0
  21. package/build/browser/object-table/TableHeaderContent.module.css +30 -0
  22. package/build/browser/object-table/TableHeaderWithPopover.js +155 -0
  23. package/build/browser/object-table/TableHeaderWithPopover.js.map +1 -0
  24. package/build/browser/object-table/TableHeaderWithPopover.module.css +105 -0
  25. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
  26. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
  27. package/build/browser/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
  28. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
  29. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
  30. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  31. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
  32. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
  33. package/build/browser/object-table/hooks/useColumnPinning.js +95 -0
  34. package/build/browser/object-table/hooks/useColumnPinning.js.map +1 -0
  35. package/build/{esm/object-table/hooks/useDefaultTableStates.js → browser/object-table/hooks/useColumnVisibility.js} +3 -5
  36. package/build/browser/object-table/hooks/useColumnVisibility.js.map +1 -0
  37. package/build/browser/object-table/hooks/useObjectTableData.js +15 -3
  38. package/build/browser/object-table/hooks/useObjectTableData.js.map +1 -1
  39. package/build/browser/object-table/hooks/useSelectionColumn.js +3 -2
  40. package/build/browser/object-table/hooks/useSelectionColumn.js.map +1 -1
  41. package/build/browser/object-table/hooks/useTableSorting.js +66 -0
  42. package/build/browser/object-table/hooks/useTableSorting.js.map +1 -0
  43. package/build/browser/object-table/utils/constants.js +18 -0
  44. package/build/browser/object-table/utils/constants.js.map +1 -0
  45. package/build/browser/object-table/utils/getColumnPinningStyles.js +27 -0
  46. package/build/browser/object-table/utils/getColumnPinningStyles.js.map +1 -0
  47. package/build/browser/public/experimental.js +4 -0
  48. package/build/browser/public/experimental.js.map +1 -1
  49. package/build/cjs/public/experimental.cjs +412 -85
  50. package/build/cjs/public/experimental.cjs.map +1 -1
  51. package/build/cjs/public/experimental.css +113 -1
  52. package/build/cjs/public/experimental.css.map +1 -1
  53. package/build/cjs/public/experimental.d.cts +25 -3
  54. package/build/esm/action-form/ActionFormApi.js +2 -0
  55. package/build/esm/action-form/ActionFormApi.js.map +1 -0
  56. package/build/esm/action-form/FormFieldApi.js +2 -0
  57. package/build/esm/action-form/FormFieldApi.js.map +1 -0
  58. package/build/esm/base-components/checkbox/Checkbox.module.css +1 -2
  59. package/build/esm/object-table/ObjectTable.js +35 -9
  60. package/build/esm/object-table/ObjectTable.js.map +1 -1
  61. package/build/esm/object-table/ObjectTableApi.js.map +1 -1
  62. package/build/esm/object-table/Table.js +1 -1
  63. package/build/esm/object-table/Table.js.map +1 -1
  64. package/build/esm/object-table/Table.module.css +1 -0
  65. package/build/esm/object-table/TableCell.js +7 -4
  66. package/build/esm/object-table/TableCell.js.map +1 -1
  67. package/build/esm/object-table/TableCell.module.css +18 -1
  68. package/build/esm/object-table/TableHeader.js +28 -13
  69. package/build/esm/object-table/TableHeader.js.map +1 -1
  70. package/build/esm/object-table/TableHeader.module.css +17 -0
  71. package/build/esm/object-table/TableHeaderContent.js +27 -0
  72. package/build/esm/object-table/TableHeaderContent.js.map +1 -0
  73. package/build/esm/object-table/TableHeaderContent.module.css +30 -0
  74. package/build/esm/object-table/TableHeaderWithPopover.js +155 -0
  75. package/build/esm/object-table/TableHeaderWithPopover.js.map +1 -0
  76. package/build/esm/object-table/TableHeaderWithPopover.module.css +105 -0
  77. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +266 -0
  78. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +1 -0
  79. package/build/esm/object-table/hooks/__tests__/{useDefaultTableStates.test.js → useColumnVisibility.test.js} +16 -16
  80. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +1 -0
  81. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +2 -1
  82. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +1 -1
  83. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +211 -0
  84. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +1 -0
  85. package/build/esm/object-table/hooks/useColumnPinning.js +95 -0
  86. package/build/esm/object-table/hooks/useColumnPinning.js.map +1 -0
  87. package/build/{browser/object-table/hooks/useDefaultTableStates.js → esm/object-table/hooks/useColumnVisibility.js} +3 -5
  88. package/build/esm/object-table/hooks/useColumnVisibility.js.map +1 -0
  89. package/build/esm/object-table/hooks/useObjectTableData.js +15 -3
  90. package/build/esm/object-table/hooks/useObjectTableData.js.map +1 -1
  91. package/build/esm/object-table/hooks/useSelectionColumn.js +3 -2
  92. package/build/esm/object-table/hooks/useSelectionColumn.js.map +1 -1
  93. package/build/esm/object-table/hooks/useTableSorting.js +66 -0
  94. package/build/esm/object-table/hooks/useTableSorting.js.map +1 -0
  95. package/build/esm/object-table/utils/constants.js +18 -0
  96. package/build/esm/object-table/utils/constants.js.map +1 -0
  97. package/build/esm/object-table/utils/getColumnPinningStyles.js +27 -0
  98. package/build/esm/object-table/utils/getColumnPinningStyles.js.map +1 -0
  99. package/build/esm/public/experimental.js +4 -0
  100. package/build/esm/public/experimental.js.map +1 -1
  101. package/build/types/action-form/ActionFormApi.d.ts +76 -0
  102. package/build/types/action-form/ActionFormApi.d.ts.map +1 -0
  103. package/build/types/action-form/FormFieldApi.d.ts +241 -0
  104. package/build/types/action-form/FormFieldApi.d.ts.map +1 -0
  105. package/build/types/object-table/ObjectTable.d.ts +1 -1
  106. package/build/types/object-table/ObjectTable.d.ts.map +1 -1
  107. package/build/types/object-table/ObjectTableApi.d.ts +10 -0
  108. package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
  109. package/build/types/object-table/Table.d.ts +2 -3
  110. package/build/types/object-table/Table.d.ts.map +1 -1
  111. package/build/types/object-table/TableCell.d.ts.map +1 -1
  112. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  113. package/build/types/object-table/TableHeaderContent.d.ts +7 -0
  114. package/build/types/object-table/TableHeaderContent.d.ts.map +1 -0
  115. package/build/types/object-table/TableHeaderWithPopover.d.ts +13 -0
  116. package/build/types/object-table/TableHeaderWithPopover.d.ts.map +1 -0
  117. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +1 -0
  118. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +1 -0
  119. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +1 -0
  120. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +1 -0
  121. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +1 -0
  122. package/build/types/object-table/hooks/useColumnPinning.d.ts +22 -0
  123. package/build/types/object-table/hooks/useColumnPinning.d.ts.map +1 -0
  124. package/build/types/object-table/hooks/{useDefaultTableStates.d.ts → useColumnVisibility.d.ts} +3 -6
  125. package/build/types/object-table/hooks/useColumnVisibility.d.ts.map +1 -0
  126. package/build/types/object-table/hooks/useObjectTableData.d.ts +2 -1
  127. package/build/types/object-table/hooks/useObjectTableData.d.ts.map +1 -1
  128. package/build/types/object-table/hooks/useSelectionColumn.d.ts +0 -1
  129. package/build/types/object-table/hooks/useSelectionColumn.d.ts.map +1 -1
  130. package/build/types/object-table/hooks/useTableSorting.d.ts +22 -0
  131. package/build/types/object-table/hooks/useTableSorting.d.ts.map +1 -0
  132. package/build/types/object-table/utils/constants.d.ts +1 -0
  133. package/build/types/object-table/utils/constants.d.ts.map +1 -0
  134. package/build/types/object-table/utils/getColumnPinningStyles.d.ts +7 -0
  135. package/build/types/object-table/utils/getColumnPinningStyles.d.ts.map +1 -0
  136. package/build/types/public/experimental.d.ts +2 -0
  137. package/build/types/public/experimental.d.ts.map +1 -1
  138. package/package.json +5 -5
  139. package/build/browser/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
  140. package/build/browser/object-table/hooks/useDefaultTableStates.js.map +0 -1
  141. package/build/esm/object-table/hooks/__tests__/useDefaultTableStates.test.js.map +0 -1
  142. package/build/esm/object-table/hooks/useDefaultTableStates.js.map +0 -1
  143. package/build/types/object-table/hooks/__tests__/useDefaultTableStates.test.d.ts.map +0 -1
  144. package/build/types/object-table/hooks/useDefaultTableStates.d.ts.map +0 -1
  145. /package/build/types/object-table/hooks/__tests__/{useDefaultTableStates.test.d.ts → useColumnPinning.test.d.ts} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @osdk/react-components
2
2
 
3
+ ## 0.1.0-beta.6
4
+
5
+ ### Minor Changes
6
+
7
+ - cac3e9a: Add ActionFormApi
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [db28747]
12
+ - @osdk/react@0.9.0-beta.10
13
+
14
+ ## 0.1.0-beta.5
15
+
16
+ ### Minor Changes
17
+
18
+ - 30617fa: Support sorting and column pinning. Export BaseTable
19
+
20
+ ### Patch Changes
21
+
22
+ - Updated dependencies [43d342e]
23
+ - Updated dependencies [24730c7]
24
+ - Updated dependencies [ecd18e2]
25
+ - @osdk/react@0.9.0-beta.9
26
+ - @osdk/client@2.7.0-beta.14
27
+ - @osdk/api@2.7.0-beta.14
28
+
3
29
  ## 0.1.0-beta.4
4
30
 
5
31
  ### Minor Changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ActionFormApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionFormApi.js","names":[],"sources":["ActionFormApi.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 ActionDefinition,\n ActionEditResponse,\n ActionReturnTypeForOptions,\n ActionValidationResponse,\n} from \"@osdk/api\";\nimport type { ActionValidationError, ApplyActionOptions } from \"@osdk/client\";\nimport type {\n ActionParameters,\n FieldKey,\n FieldValueType,\n FormFieldDefinition,\n} from \"./FormFieldApi.js\";\n\n/**\n * Props for the ActionForm component\n */\nexport interface ActionFormProps<Q extends ActionDefinition<unknown>> {\n actionDefinition: Q;\n\n /**\n * If not supplied, defaults to actionDef.displayName\n */\n formTitle?: string;\n\n /**\n * If not supplied, this will be constructed from ActionParameters\n */\n formFieldDefinition?: Array<FormFieldDefinition<Q>>;\n\n /**\n * Called when a field value changed.\n * Required when a field is in controlled mode, i.e. value is provided via formFieldDefinition.\n *\n * @param fieldKey The key of the changed field\n * @param value the updated value of the field\n */\n onFieldValueChanged?: <K extends FieldKey<Q>>(\n fieldKey: K,\n value: FieldValueType<Q, K>,\n ) => void;\n\n /**\n * Override to disable submit button\n * If not provided, button is disabled when form is submitting or has validation errors\n *\n * @default false\n */\n isSubmitDisabled?: boolean;\n\n /**\n * If supplied, this will override the default submit action\n * By default, the action's applyAction will be called with $validateOnly: false\n *\n * @param formState all field values when onSubmit is called\n * @param applyAction the function to execute the action. Call it with $validateOnly: true options to run validation mode onSubmit.\n * @returns a promise of the submission response\n */\n onSubmit?: <OP extends ApplyActionOptions>(\n formState: FormState<Q>,\n applyAction: (\n args: ActionParameters<Q>,\n options?: OP,\n ) => Promise<ActionReturnTypeForOptions<OP>>,\n ) => Promise<ActionReturnTypeForOptions<OP>> | void;\n\n /**\n * Called when the validation response is returned from a validateOnly submission\n *\n * @param results the validation response\n */\n onValidationResponse?: (results: ActionValidationResponse) => void;\n\n /**\n * Called when the action is successfully executed from a non-validateOnly submission\n *\n * @param results the submission response\n */\n onSuccess?: (results: ActionEditResponse) => void;\n\n /**\n * Called when there is an error in form submission\n *\n * @param error the error that occurred\n */\n onError?: (error: FormError) => void;\n}\n\n/**\n * Form values mapping parameter names to their values\n */\nexport type FormState<Q extends ActionDefinition<unknown>> = {\n [K in FieldKey<Q>]: FieldValueType<Q, K>;\n};\n\n/**\n * Form error discriminated union\n */\nexport type FormError =\n | { type: \"validation\"; error: ActionValidationError }\n | { type: \"submission\"; error: Error }\n | { type: \"unknown\"; error: unknown };\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=FormFieldApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormFieldApi.js","names":[],"sources":["FormFieldApi.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 ActionDefinition,\n CompileTimeMetadata,\n ObjectSet,\n ObjectTypeDefinition,\n} from \"@osdk/api\";\nimport type React from \"react\";\n\n/**\n * A form field definition specifies configuration for a single field\n */\nexport interface FormFieldDefinition<\n Q extends ActionDefinition<unknown>,\n K extends FieldKey<Q> = FieldKey<Q>,\n V extends FieldValueType<Q, K> = FieldValueType<Q, K>,\n C extends ValidFormFieldForPropertyType<V> = ValidFormFieldForPropertyType<V>,\n> {\n /**\n * The field's unique key\n */\n fieldKey: K;\n\n /**\n * Display label for the field\n * If not provided, the form field will not show any label.\n */\n label?: string;\n\n /**\n * Current value of the field\n * If provided, the field operates in controlled mode\n */\n value?: V;\n\n /**\n * Default value of the field\n */\n defaultValue?: V;\n\n /**\n * The form field component type to render\n */\n fieldComponent: C;\n\n /**\n * Whether the field is required\n */\n isRequired?: boolean;\n\n /**\n * Placeholder text\n */\n placeholder?: string;\n\n /**\n * Additional information to display on this field\n * The placement of helper text depends on the value of helperTextPlacement prop\n */\n helperText?: string;\n\n /**\n * The placement of the helper text either below the field or in a tooltip\n *\n * @default \"tooltip\"\n */\n helperTextPlacement?: \"bottom\" | \"tooltip\";\n\n /**\n * Whether the field is disabled\n */\n isDisabled?: boolean;\n\n /**\n * A callback to return a custom error message if validation failed\n *\n * @param validationRule the validation rule that failed with the error message\n * @returns the error message to display\n */\n onValidationError?: (error: ValidationError) => string;\n\n /**\n * Additional function to validate the field\n *\n * @param value the current field value\n * @returns a boolean promise indicating whether the value is valid\n */\n validate?: (value: V) => Promise<boolean>;\n\n /**\n * The component props for the form field\n * Excludes runtime props (key, onChange) which are managed by ActionForm\n */\n fieldComponentProps?: Omit<FormFieldPropsByType[C], \"key\" | \"onChange\">;\n}\n\ntype ValidationError = { type: ValidationRule; error: string };\n\ntype ValidationRule =\n | \"required\"\n | \"min\"\n | \"max\"\n | \"minLength\"\n | \"maxLength\"\n | \"pattern\"\n | \"validate\";\n\n/**\n * Maps field types to their corresponding props\n */\nexport interface FormFieldPropsByType {\n DATETIME_PICKER: DatetimePickerFieldProps;\n DROPDOWN: DropdownFieldProps<unknown>;\n FILE_PICKER: FilePickerProps;\n NUMBER_INPUT: NumberInputFieldProps;\n OBJECT_SET: ObjectSetFieldProps<ObjectTypeDefinition>;\n RADIO_BUTTONS: RadioButtonsFieldProps<unknown>;\n TEXT_AREA: TextAreaFieldProps;\n TEXT_INPUT: TextInputFieldProps;\n CUSTOM: CustomFieldProps<unknown>;\n}\n\n/**\n * Datetime picker field props\n */\nexport interface DatetimePickerFieldProps extends BaseFormFieldProps<Date> {\n fieldComponent: \"DATETIME_PICKER\";\n\n /**\n * The earliest date the user can select\n * If provided, this will be added to the field validation\n */\n min?: Date;\n\n /**\n * The latest date the user can select\n * If provided, this will be added to the field validation\n */\n max?: Date;\n\n /**\n * Whether to show time picker\n */\n showTime?: boolean;\n\n /**\n * Function to format the date string\n */\n formatDate?: (date: Date) => string;\n}\n\n/**\n * Dropdown field props with selectable options\n */\nexport interface DropdownFieldProps<V, IsMulti extends boolean = false>\n extends BaseFormFieldProps<IsMulti extends true ? V[] : V>\n{\n fieldComponent: \"DROPDOWN\";\n\n /**\n * Available options for the dropdown\n */\n options: Option<V>[];\n\n /**\n * Whether the dropdown allows searching/filtering\n */\n isSearchable?: boolean;\n\n /**\n * Whether multiple values can be selected\n */\n isMulti?: boolean;\n}\n\nexport interface FilePickerProps extends BaseFormFieldProps<File | File[]> {\n fieldComponent: \"FILE_PICKER\";\n\n /**\n * Whether multiple files can be selected\n */\n isMulti?: boolean;\n\n /**\n * Accepted file types (e.g., \"image/*\", \".pdf\")\n */\n accept?: string | string[];\n\n /**\n * Maximum file size in bytes\n */\n maxSize?: number;\n}\n\n/**\n * Text area field props\n */\nexport interface TextAreaFieldProps extends\n BaseFormFieldProps<string>,\n Pick<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n | \"rows\"\n | \"wrap\"\n /**\n * If provided, this will be added to the field validation\n */\n | \"minLength\"\n /**\n * If provided, this will be added to the field validation\n */\n | \"maxLength\"\n >\n{\n fieldComponent: \"TEXT_AREA\";\n}\n\nexport interface TextInputFieldProps extends\n BaseFormFieldProps<string>,\n Pick<\n React.InputHTMLAttributes<HTMLInputElement>,\n /**\n * If provided, this will be added to the field validation\n */\n | \"minLength\"\n /**\n * If provided, this will be added to the field validation\n */\n | \"maxLength\"\n >\n{\n fieldComponent: \"TEXT_INPUT\";\n}\n\n/**\n * Number input field props\n */\nexport interface NumberInputFieldProps extends\n BaseFormFieldProps<number>,\n Pick<\n React.InputHTMLAttributes<HTMLInputElement>,\n /**\n * If provided, this will be added to the field validation\n */\n | \"min\"\n /**\n * If provided, this will be added to the field validation\n */\n | \"max\"\n | \"step\"\n >\n{\n fieldComponent: \"NUMBER_INPUT\";\n}\n\n/**\n * Radio buttons field props\n */\nexport interface RadioButtonsFieldProps<V> extends BaseFormFieldProps<V> {\n fieldComponent: \"RADIO_BUTTONS\";\n\n /**\n * Available options for radio buttons\n */\n options: Option<V>[];\n}\n\n/**\n * Option interface for dropdown and radio options\n */\nexport interface Option<V> {\n label: string;\n value: V;\n}\n\n/**\n * Object set field displays the summary of the count of the given object set\n */\nexport interface ObjectSetFieldProps<T extends ObjectTypeDefinition>\n extends BaseFormFieldProps<ObjectSet<T>>\n{\n fieldComponent: \"OBJECT_SET\";\n}\n\n/**\n * Custom field props for user-defined renderers\n */\nexport interface CustomFieldProps<V> extends BaseFormFieldProps<V> {\n fieldComponent: \"CUSTOM\";\n\n /**\n * Custom renderer function\n */\n customRenderer: (props: BaseFormFieldProps<V>) => React.ReactNode;\n}\n\nexport interface BaseFormFieldProps<V> {\n fieldComponent: FieldComponent;\n\n /**\n * Called when the field value changed.\n *\n * ActionForm internally wraps this to pass the key to onFieldValueChanged:\n * ```\n * <DropdownField\n * {...fieldDef}\n * onChange={(value) => onFieldValueChanged(fieldDef.key, value)}\n * />\n * ```\n *\n * @param value The new value of the form field\n */\n onChange?: (value?: V) => void;\n}\n\nexport type FieldKey<Q extends ActionDefinition<unknown>> =\n keyof ActionParameters<Q>;\n\n/**\n * Extracts parameters from an ActionDefinition\n */\nexport type ActionParameters<Q extends ActionDefinition<unknown>> =\n CompileTimeMetadata<Q>[\"parameters\"];\n\n/**\n * Extracts the value type for a specific parameter\n */\nexport type FieldValueType<\n Q extends ActionDefinition<unknown> = ActionDefinition<unknown>,\n K extends keyof ActionParameters<Q> = keyof ActionParameters<Q>,\n> = ActionParameters<Q>[K][\"type\"];\n\n/**\n * Available form field component types\n */\nexport type FieldComponent =\n | \"DATETIME_PICKER\"\n | \"DROPDOWN\"\n | \"FILE_PICKER\"\n | \"NUMBER_INPUT\"\n | \"RADIO_BUTTONS\"\n | \"OBJECT_SET\"\n | \"TEXT_AREA\"\n | \"TEXT_INPUT\"\n | \"CUSTOM\";\n\n/**\n * Gets valid form field types for a given property type\n */\nexport type ValidFormFieldForPropertyType<P extends FieldValueType> = P extends\n \"objectSet\" ? \"OBJECT_SET\"\n : P extends \"object\" ? \"DROPDOWN\"\n : P extends \"mediaReference\" | \"attachment\" ? \"FILE_PICKER\"\n : P extends \"boolean\" ? \"RADIO_BUTTONS\" | \"DROPDOWN\"\n : P extends \"string\" ? \"TEXT_INPUT\" | \"TEXT_AREA\"\n : P extends \"datetime\" | \"timestamp\" ? \"DATETIME_PICKER\"\n : P extends\n | \"double\"\n | \"integer\"\n | \"long\"\n | \"float\"\n | \"short\"\n | \"byte\"\n | \"decimal\" ? \"NUMBER_INPUT\"\n : never;\n"],"mappings":"","ignoreList":[]}
@@ -66,8 +66,7 @@
66
66
  width: var(--osdk-checkbox-icon-size);
67
67
  height: var(--osdk-checkbox-icon-size);
68
68
 
69
-
70
69
  &[data-unchecked] {
71
70
  display: none;
72
71
  }
73
- }
72
+ }
@@ -17,11 +17,13 @@
17
17
  import { getCoreRowModel, useReactTable } from "@tanstack/react-table";
18
18
  import React, { useCallback, useMemo, useState } from "react";
19
19
  import { useColumnDefs } from "./hooks/useColumnDefs.js";
20
- import { useDefaultTableStates } from "./hooks/useDefaultTableStates.js";
20
+ import { useColumnPinning } from "./hooks/useColumnPinning.js";
21
+ import { useColumnVisibility } from "./hooks/useColumnVisibility.js";
21
22
  import { useObjectTableData } from "./hooks/useObjectTableData.js";
22
23
  import { useRowSelection } from "./hooks/useRowSelection.js";
23
24
  import { useSelectionColumn } from "./hooks/useSelectionColumn.js";
24
- import { Table } from "./Table.js";
25
+ import { useTableSorting } from "./hooks/useTableSorting.js";
26
+ import { BaseTable } from "./Table.js";
25
27
  import { getRowId } from "./utils/getRowId.js";
26
28
 
27
29
  /**
@@ -38,27 +40,37 @@ export function ObjectTable({
38
40
  objectType,
39
41
  columnDefinitions,
40
42
  filter,
43
+ orderBy,
44
+ defaultOrderBy,
45
+ onOrderByChanged,
46
+ onColumnsPinnedChanged,
41
47
  onRowSelection,
42
48
  renderCellContextMenu,
43
49
  selectionMode = "none",
44
50
  selectedRows,
45
51
  ...props
46
52
  }) {
53
+ const [columnSizing, setColumnSizing] = useState({});
54
+ const {
55
+ sorting,
56
+ onSortingChange
57
+ } = useTableSorting({
58
+ orderBy,
59
+ defaultOrderBy,
60
+ onOrderByChanged
61
+ });
47
62
  const {
48
63
  data,
49
64
  fetchMore,
50
65
  isLoading
51
- } = useObjectTableData(objectSet, columnDefinitions, filter);
66
+ } = useObjectTableData(objectSet, columnDefinitions, filter, sorting);
52
67
  const {
53
68
  columns,
54
69
  loading: isColumnsLoading
55
70
  } = useColumnDefs(objectType, columnDefinitions);
56
- const {
57
- columnVisibility
58
- } = useDefaultTableStates({
71
+ const columnVisibility = useColumnVisibility({
59
72
  columnDefinitions
60
73
  });
61
- const [columnSizing, setColumnSizing] = useState({});
62
74
  const {
63
75
  rowSelection,
64
76
  isAllSelected,
@@ -81,6 +93,14 @@ export function ObjectTable({
81
93
  const allColumns = useMemo(() => {
82
94
  return selectionColumn ? [selectionColumn, ...columns] : columns;
83
95
  }, [selectionColumn, columns]);
96
+ const {
97
+ columnPinning,
98
+ onColumnPinningChange
99
+ } = useColumnPinning({
100
+ columnDefinitions,
101
+ hasSelectionColumn: selectionColumn != null,
102
+ onColumnsPinnedChanged
103
+ });
84
104
  const table = useReactTable({
85
105
  data: data ?? [],
86
106
  columns: allColumns,
@@ -88,12 +108,18 @@ export function ObjectTable({
88
108
  state: {
89
109
  columnVisibility,
90
110
  rowSelection,
91
- columnSizing
111
+ sorting,
112
+ columnSizing,
113
+ columnPinning
92
114
  },
115
+ onSortingChange,
93
116
  onColumnSizingChange: setColumnSizing,
117
+ onColumnPinningChange,
94
118
  enableRowSelection: selectionMode !== "none",
95
119
  columnResizeMode: "onChange",
96
120
  columnResizeDirection: "ltr",
121
+ manualSorting: true,
122
+ // Enable manual sorting to indicate server-side sorting
97
123
  defaultColumn: {
98
124
  minSize: 80
99
125
  },
@@ -102,7 +128,7 @@ export function ObjectTable({
102
128
  const onRenderCellContextMenu = useCallback((row, cell) => {
103
129
  return renderCellContextMenu?.(row, cell.getValue());
104
130
  }, [renderCellContextMenu]);
105
- return /*#__PURE__*/React.createElement(Table, {
131
+ return /*#__PURE__*/React.createElement(BaseTable, {
106
132
  table: table,
107
133
  isLoading: isLoading || isColumnsLoading,
108
134
  fetchNextPage: fetchMore,
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectTable.js","names":["getCoreRowModel","useReactTable","React","useCallback","useMemo","useState","useColumnDefs","useDefaultTableStates","useObjectTableData","useRowSelection","useSelectionColumn","Table","getRowId","ObjectTable","objectSet","objectType","columnDefinitions","filter","onRowSelection","renderCellContextMenu","selectionMode","selectedRows","props","data","fetchMore","isLoading","columns","loading","isColumnsLoading","columnVisibility","columnSizing","setColumnSizing","rowSelection","isAllSelected","hasSelection","onToggleAll","onToggleRow","selectionColumn","allColumns","table","state","onColumnSizingChange","enableRowSelection","columnResizeMode","columnResizeDirection","defaultColumn","minSize","onRenderCellContextMenu","row","cell","getValue","createElement","fetchNextPage","onRowClick","rowHeight","className"],"sources":["ObjectTable.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectTypeDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport {\n type Cell,\n type ColumnSizingState,\n getCoreRowModel,\n useReactTable,\n} from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { useColumnDefs } from \"./hooks/useColumnDefs.js\";\nimport { useDefaultTableStates } from \"./hooks/useDefaultTableStates.js\";\nimport { useObjectTableData } from \"./hooks/useObjectTableData.js\";\nimport { useRowSelection } from \"./hooks/useRowSelection.js\";\nimport { useSelectionColumn } from \"./hooks/useSelectionColumn.js\";\nimport type { ObjectTableProps } from \"./ObjectTableApi.js\";\nimport { Table } from \"./Table.js\";\nimport { getRowId } from \"./utils/getRowId.js\";\n\n/**\n * ObjectTable - A headless table component for displaying OSDK object sets\n *\n * @example\n * ```tsx\n * <ObjectTable objectSet={myObjectSet} objectType={MyObjectType} />\n * ```\n */\n\nexport function ObjectTable<\n Q extends ObjectTypeDefinition,\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 objectSet,\n objectType,\n columnDefinitions,\n filter,\n onRowSelection,\n renderCellContextMenu,\n selectionMode = \"none\",\n selectedRows,\n ...props\n}: ObjectTableProps<Q, RDPs, FunctionColumns>): React.ReactElement {\n const { data, fetchMore, isLoading } = useObjectTableData<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectSet,\n columnDefinitions,\n filter,\n );\n\n const { columns, loading: isColumnsLoading } = useColumnDefs<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n );\n\n const { columnVisibility } = useDefaultTableStates({ columnDefinitions });\n\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\n const {\n rowSelection,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n } = useRowSelection<Q, RDPs>({\n selectionMode,\n selectedRows,\n onRowSelection,\n data,\n });\n\n const selectionColumn = useSelectionColumn<Q, RDPs>(\n { selectionMode, isAllSelected, hasSelection, onToggleAll, onToggleRow },\n );\n\n const allColumns = useMemo(() => {\n return selectionColumn ? [selectionColumn, ...columns] : columns;\n }, [selectionColumn, columns]);\n\n const table = useReactTable<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >({\n data: data ?? [],\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n columnVisibility,\n rowSelection,\n columnSizing,\n },\n onColumnSizingChange: setColumnSizing,\n enableRowSelection: selectionMode !== \"none\",\n columnResizeMode: \"onChange\",\n columnResizeDirection: \"ltr\",\n defaultColumn: {\n minSize: 80,\n },\n getRowId,\n });\n\n const onRenderCellContextMenu = useCallback(\n (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cell: Cell<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n return renderCellContextMenu?.(row, cell.getValue());\n },\n [renderCellContextMenu],\n );\n\n const isTableLoading = isLoading || isColumnsLoading;\n\n return (\n <Table\n table={table}\n isLoading={isTableLoading}\n fetchNextPage={fetchMore}\n onRowClick={props.onRowClick}\n rowHeight={props.rowHeight}\n renderCellContextMenu={onRenderCellContextMenu}\n className={props.className}\n />\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AASA,SAGEA,eAAe,EACfC,aAAa,QACR,uBAAuB;AAC9B,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC7D,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,qBAAqB,QAAQ,kCAAkC;AACxE,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,+BAA+B;AAElE,SAASC,KAAK,QAAQ,YAAY;AAClC,SAASC,QAAQ,QAAQ,qBAAqB;;AAE9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,SAASC,WAAWA,CAUzB;EACAC,SAAS;EACTC,UAAU;EACVC,iBAAiB;EACjBC,MAAM;EACNC,cAAc;EACdC,qBAAqB;EACrBC,aAAa,GAAG,MAAM;EACtBC,YAAY;EACZ,GAAGC;AACuC,CAAC,EAAsB;EACjE,MAAM;IAAEC,IAAI;IAAEC,SAAS;IAAEC;EAAU,CAAC,GAAGjB,kBAAkB,CAKvDM,SAAS,EACTE,iBAAiB,EACjBC,MACF,CAAC;EAED,MAAM;IAAES,OAAO;IAAEC,OAAO,EAAEC;EAAiB,CAAC,GAAGtB,aAAa,CAK1DS,UAAU,EACVC,iBACF,CAAC;EAED,MAAM;IAAEa;EAAiB,CAAC,GAAGtB,qBAAqB,CAAC;IAAES;EAAkB,CAAC,CAAC;EAEzE,MAAM,CAACc,YAAY,EAAEC,eAAe,CAAC,GAAG1B,QAAQ,CAAoB,CAAC,CAAC,CAAC;EAEvE,MAAM;IACJ2B,YAAY;IACZC,aAAa;IACbC,YAAY;IACZC,WAAW;IACXC;EACF,CAAC,GAAG3B,eAAe,CAAU;IAC3BW,aAAa;IACbC,YAAY;IACZH,cAAc;IACdK;EACF,CAAC,CAAC;EAEF,MAAMc,eAAe,GAAG3B,kBAAkB,CACxC;IAAEU,aAAa;IAAEa,aAAa;IAAEC,YAAY;IAAEC,WAAW;IAAEC;EAAY,CACzE,CAAC;EAED,MAAME,UAAU,GAAGlC,OAAO,CAAC,MAAM;IAC/B,OAAOiC,eAAe,GAAG,CAACA,eAAe,EAAE,GAAGX,OAAO,CAAC,GAAGA,OAAO;EAClE,CAAC,EAAE,CAACW,eAAe,EAAEX,OAAO,CAAC,CAAC;EAE9B,MAAMa,KAAK,GAAGtC,aAAa,CAEzB;IACAsB,IAAI,EAAEA,IAAI,IAAI,EAAE;IAChBG,OAAO,EAAEY,UAAU;IACnBtC,eAAe,EAAEA,eAAe,CAAC,CAAC;IAClCwC,KAAK,EAAE;MACLX,gBAAgB;MAChBG,YAAY;MACZF;IACF,CAAC;IACDW,oBAAoB,EAAEV,eAAe;IACrCW,kBAAkB,EAAEtB,aAAa,KAAK,MAAM;IAC5CuB,gBAAgB,EAAE,UAAU;IAC5BC,qBAAqB,EAAE,KAAK;IAC5BC,aAAa,EAAE;MACbC,OAAO,EAAE;IACX,CAAC;IACDlC;EACF,CAAC,CAAC;EAEF,MAAMmC,uBAAuB,GAAG5C,WAAW,CACzC,CACE6C,GAAkE,EAClEC,IAGC,KACE;IACH,OAAO9B,qBAAqB,GAAG6B,GAAG,EAAEC,IAAI,CAACC,QAAQ,CAAC,CAAC,CAAC;EACtD,CAAC,EACD,CAAC/B,qBAAqB,CACxB,CAAC;EAID,oBACEjB,KAAA,CAAAiD,aAAA,CAACxC,KAAK;IACJ4B,KAAK,EAAEA,KAAM;IACbd,SAAS,EALUA,SAAS,IAAIG,gBAKN;IAC1BwB,aAAa,EAAE5B,SAAU;IACzB6B,UAAU,EAAE/B,KAAK,CAAC+B,UAAW;IAC7BC,SAAS,EAAEhC,KAAK,CAACgC,SAAU;IAC3BnC,qBAAqB,EAAE4B,uBAAwB;IAC/CQ,SAAS,EAAEjC,KAAK,CAACiC;EAAU,CAC5B,CAAC;AAEN","ignoreList":[]}
1
+ {"version":3,"file":"ObjectTable.js","names":["getCoreRowModel","useReactTable","React","useCallback","useMemo","useState","useColumnDefs","useColumnPinning","useColumnVisibility","useObjectTableData","useRowSelection","useSelectionColumn","useTableSorting","BaseTable","getRowId","ObjectTable","objectSet","objectType","columnDefinitions","filter","orderBy","defaultOrderBy","onOrderByChanged","onColumnsPinnedChanged","onRowSelection","renderCellContextMenu","selectionMode","selectedRows","props","columnSizing","setColumnSizing","sorting","onSortingChange","data","fetchMore","isLoading","columns","loading","isColumnsLoading","columnVisibility","rowSelection","isAllSelected","hasSelection","onToggleAll","onToggleRow","selectionColumn","allColumns","columnPinning","onColumnPinningChange","hasSelectionColumn","table","state","onColumnSizingChange","enableRowSelection","columnResizeMode","columnResizeDirection","manualSorting","defaultColumn","minSize","onRenderCellContextMenu","row","cell","getValue","createElement","fetchNextPage","onRowClick","rowHeight","className"],"sources":["ObjectTable.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n ObjectTypeDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { Cell, ColumnSizingState } from \"@tanstack/react-table\";\nimport { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { useColumnDefs } from \"./hooks/useColumnDefs.js\";\nimport { useColumnPinning } from \"./hooks/useColumnPinning.js\";\nimport { useColumnVisibility } from \"./hooks/useColumnVisibility.js\";\nimport { useObjectTableData } from \"./hooks/useObjectTableData.js\";\nimport { useRowSelection } from \"./hooks/useRowSelection.js\";\nimport { useSelectionColumn } from \"./hooks/useSelectionColumn.js\";\nimport { useTableSorting } from \"./hooks/useTableSorting.js\";\nimport type { ObjectTableProps } from \"./ObjectTableApi.js\";\nimport { BaseTable } from \"./Table.js\";\nimport { getRowId } from \"./utils/getRowId.js\";\n\n/**\n * ObjectTable - A headless table component for displaying OSDK object sets\n *\n * @example\n * ```tsx\n * <ObjectTable objectSet={myObjectSet} objectType={MyObjectType} />\n * ```\n */\n\nexport function ObjectTable<\n Q extends ObjectTypeDefinition,\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 objectSet,\n objectType,\n columnDefinitions,\n filter,\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n onColumnsPinnedChanged,\n onRowSelection,\n renderCellContextMenu,\n selectionMode = \"none\",\n selectedRows,\n ...props\n}: ObjectTableProps<Q, RDPs, FunctionColumns>): React.ReactElement {\n const [columnSizing, setColumnSizing] = useState<ColumnSizingState>({});\n\n const { sorting, onSortingChange } = useTableSorting<\n Q,\n RDPs,\n FunctionColumns\n >(\n {\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n },\n );\n\n const { data, fetchMore, isLoading } = useObjectTableData<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectSet,\n columnDefinitions,\n filter,\n sorting,\n );\n\n const { columns, loading: isColumnsLoading } = useColumnDefs<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n );\n\n const columnVisibility = useColumnVisibility({ columnDefinitions });\n\n const {\n rowSelection,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n } = useRowSelection<Q, RDPs>({\n selectionMode,\n selectedRows,\n onRowSelection,\n data,\n });\n\n const selectionColumn = useSelectionColumn<Q, RDPs>(\n { selectionMode, isAllSelected, hasSelection, onToggleAll, onToggleRow },\n );\n\n const allColumns = useMemo(() => {\n return selectionColumn ? [selectionColumn, ...columns] : columns;\n }, [selectionColumn, columns]);\n\n const { columnPinning, onColumnPinningChange } = useColumnPinning({\n columnDefinitions,\n hasSelectionColumn: selectionColumn != null,\n onColumnsPinnedChanged,\n });\n\n const table = useReactTable<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >({\n data: data ?? [],\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n columnVisibility,\n rowSelection,\n sorting,\n columnSizing,\n columnPinning,\n },\n onSortingChange,\n onColumnSizingChange: setColumnSizing,\n onColumnPinningChange,\n enableRowSelection: selectionMode !== \"none\",\n columnResizeMode: \"onChange\",\n columnResizeDirection: \"ltr\",\n manualSorting: true, // Enable manual sorting to indicate server-side sorting\n defaultColumn: {\n minSize: 80,\n },\n getRowId,\n });\n\n const onRenderCellContextMenu = useCallback(\n (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cell: Cell<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n >,\n ) => {\n return renderCellContextMenu?.(row, cell.getValue());\n },\n [renderCellContextMenu],\n );\n\n const isTableLoading = isLoading || isColumnsLoading;\n\n return (\n <BaseTable\n table={table}\n isLoading={isTableLoading}\n fetchNextPage={fetchMore}\n onRowClick={props.onRowClick}\n rowHeight={props.rowHeight}\n renderCellContextMenu={onRenderCellContextMenu}\n className={props.className}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectTableApi.js","names":[],"sources":["ObjectTableApi.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 DerivedProperty,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type * as React from \"react\";\n\nexport type ColumnDefinition<\n Q extends ObjectTypeDefinition,\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 locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>;\n\n /**\n * @default true\n */\n isVisible?: boolean;\n\n /**\n * @default none\n */\n pinned?: \"left\" | \"right\" | \"none\";\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n orderable?: boolean;\n filterable?: boolean;\n renderCell?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>,\n ) => React.ReactNode;\n renderHeader?: () => React.ReactNode;\n};\n\nexport type ColumnDefinitionLocator<\n Q extends ObjectTypeDefinition,\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 | {\n type: \"property\";\n id: PropertyKeys<Q>;\n }\n | {\n type: \"function\";\n id: keyof FunctionColumns;\n }\n | {\n type: \"rdp\";\n id: keyof RDPs;\n creator: DerivedProperty.Creator<Q, RDPs[keyof RDPs]>;\n };\n\nexport interface ObjectTableProps<\n Q extends ObjectTypeDefinition,\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 /**\n * The set of objects to show in the table\n */\n objectSet: ObjectSet<Q>;\n\n /**\n * The object type of the object\n */\n objectType: Q;\n\n /**\n * Ordered list of column definitions to show in the table\n *\n * If not provided, all of the properties of the object type will be shown in default order.\n */\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>;\n\n /**\n * Whether the table is filterable by the user.\n *\n * @default true\n */\n filterable?: boolean;\n\n /**\n * The current where clause to filter the objects in the table.\n * If provided, the filter is controlled.\n */\n filter?: WhereClause<Q, RDPs>;\n\n /**\n * Called when the where clause is changed.\n * Required when filter is controlled.\n *\n * @param newWhere The new where clause\n */\n onFilterChanged?: (newWhere: WhereClause<Q, RDPs>) => void;\n\n /**\n * Whether the table is sortable by the user.\n *\n * @default true\n */\n orderable?: boolean;\n\n /**\n * The current order by clause to sort the objects in the table.\n * If provided, the sorting is controlled.\n */\n orderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * Called when the order by clause is changed.\n * Required when sorting is controlled.\n *\n * @param newOrderBy The new order by clause\n */\n onOrderByChanged?: (\n newOrderBy: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>,\n ) => void;\n\n /**\n * Called when the visible columns change.\n *\n * If provided, the table will allow the user to show/hide columns.\n *\n * @param newStates The new list of column visibility states\n */\n onColumnVisibilityChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n isVisible: boolean;\n }>,\n ) => void;\n\n /**\n * Called when the pinned columns change.\n *\n * If provided, the table will allow the user to pin/unpin columns.\n *\n * @param newStates The new list of column pin states\n */\n onColumnsPinnedChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n pinned: \"left\" | \"right\" | \"none\";\n }>,\n ) => void;\n\n /**\n * Called when a column is resized.\n *\n * @param columnId The ID of the resized column\n * @param newWidth The new width of the column\n */\n onColumnResize?: (\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns,\n newWidth: number,\n ) => void;\n\n /**\n * Called when a row is clicked.\n *\n * @param object The object representing the clicked row\n */\n onRowClick?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n ) => void;\n\n /**\n * Selection mode for the table rows.\n *\n * If multiple, a checkbox will be shown for each row to allow selecting multiple rows\n * as well as a top-level checkbox in the header to select all rows.\n *\n * @default \"none\"\n */\n selectionMode?: \"single\" | \"multiple\" | \"none\";\n\n /**\n * The currently selected rows in the table.\n * If provided, the row selection is controlled.\n */\n selectedRows?: PrimaryKeyType<Q>[];\n\n /**\n * Called when the row selection changes.\n * Required when row selection is controlled.\n *\n * @param selectedRowIds The primary keys of currently selected rows\n */\n\n onRowSelection?: (selectedRowIds: PrimaryKeyType<Q>[]) => void;\n\n /**\n * If provided, will render this context menu when right clicking on a cell\n */\n renderCellContextMenu?: (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cellValue: unknown,\n ) => React.ReactNode;\n\n /**\n * The height of each row in pixels.\n *\n * @default 40\n */\n rowHeight?: number;\n\n className?: string;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"ObjectTableApi.js","names":[],"sources":["ObjectTableApi.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 DerivedProperty,\n ObjectSet,\n ObjectTypeDefinition,\n Osdk,\n PrimaryKeyType,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n WhereClause,\n} from \"@osdk/api\";\nimport type * as React from \"react\";\n\nexport type ColumnDefinition<\n Q extends ObjectTypeDefinition,\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 locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>;\n\n /**\n * @default true\n */\n isVisible?: boolean;\n\n /**\n * @default none\n */\n pinned?: \"left\" | \"right\" | \"none\";\n width?: number;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n orderable?: boolean;\n filterable?: boolean;\n renderCell?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n locator: ColumnDefinitionLocator<Q, RDPs, FunctionColumns>,\n ) => React.ReactNode;\n renderHeader?: () => React.ReactNode;\n};\n\nexport type ColumnDefinitionLocator<\n Q extends ObjectTypeDefinition,\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 | {\n type: \"property\";\n id: PropertyKeys<Q>;\n }\n | {\n type: \"function\";\n id: keyof FunctionColumns;\n }\n | {\n type: \"rdp\";\n id: keyof RDPs;\n creator: DerivedProperty.Creator<Q, RDPs[keyof RDPs]>;\n };\n\nexport interface ObjectTableProps<\n Q extends ObjectTypeDefinition,\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 /**\n * The set of objects to show in the table\n */\n objectSet: ObjectSet<Q>;\n\n /**\n * The object type of the object\n */\n objectType: Q;\n\n /**\n * Ordered list of column definitions to show in the table\n *\n * If not provided, all of the properties of the object type will be shown in default order.\n */\n columnDefinitions?: Array<ColumnDefinition<Q, RDPs, FunctionColumns>>;\n\n /**\n * Whether the table is filterable by the user.\n *\n * @default true\n */\n filterable?: boolean;\n\n /**\n * The current where clause to filter the objects in the table.\n * If provided, the filter is controlled.\n */\n filter?: WhereClause<Q, RDPs>;\n\n /**\n * Called when the where clause is changed.\n * Required when filter is controlled.\n *\n * @param newWhere The new where clause\n */\n onFilterChanged?: (newWhere: WhereClause<Q, RDPs>) => void;\n\n /**\n * Whether the table is sortable by the user.\n *\n * @default true\n */\n orderable?: boolean;\n\n /**\n * The default order by clause to sort the objects in the table.\n * If provided without orderBy prop, the sorting is uncontrolled.\n * If both orderBy and defaultOrderBy are provided, orderBy takes precedence.\n */\n defaultOrderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * The current order by clause to sort the objects in the table.\n * If provided, the sorting is controlled.\n * If both orderBy and defaultOrderBy are provided, orderBy takes precedence.\n */\n orderBy?: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>;\n\n /**\n * Called when the order by clause is changed.\n * Required when sorting is controlled.\n *\n * @param newOrderBy The new order by clause\n */\n onOrderByChanged?: (\n newOrderBy: Array<{\n property: PropertyKeys<Q>;\n direction: \"asc\" | \"desc\";\n }>,\n ) => void;\n\n /**\n * Called when the visible columns change.\n *\n * If provided, the table will allow the user to show/hide columns.\n *\n * @param newStates The new list of column visibility states\n */\n onColumnVisibilityChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n isVisible: boolean;\n }>,\n ) => void;\n\n /**\n * Called when the pinned columns change.\n *\n * If provided, the table will allow the user to pin/unpin columns.\n *\n * @param newStates The new list of column pin states\n */\n onColumnsPinnedChanged?: (\n newStates: Array<{\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns;\n pinned: \"left\" | \"right\" | \"none\";\n }>,\n ) => void;\n\n /**\n * Called when a column is resized.\n *\n * @param columnId The ID of the resized column\n * @param newWidth The new width of the column\n */\n onColumnResize?: (\n columnId: PropertyKeys<Q> | keyof RDPs | keyof FunctionColumns,\n newWidth: number,\n ) => void;\n\n /**\n * Called when a row is clicked.\n *\n * @param object The object representing the clicked row\n */\n onRowClick?: (\n object: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n ) => void;\n\n /**\n * Selection mode for the table rows.\n *\n * If multiple, a checkbox will be shown for each row to allow selecting multiple rows\n * as well as a top-level checkbox in the header to select all rows.\n *\n * @default \"none\"\n */\n selectionMode?: \"single\" | \"multiple\" | \"none\";\n\n /**\n * The currently selected rows in the table.\n * If provided, the row selection is controlled.\n */\n selectedRows?: PrimaryKeyType<Q>[];\n\n /**\n * Called when the row selection changes.\n * Required when row selection is controlled.\n *\n * @param selectedRowIds The primary keys of currently selected rows\n */\n\n onRowSelection?: (selectedRowIds: PrimaryKeyType<Q>[]) => void;\n\n /**\n * If provided, will render this context menu when right clicking on a cell\n */\n renderCellContextMenu?: (\n row: Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n cellValue: unknown,\n ) => React.ReactNode;\n\n /**\n * The height of each row in pixels.\n *\n * @default 40\n */\n rowHeight?: number;\n\n className?: string;\n}\n"],"mappings":"","ignoreList":[]}
@@ -19,7 +19,7 @@ import React, { useCallback, useRef } from "react";
19
19
  import styles from "./Table.module.css";
20
20
  import { TableBody } from "./TableBody.js";
21
21
  import { TableHeader } from "./TableHeader.js";
22
- export function Table({
22
+ export function BaseTable({
23
23
  table,
24
24
  isLoading,
25
25
  fetchNextPage,
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","names":["classNames","React","useCallback","useRef","styles","TableBody","TableHeader","Table","table","isLoading","fetchNextPage","onRowClick","rowHeight","renderCellContextMenu","className","tableContainerRef","fetchingRef","fetchMoreOnEndReached","containerRefElement","current","scrollHeight","scrollTop","clientHeight","handleScroll","e","currentTarget","createElement","ref","osdkTableContainer","onScroll","rows","getRowModel"],"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, { type ReactElement, useCallback, useRef } from \"react\";\nimport styles from \"./Table.module.css\";\nimport { TableBody } from \"./TableBody.js\";\nimport { TableHeader } from \"./TableHeader.js\";\n\ninterface TableProps<TData extends RowData> {\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}\n\nexport function Table<TData extends RowData>(\n {\n table,\n isLoading,\n fetchNextPage,\n onRowClick,\n rowHeight,\n renderCellContextMenu,\n className,\n }: TableProps<TData>,\n): ReactElement {\n const tableContainerRef = useRef<HTMLDivElement>(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 const fetchMoreOnEndReached = useCallback(\n async (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement && !fetchingRef.current) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n if (\n scrollHeight - scrollTop - clientHeight < 100\n && !isLoading\n ) {\n fetchingRef.current = true;\n try {\n await fetchNextPage?.();\n } finally {\n fetchingRef.current = false;\n }\n }\n }\n },\n [fetchNextPage, isLoading],\n );\n\n const handleScroll = useCallback(\n async (e: React.UIEvent<HTMLDivElement>) => {\n await fetchMoreOnEndReached(e.currentTarget);\n },\n [fetchMoreOnEndReached],\n );\n\n // TODO: Handle error, loading and empty states\n\n return (\n <div\n ref={tableContainerRef}\n className={classNames(styles.osdkTableContainer, className)}\n onScroll={handleScroll}\n >\n <table>\n <TableHeader table={table} />\n <TableBody\n rows={table.getRowModel().rows}\n tableContainerRef={tableContainerRef}\n onRowClick={onRowClick}\n rowHeight={rowHeight}\n renderCellContextMenu={renderCellContextMenu}\n />\n </table>\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAuBC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AACrE,OAAOC,MAAM,MAAM,oBAAoB;AACvC,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,WAAW,QAAQ,kBAAkB;AAe9C,OAAO,SAASC,KAAKA,CACnB;EACEC,KAAK;EACLC,SAAS;EACTC,aAAa;EACbC,UAAU;EACVC,SAAS;EACTC,qBAAqB;EACrBC;AACiB,CAAC,EACN;EACd,MAAMC,iBAAiB,GAAGZ,MAAM,CAAiB,IAAI,CAAC;;EAEtD;EACA,MAAMa,WAAW,GAAGb,MAAM,CAAC,KAAK,CAAC;EAEjC,MAAMc,qBAAqB,GAAGf,WAAW,CACvC,MAAOgB,mBAA2C,IAAK;IACrD,IAAIA,mBAAmB,IAAI,CAACF,WAAW,CAACG,OAAO,EAAE;MAC/C,MAAM;QAAEC,YAAY;QAAEC,SAAS;QAAEC;MAAa,CAAC,GAAGJ,mBAAmB;MACrE,IACEE,YAAY,GAAGC,SAAS,GAAGC,YAAY,GAAG,GAAG,IAC1C,CAACb,SAAS,EACb;QACAO,WAAW,CAACG,OAAO,GAAG,IAAI;QAC1B,IAAI;UACF,MAAMT,aAAa,GAAG,CAAC;QACzB,CAAC,SAAS;UACRM,WAAW,CAACG,OAAO,GAAG,KAAK;QAC7B;MACF;IACF;EACF,CAAC,EACD,CAACT,aAAa,EAAED,SAAS,CAC3B,CAAC;EAED,MAAMc,YAAY,GAAGrB,WAAW,CAC9B,MAAOsB,CAAgC,IAAK;IAC1C,MAAMP,qBAAqB,CAACO,CAAC,CAACC,aAAa,CAAC;EAC9C,CAAC,EACD,CAACR,qBAAqB,CACxB,CAAC;;EAED;;EAEA,oBACEhB,KAAA,CAAAyB,aAAA;IACEC,GAAG,EAAEZ,iBAAkB;IACvBD,SAAS,EAAEd,UAAU,CAACI,MAAM,CAACwB,kBAAkB,EAAEd,SAAS,CAAE;IAC5De,QAAQ,EAAEN;EAAa,gBAEvBtB,KAAA,CAAAyB,aAAA,6BACEzB,KAAA,CAAAyB,aAAA,CAACpB,WAAW;IAACE,KAAK,EAAEA;EAAM,CAAE,CAAC,eAC7BP,KAAA,CAAAyB,aAAA,CAACrB,SAAS;IACRyB,IAAI,EAAEtB,KAAK,CAACuB,WAAW,CAAC,CAAC,CAACD,IAAK;IAC/Bf,iBAAiB,EAAEA,iBAAkB;IACrCJ,UAAU,EAAEA,UAAW;IACvBC,SAAS,EAAEA,SAAU;IACrBC,qBAAqB,EAAEA;EAAsB,CAC9C,CACI,CACJ,CAAC;AAEV","ignoreList":[]}
1
+ {"version":3,"file":"Table.js","names":["classNames","React","useCallback","useRef","styles","TableBody","TableHeader","BaseTable","table","isLoading","fetchNextPage","onRowClick","rowHeight","renderCellContextMenu","className","tableContainerRef","fetchingRef","fetchMoreOnEndReached","containerRefElement","current","scrollHeight","scrollTop","clientHeight","handleScroll","e","currentTarget","createElement","ref","osdkTableContainer","onScroll","rows","getRowModel"],"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, { type ReactElement, useCallback, useRef } from \"react\";\nimport styles from \"./Table.module.css\";\nimport { TableBody } from \"./TableBody.js\";\nimport { TableHeader } from \"./TableHeader.js\";\n\nexport interface BaseTableProps<TData extends RowData> {\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}\n\nexport function BaseTable<TData extends RowData>(\n {\n table,\n isLoading,\n fetchNextPage,\n onRowClick,\n rowHeight,\n renderCellContextMenu,\n className,\n }: BaseTableProps<TData>,\n): ReactElement {\n const tableContainerRef = useRef<HTMLDivElement>(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 const fetchMoreOnEndReached = useCallback(\n async (containerRefElement?: HTMLDivElement | null) => {\n if (containerRefElement && !fetchingRef.current) {\n const { scrollHeight, scrollTop, clientHeight } = containerRefElement;\n if (\n scrollHeight - scrollTop - clientHeight < 100\n && !isLoading\n ) {\n fetchingRef.current = true;\n try {\n await fetchNextPage?.();\n } finally {\n fetchingRef.current = false;\n }\n }\n }\n },\n [fetchNextPage, isLoading],\n );\n\n const handleScroll = useCallback(\n async (e: React.UIEvent<HTMLDivElement>) => {\n await fetchMoreOnEndReached(e.currentTarget);\n },\n [fetchMoreOnEndReached],\n );\n\n // TODO: Handle error, loading and empty states\n\n return (\n <div\n ref={tableContainerRef}\n className={classNames(styles.osdkTableContainer, className)}\n onScroll={handleScroll}\n >\n <table>\n <TableHeader table={table} />\n <TableBody\n rows={table.getRowModel().rows}\n tableContainerRef={tableContainerRef}\n onRowClick={onRowClick}\n rowHeight={rowHeight}\n renderCellContextMenu={renderCellContextMenu}\n />\n </table>\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAuBC,WAAW,EAAEC,MAAM,QAAQ,OAAO;AACrE,OAAOC,MAAM,MAAM,oBAAoB;AACvC,SAASC,SAAS,QAAQ,gBAAgB;AAC1C,SAASC,WAAW,QAAQ,kBAAkB;AAe9C,OAAO,SAASC,SAASA,CACvB;EACEC,KAAK;EACLC,SAAS;EACTC,aAAa;EACbC,UAAU;EACVC,SAAS;EACTC,qBAAqB;EACrBC;AACqB,CAAC,EACV;EACd,MAAMC,iBAAiB,GAAGZ,MAAM,CAAiB,IAAI,CAAC;;EAEtD;EACA,MAAMa,WAAW,GAAGb,MAAM,CAAC,KAAK,CAAC;EAEjC,MAAMc,qBAAqB,GAAGf,WAAW,CACvC,MAAOgB,mBAA2C,IAAK;IACrD,IAAIA,mBAAmB,IAAI,CAACF,WAAW,CAACG,OAAO,EAAE;MAC/C,MAAM;QAAEC,YAAY;QAAEC,SAAS;QAAEC;MAAa,CAAC,GAAGJ,mBAAmB;MACrE,IACEE,YAAY,GAAGC,SAAS,GAAGC,YAAY,GAAG,GAAG,IAC1C,CAACb,SAAS,EACb;QACAO,WAAW,CAACG,OAAO,GAAG,IAAI;QAC1B,IAAI;UACF,MAAMT,aAAa,GAAG,CAAC;QACzB,CAAC,SAAS;UACRM,WAAW,CAACG,OAAO,GAAG,KAAK;QAC7B;MACF;IACF;EACF,CAAC,EACD,CAACT,aAAa,EAAED,SAAS,CAC3B,CAAC;EAED,MAAMc,YAAY,GAAGrB,WAAW,CAC9B,MAAOsB,CAAgC,IAAK;IAC1C,MAAMP,qBAAqB,CAACO,CAAC,CAACC,aAAa,CAAC;EAC9C,CAAC,EACD,CAACR,qBAAqB,CACxB,CAAC;;EAED;;EAEA,oBACEhB,KAAA,CAAAyB,aAAA;IACEC,GAAG,EAAEZ,iBAAkB;IACvBD,SAAS,EAAEd,UAAU,CAACI,MAAM,CAACwB,kBAAkB,EAAEd,SAAS,CAAE;IAC5De,QAAQ,EAAEN;EAAa,gBAEvBtB,KAAA,CAAAyB,aAAA,6BACEzB,KAAA,CAAAyB,aAAA,CAACpB,WAAW;IAACE,KAAK,EAAEA;EAAM,CAAE,CAAC,eAC7BP,KAAA,CAAAyB,aAAA,CAACrB,SAAS;IACRyB,IAAI,EAAEtB,KAAK,CAACuB,WAAW,CAAC,CAAC,CAACD,IAAK;IAC/Bf,iBAAiB,EAAEA,iBAAkB;IACrCJ,UAAU,EAAEA,UAAW;IACvBC,SAAS,EAAEA,SAAU;IACrBC,qBAAqB,EAAEA;EAAsB,CAC9C,CACI,CACJ,CAAC;AAEV","ignoreList":[]}
@@ -19,3 +19,4 @@
19
19
  height: 100%; /* needed for scrolling */
20
20
  overflow: auto;
21
21
  }
22
+
@@ -18,8 +18,9 @@ import { flexRender } from "@tanstack/react-table";
18
18
  import React, { useRef } from "react";
19
19
  import { CellContextMenu } from "./CellContextMenu.js";
20
20
  import { useCellContextMenu } from "./hooks/useCellContextMenu.js";
21
- import { SELECTION_COLUMN_ID } from "./hooks/useSelectionColumn.js";
22
21
  import styles from "./TableCell.module.css";
22
+ import { SELECTION_COLUMN_ID } from "./utils/constants.js";
23
+ import { getColumnPinningStyles } from "./utils/getColumnPinningStyles.js";
23
24
  export function TableCell({
24
25
  cell,
25
26
  renderCellContextMenu
@@ -34,12 +35,14 @@ export function TableCell({
34
35
  } = useCellContextMenu({
35
36
  tdRef
36
37
  });
38
+ const {
39
+ columnStyles
40
+ } = getColumnPinningStyles(cell.column);
37
41
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("td", {
38
42
  ref: tdRef,
43
+ "data-pinned": cell.column.getIsPinned(),
39
44
  className: styles.osdkTableCell,
40
- style: {
41
- width: cell.column.getSize()
42
- },
45
+ style: columnStyles,
43
46
  onContextMenu: handleOpenContextMenu
44
47
  }, /*#__PURE__*/React.createElement("div", {
45
48
  className: styles.osdkTableCellContent
@@ -1 +1 @@
1
- {"version":3,"file":"TableCell.js","names":["flexRender","React","useRef","CellContextMenu","useCellContextMenu","SELECTION_COLUMN_ID","styles","TableCell","cell","renderCellContextMenu","tdRef","isSelectColumn","column","id","isContextMenuOpen","handleOpenContextMenu","handleCloseContextMenu","popoverPosition","createElement","Fragment","ref","className","osdkTableCell","style","width","getSize","onContextMenu","osdkTableCellContent","columnDef","getContext","position","onClose","renderContent"],"sources":["TableCell.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 } from \"@tanstack/react-table\";\nimport { flexRender } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\nimport React, { useRef } from \"react\";\nimport { CellContextMenu } from \"./CellContextMenu.js\";\nimport { useCellContextMenu } from \"./hooks/useCellContextMenu.js\";\nimport { SELECTION_COLUMN_ID } from \"./hooks/useSelectionColumn.js\";\nimport styles from \"./TableCell.module.css\";\n\ninterface TableCellProps<TData extends RowData> {\n cell: Cell<TData, unknown>;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n}\n\nexport function TableCell<TData extends RowData>(\n { cell, renderCellContextMenu }: TableCellProps<TData>,\n): React.ReactElement {\n const tdRef = useRef<HTMLTableCellElement>(null);\n const isSelectColumn = cell.column.id === SELECTION_COLUMN_ID;\n\n const {\n isContextMenuOpen,\n handleOpenContextMenu,\n handleCloseContextMenu,\n popoverPosition,\n } = useCellContextMenu({\n tdRef,\n });\n\n const shouldRenderContextMenu = !isSelectColumn && isContextMenuOpen\n && !!popoverPosition\n && !!renderCellContextMenu;\n\n return (\n <>\n <td\n ref={tdRef}\n className={styles.osdkTableCell}\n style={{\n width: cell.column.getSize(),\n }}\n onContextMenu={handleOpenContextMenu}\n >\n <div className={styles.osdkTableCellContent}>\n {flexRender(cell.column.columnDef.cell, cell.getContext()) as\n | ReactNode\n | React.JSX.Element}\n </div>\n </td>\n {shouldRenderContextMenu\n && (\n <CellContextMenu\n cell={cell}\n position={popoverPosition}\n onClose={handleCloseContextMenu}\n renderContent={renderCellContextMenu}\n />\n )}\n </>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,UAAU,QAAQ,uBAAuB;AAElD,OAAOC,KAAK,IAAIC,MAAM,QAAQ,OAAO;AACrC,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,mBAAmB,QAAQ,+BAA+B;AACnE,OAAOC,MAAM,MAAM,wBAAwB;AAU3C,OAAO,SAASC,SAASA,CACvB;EAAEC,IAAI;EAAEC;AAA6C,CAAC,EAClC;EACpB,MAAMC,KAAK,GAAGR,MAAM,CAAuB,IAAI,CAAC;EAChD,MAAMS,cAAc,GAAGH,IAAI,CAACI,MAAM,CAACC,EAAE,KAAKR,mBAAmB;EAE7D,MAAM;IACJS,iBAAiB;IACjBC,qBAAqB;IACrBC,sBAAsB;IACtBC;EACF,CAAC,GAAGb,kBAAkB,CAAC;IACrBM;EACF,CAAC,CAAC;EAMF,oBACET,KAAA,CAAAiB,aAAA,CAAAjB,KAAA,CAAAkB,QAAA,qBACElB,KAAA,CAAAiB,aAAA;IACEE,GAAG,EAAEV,KAAM;IACXW,SAAS,EAAEf,MAAM,CAACgB,aAAc;IAChCC,KAAK,EAAE;MACLC,KAAK,EAAEhB,IAAI,CAACI,MAAM,CAACa,OAAO,CAAC;IAC7B,CAAE;IACFC,aAAa,EAAEX;EAAsB,gBAErCd,KAAA,CAAAiB,aAAA;IAAKG,SAAS,EAAEf,MAAM,CAACqB;EAAqB,GACzC3B,UAAU,CAACQ,IAAI,CAACI,MAAM,CAACgB,SAAS,CAACpB,IAAI,EAAEA,IAAI,CAACqB,UAAU,CAAC,CAAC,CAGtD,CACH,CAAC,EAnBuB,CAAClB,cAAc,IAAIG,iBAAiB,IAC/D,CAAC,CAACG,eAAe,IACjB,CAAC,CAACR,qBAAqB,iBAoBpBR,KAAA,CAAAiB,aAAA,CAACf,eAAe;IACdK,IAAI,EAAEA,IAAK;IACXsB,QAAQ,EAAEb,eAAgB;IAC1Bc,OAAO,EAAEf,sBAAuB;IAChCgB,aAAa,EAAEvB;EAAsB,CACtC,CAEL,CAAC;AAEP","ignoreList":[]}
1
+ {"version":3,"file":"TableCell.js","names":["flexRender","React","useRef","CellContextMenu","useCellContextMenu","styles","SELECTION_COLUMN_ID","getColumnPinningStyles","TableCell","cell","renderCellContextMenu","tdRef","isSelectColumn","column","id","isContextMenuOpen","handleOpenContextMenu","handleCloseContextMenu","popoverPosition","columnStyles","createElement","Fragment","ref","getIsPinned","className","osdkTableCell","style","onContextMenu","osdkTableCellContent","columnDef","getContext","position","onClose","renderContent"],"sources":["TableCell.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 } from \"@tanstack/react-table\";\nimport { flexRender } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\nimport React, { useRef } from \"react\";\nimport { CellContextMenu } from \"./CellContextMenu.js\";\nimport { useCellContextMenu } from \"./hooks/useCellContextMenu.js\";\nimport styles from \"./TableCell.module.css\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\n\ninterface TableCellProps<TData extends RowData> {\n cell: Cell<TData, unknown>;\n renderCellContextMenu?: (\n row: TData,\n cell: Cell<TData, unknown>,\n ) => React.ReactNode;\n}\n\nexport function TableCell<TData extends RowData>(\n { cell, renderCellContextMenu }: TableCellProps<TData>,\n): React.ReactElement {\n const tdRef = useRef<HTMLTableCellElement>(null);\n const isSelectColumn = cell.column.id === SELECTION_COLUMN_ID;\n\n const {\n isContextMenuOpen,\n handleOpenContextMenu,\n handleCloseContextMenu,\n popoverPosition,\n } = useCellContextMenu({\n tdRef,\n });\n\n const shouldRenderContextMenu = !isSelectColumn && isContextMenuOpen\n && !!popoverPosition\n && !!renderCellContextMenu;\n\n const { columnStyles } = getColumnPinningStyles(cell.column);\n\n return (\n <>\n <td\n ref={tdRef}\n data-pinned={cell.column.getIsPinned()}\n className={styles.osdkTableCell}\n style={columnStyles}\n onContextMenu={handleOpenContextMenu}\n >\n <div className={styles.osdkTableCellContent}>\n {flexRender(cell.column.columnDef.cell, cell.getContext()) as\n | ReactNode\n | React.JSX.Element}\n </div>\n </td>\n {shouldRenderContextMenu\n && (\n <CellContextMenu\n cell={cell}\n position={popoverPosition}\n onClose={handleCloseContextMenu}\n renderContent={renderCellContextMenu}\n />\n )}\n </>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,UAAU,QAAQ,uBAAuB;AAElD,OAAOC,KAAK,IAAIC,MAAM,QAAQ,OAAO;AACrC,SAASC,eAAe,QAAQ,sBAAsB;AACtD,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,OAAOC,MAAM,MAAM,wBAAwB;AAC3C,SAASC,mBAAmB,QAAQ,sBAAsB;AAC1D,SAASC,sBAAsB,QAAQ,mCAAmC;AAU1E,OAAO,SAASC,SAASA,CACvB;EAAEC,IAAI;EAAEC;AAA6C,CAAC,EAClC;EACpB,MAAMC,KAAK,GAAGT,MAAM,CAAuB,IAAI,CAAC;EAChD,MAAMU,cAAc,GAAGH,IAAI,CAACI,MAAM,CAACC,EAAE,KAAKR,mBAAmB;EAE7D,MAAM;IACJS,iBAAiB;IACjBC,qBAAqB;IACrBC,sBAAsB;IACtBC;EACF,CAAC,GAAGd,kBAAkB,CAAC;IACrBO;EACF,CAAC,CAAC;EAMF,MAAM;IAAEQ;EAAa,CAAC,GAAGZ,sBAAsB,CAACE,IAAI,CAACI,MAAM,CAAC;EAE5D,oBACEZ,KAAA,CAAAmB,aAAA,CAAAnB,KAAA,CAAAoB,QAAA,qBACEpB,KAAA,CAAAmB,aAAA;IACEE,GAAG,EAAEX,KAAM;IACX,eAAaF,IAAI,CAACI,MAAM,CAACU,WAAW,CAAC,CAAE;IACvCC,SAAS,EAAEnB,MAAM,CAACoB,aAAc;IAChCC,KAAK,EAAEP,YAAa;IACpBQ,aAAa,EAAEX;EAAsB,gBAErCf,KAAA,CAAAmB,aAAA;IAAKI,SAAS,EAAEnB,MAAM,CAACuB;EAAqB,GACzC5B,UAAU,CAACS,IAAI,CAACI,MAAM,CAACgB,SAAS,CAACpB,IAAI,EAAEA,IAAI,CAACqB,UAAU,CAAC,CAAC,CAGtD,CACH,CAAC,EApBuB,CAAClB,cAAc,IAAIG,iBAAiB,IAC/D,CAAC,CAACG,eAAe,IACjB,CAAC,CAACR,qBAAqB,iBAqBpBT,KAAA,CAAAmB,aAAA,CAACjB,eAAe;IACdM,IAAI,EAAEA,IAAK;IACXsB,QAAQ,EAAEb,eAAgB;IAC1Bc,OAAO,EAAEf,sBAAuB;IAChCgB,aAAa,EAAEvB;EAAsB,CACtC,CAEL,CAAC;AAEP","ignoreList":[]}
@@ -38,7 +38,24 @@
38
38
  justify-content: center;
39
39
  }
40
40
 
41
- .osdkTableCellContent {
41
+
42
+ .osdkTableCell[data-pinned="left"],
43
+ .osdkTableCell[data-pinned="right"] {
44
+ position: sticky;
45
+ z-index: var(--bp-surface-zIndex-1);
46
+ }
47
+
48
+ /* Last left-pinned column - no left-pinned siblings after it */
49
+ .osdkTableCell[data-pinned="left"]:not(:has(~ [data-pinned="left"])) {
50
+ border-right: calc(var(--bp-surface-borderWidth) * 2) solid var(--osdk-table-border-color);
51
+ }
52
+
53
+ /* First right-pinned column - no right-pinned siblings before it */
54
+ .osdkTableCell[data-pinned="right"]:not(:has(~ [data-pinned="right"]):nth-child(n+2)) {
55
+ border-left: calc(var(--bp-surface-borderWidth) * 2) solid var(--osdk-table-border-color);
56
+ }
57
+
58
+ .osdkTableCellContent:not(:has([role="checkbox"])) {
42
59
  overflow: hidden;
43
60
  text-overflow: ellipsis;
44
61
  white-space: nowrap;
@@ -14,9 +14,12 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { flexRender } from "@tanstack/react-table";
18
17
  import React from "react";
19
18
  import styles from "./TableHeader.module.css";
19
+ import { TableHeaderContent } from "./TableHeaderContent.js";
20
+ import { TableHeaderWithPopover } from "./TableHeaderWithPopover.js";
21
+ import { SELECTION_COLUMN_ID } from "./utils/constants.js";
22
+ import { getColumnPinningStyles } from "./utils/getColumnPinningStyles.js";
20
23
  export function TableHeader({
21
24
  table
22
25
  }) {
@@ -29,17 +32,29 @@ export function TableHeader({
29
32
  }, table.getHeaderGroups().map(headerGroup => /*#__PURE__*/React.createElement("tr", {
30
33
  key: headerGroup.id,
31
34
  className: styles.osdkTableHeaderRow
32
- }, headerGroup.headers.map(header => /*#__PURE__*/React.createElement("th", {
33
- key: header.id,
34
- className: styles.osdkTableHeaderCell,
35
- style: {
36
- width: header.getSize()
37
- }
38
- }, header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()), header.column.getCanResize() && /*#__PURE__*/React.createElement("div", {
39
- className: styles.osdkTableHeaderResizer,
40
- onDoubleClick: () => header.column.resetSize(),
41
- onMouseDown: header.getResizeHandler(),
42
- onTouchStart: header.getResizeHandler()
43
- }))))));
35
+ }, headerGroup.headers.map(header => {
36
+ const {
37
+ columnStyles
38
+ } = getColumnPinningStyles(header.column);
39
+ const isColumnPinned = header.column.getIsPinned();
40
+ const isSelectColumn = header.id === SELECTION_COLUMN_ID;
41
+ return /*#__PURE__*/React.createElement("th", {
42
+ key: header.id,
43
+ "data-pinned": header.column.getIsPinned(),
44
+ className: styles.osdkTableHeaderCell,
45
+ style: columnStyles
46
+ }, header.isPlaceholder ? null : isSelectColumn ? /*#__PURE__*/React.createElement(TableHeaderContent, {
47
+ header: header
48
+ }) : /*#__PURE__*/React.createElement(TableHeaderWithPopover, {
49
+ header: header,
50
+ isColumnPinned: isColumnPinned,
51
+ setColumnPinning: table.setColumnPinning
52
+ }), header.column.getCanResize() && /*#__PURE__*/React.createElement("div", {
53
+ className: styles.osdkTableHeaderResizer,
54
+ onDoubleClick: () => header.column.resetSize(),
55
+ onMouseDown: header.getResizeHandler(),
56
+ onTouchStart: header.getResizeHandler()
57
+ }));
58
+ }))));
44
59
  }
45
60
  //# sourceMappingURL=TableHeader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeader.js","names":["flexRender","React","styles","TableHeader","table","isResizing","getState","columnSizingInfo","isResizingColumn","createElement","className","osdkTableHeader","getHeaderGroups","map","headerGroup","key","id","osdkTableHeaderRow","headers","header","osdkTableHeaderCell","style","width","getSize","isPlaceholder","column","columnDef","getContext","getCanResize","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart"],"sources":["TableHeader.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 { RowData, Table } from \"@tanstack/react-table\";\nimport { flexRender } from \"@tanstack/react-table\";\nimport type { ReactNode } from \"react\";\nimport React from \"react\";\nimport styles from \"./TableHeader.module.css\";\n\ninterface TableHeaderProps<TData extends RowData> {\n table: Table<TData>;\n}\n\nexport function TableHeader<TData extends RowData>({\n table,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n return (\n <thead className={styles.osdkTableHeader} data-resizing={isResizing}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className={styles.osdkTableHeaderRow}\n >\n {headerGroup.headers.map((header) => (\n <th\n key={header.id}\n className={styles.osdkTableHeaderCell}\n style={{\n width: header.getSize(),\n }}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n ) as ReactNode | React.JSX.Element}\n {header.column.getCanResize() && (\n <div\n className={styles.osdkTableHeaderResizer}\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </th>\n ))}\n </tr>\n ))}\n </thead>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,UAAU,QAAQ,uBAAuB;AAElD,OAAOC,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,0BAA0B;AAM7C,OAAO,SAASC,WAAWA,CAAwB;EACjDC;AACuB,CAAC,EAAsB;EAC9C;;EAEA,MAAMC,UAAU,GAAG,CAAC,CAACD,KAAK,CAACE,QAAQ,CAAC,CAAC,CAACC,gBAAgB,EAAEC,gBAAgB;EAExE,oBACEP,KAAA,CAAAQ,aAAA;IAAOC,SAAS,EAAER,MAAM,CAACS,eAAgB;IAAC,iBAAeN;EAAW,GACjED,KAAK,CAACQ,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,WAAW,iBACvCb,KAAA,CAAAQ,aAAA;IACEM,GAAG,EAAED,WAAW,CAACE,EAAG;IACpBN,SAAS,EAAER,MAAM,CAACe;EAAmB,GAEpCH,WAAW,CAACI,OAAO,CAACL,GAAG,CAAEM,MAAM,iBAC9BlB,KAAA,CAAAQ,aAAA;IACEM,GAAG,EAAEI,MAAM,CAACH,EAAG;IACfN,SAAS,EAAER,MAAM,CAACkB,mBAAoB;IACtCC,KAAK,EAAE;MACLC,KAAK,EAAEH,MAAM,CAACI,OAAO,CAAC;IACxB;EAAE,GAEDJ,MAAM,CAACK,aAAa,GACjB,IAAI,GACJxB,UAAU,CACVmB,MAAM,CAACM,MAAM,CAACC,SAAS,CAACP,MAAM,EAC9BA,MAAM,CAACQ,UAAU,CAAC,CACpB,CAAkC,EACnCR,MAAM,CAACM,MAAM,CAACG,YAAY,CAAC,CAAC,iBAC3B3B,KAAA,CAAAQ,aAAA;IACEC,SAAS,EAAER,MAAM,CAAC2B,sBAAuB;IACzCC,aAAa,EAAEA,CAAA,KAAMX,MAAM,CAACM,MAAM,CAACM,SAAS,CAAC,CAAE;IAC/CC,WAAW,EAAEb,MAAM,CAACc,gBAAgB,CAAC,CAAE;IACvCC,YAAY,EAAEf,MAAM,CAACc,gBAAgB,CAAC;EAAE,CACzC,CAED,CACL,CACC,CACL,CACI,CAAC;AAEZ","ignoreList":[]}
1
+ {"version":3,"file":"TableHeader.js","names":["React","styles","TableHeaderContent","TableHeaderWithPopover","SELECTION_COLUMN_ID","getColumnPinningStyles","TableHeader","table","isResizing","getState","columnSizingInfo","isResizingColumn","createElement","className","osdkTableHeader","getHeaderGroups","map","headerGroup","key","id","osdkTableHeaderRow","headers","header","columnStyles","column","isColumnPinned","getIsPinned","isSelectColumn","osdkTableHeaderCell","style","isPlaceholder","setColumnPinning","getCanResize","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart"],"sources":["TableHeader.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 { RowData, Table } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport styles from \"./TableHeader.module.css\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport { TableHeaderWithPopover } from \"./TableHeaderWithPopover.js\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\n\ninterface TableHeaderProps<TData extends RowData> {\n table: Table<TData>;\n}\n\nexport function TableHeader<TData extends RowData>({\n table,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n return (\n <thead className={styles.osdkTableHeader} data-resizing={isResizing}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className={styles.osdkTableHeaderRow}\n >\n {headerGroup.headers.map((header) => {\n const { columnStyles } = getColumnPinningStyles(header.column);\n const isColumnPinned = header.column.getIsPinned();\n const isSelectColumn = header.id === SELECTION_COLUMN_ID;\n return (\n <th\n key={header.id}\n data-pinned={header.column.getIsPinned()}\n className={styles.osdkTableHeaderCell}\n style={columnStyles}\n >\n {header.isPlaceholder\n ? null\n : isSelectColumn\n ? <TableHeaderContent header={header} />\n : (\n <TableHeaderWithPopover\n header={header}\n isColumnPinned={isColumnPinned}\n setColumnPinning={table.setColumnPinning}\n />\n )}\n {header.column.getCanResize() && (\n <div\n className={styles.osdkTableHeaderResizer}\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,0BAA0B;AAC7C,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,SAASC,sBAAsB,QAAQ,6BAA6B;AACpE,SAASC,mBAAmB,QAAQ,sBAAsB;AAC1D,SAASC,sBAAsB,QAAQ,mCAAmC;AAM1E,OAAO,SAASC,WAAWA,CAAwB;EACjDC;AACuB,CAAC,EAAsB;EAC9C;;EAEA,MAAMC,UAAU,GAAG,CAAC,CAACD,KAAK,CAACE,QAAQ,CAAC,CAAC,CAACC,gBAAgB,EAAEC,gBAAgB;EAExE,oBACEX,KAAA,CAAAY,aAAA;IAAOC,SAAS,EAAEZ,MAAM,CAACa,eAAgB;IAAC,iBAAeN;EAAW,GACjED,KAAK,CAACQ,eAAe,CAAC,CAAC,CAACC,GAAG,CAAEC,WAAW,iBACvCjB,KAAA,CAAAY,aAAA;IACEM,GAAG,EAAED,WAAW,CAACE,EAAG;IACpBN,SAAS,EAAEZ,MAAM,CAACmB;EAAmB,GAEpCH,WAAW,CAACI,OAAO,CAACL,GAAG,CAAEM,MAAM,IAAK;IACnC,MAAM;MAAEC;IAAa,CAAC,GAAGlB,sBAAsB,CAACiB,MAAM,CAACE,MAAM,CAAC;IAC9D,MAAMC,cAAc,GAAGH,MAAM,CAACE,MAAM,CAACE,WAAW,CAAC,CAAC;IAClD,MAAMC,cAAc,GAAGL,MAAM,CAACH,EAAE,KAAKf,mBAAmB;IACxD,oBACEJ,KAAA,CAAAY,aAAA;MACEM,GAAG,EAAEI,MAAM,CAACH,EAAG;MACf,eAAaG,MAAM,CAACE,MAAM,CAACE,WAAW,CAAC,CAAE;MACzCb,SAAS,EAAEZ,MAAM,CAAC2B,mBAAoB;MACtCC,KAAK,EAAEN;IAAa,GAEnBD,MAAM,CAACQ,aAAa,GACjB,IAAI,GACJH,cAAc,gBACd3B,KAAA,CAAAY,aAAA,CAACV,kBAAkB;MAACoB,MAAM,EAAEA;IAAO,CAAE,CAAC,gBAEtCtB,KAAA,CAAAY,aAAA,CAACT,sBAAsB;MACrBmB,MAAM,EAAEA,MAAO;MACfG,cAAc,EAAEA,cAAe;MAC/BM,gBAAgB,EAAExB,KAAK,CAACwB;IAAiB,CAC1C,CACF,EACFT,MAAM,CAACE,MAAM,CAACQ,YAAY,CAAC,CAAC,iBAC3BhC,KAAA,CAAAY,aAAA;MACEC,SAAS,EAAEZ,MAAM,CAACgC,sBAAuB;MACzCC,aAAa,EAAEA,CAAA,KAAMZ,MAAM,CAACE,MAAM,CAACW,SAAS,CAAC,CAAE;MAC/CC,WAAW,EAAEd,MAAM,CAACe,gBAAgB,CAAC,CAAE;MACvCC,YAAY,EAAEhB,MAAM,CAACe,gBAAgB,CAAC;IAAE,CACzC,CAED,CAAC;EAET,CAAC,CACC,CACL,CACI,CAAC;AAEZ","ignoreList":[]}
@@ -27,6 +27,7 @@
27
27
  user-select: none;
28
28
  }
29
29
 
30
+
30
31
  .osdkTableHeaderRow {
31
32
  display: flex;
32
33
  }
@@ -53,6 +54,22 @@
53
54
  }
54
55
  }
55
56
 
57
+ .osdkTableHeaderCell[data-pinned="left"],
58
+ .osdkTableHeaderCell[data-pinned="right"] {
59
+ position: sticky;
60
+ z-index: var(--bp-surface-zIndex-2);
61
+ }
62
+
63
+ /* Last left-pinned column - no left-pinned siblings after it */
64
+ .osdkTableHeaderCell[data-pinned="left"]:not(:has(~ [data-pinned="left"])) {
65
+ border-right: calc(var(--osdk-table-border-width)* 2) solid var(--osdk-table-border-color);
66
+ }
67
+
68
+ /* First right-pinned column - no right-pinned siblings before it */
69
+ .osdkTableHeaderCell[data-pinned="right"]:not(:has(~ [data-pinned="right"]):nth-child(n+2)) {
70
+ border-left: calc(var(--osdk-table-border-width)* 2) solid var(--osdk-table-border-color);
71
+ }
72
+
56
73
  .osdkTableHeaderCell:has([role="checkbox"]) {
57
74
  justify-content: center;
58
75
  }
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { flexRender } from "@tanstack/react-table";
18
+ import React from "react";
19
+ import styles from "./TableHeaderContent.module.css";
20
+ export function TableHeaderContent({
21
+ header
22
+ }) {
23
+ return /*#__PURE__*/React.createElement("div", {
24
+ className: styles.osdkHeaderContent
25
+ }, flexRender(header.column.columnDef.header, header.getContext()));
26
+ }
27
+ //# sourceMappingURL=TableHeaderContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableHeaderContent.js","names":["flexRender","React","styles","TableHeaderContent","header","createElement","className","osdkHeaderContent","column","columnDef","getContext"],"sources":["TableHeaderContent.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 { flexRender, type Header, type RowData } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport styles from \"./TableHeaderContent.module.css\";\n\ninterface TableHeaderContentProps<TData extends RowData> {\n header: Header<TData, unknown>;\n}\n\nexport function TableHeaderContent<TData extends RowData>(\n { header }: TableHeaderContentProps<TData>,\n): React.ReactElement {\n return (\n <div className={styles.osdkHeaderContent}>\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,UAAU,QAAmC,uBAAuB;AAC7E,OAAOC,KAAK,MAAM,OAAO;AACzB,OAAOC,MAAM,MAAM,iCAAiC;AAMpD,OAAO,SAASC,kBAAkBA,CAChC;EAAEC;AAAuC,CAAC,EACtB;EACpB,oBACEH,KAAA,CAAAI,aAAA;IAAKC,SAAS,EAAEJ,MAAM,CAACK;EAAkB,GACtCP,UAAU,CACTI,MAAM,CAACI,MAAM,CAACC,SAAS,CAACL,MAAM,EAC9BA,MAAM,CAACM,UAAU,CAAC,CACpB,CACG,CAAC;AAEV","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ .osdkHeaderContent {
18
+ display: -webkit-box;
19
+ -webkit-box-orient: vertical;
20
+ -webkit-line-clamp: 2;
21
+ line-clamp: 2;
22
+ text-align: left;
23
+ overflow: hidden;
24
+ text-overflow: ellipsis;
25
+ }
26
+
27
+ .osdkHeaderContent:has([role="checkbox"]) {
28
+ display: flex;
29
+ justify-content: center;
30
+ }