@osdk/react-components 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -0
- package/CHANGELOG.md +11 -0
- package/build/browser/action-form/ActionForm.js +19 -11
- package/build/browser/action-form/ActionForm.js.map +1 -1
- package/build/browser/action-form/ActionFormApi.js.map +1 -1
- package/build/browser/action-form/BaseForm.js +19 -13
- package/build/browser/action-form/BaseForm.js.map +1 -1
- package/build/browser/action-form/BaseForm.module.css +7 -7
- package/build/browser/action-form/FormField.js +5 -2
- package/build/browser/action-form/FormField.js.map +1 -1
- package/build/browser/action-form/FormField.module.css +6 -1
- package/build/browser/action-form/FormField.module.css.js +1 -0
- package/build/browser/action-form/FormFieldApi.js +7 -1
- package/build/browser/action-form/FormFieldApi.js.map +1 -1
- package/build/browser/action-form/FormHeader.module.css +2 -2
- package/build/browser/action-form/fields/DateCalendar.js +41 -3
- package/build/browser/action-form/fields/DateCalendar.js.map +1 -1
- package/build/browser/action-form/fields/DateCalendar.module.css +59 -10
- package/build/browser/action-form/fields/DateCalendar.module.css.js +5 -1
- package/build/browser/action-form/fields/DateRangeCalendar.js +8 -5
- package/build/browser/action-form/fields/DateRangeCalendar.js.map +1 -1
- package/build/browser/action-form/fields/DateRangeInputField.js +76 -61
- package/build/browser/action-form/fields/DateRangeInputField.js.map +1 -1
- package/build/browser/action-form/fields/DateRangeInputField.module.css +0 -15
- package/build/browser/action-form/fields/DateRangeInputField.module.css.js +1 -2
- package/build/browser/action-form/fields/DatetimePickerField.js +74 -40
- package/build/browser/action-form/fields/DatetimePickerField.js.map +1 -1
- package/build/browser/action-form/fields/DatetimePickerField.module.css +2 -9
- package/build/browser/action-form/fields/FieldBridge.js +1 -1
- package/build/browser/action-form/fields/FieldBridge.js.map +1 -1
- package/build/browser/action-form/fields/FilePickerField.js +47 -39
- package/build/browser/action-form/fields/FilePickerField.js.map +1 -1
- package/build/browser/action-form/fields/FilePickerField.module.css +43 -31
- package/build/browser/action-form/fields/FilePickerField.module.css.js +2 -2
- package/build/browser/action-form/fields/FormFieldRenderer.js +9 -0
- package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/browser/action-form/fields/RadioButtonsField.module.css +3 -3
- package/build/browser/action-form/fields/SwitchField.js +34 -0
- package/build/browser/action-form/fields/SwitchField.js.map +1 -0
- package/build/browser/action-form/fields/TimePicker.js +165 -26
- package/build/browser/action-form/fields/TimePicker.js.map +1 -1
- package/build/browser/action-form/fields/TimePicker.module.css +27 -2
- package/build/browser/action-form/fields/TimePicker.module.css.js +3 -1
- package/build/browser/action-form/fields/calendarShared.js +5 -0
- package/build/browser/action-form/fields/calendarShared.js.map +1 -1
- package/build/browser/action-form/fields/useDateEditState.js +3 -4
- package/build/browser/action-form/fields/useDateEditState.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.js +2 -1
- package/build/browser/base-components/action-button/ActionButton.js.map +1 -1
- package/build/browser/base-components/action-button/ActionButton.module.css +19 -0
- package/build/browser/base-components/action-button/ActionButton.module.css.js +2 -1
- package/build/browser/base-components/combobox/Combobox.module.css +31 -3
- package/build/browser/base-components/select/Select.module.css +18 -0
- package/build/browser/base-components/switch/Switch.module.css +18 -6
- package/build/browser/filter-list/base/inputs/ListogramInput.js +34 -6
- package/build/browser/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css +11 -5
- package/build/browser/filter-list/base/inputs/ListogramInput.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js +20 -12
- package/build/browser/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NoValueLabel.js +36 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.js.map +1 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.module.css +20 -0
- package/build/browser/filter-list/base/inputs/NoValueLabel.module.css.js +6 -0
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js +4 -3
- package/build/browser/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
- package/build/browser/filter-list/base/inputs/NullValueWrapper.module.css.js +1 -1
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js +13 -8
- package/build/browser/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/browser/filter-list/base/inputs/TextTagsInput.js +6 -2
- package/build/browser/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/browser/filter-list/hooks/useFilterListState.js +7 -6
- package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/browser/filter-list/hooks/useStableMapEntries.js +35 -0
- package/build/browser/filter-list/hooks/useStableMapEntries.js.map +1 -0
- package/build/browser/filter-list/utils/filterValues.js +13 -0
- package/build/browser/filter-list/utils/filterValues.js.map +1 -1
- package/build/browser/object-table/DefaultCellRenderer.js +12 -2
- package/build/browser/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/browser/object-table/EditableCell.js +14 -4
- package/build/browser/object-table/EditableCell.js.map +1 -1
- package/build/browser/object-table/EditableCell.module.css +4 -0
- package/build/browser/object-table/EditableCell.module.css.js +1 -0
- package/build/browser/object-table/ObjectTable.js +3 -1
- package/build/browser/object-table/ObjectTable.js.map +1 -1
- package/build/browser/object-table/ObjectTableApi.js.map +1 -1
- package/build/browser/object-table/Table.js +8 -4
- package/build/browser/object-table/Table.js.map +1 -1
- package/build/browser/object-table/TableBody.js +4 -2
- package/build/browser/object-table/TableBody.js.map +1 -1
- package/build/browser/object-table/TableRow.js +12 -4
- package/build/browser/object-table/TableRow.js.map +1 -1
- package/build/browser/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/browser/object-table/utils/editableUtils.js +39 -0
- package/build/browser/object-table/utils/editableUtils.js.map +1 -0
- package/build/browser/object-table/utils/shouldShowEditableCell.js +1 -1
- package/build/browser/object-table/utils/shouldShowEditableCell.js.map +1 -1
- package/build/browser/object-table/utils/types.js.map +1 -1
- package/build/browser/styles.css +331 -130
- package/build/browser/tokens/component-tokens/button.css +15 -0
- package/build/browser/tokens/component-tokens/combobox.css +9 -0
- package/build/browser/tokens/component-tokens/datetime-picker.css +2 -2
- package/build/browser/tokens/component-tokens/file-picker.css +0 -10
- package/build/browser/tokens/component-tokens/filter-list.css +9 -6
- package/build/browser/tokens/component-tokens/form-section.css +1 -1
- package/build/browser/tokens/component-tokens/form.css +9 -5
- package/build/browser/tokens/component-tokens/table.css +3 -5
- package/build/browser/tokens.css +1 -0
- package/build/browser/util/UserAgent.js +1 -1
- package/build/cjs/{DateCalendar-2W4QHEEI.css → DateCalendar-G7RC2FCG.css} +105 -8
- package/build/cjs/DateCalendar-G7RC2FCG.css.map +1 -0
- package/build/cjs/DateCalendar-RX7HP2XP.cjs +26 -0
- package/build/cjs/{DateCalendar-QGSYBWJB.cjs.map → DateCalendar-RX7HP2XP.cjs.map} +1 -1
- package/build/cjs/{DateRangeCalendar-M63S2LLG.css → DateRangeCalendar-JBVYJDBJ.css} +105 -8
- package/build/cjs/DateRangeCalendar-JBVYJDBJ.css.map +1 -0
- package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs +54 -0
- package/build/cjs/DateRangeCalendar-OHT4IUWQ.cjs.map +1 -0
- package/build/cjs/{chunk-T7I6O43T.cjs → chunk-6SPXSFPI.cjs} +237 -85
- package/build/cjs/chunk-6SPXSFPI.cjs.map +1 -0
- package/build/cjs/{chunk-SZXVBDSA.cjs → chunk-6UDBHYSO.cjs} +3 -3
- package/build/cjs/{chunk-SZXVBDSA.cjs.map → chunk-6UDBHYSO.cjs.map} +1 -1
- package/build/cjs/{chunk-YBDS5WQP.cjs → chunk-7H6WXQ35.cjs} +4 -4
- package/build/cjs/{chunk-YBDS5WQP.cjs.map → chunk-7H6WXQ35.cjs.map} +1 -1
- package/build/cjs/{chunk-VVJFMOZI.cjs → chunk-I3OSD6CF.cjs} +19 -45
- package/build/cjs/chunk-I3OSD6CF.cjs.map +1 -0
- package/build/cjs/chunk-MD4KDE44.cjs +41 -0
- package/build/cjs/chunk-MD4KDE44.cjs.map +1 -0
- package/build/cjs/{chunk-YPXTSEE7.cjs → chunk-MLFMSZJQ.cjs} +85 -38
- package/build/cjs/chunk-MLFMSZJQ.cjs.map +1 -0
- package/build/cjs/chunk-MQYOHGPY.cjs +52 -0
- package/build/cjs/chunk-MQYOHGPY.cjs.map +1 -0
- package/build/cjs/{chunk-BJDCC446.cjs → chunk-PTTCWNZZ.cjs} +417 -364
- package/build/cjs/chunk-PTTCWNZZ.cjs.map +1 -0
- package/build/cjs/{chunk-B2GRQRWU.cjs → chunk-TOJSJN3L.cjs} +44 -8
- package/build/cjs/chunk-TOJSJN3L.cjs.map +1 -0
- package/build/cjs/{chunk-JLESWL47.cjs → chunk-V7XWTJV7.cjs} +4 -2
- package/build/cjs/chunk-V7XWTJV7.cjs.map +1 -0
- package/build/cjs/{chunk-L5LPFCXT.cjs → chunk-W2IASYE4.cjs} +163 -125
- package/build/cjs/chunk-W2IASYE4.cjs.map +1 -0
- package/build/cjs/chunk-X337DNCW.cjs +45 -0
- package/build/cjs/chunk-X337DNCW.cjs.map +1 -0
- package/build/cjs/{chunk-SB2VTP67.cjs → chunk-Z7VHLTKD.cjs} +2 -64
- package/build/cjs/chunk-Z7VHLTKD.cjs.map +1 -0
- package/build/cjs/public/experimental/action-form.cjs +11 -9
- package/build/cjs/public/experimental/action-form.css +223 -68
- package/build/cjs/public/experimental/action-form.css.map +1 -1
- package/build/cjs/public/experimental/action-form.d.cts +83 -74
- package/build/cjs/public/experimental/filter-list.cjs +9 -8
- package/build/cjs/public/experimental/filter-list.css +38 -19
- package/build/cjs/public/experimental/filter-list.css.map +1 -1
- package/build/cjs/public/experimental/object-table.cjs +14 -12
- package/build/cjs/public/experimental/object-table.css +152 -59
- package/build/cjs/public/experimental/object-table.css.map +1 -1
- package/build/cjs/public/experimental/object-table.d.cts +39 -20
- package/build/cjs/public/experimental/pdf-viewer.cjs +24 -24
- package/build/cjs/public/experimental.cjs +46 -44
- package/build/cjs/public/experimental.css +242 -139
- package/build/cjs/public/experimental.css.map +1 -1
- package/build/cjs/public/primitives.cjs +8 -7
- package/build/cjs/public/primitives.css +15 -0
- package/build/cjs/public/primitives.css.map +1 -1
- package/build/cjs/public/primitives.d.cts +1 -0
- package/build/esm/action-form/ActionForm.js +19 -11
- package/build/esm/action-form/ActionForm.js.map +1 -1
- package/build/esm/action-form/ActionFormApi.js.map +1 -1
- package/build/esm/action-form/BaseForm.js +19 -13
- package/build/esm/action-form/BaseForm.js.map +1 -1
- package/build/esm/action-form/BaseForm.module.css +7 -7
- package/build/esm/action-form/FormField.js +5 -2
- package/build/esm/action-form/FormField.js.map +1 -1
- package/build/esm/action-form/FormField.module.css +6 -1
- package/build/esm/action-form/FormFieldApi.js +7 -1
- package/build/esm/action-form/FormFieldApi.js.map +1 -1
- package/build/esm/action-form/FormHeader.module.css +2 -2
- package/build/esm/action-form/fields/DateCalendar.js +41 -3
- package/build/esm/action-form/fields/DateCalendar.js.map +1 -1
- package/build/esm/action-form/fields/DateCalendar.module.css +59 -10
- package/build/esm/action-form/fields/DateRangeCalendar.js +8 -5
- package/build/esm/action-form/fields/DateRangeCalendar.js.map +1 -1
- package/build/esm/action-form/fields/DateRangeInputField.js +76 -61
- package/build/esm/action-form/fields/DateRangeInputField.js.map +1 -1
- package/build/esm/action-form/fields/DateRangeInputField.module.css +0 -15
- package/build/esm/action-form/fields/DatetimePickerField.js +74 -40
- package/build/esm/action-form/fields/DatetimePickerField.js.map +1 -1
- package/build/esm/action-form/fields/DatetimePickerField.module.css +2 -9
- package/build/esm/action-form/fields/FieldBridge.js +1 -1
- package/build/esm/action-form/fields/FieldBridge.js.map +1 -1
- package/build/esm/action-form/fields/FilePickerField.js +47 -39
- package/build/esm/action-form/fields/FilePickerField.js.map +1 -1
- package/build/esm/action-form/fields/FilePickerField.module.css +43 -31
- package/build/esm/action-form/fields/FormFieldRenderer.js +9 -0
- package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -1
- package/build/esm/action-form/fields/RadioButtonsField.module.css +3 -3
- package/build/esm/action-form/fields/SwitchField.js +34 -0
- package/build/esm/action-form/fields/SwitchField.js.map +1 -0
- package/build/esm/action-form/fields/TimePicker.js +165 -26
- package/build/esm/action-form/fields/TimePicker.js.map +1 -1
- package/build/esm/action-form/fields/TimePicker.module.css +27 -2
- package/build/esm/action-form/fields/calendarShared.js +5 -0
- package/build/esm/action-form/fields/calendarShared.js.map +1 -1
- package/build/esm/action-form/fields/useDateEditState.js +3 -4
- package/build/esm/action-form/fields/useDateEditState.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.js +2 -1
- package/build/esm/base-components/action-button/ActionButton.js.map +1 -1
- package/build/esm/base-components/action-button/ActionButton.module.css +19 -0
- package/build/esm/base-components/combobox/Combobox.module.css +31 -3
- package/build/esm/base-components/select/Select.module.css +18 -0
- package/build/esm/base-components/switch/Switch.module.css +18 -6
- package/build/esm/filter-list/base/inputs/ListogramInput.js +34 -6
- package/build/esm/filter-list/base/inputs/ListogramInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/ListogramInput.module.css +11 -5
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js +20 -12
- package/build/esm/filter-list/base/inputs/MultiSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NoValueLabel.js +36 -0
- package/build/esm/filter-list/base/inputs/NoValueLabel.js.map +1 -0
- package/build/esm/filter-list/base/inputs/NoValueLabel.module.css +20 -0
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js +4 -3
- package/build/esm/filter-list/base/inputs/NullValueWrapper.js.map +1 -1
- package/build/esm/filter-list/base/inputs/NullValueWrapper.module.css +10 -7
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js +13 -8
- package/build/esm/filter-list/base/inputs/SingleSelectInput.js.map +1 -1
- package/build/esm/filter-list/base/inputs/TextTagsInput.js +6 -2
- package/build/esm/filter-list/base/inputs/TextTagsInput.js.map +1 -1
- package/build/esm/filter-list/hooks/useFilterListState.js +7 -6
- package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
- package/build/esm/filter-list/hooks/useStableMapEntries.js +35 -0
- package/build/esm/filter-list/hooks/useStableMapEntries.js.map +1 -0
- package/build/esm/filter-list/utils/filterValues.js +13 -0
- package/build/esm/filter-list/utils/filterValues.js.map +1 -1
- package/build/esm/object-table/DefaultCellRenderer.js +12 -2
- package/build/esm/object-table/DefaultCellRenderer.js.map +1 -1
- package/build/esm/object-table/EditableCell.js +14 -4
- package/build/esm/object-table/EditableCell.js.map +1 -1
- package/build/esm/object-table/EditableCell.module.css +4 -0
- package/build/esm/object-table/ObjectTable.js +3 -1
- package/build/esm/object-table/ObjectTable.js.map +1 -1
- package/build/esm/object-table/ObjectTableApi.js.map +1 -1
- package/build/esm/object-table/Table.js +8 -4
- package/build/esm/object-table/Table.js.map +1 -1
- package/build/esm/object-table/TableBody.js +4 -2
- package/build/esm/object-table/TableBody.js.map +1 -1
- package/build/esm/object-table/TableRow.js +12 -4
- package/build/esm/object-table/TableRow.js.map +1 -1
- package/build/esm/object-table/hooks/useColumnDefs.js.map +1 -1
- package/build/esm/object-table/utils/editableUtils.js +39 -0
- package/build/esm/object-table/utils/editableUtils.js.map +1 -0
- package/build/esm/object-table/utils/shouldShowEditableCell.js +1 -1
- package/build/esm/object-table/utils/shouldShowEditableCell.js.map +1 -1
- package/build/esm/object-table/utils/types.js.map +1 -1
- package/build/esm/tokens/component-tokens/button.css +15 -0
- package/build/esm/tokens/component-tokens/combobox.css +9 -0
- package/build/esm/tokens/component-tokens/datetime-picker.css +2 -2
- package/build/esm/tokens/component-tokens/file-picker.css +0 -10
- package/build/esm/tokens/component-tokens/filter-list.css +9 -6
- package/build/esm/tokens/component-tokens/form-section.css +1 -1
- package/build/esm/tokens/component-tokens/form.css +9 -5
- package/build/esm/tokens/component-tokens/table.css +3 -5
- package/build/esm/tokens.css +1 -0
- package/build/esm/util/UserAgent.js +1 -1
- package/build/types/action-form/ActionFormApi.d.ts +8 -8
- package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
- package/build/types/action-form/BaseForm.d.ts.map +1 -1
- package/build/types/action-form/FormFieldApi.d.ts +29 -22
- package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
- package/build/types/action-form/fields/DateCalendar.d.ts +6 -1
- package/build/types/action-form/fields/DateCalendar.d.ts.map +1 -1
- package/build/types/action-form/fields/DateRangeCalendar.d.ts.map +1 -1
- package/build/types/action-form/fields/DateRangeInputField.d.ts.map +1 -1
- package/build/types/action-form/fields/DatetimePickerField.d.ts.map +1 -1
- package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -1
- package/build/types/action-form/fields/FilePickerField.d.ts.map +1 -1
- package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -1
- package/build/types/action-form/fields/SwitchField.d.ts +7 -0
- package/build/types/action-form/fields/SwitchField.d.ts.map +1 -0
- package/build/types/action-form/fields/TimePicker.d.ts +4 -5
- package/build/types/action-form/fields/TimePicker.d.ts.map +1 -1
- package/build/types/action-form/fields/useDateEditState.d.ts +2 -2
- package/build/types/base-components/action-button/ActionButton.d.ts +1 -0
- package/build/types/base-components/action-button/ActionButton.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/ListogramInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/MultiSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/NoValueLabel.d.ts +15 -0
- package/build/types/filter-list/base/inputs/NoValueLabel.d.ts.map +1 -0
- package/build/types/filter-list/base/inputs/NullValueWrapper.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/SingleSelectInput.d.ts.map +1 -1
- package/build/types/filter-list/base/inputs/TextTagsInput.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
- package/build/types/filter-list/hooks/useStableMapEntries.d.ts +9 -0
- package/build/types/filter-list/hooks/useStableMapEntries.d.ts.map +1 -0
- package/build/types/filter-list/utils/filterValues.d.ts +7 -0
- package/build/types/filter-list/utils/filterValues.d.ts.map +1 -1
- package/build/types/object-table/DefaultCellRenderer.d.ts.map +1 -1
- package/build/types/object-table/EditableCell.d.ts +1 -1
- package/build/types/object-table/EditableCell.d.ts.map +1 -1
- package/build/types/object-table/ObjectTableApi.d.ts +26 -7
- package/build/types/object-table/ObjectTableApi.d.ts.map +1 -1
- package/build/types/object-table/Table.d.ts +9 -2
- package/build/types/object-table/Table.d.ts.map +1 -1
- package/build/types/object-table/TableBody.d.ts +2 -1
- package/build/types/object-table/TableBody.d.ts.map +1 -1
- package/build/types/object-table/TableRow.d.ts +2 -1
- package/build/types/object-table/TableRow.d.ts.map +1 -1
- package/build/types/object-table/utils/editableUtils.d.ts +16 -0
- package/build/types/object-table/utils/editableUtils.d.ts.map +1 -0
- package/build/types/object-table/utils/shouldShowEditableCell.d.ts +2 -1
- package/build/types/object-table/utils/shouldShowEditableCell.d.ts.map +1 -1
- package/build/types/object-table/utils/types.d.ts +4 -11
- package/build/types/object-table/utils/types.d.ts.map +1 -1
- package/docs/ActionForm.md +176 -0
- package/docs/CSSVariables.md +31 -30
- package/docs/ObjectTable.md +141 -16
- package/package.json +6 -5
- package/build/cjs/DateCalendar-2W4QHEEI.css.map +0 -1
- package/build/cjs/DateCalendar-QGSYBWJB.cjs +0 -24
- package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs +0 -48
- package/build/cjs/DateRangeCalendar-JHO2BF3Z.cjs.map +0 -1
- package/build/cjs/DateRangeCalendar-M63S2LLG.css.map +0 -1
- package/build/cjs/chunk-B2GRQRWU.cjs.map +0 -1
- package/build/cjs/chunk-BJDCC446.cjs.map +0 -1
- package/build/cjs/chunk-JLESWL47.cjs.map +0 -1
- package/build/cjs/chunk-L5LPFCXT.cjs.map +0 -1
- package/build/cjs/chunk-SB2VTP67.cjs.map +0 -1
- package/build/cjs/chunk-T7I6O43T.cjs.map +0 -1
- package/build/cjs/chunk-UCTQICPR.cjs +0 -10
- package/build/cjs/chunk-UCTQICPR.cjs.map +0 -1
- package/build/cjs/chunk-VVJFMOZI.cjs.map +0 -1
- package/build/cjs/chunk-YPXTSEE7.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextTagsInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Combobox","sharedStyles","styles","TAG_SEPARATOR_PATTERN","TagItem","tag","onRemove","handleRemove","createElement","className","type","tagRemove","onClick","TextTagsInputInner","suggestions","isLoading","error","tags","onChange","style","placeholder","allowCustomTags","suggestionLimit","ariaLabel","inputValue","setInputValue","filteredSuggestions","lowerInput","toLowerCase","filter","s","trim","value","includes","slice","addTag","trimmedTag","removeTag","t","handleValueChange","newTags","handleInputValueChange","handleKeyDown","e","key","length","preventDefault","handlePaste","pastedText","clipboardData","getData","test","split","map","textTags","errorMessage","message","Root","multiple","onValueChange","onInputValueChange","tagContainer","SearchInput","input","onKeyDown","onPaste","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","loadingMessage","TextTagsInput"],"sources":["TextTagsInput.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 { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./TextTagsInput.module.css\";\n\nconst TAG_SEPARATOR_PATTERN = /[,\\n]/;\n\ninterface TagItemProps {\n tag: string;\n onRemove: (tag: string) => void;\n}\n\nconst TagItem = memo(function TagItem({ tag, onRemove }: TagItemProps) {\n const handleRemove = useCallback(() => {\n onRemove(tag);\n }, [tag, onRemove]);\n\n return (\n <span className={sharedStyles.tag}>\n {tag}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${tag}`}\n >\n ×\n </Button>\n </span>\n );\n});\n\ninterface TextTagsInputProps {\n suggestions: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n tags: string[];\n onChange: (tags: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n allowCustomTags?: boolean;\n suggestionLimit?: number;\n ariaLabel?: string;\n}\n\nfunction TextTagsInputInner({\n suggestions,\n isLoading,\n error,\n tags,\n onChange,\n className,\n style,\n placeholder = \"Add a tag...\",\n allowCustomTags = true,\n suggestionLimit = 10,\n ariaLabel = \"Add tag\",\n}: TextTagsInputProps): React.ReactElement {\n const [inputValue, setInputValue] = useState(\"\");\n\n const filteredSuggestions = useMemo(() => {\n if (!suggestionLimit) return [];\n const lowerInput = inputValue.toLowerCase();\n return suggestions\n .filter(\n (s) =>\n (!inputValue.trim()\n || s.value.toLowerCase().includes(lowerInput))\n && !tags.includes(s.value),\n )\n .slice(0, suggestionLimit);\n }, [suggestions, inputValue, tags, suggestionLimit]);\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim();\n if (trimmedTag && !tags.includes(trimmedTag)) {\n onChange([...tags, trimmedTag]);\n }\n setInputValue(\"\");\n },\n [tags, onChange],\n );\n\n const removeTag = useCallback(\n (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n },\n [tags, onChange],\n );\n\n const handleValueChange = useCallback(\n (newTags: string[] | null) => {\n onChange(newTags ?? []);\n },\n [onChange],\n );\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && inputValue.trim()) {\n if (filteredSuggestions.length > 0) {\n return;\n }\n e.preventDefault();\n if (allowCustomTags) {\n addTag(inputValue);\n }\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n },\n [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = e.clipboardData.getData(\"text\");\n if (TAG_SEPARATOR_PATTERN.test(pastedText)) {\n e.preventDefault();\n const newTags = pastedText\n .split(TAG_SEPARATOR_PATTERN)\n .map((t) => t.trim())\n .filter((t) => t && !tags.includes(t));\n if (newTags.length > 0) {\n onChange([...tags, ...newTags]);\n }\n }\n },\n [tags, onChange],\n );\n\n return (\n <div\n className={classnames(styles.textTags, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading suggestions: {error.message}\n </div>\n )}\n\n <Combobox.Root<string, true>\n multiple={true}\n value={tags}\n onValueChange={handleValueChange}\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n >\n {tags.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {tags.map((tag) => (\n <TagItem key={tag} tag={tag} onRemove={removeTag} />\n ))}\n </div>\n )}\n\n <Combobox.SearchInput\n className={styles.input}\n placeholder={tags.length > 0 ? \"\" : placeholder}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n aria-label={ariaLabel}\n />\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {filteredSuggestions.length === 0\n ? (\n allowCustomTags && inputValue.trim()\n ? (\n <Combobox.Empty>\n Press Enter to add \"{inputValue}\"\n </Combobox.Empty>\n )\n : (\n <Combobox.Empty>\n {suggestionLimit\n ? \"No suggestions\"\n : \"Type to add a tag\"}\n </Combobox.Empty>\n )\n )\n : filteredSuggestions.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n {value} ({count.toLocaleString()})\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n\n {isLoading && !!suggestionLimit && (\n <div className={sharedStyles.loadingMessage}>\n Loading suggestions...\n </div>\n )}\n </div>\n );\n}\n\nexport const TextTagsInput = memo(\n TextTagsInputInner,\n) as typeof TextTagsInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"TextTagsInput.js","names":["Button","classnames","React","memo","useCallback","useMemo","useState","Combobox","isEmptyValue","NoValueLabel","sharedStyles","styles","TAG_SEPARATOR_PATTERN","TagItem","tag","onRemove","handleRemove","isEmpty","displayLabel","createElement","className","type","tagRemove","onClick","TextTagsInputInner","suggestions","isLoading","error","tags","onChange","style","placeholder","allowCustomTags","suggestionLimit","ariaLabel","inputValue","setInputValue","filteredSuggestions","lowerInput","toLowerCase","filter","s","trim","value","includes","slice","addTag","trimmedTag","removeTag","t","handleValueChange","newTags","handleInputValueChange","handleKeyDown","e","key","length","preventDefault","handlePaste","pastedText","clipboardData","getData","test","split","map","textTags","errorMessage","message","Root","multiple","onValueChange","onInputValueChange","tagContainer","SearchInput","input","onKeyDown","onPaste","Portal","Positioner","Popup","Empty","count","Item","toLocaleString","loadingMessage","TextTagsInput"],"sources":["TextTagsInput.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 { Button } from \"@base-ui/react/button\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\nimport { Combobox } from \"../../../base-components/combobox/Combobox.js\";\nimport type { PropertyAggregationValue } from \"../../types/AggregationTypes.js\";\nimport { isEmptyValue } from \"../../utils/filterValues.js\";\nimport { NoValueLabel } from \"./NoValueLabel.js\";\nimport sharedStyles from \"./shared.module.css\";\nimport styles from \"./TextTagsInput.module.css\";\n\nconst TAG_SEPARATOR_PATTERN = /[,\\n]/;\n\ninterface TagItemProps {\n tag: string;\n onRemove: (tag: string) => void;\n}\n\nconst TagItem = memo(function TagItem({ tag, onRemove }: TagItemProps) {\n const handleRemove = useCallback(() => {\n onRemove(tag);\n }, [tag, onRemove]);\n\n const isEmpty = isEmptyValue(tag);\n const displayLabel = isEmpty ? \"No value\" : tag;\n\n return (\n <span className={sharedStyles.tag}>\n {isEmpty ? <NoValueLabel /> : tag}\n <Button\n type=\"button\"\n className={sharedStyles.tagRemove}\n onClick={handleRemove}\n aria-label={`Remove ${displayLabel}`}\n >\n ×\n </Button>\n </span>\n );\n});\n\ninterface TextTagsInputProps {\n suggestions: PropertyAggregationValue[];\n isLoading: boolean;\n error: Error | null;\n tags: string[];\n onChange: (tags: string[]) => void;\n className?: string;\n style?: React.CSSProperties;\n placeholder?: string;\n allowCustomTags?: boolean;\n suggestionLimit?: number;\n ariaLabel?: string;\n}\n\nfunction TextTagsInputInner({\n suggestions,\n isLoading,\n error,\n tags,\n onChange,\n className,\n style,\n placeholder = \"Add a tag...\",\n allowCustomTags = true,\n suggestionLimit = 10,\n ariaLabel = \"Add tag\",\n}: TextTagsInputProps): React.ReactElement {\n const [inputValue, setInputValue] = useState(\"\");\n\n const filteredSuggestions = useMemo(() => {\n if (!suggestionLimit) return [];\n const lowerInput = inputValue.toLowerCase();\n return suggestions\n .filter(\n (s) =>\n (!inputValue.trim()\n || s.value.toLowerCase().includes(lowerInput))\n && !tags.includes(s.value),\n )\n .slice(0, suggestionLimit);\n }, [suggestions, inputValue, tags, suggestionLimit]);\n\n const addTag = useCallback(\n (tag: string) => {\n const trimmedTag = tag.trim();\n if (trimmedTag && !tags.includes(trimmedTag)) {\n onChange([...tags, trimmedTag]);\n }\n setInputValue(\"\");\n },\n [tags, onChange],\n );\n\n const removeTag = useCallback(\n (tag: string) => {\n onChange(tags.filter((t) => t !== tag));\n },\n [tags, onChange],\n );\n\n const handleValueChange = useCallback(\n (newTags: string[] | null) => {\n onChange(newTags ?? []);\n },\n [onChange],\n );\n\n const handleInputValueChange = useCallback(\n (value: string) => {\n setInputValue(value);\n },\n [],\n );\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\" && inputValue.trim()) {\n if (filteredSuggestions.length > 0) {\n return;\n }\n e.preventDefault();\n if (allowCustomTags) {\n addTag(inputValue);\n }\n } else if (e.key === \"Backspace\" && !inputValue && tags.length > 0) {\n removeTag(tags[tags.length - 1]);\n }\n },\n [inputValue, tags, addTag, removeTag, allowCustomTags, filteredSuggestions],\n );\n\n const handlePaste = useCallback(\n (e: React.ClipboardEvent<HTMLInputElement>) => {\n const pastedText = e.clipboardData.getData(\"text\");\n if (TAG_SEPARATOR_PATTERN.test(pastedText)) {\n e.preventDefault();\n const newTags = pastedText\n .split(TAG_SEPARATOR_PATTERN)\n .map((t) => t.trim())\n .filter((t) => t && !tags.includes(t));\n if (newTags.length > 0) {\n onChange([...tags, ...newTags]);\n }\n }\n },\n [tags, onChange],\n );\n\n return (\n <div\n className={classnames(styles.textTags, className)}\n style={style}\n data-loading={isLoading}\n >\n {error && (\n <div className={sharedStyles.errorMessage}>\n Error loading suggestions: {error.message}\n </div>\n )}\n\n <Combobox.Root<string, true>\n multiple={true}\n value={tags}\n onValueChange={handleValueChange}\n inputValue={inputValue}\n onInputValueChange={handleInputValueChange}\n >\n {tags.length > 0 && (\n <div className={sharedStyles.tagContainer}>\n {tags.map((tag) => (\n <TagItem key={tag} tag={tag} onRemove={removeTag} />\n ))}\n </div>\n )}\n\n <Combobox.SearchInput\n className={styles.input}\n placeholder={tags.length > 0 ? \"\" : placeholder}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n aria-label={ariaLabel}\n />\n\n <Combobox.Portal>\n <Combobox.Positioner>\n <Combobox.Popup>\n {filteredSuggestions.length === 0\n ? (\n allowCustomTags && inputValue.trim()\n ? (\n <Combobox.Empty>\n Press Enter to add \"{inputValue}\"\n </Combobox.Empty>\n )\n : (\n <Combobox.Empty>\n {suggestionLimit\n ? \"No suggestions\"\n : \"Type to add a tag\"}\n </Combobox.Empty>\n )\n )\n : filteredSuggestions.map(({ value, count }) => (\n <Combobox.Item key={value} value={value}>\n {value} ({count.toLocaleString()})\n </Combobox.Item>\n ))}\n </Combobox.Popup>\n </Combobox.Positioner>\n </Combobox.Portal>\n </Combobox.Root>\n\n {isLoading && !!suggestionLimit && (\n <div className={sharedStyles.loadingMessage}>\n Loading suggestions...\n </div>\n )}\n </div>\n );\n}\n\nexport const TextTagsInput = memo(\n TextTagsInputInner,\n) as typeof TextTagsInputInner;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -20,6 +20,7 @@ import { assertUnreachable } from "../../shared/assertUnreachable.js";
|
|
|
20
20
|
import { buildWhereClause } from "../utils/filterStateToWhereClause.js";
|
|
21
21
|
import { filterHasActiveState } from "../utils/filterValues.js";
|
|
22
22
|
import { getFilterKey } from "../utils/getFilterKey.js";
|
|
23
|
+
import { useStableMapEntries } from "./useStableMapEntries.js";
|
|
23
24
|
/**
|
|
24
25
|
* Build initial states from filter definitions.
|
|
25
26
|
* Uses string keys derived from getFilterKey() for stable lookups.
|
|
@@ -133,17 +134,17 @@ export function useFilterListState(props) {
|
|
|
133
134
|
useEffect(() => {
|
|
134
135
|
onFilterClauseChangedRef.current?.(whereClause);
|
|
135
136
|
}, [whereClause]);
|
|
136
|
-
|
|
137
|
+
|
|
138
|
+
// Preserve per-key clause references when content hasn't changed so
|
|
139
|
+
// FilterInput.memo can hold and aggregations don't refetch unnecessarily.
|
|
140
|
+
const perFilterWhereClauses = useStableMapEntries(useMemo(() => {
|
|
137
141
|
const map = new Map();
|
|
138
|
-
|
|
139
|
-
return map;
|
|
140
|
-
}
|
|
141
|
-
for (const definition of filterDefinitions) {
|
|
142
|
+
for (const definition of filterDefinitions ?? []) {
|
|
142
143
|
const key = getFilterKey(definition);
|
|
143
144
|
map.set(key, buildWhereClause(filterDefinitions, filterStates, propertyTypes, key));
|
|
144
145
|
}
|
|
145
146
|
return map;
|
|
146
|
-
}, [filterDefinitions, filterStates, propertyTypes]);
|
|
147
|
+
}, [filterDefinitions, filterStates, propertyTypes]));
|
|
147
148
|
const activeFilterCount = useMemo(() => {
|
|
148
149
|
let count = 0;
|
|
149
150
|
for (const state of filterStates.values()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilterListState.js","names":["useOsdkMetadata","useCallback","useEffect","useMemo","useRef","useState","assertUnreachable","buildWhereClause","filterHasActiveState","getFilterKey","buildInitialStates","definitions","states","Map","definition","key","type","state","filterState","set","defaultFilterState","innerState","defaultLinkedFilterState","linkedFilterState","useFilterListState","props","objectType","filterDefinitions","onFilterStateChanged","onFilterClauseChanged","initialFilterStates","metadata","onFilterClauseChangedRef","current","propertyTypes","map","properties","prop","Object","entries","multiplicity","filterStates","setFilterStates","setFilterState","filterKey","prev","next","find","d","clearFilterState","delete","whereClause","perFilterWhereClauses","activeFilterCount","count","values","reset"],"sources":["useFilterListState.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 { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport type { FilterListProps } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { LinkedPropertyFilterState } from \"../types/LinkedFilterTypes.js\";\nimport {\n buildWhereClause,\n type PropertyTypeInfo,\n} from \"../utils/filterStateToWhereClause.js\";\nimport { filterHasActiveState } from \"../utils/filterValues.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\n\nexport interface UseFilterListStateResult<Q extends ObjectTypeDefinition> {\n filterStates: Map<string, FilterState>;\n setFilterState: (\n filterKey: string,\n state: FilterState,\n ) => void;\n clearFilterState: (filterKey: string) => void;\n whereClause: WhereClause<Q>;\n perFilterWhereClauses: Map<string, WhereClause<Q>>;\n activeFilterCount: number;\n reset: () => void;\n}\n\n/**\n * Build initial states from filter definitions.\n * Uses string keys derived from getFilterKey() for stable lookups.\n */\nfunction buildInitialStates<Q extends ObjectTypeDefinition>(\n definitions: FilterListProps<Q>[\"filterDefinitions\"],\n): Map<string, FilterState> {\n const states = new Map<string, FilterState>();\n\n if (!definitions) {\n return states;\n }\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n switch (definition.type) {\n case \"PROPERTY\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"HAS_LINK\":\n case \"KEYWORD_SEARCH\":\n case \"CUSTOM\": {\n const state = definition.defaultFilterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"STATIC_VALUES\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"LINKED_PROPERTY\": {\n const innerState = definition.defaultLinkedFilterState;\n if (innerState) {\n const state: LinkedPropertyFilterState = {\n type: \"linkedProperty\",\n linkedFilterState: innerState,\n };\n states.set(key, state);\n }\n break;\n }\n default:\n assertUnreachable(definition);\n }\n }\n\n return states;\n}\n\nexport function useFilterListState<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): UseFilterListStateResult<Q> {\n const {\n objectType,\n filterDefinitions,\n onFilterStateChanged,\n onFilterClauseChanged,\n initialFilterStates,\n } = props;\n const { metadata } = useOsdkMetadata(objectType);\n const onFilterClauseChangedRef = useRef(onFilterClauseChanged);\n onFilterClauseChangedRef.current = onFilterClauseChanged;\n\n const propertyTypes = useMemo(() => {\n const map = new Map<string, PropertyTypeInfo>();\n if (metadata?.properties) {\n for (const [key, prop] of Object.entries(metadata.properties)) {\n if (typeof prop.type === \"string\") {\n map.set(key, {\n type: prop.type,\n multiplicity: prop.multiplicity === true,\n });\n }\n }\n }\n return map;\n }, [metadata?.properties]);\n\n const [filterStates, setFilterStates] = useState<\n Map<string, FilterState>\n >(() => {\n const states = buildInitialStates(filterDefinitions);\n if (initialFilterStates) {\n for (const [key, state] of initialFilterStates) {\n states.set(key, state);\n }\n }\n return states;\n });\n\n const setFilterState = useCallback(\n (filterKey: string, state: FilterState) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.set(filterKey, state);\n return next;\n });\n\n const definition = filterDefinitions?.find(\n (d) => getFilterKey(d) === filterKey,\n );\n if (definition) {\n onFilterStateChanged?.(definition, state);\n }\n },\n [\n filterDefinitions,\n onFilterStateChanged,\n ],\n );\n\n const clearFilterState = useCallback(\n (filterKey: string) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.delete(filterKey);\n return next;\n });\n },\n [],\n );\n\n const whereClause = useMemo(\n () =>\n buildWhereClause(\n filterDefinitions,\n filterStates,\n propertyTypes,\n ),\n [filterDefinitions, filterStates, propertyTypes],\n );\n\n useEffect(() => {\n onFilterClauseChangedRef.current?.(whereClause);\n }, [whereClause]);\n\n const perFilterWhereClauses = useMemo(() => {\n const map = new Map<string, WhereClause<Q>>();\n if (!filterDefinitions) {\n return map;\n }\n for (const definition of filterDefinitions) {\n const key = getFilterKey(definition);\n map.set(\n key,\n buildWhereClause(\n filterDefinitions,\n filterStates,\n propertyTypes,\n key,\n ),\n );\n }\n return map;\n }, [filterDefinitions, filterStates, propertyTypes]);\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const state of filterStates.values()) {\n if (filterHasActiveState(state)) {\n count++;\n }\n }\n return count;\n }, [filterStates]);\n\n const reset = useCallback(() => {\n setFilterStates(buildInitialStates(filterDefinitions));\n }, [filterDefinitions]);\n\n return useMemo(() => ({\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n }), [\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n ]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"useFilterListState.js","names":["useOsdkMetadata","useCallback","useEffect","useMemo","useRef","useState","assertUnreachable","buildWhereClause","filterHasActiveState","getFilterKey","useStableMapEntries","buildInitialStates","definitions","states","Map","definition","key","type","state","filterState","set","defaultFilterState","innerState","defaultLinkedFilterState","linkedFilterState","useFilterListState","props","objectType","filterDefinitions","onFilterStateChanged","onFilterClauseChanged","initialFilterStates","metadata","onFilterClauseChangedRef","current","propertyTypes","map","properties","prop","Object","entries","multiplicity","filterStates","setFilterStates","setFilterState","filterKey","prev","next","find","d","clearFilterState","delete","whereClause","perFilterWhereClauses","activeFilterCount","count","values","reset"],"sources":["useFilterListState.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 { ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport { useOsdkMetadata } from \"@osdk/react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport type { FilterListProps } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport type { LinkedPropertyFilterState } from \"../types/LinkedFilterTypes.js\";\nimport {\n buildWhereClause,\n type PropertyTypeInfo,\n} from \"../utils/filterStateToWhereClause.js\";\nimport { filterHasActiveState } from \"../utils/filterValues.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\nimport { useStableMapEntries } from \"./useStableMapEntries.js\";\n\nexport interface UseFilterListStateResult<Q extends ObjectTypeDefinition> {\n filterStates: Map<string, FilterState>;\n setFilterState: (\n filterKey: string,\n state: FilterState,\n ) => void;\n clearFilterState: (filterKey: string) => void;\n whereClause: WhereClause<Q>;\n perFilterWhereClauses: Map<string, WhereClause<Q>>;\n activeFilterCount: number;\n reset: () => void;\n}\n\n/**\n * Build initial states from filter definitions.\n * Uses string keys derived from getFilterKey() for stable lookups.\n */\nfunction buildInitialStates<Q extends ObjectTypeDefinition>(\n definitions: FilterListProps<Q>[\"filterDefinitions\"],\n): Map<string, FilterState> {\n const states = new Map<string, FilterState>();\n\n if (!definitions) {\n return states;\n }\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n switch (definition.type) {\n case \"PROPERTY\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"HAS_LINK\":\n case \"KEYWORD_SEARCH\":\n case \"CUSTOM\": {\n const state = definition.defaultFilterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"STATIC_VALUES\": {\n const state = definition.filterState;\n if (state) {\n states.set(key, state);\n }\n break;\n }\n case \"LINKED_PROPERTY\": {\n const innerState = definition.defaultLinkedFilterState;\n if (innerState) {\n const state: LinkedPropertyFilterState = {\n type: \"linkedProperty\",\n linkedFilterState: innerState,\n };\n states.set(key, state);\n }\n break;\n }\n default:\n assertUnreachable(definition);\n }\n }\n\n return states;\n}\n\nexport function useFilterListState<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): UseFilterListStateResult<Q> {\n const {\n objectType,\n filterDefinitions,\n onFilterStateChanged,\n onFilterClauseChanged,\n initialFilterStates,\n } = props;\n const { metadata } = useOsdkMetadata(objectType);\n const onFilterClauseChangedRef = useRef(onFilterClauseChanged);\n onFilterClauseChangedRef.current = onFilterClauseChanged;\n\n const propertyTypes = useMemo(() => {\n const map = new Map<string, PropertyTypeInfo>();\n if (metadata?.properties) {\n for (const [key, prop] of Object.entries(metadata.properties)) {\n if (typeof prop.type === \"string\") {\n map.set(key, {\n type: prop.type,\n multiplicity: prop.multiplicity === true,\n });\n }\n }\n }\n return map;\n }, [metadata?.properties]);\n\n const [filterStates, setFilterStates] = useState<\n Map<string, FilterState>\n >(() => {\n const states = buildInitialStates(filterDefinitions);\n if (initialFilterStates) {\n for (const [key, state] of initialFilterStates) {\n states.set(key, state);\n }\n }\n return states;\n });\n\n const setFilterState = useCallback(\n (filterKey: string, state: FilterState) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.set(filterKey, state);\n return next;\n });\n\n const definition = filterDefinitions?.find(\n (d) => getFilterKey(d) === filterKey,\n );\n if (definition) {\n onFilterStateChanged?.(definition, state);\n }\n },\n [\n filterDefinitions,\n onFilterStateChanged,\n ],\n );\n\n const clearFilterState = useCallback(\n (filterKey: string) => {\n setFilterStates((prev) => {\n const next = new Map(prev);\n next.delete(filterKey);\n return next;\n });\n },\n [],\n );\n\n const whereClause = useMemo(\n () =>\n buildWhereClause(\n filterDefinitions,\n filterStates,\n propertyTypes,\n ),\n [filterDefinitions, filterStates, propertyTypes],\n );\n\n useEffect(() => {\n onFilterClauseChangedRef.current?.(whereClause);\n }, [whereClause]);\n\n // Preserve per-key clause references when content hasn't changed so\n // FilterInput.memo can hold and aggregations don't refetch unnecessarily.\n const perFilterWhereClauses = useStableMapEntries(\n useMemo(() => {\n const map = new Map<string, WhereClause<Q>>();\n for (const definition of filterDefinitions ?? []) {\n const key = getFilterKey(definition);\n map.set(\n key,\n buildWhereClause(\n filterDefinitions,\n filterStates,\n propertyTypes,\n key,\n ),\n );\n }\n return map;\n }, [filterDefinitions, filterStates, propertyTypes]),\n );\n\n const activeFilterCount = useMemo(() => {\n let count = 0;\n for (const state of filterStates.values()) {\n if (filterHasActiveState(state)) {\n count++;\n }\n }\n return count;\n }, [filterStates]);\n\n const reset = useCallback(() => {\n setFilterStates(buildInitialStates(filterDefinitions));\n }, [filterDefinitions]);\n\n return useMemo(() => ({\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n }), [\n filterStates,\n setFilterState,\n clearFilterState,\n whereClause,\n perFilterWhereClauses,\n activeFilterCount,\n reset,\n ]);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,35 @@
|
|
|
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 deepEqual from "fast-deep-equal";
|
|
18
|
+
import { useRef } from "react";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Returns a Map whose per-key values keep their previous reference when their
|
|
22
|
+
* contents are structurally equal to the prior frame. Lets memoized children
|
|
23
|
+
* keyed off individual entries skip work when only sibling entries changed.
|
|
24
|
+
*/
|
|
25
|
+
export function useStableMapEntries(input) {
|
|
26
|
+
const ref = useRef(new Map());
|
|
27
|
+
const next = new Map();
|
|
28
|
+
for (const [key, value] of input) {
|
|
29
|
+
const prev = ref.current.get(key);
|
|
30
|
+
next.set(key, prev !== undefined && deepEqual(prev, value) ? prev : value);
|
|
31
|
+
}
|
|
32
|
+
ref.current = next;
|
|
33
|
+
return next;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=useStableMapEntries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStableMapEntries.js","names":["deepEqual","useRef","useStableMapEntries","input","ref","Map","next","key","value","prev","current","get","set","undefined"],"sources":["useStableMapEntries.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 deepEqual from \"fast-deep-equal\";\nimport { useRef } from \"react\";\n\n/**\n * Returns a Map whose per-key values keep their previous reference when their\n * contents are structurally equal to the prior frame. Lets memoized children\n * keyed off individual entries skip work when only sibling entries changed.\n */\nexport function useStableMapEntries<K, V>(input: Map<K, V>): Map<K, V> {\n const ref = useRef<Map<K, V>>(new Map());\n const next = new Map<K, V>();\n for (const [key, value] of input) {\n const prev = ref.current.get(key);\n next.set(key, prev !== undefined && deepEqual(prev, value) ? prev : value);\n }\n ref.current = next;\n return next;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,SAAS,MAAM,iBAAiB;AACvC,SAASC,MAAM,QAAQ,OAAO;;AAE9B;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAAOC,KAAgB,EAAa;EACrE,MAAMC,GAAG,GAAGH,MAAM,CAAY,IAAII,GAAG,CAAC,CAAC,CAAC;EACxC,MAAMC,IAAI,GAAG,IAAID,GAAG,CAAO,CAAC;EAC5B,KAAK,MAAM,CAACE,GAAG,EAAEC,KAAK,CAAC,IAAIL,KAAK,EAAE;IAChC,MAAMM,IAAI,GAAGL,GAAG,CAACM,OAAO,CAACC,GAAG,CAACJ,GAAG,CAAC;IACjCD,IAAI,CAACM,GAAG,CAACL,GAAG,EAAEE,IAAI,KAAKI,SAAS,IAAIb,SAAS,CAACS,IAAI,EAAED,KAAK,CAAC,GAAGC,IAAI,GAAGD,KAAK,CAAC;EAC5E;EACAJ,GAAG,CAACM,OAAO,GAAGJ,IAAI;EAClB,OAAOA,IAAI;AACb","ignoreList":[]}
|
|
@@ -66,6 +66,19 @@ export function supportsExcluding(state) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Returns true if the given value should render as a "No value" placeholder
|
|
71
|
+
* in dropdown options, listogram buckets, and tag chips.
|
|
72
|
+
*
|
|
73
|
+
* Treats null, undefined, and empty/whitespace strings as empty.
|
|
74
|
+
*/
|
|
75
|
+
export function isEmptyValue(value) {
|
|
76
|
+
if (value == null) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
return value.trim() === "";
|
|
80
|
+
}
|
|
81
|
+
|
|
69
82
|
/** Case-insensitive substring filter for search functionality. */
|
|
70
83
|
export function filterValuesBySearch(values, searchValue, getValue) {
|
|
71
84
|
const trimmed = searchValue.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filterValues.js","names":["supportsSearch","state","type","supportsExcluding","filterValuesBySearch","values","searchValue","getValue","trimmed","
|
|
1
|
+
{"version":3,"file":"filterValues.js","names":["supportsSearch","state","type","supportsExcluding","isEmptyValue","value","trim","filterValuesBySearch","values","searchValue","getValue","trimmed","lowerSearch","toLowerCase","filter","v","includes","filterHasActiveState","selectedValues","length","undefined","minValue","maxValue","includeNull","enabled","hasLink","linkedFilterState","searchTerm","startDate","endDate"],"sources":["filterValues.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 { FilterState } from \"../FilterListItemApi.js\";\n\n/** Returns true for filter state types that support in-filter search. */\nexport function supportsSearch(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n switch (state.type) {\n case \"SELECT\":\n case \"EXACT_MATCH\":\n return true;\n case \"CONTAINS_TEXT\":\n case \"NUMBER_RANGE\":\n case \"DATE_RANGE\":\n case \"TOGGLE\":\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"TIMELINE\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n\n/** Returns true for filter state types that support isExcluding. */\nexport function supportsExcluding(state: FilterState | undefined): boolean {\n if (!state) {\n return false;\n }\n switch (state.type) {\n case \"SELECT\":\n case \"EXACT_MATCH\":\n case \"CONTAINS_TEXT\":\n case \"TIMELINE\":\n return true;\n case \"NUMBER_RANGE\":\n case \"DATE_RANGE\":\n case \"TOGGLE\":\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return false;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n\n/**\n * Returns true if the given value should render as a \"No value\" placeholder\n * in dropdown options, listogram buckets, and tag chips.\n *\n * Treats null, undefined, and empty/whitespace strings as empty.\n */\nexport function isEmptyValue(value: string | null | undefined): boolean {\n if (value == null) {\n return true;\n }\n return value.trim() === \"\";\n}\n\n/** Case-insensitive substring filter for search functionality. */\nexport function filterValuesBySearch<T>(\n values: T[],\n searchValue: string,\n getValue: (item: T) => string,\n): T[] {\n const trimmed = searchValue.trim();\n if (!trimmed) return values;\n const lowerSearch = trimmed.toLowerCase();\n return values.filter((v) => getValue(v).toLowerCase().includes(lowerSearch));\n}\n\n/** Check if a filter state has an active (non-empty) value. */\nexport function filterHasActiveState(state: FilterState | undefined): boolean {\n if (!state) return false;\n\n switch (state.type) {\n case \"SELECT\":\n return state.selectedValues.length > 0;\n case \"EXACT_MATCH\":\n return state.values.length > 0;\n case \"CONTAINS_TEXT\":\n return state.value !== undefined && state.value !== \"\";\n case \"NUMBER_RANGE\":\n return state.minValue !== undefined || state.maxValue !== undefined\n || state.includeNull === true;\n case \"DATE_RANGE\":\n return state.minValue !== undefined || state.maxValue !== undefined\n || state.includeNull === true;\n case \"TOGGLE\":\n return state.enabled;\n case \"hasLink\":\n return state.hasLink;\n case \"linkedProperty\":\n return filterHasActiveState(state.linkedFilterState);\n case \"keywordSearch\":\n return state.searchTerm !== undefined && state.searchTerm !== \"\";\n case \"TIMELINE\":\n return state.startDate !== undefined || state.endDate !== undefined;\n case \"custom\":\n return true;\n default: {\n const _exhaustive: never = state;\n return false;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
import React from "react";
|
|
18
18
|
import { AsyncValueCell } from "./components/AsyncValueCell.js";
|
|
19
19
|
import { EditableCell } from "./EditableCell.js";
|
|
20
|
+
import styles from "./EditableCell.module.css";
|
|
20
21
|
import { isAsyncCellData } from "./utils/AsyncCellData.js";
|
|
22
|
+
import { isCellEditable } from "./utils/editableUtils.js";
|
|
21
23
|
import { getCellId } from "./utils/getCellId.js";
|
|
22
24
|
import { shouldShowEditableCell } from "./utils/shouldShowEditableCell.js";
|
|
23
25
|
export function renderDefaultCell(cellContext) {
|
|
@@ -31,8 +33,16 @@ export function renderDefaultCell(cellContext) {
|
|
|
31
33
|
if (columnMeta?.isAsyncColumn && asyncCellData) {
|
|
32
34
|
return /*#__PURE__*/React.createElement(AsyncValueCell, asyncCellData);
|
|
33
35
|
}
|
|
36
|
+
const rowData = cellContext.row.original;
|
|
37
|
+
const isEditable = isCellEditable(columnMeta?.editable, rowData);
|
|
34
38
|
if (!meta?.onCellEdit // Type guard
|
|
35
|
-
|| !shouldShowEditableCell(
|
|
39
|
+
|| !shouldShowEditableCell(isEditable, meta?.onCellEdit, meta?.isInEditMode)) {
|
|
40
|
+
// Align non editable cells with the editable cells
|
|
41
|
+
if (meta?.isInEditMode) {
|
|
42
|
+
return /*#__PURE__*/React.createElement("span", {
|
|
43
|
+
className: styles.nonEditableCellInEditMode
|
|
44
|
+
}, cellValue);
|
|
45
|
+
}
|
|
36
46
|
return /*#__PURE__*/React.createElement(React.Fragment, null, cellValue);
|
|
37
47
|
}
|
|
38
48
|
const rowId = cellContext.row.id;
|
|
@@ -56,7 +66,7 @@ export function renderDefaultCell(cellContext) {
|
|
|
56
66
|
onCellEdit: meta.onCellEdit,
|
|
57
67
|
onCellValidationError: meta.onCellValidationError,
|
|
58
68
|
clearCellValidationError: meta.clearCellValidationError,
|
|
59
|
-
originalRowData:
|
|
69
|
+
originalRowData: rowData,
|
|
60
70
|
rowId: rowId,
|
|
61
71
|
columnId: columnId,
|
|
62
72
|
validateEdit: columnMeta?.validateEdit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DefaultCellRenderer.js","names":["React","AsyncValueCell","EditableCell","isAsyncCellData","getCellId","shouldShowEditableCell","renderDefaultCell","cellContext","meta","table","options","columnMeta","column","columnDef","cellValue","getValue","asyncCellData","undefined","isAsyncColumn","createElement","
|
|
1
|
+
{"version":3,"file":"DefaultCellRenderer.js","names":["React","AsyncValueCell","EditableCell","styles","isAsyncCellData","isCellEditable","getCellId","shouldShowEditableCell","renderDefaultCell","cellContext","meta","table","options","columnMeta","column","columnDef","cellValue","getValue","asyncCellData","undefined","isAsyncColumn","createElement","rowData","row","original","isEditable","editable","onCellEdit","isInEditMode","className","nonEditableCellInEditMode","Fragment","rowId","id","columnId","cellId","cellEdits","editedValue","currentValue","newValue","validationError","validationErrors","get","isRowFocused","focusedRowId","initialValue","dataType","editFieldConfig","onCellValidationError","clearCellValidationError","originalRowData","validateEdit"],"sources":["DefaultCellRenderer.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 { CellContext, RowData } from \"@tanstack/react-table\";\nimport React from \"react\";\nimport { AsyncValueCell } from \"./components/AsyncValueCell.js\";\nimport { EditableCell } from \"./EditableCell.js\";\nimport styles from \"./EditableCell.module.css\";\nimport { isAsyncCellData } from \"./utils/AsyncCellData.js\";\nimport { isCellEditable } from \"./utils/editableUtils.js\";\nimport { getCellId } from \"./utils/getCellId.js\";\nimport { shouldShowEditableCell } from \"./utils/shouldShowEditableCell.js\";\n\nexport function renderDefaultCell<TData extends RowData>(\n cellContext: CellContext<TData, unknown>,\n): React.ReactNode {\n const meta = cellContext.table.options.meta;\n const columnMeta = cellContext.column.columnDef.meta;\n\n const cellValue = cellContext.getValue();\n\n const asyncCellData = isAsyncCellData(cellValue)\n ? cellValue\n : undefined;\n\n // Function-backed columns are read-only: the value is server-computed\n // and cannot be edited in the table. Return the async cell directly.\n if (columnMeta?.isAsyncColumn && asyncCellData) {\n return <AsyncValueCell {...asyncCellData} />;\n }\n\n const rowData = cellContext.row.original;\n const isEditable = isCellEditable(columnMeta?.editable, rowData);\n\n if (\n !meta?.onCellEdit // Type guard\n || !shouldShowEditableCell(\n isEditable,\n meta?.onCellEdit,\n meta?.isInEditMode,\n )\n ) {\n // Align non editable cells with the editable cells\n if (meta?.isInEditMode) {\n return (\n <span className={styles.nonEditableCellInEditMode}>\n {cellValue as React.ReactNode}\n </span>\n );\n }\n\n return <>{cellValue}</>;\n }\n\n const rowId = cellContext.row.id;\n const columnId = cellContext.column.id;\n const cellId = getCellId({ rowId, columnId });\n\n const cellEdits = meta.cellEdits;\n const editedValue = cellEdits?.[cellId];\n // If newValue is explicitly set to null, treat it as null. Otherwise, fall back to the original cell value.\n const currentValue = editedValue?.newValue === undefined\n ? cellValue\n : editedValue?.newValue;\n const validationError = meta.validationErrors?.get(cellId);\n const isRowFocused = meta.focusedRowId === rowId;\n\n return (\n <EditableCell<TData>\n initialValue={cellValue}\n currentValue={currentValue}\n cellId={cellId}\n dataType={columnMeta?.dataType}\n editFieldConfig={columnMeta?.editFieldConfig}\n onCellEdit={meta.onCellEdit}\n onCellValidationError={meta.onCellValidationError}\n clearCellValidationError={meta.clearCellValidationError}\n originalRowData={rowData}\n rowId={rowId}\n columnId={columnId}\n validateEdit={columnMeta?.validateEdit}\n validationError={validationError}\n isRowFocused={isRowFocused}\n />\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,SAASC,cAAc,QAAQ,gCAAgC;AAC/D,SAASC,YAAY,QAAQ,mBAAmB;AAChD,OAAOC,MAAM,MAAM,2BAA2B;AAC9C,SAASC,eAAe,QAAQ,0BAA0B;AAC1D,SAASC,cAAc,QAAQ,0BAA0B;AACzD,SAASC,SAAS,QAAQ,sBAAsB;AAChD,SAASC,sBAAsB,QAAQ,mCAAmC;AAE1E,OAAO,SAASC,iBAAiBA,CAC/BC,WAAwC,EACvB;EACjB,MAAMC,IAAI,GAAGD,WAAW,CAACE,KAAK,CAACC,OAAO,CAACF,IAAI;EAC3C,MAAMG,UAAU,GAAGJ,WAAW,CAACK,MAAM,CAACC,SAAS,CAACL,IAAI;EAEpD,MAAMM,SAAS,GAAGP,WAAW,CAACQ,QAAQ,CAAC,CAAC;EAExC,MAAMC,aAAa,GAAGd,eAAe,CAACY,SAAS,CAAC,GAC5CA,SAAS,GACTG,SAAS;;EAEb;EACA;EACA,IAAIN,UAAU,EAAEO,aAAa,IAAIF,aAAa,EAAE;IAC9C,oBAAOlB,KAAA,CAAAqB,aAAA,CAACpB,cAAc,EAAKiB,aAAgB,CAAC;EAC9C;EAEA,MAAMI,OAAO,GAAGb,WAAW,CAACc,GAAG,CAACC,QAAQ;EACxC,MAAMC,UAAU,GAAGpB,cAAc,CAACQ,UAAU,EAAEa,QAAQ,EAAEJ,OAAO,CAAC;EAEhE,IACE,CAACZ,IAAI,EAAEiB,UAAU,CAAC;EAAA,GACf,CAACpB,sBAAsB,CACxBkB,UAAU,EACVf,IAAI,EAAEiB,UAAU,EAChBjB,IAAI,EAAEkB,YACR,CAAC,EACD;IACA;IACA,IAAIlB,IAAI,EAAEkB,YAAY,EAAE;MACtB,oBACE5B,KAAA,CAAAqB,aAAA;QAAMQ,SAAS,EAAE1B,MAAM,CAAC2B;MAA0B,GAC/Cd,SACG,CAAC;IAEX;IAEA,oBAAOhB,KAAA,CAAAqB,aAAA,CAAArB,KAAA,CAAA+B,QAAA,QAAGf,SAAY,CAAC;EACzB;EAEA,MAAMgB,KAAK,GAAGvB,WAAW,CAACc,GAAG,CAACU,EAAE;EAChC,MAAMC,QAAQ,GAAGzB,WAAW,CAACK,MAAM,CAACmB,EAAE;EACtC,MAAME,MAAM,GAAG7B,SAAS,CAAC;IAAE0B,KAAK;IAAEE;EAAS,CAAC,CAAC;EAE7C,MAAME,SAAS,GAAG1B,IAAI,CAAC0B,SAAS;EAChC,MAAMC,WAAW,GAAGD,SAAS,GAAGD,MAAM,CAAC;EACvC;EACA,MAAMG,YAAY,GAAGD,WAAW,EAAEE,QAAQ,KAAKpB,SAAS,GACpDH,SAAS,GACTqB,WAAW,EAAEE,QAAQ;EACzB,MAAMC,eAAe,GAAG9B,IAAI,CAAC+B,gBAAgB,EAAEC,GAAG,CAACP,MAAM,CAAC;EAC1D,MAAMQ,YAAY,GAAGjC,IAAI,CAACkC,YAAY,KAAKZ,KAAK;EAEhD,oBACEhC,KAAA,CAAAqB,aAAA,CAACnB,YAAY;IACX2C,YAAY,EAAE7B,SAAU;IACxBsB,YAAY,EAAEA,YAAa;IAC3BH,MAAM,EAAEA,MAAO;IACfW,QAAQ,EAAEjC,UAAU,EAAEiC,QAAS;IAC/BC,eAAe,EAAElC,UAAU,EAAEkC,eAAgB;IAC7CpB,UAAU,EAAEjB,IAAI,CAACiB,UAAW;IAC5BqB,qBAAqB,EAAEtC,IAAI,CAACsC,qBAAsB;IAClDC,wBAAwB,EAAEvC,IAAI,CAACuC,wBAAyB;IACxDC,eAAe,EAAE5B,OAAQ;IACzBU,KAAK,EAAEA,KAAM;IACbE,QAAQ,EAAEA,QAAS;IACnBiB,YAAY,EAAEtC,UAAU,EAAEsC,YAAa;IACvCX,eAAe,EAAEA,eAAgB;IACjCG,YAAY,EAAEA;EAAa,CAC5B,CAAC;AAEN","ignoreList":[]}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { Error } from "@blueprintjs/icons";
|
|
18
|
-
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
18
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
19
19
|
import { Tooltip } from "../base-components/tooltip/Tooltip.js";
|
|
20
20
|
import { DatePickerCellField } from "./components/DatePickerCellField.js";
|
|
21
21
|
import { DropdownCellField } from "./components/DropdownCellField.js";
|
|
@@ -128,9 +128,14 @@ function EditableCellInner({
|
|
|
128
128
|
isCancelled.current = false;
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
|
+
|
|
132
|
+
// No-op when the input wasn't actually changed by the user
|
|
133
|
+
if (inputValue === valueToString(currentValue)) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
131
136
|
const parsedValue = parseValueByType(inputValue, dataType);
|
|
132
137
|
commitEdit(parsedValue);
|
|
133
|
-
}, [inputValue, dataType, commitEdit]);
|
|
138
|
+
}, [inputValue, currentValue, dataType, commitEdit]);
|
|
134
139
|
const handleInputChange = useCallback(value => {
|
|
135
140
|
// Cancel any in-flight validation
|
|
136
141
|
abortValidation();
|
|
@@ -150,6 +155,11 @@ function EditableCellInner({
|
|
|
150
155
|
commitEdit(newValue);
|
|
151
156
|
}, [commitEdit]);
|
|
152
157
|
const inputType = dataType && NUMBER_TYPES.includes(dataType) ? "number" : "text";
|
|
158
|
+
|
|
159
|
+
// Compute field-component props once per (editFieldConfig, originalRowData).
|
|
160
|
+
// The narrowed return type is preserved in each useMemo
|
|
161
|
+
const dropdownFieldProps = useMemo(() => editFieldConfig?.fieldComponent === "DROPDOWN" ? editFieldConfig.getFieldComponentProps(originalRowData) : undefined, [editFieldConfig, originalRowData]);
|
|
162
|
+
const datePickerFieldProps = useMemo(() => editFieldConfig?.fieldComponent === "DATE_PICKER" ? editFieldConfig.getFieldComponentProps(originalRowData) : undefined, [editFieldConfig, originalRowData]);
|
|
153
163
|
return /*#__PURE__*/React.createElement(Tooltip.Provider, null, /*#__PURE__*/React.createElement(Tooltip.Root, {
|
|
154
164
|
disabled: !hasValidationError
|
|
155
165
|
}, /*#__PURE__*/React.createElement(Tooltip.Trigger, {
|
|
@@ -161,7 +171,7 @@ function EditableCellInner({
|
|
|
161
171
|
switch (editFieldConfig?.fieldComponent) {
|
|
162
172
|
case "DROPDOWN":
|
|
163
173
|
return /*#__PURE__*/React.createElement(DropdownCellField, {
|
|
164
|
-
fieldComponentProps:
|
|
174
|
+
fieldComponentProps: dropdownFieldProps,
|
|
165
175
|
isRowFocused: isRowFocused,
|
|
166
176
|
inputValue: inputValue,
|
|
167
177
|
hasValidationError: hasValidationError,
|
|
@@ -170,7 +180,7 @@ function EditableCellInner({
|
|
|
170
180
|
});
|
|
171
181
|
case "DATE_PICKER":
|
|
172
182
|
return /*#__PURE__*/React.createElement(DatePickerCellField, {
|
|
173
|
-
fieldComponentProps:
|
|
183
|
+
fieldComponentProps: datePickerFieldProps,
|
|
174
184
|
inputValue: inputValue,
|
|
175
185
|
hasValidationError: hasValidationError,
|
|
176
186
|
isEdited: isEdited,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableCell.js","names":["Error","React","useCallback","useEffect","useRef","useState","Tooltip","DatePickerCellField","DropdownCellField","TextInputCellField","styles","NUMBER_TYPES","DATE_TYPES","VALIDATION_ERROR_MESSAGE","valueToString","value","JSON","stringify","String","parseValueByType","dataType","includes","parsedNumber","Number","isNaN","EditableCellInner","initialValue","currentValue","cellId","onCellEdit","onCellValidationError","clearCellValidationError","originalRowData","rowId","columnId","validateEdit","validationError","editFieldConfig","isRowFocused","inputValue","setInputValue","isCancelled","validationAbortControllerRef","abortValidation","current","abort","hasValidationError","isEdited","runValidation","parsedValue","controller","AbortController","validationPromise","Promise","race","_","reject","signal","addEventListener","DOMException","then","errorMessage","aborted","error","name","commitEdit","newValue","oldValue","handleBlur","handleInputChange","handleKeyDown","e","key","currentTarget","blur","handleCommit","inputType","createElement","Provider","Root","disabled","Trigger","className","osdkEditableCellTrigger","render","osdkTooltipTriggerWrapper","fieldComponent","fieldComponentProps","onChange","onValueChange","onBlur","onKeyDown","Portal","Positioner","sideOffset","side","Popup","errorIcon","Arrow","EditableCell","memo"],"sources":["EditableCell.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 { Error } from \"@blueprintjs/icons\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Tooltip } from \"../base-components/tooltip/Tooltip.js\";\nimport { DatePickerCellField } from \"./components/DatePickerCellField.js\";\nimport { DropdownCellField } from \"./components/DropdownCellField.js\";\nimport { TextInputCellField } from \"./components/TextInputCellField.js\";\nimport styles from \"./EditableCell.module.css\";\nimport type { CellEditInfo, EditFieldConfig } from \"./utils/types.js\";\n\nconst NUMBER_TYPES: readonly string[] = [\n \"double\",\n \"integer\",\n \"long\",\n \"float\",\n \"decimal\",\n \"byte\",\n \"short\",\n];\n\nconst DATE_TYPES: readonly string[] = [\n \"datetime\",\n \"timestamp\",\n];\n\nconst VALIDATION_ERROR_MESSAGE = \"Validation error\";\n\nexport interface EditableCellProps<TData extends RowData, CellValue = unknown> {\n initialValue: CellValue;\n currentValue: CellValue;\n cellId: string;\n dataType?: string;\n onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;\n onCellValidationError?: (\n cellId: string,\n error: string,\n ) => void;\n clearCellValidationError?: (cellId: string) => void;\n validationError?: string;\n originalRowData: TData;\n rowId: string;\n columnId: string;\n validateEdit?: (value: unknown) => Promise<string | undefined>;\n editFieldConfig?: EditFieldConfig;\n isRowFocused?: boolean;\n}\n\nfunction valueToString(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n // At this point, value is a primitive (string, number, boolean, symbol, bigint)\n return String(value as string | number | boolean | symbol | bigint);\n}\n\nfunction parseValueByType(\n value: string,\n dataType?: string,\n): unknown {\n if (!dataType || !NUMBER_TYPES.includes(dataType)) {\n return value;\n }\n\n if (value === \"\") {\n return null;\n }\n\n const parsedNumber = Number(value);\n\n if (isNaN(parsedNumber)) {\n return value;\n }\n\n return parsedNumber;\n}\n\nfunction EditableCellInner<TData extends RowData, CellValue = unknown>({\n initialValue,\n currentValue,\n cellId,\n dataType,\n onCellEdit,\n onCellValidationError,\n clearCellValidationError,\n originalRowData,\n rowId,\n columnId,\n validateEdit,\n validationError,\n editFieldConfig,\n isRowFocused = false,\n}: EditableCellProps<TData, CellValue>): React.ReactElement {\n const [inputValue, setInputValue] = useState<string>(\n valueToString(currentValue),\n );\n const isCancelled = useRef(false);\n const validationAbortControllerRef = useRef<AbortController | null>(null);\n\n const abortValidation = useCallback(() => {\n if (validationAbortControllerRef.current) {\n validationAbortControllerRef.current.abort();\n validationAbortControllerRef.current = null;\n }\n }, []);\n\n const hasValidationError = validationError != null;\n const isEdited = currentValue !== initialValue;\n\n useEffect(() => {\n setInputValue(valueToString(currentValue));\n }, [currentValue]);\n\n useEffect(() => {\n return () => {\n abortValidation();\n };\n }, [abortValidation]);\n\n const runValidation = useCallback(\n (parsedValue: unknown) => {\n if (!validateEdit) {\n return;\n }\n\n const controller = new AbortController();\n validationAbortControllerRef.current = controller;\n\n const validationPromise = validateEdit(parsedValue);\n\n // Race between validation and abort\n Promise.race([\n validationPromise,\n new Promise<string | undefined>((_, reject) => {\n controller.signal.addEventListener(\"abort\", () => {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n });\n }),\n ]).then(\n (errorMessage) => {\n if (controller.signal.aborted) {\n return;\n }\n if (errorMessage) {\n onCellValidationError?.(cellId, errorMessage);\n } else {\n clearCellValidationError?.(cellId);\n }\n },\n (error) => {\n if (\n !controller.signal.aborted\n && error.name !== \"AbortError\"\n ) {\n onCellValidationError?.(cellId, VALIDATION_ERROR_MESSAGE);\n }\n },\n );\n },\n [validateEdit, onCellValidationError, clearCellValidationError, cellId],\n );\n\n const commitEdit = useCallback(\n (newValue: CellValue) => {\n abortValidation();\n\n onCellEdit(cellId, {\n rowId,\n columnId,\n newValue,\n oldValue: initialValue,\n originalRowData,\n });\n\n runValidation(newValue);\n },\n [\n abortValidation,\n onCellEdit,\n cellId,\n rowId,\n columnId,\n initialValue,\n originalRowData,\n runValidation,\n ],\n );\n\n // Text/number input: commit on blur\n const handleBlur = useCallback(() => {\n if (isCancelled.current) {\n isCancelled.current = false;\n return;\n }\n\n const parsedValue = parseValueByType(inputValue, dataType) as CellValue;\n commitEdit(parsedValue);\n }, [inputValue, dataType, commitEdit]);\n\n const handleInputChange = useCallback((value: string) => {\n // Cancel any in-flight validation\n abortValidation();\n setInputValue(value);\n }, [abortValidation]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n if (e.key === \"Escape\") {\n isCancelled.current = true;\n setInputValue(valueToString(currentValue));\n e.currentTarget.blur();\n }\n },\n [currentValue],\n );\n\n const handleCommit = useCallback(\n (newValue: unknown) => {\n commitEdit(newValue as CellValue);\n },\n [commitEdit],\n );\n\n const inputType = dataType && NUMBER_TYPES.includes(dataType)\n ? \"number\"\n : \"text\";\n\n const renderFieldInput = () => {\n switch (editFieldConfig?.fieldComponent) {\n case \"DROPDOWN\":\n return (\n <DropdownCellField\n fieldComponentProps={editFieldConfig.fieldComponentProps}\n isRowFocused={isRowFocused}\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onChange={handleCommit}\n />\n );\n case \"DATE_PICKER\":\n return (\n <DatePickerCellField\n fieldComponentProps={editFieldConfig.fieldComponentProps}\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onChange={handleCommit}\n />\n );\n default:\n if (dataType != null && DATE_TYPES.includes(dataType)) {\n return (\n <DatePickerCellField\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onChange={handleCommit}\n dataType={dataType}\n />\n );\n }\n return (\n <TextInputCellField\n inputType={inputType}\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onValueChange={handleInputChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n );\n }\n };\n\n return (\n <Tooltip.Provider>\n <Tooltip.Root disabled={!hasValidationError}>\n <Tooltip.Trigger\n className={styles.osdkEditableCellTrigger}\n render={<span className={styles.osdkTooltipTriggerWrapper} />}\n >\n {renderFieldInput()}\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={4} side={\"bottom\"}>\n <Tooltip.Popup>\n <div className={styles.validationError}>\n <Error className={styles.errorIcon} />\n {validationError}\n </div>\n <Tooltip.Arrow />\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n );\n}\n\nexport const EditableCell = React.memo(\n EditableCellInner,\n) as typeof EditableCellInner;\n\"\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,QAAQ,oBAAoB;AAE1C,OAAOC,KAAK,IAAIC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AACvE,SAASC,OAAO,QAAQ,uCAAuC;AAC/D,SAASC,mBAAmB,QAAQ,qCAAqC;AACzE,SAASC,iBAAiB,QAAQ,mCAAmC;AACrE,SAASC,kBAAkB,QAAQ,oCAAoC;AACvE,OAAOC,MAAM,MAAM,2BAA2B;AAG9C,MAAMC,YAA+B,GAAG,CACtC,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,SAAS,EACT,MAAM,EACN,OAAO,CACR;AAED,MAAMC,UAA6B,GAAG,CACpC,UAAU,EACV,WAAW,CACZ;AAED,MAAMC,wBAAwB,GAAG,kBAAkB;AAsBnD,SAASC,aAAaA,CAACC,KAAc,EAAU;EAC7C,IAAIA,KAAK,IAAI,IAAI,EAAE;IACjB,OAAO,EAAE;EACX;EACA,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAOC,IAAI,CAACC,SAAS,CAACF,KAAK,CAAC;EAC9B;EACA;EACA,OAAOG,MAAM,CAACH,KAAoD,CAAC;AACrE;AAEA,SAASI,gBAAgBA,CACvBJ,KAAa,EACbK,QAAiB,EACR;EACT,IAAI,CAACA,QAAQ,IAAI,CAACT,YAAY,CAACU,QAAQ,CAACD,QAAQ,CAAC,EAAE;IACjD,OAAOL,KAAK;EACd;EAEA,IAAIA,KAAK,KAAK,EAAE,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,MAAMO,YAAY,GAAGC,MAAM,CAACR,KAAK,CAAC;EAElC,IAAIS,KAAK,CAACF,YAAY,CAAC,EAAE;IACvB,OAAOP,KAAK;EACd;EAEA,OAAOO,YAAY;AACrB;AAEA,SAASG,iBAAiBA,CAA6C;EACrEC,YAAY;EACZC,YAAY;EACZC,MAAM;EACNR,QAAQ;EACRS,UAAU;EACVC,qBAAqB;EACrBC,wBAAwB;EACxBC,eAAe;EACfC,KAAK;EACLC,QAAQ;EACRC,YAAY;EACZC,eAAe;EACfC,eAAe;EACfC,YAAY,GAAG;AACoB,CAAC,EAAsB;EAC1D,MAAM,CAACC,UAAU,EAAEC,aAAa,CAAC,GAAGnC,QAAQ,CAC1CS,aAAa,CAACa,YAAY,CAC5B,CAAC;EACD,MAAMc,WAAW,GAAGrC,MAAM,CAAC,KAAK,CAAC;EACjC,MAAMsC,4BAA4B,GAAGtC,MAAM,CAAyB,IAAI,CAAC;EAEzE,MAAMuC,eAAe,GAAGzC,WAAW,CAAC,MAAM;IACxC,IAAIwC,4BAA4B,CAACE,OAAO,EAAE;MACxCF,4BAA4B,CAACE,OAAO,CAACC,KAAK,CAAC,CAAC;MAC5CH,4BAA4B,CAACE,OAAO,GAAG,IAAI;IAC7C;EACF,CAAC,EAAE,EAAE,CAAC;EAEN,MAAME,kBAAkB,GAAGV,eAAe,IAAI,IAAI;EAClD,MAAMW,QAAQ,GAAGpB,YAAY,KAAKD,YAAY;EAE9CvB,SAAS,CAAC,MAAM;IACdqC,aAAa,CAAC1B,aAAa,CAACa,YAAY,CAAC,CAAC;EAC5C,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;EAElBxB,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXwC,eAAe,CAAC,CAAC;IACnB,CAAC;EACH,CAAC,EAAE,CAACA,eAAe,CAAC,CAAC;EAErB,MAAMK,aAAa,GAAG9C,WAAW,CAC9B+C,WAAoB,IAAK;IACxB,IAAI,CAACd,YAAY,EAAE;MACjB;IACF;IAEA,MAAMe,UAAU,GAAG,IAAIC,eAAe,CAAC,CAAC;IACxCT,4BAA4B,CAACE,OAAO,GAAGM,UAAU;IAEjD,MAAME,iBAAiB,GAAGjB,YAAY,CAACc,WAAW,CAAC;;IAEnD;IACAI,OAAO,CAACC,IAAI,CAAC,CACXF,iBAAiB,EACjB,IAAIC,OAAO,CAAqB,CAACE,CAAC,EAAEC,MAAM,KAAK;MAC7CN,UAAU,CAACO,MAAM,CAACC,gBAAgB,CAAC,OAAO,EAAE,MAAM;QAChDF,MAAM,CAAC,IAAIG,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;MACnD,CAAC,CAAC;IACJ,CAAC,CAAC,CACH,CAAC,CAACC,IAAI,CACJC,YAAY,IAAK;MAChB,IAAIX,UAAU,CAACO,MAAM,CAACK,OAAO,EAAE;QAC7B;MACF;MACA,IAAID,YAAY,EAAE;QAChB/B,qBAAqB,GAAGF,MAAM,EAAEiC,YAAY,CAAC;MAC/C,CAAC,MAAM;QACL9B,wBAAwB,GAAGH,MAAM,CAAC;MACpC;IACF,CAAC,EACAmC,KAAK,IAAK;MACT,IACE,CAACb,UAAU,CAACO,MAAM,CAACK,OAAO,IACvBC,KAAK,CAACC,IAAI,KAAK,YAAY,EAC9B;QACAlC,qBAAqB,GAAGF,MAAM,EAAEf,wBAAwB,CAAC;MAC3D;IACF,CACF,CAAC;EACH,CAAC,EACD,CAACsB,YAAY,EAAEL,qBAAqB,EAAEC,wBAAwB,EAAEH,MAAM,CACxE,CAAC;EAED,MAAMqC,UAAU,GAAG/D,WAAW,CAC3BgE,QAAmB,IAAK;IACvBvB,eAAe,CAAC,CAAC;IAEjBd,UAAU,CAACD,MAAM,EAAE;MACjBK,KAAK;MACLC,QAAQ;MACRgC,QAAQ;MACRC,QAAQ,EAAEzC,YAAY;MACtBM;IACF,CAAC,CAAC;IAEFgB,aAAa,CAACkB,QAAQ,CAAC;EACzB,CAAC,EACD,CACEvB,eAAe,EACfd,UAAU,EACVD,MAAM,EACNK,KAAK,EACLC,QAAQ,EACRR,YAAY,EACZM,eAAe,EACfgB,aAAa,CAEjB,CAAC;;EAED;EACA,MAAMoB,UAAU,GAAGlE,WAAW,CAAC,MAAM;IACnC,IAAIuC,WAAW,CAACG,OAAO,EAAE;MACvBH,WAAW,CAACG,OAAO,GAAG,KAAK;MAC3B;IACF;IAEA,MAAMK,WAAW,GAAG9B,gBAAgB,CAACoB,UAAU,EAAEnB,QAAQ,CAAc;IACvE6C,UAAU,CAAChB,WAAW,CAAC;EACzB,CAAC,EAAE,CAACV,UAAU,EAAEnB,QAAQ,EAAE6C,UAAU,CAAC,CAAC;EAEtC,MAAMI,iBAAiB,GAAGnE,WAAW,CAAEa,KAAa,IAAK;IACvD;IACA4B,eAAe,CAAC,CAAC;IACjBH,aAAa,CAACzB,KAAK,CAAC;EACtB,CAAC,EAAE,CAAC4B,eAAe,CAAC,CAAC;EAErB,MAAM2B,aAAa,GAAGpE,WAAW,CAC9BqE,CAAwC,IAAK;IAC5C,IAAIA,CAAC,CAACC,GAAG,KAAK,OAAO,EAAE;MACrBD,CAAC,CAACE,aAAa,CAACC,IAAI,CAAC,CAAC;IACxB;IACA,IAAIH,CAAC,CAACC,GAAG,KAAK,QAAQ,EAAE;MACtB/B,WAAW,CAACG,OAAO,GAAG,IAAI;MAC1BJ,aAAa,CAAC1B,aAAa,CAACa,YAAY,CAAC,CAAC;MAC1C4C,CAAC,CAACE,aAAa,CAACC,IAAI,CAAC,CAAC;IACxB;EACF,CAAC,EACD,CAAC/C,YAAY,CACf,CAAC;EAED,MAAMgD,YAAY,GAAGzE,WAAW,CAC7BgE,QAAiB,IAAK;IACrBD,UAAU,CAACC,QAAqB,CAAC;EACnC,CAAC,EACD,CAACD,UAAU,CACb,CAAC;EAED,MAAMW,SAAS,GAAGxD,QAAQ,IAAIT,YAAY,CAACU,QAAQ,CAACD,QAAQ,CAAC,GACzD,QAAQ,GACR,MAAM;EAmDV,oBACEnB,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAACwE,QAAQ,qBACf7E,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAACyE,IAAI;IAACC,QAAQ,EAAE,CAAClC;EAAmB,gBAC1C7C,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAAC2E,OAAO;IACdC,SAAS,EAAExE,MAAM,CAACyE,uBAAwB;IAC1CC,MAAM,eAAEnF,KAAA,CAAA4E,aAAA;MAAMK,SAAS,EAAExE,MAAM,CAAC2E;IAA0B,CAAE;EAAE,GAE7D,CAxDgB,MAAM;IAC7B,QAAQhD,eAAe,EAAEiD,cAAc;MACrC,KAAK,UAAU;QACb,oBACErF,KAAA,CAAA4E,aAAA,CAACrE,iBAAiB;UAChB+E,mBAAmB,EAAElD,eAAe,CAACkD,mBAAoB;UACzDjD,YAAY,EAAEA,YAAa;UAC3BC,UAAU,EAAEA,UAAW;UACvBO,kBAAkB,EAAEA,kBAAmB;UACvCC,QAAQ,EAAEA,QAAS;UACnByC,QAAQ,EAAEb;QAAa,CACxB,CAAC;MAEN,KAAK,aAAa;QAChB,oBACE1E,KAAA,CAAA4E,aAAA,CAACtE,mBAAmB;UAClBgF,mBAAmB,EAAElD,eAAe,CAACkD,mBAAoB;UACzDhD,UAAU,EAAEA,UAAW;UACvBO,kBAAkB,EAAEA,kBAAmB;UACvCC,QAAQ,EAAEA,QAAS;UACnByC,QAAQ,EAAEb;QAAa,CACxB,CAAC;MAEN;QACE,IAAIvD,QAAQ,IAAI,IAAI,IAAIR,UAAU,CAACS,QAAQ,CAACD,QAAQ,CAAC,EAAE;UACrD,oBACEnB,KAAA,CAAA4E,aAAA,CAACtE,mBAAmB;YAClBgC,UAAU,EAAEA,UAAW;YACvBO,kBAAkB,EAAEA,kBAAmB;YACvCC,QAAQ,EAAEA,QAAS;YACnByC,QAAQ,EAAEb,YAAa;YACvBvD,QAAQ,EAAEA;UAAS,CACpB,CAAC;QAEN;QACA,oBACEnB,KAAA,CAAA4E,aAAA,CAACpE,kBAAkB;UACjBmE,SAAS,EAAEA,SAAU;UACrBrC,UAAU,EAAEA,UAAW;UACvBO,kBAAkB,EAAEA,kBAAmB;UACvCC,QAAQ,EAAEA,QAAS;UACnB0C,aAAa,EAAEpB,iBAAkB;UACjCqB,MAAM,EAAEtB,UAAW;UACnBuB,SAAS,EAAErB;QAAc,CAC1B,CAAC;IAER;EACF,CAAC,EASyB,CACH,CAAC,eAClBrE,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAACsF,MAAM,qBACb3F,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAACuF,UAAU;IAACC,UAAU,EAAE,CAAE;IAACC,IAAI,EAAE;EAAS,gBAChD9F,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAAC0F,KAAK,qBACZ/F,KAAA,CAAA4E,aAAA;IAAKK,SAAS,EAAExE,MAAM,CAAC0B;EAAgB,gBACrCnC,KAAA,CAAA4E,aAAA,CAAC7E,KAAK;IAACkF,SAAS,EAAExE,MAAM,CAACuF;EAAU,CAAE,CAAC,EACrC7D,eACE,CAAC,eACNnC,KAAA,CAAA4E,aAAA,CAACvE,OAAO,CAAC4F,KAAK,MAAE,CACH,CACG,CACN,CACJ,CACE,CAAC;AAEvB;AAEA,OAAO,MAAMC,YAAY,gBAAGlG,KAAK,CAACmG,IAAI,CACpC3E,iBACF,CAA6B","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"EditableCell.js","names":["Error","React","useCallback","useEffect","useMemo","useRef","useState","Tooltip","DatePickerCellField","DropdownCellField","TextInputCellField","styles","NUMBER_TYPES","DATE_TYPES","VALIDATION_ERROR_MESSAGE","valueToString","value","JSON","stringify","String","parseValueByType","dataType","includes","parsedNumber","Number","isNaN","EditableCellInner","initialValue","currentValue","cellId","onCellEdit","onCellValidationError","clearCellValidationError","originalRowData","rowId","columnId","validateEdit","validationError","editFieldConfig","isRowFocused","inputValue","setInputValue","isCancelled","validationAbortControllerRef","abortValidation","current","abort","hasValidationError","isEdited","runValidation","parsedValue","controller","AbortController","validationPromise","Promise","race","_","reject","signal","addEventListener","DOMException","then","errorMessage","aborted","error","name","commitEdit","newValue","oldValue","handleBlur","handleInputChange","handleKeyDown","e","key","currentTarget","blur","handleCommit","inputType","dropdownFieldProps","fieldComponent","getFieldComponentProps","undefined","datePickerFieldProps","createElement","Provider","Root","disabled","Trigger","className","osdkEditableCellTrigger","render","osdkTooltipTriggerWrapper","fieldComponentProps","onChange","onValueChange","onBlur","onKeyDown","Portal","Positioner","sideOffset","side","Popup","errorIcon","Arrow","EditableCell","memo"],"sources":["EditableCell.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 { Error } from \"@blueprintjs/icons\";\nimport type { RowData } from \"@tanstack/react-table\";\nimport React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Tooltip } from \"../base-components/tooltip/Tooltip.js\";\nimport { DatePickerCellField } from \"./components/DatePickerCellField.js\";\nimport { DropdownCellField } from \"./components/DropdownCellField.js\";\nimport { TextInputCellField } from \"./components/TextInputCellField.js\";\nimport styles from \"./EditableCell.module.css\";\nimport type { CellEditInfo, EditFieldConfig } from \"./utils/types.js\";\n\nconst NUMBER_TYPES: readonly string[] = [\n \"double\",\n \"integer\",\n \"long\",\n \"float\",\n \"decimal\",\n \"byte\",\n \"short\",\n];\n\nconst DATE_TYPES: readonly string[] = [\n \"datetime\",\n \"timestamp\",\n];\n\nconst VALIDATION_ERROR_MESSAGE = \"Validation error\";\n\nexport interface EditableCellProps<TData extends RowData, CellValue = unknown> {\n initialValue: CellValue;\n currentValue: CellValue;\n cellId: string;\n dataType?: string;\n onCellEdit: (cellId: string, info: CellEditInfo<TData, CellValue>) => void;\n onCellValidationError?: (\n cellId: string,\n error: string,\n ) => void;\n clearCellValidationError?: (cellId: string) => void;\n validationError?: string;\n originalRowData: TData;\n rowId: string;\n columnId: string;\n validateEdit?: (value: unknown) => Promise<string | undefined>;\n editFieldConfig?: EditFieldConfig<TData>;\n isRowFocused?: boolean;\n}\n\nfunction valueToString(value: unknown): string {\n if (value == null) {\n return \"\";\n }\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n }\n // At this point, value is a primitive (string, number, boolean, symbol, bigint)\n return String(value as string | number | boolean | symbol | bigint);\n}\n\nfunction parseValueByType(\n value: string,\n dataType?: string,\n): unknown {\n if (!dataType || !NUMBER_TYPES.includes(dataType)) {\n return value;\n }\n\n if (value === \"\") {\n return null;\n }\n\n const parsedNumber = Number(value);\n\n if (isNaN(parsedNumber)) {\n return value;\n }\n\n return parsedNumber;\n}\n\nfunction EditableCellInner<TData extends RowData, CellValue = unknown>({\n initialValue,\n currentValue,\n cellId,\n dataType,\n onCellEdit,\n onCellValidationError,\n clearCellValidationError,\n originalRowData,\n rowId,\n columnId,\n validateEdit,\n validationError,\n editFieldConfig,\n isRowFocused = false,\n}: EditableCellProps<TData, CellValue>): React.ReactElement {\n const [inputValue, setInputValue] = useState<string>(\n valueToString(currentValue),\n );\n const isCancelled = useRef(false);\n const validationAbortControllerRef = useRef<AbortController | null>(null);\n\n const abortValidation = useCallback(() => {\n if (validationAbortControllerRef.current) {\n validationAbortControllerRef.current.abort();\n validationAbortControllerRef.current = null;\n }\n }, []);\n\n const hasValidationError = validationError != null;\n const isEdited = currentValue !== initialValue;\n\n useEffect(() => {\n setInputValue(valueToString(currentValue));\n }, [currentValue]);\n\n useEffect(() => {\n return () => {\n abortValidation();\n };\n }, [abortValidation]);\n\n const runValidation = useCallback(\n (parsedValue: unknown) => {\n if (!validateEdit) {\n return;\n }\n\n const controller = new AbortController();\n validationAbortControllerRef.current = controller;\n\n const validationPromise = validateEdit(parsedValue);\n\n // Race between validation and abort\n Promise.race([\n validationPromise,\n new Promise<string | undefined>((_, reject) => {\n controller.signal.addEventListener(\"abort\", () => {\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n });\n }),\n ]).then(\n (errorMessage) => {\n if (controller.signal.aborted) {\n return;\n }\n if (errorMessage) {\n onCellValidationError?.(cellId, errorMessage);\n } else {\n clearCellValidationError?.(cellId);\n }\n },\n (error) => {\n if (\n !controller.signal.aborted\n && error.name !== \"AbortError\"\n ) {\n onCellValidationError?.(cellId, VALIDATION_ERROR_MESSAGE);\n }\n },\n );\n },\n [validateEdit, onCellValidationError, clearCellValidationError, cellId],\n );\n\n const commitEdit = useCallback(\n (newValue: CellValue) => {\n abortValidation();\n\n onCellEdit(cellId, {\n rowId,\n columnId,\n newValue,\n oldValue: initialValue,\n originalRowData,\n });\n\n runValidation(newValue);\n },\n [\n abortValidation,\n onCellEdit,\n cellId,\n rowId,\n columnId,\n initialValue,\n originalRowData,\n runValidation,\n ],\n );\n\n // Text/number input: commit on blur\n const handleBlur = useCallback(() => {\n if (isCancelled.current) {\n isCancelled.current = false;\n return;\n }\n\n // No-op when the input wasn't actually changed by the user\n if (inputValue === valueToString(currentValue)) {\n return;\n }\n\n const parsedValue = parseValueByType(inputValue, dataType) as CellValue;\n commitEdit(parsedValue);\n }, [inputValue, currentValue, dataType, commitEdit]);\n\n const handleInputChange = useCallback((value: string) => {\n // Cancel any in-flight validation\n abortValidation();\n setInputValue(value);\n }, [abortValidation]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.currentTarget.blur();\n }\n if (e.key === \"Escape\") {\n isCancelled.current = true;\n setInputValue(valueToString(currentValue));\n e.currentTarget.blur();\n }\n },\n [currentValue],\n );\n\n const handleCommit = useCallback(\n (newValue: unknown) => {\n commitEdit(newValue as CellValue);\n },\n [commitEdit],\n );\n\n const inputType = dataType && NUMBER_TYPES.includes(dataType)\n ? \"number\"\n : \"text\";\n\n // Compute field-component props once per (editFieldConfig, originalRowData).\n // The narrowed return type is preserved in each useMemo\n const dropdownFieldProps = useMemo(\n () =>\n editFieldConfig?.fieldComponent === \"DROPDOWN\"\n ? editFieldConfig.getFieldComponentProps(originalRowData)\n : undefined,\n [editFieldConfig, originalRowData],\n );\n\n const datePickerFieldProps = useMemo(\n () =>\n editFieldConfig?.fieldComponent === \"DATE_PICKER\"\n ? editFieldConfig.getFieldComponentProps(originalRowData)\n : undefined,\n [editFieldConfig, originalRowData],\n );\n\n const renderFieldInput = () => {\n switch (editFieldConfig?.fieldComponent) {\n case \"DROPDOWN\":\n return (\n <DropdownCellField\n fieldComponentProps={dropdownFieldProps!}\n isRowFocused={isRowFocused}\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onChange={handleCommit}\n />\n );\n case \"DATE_PICKER\":\n return (\n <DatePickerCellField\n fieldComponentProps={datePickerFieldProps}\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onChange={handleCommit}\n />\n );\n default:\n if (dataType != null && DATE_TYPES.includes(dataType)) {\n return (\n <DatePickerCellField\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onChange={handleCommit}\n dataType={dataType}\n />\n );\n }\n return (\n <TextInputCellField\n inputType={inputType}\n inputValue={inputValue}\n hasValidationError={hasValidationError}\n isEdited={isEdited}\n onValueChange={handleInputChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n />\n );\n }\n };\n\n return (\n <Tooltip.Provider>\n <Tooltip.Root disabled={!hasValidationError}>\n <Tooltip.Trigger\n className={styles.osdkEditableCellTrigger}\n render={<span className={styles.osdkTooltipTriggerWrapper} />}\n >\n {renderFieldInput()}\n </Tooltip.Trigger>\n <Tooltip.Portal>\n <Tooltip.Positioner sideOffset={4} side={\"bottom\"}>\n <Tooltip.Popup>\n <div className={styles.validationError}>\n <Error className={styles.errorIcon} />\n {validationError}\n </div>\n <Tooltip.Arrow />\n </Tooltip.Popup>\n </Tooltip.Positioner>\n </Tooltip.Portal>\n </Tooltip.Root>\n </Tooltip.Provider>\n );\n}\n\nexport const EditableCell = React.memo(\n EditableCellInner,\n) as typeof EditableCellInner;\n\"\";\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -193,7 +193,9 @@ export function ObjectTable({
|
|
|
193
193
|
className: props.className,
|
|
194
194
|
error: error,
|
|
195
195
|
headerMenuFeatureFlags: headerMenuFeatureFlags,
|
|
196
|
-
editableConfig: editableConfig
|
|
196
|
+
editableConfig: editableConfig,
|
|
197
|
+
getRowAttributes: props.getRowAttributes,
|
|
198
|
+
showEditFooter: props.showEditFooter
|
|
197
199
|
});
|
|
198
200
|
}
|
|
199
201
|
//# sourceMappingURL=ObjectTable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ObjectTable.js","names":["getCoreRowModel","useReactTable","React","useCallback","useMemo","useColumnDefs","useColumnPinning","useColumnResize","useColumnVisibility","useEditableTable","useObjectTableData","useRowSelection","useSelectionColumn","useTableSorting","BaseTable","getRowId","EMPTY_ARRAY","ObjectTable","objectType","objectSet","columnDefinitions","filter","objectSetOptions","dedupeIntervalMs","pageSize","orderBy","defaultOrderBy","onOrderByChanged","onColumnsPinnedChanged","onColumnResize","onRowSelection","onColumnHeaderClick","renderCellContextMenu","selectionMode","selectedRows","isAllSelected","isAllSelectedProp","onColumnVisibilityChanged","onCellValueChanged","onSubmitEdits","enableOrdering","enableColumnPinning","enableColumnResizing","enableColumnConfig","editMode","props","columnSizing","onColumnSizingChange","sorting","onSortingChange","data","fetchMore","isLoading","error","columns","loading","isColumnsLoading","rowSelection","hasSelection","onToggleAll","onToggleRow","enableRowSelection","selectionColumn","columnVisibility","onColumnVisibilityChange","columnOrder","onColumnOrderChange","allColumns","columnPinning","onColumnPinningChange","hasSelectionColumn","editableConfig","table","state","enableSorting","columnResizeMode","columnResizeDirection","manualSorting","defaultColumn","minSize","meta","onCellEdit","onCellValidationError","clearCellValidationError","cellEdits","isInEditMode","editModeState","isActive","validationErrors","onRenderCellContextMenu","row","cell","getValue","handleColumnHeaderClick","columnId","undefined","headerMenuFeatureFlags","showSortingItems","showPinningItems","showResizeItem","showConfigItem","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 ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { Cell } from \"@tanstack/react-table\";\nimport { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { useColumnDefs } from \"./hooks/useColumnDefs.js\";\nimport { useColumnPinning } from \"./hooks/useColumnPinning.js\";\nimport { useColumnResize } from \"./hooks/useColumnResize.js\";\nimport { useColumnVisibility } from \"./hooks/useColumnVisibility.js\";\nimport { useEditableTable } from \"./hooks/useEditableTable.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 type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport { getRowId } from \"./utils/getRowId.js\";\n\nconst EMPTY_ARRAY: [] = [];\nimport type { EditableConfig } from \"./utils/types.js\";\n\n/**\n * ObjectTable - A headless table component for displaying OSDK object sets\n *\n * @example\n * ```tsx\n * <ObjectTable objectType={MyObjectType} />\n * ```\n */\n\nexport function ObjectTable<\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,\n objectSet,\n columnDefinitions,\n filter,\n objectSetOptions,\n dedupeIntervalMs,\n pageSize,\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n onColumnsPinnedChanged,\n onColumnResize,\n onRowSelection,\n onColumnHeaderClick,\n renderCellContextMenu,\n selectionMode = \"none\",\n selectedRows,\n isAllSelected: isAllSelectedProp,\n onColumnVisibilityChanged,\n onCellValueChanged,\n onSubmitEdits,\n enableOrdering = true,\n enableColumnPinning = true,\n enableColumnResizing = true,\n enableColumnConfig = true,\n editMode = \"manual\",\n ...props\n}: ObjectTableProps<Q, RDPs, FunctionColumns>): React.ReactElement {\n const { columnSizing, onColumnSizingChange } = useColumnResize({\n onColumnResize,\n });\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, error } = useObjectTableData<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n filter,\n sorting,\n objectSet,\n objectSetOptions,\n dedupeIntervalMs,\n pageSize,\n );\n\n const { columns, loading: isColumnsLoading } = useColumnDefs<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n );\n\n const {\n rowSelection,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n enableRowSelection,\n } = useRowSelection<Q, RDPs>({\n selectionMode,\n selectedRows,\n isAllSelected: isAllSelectedProp,\n onRowSelection,\n data,\n });\n\n const selectionColumn = useSelectionColumn<Q, RDPs>(\n {\n selectionMode,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n },\n );\n\n const {\n columnVisibility,\n onColumnVisibilityChange,\n columnOrder,\n onColumnOrderChange,\n } = useColumnVisibility({\n allColumns: columns,\n onColumnVisibilityChanged,\n });\n\n const { columnPinning, onColumnPinningChange } = useColumnPinning({\n columnDefinitions,\n hasSelectionColumn: enableRowSelection,\n onColumnsPinnedChanged,\n });\n\n const allColumns = useMemo(() => {\n return selectionColumn ? [selectionColumn, ...columns] : columns;\n }, [selectionColumn, columns]);\n\n const editableConfig: EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n > = useEditableTable({\n editMode,\n onCellValueChanged,\n onSubmitEdits,\n });\n\n const table = useReactTable<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >({\n data: data ?? EMPTY_ARRAY,\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n columnVisibility,\n columnOrder,\n rowSelection,\n sorting,\n columnSizing,\n columnPinning,\n },\n onSortingChange,\n onColumnSizingChange,\n onColumnPinningChange,\n onColumnVisibilityChange,\n onColumnOrderChange,\n enableRowSelection,\n enableSorting: enableOrdering,\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 meta: {\n onCellEdit: editableConfig.onCellEdit,\n onCellValidationError: editableConfig.onCellValidationError,\n clearCellValidationError: editableConfig.clearCellValidationError,\n cellEdits: editableConfig.cellEdits,\n isInEditMode: editableConfig.editModeState.isActive,\n validationErrors: editableConfig.validationErrors,\n },\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 handleColumnHeaderClick = useMemo(\n () =>\n onColumnHeaderClick\n ? (columnId: string) =>\n onColumnHeaderClick(\n columnId as\n | PropertyKeys<Q>\n | keyof RDPs\n | keyof FunctionColumns,\n )\n : undefined,\n [onColumnHeaderClick],\n );\n\n const isTableLoading = isLoading || isColumnsLoading;\n\n const headerMenuFeatureFlags: HeaderMenuFeatureFlags = useMemo(() => ({\n showSortingItems: enableOrdering,\n showPinningItems: enableColumnPinning,\n showResizeItem: enableColumnResizing,\n showConfigItem: enableColumnConfig,\n }), [\n enableOrdering,\n enableColumnPinning,\n enableColumnResizing,\n enableColumnConfig,\n ]);\n\n return (\n <BaseTable<Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>>\n table={table}\n isLoading={isTableLoading}\n fetchNextPage={fetchMore}\n onRowClick={props.onRowClick}\n onColumnHeaderClick={handleColumnHeaderClick}\n rowHeight={props.rowHeight}\n renderCellContextMenu={onRenderCellContextMenu}\n className={props.className}\n error={error}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n editableConfig={editableConfig}\n />\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,SAASA,eAAe,EAAEC,aAAa,QAAQ,uBAAuB;AACtE,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AACnD,SAASC,aAAa,QAAQ,0BAA0B;AACxD,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SAASC,mBAAmB,QAAQ,gCAAgC;AACpE,SAASC,gBAAgB,QAAQ,6BAA6B;AAC9D,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,eAAe,QAAQ,4BAA4B;AAC5D,SAASC,kBAAkB,QAAQ,+BAA+B;AAClE,SAASC,eAAe,QAAQ,4BAA4B;AAE5D,SAASC,SAAS,QAAQ,YAAY;AAEtC,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,MAAMC,WAAe,GAAG,EAAE;AAG1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,SAASC,WAAWA,CAUzB;EACAC,UAAU;EACVC,SAAS;EACTC,iBAAiB;EACjBC,MAAM;EACNC,gBAAgB;EAChBC,gBAAgB;EAChBC,QAAQ;EACRC,OAAO;EACPC,cAAc;EACdC,gBAAgB;EAChBC,sBAAsB;EACtBC,cAAc;EACdC,cAAc;EACdC,mBAAmB;EACnBC,qBAAqB;EACrBC,aAAa,GAAG,MAAM;EACtBC,YAAY;EACZC,aAAa,EAAEC,iBAAiB;EAChCC,yBAAyB;EACzBC,kBAAkB;EAClBC,aAAa;EACbC,cAAc,GAAG,IAAI;EACrBC,mBAAmB,GAAG,IAAI;EAC1BC,oBAAoB,GAAG,IAAI;EAC3BC,kBAAkB,GAAG,IAAI;EACzBC,QAAQ,GAAG,QAAQ;EACnB,GAAGC;AACuC,CAAC,EAAsB;EACjE,MAAM;IAAEC,YAAY;IAAEC;EAAqB,CAAC,GAAGxC,eAAe,CAAC;IAC7DsB;EACF,CAAC,CAAC;EAEF,MAAM;IAAEmB,OAAO;IAAEC;EAAgB,CAAC,GAAGpC,eAAe,CAKlD;IACEY,OAAO;IACPC,cAAc;IACdC;EACF,CACF,CAAC;EAED,MAAM;IAAEuB,IAAI;IAAEC,SAAS;IAAEC,SAAS;IAAEC;EAAM,CAAC,GAAG3C,kBAAkB,CAK9DQ,UAAU,EACVE,iBAAiB,EACjBC,MAAM,EACN2B,OAAO,EACP7B,SAAS,EACTG,gBAAgB,EAChBC,gBAAgB,EAChBC,QACF,CAAC;EAED,MAAM;IAAE8B,OAAO;IAAEC,OAAO,EAAEC;EAAiB,CAAC,GAAGnD,aAAa,CAK1Da,UAAU,EACVE,iBACF,CAAC;EAED,MAAM;IACJqC,YAAY;IACZtB,aAAa;IACbuB,YAAY;IACZC,WAAW;IACXC,WAAW;IACXC;EACF,CAAC,GAAGlD,eAAe,CAAU;IAC3BsB,aAAa;IACbC,YAAY;IACZC,aAAa,EAAEC,iBAAiB;IAChCN,cAAc;IACdoB;EACF,CAAC,CAAC;EAEF,MAAMY,eAAe,GAAGlD,kBAAkB,CACxC;IACEqB,aAAa;IACbE,aAAa;IACbuB,YAAY;IACZC,WAAW;IACXC;EACF,CACF,CAAC;EAED,MAAM;IACJG,gBAAgB;IAChBC,wBAAwB;IACxBC,WAAW;IACXC;EACF,CAAC,GAAG1D,mBAAmB,CAAC;IACtB2D,UAAU,EAAEb,OAAO;IACnBjB;EACF,CAAC,CAAC;EAEF,MAAM;IAAE+B,aAAa;IAAEC;EAAsB,CAAC,GAAG/D,gBAAgB,CAAC;IAChEc,iBAAiB;IACjBkD,kBAAkB,EAAET,kBAAkB;IACtCjC;EACF,CAAC,CAAC;EAEF,MAAMuC,UAAU,GAAG/D,OAAO,CAAC,MAAM;IAC/B,OAAO0D,eAAe,GAAG,CAACA,eAAe,EAAE,GAAGR,OAAO,CAAC,GAAGA,OAAO;EAClE,CAAC,EAAE,CAACQ,eAAe,EAAER,OAAO,CAAC,CAAC;EAE9B,MAAMiB,cAGL,GAAG9D,gBAAgB,CAAC;IACnBmC,QAAQ;IACRN,kBAAkB;IAClBC;EACF,CAAC,CAAC;EAEF,MAAMiC,KAAK,GAAGvE,aAAa,CAEzB;IACAiD,IAAI,EAAEA,IAAI,IAAIlC,WAAW;IACzBsC,OAAO,EAAEa,UAAU;IACnBnE,eAAe,EAAEA,eAAe,CAAC,CAAC;IAClCyE,KAAK,EAAE;MACLV,gBAAgB;MAChBE,WAAW;MACXR,YAAY;MACZT,OAAO;MACPF,YAAY;MACZsB;IACF,CAAC;IACDnB,eAAe;IACfF,oBAAoB;IACpBsB,qBAAqB;IACrBL,wBAAwB;IACxBE,mBAAmB;IACnBL,kBAAkB;IAClBa,aAAa,EAAElC,cAAc;IAC7BmC,gBAAgB,EAAE,UAAU;IAC5BC,qBAAqB,EAAE,KAAK;IAC5BC,aAAa,EAAE,IAAI;IAAE;IACrBC,aAAa,EAAE;MACbC,OAAO,EAAE;IACX,CAAC;IACDhE,QAAQ;IACRiE,IAAI,EAAE;MACJC,UAAU,EAAEV,cAAc,CAACU,UAAU;MACrCC,qBAAqB,EAAEX,cAAc,CAACW,qBAAqB;MAC3DC,wBAAwB,EAAEZ,cAAc,CAACY,wBAAwB;MACjEC,SAAS,EAAEb,cAAc,CAACa,SAAS;MACnCC,YAAY,EAAEd,cAAc,CAACe,aAAa,CAACC,QAAQ;MACnDC,gBAAgB,EAAEjB,cAAc,CAACiB;IACnC;EACF,CAAC,CAAC;EAEF,MAAMC,uBAAuB,GAAGtF,WAAW,CACzC,CACEuF,GAAkE,EAClEC,IAGC,KACE;IACH,OAAO3D,qBAAqB,GAAG0D,GAAG,EAAEC,IAAI,CAACC,QAAQ,CAAC,CAAC,CAAC;EACtD,CAAC,EACD,CAAC5D,qBAAqB,CACxB,CAAC;EAED,MAAM6D,uBAAuB,GAAGzF,OAAO,CACrC,MACE2B,mBAAmB,GACd+D,QAAgB,IACjB/D,mBAAmB,CACjB+D,QAIF,CAAC,GACDC,SAAS,EACf,CAAChE,mBAAmB,CACtB,CAAC;EAID,MAAMiE,sBAA8C,GAAG5F,OAAO,CAAC,OAAO;IACpE6F,gBAAgB,EAAEzD,cAAc;IAChC0D,gBAAgB,EAAEzD,mBAAmB;IACrC0D,cAAc,EAAEzD,oBAAoB;IACpC0D,cAAc,EAAEzD;EAClB,CAAC,CAAC,EAAE,CACFH,cAAc,EACdC,mBAAmB,EACnBC,oBAAoB,EACpBC,kBAAkB,CACnB,CAAC;EAEF,oBACEzC,KAAA,CAAAmG,aAAA,CAACvF,SAAS;IACR0D,KAAK,EAAEA,KAAM;IACbpB,SAAS,EAjBUA,SAAS,IAAII,gBAiBN;IAC1B8C,aAAa,EAAEnD,SAAU;IACzBoD,UAAU,EAAE1D,KAAK,CAAC0D,UAAW;IAC7BxE,mBAAmB,EAAE8D,uBAAwB;IAC7CW,SAAS,EAAE3D,KAAK,CAAC2D,SAAU;IAC3BxE,qBAAqB,EAAEyD,uBAAwB;IAC/CgB,SAAS,EAAE5D,KAAK,CAAC4D,SAAU;IAC3BpD,KAAK,EAAEA,KAAM;IACb2C,sBAAsB,EAAEA,sBAAuB;IAC/CzB,cAAc,EAAEA;EAAe,CAChC,CAAC;AAEN","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"ObjectTable.js","names":["getCoreRowModel","useReactTable","React","useCallback","useMemo","useColumnDefs","useColumnPinning","useColumnResize","useColumnVisibility","useEditableTable","useObjectTableData","useRowSelection","useSelectionColumn","useTableSorting","BaseTable","getRowId","EMPTY_ARRAY","ObjectTable","objectType","objectSet","columnDefinitions","filter","objectSetOptions","dedupeIntervalMs","pageSize","orderBy","defaultOrderBy","onOrderByChanged","onColumnsPinnedChanged","onColumnResize","onRowSelection","onColumnHeaderClick","renderCellContextMenu","selectionMode","selectedRows","isAllSelected","isAllSelectedProp","onColumnVisibilityChanged","onCellValueChanged","onSubmitEdits","enableOrdering","enableColumnPinning","enableColumnResizing","enableColumnConfig","editMode","props","columnSizing","onColumnSizingChange","sorting","onSortingChange","data","fetchMore","isLoading","error","columns","loading","isColumnsLoading","rowSelection","hasSelection","onToggleAll","onToggleRow","enableRowSelection","selectionColumn","columnVisibility","onColumnVisibilityChange","columnOrder","onColumnOrderChange","allColumns","columnPinning","onColumnPinningChange","hasSelectionColumn","editableConfig","table","state","enableSorting","columnResizeMode","columnResizeDirection","manualSorting","defaultColumn","minSize","meta","onCellEdit","onCellValidationError","clearCellValidationError","cellEdits","isInEditMode","editModeState","isActive","validationErrors","onRenderCellContextMenu","row","cell","getValue","handleColumnHeaderClick","columnId","undefined","headerMenuFeatureFlags","showSortingItems","showPinningItems","showResizeItem","showConfigItem","createElement","fetchNextPage","onRowClick","rowHeight","className","getRowAttributes","showEditFooter"],"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 ObjectOrInterfaceDefinition,\n Osdk,\n PropertyKeys,\n QueryDefinition,\n SimplePropertyDef,\n} from \"@osdk/api\";\nimport type { Cell } from \"@tanstack/react-table\";\nimport { getCoreRowModel, useReactTable } from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo } from \"react\";\nimport { useColumnDefs } from \"./hooks/useColumnDefs.js\";\nimport { useColumnPinning } from \"./hooks/useColumnPinning.js\";\nimport { useColumnResize } from \"./hooks/useColumnResize.js\";\nimport { useColumnVisibility } from \"./hooks/useColumnVisibility.js\";\nimport { useEditableTable } from \"./hooks/useEditableTable.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 type { HeaderMenuFeatureFlags } from \"./TableHeaderWithPopover.js\";\nimport { getRowId } from \"./utils/getRowId.js\";\n\nconst EMPTY_ARRAY: [] = [];\nimport type { EditableConfig } from \"./utils/types.js\";\n\n/**\n * ObjectTable - A headless table component for displaying OSDK object sets\n *\n * @example\n * ```tsx\n * <ObjectTable objectType={MyObjectType} />\n * ```\n */\n\nexport function ObjectTable<\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,\n objectSet,\n columnDefinitions,\n filter,\n objectSetOptions,\n dedupeIntervalMs,\n pageSize,\n orderBy,\n defaultOrderBy,\n onOrderByChanged,\n onColumnsPinnedChanged,\n onColumnResize,\n onRowSelection,\n onColumnHeaderClick,\n renderCellContextMenu,\n selectionMode = \"none\",\n selectedRows,\n isAllSelected: isAllSelectedProp,\n onColumnVisibilityChanged,\n onCellValueChanged,\n onSubmitEdits,\n enableOrdering = true,\n enableColumnPinning = true,\n enableColumnResizing = true,\n enableColumnConfig = true,\n editMode = \"manual\",\n ...props\n}: ObjectTableProps<Q, RDPs, FunctionColumns>): React.ReactElement {\n const { columnSizing, onColumnSizingChange } = useColumnResize({\n onColumnResize,\n });\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, error } = useObjectTableData<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n filter,\n sorting,\n objectSet,\n objectSetOptions,\n dedupeIntervalMs,\n pageSize,\n );\n\n const { columns, loading: isColumnsLoading } = useColumnDefs<\n Q,\n RDPs,\n FunctionColumns\n >(\n objectType,\n columnDefinitions,\n );\n\n const {\n rowSelection,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n enableRowSelection,\n } = useRowSelection<Q, RDPs>({\n selectionMode,\n selectedRows,\n isAllSelected: isAllSelectedProp,\n onRowSelection,\n data,\n });\n\n const selectionColumn = useSelectionColumn<Q, RDPs>(\n {\n selectionMode,\n isAllSelected,\n hasSelection,\n onToggleAll,\n onToggleRow,\n },\n );\n\n const {\n columnVisibility,\n onColumnVisibilityChange,\n columnOrder,\n onColumnOrderChange,\n } = useColumnVisibility({\n allColumns: columns,\n onColumnVisibilityChanged,\n });\n\n const { columnPinning, onColumnPinningChange } = useColumnPinning({\n columnDefinitions,\n hasSelectionColumn: enableRowSelection,\n onColumnsPinnedChanged,\n });\n\n const allColumns = useMemo(() => {\n return selectionColumn ? [selectionColumn, ...columns] : columns;\n }, [selectionColumn, columns]);\n\n const editableConfig: EditableConfig<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>,\n unknown\n > = useEditableTable({\n editMode,\n onCellValueChanged,\n onSubmitEdits,\n });\n\n const table = useReactTable<\n Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>\n >({\n data: data ?? EMPTY_ARRAY,\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n state: {\n columnVisibility,\n columnOrder,\n rowSelection,\n sorting,\n columnSizing,\n columnPinning,\n },\n onSortingChange,\n onColumnSizingChange,\n onColumnPinningChange,\n onColumnVisibilityChange,\n onColumnOrderChange,\n enableRowSelection,\n enableSorting: enableOrdering,\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 meta: {\n onCellEdit: editableConfig.onCellEdit,\n onCellValidationError: editableConfig.onCellValidationError,\n clearCellValidationError: editableConfig.clearCellValidationError,\n cellEdits: editableConfig.cellEdits,\n isInEditMode: editableConfig.editModeState.isActive,\n validationErrors: editableConfig.validationErrors,\n },\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 handleColumnHeaderClick = useMemo(\n () =>\n onColumnHeaderClick\n ? (columnId: string) =>\n onColumnHeaderClick(\n columnId as\n | PropertyKeys<Q>\n | keyof RDPs\n | keyof FunctionColumns,\n )\n : undefined,\n [onColumnHeaderClick],\n );\n\n const isTableLoading = isLoading || isColumnsLoading;\n\n const headerMenuFeatureFlags: HeaderMenuFeatureFlags = useMemo(() => ({\n showSortingItems: enableOrdering,\n showPinningItems: enableColumnPinning,\n showResizeItem: enableColumnResizing,\n showConfigItem: enableColumnConfig,\n }), [\n enableOrdering,\n enableColumnPinning,\n enableColumnResizing,\n enableColumnConfig,\n ]);\n\n return (\n <BaseTable<Osdk.Instance<Q, \"$allBaseProperties\", PropertyKeys<Q>, RDPs>>\n table={table}\n isLoading={isTableLoading}\n fetchNextPage={fetchMore}\n onRowClick={props.onRowClick}\n onColumnHeaderClick={handleColumnHeaderClick}\n rowHeight={props.rowHeight}\n renderCellContextMenu={onRenderCellContextMenu}\n className={props.className}\n error={error}\n headerMenuFeatureFlags={headerMenuFeatureFlags}\n editableConfig={editableConfig}\n getRowAttributes={props.getRowAttributes}\n showEditFooter={props.showEditFooter}\n />\n );\n}\n"],"mappings":"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","ignoreList":[]}
|