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

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 (133) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +86 -0
  3. package/build/browser/action-form/ActionForm.js +109 -0
  4. package/build/browser/action-form/ActionForm.js.map +1 -0
  5. package/build/browser/action-form/ActionFormApi.js.map +1 -1
  6. package/build/browser/action-form/BaseForm.js +74 -0
  7. package/build/browser/action-form/BaseForm.js.map +1 -0
  8. package/build/browser/action-form/FormFieldApi.js.map +1 -1
  9. package/build/browser/action-form/fields/FieldBridge.js +45 -0
  10. package/build/browser/action-form/fields/FieldBridge.js.map +1 -0
  11. package/build/browser/action-form/fields/FormFieldRenderer.js +68 -0
  12. package/build/browser/action-form/fields/FormFieldRenderer.js.map +1 -0
  13. package/build/browser/action-form/fields/TextInputField.js +38 -0
  14. package/build/browser/action-form/fields/TextInputField.js.map +1 -0
  15. package/build/browser/action-form/utils/coerceFieldValue.js +93 -0
  16. package/build/browser/action-form/utils/coerceFieldValue.js.map +1 -0
  17. package/build/browser/action-form/utils/getDefaultFieldComponent.js +56 -0
  18. package/build/browser/action-form/utils/getDefaultFieldComponent.js.map +1 -0
  19. package/build/browser/action-form/utils/getDefaultFieldDefinitions.js +33 -0
  20. package/build/browser/action-form/utils/getDefaultFieldDefinitions.js.map +1 -0
  21. package/build/browser/filter-list/base/BaseFilterList.js +23 -11
  22. package/build/browser/filter-list/base/BaseFilterList.js.map +1 -1
  23. package/build/browser/filter-list/base/FilterIcons.js +48 -13
  24. package/build/browser/filter-list/base/FilterIcons.js.map +1 -1
  25. package/build/browser/filter-list/base/FilterList.module.css +57 -13
  26. package/build/browser/filter-list/base/FilterList.module.css.js +5 -2
  27. package/build/browser/filter-list/base/FilterListHeader.js +10 -15
  28. package/build/browser/filter-list/base/FilterListHeader.js.map +1 -1
  29. package/build/browser/filter-list/base/FilterListHeader.module.css +13 -41
  30. package/build/browser/filter-list/base/FilterListHeader.module.css.js +1 -4
  31. package/build/browser/filter-list/hooks/useFilterListState.js +30 -11
  32. package/build/browser/filter-list/hooks/useFilterListState.js.map +1 -1
  33. package/build/browser/filter-list/inputs/LinkedPropertyInput.js +1 -1
  34. package/build/browser/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  35. package/build/browser/filter-list/utils/filterStateToWhereClause.js +120 -105
  36. package/build/browser/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  37. package/build/browser/filter-list/utils/getFilterKey.js +1 -1
  38. package/build/browser/filter-list/utils/getFilterKey.js.map +1 -1
  39. package/build/browser/filter-list/utils/getFilterLabel.js +1 -1
  40. package/build/browser/filter-list/utils/getFilterLabel.js.map +1 -1
  41. package/build/browser/object-table/TableHeader.js +4 -1
  42. package/build/browser/object-table/TableHeader.js.map +1 -1
  43. package/build/browser/object-table/TableHeader.module.css +2 -1
  44. package/build/browser/object-table/TableHeader.module.css.js +1 -0
  45. package/build/browser/{filter-list/utils → shared}/assertUnreachable.js +1 -1
  46. package/build/browser/{filter-list/utils → shared}/assertUnreachable.js.map +1 -1
  47. package/build/browser/shared/typedMemo.js +25 -0
  48. package/build/browser/shared/typedMemo.js.map +1 -0
  49. package/build/browser/styles.css +72 -55
  50. package/build/cjs/public/experimental.cjs +293 -244
  51. package/build/cjs/public/experimental.cjs.map +1 -1
  52. package/build/cjs/public/experimental.css +64 -47
  53. package/build/cjs/public/experimental.css.map +1 -1
  54. package/build/esm/action-form/ActionForm.js +109 -0
  55. package/build/esm/action-form/ActionForm.js.map +1 -0
  56. package/build/esm/action-form/ActionFormApi.js.map +1 -1
  57. package/build/esm/action-form/BaseForm.js +74 -0
  58. package/build/esm/action-form/BaseForm.js.map +1 -0
  59. package/build/esm/action-form/FormFieldApi.js.map +1 -1
  60. package/build/esm/action-form/fields/FieldBridge.js +45 -0
  61. package/build/esm/action-form/fields/FieldBridge.js.map +1 -0
  62. package/build/esm/action-form/fields/FormFieldRenderer.js +68 -0
  63. package/build/esm/action-form/fields/FormFieldRenderer.js.map +1 -0
  64. package/build/esm/action-form/fields/TextInputField.js +38 -0
  65. package/build/esm/action-form/fields/TextInputField.js.map +1 -0
  66. package/build/esm/action-form/utils/coerceFieldValue.js +93 -0
  67. package/build/esm/action-form/utils/coerceFieldValue.js.map +1 -0
  68. package/build/esm/action-form/utils/getDefaultFieldComponent.js +56 -0
  69. package/build/esm/action-form/utils/getDefaultFieldComponent.js.map +1 -0
  70. package/build/esm/action-form/utils/getDefaultFieldDefinitions.js +33 -0
  71. package/build/esm/action-form/utils/getDefaultFieldDefinitions.js.map +1 -0
  72. package/build/esm/filter-list/base/BaseFilterList.js +23 -11
  73. package/build/esm/filter-list/base/BaseFilterList.js.map +1 -1
  74. package/build/esm/filter-list/base/FilterIcons.js +48 -13
  75. package/build/esm/filter-list/base/FilterIcons.js.map +1 -1
  76. package/build/esm/filter-list/base/FilterList.module.css +57 -13
  77. package/build/esm/filter-list/base/FilterListHeader.js +10 -15
  78. package/build/esm/filter-list/base/FilterListHeader.js.map +1 -1
  79. package/build/esm/filter-list/base/FilterListHeader.module.css +13 -41
  80. package/build/esm/filter-list/hooks/useFilterListState.js +30 -11
  81. package/build/esm/filter-list/hooks/useFilterListState.js.map +1 -1
  82. package/build/esm/filter-list/inputs/LinkedPropertyInput.js +1 -1
  83. package/build/esm/filter-list/inputs/LinkedPropertyInput.js.map +1 -1
  84. package/build/esm/filter-list/utils/filterStateToWhereClause.js +120 -105
  85. package/build/esm/filter-list/utils/filterStateToWhereClause.js.map +1 -1
  86. package/build/esm/filter-list/utils/getFilterKey.js +1 -1
  87. package/build/esm/filter-list/utils/getFilterKey.js.map +1 -1
  88. package/build/esm/filter-list/utils/getFilterLabel.js +1 -1
  89. package/build/esm/filter-list/utils/getFilterLabel.js.map +1 -1
  90. package/build/esm/object-table/TableHeader.js +4 -1
  91. package/build/esm/object-table/TableHeader.js.map +1 -1
  92. package/build/esm/object-table/TableHeader.module.css +2 -1
  93. package/build/esm/{filter-list/utils → shared}/assertUnreachable.js +1 -1
  94. package/build/esm/{filter-list/utils → shared}/assertUnreachable.js.map +1 -1
  95. package/build/esm/shared/typedMemo.js +25 -0
  96. package/build/esm/shared/typedMemo.js.map +1 -0
  97. package/build/types/action-form/ActionForm.d.ts +4 -0
  98. package/build/types/action-form/ActionForm.d.ts.map +1 -0
  99. package/build/types/action-form/ActionFormApi.d.ts +48 -32
  100. package/build/types/action-form/ActionFormApi.d.ts.map +1 -1
  101. package/build/types/action-form/BaseForm.d.ts +3 -0
  102. package/build/types/action-form/BaseForm.d.ts.map +1 -0
  103. package/build/types/action-form/FormFieldApi.d.ts +58 -18
  104. package/build/types/action-form/FormFieldApi.d.ts.map +1 -1
  105. package/build/types/action-form/fields/FieldBridge.d.ts +9 -0
  106. package/build/types/action-form/fields/FieldBridge.d.ts.map +1 -0
  107. package/build/types/action-form/fields/FormFieldRenderer.d.ts +8 -0
  108. package/build/types/action-form/fields/FormFieldRenderer.d.ts.map +1 -0
  109. package/build/types/action-form/fields/TextInputField.d.ts +3 -0
  110. package/build/types/action-form/fields/TextInputField.d.ts.map +1 -0
  111. package/build/types/action-form/utils/coerceFieldValue.d.ts +10 -0
  112. package/build/types/action-form/utils/coerceFieldValue.d.ts.map +1 -0
  113. package/build/types/action-form/utils/getDefaultFieldComponent.d.ts +6 -0
  114. package/build/types/action-form/utils/getDefaultFieldComponent.d.ts.map +1 -0
  115. package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts +6 -0
  116. package/build/types/action-form/utils/getDefaultFieldDefinitions.d.ts.map +1 -0
  117. package/build/types/filter-list/base/BaseFilterList.d.ts.map +1 -1
  118. package/build/types/filter-list/base/FilterIcons.d.ts +7 -0
  119. package/build/types/filter-list/base/FilterIcons.d.ts.map +1 -1
  120. package/build/types/filter-list/base/FilterListHeader.d.ts.map +1 -1
  121. package/build/types/filter-list/hooks/useFilterListState.d.ts.map +1 -1
  122. package/build/types/filter-list/inputs/LinkedPropertyInput.d.ts.map +1 -1
  123. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts +5 -1
  124. package/build/types/filter-list/utils/filterStateToWhereClause.d.ts.map +1 -1
  125. package/build/types/filter-list/utils/getFilterKey.d.ts.map +1 -1
  126. package/build/types/filter-list/utils/getFilterLabel.d.ts.map +1 -1
  127. package/build/types/object-table/TableHeader.d.ts.map +1 -1
  128. package/build/types/shared/assertUnreachable.d.ts.map +1 -0
  129. package/build/types/shared/typedMemo.d.ts +6 -0
  130. package/build/types/shared/typedMemo.d.ts.map +1 -0
  131. package/package.json +7 -6
  132. package/build/types/filter-list/utils/assertUnreachable.d.ts.map +0 -1
  133. /package/build/types/{filter-list/utils → shared}/assertUnreachable.d.ts +0 -0
