@teselagen/ui 0.3.9 → 0.3.11

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 (35) hide show
  1. package/index.js +102 -128
  2. package/index.mjs +102 -128
  3. package/package.json +1 -1
  4. package/src/AdvancedOptions.spec.js +3 -1
  5. package/src/DataTable/CellDragHandle.js +8 -8
  6. package/src/DataTable/FilterAndSortMenu.js +13 -13
  7. package/src/DataTable/PagingTool.js +10 -8
  8. package/src/DataTable/dataTableEnhancer.js +11 -9
  9. package/src/DataTable/index.js +115 -116
  10. package/src/DataTable/utils/queryParams.js +48 -48
  11. package/src/DataTable/utils/withTableParams.js +9 -18
  12. package/src/DialogFooter/index.js +1 -1
  13. package/src/FormComponents/Uploader.js +38 -38
  14. package/src/FormComponents/index.js +58 -58
  15. package/src/FormComponents/sortify.js +1 -1
  16. package/src/FormComponents/tryToMatchSchemas.js +4 -5
  17. package/src/MatchHeaders.js +19 -19
  18. package/src/MenuBar/index.js +10 -3
  19. package/src/PromptUnsavedChanges/index.js +1 -3
  20. package/src/UploadCsvWizard.js +12 -12
  21. package/src/autoTooltip.js +2 -2
  22. package/src/enhancers/withDialog/index.js +6 -6
  23. package/src/rerenderOnWindowResize.js +14 -15
  24. package/src/showConfirmationDialog/index.js +1 -3
  25. package/src/utils/basicHandleActionsWithFullState.js +5 -5
  26. package/src/utils/combineReducersWithFullState.js +9 -9
  27. package/src/utils/commandControls.js +21 -22
  28. package/src/utils/handlerHelpers.js +4 -4
  29. package/src/utils/hotkeyUtils.js +10 -8
  30. package/src/utils/menuUtils.js +79 -66
  31. package/src/utils/pureNoFunc.js +1 -1
  32. package/src/utils/renderOnDoc.js +2 -2
  33. package/src/utils/tgFormValues.js +23 -20
  34. package/src/utils/withSelectTableRecords.js +25 -23
  35. package/src/wrapDialog.js +98 -92
