@osdk/react-components 0.2.0-beta.11 → 0.2.0-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/AGENTS.md +105 -0
  2. package/CHANGELOG.md +30 -0
  3. package/build/browser/base-components/draggable-list/DraggableList.module.css +2 -2
  4. package/build/browser/filter-list/FilterListApi.js.map +1 -1
  5. package/build/browser/filter-list/base/DragHandleIcon.js +51 -0
  6. package/build/browser/filter-list/base/DragHandleIcon.js.map +1 -0
  7. package/build/browser/filter-list/base/FilterList.js +3 -1
  8. package/build/browser/filter-list/base/FilterList.js.map +1 -1
  9. package/build/browser/filter-list/base/FilterListContent.js +143 -3
  10. package/build/browser/filter-list/base/FilterListContent.js.map +1 -1
  11. package/build/browser/filter-list/base/FilterListContent.module.css +6 -0
  12. package/build/browser/filter-list/base/FilterListContent.module.css.js +2 -1
  13. package/build/browser/filter-list/base/FilterListItem.js +11 -18
  14. package/build/browser/filter-list/base/FilterListItem.js.map +1 -1
  15. package/build/browser/filter-list/base/FilterListItem.module.css +32 -0
  16. package/build/browser/filter-list/base/FilterListItem.module.css.js +3 -1
  17. package/build/browser/filter-list/base/SortableFilterListItem.js +63 -0
  18. package/build/browser/filter-list/base/SortableFilterListItem.js.map +1 -0
  19. package/build/browser/filter-list/utils/getFilterLabel.js +36 -0
  20. package/build/browser/filter-list/utils/getFilterLabel.js.map +1 -0
  21. package/build/browser/object-table/EditableCell.js +1 -2
  22. package/build/browser/object-table/EditableCell.js.map +1 -1
  23. package/build/browser/object-table/TableRow.js +1 -2
  24. package/build/browser/object-table/TableRow.js.map +1 -1
  25. package/build/browser/styles.css +40 -2
  26. package/build/cjs/public/experimental.cjs +905 -677
  27. package/build/cjs/public/experimental.cjs.map +1 -1
  28. package/build/cjs/public/experimental.css +34 -2
  29. package/build/cjs/public/experimental.css.map +1 -1
  30. package/build/cjs/public/experimental.d.cts +7 -0
  31. package/build/esm/base-components/draggable-list/DraggableList.module.css +2 -2
  32. package/build/esm/filter-list/FilterListApi.js.map +1 -1
  33. package/build/esm/filter-list/base/DragHandleIcon.js +51 -0
  34. package/build/esm/filter-list/base/DragHandleIcon.js.map +1 -0
  35. package/build/esm/filter-list/base/FilterList.js +3 -1
  36. package/build/esm/filter-list/base/FilterList.js.map +1 -1
  37. package/build/esm/filter-list/base/FilterListContent.js +143 -3
  38. package/build/esm/filter-list/base/FilterListContent.js.map +1 -1
  39. package/build/esm/filter-list/base/FilterListContent.module.css +6 -0
  40. package/build/esm/filter-list/base/FilterListItem.js +11 -18
  41. package/build/esm/filter-list/base/FilterListItem.js.map +1 -1
  42. package/build/esm/filter-list/base/FilterListItem.module.css +32 -0
  43. package/build/esm/filter-list/base/SortableFilterListItem.js +63 -0
  44. package/build/esm/filter-list/base/SortableFilterListItem.js.map +1 -0
  45. package/build/esm/filter-list/utils/getFilterLabel.js +36 -0
  46. package/build/esm/filter-list/utils/getFilterLabel.js.map +1 -0
  47. package/build/esm/object-table/EditableCell.js +1 -2
  48. package/build/esm/object-table/EditableCell.js.map +1 -1
  49. package/build/esm/object-table/TableRow.js +1 -2
  50. package/build/esm/object-table/TableRow.js.map +1 -1
  51. package/build/types/filter-list/FilterListApi.d.ts +7 -0
  52. package/build/types/filter-list/FilterListApi.d.ts.map +1 -1
  53. package/build/types/filter-list/base/DragHandleIcon.d.ts +2 -0
  54. package/build/types/filter-list/base/DragHandleIcon.d.ts.map +1 -0
  55. package/build/types/filter-list/base/FilterListContent.d.ts +2 -1
  56. package/build/types/filter-list/base/FilterListContent.d.ts.map +1 -1
  57. package/build/types/filter-list/base/FilterListItem.d.ts +4 -1
  58. package/build/types/filter-list/base/FilterListItem.d.ts.map +1 -1
  59. package/build/types/filter-list/base/SortableFilterListItem.d.ts +16 -0
  60. package/build/types/filter-list/base/SortableFilterListItem.d.ts.map +1 -0
  61. package/build/types/filter-list/utils/getFilterLabel.d.ts +3 -0
  62. package/build/types/filter-list/utils/getFilterLabel.d.ts.map +1 -0
  63. package/build/types/object-table/EditableCell.d.ts +1 -3
  64. package/build/types/object-table/EditableCell.d.ts.map +1 -1
  65. package/build/types/object-table/TableRow.d.ts +1 -2
  66. package/build/types/object-table/TableRow.d.ts.map +1 -1
  67. package/package.json +6 -5
  68. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
  69. package/build/browser/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
  70. package/build/browser/filter-list/__tests__/dateUtils.test.js +0 -55
  71. package/build/browser/filter-list/__tests__/dateUtils.test.js.map +0 -1
  72. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
  73. package/build/browser/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
  74. package/build/browser/filter-list/__tests__/getFilterKey.test.js +0 -53
  75. package/build/browser/filter-list/__tests__/getFilterKey.test.js.map +0 -1
  76. package/build/browser/filter-list/__tests__/testUtils.js +0 -203
  77. package/build/browser/filter-list/__tests__/testUtils.js.map +0 -1
  78. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
  79. package/build/browser/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
  80. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
  81. package/build/browser/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
  82. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
  83. package/build/browser/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
  84. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
  85. package/build/browser/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
  86. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
  87. package/build/browser/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
  88. package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js +0 -292
  89. package/build/browser/object-table/hooks/__tests__/useEditableTable.test.js.map +0 -1
  90. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
  91. package/build/browser/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
  92. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
  93. package/build/browser/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
  94. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
  95. package/build/browser/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
  96. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
  97. package/build/browser/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
  98. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js +0 -202
  99. package/build/esm/filter-list/__tests__/LinkedPropertyInput.test.js.map +0 -1
  100. package/build/esm/filter-list/__tests__/dateUtils.test.js +0 -55
  101. package/build/esm/filter-list/__tests__/dateUtils.test.js.map +0 -1
  102. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js +0 -296
  103. package/build/esm/filter-list/__tests__/filterStateToWhereClause.test.js.map +0 -1
  104. package/build/esm/filter-list/__tests__/getFilterKey.test.js +0 -53
  105. package/build/esm/filter-list/__tests__/getFilterKey.test.js.map +0 -1
  106. package/build/esm/filter-list/__tests__/testUtils.js +0 -203
  107. package/build/esm/filter-list/__tests__/testUtils.js.map +0 -1
  108. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js +0 -128
  109. package/build/esm/filter-list/hooks/__tests__/useFilterListState.test.js.map +0 -1
  110. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js +0 -147
  111. package/build/esm/object-table/hooks/__tests__/useCellContextMenu.test.js.map +0 -1
  112. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js +0 -520
  113. package/build/esm/object-table/hooks/__tests__/useColumnDefs.test.js.map +0 -1
  114. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js +0 -266
  115. package/build/esm/object-table/hooks/__tests__/useColumnPinning.test.js.map +0 -1
  116. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js +0 -200
  117. package/build/esm/object-table/hooks/__tests__/useColumnVisibility.test.js.map +0 -1
  118. package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js +0 -292
  119. package/build/esm/object-table/hooks/__tests__/useEditableTable.test.js.map +0 -1
  120. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js +0 -315
  121. package/build/esm/object-table/hooks/__tests__/useObjectTableData.test.js.map +0 -1
  122. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js +0 -596
  123. package/build/esm/object-table/hooks/__tests__/useRowSelection.test.js.map +0 -1
  124. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js +0 -220
  125. package/build/esm/object-table/hooks/__tests__/useSelectionColumn.test.js.map +0 -1
  126. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js +0 -501
  127. package/build/esm/object-table/hooks/__tests__/useTableSorting.test.js.map +0 -1
  128. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts +0 -1
  129. package/build/types/filter-list/__tests__/LinkedPropertyInput.test.d.ts.map +0 -1
  130. package/build/types/filter-list/__tests__/dateUtils.test.d.ts +0 -1
  131. package/build/types/filter-list/__tests__/dateUtils.test.d.ts.map +0 -1
  132. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts +0 -1
  133. package/build/types/filter-list/__tests__/filterStateToWhereClause.test.d.ts.map +0 -1
  134. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts +0 -1
  135. package/build/types/filter-list/__tests__/getFilterKey.test.d.ts.map +0 -1
  136. package/build/types/filter-list/__tests__/testUtils.d.ts +0 -65
  137. package/build/types/filter-list/__tests__/testUtils.d.ts.map +0 -1
  138. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts +0 -1
  139. package/build/types/filter-list/hooks/__tests__/useFilterListState.test.d.ts.map +0 -1
  140. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts +0 -1
  141. package/build/types/object-table/hooks/__tests__/useCellContextMenu.test.d.ts.map +0 -1
  142. package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts +0 -1
  143. package/build/types/object-table/hooks/__tests__/useColumnDefs.test.d.ts.map +0 -1
  144. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts +0 -1
  145. package/build/types/object-table/hooks/__tests__/useColumnPinning.test.d.ts.map +0 -1
  146. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts +0 -1
  147. package/build/types/object-table/hooks/__tests__/useColumnVisibility.test.d.ts.map +0 -1
  148. package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts +0 -1
  149. package/build/types/object-table/hooks/__tests__/useEditableTable.test.d.ts.map +0 -1
  150. package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts +0 -1
  151. package/build/types/object-table/hooks/__tests__/useObjectTableData.test.d.ts.map +0 -1
  152. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts +0 -1
  153. package/build/types/object-table/hooks/__tests__/useRowSelection.test.d.ts.map +0 -1
  154. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts +0 -1
  155. package/build/types/object-table/hooks/__tests__/useSelectionColumn.test.d.ts.map +0 -1
  156. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts +0 -1
  157. package/build/types/object-table/hooks/__tests__/useTableSorting.test.d.ts.map +0 -1