@@ -14,41 +14,56 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { assertUnreachable } from "./assertUnreachable.js";
17
+ import { assertUnreachable } from "../../shared/assertUnreachable.js";
18
+ import { formatDateForInput } from "../base/inputs/dateUtils.js";
18
19
  import { getFilterKey } from "./getFilterKey.js";
19
- function liftCompoundPropertyFilter(propertyKey, filter) {
20
- if (typeof filter === "object" && !Array.isArray(filter)) {
21
- if ("$and" in filter && Array.isArray(filter.$and)) {
22
- return {
23
- $and: filter.$and.map(f => liftCompoundPropertyFilter(propertyKey, f))
24
- };
25
- }
26
- if ("$or" in filter && Array.isArray(filter.$or)) {
27
- return {
28
- $or: filter.$or.map(f => liftCompoundPropertyFilter(propertyKey, f))
29
- };
30
- }
20
+ function isCompoundFilter(f) {
21
+ return typeof f === "object" && f != null && "__compound" in f;
22
+ }
23
+ const NUMERIC_BOUNDS = {
24
+ byte: {
25
+ min: -128,
26
+ max: 127
27
+ },
28
+ short: {
29
+ min: -32_768,
30
+ max: 32_767
31
+ },
32
+ integer: {
33
+ min: -2_147_483_648,
34
+ max: 2_147_483_647
35
+ },
36
+ long: {
37
+ min: Number.MIN_SAFE_INTEGER,
38
+ max: Number.MAX_SAFE_INTEGER
31
39
  }
32
- return {
33
- [propertyKey]: filter
34
- };
40
+ };
41
+ function clampToPropertyBounds(value, propertyType) {
42
+ if (propertyType === undefined) {
43
+ return value;
44
+ }
45
+ const bounds = NUMERIC_BOUNDS[propertyType];
46
+ if (bounds === undefined) {
47
+ return value;
48
+ }
49
+ return Math.max(bounds.min, Math.min(bounds.max, value));
50
+ }
51
+ function formatDateValue(date, propertyType) {
52
+ if (propertyType === "datetime") {
53
+ return formatDateForInput(date);
54
+ }
55
+ return date.toISOString();
35
56
  }
36
- function filterStateToPropertyFilter(state) {
57
+ function filterStateToPropertyFilter(state, propertyType) {
37
58
  switch (state.type) {
38
59
  case "CONTAINS_TEXT":
39
60
  {
40
61
  if (!state.value) {
41
62
  return undefined;
42
63
  }
43
- const filter = {
64
+ return {
44
65
  $containsAnyTerm: state.value
45
66
  };
46
- if (state.isExcluding) {
47
- return {
48
- $not: filter
49
- };
50
- }
51
- return filter;
52
67
  }
53
68
  case "TOGGLE":
54
69
  {
@@ -59,138 +74,104 @@ function filterStateToPropertyFilter(state) {
59
74
  const conditions = [];
60
75
  if (state.minValue !== undefined) {
61
76
  conditions.push({
62
- $gte: state.minValue.toISOString()
77
+ $gte: formatDateValue(state.minValue, propertyType)
63
78
  });
64
79
  }
65
80
  if (state.maxValue !== undefined) {
66
81
  conditions.push({
67
- $lte: state.maxValue.toISOString()
82
+ $lte: formatDateValue(state.maxValue, propertyType)
68
83
  });
69
84
  }
70
85
  if (conditions.length === 0 && !state.includeNull) {
71
86
  return undefined;
72
87
  }
73
- let rangeFilter;
74
- if (conditions.length === 1) {
75
- rangeFilter = conditions[0];
76
- } else if (conditions.length > 1) {
77
- rangeFilter = {
78
- $and: conditions
79
- };
80
- }
81
- if (state.includeNull) {
82
- if (rangeFilter) {
83
- return {
84
- $or: [rangeFilter, {
85
- $isNull: true
86
- }]
87
- };
88
- }
88
+ if (conditions.length === 0 && state.includeNull) {
89
89
  return {
90
90
  $isNull: true
91
91
  };
92
92
  }
93
- return rangeFilter;
93
+ if (conditions.length === 1 && !state.includeNull) {
94
+ return conditions[0];
95
+ }
96
+ return {
97
+ __compound: true,
98
+ conditions,
99
+ includeNull: state.includeNull ?? false
100
+ };
94
101
  }
95
102
  case "NUMBER_RANGE":
96
103
  {
97
104
  const conditions = [];
98
105
  if (state.minValue !== undefined) {
99
106
  conditions.push({
100
- $gte: state.minValue
107
+ $gte: clampToPropertyBounds(state.minValue, propertyType)
101
108
  });
102
109
  }
103
110
  if (state.maxValue !== undefined) {
104
111
  conditions.push({
105
- $lte: state.maxValue
112
+ $lte: clampToPropertyBounds(state.maxValue, propertyType)
106
113
  });
107
114
  }
108
115
  if (conditions.length === 0 && !state.includeNull) {
109
116
  return undefined;
110
117
  }
111
- let rangeFilter;
112
- if (conditions.length === 1) {
113
- rangeFilter = conditions[0];
114
- } else if (conditions.length > 1) {
115
- rangeFilter = {
116
- $and: conditions
117
- };
118
- }
119
- if (state.includeNull) {
120
- if (rangeFilter) {
121
- return {
122
- $or: [rangeFilter, {
123
- $isNull: true
124
- }]
125
- };
126
- }
118
+ if (conditions.length === 0 && state.includeNull) {
127
119
  return {
128
120
  $isNull: true
129
121
  };
130
122
  }
131
- return rangeFilter;
123
+ if (conditions.length === 1 && !state.includeNull) {
124
+ return conditions[0];
125
+ }
126
+ return {
127
+ __compound: true,
128
+ conditions,
129
+ includeNull: state.includeNull ?? false
130
+ };
132
131
  }
133
132
  case "EXACT_MATCH":
134
133
  {
135
134
  if (state.values.length === 0) {
136
135
  return undefined;
137
136
  }
138
- const filter = state.values.length === 1 ? state.values[0] : {
137
+ return state.values.length === 1 ? state.values[0] : {
139
138
  $in: state.values
140
139
  };
141
- if (state.isExcluding) {
142
- return {
143
- $not: filter
144
- };
145
- }
146
- return filter;
147
140
  }
148
141
  case "SELECT":
149
142
  {
150
143
  if (state.selectedValues.length === 0) {
151
144
  return undefined;
152
145
  }
153
- const values = state.selectedValues.map(v => v instanceof Date ? v.toISOString() : v);
154
- const filter = values.length === 1 ? values[0] : {
146
+ const values = state.selectedValues.map(v => v instanceof Date ? formatDateValue(v, propertyType) : v);
147
+ return values.length === 1 ? values[0] : {
155
148
  $in: values
156
149
  };
157
- if (state.isExcluding) {
158
- return {
159
- $not: filter
160
- };
161
- }
162
- return filter;
163
150
  }
164
151
  case "TIMELINE":
165
152
  {
166
153
  const conditions = [];
167
154
  if (state.startDate !== undefined) {
168
155
  conditions.push({
169
- $gte: state.startDate.toISOString()
156
+ $gte: formatDateValue(state.startDate, propertyType)
170
157
  });
171
158
  }
172
159
  if (state.endDate !== undefined) {
173
160
  conditions.push({
174
- $lte: state.endDate.toISOString()
161
+ $lte: formatDateValue(state.endDate, propertyType)
175
162
  });
176
163
  }
177
164
  if (conditions.length === 0) {
178
165
  return undefined;
179
166
  }
180
- let rangeFilter;
181
167
  if (conditions.length === 1) {
182
- rangeFilter = conditions[0];
183
- } else {
184
- rangeFilter = {
185
- $and: conditions
186
- };
168
+ return conditions[0];
187
169
  }
188
- if (state.isExcluding) {
189
- return {
190
- $not: rangeFilter
191
- };
192
- }
193
- return rangeFilter;
170
+ return {
171
+ __compound: true,
172
+ conditions,
173
+ includeNull: false
174
+ };
194
175
  }
195
176
 
196
177
  // These filter types are handled separately in buildWhereClause
@@ -217,7 +198,8 @@ function filterStateToPropertyFilter(state) {
217
198
  * cannot verify that the constructed clause structure matches the generic Q's
218
199
  * expected shape, but the structure is guaranteed to be valid by construction.
219
200
  */
220
- export function buildWhereClause(definitions, filterStates, operator, objectType, excludeFilterKey) {
201
+
202
+ export function buildWhereClause(definitions, filterStates, operator, propertyTypes, excludeFilterKey) {
221
203
  if (!definitions || definitions.length === 0) {
222
204
  return {};
223
205
  }
@@ -234,9 +216,37 @@ export function buildWhereClause(definitions, filterStates, operator, objectType
234
216
  switch (definition.type) {
235
217
  case "PROPERTY":
236
218
  {
237
- const filter = filterStateToPropertyFilter(state);
219
+ const propertyType = propertyTypes?.get(definition.key)?.type;
220
+ const filter = filterStateToPropertyFilter(state, propertyType);
238
221
  if (filter !== undefined) {
239
- clauses.push(liftCompoundPropertyFilter(definition.key, filter));
222
+ const isExcluding = "isExcluding" in state && state.isExcluding;
223
+ if (isCompoundFilter(filter)) {
224
+ const fieldClauses = filter.conditions.map(c => ({
225
+ [definition.key]: c
226
+ }));
227
+ let rangeClause = fieldClauses.length === 1 ? fieldClauses[0] : {
228
+ $and: fieldClauses
229
+ };
230
+ if (filter.includeNull) {
231
+ rangeClause = {
232
+ $or: [rangeClause, {
233
+ [definition.key]: {
234
+ $isNull: true
235
+ }
236
+ }]
237
+ };
238
+ }
239
+ clauses.push(isExcluding ? {
240
+ $not: rangeClause
241
+ } : rangeClause);
242
+ } else {
243
+ const clause = {
244
+ [definition.key]: filter
245
+ };
246
+ clauses.push(isExcluding ? {
247
+ $not: clause
248
+ } : clause);
249
+ }
240
250
  }
241
251
  break;
242
252
  }
@@ -288,12 +298,17 @@ export function buildWhereClause(definitions, filterStates, operator, objectType
288
298
  const properties = definition.properties;
289
299
  let propertiesToSearch;
290
300
  if (properties === "all") {
291
- if (objectType?.__DefinitionMetadata?.properties) {
292
- propertiesToSearch = Object.entries(objectType.__DefinitionMetadata.properties).filter(([, prop]) => prop.type === "string" && !prop.multiplicity).map(([key]) => key);
301
+ if (propertyTypes && propertyTypes.size > 0) {
302
+ propertiesToSearch = [];
303
+ for (const [key, info] of propertyTypes) {
304
+ if (info.type === "string" && !info.multiplicity) {
305
+ propertiesToSearch.push(key);
306
+ }
307
+ }
293
308
  } else {
294
309
  if (process.env.NODE_ENV !== "production") {
295
310
  // eslint-disable-next-line no-console
296
- console.warn("[FilterList] Keyword search with properties: 'all' requires objectType to be provided. Filter will be skipped.");
311
+ console.warn("[FilterList] Keyword search with properties: 'all' requires propertyTypes to be provided. Filter will be skipped.");
297
312
  }
298
313
  break;
299
314
  }
@@ -305,21 +320,21 @@ export function buildWhereClause(definitions, filterStates, operator, objectType
305
320
  }
306
321
  const containsOp = state.operator === "AND" ? "$containsAllTerms" : "$containsAnyTerm";
307
322
  const propertySearches = propertiesToSearch.map(prop => ({
308
- [prop]: state.isExcluding ? {
309
- $not: {
310
- [containsOp]: searchTerm
311
- }
312
- } : {
323
+ [prop]: {
313
324
  [containsOp]: searchTerm
314
325
  }
315
326
  }));
327
+ let searchClause;
316
328
  if (propertySearches.length === 1) {
317
- clauses.push(propertySearches[0]);
329
+ searchClause = propertySearches[0];
318
330
  } else {
319
- clauses.push({
331
+ searchClause = {
320
332
  $or: propertySearches
321
- });
333
+ };
322
334
  }
335
+ clauses.push(state.isExcluding ? {
336
+ $not: searchClause
337
+ } : searchClause);
323
338
  break;
324
339
  }
325
340
  case "CUSTOM":
@@ -1 +1 @@
1
- {"version":3,"file":"filterStateToWhereClause.js","names":["assertUnreachable","getFilterKey","liftCompoundPropertyFilter","propertyKey","filter","Array","isArray","$and","map","f","$or","filterStateToPropertyFilter","state","type","value","undefined","$containsAnyTerm","isExcluding","$not","enabled","conditions","minValue","push","$gte","toISOString","maxValue","$lte","length","includeNull","rangeFilter","$isNull","values","$in","selectedValues","v","Date","startDate","endDate","buildWhereClause","definitions","filterStates","operator","objectType","excludeFilterKey","clauses","definition","key","get","process","env","NODE_ENV","console","warn","linkName","hasLink","$isNotNull","searchTerm","trim","properties","propertiesToSearch","__DefinitionMetadata","Object","entries","prop","multiplicity","containsOp","propertySearches","customClause","toWhereClause","keys"],"sources":["filterStateToWhereClause.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 type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { assertUnreachable } from \"./assertUnreachable.js\";\nimport { getFilterKey } from \"./getFilterKey.js\";\n\ntype PropertyFilter = Record<string, unknown> | boolean | string | number;\n\nfunction liftCompoundPropertyFilter(\n propertyKey: string,\n filter: PropertyFilter,\n): Record<string, unknown> {\n if (typeof filter === \"object\" && !Array.isArray(filter)) {\n if (\"$and\" in filter && Array.isArray(filter.$and)) {\n return {\n $and: (filter.$and as PropertyFilter[]).map((f) =>\n liftCompoundPropertyFilter(propertyKey, f)\n ),\n };\n }\n if (\"$or\" in filter && Array.isArray(filter.$or)) {\n return {\n $or: (filter.$or as PropertyFilter[]).map((f) =>\n liftCompoundPropertyFilter(propertyKey, f)\n ),\n };\n }\n }\n return { [propertyKey]: filter };\n}\n\nfunction filterStateToPropertyFilter(\n state: FilterState,\n): PropertyFilter | undefined {\n switch (state.type) {\n case \"CONTAINS_TEXT\": {\n if (!state.value) {\n return undefined;\n }\n const filter = { $containsAnyTerm: state.value };\n if (state.isExcluding) {\n return { $not: filter };\n }\n return filter;\n }\n\n case \"TOGGLE\": {\n return state.enabled;\n }\n\n case \"DATE_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({ $gte: state.minValue.toISOString() });\n }\n if (state.maxValue !== undefined) {\n conditions.push({ $lte: state.maxValue.toISOString() });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n let rangeFilter: PropertyFilter | undefined;\n if (conditions.length === 1) {\n rangeFilter = conditions[0];\n } else if (conditions.length > 1) {\n rangeFilter = { $and: conditions };\n }\n\n if (state.includeNull) {\n if (rangeFilter) {\n return { $or: [rangeFilter, { $isNull: true }] };\n }\n return { $isNull: true };\n }\n\n return rangeFilter;\n }\n\n case \"NUMBER_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({ $gte: state.minValue });\n }\n if (state.maxValue !== undefined) {\n conditions.push({ $lte: state.maxValue });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n let rangeFilter: PropertyFilter | undefined;\n if (conditions.length === 1) {\n rangeFilter = conditions[0];\n } else if (conditions.length > 1) {\n rangeFilter = { $and: conditions };\n }\n\n if (state.includeNull) {\n if (rangeFilter) {\n return { $or: [rangeFilter, { $isNull: true }] };\n }\n return { $isNull: true };\n }\n\n return rangeFilter;\n }\n\n case \"EXACT_MATCH\": {\n if (state.values.length === 0) {\n return undefined;\n }\n const filter = state.values.length === 1\n ? state.values[0]\n : { $in: state.values };\n if (state.isExcluding) {\n return { $not: filter };\n }\n return filter;\n }\n\n case \"SELECT\": {\n if (state.selectedValues.length === 0) {\n return undefined;\n }\n const values: (string | number | boolean)[] = state.selectedValues.map(\n (v) =>\n v instanceof Date ? v.toISOString() : v as string | number | boolean,\n );\n const filter = values.length === 1 ? values[0] : { $in: values };\n if (state.isExcluding) {\n return { $not: filter };\n }\n return filter;\n }\n\n case \"TIMELINE\": {\n const conditions: PropertyFilter[] = [];\n if (state.startDate !== undefined) {\n conditions.push({ $gte: state.startDate.toISOString() });\n }\n if (state.endDate !== undefined) {\n conditions.push({ $lte: state.endDate.toISOString() });\n }\n if (conditions.length === 0) {\n return undefined;\n }\n let rangeFilter: PropertyFilter;\n if (conditions.length === 1) {\n rangeFilter = conditions[0];\n } else {\n rangeFilter = { $and: conditions };\n }\n if (state.isExcluding) {\n return { $not: rangeFilter };\n }\n return rangeFilter;\n }\n\n // These filter types are handled separately in buildWhereClause\n // since they need access to the full definition, not just state\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return undefined;\n\n default:\n return assertUnreachable(state);\n }\n}\n\n/**\n * Builds a WhereClause from filter definitions and their current states.\n *\n * The filterStates map uses string keys derived from filter definitions via\n * getFilterKey(). This ensures stable state lookups even when filters are\n * reordered or definition object references change.\n *\n * Note: The `as WhereClause<Q>` casts are necessary because we're building\n * clauses dynamically from property keys determined at runtime. TypeScript\n * cannot verify that the constructed clause structure matches the generic Q's\n * expected shape, but the structure is guaranteed to be valid by construction.\n */\nexport function buildWhereClause<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n operator: \"and\" | \"or\",\n objectType?: Q,\n excludeFilterKey?: string,\n): WhereClause<Q> {\n if (!definitions || definitions.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n const clauses: Array<Record<string, unknown>> = [];\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n\n if (!state) {\n continue;\n }\n\n switch (definition.type) {\n case \"PROPERTY\": {\n const filter = filterStateToPropertyFilter(state);\n if (filter !== undefined) {\n clauses.push(\n liftCompoundPropertyFilter(definition.key as string, filter),\n );\n }\n break;\n }\n\n case \"HAS_LINK\": {\n if (state.type !== \"hasLink\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for hasLink filter \"${definition.linkName}\": expected hasLink, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.hasLink) {\n break;\n }\n clauses.push({ [definition.linkName]: { $isNotNull: true } });\n break;\n }\n\n case \"LINKED_PROPERTY\": {\n // OSDK WhereClause does not support filtering through links.\n // Link-based filtering requires ObjectSet operations (pivotTo/intersect).\n // LinkedProperty filters render UI for selection but cannot be included\n // in the where clause. Consumers needing linked property filtering must\n // implement it using ObjectSet.pivotTo() and intersect().\n break;\n }\n\n case \"KEYWORD_SEARCH\": {\n if (state.type !== \"keywordSearch\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.searchTerm) {\n break;\n }\n // TypeScript narrows state to KeywordSearchFilterState\n const searchTerm = state.searchTerm.trim();\n if (!searchTerm) {\n break;\n }\n\n const properties = definition.properties;\n let propertiesToSearch: string[];\n\n if (properties === \"all\") {\n if (objectType?.__DefinitionMetadata?.properties) {\n propertiesToSearch = Object.entries(\n objectType.__DefinitionMetadata.properties,\n )\n .filter(([, prop]) =>\n prop.type === \"string\" && !prop.multiplicity\n )\n .map(([key]) => key);\n } else {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[FilterList] Keyword search with properties: 'all' requires objectType to be provided. Filter will be skipped.\",\n );\n }\n break;\n }\n } else {\n propertiesToSearch = properties;\n }\n\n if (propertiesToSearch.length === 0) {\n break;\n }\n\n const containsOp = state.operator === \"AND\"\n ? \"$containsAllTerms\"\n : \"$containsAnyTerm\";\n\n const propertySearches = propertiesToSearch.map((prop) => ({\n [prop]: state.isExcluding\n ? { $not: { [containsOp]: searchTerm } }\n : { [containsOp]: searchTerm },\n }));\n\n if (propertySearches.length === 1) {\n clauses.push(propertySearches[0]);\n } else {\n clauses.push({ $or: propertySearches });\n }\n break;\n }\n\n case \"CUSTOM\": {\n if (state.type !== \"custom\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for custom filter \"${definition.key}\": expected custom, got ${state.type}`,\n );\n }\n break;\n }\n // TypeScript narrows state to CustomFilterState\n const customClause = definition.toWhereClause(state);\n if (customClause && Object.keys(customClause).length > 0) {\n clauses.push(customClause as Record<string, unknown>);\n }\n break;\n }\n\n default:\n assertUnreachable(definition);\n }\n }\n\n if (clauses.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n if (clauses.length === 1) {\n return clauses[0] as WhereClause<Q>;\n }\n\n if (operator === \"and\") {\n return { $and: clauses } as WhereClause<Q>;\n }\n\n return { $or: clauses } as WhereClause<Q>;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"filterStateToWhereClause.js","names":["assertUnreachable","formatDateForInput","getFilterKey","isCompoundFilter","f","NUMERIC_BOUNDS","byte","min","max","short","integer","long","Number","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clampToPropertyBounds","value","propertyType","undefined","bounds","Math","formatDateValue","date","toISOString","filterStateToPropertyFilter","state","type","$containsAnyTerm","enabled","conditions","minValue","push","$gte","maxValue","$lte","length","includeNull","$isNull","__compound","values","$in","selectedValues","map","v","Date","startDate","endDate","buildWhereClause","definitions","filterStates","operator","propertyTypes","excludeFilterKey","clauses","definition","key","get","filter","isExcluding","fieldClauses","c","rangeClause","$and","$or","$not","clause","process","env","NODE_ENV","console","warn","linkName","hasLink","$isNotNull","searchTerm","trim","properties","propertiesToSearch","size","info","multiplicity","containsOp","propertySearches","prop","searchClause","customClause","toWhereClause","Object","keys"],"sources":["filterStateToWhereClause.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 { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport { formatDateForInput } from \"../base/inputs/dateUtils.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport type { FilterState } from \"../FilterListItemApi.js\";\nimport { getFilterKey } from \"./getFilterKey.js\";\n\ntype PropertyFilter = Record<string, unknown> | boolean | string | number;\n\ninterface CompoundFilter {\n __compound: true;\n conditions: PropertyFilter[];\n includeNull: boolean;\n}\n\nfunction isCompoundFilter(\n f: PropertyFilter | CompoundFilter,\n): f is CompoundFilter {\n return typeof f === \"object\" && f != null && \"__compound\" in f;\n}\n\nconst NUMERIC_BOUNDS: Record<string, { min: number; max: number }> = {\n byte: { min: -128, max: 127 },\n short: { min: -32_768, max: 32_767 },\n integer: { min: -2_147_483_648, max: 2_147_483_647 },\n long: { min: Number.MIN_SAFE_INTEGER, max: Number.MAX_SAFE_INTEGER },\n};\n\nfunction clampToPropertyBounds(\n value: number,\n propertyType: string | undefined,\n): number {\n if (propertyType === undefined) {\n return value;\n }\n const bounds = NUMERIC_BOUNDS[propertyType];\n if (bounds === undefined) {\n return value;\n }\n return Math.max(bounds.min, Math.min(bounds.max, value));\n}\n\nfunction formatDateValue(\n date: Date,\n propertyType: string | undefined,\n): string {\n if (propertyType === \"datetime\") {\n return formatDateForInput(date);\n }\n return date.toISOString();\n}\n\nfunction filterStateToPropertyFilter(\n state: FilterState,\n propertyType?: string,\n): PropertyFilter | CompoundFilter | undefined {\n switch (state.type) {\n case \"CONTAINS_TEXT\": {\n if (!state.value) {\n return undefined;\n }\n return { $containsAnyTerm: state.value };\n }\n\n case \"TOGGLE\": {\n return state.enabled;\n }\n\n case \"DATE_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"NUMBER_RANGE\": {\n const conditions: PropertyFilter[] = [];\n\n if (state.minValue !== undefined) {\n conditions.push({\n $gte: clampToPropertyBounds(state.minValue, propertyType),\n });\n }\n if (state.maxValue !== undefined) {\n conditions.push({\n $lte: clampToPropertyBounds(state.maxValue, propertyType),\n });\n }\n\n if (conditions.length === 0 && !state.includeNull) {\n return undefined;\n }\n\n if (conditions.length === 0 && state.includeNull) {\n return { $isNull: true };\n }\n\n if (conditions.length === 1 && !state.includeNull) {\n return conditions[0];\n }\n\n return {\n __compound: true,\n conditions,\n includeNull: state.includeNull ?? false,\n };\n }\n\n case \"EXACT_MATCH\": {\n if (state.values.length === 0) {\n return undefined;\n }\n return state.values.length === 1\n ? state.values[0]\n : { $in: state.values };\n }\n\n case \"SELECT\": {\n if (state.selectedValues.length === 0) {\n return undefined;\n }\n const values: (string | number | boolean)[] = state.selectedValues.map(\n (v) =>\n v instanceof Date\n ? formatDateValue(v, propertyType)\n : v as string | number | boolean,\n );\n return values.length === 1 ? values[0] : { $in: values };\n }\n\n case \"TIMELINE\": {\n const conditions: PropertyFilter[] = [];\n if (state.startDate !== undefined) {\n conditions.push({\n $gte: formatDateValue(state.startDate, propertyType),\n });\n }\n if (state.endDate !== undefined) {\n conditions.push({\n $lte: formatDateValue(state.endDate, propertyType),\n });\n }\n if (conditions.length === 0) {\n return undefined;\n }\n if (conditions.length === 1) {\n return conditions[0];\n }\n return {\n __compound: true,\n conditions,\n includeNull: false,\n };\n }\n\n // These filter types are handled separately in buildWhereClause\n // since they need access to the full definition, not just state\n case \"hasLink\":\n case \"linkedProperty\":\n case \"keywordSearch\":\n case \"custom\":\n return undefined;\n\n default:\n return assertUnreachable(state);\n }\n}\n\n/**\n * Builds a WhereClause from filter definitions and their current states.\n *\n * The filterStates map uses string keys derived from filter definitions via\n * getFilterKey(). This ensures stable state lookups even when filters are\n * reordered or definition object references change.\n *\n * Note: The `as WhereClause<Q>` casts are necessary because we're building\n * clauses dynamically from property keys determined at runtime. TypeScript\n * cannot verify that the constructed clause structure matches the generic Q's\n * expected shape, but the structure is guaranteed to be valid by construction.\n */\nexport interface PropertyTypeInfo {\n type: string;\n multiplicity: boolean;\n}\n\nexport function buildWhereClause<Q extends ObjectTypeDefinition>(\n definitions: Array<FilterDefinitionUnion<Q>> | undefined,\n filterStates: Map<string, FilterState>,\n operator: \"and\" | \"or\",\n propertyTypes?: Map<string, PropertyTypeInfo>,\n excludeFilterKey?: string,\n): WhereClause<Q> {\n if (!definitions || definitions.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n const clauses: Array<Record<string, unknown>> = [];\n\n for (const definition of definitions) {\n const key = getFilterKey(definition);\n if (key === excludeFilterKey) {\n continue;\n }\n const state = filterStates.get(key);\n\n if (!state) {\n continue;\n }\n\n switch (definition.type) {\n case \"PROPERTY\": {\n const propertyType = propertyTypes?.get(definition.key as string)\n ?.type;\n const filter = filterStateToPropertyFilter(state, propertyType);\n if (filter !== undefined) {\n const isExcluding = \"isExcluding\" in state && state.isExcluding;\n if (isCompoundFilter(filter)) {\n const fieldClauses = filter.conditions.map(c => ({\n [definition.key]: c,\n }));\n let rangeClause: Record<string, unknown> = fieldClauses.length === 1\n ? fieldClauses[0]\n : { $and: fieldClauses };\n if (filter.includeNull) {\n rangeClause = {\n $or: [rangeClause, { [definition.key]: { $isNull: true } }],\n };\n }\n clauses.push(isExcluding ? { $not: rangeClause } : rangeClause);\n } else {\n const clause = { [definition.key]: filter };\n clauses.push(isExcluding ? { $not: clause } : clause);\n }\n }\n break;\n }\n\n case \"HAS_LINK\": {\n if (state.type !== \"hasLink\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for hasLink filter \"${definition.linkName}\": expected hasLink, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.hasLink) {\n break;\n }\n clauses.push({ [definition.linkName]: { $isNotNull: true } });\n break;\n }\n\n case \"LINKED_PROPERTY\": {\n // OSDK WhereClause does not support filtering through links.\n // Link-based filtering requires ObjectSet operations (pivotTo/intersect).\n // LinkedProperty filters render UI for selection but cannot be included\n // in the where clause. Consumers needing linked property filtering must\n // implement it using ObjectSet.pivotTo() and intersect().\n break;\n }\n\n case \"KEYWORD_SEARCH\": {\n if (state.type !== \"keywordSearch\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for keywordSearch filter: expected keywordSearch, got ${state.type}`,\n );\n }\n break;\n }\n if (!state.searchTerm) {\n break;\n }\n // TypeScript narrows state to KeywordSearchFilterState\n const searchTerm = state.searchTerm.trim();\n if (!searchTerm) {\n break;\n }\n\n const properties = definition.properties;\n let propertiesToSearch: string[];\n\n if (properties === \"all\") {\n if (propertyTypes && propertyTypes.size > 0) {\n propertiesToSearch = [];\n for (const [key, info] of propertyTypes) {\n if (info.type === \"string\" && !info.multiplicity) {\n propertiesToSearch.push(key);\n }\n }\n } else {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n \"[FilterList] Keyword search with properties: 'all' requires propertyTypes to be provided. Filter will be skipped.\",\n );\n }\n break;\n }\n } else {\n propertiesToSearch = properties;\n }\n\n if (propertiesToSearch.length === 0) {\n break;\n }\n\n const containsOp = state.operator === \"AND\"\n ? \"$containsAllTerms\"\n : \"$containsAnyTerm\";\n\n const propertySearches = propertiesToSearch.map((prop) => ({\n [prop]: { [containsOp]: searchTerm },\n }));\n\n let searchClause: Record<string, unknown>;\n if (propertySearches.length === 1) {\n searchClause = propertySearches[0];\n } else {\n searchClause = { $or: propertySearches };\n }\n clauses.push(\n state.isExcluding ? { $not: searchClause } : searchClause,\n );\n break;\n }\n\n case \"CUSTOM\": {\n if (state.type !== \"custom\") {\n if (process.env.NODE_ENV !== \"production\") {\n // eslint-disable-next-line no-console\n console.warn(\n `[FilterList] State type mismatch for custom filter \"${definition.key}\": expected custom, got ${state.type}`,\n );\n }\n break;\n }\n // TypeScript narrows state to CustomFilterState\n const customClause = definition.toWhereClause(state);\n if (customClause && Object.keys(customClause).length > 0) {\n clauses.push(customClause as Record<string, unknown>);\n }\n break;\n }\n\n default:\n assertUnreachable(definition);\n }\n }\n\n if (clauses.length === 0) {\n return {} as WhereClause<Q>;\n }\n\n if (clauses.length === 1) {\n return clauses[0] as WhereClause<Q>;\n }\n\n if (operator === \"and\") {\n return { $and: clauses } as WhereClause<Q>;\n }\n\n return { $or: clauses } as WhereClause<Q>;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { assertUnreachable } from "./assertUnreachable.js";
17
+ import { assertUnreachable } from "../../shared/assertUnreachable.js";
18
18
  export function getFilterKey(definition) {
19
19
  switch (definition.type) {
20
20
  case "PROPERTY":
@@ -1 +1 @@
1
- {"version":3,"file":"getFilterKey.js","names":["assertUnreachable","getFilterKey","definition","type","id","key","linkName","linkedPropertyKey","Array","isArray","properties","join"],"sources":["getFilterKey.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 } from \"@osdk/api\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport { assertUnreachable } from \"./assertUnreachable.js\";\n\nexport function getFilterKey<Q extends ObjectTypeDefinition>(\n definition: FilterDefinitionUnion<Q>,\n): string {\n switch (definition.type) {\n case \"PROPERTY\":\n return definition.id ?? definition.key;\n case \"HAS_LINK\":\n return definition.id ?? `hasLink:${definition.linkName}`;\n case \"LINKED_PROPERTY\":\n return definition.id\n ?? `linkedProperty:${definition.linkName}:${definition.linkedPropertyKey}`;\n case \"KEYWORD_SEARCH\":\n return definition.id\n ?? `keywordSearch-${\n Array.isArray(definition.properties)\n ? definition.properties.join(\"-\")\n : \"all\"\n }`;\n case \"CUSTOM\":\n return definition.id ?? definition.key;\n default:\n return assertUnreachable(definition);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D,OAAO,SAASC,YAAYA,CAC1BC,UAAoC,EAC5B;EACR,QAAQA,UAAU,CAACC,IAAI;IACrB,KAAK,UAAU;MACb,OAAOD,UAAU,CAACE,EAAE,IAAIF,UAAU,CAACG,GAAG;IACxC,KAAK,UAAU;MACb,OAAOH,UAAU,CAACE,EAAE,IAAI,WAAWF,UAAU,CAACI,QAAQ,EAAE;IAC1D,KAAK,iBAAiB;MACpB,OAAOJ,UAAU,CAACE,EAAE,IACf,kBAAkBF,UAAU,CAACI,QAAQ,IAAIJ,UAAU,CAACK,iBAAiB,EAAE;IAC9E,KAAK,gBAAgB;MACnB,OAAOL,UAAU,CAACE,EAAE,IACf,iBACDI,KAAK,CAACC,OAAO,CAACP,UAAU,CAACQ,UAAU,CAAC,GAChCR,UAAU,CAACQ,UAAU,CAACC,IAAI,CAAC,GAAG,CAAC,GAC/B,KAAK,EACT;IACN,KAAK,QAAQ;MACX,OAAOT,UAAU,CAACE,EAAE,IAAIF,UAAU,CAACG,GAAG;IACxC;MACE,OAAOL,iBAAiB,CAACE,UAAU,CAAC;EACxC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getFilterKey.js","names":["assertUnreachable","getFilterKey","definition","type","id","key","linkName","linkedPropertyKey","Array","isArray","properties","join"],"sources":["getFilterKey.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 } from \"@osdk/api\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\n\nexport function getFilterKey<Q extends ObjectTypeDefinition>(\n definition: FilterDefinitionUnion<Q>,\n): string {\n switch (definition.type) {\n case \"PROPERTY\":\n return definition.id ?? definition.key;\n case \"HAS_LINK\":\n return definition.id ?? `hasLink:${definition.linkName}`;\n case \"LINKED_PROPERTY\":\n return definition.id\n ?? `linkedProperty:${definition.linkName}:${definition.linkedPropertyKey}`;\n case \"KEYWORD_SEARCH\":\n return definition.id\n ?? `keywordSearch-${\n Array.isArray(definition.properties)\n ? definition.properties.join(\"-\")\n : \"all\"\n }`;\n case \"CUSTOM\":\n return definition.id ?? definition.key;\n default:\n return assertUnreachable(definition);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,iBAAiB,QAAQ,mCAAmC;AAGrE,OAAO,SAASC,YAAYA,CAC1BC,UAAoC,EAC5B;EACR,QAAQA,UAAU,CAACC,IAAI;IACrB,KAAK,UAAU;MACb,OAAOD,UAAU,CAACE,EAAE,IAAIF,UAAU,CAACG,GAAG;IACxC,KAAK,UAAU;MACb,OAAOH,UAAU,CAACE,EAAE,IAAI,WAAWF,UAAU,CAACI,QAAQ,EAAE;IAC1D,KAAK,iBAAiB;MACpB,OAAOJ,UAAU,CAACE,EAAE,IACf,kBAAkBF,UAAU,CAACI,QAAQ,IAAIJ,UAAU,CAACK,iBAAiB,EAAE;IAC9E,KAAK,gBAAgB;MACnB,OAAOL,UAAU,CAACE,EAAE,IACf,iBACDI,KAAK,CAACC,OAAO,CAACP,UAAU,CAACQ,UAAU,CAAC,GAChCR,UAAU,CAACQ,UAAU,CAACC,IAAI,CAAC,GAAG,CAAC,GAC/B,KAAK,EACT;IACN,KAAK,QAAQ;MACX,OAAOT,UAAU,CAACE,EAAE,IAAIF,UAAU,CAACG,GAAG;IACxC;MACE,OAAOL,iBAAiB,CAACE,UAAU,CAAC;EACxC;AACF","ignoreList":[]}
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import { assertUnreachable } from "./assertUnreachable.js";
17
+ import { assertUnreachable } from "../../shared/assertUnreachable.js";
18
18
  export function getFilterLabel(definition) {
19
19
  if ("label" in definition && definition.label) {
20
20
  return definition.label;
@@ -1 +1 @@
1
- {"version":3,"file":"getFilterLabel.js","names":["assertUnreachable","getFilterLabel","definition","label","type","key","linkName"],"sources":["getFilterLabel.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 } from \"@osdk/api\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\nimport { assertUnreachable } from \"./assertUnreachable.js\";\n\nexport function getFilterLabel<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 default:\n return assertUnreachable(definition);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA,SAASA,iBAAiB,QAAQ,wBAAwB;AAE1D,OAAO,SAASC,cAAcA,CAC5BC,UAAoC,EAC5B;EACR,IAAI,OAAO,IAAIA,UAAU,IAAIA,UAAU,CAACC,KAAK,EAAE;IAC7C,OAAOD,UAAU,CAACC,KAAK;EACzB;EAEA,QAAQD,UAAU,CAACE,IAAI;IACrB,KAAK,UAAU;MACb,OAAOF,UAAU,CAACG,GAAG;IACvB,KAAK,UAAU;IACf,KAAK,iBAAiB;MACpB,OAAOH,UAAU,CAACI,QAAQ;IAC5B,KAAK,gBAAgB;MACnB,OAAO,QAAQ;IACjB,KAAK,QAAQ;MACX,OAAOJ,UAAU,CAACG,GAAG;IACvB;MACE,OAAOL,iBAAiB,CAACE,UAAU,CAAC;EACxC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getFilterLabel.js","names":["assertUnreachable","getFilterLabel","definition","label","type","key","linkName"],"sources":["getFilterLabel.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 } from \"@osdk/api\";\nimport { assertUnreachable } from \"../../shared/assertUnreachable.js\";\nimport type { FilterDefinitionUnion } from \"../FilterListApi.js\";\n\nexport function getFilterLabel<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 default:\n return assertUnreachable(definition);\n }\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,iBAAiB,QAAQ,mCAAmC;AAGrE,OAAO,SAASC,cAAcA,CAC5BC,UAAoC,EAC5B;EACR,IAAI,OAAO,IAAIA,UAAU,IAAIA,UAAU,CAACC,KAAK,EAAE;IAC7C,OAAOD,UAAU,CAACC,KAAK;EACzB;EAEA,QAAQD,UAAU,CAACE,IAAI;IACrB,KAAK,UAAU;MACb,OAAOF,UAAU,CAACG,GAAG;IACvB,KAAK,UAAU;IACf,KAAK,iBAAiB;MACpB,OAAOH,UAAU,CAACI,QAAQ;IAC5B,KAAK,gBAAgB;MACnB,OAAO,QAAQ;IACjB,KAAK,QAAQ;MACX,OAAOJ,UAAU,CAACG,GAAG;IACvB;MACE,OAAOL,iBAAiB,CAACE,UAAU,CAAC;EACxC;AACF","ignoreList":[]}
@@ -14,6 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
+ import classNames from "classnames";
17
18
  import React, { useCallback, useMemo, useState } from "react";
18
19
  import { ColumnConfigDialog } from "./ColumnConfigDialog.js";
19
20
  import { MultiColumnSortDialog } from "./MultiColumnSortDialog.js";
@@ -111,7 +112,9 @@ export function TableHeader({
111
112
  return /*#__PURE__*/React.createElement("th", {
112
113
  key: header.id,
113
114
  "data-pinned": header.column.getIsPinned(),
114
- className: styles.osdkTableHeaderCell,
115
+ className: classNames(styles.osdkTableHeaderCell, {
116
+ [styles.osdkTableSelectionHeaderCell]: isSelectColumn
117
+ }),
115
118
  style: columnStyles
116
119
  }, header.isPlaceholder ? null : isSelectColumn ? /*#__PURE__*/React.createElement(TableHeaderContent, {
117
120
  header: header
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeader.js","names":["React","useCallback","useMemo","useState","ColumnConfigDialog","MultiColumnSortDialog","styles","TableHeaderContent","TableHeaderWithPopover","SELECTION_COLUMN_ID","getColumnPinningStyles","getHeaderName","column","allHeaders","id","columnDef","header","find","headerDef","displayedHeader","getContext","meta","columnName","TableHeader","table","headerMenuFeatureFlags","setColumnOrder","setColumnVisibility","setSorting","currentSorting","getState","sorting","currentVisibility","columnVisibility","currentColumnOrder","columnOrder","isResizing","columnSizingInfo","isResizingColumn","configDialogOpen","setConfigDialogOpen","multiSortDialogOpen","setMultiSortDialogOpen","handleOpenColumnConfig","handleCloseColumnConfig","handleOpenMultiSort","handleCloseMultiSort","handleApplyMultiSort","sortColumns","handleApplyColumnConfig","updates","newVisibilityState","update","columnId","isVisible","map","col","columnOptions","getHeaderGroups","flatMap","headerGroup","headers","getAllColumns","filter","name","canSort","getCanSort","createElement","Fragment","className","osdkTableHeader","key","osdkTableHeaderRow","columnStyles","isColumnPinned","getIsPinned","isSelectColumn","osdkTableHeaderCell","style","isPlaceholder","featureFlags","onOpenColumnConfig","onOpenMultiSort","getCanResize","showResizeItem","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","length","isOpen","onClose","onApply","some"],"sources":["TableHeader.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n Column,\n Header,\n RowData,\n SortingState,\n Table,\n VisibilityState,\n} from \"@tanstack/react-table\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { type ColumnConfig, ColumnConfigDialog } from \"./ColumnConfigDialog.js\";\nimport { MultiColumnSortDialog } from \"./MultiColumnSortDialog.js\";\nimport styles from \"./TableHeader.module.css\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport {\n type HeaderMenuFeatureFlags,\n TableHeaderWithPopover,\n} from \"./TableHeaderWithPopover.js\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\nimport type { ColumnOption } from \"./utils/types.js\";\n\ninterface TableHeaderProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n}\n\nconst getHeaderName = <TData,>(\n column: Column<TData, unknown>,\n allHeaders: Header<TData, unknown>[],\n) => {\n const { id, columnDef } = column;\n const header = allHeaders.find(header => header.id === id);\n const headerDef = columnDef.header;\n\n if (headerDef) {\n if (typeof headerDef === \"string\") {\n return headerDef;\n }\n // Try to get header name from the renderHeader function\n if (header) {\n const displayedHeader = headerDef(header.getContext());\n if (typeof displayedHeader === \"string\") return displayedHeader;\n }\n }\n // Fallback to use the columnName provided by user or id\n const { meta } = columnDef;\n return meta?.columnName ?? id;\n};\n\nexport function TableHeader<\n TData extends RowData,\n>({\n table,\n headerMenuFeatureFlags,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const {\n setColumnOrder,\n setColumnVisibility,\n setSorting,\n } = table;\n\n const currentSorting = table.getState().sorting;\n const currentVisibility = table.getState().columnVisibility;\n const currentColumnOrder = table.getState().columnOrder;\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n const [configDialogOpen, setConfigDialogOpen] = useState(false);\n const [multiSortDialogOpen, setMultiSortDialogOpen] = useState(false);\n\n const handleOpenColumnConfig = useCallback(() => {\n setConfigDialogOpen(true);\n }, []);\n\n const handleCloseColumnConfig = useCallback(() => {\n setConfigDialogOpen(false);\n }, []);\n\n const handleOpenMultiSort = useCallback(() => {\n setMultiSortDialogOpen(true);\n }, []);\n\n const handleCloseMultiSort = useCallback(() => {\n setMultiSortDialogOpen(false);\n }, []);\n\n const handleApplyMultiSort = useCallback(\n (sortColumns: SortingState) => {\n setMultiSortDialogOpen(false);\n setSorting?.(sortColumns);\n },\n [setSorting],\n );\n\n const handleApplyColumnConfig = useCallback(\n (updates: ColumnConfig[]) => {\n const newVisibilityState: VisibilityState = {};\n for (const update of updates) {\n newVisibilityState[update.columnId] = update.isVisible;\n }\n\n setColumnOrder(updates.map(col => col.columnId));\n setColumnVisibility(newVisibilityState);\n },\n [setColumnOrder, setColumnVisibility],\n );\n\n const columnOptions: ColumnOption[] = useMemo(() => {\n const allHeaders = table.getHeaderGroups().flatMap(headerGroup =>\n headerGroup.headers\n );\n\n return table\n .getAllColumns()\n .filter((column) => column.id !== SELECTION_COLUMN_ID)\n .map((column) => {\n return {\n id: column.id,\n name: getHeaderName(column, allHeaders),\n canSort: column.getCanSort(),\n };\n });\n }, [table]);\n\n return (\n <>\n <thead className={styles.osdkTableHeader} data-resizing={isResizing}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className={styles.osdkTableHeaderRow}\n >\n {headerGroup.headers.map((header) => {\n const { columnStyles } = getColumnPinningStyles(header.column);\n const isColumnPinned = header.column.getIsPinned();\n const isSelectColumn = header.id === SELECTION_COLUMN_ID;\n return (\n <th\n key={header.id}\n data-pinned={header.column.getIsPinned()}\n className={styles.osdkTableHeaderCell}\n style={columnStyles}\n >\n {header.isPlaceholder\n ? null\n : isSelectColumn\n ? <TableHeaderContent header={header} />\n : (\n <TableHeaderWithPopover\n table={table}\n header={header}\n isColumnPinned={isColumnPinned}\n columnOptions={columnOptions}\n featureFlags={headerMenuFeatureFlags}\n onOpenColumnConfig={handleOpenColumnConfig}\n onOpenMultiSort={handleOpenMultiSort}\n />\n )}\n {header.column.getCanResize()\n && headerMenuFeatureFlags?.showResizeItem !== false && (\n <div\n className={styles.osdkTableHeaderResizer}\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n {!!columnOptions?.length && (\n <ColumnConfigDialog\n isOpen={configDialogOpen}\n onClose={handleCloseColumnConfig}\n columnOptions={columnOptions}\n currentVisibility={currentVisibility}\n currentColumnOrder={currentColumnOrder}\n onApply={handleApplyColumnConfig}\n />\n )}\n {columnOptions?.some(col => col.canSort) && (\n <MultiColumnSortDialog\n isOpen={multiSortDialogOpen}\n onClose={handleCloseMultiSort}\n columnOptions={columnOptions}\n currentSorting={currentSorting}\n onApply={handleApplyMultiSort}\n />\n )}\n </>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"TableHeader.js","names":["classNames","React","useCallback","useMemo","useState","ColumnConfigDialog","MultiColumnSortDialog","styles","TableHeaderContent","TableHeaderWithPopover","SELECTION_COLUMN_ID","getColumnPinningStyles","getHeaderName","column","allHeaders","id","columnDef","header","find","headerDef","displayedHeader","getContext","meta","columnName","TableHeader","table","headerMenuFeatureFlags","setColumnOrder","setColumnVisibility","setSorting","currentSorting","getState","sorting","currentVisibility","columnVisibility","currentColumnOrder","columnOrder","isResizing","columnSizingInfo","isResizingColumn","configDialogOpen","setConfigDialogOpen","multiSortDialogOpen","setMultiSortDialogOpen","handleOpenColumnConfig","handleCloseColumnConfig","handleOpenMultiSort","handleCloseMultiSort","handleApplyMultiSort","sortColumns","handleApplyColumnConfig","updates","newVisibilityState","update","columnId","isVisible","map","col","columnOptions","getHeaderGroups","flatMap","headerGroup","headers","getAllColumns","filter","name","canSort","getCanSort","createElement","Fragment","className","osdkTableHeader","key","osdkTableHeaderRow","columnStyles","isColumnPinned","getIsPinned","isSelectColumn","osdkTableHeaderCell","osdkTableSelectionHeaderCell","style","isPlaceholder","featureFlags","onOpenColumnConfig","onOpenMultiSort","getCanResize","showResizeItem","osdkTableHeaderResizer","onDoubleClick","resetSize","onMouseDown","getResizeHandler","onTouchStart","length","isOpen","onClose","onApply","some"],"sources":["TableHeader.tsx"],"sourcesContent":["/*\n * Copyright 2025 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n Column,\n Header,\n RowData,\n SortingState,\n Table,\n VisibilityState,\n} from \"@tanstack/react-table\";\nimport classNames from \"classnames\";\nimport React, { useCallback, useMemo, useState } from \"react\";\nimport { type ColumnConfig, ColumnConfigDialog } from \"./ColumnConfigDialog.js\";\nimport { MultiColumnSortDialog } from \"./MultiColumnSortDialog.js\";\nimport styles from \"./TableHeader.module.css\";\nimport { TableHeaderContent } from \"./TableHeaderContent.js\";\nimport {\n type HeaderMenuFeatureFlags,\n TableHeaderWithPopover,\n} from \"./TableHeaderWithPopover.js\";\nimport { SELECTION_COLUMN_ID } from \"./utils/constants.js\";\nimport { getColumnPinningStyles } from \"./utils/getColumnPinningStyles.js\";\nimport type { ColumnOption } from \"./utils/types.js\";\n\ninterface TableHeaderProps<\n TData extends RowData,\n> {\n table: Table<TData>;\n headerMenuFeatureFlags?: HeaderMenuFeatureFlags;\n}\n\nconst getHeaderName = <TData,>(\n column: Column<TData, unknown>,\n allHeaders: Header<TData, unknown>[],\n) => {\n const { id, columnDef } = column;\n const header = allHeaders.find(header => header.id === id);\n const headerDef = columnDef.header;\n\n if (headerDef) {\n if (typeof headerDef === \"string\") {\n return headerDef;\n }\n // Try to get header name from the renderHeader function\n if (header) {\n const displayedHeader = headerDef(header.getContext());\n if (typeof displayedHeader === \"string\") return displayedHeader;\n }\n }\n // Fallback to use the columnName provided by user or id\n const { meta } = columnDef;\n return meta?.columnName ?? id;\n};\n\nexport function TableHeader<\n TData extends RowData,\n>({\n table,\n headerMenuFeatureFlags,\n}: TableHeaderProps<TData>): React.ReactElement {\n // TODO: If value is number type, right align header\n\n const {\n setColumnOrder,\n setColumnVisibility,\n setSorting,\n } = table;\n\n const currentSorting = table.getState().sorting;\n const currentVisibility = table.getState().columnVisibility;\n const currentColumnOrder = table.getState().columnOrder;\n\n const isResizing = !!table.getState().columnSizingInfo?.isResizingColumn;\n\n const [configDialogOpen, setConfigDialogOpen] = useState(false);\n const [multiSortDialogOpen, setMultiSortDialogOpen] = useState(false);\n\n const handleOpenColumnConfig = useCallback(() => {\n setConfigDialogOpen(true);\n }, []);\n\n const handleCloseColumnConfig = useCallback(() => {\n setConfigDialogOpen(false);\n }, []);\n\n const handleOpenMultiSort = useCallback(() => {\n setMultiSortDialogOpen(true);\n }, []);\n\n const handleCloseMultiSort = useCallback(() => {\n setMultiSortDialogOpen(false);\n }, []);\n\n const handleApplyMultiSort = useCallback(\n (sortColumns: SortingState) => {\n setMultiSortDialogOpen(false);\n setSorting?.(sortColumns);\n },\n [setSorting],\n );\n\n const handleApplyColumnConfig = useCallback(\n (updates: ColumnConfig[]) => {\n const newVisibilityState: VisibilityState = {};\n for (const update of updates) {\n newVisibilityState[update.columnId] = update.isVisible;\n }\n\n setColumnOrder(updates.map(col => col.columnId));\n setColumnVisibility(newVisibilityState);\n },\n [setColumnOrder, setColumnVisibility],\n );\n\n const columnOptions: ColumnOption[] = useMemo(() => {\n const allHeaders = table.getHeaderGroups().flatMap(headerGroup =>\n headerGroup.headers\n );\n\n return table\n .getAllColumns()\n .filter((column) => column.id !== SELECTION_COLUMN_ID)\n .map((column) => {\n return {\n id: column.id,\n name: getHeaderName(column, allHeaders),\n canSort: column.getCanSort(),\n };\n });\n }, [table]);\n\n return (\n <>\n <thead className={styles.osdkTableHeader} data-resizing={isResizing}>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr\n key={headerGroup.id}\n className={styles.osdkTableHeaderRow}\n >\n {headerGroup.headers.map((header) => {\n const { columnStyles } = getColumnPinningStyles(header.column);\n const isColumnPinned = header.column.getIsPinned();\n const isSelectColumn = header.id === SELECTION_COLUMN_ID;\n return (\n <th\n key={header.id}\n data-pinned={header.column.getIsPinned()}\n className={classNames(styles.osdkTableHeaderCell, {\n [styles.osdkTableSelectionHeaderCell]: isSelectColumn,\n })}\n style={columnStyles}\n >\n {header.isPlaceholder\n ? null\n : isSelectColumn\n ? <TableHeaderContent header={header} />\n : (\n <TableHeaderWithPopover\n table={table}\n header={header}\n isColumnPinned={isColumnPinned}\n columnOptions={columnOptions}\n featureFlags={headerMenuFeatureFlags}\n onOpenColumnConfig={handleOpenColumnConfig}\n onOpenMultiSort={handleOpenMultiSort}\n />\n )}\n {header.column.getCanResize()\n && headerMenuFeatureFlags?.showResizeItem !== false && (\n <div\n className={styles.osdkTableHeaderResizer}\n onDoubleClick={() => header.column.resetSize()}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n />\n )}\n </th>\n );\n })}\n </tr>\n ))}\n </thead>\n {!!columnOptions?.length && (\n <ColumnConfigDialog\n isOpen={configDialogOpen}\n onClose={handleCloseColumnConfig}\n columnOptions={columnOptions}\n currentVisibility={currentVisibility}\n currentColumnOrder={currentColumnOrder}\n onApply={handleApplyColumnConfig}\n />\n )}\n {columnOptions?.some(col => col.canSort) && (\n <MultiColumnSortDialog\n isOpen={multiSortDialogOpen}\n onClose={handleCloseMultiSort}\n columnOptions={columnOptions}\n currentSorting={currentSorting}\n onApply={handleApplyMultiSort}\n />\n )}\n </>\n );\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAUA,OAAOA,UAAU,MAAM,YAAY;AACnC,OAAOC,KAAK,IAAIC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AAC7D,SAA4BC,kBAAkB,QAAQ,yBAAyB;AAC/E,SAASC,qBAAqB,QAAQ,4BAA4B;AAClE,OAAOC,MAAM,MAAM,0BAA0B;AAC7C,SAASC,kBAAkB,QAAQ,yBAAyB;AAC5D,SAEEC,sBAAsB,QACjB,6BAA6B;AACpC,SAASC,mBAAmB,QAAQ,sBAAsB;AAC1D,SAASC,sBAAsB,QAAQ,mCAAmC;AAU1E,MAAMC,aAAa,GAAGA,CACpBC,MAA8B,EAC9BC,UAAoC,KACjC;EACH,MAAM;IAAEC,EAAE;IAAEC;EAAU,CAAC,GAAGH,MAAM;EAChC,MAAMI,MAAM,GAAGH,UAAU,CAACI,IAAI,CAACD,MAAM,IAAIA,MAAM,CAACF,EAAE,KAAKA,EAAE,CAAC;EAC1D,MAAMI,SAAS,GAAGH,SAAS,CAACC,MAAM;EAElC,IAAIE,SAAS,EAAE;IACb,IAAI,OAAOA,SAAS,KAAK,QAAQ,EAAE;MACjC,OAAOA,SAAS;IAClB;IACA;IACA,IAAIF,MAAM,EAAE;MACV,MAAMG,eAAe,GAAGD,SAAS,CAACF,MAAM,CAACI,UAAU,CAAC,CAAC,CAAC;MACtD,IAAI,OAAOD,eAAe,KAAK,QAAQ,EAAE,OAAOA,eAAe;IACjE;EACF;EACA;EACA,MAAM;IAAEE;EAAK,CAAC,GAAGN,SAAS;EAC1B,OAAOM,IAAI,EAAEC,UAAU,IAAIR,EAAE;AAC/B,CAAC;AAED,OAAO,SAASS,WAAWA,CAEzB;EACAC,KAAK;EACLC;AACuB,CAAC,EAAsB;EAC9C;;EAEA,MAAM;IACJC,cAAc;IACdC,mBAAmB;IACnBC;EACF,CAAC,GAAGJ,KAAK;EAET,MAAMK,cAAc,GAAGL,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACC,OAAO;EAC/C,MAAMC,iBAAiB,GAAGR,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACG,gBAAgB;EAC3D,MAAMC,kBAAkB,GAAGV,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACK,WAAW;EAEvD,MAAMC,UAAU,GAAG,CAAC,CAACZ,KAAK,CAACM,QAAQ,CAAC,CAAC,CAACO,gBAAgB,EAAEC,gBAAgB;EAExE,MAAM,CAACC,gBAAgB,EAAEC,mBAAmB,CAAC,GAAGrC,QAAQ,CAAC,KAAK,CAAC;EAC/D,MAAM,CAACsC,mBAAmB,EAAEC,sBAAsB,CAAC,GAAGvC,QAAQ,CAAC,KAAK,CAAC;EAErE,MAAMwC,sBAAsB,GAAG1C,WAAW,CAAC,MAAM;IAC/CuC,mBAAmB,CAAC,IAAI,CAAC;EAC3B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMI,uBAAuB,GAAG3C,WAAW,CAAC,MAAM;IAChDuC,mBAAmB,CAAC,KAAK,CAAC;EAC5B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMK,mBAAmB,GAAG5C,WAAW,CAAC,MAAM;IAC5CyC,sBAAsB,CAAC,IAAI,CAAC;EAC9B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMI,oBAAoB,GAAG7C,WAAW,CAAC,MAAM;IAC7CyC,sBAAsB,CAAC,KAAK,CAAC;EAC/B,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMK,oBAAoB,GAAG9C,WAAW,CACrC+C,WAAyB,IAAK;IAC7BN,sBAAsB,CAAC,KAAK,CAAC;IAC7Bd,UAAU,GAAGoB,WAAW,CAAC;EAC3B,CAAC,EACD,CAACpB,UAAU,CACb,CAAC;EAED,MAAMqB,uBAAuB,GAAGhD,WAAW,CACxCiD,OAAuB,IAAK;IAC3B,MAAMC,kBAAmC,GAAG,CAAC,CAAC;IAC9C,KAAK,MAAMC,MAAM,IAAIF,OAAO,EAAE;MAC5BC,kBAAkB,CAACC,MAAM,CAACC,QAAQ,CAAC,GAAGD,MAAM,CAACE,SAAS;IACxD;IAEA5B,cAAc,CAACwB,OAAO,CAACK,GAAG,CAACC,GAAG,IAAIA,GAAG,CAACH,QAAQ,CAAC,CAAC;IAChD1B,mBAAmB,CAACwB,kBAAkB,CAAC;EACzC,CAAC,EACD,CAACzB,cAAc,EAAEC,mBAAmB,CACtC,CAAC;EAED,MAAM8B,aAA6B,GAAGvD,OAAO,CAAC,MAAM;IAClD,MAAMW,UAAU,GAAGW,KAAK,CAACkC,eAAe,CAAC,CAAC,CAACC,OAAO,CAACC,WAAW,IAC5DA,WAAW,CAACC,OACd,CAAC;IAED,OAAOrC,KAAK,CACTsC,aAAa,CAAC,CAAC,CACfC,MAAM,CAAEnD,MAAM,IAAKA,MAAM,CAACE,EAAE,KAAKL,mBAAmB,CAAC,CACrD8C,GAAG,CAAE3C,MAAM,IAAK;MACf,OAAO;QACLE,EAAE,EAAEF,MAAM,CAACE,EAAE;QACbkD,IAAI,EAAErD,aAAa,CAACC,MAAM,EAAEC,UAAU,CAAC;QACvCoD,OAAO,EAAErD,MAAM,CAACsD,UAAU,CAAC;MAC7B,CAAC;IACH,CAAC,CAAC;EACN,CAAC,EAAE,CAAC1C,KAAK,CAAC,CAAC;EAEX,oBACExB,KAAA,CAAAmE,aAAA,CAAAnE,KAAA,CAAAoE,QAAA,qBACEpE,KAAA,CAAAmE,aAAA;IAAOE,SAAS,EAAE/D,MAAM,CAACgE,eAAgB;IAAC,iBAAelC;EAAW,GACjEZ,KAAK,CAACkC,eAAe,CAAC,CAAC,CAACH,GAAG,CAAEK,WAAW,iBACvC5D,KAAA,CAAAmE,aAAA;IACEI,GAAG,EAAEX,WAAW,CAAC9C,EAAG;IACpBuD,SAAS,EAAE/D,MAAM,CAACkE;EAAmB,GAEpCZ,WAAW,CAACC,OAAO,CAACN,GAAG,CAAEvC,MAAM,IAAK;IACnC,MAAM;MAAEyD;IAAa,CAAC,GAAG/D,sBAAsB,CAACM,MAAM,CAACJ,MAAM,CAAC;IAC9D,MAAM8D,cAAc,GAAG1D,MAAM,CAACJ,MAAM,CAAC+D,WAAW,CAAC,CAAC;IAClD,MAAMC,cAAc,GAAG5D,MAAM,CAACF,EAAE,KAAKL,mBAAmB;IACxD,oBACET,KAAA,CAAAmE,aAAA;MACEI,GAAG,EAAEvD,MAAM,CAACF,EAAG;MACf,eAAaE,MAAM,CAACJ,MAAM,CAAC+D,WAAW,CAAC,CAAE;MACzCN,SAAS,EAAEtE,UAAU,CAACO,MAAM,CAACuE,mBAAmB,EAAE;QAChD,CAACvE,MAAM,CAACwE,4BAA4B,GAAGF;MACzC,CAAC,CAAE;MACHG,KAAK,EAAEN;IAAa,GAEnBzD,MAAM,CAACgE,aAAa,GACjB,IAAI,GACJJ,cAAc,gBACd5E,KAAA,CAAAmE,aAAA,CAAC5D,kBAAkB;MAACS,MAAM,EAAEA;IAAO,CAAE,CAAC,gBAEtChB,KAAA,CAAAmE,aAAA,CAAC3D,sBAAsB;MACrBgB,KAAK,EAAEA,KAAM;MACbR,MAAM,EAAEA,MAAO;MACf0D,cAAc,EAAEA,cAAe;MAC/BjB,aAAa,EAAEA,aAAc;MAC7BwB,YAAY,EAAExD,sBAAuB;MACrCyD,kBAAkB,EAAEvC,sBAAuB;MAC3CwC,eAAe,EAAEtC;IAAoB,CACtC,CACF,EACF7B,MAAM,CAACJ,MAAM,CAACwE,YAAY,CAAC,CAAC,IACxB3D,sBAAsB,EAAE4D,cAAc,KAAK,KAAK,iBACnDrF,KAAA,CAAAmE,aAAA;MACEE,SAAS,EAAE/D,MAAM,CAACgF,sBAAuB;MACzCC,aAAa,EAAEA,CAAA,KAAMvE,MAAM,CAACJ,MAAM,CAAC4E,SAAS,CAAC,CAAE;MAC/CC,WAAW,EAAEzE,MAAM,CAAC0E,gBAAgB,CAAC,CAAE;MACvCC,YAAY,EAAE3E,MAAM,CAAC0E,gBAAgB,CAAC;IAAE,CACzC,CAED,CAAC;EAET,CAAC,CACC,CACL,CACI,CAAC,EACP,CAAC,CAACjC,aAAa,EAAEmC,MAAM,iBACtB5F,KAAA,CAAAmE,aAAA,CAAC/D,kBAAkB;IACjByF,MAAM,EAAEtD,gBAAiB;IACzBuD,OAAO,EAAElD,uBAAwB;IACjCa,aAAa,EAAEA,aAAc;IAC7BzB,iBAAiB,EAAEA,iBAAkB;IACrCE,kBAAkB,EAAEA,kBAAmB;IACvC6D,OAAO,EAAE9C;EAAwB,CAClC,CACF,EACAQ,aAAa,EAAEuC,IAAI,CAACxC,GAAG,IAAIA,GAAG,CAACS,OAAO,CAAC,iBACtCjE,KAAA,CAAAmE,aAAA,CAAC9D,qBAAqB;IACpBwF,MAAM,EAAEpD,mBAAoB;IAC5BqD,OAAO,EAAEhD,oBAAqB;IAC9BW,aAAa,EAAEA,aAAc;IAC7B5B,cAAc,EAAEA,cAAe;IAC/BkE,OAAO,EAAEhD;EAAqB,CAC/B,CAEH,CAAC;AAEP","ignoreList":[]}
@@ -78,8 +78,9 @@
78
78
  border-left: var(--osdk-table-pinned-column-border);
79
79
  }
80
80
 
81
- .osdkTableHeaderCell:has([role="checkbox"]) {
81
+ .osdkTableSelectionHeaderCell {
82
82
  justify-content: center;
83
+ padding: 0;
83
84
  }
84
85
 
85
86
  .osdkTableHeaderResizer {
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2025 Palantir Technologies, Inc. All rights reserved.
2
+ * Copyright 2026 Palantir Technologies, Inc. All rights reserved.
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -1 +1 @@
1
- {"version":3,"file":"assertUnreachable.js","names":["assertUnreachable","value","Error","String"],"sources":["assertUnreachable.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\n/**\n * Exhaustive type checking helper.\n * Use in default cases of switch statements to ensure all cases are handled.\n * TypeScript will error if a case is missing.\n */\nexport function assertUnreachable(value: never): never {\n throw new Error(`Unhandled value: ${String(value)}`);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAACC,KAAY,EAAS;EACrD,MAAM,IAAIC,KAAK,CAAC,oBAAoBC,MAAM,CAACF,KAAK,CAAC,EAAE,CAAC;AACtD","ignoreList":[]}
1
+ {"version":3,"file":"assertUnreachable.js","names":["assertUnreachable","value","Error","String"],"sources":["assertUnreachable.ts"],"sourcesContent":["/*\n * Copyright 2026 Palantir Technologies, Inc. All rights reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Exhaustive type checking helper.\n * Use in default cases of switch statements to ensure all cases are handled.\n * TypeScript will error if a case is missing.\n */\nexport function assertUnreachable(value: never): never {\n throw new Error(`Unhandled value: ${String(value)}`);\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAACC,KAAY,EAAS;EACrD,MAAM,IAAIC,KAAK,CAAC,oBAAoBC,MAAM,CAACF,KAAK,CAAC,EAAE,CAAC;AACtD","ignoreList":[]}