@teselagen/ui 0.10.5 → 0.10.7

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.
@@ -1,4 +1,4 @@
1
- import { camelCase, set } from "lodash-es";
1
+ import { camelCase, flatMap, set } from "lodash-es";
2
2
 
3
3
  export function tableQueryParamsToHasuraClauses({
4
4
  page,
@@ -24,48 +24,62 @@ export function tableQueryParamsToHasuraClauses({
24
24
  const searchTerms = searchTerm.split(",");
25
25
 
26
26
  schema.fields.forEach(field => {
27
- const { type, path, searchDisabled, isHidden } = field;
28
- if (uniqueFieldsByPath[path]) return; // Skip if already added
29
- uniqueFieldsByPath[path] = true;
30
- if (
31
- searchDisabled ||
32
- field.filterDisabled ||
33
- type === "color" ||
27
+ const {
28
+ type,
29
+ path,
30
+ additionalSearchPaths = [],
31
+ searchDisabled,
34
32
  isHidden
35
- )
36
- return;
33
+ } = field;
34
+ const allPaths = [path, ...additionalSearchPaths];
35
+ allPaths.forEach(path => {
36
+ addSearchTermFilters(path);
37
+ });
37
38
 
38
- // Process each search term
39
- searchTerms.forEach(term => {
40
- const filterValue = term.trim(); // Trim the term to handle spaces after commas
39
+ function addSearchTermFilters(path) {
40
+ if (uniqueFieldsByPath[path]) return; // Skip if already added
41
+ uniqueFieldsByPath[path] = true;
42
+ if (
43
+ searchDisabled ||
44
+ field.filterDisabled ||
45
+ type === "color" ||
46
+ isHidden ||
47
+ !path
48
+ )
49
+ return;
41
50
 
42
- if (type === "string" || type === "lookup") {
43
- const o = set({}, path, { _ilike: `%${filterValue}%` });
44
- searchTermFilters.push(o);
45
- } else if (type === "boolean") {
46
- let regex;
47
- try {
48
- regex = new RegExp("^" + filterValue, "ig");
49
- } catch (error) {
50
- //ignore
51
- }
52
- if (regex) {
53
- if ("true".replace(regex, "") !== "true") {
54
- const o = set({}, path, { _eq: true });
55
- searchTermFilters.push(o);
56
- } else if ("false".replace(regex, "") !== "false") {
57
- const o = set({}, path, { _eq: false });
58
- searchTermFilters.push(o);
51
+ // Process each search term
52
+ searchTerms.forEach(term => {
53
+ const filterValue = term.trim(); // Trim the term to handle spaces after commas
54
+
55
+ if (type === "string" || type === "lookup") {
56
+ const o = set({}, path, { _ilike: `%${filterValue}%` });
57
+ searchTermFilters.push(o);
58
+ } else if (type === "boolean") {
59
+ let regex;
60
+ try {
61
+ regex = new RegExp("^" + filterValue, "ig");
62
+ } catch (error) {
63
+ //ignore
64
+ }
65
+ if (regex) {
66
+ if ("true".replace(regex, "") !== "true") {
67
+ const o = set({}, path, { _eq: true });
68
+ searchTermFilters.push(o);
69
+ } else if ("false".replace(regex, "") !== "false") {
70
+ const o = set({}, path, { _eq: false });
71
+ searchTermFilters.push(o);
72
+ }
59
73
  }
74
+ } else if (
75
+ (type === "number" || type === "integer") &&
76
+ !isNaN(filterValue)
77
+ ) {
78
+ const o = set({}, path, { _eq: parseFloat(filterValue) });
79
+ searchTermFilters.push(o);
60
80
  }
61
- } else if (
62
- (type === "number" || type === "integer") &&
63
- !isNaN(filterValue)
64
- ) {
65
- const o = set({}, path, { _eq: parseFloat(filterValue) });
66
- searchTermFilters.push(o);
67
- }
68
- });
81
+ });
82
+ }
69
83
  });
70
84
 
71
85
  if (searchTermFilters.length > 0) {
@@ -78,11 +92,18 @@ export function tableQueryParamsToHasuraClauses({
78
92
  }
79
93
 
80
94
  if (filters && filters.length > 0) {
81
- const filterClauses = filters.map(filter => {
95
+ const filterClauses = flatMap(filters, filter => {
82
96
  let { selectedFilter, filterOn, filterValue } = filter;
83
97
  const fieldSchema = ccFields[filterOn] || {};
84
98
 
85
- const { path, reference, type, customColumnFilter } = fieldSchema;
99
+ const {
100
+ path,
101
+ additionalSearchPaths = [],
102
+ reference,
103
+ type,
104
+ customColumnFilter
105
+ } = fieldSchema;
106
+
86
107
  if (customColumnFilter) {
87
108
  return customColumnFilter(filterValue);
88
109
  }
@@ -116,121 +137,132 @@ export function tableQueryParamsToHasuraClauses({
116
137
 
117
138
  if (reference) {
118
139
  filterOn = reference.sourceField;
140
+ return addColumnFilters(filterOn);
119
141
  } else {
120
- filterOn = path || filterOn;
142
+ if (path) {
143
+ const allPaths = [path, ...additionalSearchPaths];
144
+ return allPaths.map(p => addColumnFilters(p));
145
+ } else {
146
+ return addColumnFilters(filterOn);
147
+ }
121
148
  }
122
- switch (selectedFilter) {
123
- case "none":
124
- return {};
125
- case "startsWith":
126
- return { [filterOn]: { _ilike: `${filterValue}%` } };
127
- case "endsWith":
128
- return { [filterOn]: { _ilike: `%${filterValue}` } };
129
- case "contains":
130
- return { [filterOn]: { _ilike: `%${filterValue}%` } };
131
- case "notContains":
132
- return { [filterOn]: { _nilike: `%${filterValue}%` } };
133
- case "isExactly":
134
- return { [filterOn]: { _eq: filterValue } };
135
- case "isEmpty":
136
- if (filterOn.includes(".")) {
137
- // if we're filtering on a nested field, like a sequence table with parts.name
138
- // we really want to just query on the top level field's existence
149
+
150
+ function addColumnFilters(filterOn) {
151
+ switch (selectedFilter) {
152
+ case "none":
153
+ return {};
154
+ case "startsWith":
155
+ return { [filterOn]: { _ilike: `${filterValue}%` } };
156
+ case "endsWith":
157
+ return { [filterOn]: { _ilike: `%${filterValue}` } };
158
+ case "contains":
159
+ return { [filterOn]: { _ilike: `%${filterValue}%` } };
160
+ case "notContains":
161
+ return { [filterOn]: { _nilike: `%${filterValue}%` } };
162
+ case "isExactly":
163
+ return { [filterOn]: { _eq: filterValue } };
164
+ case "isEmpty":
165
+ if (filterOn.includes(".")) {
166
+ // if we're filtering on a nested field, like a sequence table with parts.name
167
+ // we really want to just query on the top level field's existence
168
+ return {
169
+ _not: {
170
+ [filterOn.split(".")[0]]: {}
171
+ }
172
+ };
173
+ }
139
174
  return {
140
- _not: {
141
- [filterOn.split(".")[0]]: {}
142
- }
175
+ _or: [
176
+ { [filterOn]: { _eq: "" } },
177
+ { [filterOn]: { _is_null: true } }
178
+ ]
143
179
  };
144
- }
145
- return {
146
- _or: [
147
- { [filterOn]: { _eq: "" } },
148
- { [filterOn]: { _is_null: true } }
149
- ]
150
- };
151
- case "notEmpty":
152
- return {
153
- _and: [
154
- { [filterOn]: { _neq: "" } },
155
- { [filterOn]: { _is_null: false } }
156
- ]
157
- };
158
- case "inList":
159
- return { [filterOn]: { _in: filterValue } };
160
- case "notInList":
161
- return { [filterOn]: { _nin: filterValue } };
162
- case "true":
163
- return { [filterOn]: { _eq: true } };
164
- case "false":
165
- return { [filterOn]: { _eq: false } };
166
- case "dateIs":
167
- return { [filterOn]: { _eq: filterValue } };
168
- case "notBetween":
169
- return {
170
- _or: [
171
- {
172
- [filterOn]: {
173
- _lt: new Date(arrayFilterValue[0])
174
- }
175
- },
176
- {
177
- [filterOn]: {
178
- _gt: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
180
+ case "notEmpty":
181
+ return {
182
+ _and: [
183
+ { [filterOn]: { _neq: "" } },
184
+ { [filterOn]: { _is_null: false } }
185
+ ]
186
+ };
187
+ case "inList":
188
+ return { [filterOn]: { _in: filterValue } };
189
+ case "notInList":
190
+ return { [filterOn]: { _nin: filterValue } };
191
+ case "true":
192
+ return { [filterOn]: { _eq: true } };
193
+ case "false":
194
+ return { [filterOn]: { _eq: false } };
195
+ case "dateIs":
196
+ return { [filterOn]: { _eq: filterValue } };
197
+ case "notBetween":
198
+ return {
199
+ _or: [
200
+ {
201
+ [filterOn]: {
202
+ _lt: new Date(arrayFilterValue[0])
203
+ }
204
+ },
205
+ {
206
+ [filterOn]: {
207
+ _gt: new Date(
208
+ new Date(arrayFilterValue[1]).setHours(23, 59)
209
+ )
210
+ }
179
211
  }
212
+ ]
213
+ };
214
+ case "isBetween":
215
+ return {
216
+ [filterOn]: {
217
+ _gte: new Date(arrayFilterValue[0]),
218
+ _lte: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
180
219
  }
181
- ]
182
- };
183
- case "isBetween":
184
- return {
185
- [filterOn]: {
186
- _gte: new Date(arrayFilterValue[0]),
187
- _lte: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
188
- }
189
- };
190
- case "isBefore":
191
- return { [filterOn]: { _lt: new Date(filterValue) } };
192
- case "isAfter":
193
- return { [filterOn]: { _gt: new Date(filterValue) } };
194
- case "greaterThan":
195
- return { [filterOn]: { _gt: parseFloat(filterValue) } };
196
- case "lessThan":
197
- return { [filterOn]: { _lt: parseFloat(filterValue) } };
198
- case "inRange":
199
- return {
200
- [filterOn]: {
201
- _gte: parseFloat(arrayFilterValue[0]),
202
- _lte: parseFloat(arrayFilterValue[1])
203
- }
204
- };
205
- case "outsideRange":
206
- return {
207
- _or: [
208
- {
209
- [filterOn]: {
210
- _lt: parseFloat(arrayFilterValue[0])
211
- }
212
- },
213
- {
214
- [filterOn]: {
215
- _gt: parseFloat(arrayFilterValue[1])
220
+ };
221
+ case "isBefore":
222
+ return { [filterOn]: { _lt: new Date(filterValue) } };
223
+ case "isAfter":
224
+ return { [filterOn]: { _gt: new Date(filterValue) } };
225
+ case "greaterThan":
226
+ return { [filterOn]: { _gt: parseFloat(filterValue) } };
227
+ case "lessThan":
228
+ return { [filterOn]: { _lt: parseFloat(filterValue) } };
229
+ case "inRange":
230
+ return {
231
+ [filterOn]: {
232
+ _gte: parseFloat(arrayFilterValue[0]),
233
+ _lte: parseFloat(arrayFilterValue[1])
234
+ }
235
+ };
236
+ case "outsideRange":
237
+ return {
238
+ _or: [
239
+ {
240
+ [filterOn]: {
241
+ _lt: parseFloat(arrayFilterValue[0])
242
+ }
243
+ },
244
+ {
245
+ [filterOn]: {
246
+ _gt: parseFloat(arrayFilterValue[1])
247
+ }
216
248
  }
249
+ ]
250
+ };
251
+ case "equalTo":
252
+ return {
253
+ [filterOn]: {
254
+ _eq:
255
+ type === "number" || type === "integer"
256
+ ? parseFloat(filterValue)
257
+ : filterValue
217
258
  }
218
- ]
219
- };
220
- case "equalTo":
221
- return {
222
- [filterOn]: {
223
- _eq:
224
- type === "number" || type === "integer"
225
- ? parseFloat(filterValue)
226
- : filterValue
227
- }
228
- };
229
- case "regex":
230
- return { [filterOn]: { _regex: filterValue } };
231
- default:
232
- console.warn(`Unsupported filter type: ${selectedFilter}`);
233
- return {};
259
+ };
260
+ case "regex":
261
+ return { [filterOn]: { _regex: filterValue } };
262
+ default:
263
+ console.warn(`Unsupported filter type: ${selectedFilter}`);
264
+ return {};
265
+ }
234
266
  }
235
267
  });
236
268
 
@@ -49,7 +49,6 @@ export const useTableParams = props => {
49
49
  orderByFirstColumn,
50
50
  pageSize,
51
51
  schema,
52
- syncDisplayOptionsToDb,
53
52
  tableParams: _tableParams,
54
53
  urlConnected,
55
54
  withDisplayOptions,
@@ -164,13 +163,13 @@ export const useTableParams = props => {
164
163
  _tableConfig?.userSetPageSize &&
165
164
  parseInt(_tableConfig.userSetPageSize, 10);
166
165
  let _defaultsToUse = defaults;
167
- if (!syncDisplayOptionsToDb && userSetPageSize) {
166
+ if (userSetPageSize) {
168
167
  _defaultsToUse = _defaultsToUse || {};
169
168
  _defaultsToUse.pageSize = userSetPageSize;
170
169
  }
171
170
 
172
171
  return _defaultsToUse;
173
- }, [defaults, formName, syncDisplayOptionsToDb]);
172
+ }, [defaults, formName]);
174
173
 
175
174
  const passingProps = useMemo(
176
175
  () => ({
@@ -5,7 +5,6 @@ import { reduce } from "lodash-es";
5
5
  export const viewColumn = {
6
6
  width: 35,
7
7
  noEllipsis: true,
8
- hideInMenu: true,
9
8
  immovable: true,
10
9
  type: "action",
11
10
  render: () => {
@@ -429,6 +429,7 @@ class TgSelect extends React.Component {
429
429
  }
430
430
  },
431
431
  inputProps: {
432
+ autoComplete: "off",
432
433
  name: "tg-multiselect-input",
433
434
  autoFocus: autoFocus || autoOpen,
434
435
  onBlur,
package/ui.css CHANGED
@@ -10066,6 +10066,19 @@ body:not(.drag-active)
10066
10066
  display: flex;
10067
10067
  flex-direction: column;
10068
10068
  }
10069
+ .th-dragging {
10070
+ z-index: 999 !important;
10071
+ cursor: grabbing !important;
10072
+ opacity: 0.8;
10073
+ background-color: #f5f8fa;
10074
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
10075
+ }
10076
+
10077
+ .bp3-dark .th-dragging {
10078
+ background-color: #30404d;
10079
+ box-shadow: 0 2px 8px rgba(250, 245, 245, 0.15);
10080
+ outline: 1px solid #48aff0;
10081
+ }
10069
10082
  .dna-loader {
10070
10083
  display: inline-block;
10071
10084
  position: relative;