package/AGENTS.md ADDED
@@ -0,0 +1,105 @@
1
+ # @osdk/react-components
2
+
3
+ Pre-built UI components for OSDK data. Requires `@osdk/react` (see the `@osdk/react` package's `AGENTS.md` for hooks and provider setup).
4
+
5
+ ## Setup
6
+
7
+ All components import from `@osdk/react-components/experimental`. Requires `OsdkProvider2` from `@osdk/react/experimental`.
8
+
9
+ ### Provider (required)
10
+
11
+ ```tsx
12
+ import { OsdkProvider2 } from "@osdk/react/experimental";
13
+ import { client } from "./client";
14
+
15
+ function App() {
16
+ return (
17
+ <OsdkProvider2 client={client}>
18
+ <MyApp />
19
+ </OsdkProvider2>
20
+ );
21
+ }
22
+ ```
23
+
24
+ ### CSS (required)
25
+
26
+ ```css
27
+ @layer osdk.tokens, osdk.components;
28
+ @import "@osdk/react-components-styles" layer(osdk.tokens);
29
+ @import "@osdk/react-components/styles.css" layer(osdk.components);
30
+
31
+ .root {
32
+ isolation: isolate;
33
+ }
34
+ ```
35
+
36
+ ## ObjectTable
37
+
38
+ ```tsx
39
+ import { ObjectTable } from "@osdk/react-components/experimental";
40
+ import { Employee } from "@your-osdk-package";
41
+
42
+ function EmployeeDirectory() {
43
+ return <ObjectTable objectType={Employee} />;
44
+ }
45
+ ```
46
+
47
+ ### Key Props
48
+
49
+ | Prop | Type | Description |
50
+ | ---------------------------- | ------------------------------------ | ------------------------------------------------------------------- |
51
+ | `objectType` | ObjectType | **Required.** The OSDK object type to display. |
52
+ | `columnDefinitions` | `ColumnDefinition[]` | Column config: visibility, order, custom renderers, pinning, width. |
53
+ | `enableFiltering` | boolean | Allow user filtering (default: true) |
54
+ | `enableOrdering` | boolean | Allow user sorting (default: true) |
55
+ | `enableColumnPinning` | boolean | Allow column pinning (default: true) |
56
+ | `enableColumnResizing` | boolean | Allow column resizing (default: true) |
57
+ | `enableColumnConfig` | boolean | Show column config dialog (default: true) |
58
+ | `selectionMode` | `"single"` / `"multiple"` / `"none"` | Row selection mode (default: "none") |
59
+ | `orderBy` / `defaultOrderBy` | `OrderBy<Q>[]` | Controlled/uncontrolled sorting |
60
+ | `filter` | WhereClause | Controlled filtering |
61
+ | `rowHeight` | number | Row height in pixels (default: 40) |
62
+ | `renderCellContextMenu` | function | Custom right-click menu |
63
+
64
+ ### Column Definition
65
+
66
+ ```ts
67
+ type ColumnDefinition = {
68
+ locator:
69
+ | { type: "property"; id: PropertyKeys<Q> }
70
+ | {
71
+ type: "rdp";
72
+ id: keyof RDPs;
73
+ creator: DerivedProperty.Creator<Q, RDPs[keyof RDPs]>;
74
+ }
75
+ | { type: "function"; id: keyof FunctionColumns }
76
+ | { type: "custom"; id: string };
77
+ renderCell?: (
78
+ object: Osdk.Instance<Q>,
79
+ locator: ColumnDefinitionLocator<Q>,
80
+ ) => React.ReactNode;
81
+ renderHeader?: () => React.ReactNode;
82
+ width?: number;
83
+ pinned?: "left" | "right" | "none";
84
+ isVisible?: boolean;
85
+ orderable?: boolean;
86
+ columnName?: string;
87
+ };
88
+ ```
89
+
90
+ ### ColumnConfigDialog
91
+
92
+ Standalone dialog for column visibility/ordering:
93
+
94
+ ```tsx
95
+ import { ColumnConfigDialog } from "@osdk/react-components/experimental";
96
+
97
+ <ColumnConfigDialog
98
+ isOpen={isOpen}
99
+ onClose={() => setIsOpen(false)}
100
+ columnOptions={[{ id: "fullName", name: "Full Name" }]}
101
+ currentVisibility={{ fullName: true }}
102
+ currentColumnOrder={["fullName"]}
103
+ onApply={(columns) => {/* [{ columnId, isVisible }] */}}
104
+ />;
105
+ ```
package/CHANGELOG.md CHANGED
@@ -1,5 +1,35 @@
1
1
  # @osdk/react-components
2
2
 
3
+ ## 0.2.0-beta.13
4
+
5
+ ### Minor Changes
6
+
7
+ - 76ee40a: Fix column resize and value change ux
8
+ - edbe438: FilterList base components with drag-and-drop sorting and tokenized styling
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies [8c30908]
13
+ - @osdk/client@2.8.0-beta.17
14
+ - @osdk/api@2.8.0-beta.17
15
+ - @osdk/react@0.10.0-beta.8
16
+
17
+ ## 0.2.0-beta.12
18
+
19
+ ### Minor Changes
20
+
21
+ - 9720083: Add AGENTS.md files for AI IDE context
22
+
23
+ ### Patch Changes
24
+
25
+ - Updated dependencies [9720083]
26
+ - Updated dependencies [09e5659]
27
+ - Updated dependencies [8a82492]
28
+ - Updated dependencies [2ebe62c]
29
+ - @osdk/react@0.10.0-beta.8
30
+ - @osdk/client@2.8.0-beta.16
31
+ - @osdk/api@2.8.0-beta.16
32
+
3
33
  ## 0.2.0-beta.11
4
34
 
5
35
  ### Minor Changes
@@ -40,7 +40,7 @@
40
40
 
41
41
  .dragHandle {
42
42
  display: flex;
43
- cursor: grab;
43
+ cursor: var(--osdk-drag-handle-cursor);
44
44
  color: var(--osdk-draggable-item-drag-icon-color);
45
45
 
46
46
  &:hover {
@@ -48,7 +48,7 @@
48
48
  }
49
49
 
50
50
  &:active {
51
- cursor: grabbing;
51
+ cursor: var(--osdk-drag-handle-cursor-active);
52
52
  }
53
53
 
54
54
  &:focus {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterListApi.js","names":[],"sources":["FilterListApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LinkNames,\n ObjectSet,\n ObjectTypeDefinition,\n WhereClause,\n} from \"@osdk/api\";\nimport type React from \"react\";\nimport type {\n FilterState as FilterStateType,\n PropertyFilterDefinition,\n} from \"./FilterListItemApi.js\";\nimport type { CustomFilterDefinition } from \"./types/CustomRendererTypes.js\";\nimport type { KeywordSearchFilterDefinition } from \"./types/KeywordSearchTypes.js\";\nimport type {\n HasLinkFilterDefinition,\n LinkedPropertyFilterDefinition,\n} from \"./types/LinkedFilterTypes.js\";\n\n/**\n * Union type of all filter definition types\n */\nexport type FilterDefinitionUnion<Q extends ObjectTypeDefinition> =\n | PropertyFilterDefinition<Q>\n | HasLinkFilterDefinition<Q>\n | LinkedPropertyFilterDefinition<Q, LinkNames<Q>>\n | KeywordSearchFilterDefinition<Q>\n | CustomFilterDefinition<Q>;\n\n/**\n * Extract the key from a filter definition union\n */\nexport type FilterKey<Q extends ObjectTypeDefinition> =\n FilterDefinitionUnion<Q> extends infer D ? D extends { key: infer K } ? K\n : D extends { linkName: infer L } ? L\n : never\n : never;\n\n/**\n * Extract the filter state from a filter definition union\n */\nexport type FilterState<Q extends ObjectTypeDefinition> =\n FilterDefinitionUnion<Q> extends infer D\n ? D extends { filterState: infer S } ? S\n : never\n : never;\n\n/**\n * Map from filter definition objects to their current state.\n * Uses object identity for keys, ensuring stable lookups across reorders.\n */\nexport type FilterStatesMap<Q extends ObjectTypeDefinition> = Map<\n FilterDefinitionUnion<Q>,\n FilterStateType\n>;\n\nexport interface FilterListProps<Q extends ObjectTypeDefinition> {\n /**\n * The set of objects to be filtered\n */\n objectSet: ObjectSet<Q>;\n\n /**\n * Optional title to display in the filter list header\n */\n title?: string;\n\n /**\n * Optional icon to display next to the title\n */\n titleIcon?: React.ReactNode;\n\n /**\n * The definition for all supported filter items in the list\n * If not supplied, all filterable properties will be available\n */\n filterDefinitions?: Array<FilterDefinitionUnion<Q>>;\n\n /**\n * The current where clause to filter the objectSet.\n * If provided, the filter clause is controlled.\n */\n filterClause?: WhereClause<Q>;\n\n /**\n * Called when the filter clause changes.\n * The filters are joined by the selected filterOperator.\n * Required in controlled mode.\n *\n * @param newClause The updated filter clause\n */\n onFilterClauseChanged?: (newClause: WhereClause<Q>) => void;\n\n /**\n * The logical operator to join multiple filters\n *\n * @default \"and\"\n */\n filterOperator?: \"and\" | \"or\";\n\n /**\n * Called when filter state changes\n *\n * @param definition The filter definition whose state changed\n * @param newState The updated filter state\n */\n onFilterStateChanged?: (\n definition: FilterDefinitionUnion<Q>,\n newState: FilterStateType,\n ) => void;\n\n /**\n * Called when a filter is added\n * If provided, user will be allowed to add filters\n *\n * @param filterKey The key of the added filter\n * @param newDefinitions The filter list with the new filter added\n */\n onFilterAdded?: (\n filterKey: FilterKey<Q>,\n newDefinitions: Array<FilterDefinitionUnion<Q>>,\n ) => void;\n\n /**\n * Called when a filter is removed\n * If provided, user will be allowed to remove filters\n *\n * @param filterKey The key of the removed filter\n */\n onFilterRemoved?: (filterKey: FilterKey<Q>) => void;\n\n /**\n * Show reset filters button in header\n */\n showResetButton?: boolean;\n\n /**\n * Called when reset button is clicked\n */\n onReset?: () => void;\n\n /**\n * Show count of active filters in header\n */\n showActiveFilterCount?: boolean;\n\n /**\n * Additional CSS class name\n */\n className?: string;\n\n /**\n * Custom render function for the \"Add filter\" button.\n * When not provided, a default button is shown if onFilterAdded is set.\n */\n renderAddFilterButton?: () => React.ReactNode;\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"FilterListApi.js","names":[],"sources":["FilterListApi.ts"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n LinkNames,\n ObjectSet,\n ObjectTypeDefinition,\n WhereClause,\n} from \"@osdk/api\";\nimport type React from \"react\";\nimport type {\n FilterState as FilterStateType,\n PropertyFilterDefinition,\n} from \"./FilterListItemApi.js\";\nimport type { CustomFilterDefinition } from \"./types/CustomRendererTypes.js\";\nimport type { KeywordSearchFilterDefinition } from \"./types/KeywordSearchTypes.js\";\nimport type {\n HasLinkFilterDefinition,\n LinkedPropertyFilterDefinition,\n} from \"./types/LinkedFilterTypes.js\";\n\n/**\n * Union type of all filter definition types\n */\nexport type FilterDefinitionUnion<Q extends ObjectTypeDefinition> =\n | PropertyFilterDefinition<Q>\n | HasLinkFilterDefinition<Q>\n | LinkedPropertyFilterDefinition<Q, LinkNames<Q>>\n | KeywordSearchFilterDefinition<Q>\n | CustomFilterDefinition<Q>;\n\n/**\n * Extract the key from a filter definition union\n */\nexport type FilterKey<Q extends ObjectTypeDefinition> =\n FilterDefinitionUnion<Q> extends infer D ? D extends { key: infer K } ? K\n : D extends { linkName: infer L } ? L\n : never\n : never;\n\n/**\n * Extract the filter state from a filter definition union\n */\nexport type FilterState<Q extends ObjectTypeDefinition> =\n FilterDefinitionUnion<Q> extends infer D\n ? D extends { filterState: infer S } ? S\n : never\n : never;\n\n/**\n * Map from filter definition objects to their current state.\n * Uses object identity for keys, ensuring stable lookups across reorders.\n */\nexport type FilterStatesMap<Q extends ObjectTypeDefinition> = Map<\n FilterDefinitionUnion<Q>,\n FilterStateType\n>;\n\nexport interface FilterListProps<Q extends ObjectTypeDefinition> {\n /**\n * The set of objects to be filtered\n */\n objectSet: ObjectSet<Q>;\n\n /**\n * Optional title to display in the filter list header\n */\n title?: string;\n\n /**\n * Optional icon to display next to the title\n */\n titleIcon?: React.ReactNode;\n\n /**\n * The definition for all supported filter items in the list\n * If not supplied, all filterable properties will be available\n */\n filterDefinitions?: Array<FilterDefinitionUnion<Q>>;\n\n /**\n * The current where clause to filter the objectSet.\n * If provided, the filter clause is controlled.\n */\n filterClause?: WhereClause<Q>;\n\n /**\n * Called when the filter clause changes.\n * The filters are joined by the selected filterOperator.\n * Required in controlled mode.\n *\n * @param newClause The updated filter clause\n */\n onFilterClauseChanged?: (newClause: WhereClause<Q>) => void;\n\n /**\n * The logical operator to join multiple filters\n *\n * @default \"and\"\n */\n filterOperator?: \"and\" | \"or\";\n\n /**\n * Called when filter state changes\n *\n * @param definition The filter definition whose state changed\n * @param newState The updated filter state\n */\n onFilterStateChanged?: (\n definition: FilterDefinitionUnion<Q>,\n newState: FilterStateType,\n ) => void;\n\n /**\n * Called when a filter is added\n * If provided, user will be allowed to add filters\n *\n * @param filterKey The key of the added filter\n * @param newDefinitions The filter list with the new filter added\n */\n onFilterAdded?: (\n filterKey: FilterKey<Q>,\n newDefinitions: Array<FilterDefinitionUnion<Q>>,\n ) => void;\n\n /**\n * Called when a filter is removed\n * If provided, user will be allowed to remove filters\n *\n * @param filterKey The key of the removed filter\n */\n onFilterRemoved?: (filterKey: FilterKey<Q>) => void;\n\n /**\n * Enable drag-and-drop reordering of filters.\n * When true, drag handles are rendered and filters can be reordered.\n * Reorder state is managed internally; consumers who need to track order\n * should use controlled filterDefinitions.\n */\n enableSorting?: boolean;\n\n /**\n * Show reset filters button in header\n */\n showResetButton?: boolean;\n\n /**\n * Called when reset button is clicked\n */\n onReset?: () => void;\n\n /**\n * Show count of active filters in header\n */\n showActiveFilterCount?: boolean;\n\n /**\n * Additional CSS class name\n */\n className?: string;\n\n /**\n * Custom render function for the \"Add filter\" button.\n * When not provided, a default button is shown if onFilterAdded is set.\n */\n renderAddFilterButton?: () => React.ReactNode;\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,51 @@
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 React from "react";
18
+ export function DragHandleIcon() {
19
+ return /*#__PURE__*/React.createElement("svg", {
20
+ width: "16",
21
+ height: "16",
22
+ viewBox: "0 0 16 16",
23
+ fill: "currentColor",
24
+ "aria-hidden": "true"
25
+ }, /*#__PURE__*/React.createElement("circle", {
26
+ cx: "5.5",
27
+ cy: "3.5",
28
+ r: "1.5"
29
+ }), /*#__PURE__*/React.createElement("circle", {
30
+ cx: "10.5",
31
+ cy: "3.5",
32
+ r: "1.5"
33
+ }), /*#__PURE__*/React.createElement("circle", {
34
+ cx: "5.5",
35
+ cy: "8",
36
+ r: "1.5"
37
+ }), /*#__PURE__*/React.createElement("circle", {
38
+ cx: "10.5",
39
+ cy: "8",
40
+ r: "1.5"
41
+ }), /*#__PURE__*/React.createElement("circle", {
42
+ cx: "5.5",
43
+ cy: "12.5",
44
+ r: "1.5"
45
+ }), /*#__PURE__*/React.createElement("circle", {
46
+ cx: "10.5",
47
+ cy: "12.5",
48
+ r: "1.5"
49
+ }));
50
+ }
51
+ //# sourceMappingURL=DragHandleIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DragHandleIcon.js","names":["React","DragHandleIcon","createElement","width","height","viewBox","fill","cx","cy","r"],"sources":["DragHandleIcon.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 React from \"react\";\n\nexport function DragHandleIcon(): React.ReactElement {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <circle cx=\"5.5\" cy=\"3.5\" r=\"1.5\" />\n <circle cx=\"10.5\" cy=\"3.5\" r=\"1.5\" />\n <circle cx=\"5.5\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"10.5\" cy=\"8\" r=\"1.5\" />\n <circle cx=\"5.5\" cy=\"12.5\" r=\"1.5\" />\n <circle cx=\"10.5\" cy=\"12.5\" r=\"1.5\" />\n </svg>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AAEzB,OAAO,SAASC,cAAcA,CAAA,EAAuB;EACnD,oBACED,KAAA,CAAAE,aAAA;IACEC,KAAK,EAAC,IAAI;IACVC,MAAM,EAAC,IAAI;IACXC,OAAO,EAAC,WAAW;IACnBC,IAAI,EAAC,cAAc;IACnB,eAAY;EAAM,gBAElBN,KAAA,CAAAE,aAAA;IAAQK,EAAE,EAAC,KAAK;IAACC,EAAE,EAAC,KAAK;IAACC,CAAC,EAAC;EAAK,CAAE,CAAC,eACpCT,KAAA,CAAAE,aAAA;IAAQK,EAAE,EAAC,MAAM;IAACC,EAAE,EAAC,KAAK;IAACC,CAAC,EAAC;EAAK,CAAE,CAAC,eACrCT,KAAA,CAAAE,aAAA;IAAQK,EAAE,EAAC,KAAK;IAACC,EAAE,EAAC,GAAG;IAACC,CAAC,EAAC;EAAK,CAAE,CAAC,eAClCT,KAAA,CAAAE,aAAA;IAAQK,EAAE,EAAC,MAAM;IAACC,EAAE,EAAC,GAAG;IAACC,CAAC,EAAC;EAAK,CAAE,CAAC,eACnCT,KAAA,CAAAE,aAAA;IAAQK,EAAE,EAAC,KAAK;IAACC,EAAE,EAAC,MAAM;IAACC,CAAC,EAAC;EAAK,CAAE,CAAC,eACrCT,KAAA,CAAAE,aAAA;IAAQK,EAAE,EAAC,MAAM;IAACC,EAAE,EAAC,MAAM;IAACC,CAAC,EAAC;EAAK,CAAE,CAClC,CAAC;AAEV","ignoreList":[]}
@@ -31,6 +31,7 @@ export function FilterList(props) {
31
31
  onReset,
32
32
  onFilterAdded,
33
33
  showActiveFilterCount = false,
34
+ enableSorting,
34
35
  className,
35
36
  renderAddFilterButton
36
37
  } = props;
@@ -66,7 +67,8 @@ export function FilterList(props) {
66
67
  filterDefinitions: visibleFilterDefinitions,
67
68
  filterStates: filterStates,
68
69
  onFilterStateChanged: setFilterState,
69
- whereClause: whereClause
70
+ whereClause: whereClause,
71
+ enableSorting: enableSorting
70
72
  }), (renderAddFilterButton != null || onFilterAdded != null) && /*#__PURE__*/React.createElement("div", {
71
73
  className: styles.addButtonContainer
72
74
  }, renderAddFilterButton ? renderAddFilterButton() : /*#__PURE__*/React.createElement(Button, {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterList.js","names":["Button","classnames","React","useCallback","useMemo","useFilterListState","styles","FilterListContent","FilterListHeader","FilterList","props","objectSet","title","titleIcon","filterDefinitions","showResetButton","onReset","onFilterAdded","showActiveFilterCount","className","renderAddFilterButton","objectType","$objectSetInternals","def","filterStates","setFilterState","whereClause","activeFilterCount","reset","handleReset","visibleFilterDefinitions","undefined","filter","isVisible","createElement","filterList","onFilterStateChanged","addButtonContainer","type","addButton"],"sources":["FilterList.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 type { ObjectTypeDefinition } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type {\n FilterDefinitionUnion,\n FilterListProps,\n} from \"../FilterListApi.js\";\nimport { useFilterListState } from \"../hooks/useFilterListState.js\";\nimport styles from \"./FilterList.module.css\";\nimport { FilterListContent } from \"./FilterListContent.js\";\nimport { FilterListHeader } from \"./FilterListHeader.js\";\n\nexport function FilterList<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): React.ReactElement {\n const {\n objectSet,\n title,\n titleIcon,\n filterDefinitions,\n showResetButton = false,\n onReset,\n onFilterAdded,\n showActiveFilterCount = false,\n className,\n renderAddFilterButton,\n } = props;\n\n const objectType = objectSet.$objectSetInternals.def;\n\n const {\n filterStates,\n setFilterState,\n whereClause,\n activeFilterCount,\n reset,\n } = useFilterListState(props);\n\n const handleReset = useCallback(() => {\n reset();\n onReset?.();\n }, [reset, onReset]);\n\n const visibleFilterDefinitions = useMemo(() => {\n if (!filterDefinitions) return undefined;\n return filterDefinitions.filter(\n (def: FilterDefinitionUnion<Q>) => def.isVisible !== false,\n );\n }, [filterDefinitions]);\n\n const showHeader = title || titleIcon || showResetButton\n || showActiveFilterCount;\n\n const showAddButton = renderAddFilterButton != null || onFilterAdded != null;\n\n return (\n <div\n className={classnames(styles.filterList, className)}\n data-active-count={activeFilterCount}\n >\n {showHeader && (\n <FilterListHeader\n title={title}\n titleIcon={titleIcon}\n showResetButton={showResetButton}\n onReset={handleReset}\n showActiveFilterCount={showActiveFilterCount}\n activeFilterCount={activeFilterCount}\n />\n )}\n\n <FilterListContent\n objectType={objectType}\n objectSet={objectSet}\n filterDefinitions={visibleFilterDefinitions}\n filterStates={filterStates}\n onFilterStateChanged={setFilterState}\n whereClause={whereClause}\n />\n\n {showAddButton && (\n <div className={styles.addButtonContainer}>\n {renderAddFilterButton\n ? renderAddFilterButton()\n : (\n <Button type=\"button\" className={styles.addButton}>\n + Add filter\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAE9C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAKnD,SAASC,kBAAkB,QAAQ,gCAAgC;AACnE,OAAOC,MAAM,MAAM,yBAAyB;AAC5C,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,SAASC,UAAUA,CACxBC,KAAyB,EACL;EACpB,MAAM;IACJC,SAAS;IACTC,KAAK;IACLC,SAAS;IACTC,iBAAiB;IACjBC,eAAe,GAAG,KAAK;IACvBC,OAAO;IACPC,aAAa;IACbC,qBAAqB,GAAG,KAAK;IAC7BC,SAAS;IACTC;EACF,CAAC,GAAGV,KAAK;EAET,MAAMW,UAAU,GAAGV,SAAS,CAACW,mBAAmB,CAACC,GAAG;EAEpD,MAAM;IACJC,YAAY;IACZC,cAAc;IACdC,WAAW;IACXC,iBAAiB;IACjBC;EACF,CAAC,GAAGvB,kBAAkB,CAACK,KAAK,CAAC;EAE7B,MAAMmB,WAAW,GAAG1B,WAAW,CAAC,MAAM;IACpCyB,KAAK,CAAC,CAAC;IACPZ,OAAO,GAAG,CAAC;EACb,CAAC,EAAE,CAACY,KAAK,EAAEZ,OAAO,CAAC,CAAC;EAEpB,MAAMc,wBAAwB,GAAG1B,OAAO,CAAC,MAAM;IAC7C,IAAI,CAACU,iBAAiB,EAAE,OAAOiB,SAAS;IACxC,OAAOjB,iBAAiB,CAACkB,MAAM,CAC5BT,GAA6B,IAAKA,GAAG,CAACU,SAAS,KAAK,KACvD,CAAC;EACH,CAAC,EAAE,CAACnB,iBAAiB,CAAC,CAAC;EAOvB,oBACEZ,KAAA,CAAAgC,aAAA;IACEf,SAAS,EAAElB,UAAU,CAACK,MAAM,CAAC6B,UAAU,EAAEhB,SAAS,CAAE;IACpD,qBAAmBQ;EAAkB,GAEpC,CAVcf,KAAK,IAAIC,SAAS,IAAIE,eAAe,IACnDG,qBAAqB,kBAUpBhB,KAAA,CAAAgC,aAAA,CAAC1B,gBAAgB;IACfI,KAAK,EAAEA,KAAM;IACbC,SAAS,EAAEA,SAAU;IACrBE,eAAe,EAAEA,eAAgB;IACjCC,OAAO,EAAEa,WAAY;IACrBX,qBAAqB,EAAEA,qBAAsB;IAC7CS,iBAAiB,EAAEA;EAAkB,CACtC,CACF,eAEDzB,KAAA,CAAAgC,aAAA,CAAC3B,iBAAiB;IAChBc,UAAU,EAAEA,UAAW;IACvBV,SAAS,EAAEA,SAAU;IACrBG,iBAAiB,EAAEgB,wBAAyB;IAC5CN,YAAY,EAAEA,YAAa;IAC3BY,oBAAoB,EAAEX,cAAe;IACrCC,WAAW,EAAEA;EAAY,CAC1B,CAAC,EAED,CA3BiBN,qBAAqB,IAAI,IAAI,IAAIH,aAAa,IAAI,IAAI,kBA4BtEf,KAAA,CAAAgC,aAAA;IAAKf,SAAS,EAAEb,MAAM,CAAC+B;EAAmB,GACvCjB,qBAAqB,GAClBA,qBAAqB,CAAC,CAAC,gBAEvBlB,KAAA,CAAAgC,aAAA,CAAClC,MAAM;IAACsC,IAAI,EAAC,QAAQ;IAACnB,SAAS,EAAEb,MAAM,CAACiC;EAAU,GAAC,cAE3C,CAET,CAEJ,CAAC;AAEV","ignoreList":[]}
1
+ {"version":3,"file":"FilterList.js","names":["Button","classnames","React","useCallback","useMemo","useFilterListState","styles","FilterListContent","FilterListHeader","FilterList","props","objectSet","title","titleIcon","filterDefinitions","showResetButton","onReset","onFilterAdded","showActiveFilterCount","enableSorting","className","renderAddFilterButton","objectType","$objectSetInternals","def","filterStates","setFilterState","whereClause","activeFilterCount","reset","handleReset","visibleFilterDefinitions","undefined","filter","isVisible","createElement","filterList","onFilterStateChanged","addButtonContainer","type","addButton"],"sources":["FilterList.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 type { ObjectTypeDefinition } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useMemo } from \"react\";\nimport type {\n FilterDefinitionUnion,\n FilterListProps,\n} from \"../FilterListApi.js\";\nimport { useFilterListState } from \"../hooks/useFilterListState.js\";\nimport styles from \"./FilterList.module.css\";\nimport { FilterListContent } from \"./FilterListContent.js\";\nimport { FilterListHeader } from \"./FilterListHeader.js\";\n\nexport function FilterList<Q extends ObjectTypeDefinition>(\n props: FilterListProps<Q>,\n): React.ReactElement {\n const {\n objectSet,\n title,\n titleIcon,\n filterDefinitions,\n showResetButton = false,\n onReset,\n onFilterAdded,\n showActiveFilterCount = false,\n enableSorting,\n className,\n renderAddFilterButton,\n } = props;\n\n const objectType = objectSet.$objectSetInternals.def;\n\n const {\n filterStates,\n setFilterState,\n whereClause,\n activeFilterCount,\n reset,\n } = useFilterListState(props);\n\n const handleReset = useCallback(() => {\n reset();\n onReset?.();\n }, [reset, onReset]);\n\n const visibleFilterDefinitions = useMemo(() => {\n if (!filterDefinitions) return undefined;\n return filterDefinitions.filter(\n (def: FilterDefinitionUnion<Q>) => def.isVisible !== false,\n );\n }, [filterDefinitions]);\n\n const showHeader = title || titleIcon || showResetButton\n || showActiveFilterCount;\n\n const showAddButton = renderAddFilterButton != null || onFilterAdded != null;\n\n return (\n <div\n className={classnames(styles.filterList, className)}\n data-active-count={activeFilterCount}\n >\n {showHeader && (\n <FilterListHeader\n title={title}\n titleIcon={titleIcon}\n showResetButton={showResetButton}\n onReset={handleReset}\n showActiveFilterCount={showActiveFilterCount}\n activeFilterCount={activeFilterCount}\n />\n )}\n\n <FilterListContent\n objectType={objectType}\n objectSet={objectSet}\n filterDefinitions={visibleFilterDefinitions}\n filterStates={filterStates}\n onFilterStateChanged={setFilterState}\n whereClause={whereClause}\n enableSorting={enableSorting}\n />\n\n {showAddButton && (\n <div className={styles.addButtonContainer}>\n {renderAddFilterButton\n ? renderAddFilterButton()\n : (\n <Button type=\"button\" className={styles.addButton}>\n + Add filter\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,MAAM,QAAQ,uBAAuB;AAE9C,OAAOC,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,QAAQ,OAAO;AAKnD,SAASC,kBAAkB,QAAQ,gCAAgC;AACnE,OAAOC,MAAM,MAAM,yBAAyB;AAC5C,SAASC,iBAAiB,QAAQ,wBAAwB;AAC1D,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,OAAO,SAASC,UAAUA,CACxBC,KAAyB,EACL;EACpB,MAAM;IACJC,SAAS;IACTC,KAAK;IACLC,SAAS;IACTC,iBAAiB;IACjBC,eAAe,GAAG,KAAK;IACvBC,OAAO;IACPC,aAAa;IACbC,qBAAqB,GAAG,KAAK;IAC7BC,aAAa;IACbC,SAAS;IACTC;EACF,CAAC,GAAGX,KAAK;EAET,MAAMY,UAAU,GAAGX,SAAS,CAACY,mBAAmB,CAACC,GAAG;EAEpD,MAAM;IACJC,YAAY;IACZC,cAAc;IACdC,WAAW;IACXC,iBAAiB;IACjBC;EACF,CAAC,GAAGxB,kBAAkB,CAACK,KAAK,CAAC;EAE7B,MAAMoB,WAAW,GAAG3B,WAAW,CAAC,MAAM;IACpC0B,KAAK,CAAC,CAAC;IACPb,OAAO,GAAG,CAAC;EACb,CAAC,EAAE,CAACa,KAAK,EAAEb,OAAO,CAAC,CAAC;EAEpB,MAAMe,wBAAwB,GAAG3B,OAAO,CAAC,MAAM;IAC7C,IAAI,CAACU,iBAAiB,EAAE,OAAOkB,SAAS;IACxC,OAAOlB,iBAAiB,CAACmB,MAAM,CAC5BT,GAA6B,IAAKA,GAAG,CAACU,SAAS,KAAK,KACvD,CAAC;EACH,CAAC,EAAE,CAACpB,iBAAiB,CAAC,CAAC;EAOvB,oBACEZ,KAAA,CAAAiC,aAAA;IACEf,SAAS,EAAEnB,UAAU,CAACK,MAAM,CAAC8B,UAAU,EAAEhB,SAAS,CAAE;IACpD,qBAAmBQ;EAAkB,GAEpC,CAVchB,KAAK,IAAIC,SAAS,IAAIE,eAAe,IACnDG,qBAAqB,kBAUpBhB,KAAA,CAAAiC,aAAA,CAAC3B,gBAAgB;IACfI,KAAK,EAAEA,KAAM;IACbC,SAAS,EAAEA,SAAU;IACrBE,eAAe,EAAEA,eAAgB;IACjCC,OAAO,EAAEc,WAAY;IACrBZ,qBAAqB,EAAEA,qBAAsB;IAC7CU,iBAAiB,EAAEA;EAAkB,CACtC,CACF,eAED1B,KAAA,CAAAiC,aAAA,CAAC5B,iBAAiB;IAChBe,UAAU,EAAEA,UAAW;IACvBX,SAAS,EAAEA,SAAU;IACrBG,iBAAiB,EAAEiB,wBAAyB;IAC5CN,YAAY,EAAEA,YAAa;IAC3BY,oBAAoB,EAAEX,cAAe;IACrCC,WAAW,EAAEA,WAAY;IACzBR,aAAa,EAAEA;EAAc,CAC9B,CAAC,EAED,CA5BiBE,qBAAqB,IAAI,IAAI,IAAIJ,aAAa,IAAI,IAAI,kBA6BtEf,KAAA,CAAAiC,aAAA;IAAKf,SAAS,EAAEd,MAAM,CAACgC;EAAmB,GACvCjB,qBAAqB,GAClBA,qBAAqB,CAAC,CAAC,gBAEvBnB,KAAA,CAAAiC,aAAA,CAACnC,MAAM;IAACuC,IAAI,EAAC,QAAQ;IAACnB,SAAS,EAAEd,MAAM,CAACkC;EAAU,GAAC,cAE3C,CAET,CAEJ,CAAC;AAEV","ignoreList":[]}
@@ -14,11 +14,25 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import { closestCenter, DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors } from "@dnd-kit/core";
18
+ import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy } from "@dnd-kit/sortable";
17
19
  import classnames from "classnames";
18
- import React from "react";
20
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
19
21
  import { getFilterKey } from "../utils/getFilterKey.js";
22
+ import { getFilterLabel } from "../utils/getFilterLabel.js";
20
23
  import styles from "./FilterListContent.module.css.js";
21
24
  import { FilterListItem } from "./FilterListItem.js";
25
+ import { SortableFilterListItem } from "./SortableFilterListItem.js";
26
+ const restrictToVerticalAxis = ({
27
+ transform
28
+ }) => ({
29
+ ...transform,
30
+ x: 0
31
+ });
32
+ const POINTER_ACTIVATION_CONSTRAINT = {
33
+ distance: 8
34
+ };
35
+ const MODIFIERS = [restrictToVerticalAxis];
22
36
  export function FilterListContent({
23
37
  objectType,
24
38
  objectSet,
@@ -26,20 +40,146 @@ export function FilterListContent({
26
40
  filterStates,
27
41
  onFilterStateChanged,
28
42
  whereClause,
43
+ enableSorting,
29
44
  className,
30
45
  style
31
46
  }) {
32
- if (!filterDefinitions || filterDefinitions.length === 0) {
47
+ const [internalOrder, setInternalOrder] = useState(() => filterDefinitions ?? []);
48
+ const [activeId, setActiveId] = useState(null);
49
+ useEffect(() => {
50
+ if (filterDefinitions) {
51
+ setInternalOrder(filterDefinitions);
52
+ }
53
+ }, [filterDefinitions]);
54
+ const renderDefinitions = enableSorting ? internalOrder : filterDefinitions;
55
+ const sortableIds = useMemo(() => enableSorting ? internalOrder.map(def => getFilterKey(def)) : [], [enableSorting, internalOrder]);
56
+ const pointerSensor = useSensor(PointerSensor, {
57
+ activationConstraint: POINTER_ACTIVATION_CONSTRAINT
58
+ });
59
+ const keyboardSensor = useSensor(KeyboardSensor, {
60
+ coordinateGetter: sortableKeyboardCoordinates
61
+ });
62
+ const sensors = useSensors(pointerSensor, keyboardSensor);
63
+ const activeIndex = activeId != null ? sortableIds.indexOf(String(activeId)) : -1;
64
+ const activeDefinition = activeIndex >= 0 ? internalOrder[activeIndex] : undefined;
65
+ const activeFilterKey = useMemo(() => activeDefinition ? getFilterKey(activeDefinition) : undefined, [activeDefinition]);
66
+ const handleDragStart = useCallback(event => {
67
+ setActiveId(event.active.id);
68
+ }, []);
69
+ const handleDragEnd = useCallback(event => {
70
+ setActiveId(null);
71
+ const {
72
+ active,
73
+ over
74
+ } = event;
75
+ if (!over || active.id === over.id) {
76
+ return;
77
+ }
78
+ const oldIndex = sortableIds.indexOf(String(active.id));
79
+ const newIndex = sortableIds.indexOf(String(over.id));
80
+ if (oldIndex !== -1 && newIndex !== -1) {
81
+ setInternalOrder(arrayMove(internalOrder, oldIndex, newIndex));
82
+ }
83
+ }, [internalOrder, sortableIds]);
84
+ const handleDragCancel = useCallback(() => {
85
+ setActiveId(null);
86
+ }, []);
87
+ const announcements = useMemo(() => ({
88
+ onDragStart({
89
+ active
90
+ }) {
91
+ const idx = sortableIds.indexOf(String(active.id));
92
+ const def = idx >= 0 ? internalOrder[idx] : undefined;
93
+ const label = def ? getFilterLabel(def) : "filter";
94
+ return `Picked up ${label} filter`;
95
+ },
96
+ onDragOver({
97
+ over
98
+ }) {
99
+ if (!over) {
100
+ return "Not over a droppable area";
101
+ }
102
+ const overIdx = sortableIds.indexOf(String(over.id));
103
+ return `Moved to position ${overIdx + 1} of ${sortableIds.length}`;
104
+ },
105
+ onDragEnd({
106
+ active,
107
+ over
108
+ }) {
109
+ const idx = sortableIds.indexOf(String(active.id));
110
+ const def = idx >= 0 ? internalOrder[idx] : undefined;
111
+ const label = def ? getFilterLabel(def) : "filter";
112
+ if (over && active.id !== over.id) {
113
+ const overIdx = sortableIds.indexOf(String(over.id));
114
+ return `Dropped ${label} filter at position ${overIdx + 1}`;
115
+ }
116
+ return `Dropped ${label} filter back in its original position`;
117
+ },
118
+ onDragCancel({
119
+ active
120
+ }) {
121
+ const idx = sortableIds.indexOf(String(active.id));
122
+ const def = idx >= 0 ? internalOrder[idx] : undefined;
123
+ const label = def ? getFilterLabel(def) : "filter";
124
+ return `Cancelled dragging ${label} filter`;
125
+ }
126
+ }), [internalOrder, sortableIds]);
127
+ if (!renderDefinitions || renderDefinitions.length === 0) {
33
128
  return /*#__PURE__*/React.createElement("div", {
34
129
  className: classnames(styles.content, className),
35
130
  style: style,
36
131
  "data-empty": "true"
37
132
  });
38
133
  }
134
+ if (enableSorting) {
135
+ return /*#__PURE__*/React.createElement("div", {
136
+ className: classnames(styles.content, className),
137
+ style: style
138
+ }, /*#__PURE__*/React.createElement(DndContext, {
139
+ sensors: sensors,
140
+ collisionDetection: closestCenter,
141
+ modifiers: MODIFIERS,
142
+ onDragStart: handleDragStart,
143
+ onDragEnd: handleDragEnd,
144
+ onDragCancel: handleDragCancel,
145
+ accessibility: {
146
+ announcements
147
+ }
148
+ }, /*#__PURE__*/React.createElement(SortableContext, {
149
+ items: sortableIds,
150
+ strategy: verticalListSortingStrategy
151
+ }, internalOrder.map((definition, index) => {
152
+ const id = sortableIds[index];
153
+ const filterKey = getFilterKey(definition);
154
+ const state = filterStates.get(filterKey);
155
+ return /*#__PURE__*/React.createElement(SortableFilterListItem, {
156
+ key: id,
157
+ id: id,
158
+ objectType: objectType,
159
+ objectSet: objectSet,
160
+ definition: definition,
161
+ filterKey: filterKey,
162
+ filterState: state,
163
+ onFilterStateChanged: onFilterStateChanged,
164
+ whereClause: whereClause
165
+ });
166
+ })), /*#__PURE__*/React.createElement(DragOverlay, {
167
+ dropAnimation: null,
168
+ className: styles.dragOverlay
169
+ }, activeDefinition && activeFilterKey && /*#__PURE__*/React.createElement(FilterListItem, {
170
+ objectType: objectType,
171
+ objectSet: objectSet,
172
+ definition: activeDefinition,
173
+ filterKey: activeFilterKey,
174
+ filterState: filterStates.get(activeFilterKey),
175
+ onFilterStateChanged: onFilterStateChanged,
176
+ whereClause: whereClause
177
+ }))));
178
+ }
39
179
  return /*#__PURE__*/React.createElement("div", {
40
180
  className: classnames(styles.content, className),
41
181
  style: style
42
- }, filterDefinitions.map(definition => {
182
+ }, renderDefinitions.map(definition => {
43
183
  const filterKey = getFilterKey(definition);
44
184
  const state = filterStates.get(filterKey);
45
185
  return /*#__PURE__*/React.createElement(FilterListItem, {
@@ -1 +1 @@
1
- {"version":3,"file":"FilterListContent.js","names":["classnames","React","getFilterKey","styles","FilterListItem","FilterListContent","objectType","objectSet","filterDefinitions","filterStates","onFilterStateChanged","whereClause","className","style","length","createElement","content","map","definition","filterKey","state","get","key","filterState"],"sources":["FilterListContent.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 { ObjectSet, ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React from \"react\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\nimport styles from \"./FilterListContent.module.css\";\nimport { FilterListItem } from \"./FilterListItem.js\";\n\ninterface FilterListContentProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet: ObjectSet<Q>;\n filterDefinitions?: Array<FilterDefinitionUnion<Q>>;\n filterStates: Map<string, FilterState>;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n whereClause: WhereClause<Q>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function FilterListContent<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n filterDefinitions,\n filterStates,\n onFilterStateChanged,\n whereClause,\n className,\n style,\n}: FilterListContentProps<Q>): React.ReactElement {\n if (!filterDefinitions || filterDefinitions.length === 0) {\n return (\n <div\n className={classnames(styles.content, className)}\n style={style}\n data-empty=\"true\"\n />\n );\n }\n\n return (\n <div\n className={classnames(styles.content, className)}\n style={style}\n >\n {filterDefinitions.map((definition, index) => {\n const filterKey = getFilterKey(definition);\n const state = filterStates.get(filterKey);\n\n return (\n <FilterListItem\n key={filterKey}\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterKey={filterKey}\n filterState={state}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n />\n );\n })}\n </div>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,MAAM,OAAO;AAGzB,SAASC,YAAY,QAAQ,0BAA0B;AACvD,OAAOC,MAAM,MAAM,gCAAgC;AACnD,SAASC,cAAc,QAAQ,qBAAqB;AAgBpD,OAAO,SAASC,iBAAiBA,CAAiC;EAChEC,UAAU;EACVC,SAAS;EACTC,iBAAiB;EACjBC,YAAY;EACZC,oBAAoB;EACpBC,WAAW;EACXC,SAAS;EACTC;AACyB,CAAC,EAAsB;EAChD,IAAI,CAACL,iBAAiB,IAAIA,iBAAiB,CAACM,MAAM,KAAK,CAAC,EAAE;IACxD,oBACEb,KAAA,CAAAc,aAAA;MACEH,SAAS,EAAEZ,UAAU,CAACG,MAAM,CAACa,OAAO,EAAEJ,SAAS,CAAE;MACjDC,KAAK,EAAEA,KAAM;MACb,cAAW;IAAM,CAClB,CAAC;EAEN;EAEA,oBACEZ,KAAA,CAAAc,aAAA;IACEH,SAAS,EAAEZ,UAAU,CAACG,MAAM,CAACa,OAAO,EAAEJ,SAAS,CAAE;IACjDC,KAAK,EAAEA;EAAM,GAEZL,iBAAiB,CAACS,GAAG,CAAEC,UAAU,IAAY;IAC5C,MAAMC,SAAS,GAAGjB,YAAY,CAACgB,UAAU,CAAC;IAC1C,MAAME,KAAK,GAAGX,YAAY,CAACY,GAAG,CAACF,SAAS,CAAC;IAEzC,oBACElB,KAAA,CAAAc,aAAA,CAACX,cAAc;MACbkB,GAAG,EAAEH,SAAU;MACfb,UAAU,EAAEA,UAAW;MACvBC,SAAS,EAAEA,SAAU;MACrBW,UAAU,EAAEA,UAAW;MACvBC,SAAS,EAAEA,SAAU;MACrBI,WAAW,EAAEH,KAAM;MACnBV,oBAAoB,EAAEA,oBAAqB;MAC3CC,WAAW,EAAEA;IAAY,CAC1B,CAAC;EAEN,CAAC,CACE,CAAC;AAEV","ignoreList":[]}
1
+ {"version":3,"file":"FilterListContent.js","names":["closestCenter","DndContext","DragOverlay","KeyboardSensor","PointerSensor","useSensor","useSensors","arrayMove","SortableContext","sortableKeyboardCoordinates","verticalListSortingStrategy","classnames","React","useCallback","useEffect","useMemo","useState","getFilterKey","getFilterLabel","styles","FilterListItem","SortableFilterListItem","restrictToVerticalAxis","transform","x","POINTER_ACTIVATION_CONSTRAINT","distance","MODIFIERS","FilterListContent","objectType","objectSet","filterDefinitions","filterStates","onFilterStateChanged","whereClause","enableSorting","className","style","internalOrder","setInternalOrder","activeId","setActiveId","renderDefinitions","sortableIds","map","def","pointerSensor","activationConstraint","keyboardSensor","coordinateGetter","sensors","activeIndex","indexOf","String","activeDefinition","undefined","activeFilterKey","handleDragStart","event","active","id","handleDragEnd","over","oldIndex","newIndex","handleDragCancel","announcements","onDragStart","idx","label","onDragOver","overIdx","length","onDragEnd","onDragCancel","createElement","content","collisionDetection","modifiers","accessibility","items","strategy","definition","index","filterKey","state","get","key","filterState","dropAnimation","dragOverlay"],"sources":["FilterListContent.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 Announcements,\n DragEndEvent,\n DragStartEvent,\n Modifier,\n UniqueIdentifier,\n} from \"@dnd-kit/core\";\nimport {\n closestCenter,\n DndContext,\n DragOverlay,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from \"@dnd-kit/sortable\";\nimport type { ObjectSet, ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { getFilterKey } from \"../utils/getFilterKey.js\";\nimport { getFilterLabel } from \"../utils/getFilterLabel.js\";\nimport styles from \"./FilterListContent.module.css\";\nimport { FilterListItem } from \"./FilterListItem.js\";\nimport { SortableFilterListItem } from \"./SortableFilterListItem.js\";\n\nconst restrictToVerticalAxis: Modifier = ({ transform }) => ({\n ...transform,\n x: 0,\n});\n\nconst POINTER_ACTIVATION_CONSTRAINT = { distance: 8 } as const;\nconst MODIFIERS: Modifier[] = [restrictToVerticalAxis];\n\ninterface FilterListContentProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet: ObjectSet<Q>;\n filterDefinitions?: Array<FilterDefinitionUnion<Q>>;\n filterStates: Map<string, FilterState>;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n whereClause: WhereClause<Q>;\n enableSorting?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function FilterListContent<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n filterDefinitions,\n filterStates,\n onFilterStateChanged,\n whereClause,\n enableSorting,\n className,\n style,\n}: FilterListContentProps<Q>): React.ReactElement {\n const [internalOrder, setInternalOrder] = useState<\n Array<FilterDefinitionUnion<Q>>\n >(() => filterDefinitions ?? []);\n const [activeId, setActiveId] = useState<UniqueIdentifier | null>(null);\n\n useEffect(() => {\n if (filterDefinitions) {\n setInternalOrder(filterDefinitions);\n }\n }, [filterDefinitions]);\n\n const renderDefinitions = enableSorting ? internalOrder : filterDefinitions;\n\n const sortableIds = useMemo(\n () =>\n enableSorting\n ? internalOrder.map((def) => getFilterKey(def))\n : [],\n [enableSorting, internalOrder],\n );\n\n const pointerSensor = useSensor(PointerSensor, {\n activationConstraint: POINTER_ACTIVATION_CONSTRAINT,\n });\n const keyboardSensor = useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n });\n const sensors = useSensors(pointerSensor, keyboardSensor);\n\n const activeIndex = activeId != null\n ? sortableIds.indexOf(String(activeId))\n : -1;\n const activeDefinition = activeIndex >= 0\n ? internalOrder[activeIndex]\n : undefined;\n\n const activeFilterKey = useMemo(\n () => activeDefinition ? getFilterKey(activeDefinition) : undefined,\n [activeDefinition],\n );\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n setActiveId(event.active.id);\n }, []);\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n setActiveId(null);\n const { active, over } = event;\n if (!over || active.id === over.id) {\n return;\n }\n const oldIndex = sortableIds.indexOf(String(active.id));\n const newIndex = sortableIds.indexOf(String(over.id));\n if (oldIndex !== -1 && newIndex !== -1) {\n setInternalOrder(arrayMove(internalOrder, oldIndex, newIndex));\n }\n },\n [internalOrder, sortableIds],\n );\n\n const handleDragCancel = useCallback(() => {\n setActiveId(null);\n }, []);\n\n const announcements = useMemo<Announcements>(\n () => ({\n onDragStart({ active }) {\n const idx = sortableIds.indexOf(String(active.id));\n const def = idx >= 0 ? internalOrder[idx] : undefined;\n const label = def ? getFilterLabel(def) : \"filter\";\n return `Picked up ${label} filter`;\n },\n onDragOver({ over }) {\n if (!over) {\n return \"Not over a droppable area\";\n }\n const overIdx = sortableIds.indexOf(String(over.id));\n return `Moved to position ${overIdx + 1} of ${sortableIds.length}`;\n },\n onDragEnd({ active, over }) {\n const idx = sortableIds.indexOf(String(active.id));\n const def = idx >= 0 ? internalOrder[idx] : undefined;\n const label = def ? getFilterLabel(def) : \"filter\";\n if (over && active.id !== over.id) {\n const overIdx = sortableIds.indexOf(String(over.id));\n return `Dropped ${label} filter at position ${overIdx + 1}`;\n }\n return `Dropped ${label} filter back in its original position`;\n },\n onDragCancel({ active }) {\n const idx = sortableIds.indexOf(String(active.id));\n const def = idx >= 0 ? internalOrder[idx] : undefined;\n const label = def ? getFilterLabel(def) : \"filter\";\n return `Cancelled dragging ${label} filter`;\n },\n }),\n [internalOrder, sortableIds],\n );\n\n if (!renderDefinitions || renderDefinitions.length === 0) {\n return (\n <div\n className={classnames(styles.content, className)}\n style={style}\n data-empty=\"true\"\n />\n );\n }\n\n if (enableSorting) {\n return (\n <div\n className={classnames(styles.content, className)}\n style={style}\n >\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n modifiers={MODIFIERS}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n accessibility={{ announcements }}\n >\n <SortableContext\n items={sortableIds}\n strategy={verticalListSortingStrategy}\n >\n {internalOrder.map((definition, index) => {\n const id = sortableIds[index];\n const filterKey = getFilterKey(definition);\n const state = filterStates.get(filterKey);\n\n return (\n <SortableFilterListItem\n key={id}\n id={id}\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterKey={filterKey}\n filterState={state}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n />\n );\n })}\n </SortableContext>\n\n <DragOverlay\n dropAnimation={null}\n className={styles.dragOverlay}\n >\n {activeDefinition && activeFilterKey && (\n <FilterListItem\n objectType={objectType}\n objectSet={objectSet}\n definition={activeDefinition}\n filterKey={activeFilterKey}\n filterState={filterStates.get(activeFilterKey)}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n />\n )}\n </DragOverlay>\n </DndContext>\n </div>\n );\n }\n\n return (\n <div\n className={classnames(styles.content, className)}\n style={style}\n >\n {renderDefinitions.map((definition) => {\n const filterKey = getFilterKey(definition);\n const state = filterStates.get(filterKey);\n\n return (\n <FilterListItem\n key={filterKey}\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterKey={filterKey}\n filterState={state}\n onFilterStateChanged={onFilterStateChanged}\n whereClause={whereClause}\n />\n );\n })}\n </div>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -25,3 +25,9 @@
25
25
  color: var(--osdk-filter-list-empty-text-color);
26
26
  font-size: var(--osdk-filter-list-empty-font-size);
27
27
  }
28
+
29
+ .dragOverlay {
30
+ box-shadow: var(--osdk-filter-item-drag-overlay-shadow);
31
+ border-radius: var(--osdk-filter-item-drag-overlay-border-radius);
32
+ background: var(--osdk-filter-item-drag-overlay-bg);
33
+ }
@@ -1,7 +1,8 @@
1
1
  // CSS Module proxy for FilterListContent.module.css
2
2
  const styles = {
3
3
  "content": "FilterListContent-module__content___fG0EgVp6",
4
- "emptyMessage": "FilterListContent-module__emptyMessage___9wdgSE9W"
4
+ "emptyMessage": "FilterListContent-module__emptyMessage___9wdgSE9W",
5
+ "dragOverlay": "FilterListContent-module__dragOverlay___Tjd1YpmI"
5
6
  };
6
7
 
7
8
  export default styles;
@@ -1,3 +1,4 @@
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
1
2
  /*
2
3
  * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
3
4
  *
@@ -17,6 +18,8 @@
17
18
  import classnames from "classnames";
18
19
  import React, { memo, useCallback } from "react";
19
20
  import { ErrorBoundary } from "../../shared/ErrorBoundary.js";
21
+ import { getFilterLabel } from "../utils/getFilterLabel.js";
22
+ import { DragHandleIcon } from "./DragHandleIcon.js";
20
23
  import { FilterInput } from "./FilterInput.js";
21
24
  import styles from "./FilterListItem.module.css.js";
22
25
  function FilterListItemInner({
@@ -27,10 +30,12 @@ function FilterListItemInner({
27
30
  filterState,
28
31
  onFilterStateChanged,
29
32
  whereClause,
33
+ dragHandleAttributes,
34
+ dragHandleListeners,
30
35
  className,
31
36
  style
32
37
  }) {
33
- const label = getLabel(definition);
38
+ const label = getFilterLabel(definition);
34
39
  const handleFilterStateChanged = useCallback(newState => {
35
40
  onFilterStateChanged(filterKey, newState);
36
41
  }, [filterKey, onFilterStateChanged]);
@@ -40,7 +45,11 @@ function FilterListItemInner({
40
45
  "data-filter-type": definition.type
41
46
  }, /*#__PURE__*/React.createElement("div", {
42
47
  className: styles.itemHeader
43
- }, /*#__PURE__*/React.createElement("span", {
48
+ }, dragHandleAttributes && /*#__PURE__*/React.createElement("button", _extends({
49
+ type: "button",
50
+ className: styles.dragHandle,
51
+ "aria-label": `Reorder ${label}`
52
+ }, dragHandleAttributes, dragHandleListeners), /*#__PURE__*/React.createElement(DragHandleIcon, null)), /*#__PURE__*/React.createElement("span", {
44
53
  className: styles.itemLabel
45
54
  }, label)), /*#__PURE__*/React.createElement("div", {
46
55
  className: styles.itemContent
@@ -56,20 +65,4 @@ function FilterListItemInner({
56
65
  }))));
57
66
  }
58
67
  export const FilterListItem = /*#__PURE__*/memo(FilterListItemInner);
59
- function getLabel(definition) {
60
- if ("label" in definition && definition.label) {
61
- return definition.label;
62
- }
63
- switch (definition.type) {
64
- case "PROPERTY":
65
- return definition.key;
66
- case "HAS_LINK":
67
- case "LINKED_PROPERTY":
68
- return definition.linkName;
69
- case "KEYWORD_SEARCH":
70
- return "Search";
71
- case "CUSTOM":
72
- return definition.key;
73
- }
74
- }
75
68
  //# sourceMappingURL=FilterListItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterListItem.js","names":["classnames","React","memo","useCallback","ErrorBoundary","FilterInput","styles","FilterListItemInner","objectType","objectSet","definition","filterKey","filterState","onFilterStateChanged","whereClause","className","style","label","getLabel","handleFilterStateChanged","newState","createElement","filterItem","type","itemHeader","itemLabel","itemContent","errorMessage","FilterListItem","key","linkName"],"sources":["FilterListItem.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 { ObjectSet, ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { ErrorBoundary } from \"../../shared/ErrorBoundary.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { FilterInput } from \"./FilterInput.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface FilterListItemProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet: ObjectSet<Q>;\n definition: FilterDefinitionUnion<Q>;\n filterKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n whereClause: WhereClause<Q>;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction FilterListItemInner<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n definition,\n filterKey,\n filterState,\n onFilterStateChanged,\n whereClause,\n className,\n style,\n}: FilterListItemProps<Q>): React.ReactElement {\n const label = getLabel(definition);\n\n const handleFilterStateChanged = useCallback(\n (newState: FilterState) => {\n onFilterStateChanged(filterKey, newState);\n },\n [filterKey, onFilterStateChanged],\n );\n\n return (\n <div\n className={classnames(styles.filterItem, className)}\n style={style}\n data-filter-type={definition.type}\n >\n <div className={styles.itemHeader}>\n <span className={styles.itemLabel}>{label}</span>\n </div>\n\n <div className={styles.itemContent}>\n <ErrorBoundary errorMessage=\"Error loading filter\">\n <FilterInput\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={handleFilterStateChanged}\n whereClause={whereClause}\n />\n </ErrorBoundary>\n </div>\n </div>\n );\n}\n\nexport const FilterListItem = memo(\n FilterListItemInner,\n) as typeof FilterListItemInner;\n\nfunction getLabel<Q extends ObjectTypeDefinition>(\n definition: FilterDefinitionUnion<Q>,\n): string {\n if (\"label\" in definition && definition.label) {\n return definition.label;\n }\n\n switch (definition.type) {\n case \"PROPERTY\":\n return definition.key;\n case \"HAS_LINK\":\n case \"LINKED_PROPERTY\":\n return definition.linkName;\n case \"KEYWORD_SEARCH\":\n return \"Search\";\n case \"CUSTOM\":\n return definition.key;\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,aAAa,QAAQ,+BAA+B;AAG7D,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,OAAOC,MAAM,MAAM,6BAA6B;AAiBhD,SAASC,mBAAmBA,CAAiC;EAC3DC,UAAU;EACVC,SAAS;EACTC,UAAU;EACVC,SAAS;EACTC,WAAW;EACXC,oBAAoB;EACpBC,WAAW;EACXC,SAAS;EACTC;AACsB,CAAC,EAAsB;EAC7C,MAAMC,KAAK,GAAGC,QAAQ,CAACR,UAAU,CAAC;EAElC,MAAMS,wBAAwB,GAAGhB,WAAW,CACzCiB,QAAqB,IAAK;IACzBP,oBAAoB,CAACF,SAAS,EAAES,QAAQ,CAAC;EAC3C,CAAC,EACD,CAACT,SAAS,EAAEE,oBAAoB,CAClC,CAAC;EAED,oBACEZ,KAAA,CAAAoB,aAAA;IACEN,SAAS,EAAEf,UAAU,CAACM,MAAM,CAACgB,UAAU,EAAEP,SAAS,CAAE;IACpDC,KAAK,EAAEA,KAAM;IACb,oBAAkBN,UAAU,CAACa;EAAK,gBAElCtB,KAAA,CAAAoB,aAAA;IAAKN,SAAS,EAAET,MAAM,CAACkB;EAAW,gBAChCvB,KAAA,CAAAoB,aAAA;IAAMN,SAAS,EAAET,MAAM,CAACmB;EAAU,GAAER,KAAY,CAC7C,CAAC,eAENhB,KAAA,CAAAoB,aAAA;IAAKN,SAAS,EAAET,MAAM,CAACoB;EAAY,gBACjCzB,KAAA,CAAAoB,aAAA,CAACjB,aAAa;IAACuB,YAAY,EAAC;EAAsB,gBAChD1B,KAAA,CAAAoB,aAAA,CAAChB,WAAW;IACVG,UAAU,EAAEA,UAAW;IACvBC,SAAS,EAAEA,SAAU;IACrBC,UAAU,EAAEA,UAAW;IACvBE,WAAW,EAAEA,WAAY;IACzBC,oBAAoB,EAAEM,wBAAyB;IAC/CL,WAAW,EAAEA;EAAY,CAC1B,CACY,CACZ,CACF,CAAC;AAEV;AAEA,OAAO,MAAMc,cAAc,gBAAG1B,IAAI,CAChCK,mBACF,CAA+B;AAE/B,SAASW,QAAQA,CACfR,UAAoC,EAC5B;EACR,IAAI,OAAO,IAAIA,UAAU,IAAIA,UAAU,CAACO,KAAK,EAAE;IAC7C,OAAOP,UAAU,CAACO,KAAK;EACzB;EAEA,QAAQP,UAAU,CAACa,IAAI;IACrB,KAAK,UAAU;MACb,OAAOb,UAAU,CAACmB,GAAG;IACvB,KAAK,UAAU;IACf,KAAK,iBAAiB;MACpB,OAAOnB,UAAU,CAACoB,QAAQ;IAC5B,KAAK,gBAAgB;MACnB,OAAO,QAAQ;IACjB,KAAK,QAAQ;MACX,OAAOpB,UAAU,CAACmB,GAAG;EACzB;AACF","ignoreList":[]}
1
+ {"version":3,"file":"FilterListItem.js","names":["classnames","React","memo","useCallback","ErrorBoundary","getFilterLabel","DragHandleIcon","FilterInput","styles","FilterListItemInner","objectType","objectSet","definition","filterKey","filterState","onFilterStateChanged","whereClause","dragHandleAttributes","dragHandleListeners","className","style","label","handleFilterStateChanged","newState","createElement","filterItem","type","itemHeader","_extends","dragHandle","itemLabel","itemContent","errorMessage","FilterListItem"],"sources":["FilterListItem.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 DraggableAttributes,\n DraggableSyntheticListeners,\n} from \"@dnd-kit/core\";\nimport type { ObjectSet, ObjectTypeDefinition, WhereClause } from \"@osdk/api\";\nimport classnames from \"classnames\";\nimport React, { memo, useCallback } from \"react\";\nimport { ErrorBoundary } from \"../../shared/ErrorBoundary.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { getFilterLabel } from \"../utils/getFilterLabel.js\";\nimport { DragHandleIcon } from \"./DragHandleIcon.js\";\nimport { FilterInput } from \"./FilterInput.js\";\nimport styles from \"./FilterListItem.module.css\";\n\ninterface FilterListItemProps<Q extends ObjectTypeDefinition> {\n objectType: Q;\n objectSet: ObjectSet<Q>;\n definition: FilterDefinitionUnion<Q>;\n filterKey: string;\n filterState: FilterState | undefined;\n onFilterStateChanged: (\n filterKey: string,\n state: FilterState,\n ) => void;\n whereClause: WhereClause<Q>;\n dragHandleAttributes?: DraggableAttributes;\n dragHandleListeners?: DraggableSyntheticListeners;\n className?: string;\n style?: React.CSSProperties;\n}\n\nfunction FilterListItemInner<Q extends ObjectTypeDefinition>({\n objectType,\n objectSet,\n definition,\n filterKey,\n filterState,\n onFilterStateChanged,\n whereClause,\n dragHandleAttributes,\n dragHandleListeners,\n className,\n style,\n}: FilterListItemProps<Q>): React.ReactElement {\n const label = getFilterLabel(definition);\n\n const handleFilterStateChanged = useCallback(\n (newState: FilterState) => {\n onFilterStateChanged(filterKey, newState);\n },\n [filterKey, onFilterStateChanged],\n );\n\n return (\n <div\n className={classnames(styles.filterItem, className)}\n style={style}\n data-filter-type={definition.type}\n >\n <div className={styles.itemHeader}>\n {dragHandleAttributes && (\n <button\n type=\"button\"\n className={styles.dragHandle}\n aria-label={`Reorder ${label}`}\n {...dragHandleAttributes}\n {...dragHandleListeners}\n >\n <DragHandleIcon />\n </button>\n )}\n <span className={styles.itemLabel}>{label}</span>\n </div>\n\n <div className={styles.itemContent}>\n <ErrorBoundary errorMessage=\"Error loading filter\">\n <FilterInput\n objectType={objectType}\n objectSet={objectSet}\n definition={definition}\n filterState={filterState}\n onFilterStateChanged={handleFilterStateChanged}\n whereClause={whereClause}\n />\n </ErrorBoundary>\n </div>\n </div>\n );\n}\n\nexport const FilterListItem = memo(\n FilterListItemInner,\n) as typeof FilterListItemInner;\n"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,IAAI,EAAEC,WAAW,QAAQ,OAAO;AAChD,SAASC,aAAa,QAAQ,+BAA+B;AAG7D,SAASC,cAAc,QAAQ,4BAA4B;AAC3D,SAASC,cAAc,QAAQ,qBAAqB;AACpD,SAASC,WAAW,QAAQ,kBAAkB;AAC9C,OAAOC,MAAM,MAAM,6BAA6B;AAmBhD,SAASC,mBAAmBA,CAAiC;EAC3DC,UAAU;EACVC,SAAS;EACTC,UAAU;EACVC,SAAS;EACTC,WAAW;EACXC,oBAAoB;EACpBC,WAAW;EACXC,oBAAoB;EACpBC,mBAAmB;EACnBC,SAAS;EACTC;AACsB,CAAC,EAAsB;EAC7C,MAAMC,KAAK,GAAGhB,cAAc,CAACO,UAAU,CAAC;EAExC,MAAMU,wBAAwB,GAAGnB,WAAW,CACzCoB,QAAqB,IAAK;IACzBR,oBAAoB,CAACF,SAAS,EAAEU,QAAQ,CAAC;EAC3C,CAAC,EACD,CAACV,SAAS,EAAEE,oBAAoB,CAClC,CAAC;EAED,oBACEd,KAAA,CAAAuB,aAAA;IACEL,SAAS,EAAEnB,UAAU,CAACQ,MAAM,CAACiB,UAAU,EAAEN,SAAS,CAAE;IACpDC,KAAK,EAAEA,KAAM;IACb,oBAAkBR,UAAU,CAACc;EAAK,gBAElCzB,KAAA,CAAAuB,aAAA;IAAKL,SAAS,EAAEX,MAAM,CAACmB;EAAW,GAC/BV,oBAAoB,iBACnBhB,KAAA,CAAAuB,aAAA,WAAAI,QAAA;IACEF,IAAI,EAAC,QAAQ;IACbP,SAAS,EAAEX,MAAM,CAACqB,UAAW;IAC7B,cAAY,WAAWR,KAAK;EAAG,GAC3BJ,oBAAoB,EACpBC,mBAAmB,gBAEvBjB,KAAA,CAAAuB,aAAA,CAAClB,cAAc,MAAE,CACX,CACT,eACDL,KAAA,CAAAuB,aAAA;IAAML,SAAS,EAAEX,MAAM,CAACsB;EAAU,GAAET,KAAY,CAC7C,CAAC,eAENpB,KAAA,CAAAuB,aAAA;IAAKL,SAAS,EAAEX,MAAM,CAACuB;EAAY,gBACjC9B,KAAA,CAAAuB,aAAA,CAACpB,aAAa;IAAC4B,YAAY,EAAC;EAAsB,gBAChD/B,KAAA,CAAAuB,aAAA,CAACjB,WAAW;IACVG,UAAU,EAAEA,UAAW;IACvBC,SAAS,EAAEA,SAAU;IACrBC,UAAU,EAAEA,UAAW;IACvBE,WAAW,EAAEA,WAAY;IACzBC,oBAAoB,EAAEO,wBAAyB;IAC/CN,WAAW,EAAEA;EAAY,CAC1B,CACY,CACZ,CACF,CAAC;AAEV;AAEA,OAAO,MAAMiB,cAAc,gBAAG/B,IAAI,CAChCO,mBACF,CAA+B","ignoreList":[]}