@@ -74,7 +74,7 @@ function orderEntitiesLocal(orderArray, entities, schema, ownProps) {
74
74
  if (orderArray && orderArray.length) {
75
75
  const orderFuncs = [];
76
76
  const ascOrDescArray = [];
77
- orderArray.forEach((order) => {
77
+ orderArray.forEach(order => {
78
78
  const ccDisplayName = order.replace(/^-/gi, "");
79
79
  const ccFields = getFieldsMappedByCCDisplayName(schema);
80
80
  const field = ccFields[ccDisplayName];
@@ -95,24 +95,24 @@ function orderEntitiesLocal(orderArray, entities, schema, ownProps) {
95
95
  //push the actual sorting function
96
96
  if (field.type === "timestamp") {
97
97
  //with the timestamp logic above, make sure empty dates always end up on the bottom of the stack
98
- orderFuncs.push((r) => {
98
+ orderFuncs.push(r => {
99
99
  const val = get(r, path);
100
100
  return !!val;
101
101
  });
102
102
  }
103
103
  if (path && endsWith(path.toLowerCase(), "id")) {
104
- orderFuncs.push((o) => {
104
+ orderFuncs.push(o => {
105
105
  return parseInt(get(o, path), 10);
106
106
  });
107
107
  } else if (sortFn) {
108
108
  const toOrder = Array.isArray(sortFn) ? sortFn : [sortFn];
109
109
  orderFuncs.push(...toOrder);
110
110
  } else if (getValueToFilterOn) {
111
- orderFuncs.push((o) => {
111
+ orderFuncs.push(o => {
112
112
  return getValueToFilterOn(o, ownProps);
113
113
  });
114
114
  } else {
115
- orderFuncs.push((r) => {
115
+ orderFuncs.push(r => {
116
116
  const val = get(r, path);
117
117
  return val && val.toLowerCase ? val.toLowerCase() : val;
118
118
  });
@@ -128,7 +128,7 @@ function getAndAndOrFilters(allFilters) {
128
128
  const andFilters = [];
129
129
  const otherOrFilters = [];
130
130
 
131
- allFilters.forEach((filter) => {
131
+ allFilters.forEach(filter => {
132
132
  if (
133
133
  filter.isOrFilter &&
134
134
  typeof filter.filterValue === "string" &&
@@ -178,7 +178,7 @@ function filterEntitiesLocal(
178
178
  const { andFilters, orFilters, otherOrFilters } =
179
179
  getAndAndOrFilters(allFilters);
180
180
  //filter ands first
181
- andFilters.forEach((filter) => {
181
+ andFilters.forEach(filter => {
182
182
  entities = getEntitiesForGivenFilter(
183
183
  entities,
184
184
  filter,
@@ -189,7 +189,7 @@ function filterEntitiesLocal(
189
189
  //then filter ors
190
190
  if (orFilters.length) {
191
191
  let orEntities = [];
192
- orFilters.concat(...otherOrFilters).forEach((filter) => {
192
+ orFilters.concat(...otherOrFilters).forEach(filter => {
193
193
  orEntities = orEntities.concat(
194
194
  getEntitiesForGivenFilter(entities, filter, ccFields, ownProps)
195
195
  );
@@ -204,7 +204,7 @@ function cleanFilterValue(_filterValue, type) {
204
204
  let filterValue = _filterValue;
205
205
  if (type === "number" || type === "integer") {
206
206
  filterValue = Array.isArray(filterValue)
207
- ? filterValue.map((val) => Number(val))
207
+ ? filterValue.map(val => Number(val))
208
208
  : Number(filterValue);
209
209
  }
210
210
  return filterValue;
@@ -216,7 +216,7 @@ function getEntitiesForGivenFilter(entities, filter, ccFields, ownProps) {
216
216
  const { path, getValueToFilterOn } = field;
217
217
  const filterValue = cleanFilterValue(_filterValue, field.type);
218
218
  const subFilter = getSubFilter(false, selectedFilter, filterValue);
219
- entities = entities.filter((entity) => {
219
+ entities = entities.filter(entity => {
220
220
  const fieldVal = getValueToFilterOn
221
221
  ? getValueToFilterOn(entity, ownProps)
222
222
  : get(entity, path);
@@ -233,7 +233,7 @@ function getFiltersFromSearchTerm(searchTerm, schema) {
233
233
  isOrFilter: true,
234
234
  isSearchTermFilter: true
235
235
  };
236
- schema.fields.forEach((field) => {
236
+ schema.fields.forEach(field => {
237
237
  const { type, displayName, path, searchDisabled } = field;
238
238
  if (searchDisabled || field.filterDisabled || type === "color") return;
239
239
  const nameToUse = camelCase(displayName || path);
@@ -310,7 +310,7 @@ function getSubFilter(
310
310
  if (ccSelectedFilter === "startsWith") {
311
311
  return qb
312
312
  ? qb.startsWith(stringFilterValue) //filter using qb (aka we're backend connected)
313
- : (fieldVal) => {
313
+ : fieldVal => {
314
314
  //filter using plain old javascript (aka we've got a local table that isn't backend connected)
315
315
  if (!fieldVal || !fieldVal.toLowerCase) return false;
316
316
  return startsWith(fieldVal.toLowerCase(), filterValLower);
@@ -318,7 +318,7 @@ function getSubFilter(
318
318
  } else if (ccSelectedFilter === "endsWith") {
319
319
  return qb
320
320
  ? qb.endsWith(stringFilterValue) //filter using qb (aka we're backend connected)
321
- : (fieldVal) => {
321
+ : fieldVal => {
322
322
  //filter using plain old javascript (aka we've got a local table that isn't backend connected)
323
323
  if (!fieldVal || !fieldVal.toLowerCase) return false;
324
324
  return endsWith(fieldVal.toLowerCase(), filterValLower);
@@ -331,7 +331,7 @@ function getSubFilter(
331
331
  ? ccSelectedFilter === "contains"
332
332
  ? qb.contains(stringFilterValue.replace(/_/g, "\\_"))
333
333
  : qb.notContains(stringFilterValue.replace(/_/g, "\\_"))
334
- : (fieldVal) => {
334
+ : fieldVal => {
335
335
  if (!fieldVal || !fieldVal.toLowerCase) return false;
336
336
  return ccSelectedFilter === "contains"
337
337
  ? fieldVal.toLowerCase().replace(filterValLower, "") !==
@@ -342,56 +342,56 @@ function getSubFilter(
342
342
  } else if (ccSelectedFilter === "inList") {
343
343
  return qb
344
344
  ? qb.inList(arrayFilterValue) //filter using qb (aka we're backend connected)
345
- : (fieldVal) => {
345
+ : fieldVal => {
346
346
  //filter using plain old javascript (aka we've got a local table that isn't backend connected)
347
347
  if (!fieldVal?.toString) return false;
348
348
  return (
349
349
  arrayFilterValue
350
- .map((val) => val && val.toLowerCase())
350
+ .map(val => val && val.toLowerCase())
351
351
  .indexOf(fieldVal.toString().toLowerCase()) > -1
352
352
  );
353
353
  };
354
354
  } else if (ccSelectedFilter === "notInList") {
355
355
  return qb
356
356
  ? qb.notInList(arrayFilterValue) //filter using qb (aka we're backend connected)
357
- : (fieldVal) => {
357
+ : fieldVal => {
358
358
  //filter using plain old javascript (aka we've got a local table that isn't backend connected)
359
359
  if (!fieldVal?.toString) return false;
360
360
  return (
361
361
  arrayFilterValue
362
- .map((val) => val && val.toLowerCase())
362
+ .map(val => val && val.toLowerCase())
363
363
  .indexOf(fieldVal.toString().toLowerCase()) === -1
364
364
  );
365
365
  };
366
366
  } else if (ccSelectedFilter === "isEmpty") {
367
367
  return qb
368
368
  ? qb.isEmpty()
369
- : (fieldVal) => {
369
+ : fieldVal => {
370
370
  return !fieldVal;
371
371
  };
372
372
  } else if (ccSelectedFilter === "notEmpty") {
373
373
  return qb
374
374
  ? [qb.notNull(), qb.notEquals("")]
375
- : (fieldVal) => {
375
+ : fieldVal => {
376
376
  return !!fieldVal;
377
377
  };
378
378
  } else if (ccSelectedFilter === "isExactly") {
379
379
  return qb
380
380
  ? filterValue
381
- : (fieldVal) => {
381
+ : fieldVal => {
382
382
  return fieldVal === filterValue;
383
383
  };
384
384
  } else if (ccSelectedFilter === "true") {
385
385
  return qb
386
386
  ? qb.equals(true) //filter using qb (aka we're backend connected)
387
- : (fieldVal) => {
387
+ : fieldVal => {
388
388
  //filter using plain old javascript (aka we've got a local table that isn't backend connected)
389
389
  return !!fieldVal;
390
390
  };
391
391
  } else if (ccSelectedFilter === "false") {
392
392
  return qb
393
393
  ? qb.equals(false) //filter using qb (aka we're backend connected)
394
- : (fieldVal) => {
394
+ : fieldVal => {
395
395
  //filter using plain old javascript (aka we've got a local table that isn't backend connected)
396
396
  return !fieldVal;
397
397
  };
@@ -401,7 +401,7 @@ function getSubFilter(
401
401
  new Date(arrayFilterValue[0]),
402
402
  new Date(new Date(arrayFilterValue[1]).setHours(23, 59)) // set end of day for more accurate filtering
403
403
  )
404
- : (fieldVal) => {
404
+ : fieldVal => {
405
405
  return (
406
406
  dayjs(arrayFilterValue[0]).valueOf() <= dayjs(fieldVal).valueOf() &&
407
407
  dayjs(fieldVal).valueOf() <= dayjs(arrayFilterValue[1]).valueOf()
@@ -413,7 +413,7 @@ function getSubFilter(
413
413
  new Date(arrayFilterValue[0]),
414
414
  new Date(new Date(arrayFilterValue[1]).setHours(23, 59)) // set end of day for more accurate filtering
415
415
  )
416
- : (fieldVal) => {
416
+ : fieldVal => {
417
417
  return (
418
418
  dayjs(arrayFilterValue[0]).valueOf() > dayjs(fieldVal).valueOf() ||
419
419
  dayjs(fieldVal).valueOf() > dayjs(arrayFilterValue[1]).valueOf()
@@ -422,49 +422,49 @@ function getSubFilter(
422
422
  } else if (ccSelectedFilter === "isBefore") {
423
423
  return qb
424
424
  ? qb.lessThan(new Date(filterValue))
425
- : (fieldVal) => {
425
+ : fieldVal => {
426
426
  return dayjs(fieldVal).valueOf() < dayjs(filterValue).valueOf();
427
427
  };
428
428
  } else if (ccSelectedFilter === "isAfter") {
429
429
  return qb
430
430
  ? qb.greaterThan(new Date(new Date(filterValue).setHours(23, 59))) // set end of day for more accurate filtering
431
- : (fieldVal) => {
431
+ : fieldVal => {
432
432
  return dayjs(fieldVal).valueOf() > dayjs(filterValue).valueOf();
433
433
  };
434
434
  } else if (ccSelectedFilter === "greaterThan") {
435
435
  return qb
436
436
  ? qb.greaterThan(filterValue)
437
- : (fieldVal) => {
437
+ : fieldVal => {
438
438
  return fieldVal > filterValue;
439
439
  };
440
440
  } else if (ccSelectedFilter === "lessThan") {
441
441
  return qb
442
442
  ? qb.lessThan(filterValue)
443
- : (fieldVal) => {
443
+ : fieldVal => {
444
444
  return fieldVal < filterValue;
445
445
  };
446
446
  } else if (ccSelectedFilter === "inRange") {
447
447
  return qb
448
448
  ? qb.between(filterValue[0], filterValue[1])
449
- : (fieldVal) => {
449
+ : fieldVal => {
450
450
  return filterValue[0] <= fieldVal && fieldVal <= filterValue[1];
451
451
  };
452
452
  } else if (ccSelectedFilter === "outsideRange") {
453
453
  return qb
454
454
  ? qb.notBetween(filterValue[0], filterValue[1])
455
- : (fieldVal) => {
455
+ : fieldVal => {
456
456
  return filterValue[0] > fieldVal || fieldVal > filterValue[1];
457
457
  };
458
458
  } else if (ccSelectedFilter === "equalTo") {
459
459
  return qb
460
460
  ? filterValue
461
- : (fieldVal) => {
461
+ : fieldVal => {
462
462
  return fieldVal === filterValue;
463
463
  };
464
464
  } else if (ccSelectedFilter === "regex") {
465
465
  return qb
466
466
  ? qb.matchesRegex(filterValue)
467
- : (fieldVal) => {
467
+ : fieldVal => {
468
468
  new RegExp(filterValue).test(fieldVal);
469
469
  return fieldVal;
470
470
  };
@@ -530,10 +530,10 @@ function parseFilters(newParams) {
530
530
  order: newParams.order && newParams.order.split("___"),
531
531
  filters:
532
532
  newParams.filters &&
533
- newParams.filters.split("::").map((filter) => {
533
+ newParams.filters.split("::").map(filter => {
534
534
  const splitFilter = filter.split("__");
535
535
  const [filterOn, selectedFilter, filterValue] = splitFilter;
536
- const parseFilterValue = (filterValue) => {
536
+ const parseFilterValue = filterValue => {
537
537
  if (selectedFilter === "inList" || selectedFilter === "notInList") {
538
538
  return filterValue.split(";");
539
539
  }
@@ -605,7 +605,7 @@ export function makeDataTableHandlers({
605
605
  }
606
606
  function removeSingleFilter(filterOn, currentParams) {
607
607
  const filters = currentParams.filters
608
- ? currentParams.filters.filter((filter) => {
608
+ ? currentParams.filters.filter(filter => {
609
609
  return filter.filterOn !== filterOn;
610
610
  })
611
611
  : undefined;
@@ -621,7 +621,7 @@ export function makeDataTableHandlers({
621
621
  searchTerm: undefined,
622
622
  tags: undefined
623
623
  };
624
- additionalFilterKeys.forEach((key) => {
624
+ additionalFilterKeys.forEach(key => {
625
625
  toClear[key] = undefined;
626
626
  });
627
627
  setNewParams(toClear);
@@ -639,7 +639,7 @@ export function makeDataTableHandlers({
639
639
  let newOrder = [];
640
640
  if (shiftHeld) {
641
641
  //first remove the old order
642
- newOrder = [...(currentParams.order || [])].filter((value) => {
642
+ newOrder = [...(currentParams.order || [])].filter(value => {
643
643
  const shouldRemove =
644
644
  value.replace(/^-/, "") === order.replace(/^-/, "");
645
645
  return !shouldRemove;
@@ -703,7 +703,7 @@ function getAllFilters(filters, searchTerm, schema) {
703
703
  ...getFiltersFromSearchTerm(searchTerm, schema)
704
704
  ];
705
705
 
706
- allFilters = allFilters.filter((val) => {
706
+ allFilters = allFilters.filter(val => {
707
707
  return val !== "";
708
708
  }); //get rid of erroneous filters
709
709
 
@@ -817,7 +817,7 @@ export function getQueryParams({
817
817
  const ccFields = getFieldsMappedByCCDisplayName(schema);
818
818
 
819
819
  if (tableQueryParams.order && tableQueryParams.order.length) {
820
- tableQueryParams.order.forEach((orderVal) => {
820
+ tableQueryParams.order.forEach(orderVal => {
821
821
  const ccDisplayName = orderVal.replace(/^-/gi, "");
822
822
  const schemaForField = ccFields[ccDisplayName];
823
823
  if (schemaForField) {
@@ -852,9 +852,9 @@ export function getQueryParams({
852
852
  const { andFilters, orFilters, otherOrFilters } =
853
853
  getAndAndOrFilters(allFilters);
854
854
  try {
855
- const flattenFilters = (filterObj) => {
856
- return flatMap(Object.keys(filterObj), (key) => {
857
- return filterObj[key].map((filter) => ({
855
+ const flattenFilters = filterObj => {
856
+ return flatMap(Object.keys(filterObj), key => {
857
+ return filterObj[key].map(filter => ({
858
858
  [key]: filter
859
859
  }));
860
860
  });
@@ -863,19 +863,19 @@ export function getQueryParams({
863
863
  const orFiltersObject = getQueries(orFilters, qb, ccFields);
864
864
  let allOrFilters = flattenFilters(orFiltersObject);
865
865
 
866
- otherOrFilters.forEach((orFilters) => {
866
+ otherOrFilters.forEach(orFilters => {
867
867
  const otherOrFiltersObject = getQueries(orFilters, qb, ccFields);
868
868
  allOrFilters = allOrFilters.concat(
869
869
  flattenFilters(otherOrFiltersObject)
870
870
  );
871
871
  });
872
872
  allOrFilters.push(additionalOrFilterToUse);
873
- allOrFilters = allOrFilters.filter((obj) => !isEmpty(obj));
873
+ allOrFilters = allOrFilters.filter(obj => !isEmpty(obj));
874
874
 
875
875
  const unflattenedAndQueries = getQueries(andFilters, qb, ccFields);
876
876
  let allAndFilters = flattenFilters(unflattenedAndQueries);
877
877
  allAndFilters.push(additionalFilterToUse);
878
- allAndFilters = allAndFilters.filter((obj) => !isEmpty(obj));
878
+ allAndFilters = allAndFilters.filter(obj => !isEmpty(obj));
879
879
  if (allAndFilters.length) {
880
880
  qb.whereAll(...allAndFilters);
881
881
  }
@@ -958,7 +958,7 @@ function getSubFiltersAndPath(filter, qb, ccFields) {
958
958
  }
959
959
  const subFiltersToUse = [];
960
960
  const subFilters = Array.isArray(_subFilters) ? _subFilters : [_subFilters];
961
- subFilters.forEach((subFilter) => {
961
+ subFilters.forEach(subFilter => {
962
962
  let subFilterToUse = subFilter;
963
963
  if (fieldSchema) {
964
964
  const { path, reference } = fieldSchema;
@@ -1023,7 +1023,7 @@ function getColumnCustomFilters(filters, qb, ccFields) {
1023
1023
 
1024
1024
  is possible because the returned accumulator will be passed to whereAny
1025
1025
  */
1026
- subFilters.forEach((subFilter) => {
1026
+ subFilters.forEach(subFilter => {
1027
1027
  acc.push(fieldSchema.additionalColumnFilter(qb, subFilter, path));
1028
1028
  });
1029
1029
  return acc;
@@ -197,28 +197,23 @@ export default function withTableParams(compOrOpts, pTopLevelOpts) {
197
197
  return {};
198
198
  }
199
199
  const mergedOpts = getMergedOpts(topLevelOptions, ownProps);
200
- const {
201
- formName,
202
- urlConnected,
203
- history,
204
- defaults,
205
- onlyOneFilter
206
- } = mergedOpts;
200
+ const { formName, urlConnected, history, defaults, onlyOneFilter } =
201
+ mergedOpts;
207
202
 
208
203
  function updateSearch(val) {
209
- setTimeout(function() {
204
+ setTimeout(function () {
210
205
  dispatch(change(formName, "reduxFormSearchInput", val || ""));
211
206
  });
212
207
  }
213
208
 
214
209
  let setNewParams;
215
210
  if (urlConnected) {
216
- setNewParams = function(newParams) {
211
+ setNewParams = function (newParams) {
217
212
  setCurrentParamsOnUrl(newParams, history.replace);
218
213
  dispatch(change(formName, "reduxFormQueryParams", newParams)); //we always will update the redux params as a workaround for withRouter not always working if inside a redux-connected container https://github.com/ReactTraining/react-router/issues/5037
219
214
  };
220
215
  } else {
221
- setNewParams = function(newParams) {
216
+ setNewParams = function (newParams) {
222
217
  dispatch(change(formName, "reduxFormQueryParams", newParams));
223
218
  };
224
219
  }
@@ -240,18 +235,14 @@ export default function withTableParams(compOrOpts, pTopLevelOpts) {
240
235
  const { currentParams, formName } = stateProps;
241
236
  const boundDispatchProps = {};
242
237
  //bind currentParams to actions
243
- Object.keys(dispatchProps.bindThese).forEach(function(key) {
238
+ Object.keys(dispatchProps.bindThese).forEach(function (key) {
244
239
  const action = dispatchProps.bindThese[key];
245
- boundDispatchProps[key] = function(...args) {
240
+ boundDispatchProps[key] = function (...args) {
246
241
  action(...args, currentParams);
247
242
  };
248
243
  });
249
- const {
250
- variables,
251
- selectedEntities,
252
- mergedOpts,
253
- ...restStateProps
254
- } = stateProps;
244
+ const { variables, selectedEntities, mergedOpts, ...restStateProps } =
245
+ stateProps;
255
246
 
256
247
  const changeFormValue = (...args) =>
257
248
  dispatchProps.dispatch(change(formName, ...args));
@@ -48,7 +48,7 @@ function DialogFooter({
48
48
  onClick={
49
49
  secondaryAction ||
50
50
  hideModal ||
51
- function() {
51
+ function () {
52
52
  try {
53
53
  r.current
54
54
  .closest(".bp3-dialog")