@teselagen/ui 0.7.33-beta.3 → 0.7.33-beta.5

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 (142) hide show
  1. package/DataTable/utils/queryParams.d.ts +3 -8
  2. package/DataTable/utils/tableQueryParamsToHasuraClauses.d.ts +12 -0
  3. package/index.cjs.js +161 -27
  4. package/index.es.js +161 -27
  5. package/package.json +1 -1
  6. package/src/AdvancedOptions.spec.js +26 -0
  7. package/src/AsyncValidateFieldSpinner/index.js +12 -0
  8. package/src/BlueprintError/index.js +14 -0
  9. package/src/BounceLoader/index.js +16 -0
  10. package/src/BounceLoader/style.css +45 -0
  11. package/src/CollapsibleCard/index.js +68 -0
  12. package/src/CollapsibleCard/style.css +23 -0
  13. package/src/DNALoader/index.js +20 -0
  14. package/src/DNALoader/style.css +251 -0
  15. package/src/{Columns.js → DataTable/Columns.js} +1 -1
  16. package/src/{DisplayOptions.js → DataTable/DisplayOptions.js} +1 -1
  17. package/src/DataTable/index.js +3209 -0
  18. package/src/DataTable/style.css +608 -0
  19. package/src/{filterLocalEntitiesToHasura.js → DataTable/utils/filterLocalEntitiesToHasura.js} +6 -0
  20. package/src/DataTable/utils/filterLocalEntitiesToHasura.test.js +538 -0
  21. package/src/DataTable/utils/index.js +55 -0
  22. package/src/{initializeHasuraWhereAndFilter.js → DataTable/utils/initializeHasuraWhereAndFilter.js} +0 -1
  23. package/src/{queryParams.js → DataTable/utils/queryParams.js} +32 -21
  24. package/src/DataTable/utils/tableQueryParamsToHasuraClauses.js +250 -0
  25. package/src/DataTable/utils/tableQueryParamsToHasuraClauses.test.js +206 -0
  26. package/src/{withTableParams.js → DataTable/utils/withTableParams.js} +2 -2
  27. package/src/DialogFooter/index.js +86 -0
  28. package/src/DialogFooter/style.css +9 -0
  29. package/src/FormComponents/index.js +1266 -0
  30. package/src/FormComponents/style.css +275 -0
  31. package/src/FormComponents/utils.js +6 -0
  32. package/src/HotkeysDialog/index.js +79 -0
  33. package/src/HotkeysDialog/style.css +54 -0
  34. package/src/InfoHelper/index.js +78 -0
  35. package/src/InfoHelper/style.css +7 -0
  36. package/src/IntentText/index.js +18 -0
  37. package/src/Loading/index.js +70 -0
  38. package/src/Loading/style.css +4 -0
  39. package/src/MenuBar/index.js +423 -0
  40. package/src/MenuBar/style.css +45 -0
  41. package/src/PromptUnsavedChanges/index.js +38 -0
  42. package/src/ResizableDraggableDialog/index.js +141 -0
  43. package/src/ResizableDraggableDialog/style.css +42 -0
  44. package/src/ScrollToTop/index.js +72 -0
  45. package/src/TagSelect/index.js +69 -0
  46. package/src/TagSelect/style.css +13 -0
  47. package/src/TgHtmlSelect/index.js +20 -0
  48. package/src/TgSelect/index.js +537 -0
  49. package/src/TgSelect/style.css +61 -0
  50. package/src/TgSuggest/index.js +124 -0
  51. package/src/Timeline/index.js +15 -0
  52. package/src/Timeline/style.css +29 -0
  53. package/src/enhancers/withDialog/index.js +196 -0
  54. package/src/index.js +88 -1
  55. package/src/showConfirmationDialog/index.js +148 -0
  56. package/src/style.css +261 -9
  57. package/src/utils/hooks/index.js +1 -0
  58. package/DataTable/utils/simplifyHasuraWhere.d.ts +0 -1
  59. package/src/simplifyHasuraWhere.js +0 -80
  60. package/src/tableQueryParamsToHasuraClauses.js +0 -113
  61. /package/src/{CellDragHandle.js → DataTable/CellDragHandle.js} +0 -0
  62. /package/src/{ColumnFilterMenu.js → DataTable/ColumnFilterMenu.js} +0 -0
  63. /package/src/{DisabledLoadingComponent.js → DataTable/DisabledLoadingComponent.js} +0 -0
  64. /package/src/{DropdownCell.js → DataTable/DropdownCell.js} +0 -0
  65. /package/src/{EditableCell.js → DataTable/EditableCell.js} +0 -0
  66. /package/src/{FilterAndSortMenu.js → DataTable/FilterAndSortMenu.js} +0 -0
  67. /package/src/{PagingTool.js → DataTable/PagingTool.js} +0 -0
  68. /package/src/{RenderCell.js → DataTable/RenderCell.js} +0 -0
  69. /package/src/{SearchBar.js → DataTable/SearchBar.js} +0 -0
  70. /package/src/{SortableColumns.js → DataTable/SortableColumns.js} +0 -0
  71. /package/src/{TableFormTrackerContext.js → DataTable/TableFormTrackerContext.js} +0 -0
  72. /package/src/{ThComponent.js → DataTable/ThComponent.js} +0 -0
  73. /package/src/{dataTableEnhancer.js → DataTable/dataTableEnhancer.js} +0 -0
  74. /package/src/{defaultFormatters.js → DataTable/defaultFormatters.js} +0 -0
  75. /package/src/{defaultValidators.js → DataTable/defaultValidators.js} +0 -0
  76. /package/src/{editCellHelper.js → DataTable/editCellHelper.js} +0 -0
  77. /package/src/{getCellVal.js → DataTable/getCellVal.js} +0 -0
  78. /package/src/{getVals.js → DataTable/getVals.js} +0 -0
  79. /package/src/{isTruthy.js → DataTable/isTruthy.js} +0 -0
  80. /package/src/{isValueEmpty.js → DataTable/isValueEmpty.js} +0 -0
  81. /package/src/{convertSchema.js → DataTable/utils/convertSchema.js} +0 -0
  82. /package/src/{formatPasteData.js → DataTable/utils/formatPasteData.js} +0 -0
  83. /package/src/{getAllRows.js → DataTable/utils/getAllRows.js} +0 -0
  84. /package/src/{getCellCopyText.js → DataTable/utils/getCellCopyText.js} +0 -0
  85. /package/src/{getCellInfo.js → DataTable/utils/getCellInfo.js} +0 -0
  86. /package/src/{getFieldPathToField.js → DataTable/utils/getFieldPathToField.js} +0 -0
  87. /package/src/{getIdOrCodeOrIndex.js → DataTable/utils/getIdOrCodeOrIndex.js} +0 -0
  88. /package/src/{getLastSelectedEntity.js → DataTable/utils/getLastSelectedEntity.js} +0 -0
  89. /package/src/{getNewEntToSelect.js → DataTable/utils/getNewEntToSelect.js} +0 -0
  90. /package/src/{getRowCopyText.js → DataTable/utils/getRowCopyText.js} +0 -0
  91. /package/src/{getTableConfigFromStorage.js → DataTable/utils/getTableConfigFromStorage.js} +0 -0
  92. /package/src/{handleCopyColumn.js → DataTable/utils/handleCopyColumn.js} +0 -0
  93. /package/src/{handleCopyHelper.js → DataTable/utils/handleCopyHelper.js} +0 -0
  94. /package/src/{handleCopyRows.js → DataTable/utils/handleCopyRows.js} +0 -0
  95. /package/src/{handleCopyTable.js → DataTable/utils/handleCopyTable.js} +0 -0
  96. /package/src/{isBottomRightCornerOfRectangle.js → DataTable/utils/isBottomRightCornerOfRectangle.js} +0 -0
  97. /package/src/{isEntityClean.js → DataTable/utils/isEntityClean.js} +0 -0
  98. /package/src/{primarySelectedValue.js → DataTable/utils/primarySelectedValue.js} +0 -0
  99. /package/src/{removeCleanRows.js → DataTable/utils/removeCleanRows.js} +0 -0
  100. /package/src/{rowClick.js → DataTable/utils/rowClick.js} +0 -0
  101. /package/src/{selection.js → DataTable/utils/selection.js} +0 -0
  102. /package/src/{useTableEntities.js → DataTable/utils/useTableEntities.js} +0 -0
  103. /package/src/{utils.js → DataTable/utils/utils.js} +0 -0
  104. /package/src/{withSelectedEntities.js → DataTable/utils/withSelectedEntities.js} +0 -0
  105. /package/src/{validateTableWideErrors.js → DataTable/validateTableWideErrors.js} +0 -0
  106. /package/src/{viewColumn.js → DataTable/viewColumn.js} +0 -0
  107. /package/src/{FormSeparator.js → FormComponents/FormSeparator.js} +0 -0
  108. /package/src/{LoadingDots.js → FormComponents/LoadingDots.js} +0 -0
  109. /package/src/{Uploader.js → FormComponents/Uploader.js} +0 -0
  110. /package/src/{getNewName.js → FormComponents/getNewName.js} +0 -0
  111. /package/src/{itemUpload.js → FormComponents/itemUpload.js} +0 -0
  112. /package/src/{sortify.js → FormComponents/sortify.js} +0 -0
  113. /package/src/{tryToMatchSchemas.js → FormComponents/tryToMatchSchemas.js} +0 -0
  114. /package/src/{TimelineEvent.js → Timeline/TimelineEvent.js} +0 -0
  115. /package/src/{tg_modalState.js → enhancers/withDialog/tg_modalState.js} +0 -0
  116. /package/src/{withField.js → enhancers/withField.js} +0 -0
  117. /package/src/{withFields.js → enhancers/withFields.js} +0 -0
  118. /package/src/{withLocalStorage.js → enhancers/withLocalStorage.js} +0 -0
  119. /package/src/{adHoc.js → utils/adHoc.js} +0 -0
  120. /package/src/{basicHandleActionsWithFullState.js → utils/basicHandleActionsWithFullState.js} +0 -0
  121. /package/src/{browserUtils.js → utils/browserUtils.js} +0 -0
  122. /package/src/{combineReducersWithFullState.js → utils/combineReducersWithFullState.js} +0 -0
  123. /package/src/{commandControls.js → utils/commandControls.js} +0 -0
  124. /package/src/{commandUtils.js → utils/commandUtils.js} +0 -0
  125. /package/src/{determineBlackOrWhiteTextColor.js → utils/determineBlackOrWhiteTextColor.js} +0 -0
  126. /package/src/{getDayjsFormatter.js → utils/getDayjsFormatter.js} +0 -0
  127. /package/src/{getTextFromEl.js → utils/getTextFromEl.js} +0 -0
  128. /package/src/{handlerHelpers.js → utils/handlerHelpers.js} +0 -0
  129. /package/src/{useDeepEqualMemo.js → utils/hooks/useDeepEqualMemo.js} +0 -0
  130. /package/src/{useStableReference.js → utils/hooks/useStableReference.js} +0 -0
  131. /package/src/{hotkeyUtils.js → utils/hotkeyUtils.js} +0 -0
  132. /package/src/{isBeingCalledExcessively.js → utils/isBeingCalledExcessively.js} +0 -0
  133. /package/src/{menuUtils.js → utils/menuUtils.js} +0 -0
  134. /package/src/{popoverOverflowModifiers.js → utils/popoverOverflowModifiers.js} +0 -0
  135. /package/src/{pureNoFunc.js → utils/pureNoFunc.js} +0 -0
  136. /package/src/{renderOnDoc.js → utils/renderOnDoc.js} +0 -0
  137. /package/src/{showProgressToast.js → utils/showProgressToast.js} +0 -0
  138. /package/src/{tagUtils.js → utils/tagUtils.js} +0 -0
  139. /package/src/{tgFormValues.js → utils/tgFormValues.js} +0 -0
  140. /package/src/{useTraceUpdate.js → utils/useTraceUpdate.js} +0 -0
  141. /package/src/{withSelectTableRecords.js → utils/withSelectTableRecords.js} +0 -0
  142. /package/src/{withStore.js → utils/withStore.js} +0 -0
@@ -3,12 +3,6 @@ export function getMergedOpts(topLevel?: {}, instanceLevel?: {}): {
3
3
  defaults: any;
4
4
  formName: string;
5
5
  };
6
- /**
7
- *
8
- * @param {object} field
9
- * @returns the camelCase display name of the field, to be used for filters, sorting, etc
10
- */
11
- export function getCCDisplayName(field: object): string;
12
6
  export function getCurrentParamsFromUrl(location: any, isSimple: any): any;
13
7
  export function setCurrentParamsOnUrl(newParams: any, replace: any, isSimple: any): void;
14
8
  export function makeDataTableHandlers({ setNewParams, defaults, onlyOneFilter }: {
@@ -25,7 +19,7 @@ export function makeDataTableHandlers({ setNewParams, defaults, onlyOneFilter }:
25
19
  setOrder: (order: any, isRemove: any, shiftHeld: any) => any;
26
20
  setNewParams: any;
27
21
  };
28
- export function getQueryParams({ currentParams, defaults, schema, isInfinite, entities, isLocalCall, additionalFilter, doNotCoercePageSize, ownProps }: {
22
+ export function getQueryParams({ currentParams, defaults, schema, isInfinite, entities, isLocalCall, additionalFilter, doNotCoercePageSize, noOrderError, ownProps }: {
29
23
  currentParams: any;
30
24
  defaults: any;
31
25
  schema: any;
@@ -34,6 +28,7 @@ export function getQueryParams({ currentParams, defaults, schema, isInfinite, en
34
28
  isLocalCall: any;
35
29
  additionalFilter: any;
36
30
  doNotCoercePageSize: any;
31
+ noOrderError: any;
37
32
  ownProps: any;
38
33
  }): {
39
34
  entities: any[];
@@ -48,7 +43,7 @@ export function getQueryParams({ currentParams, defaults, schema, isInfinite, en
48
43
  };
49
44
  page: any;
50
45
  pageSize: any;
51
- order: any;
46
+ order: any[];
52
47
  filters: any;
53
48
  searchTerm: any;
54
49
  };
@@ -12,3 +12,15 @@ export function tableQueryParamsToHasuraClauses({ page, pageSize, searchTerm, fi
12
12
  limit: any;
13
13
  offset: number;
14
14
  };
15
+ /**
16
+ * Takes a schema and returns an object with the fields mapped by their camelCased display name.
17
+ * If the displayName is not set or is a jsx element, the path is used instead.
18
+ * The same conversion must be done when using the result of this method
19
+ */
20
+ export function getFieldsMappedByCCDisplayName(schema: any): any;
21
+ /**
22
+ *
23
+ * @param {object} field
24
+ * @returns the camelCase display name of the field, to be used for filters, sorting, etc
25
+ */
26
+ export function getCCDisplayName(field: object): string;
package/index.cjs.js CHANGED
@@ -19402,6 +19402,7 @@ function tableQueryParamsToHasuraClauses({
19402
19402
  // Add schema as a parameter
19403
19403
  additionalFilter
19404
19404
  }) {
19405
+ const ccFields = getFieldsMappedByCCDisplayName(schema);
19405
19406
  let where = {};
19406
19407
  const order_by = {};
19407
19408
  const limit = pageSize || 25;
@@ -19449,28 +19450,124 @@ function tableQueryParamsToHasuraClauses({
19449
19450
  }
19450
19451
  if (filters && filters.length > 0) {
19451
19452
  const filterClauses = filters.map((filter2) => {
19452
- const { selectedFilter, filterOn, filterValue } = filter2;
19453
+ let { selectedFilter, filterOn, filterValue } = filter2;
19454
+ const fieldSchema = ccFields[filterOn] || {};
19455
+ const { path: path2, reference: reference2, type: type2 } = fieldSchema;
19456
+ let stringFilterValue = filterValue && filterValue.toString ? filterValue.toString() : filterValue;
19457
+ if (stringFilterValue === false) {
19458
+ stringFilterValue = "false";
19459
+ } else {
19460
+ stringFilterValue = stringFilterValue || "";
19461
+ }
19462
+ const arrayFilterValue = Array.isArray(filterValue) ? filterValue : stringFilterValue.split(";");
19463
+ if (type2 === "number" || type2 === "integer") {
19464
+ filterValue = Array.isArray(filterValue) ? filterValue.map((val) => Number(val)) : Number(filterValue);
19465
+ }
19466
+ if (fieldSchema.normalizeFilter) {
19467
+ filterValue = fieldSchema.normalizeFilter(
19468
+ filterValue,
19469
+ selectedFilter,
19470
+ filterOn
19471
+ );
19472
+ }
19473
+ if (reference2) {
19474
+ filterOn = reference2.sourceField;
19475
+ } else {
19476
+ filterOn = path2 || filterOn;
19477
+ }
19453
19478
  switch (selectedFilter) {
19454
- case "textContains":
19479
+ case "none":
19480
+ return {};
19481
+ case "startsWith":
19482
+ return { [filterOn]: { _ilike: `${filterValue}%` } };
19483
+ case "endsWith":
19484
+ return { [filterOn]: { _ilike: `%${filterValue}` } };
19485
+ case "contains":
19455
19486
  return { [filterOn]: { _ilike: `%${filterValue}%` } };
19456
- case "textEquals":
19487
+ case "notContains":
19488
+ return { [filterOn]: { _not_ilike: `%${filterValue}%` } };
19489
+ case "isExactly":
19457
19490
  return { [filterOn]: { _eq: filterValue } };
19458
- case "textNotEquals":
19459
- return { [filterOn]: { _neq: filterValue } };
19460
- case "numberEquals":
19461
- return { [filterOn]: { _eq: parseFloat(filterValue) } };
19462
- case "numberGreaterThan":
19491
+ case "isEmpty":
19492
+ return {
19493
+ _or: [
19494
+ { [filterOn]: { _eq: "" } },
19495
+ { [filterOn]: { _is_null: true } }
19496
+ ]
19497
+ };
19498
+ case "notEmpty":
19499
+ return {
19500
+ _and: [
19501
+ { [filterOn]: { _neq: "" } },
19502
+ { [filterOn]: { _is_null: false } }
19503
+ ]
19504
+ };
19505
+ case "inList":
19506
+ return { [filterOn]: { _in: filterValue } };
19507
+ case "notInList":
19508
+ return { [filterOn]: { _nin: filterValue } };
19509
+ case "true":
19510
+ return { [filterOn]: { _eq: true } };
19511
+ case "false":
19512
+ return { [filterOn]: { _eq: false } };
19513
+ case "dateIs":
19514
+ return { [filterOn]: { _eq: filterValue } };
19515
+ case "notBetween":
19516
+ return {
19517
+ _or: [
19518
+ {
19519
+ [filterOn]: {
19520
+ _lt: new Date(arrayFilterValue[0])
19521
+ }
19522
+ },
19523
+ {
19524
+ [filterOn]: {
19525
+ _gt: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
19526
+ }
19527
+ }
19528
+ ]
19529
+ };
19530
+ case "isBetween":
19531
+ return {
19532
+ [filterOn]: {
19533
+ _gte: new Date(arrayFilterValue[0]),
19534
+ _lte: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
19535
+ }
19536
+ };
19537
+ case "isBefore":
19538
+ return { [filterOn]: { _lt: new Date(filterValue) } };
19539
+ case "isAfter":
19540
+ return { [filterOn]: { _gt: new Date(filterValue) } };
19541
+ case "greaterThan":
19463
19542
  return { [filterOn]: { _gt: parseFloat(filterValue) } };
19464
- case "numberLessThan":
19543
+ case "lessThan":
19465
19544
  return { [filterOn]: { _lt: parseFloat(filterValue) } };
19466
- case "numberGreaterThanEquals":
19467
- return { [filterOn]: { _gte: parseFloat(filterValue) } };
19468
- case "numberLessThanEquals":
19469
- return { [filterOn]: { _lte: parseFloat(filterValue) } };
19470
- case "isNull":
19471
- return { [filterOn]: { _is_null: true } };
19472
- case "isNotNull":
19473
- return { [filterOn]: { _is_null: false } };
19545
+ case "inRange":
19546
+ return {
19547
+ [filterOn]: {
19548
+ _gte: parseFloat(arrayFilterValue[0]),
19549
+ _lte: parseFloat(arrayFilterValue[1])
19550
+ }
19551
+ };
19552
+ case "outsideRange":
19553
+ return {
19554
+ _or: [
19555
+ {
19556
+ [filterOn]: {
19557
+ _lt: parseFloat(arrayFilterValue[0])
19558
+ }
19559
+ },
19560
+ {
19561
+ [filterOn]: {
19562
+ _gt: parseFloat(arrayFilterValue[1])
19563
+ }
19564
+ }
19565
+ ]
19566
+ };
19567
+ case "equalTo":
19568
+ return { [filterOn]: { _eq: parseFloat(filterValue) } };
19569
+ case "regex":
19570
+ return { [filterOn]: { _regex: filterValue } };
19474
19571
  default:
19475
19572
  console.warn(`Unsupported filter type: ${selectedFilter}`);
19476
19573
  return {};
@@ -19497,6 +19594,21 @@ function tableQueryParamsToHasuraClauses({
19497
19594
  return { where, order_by, limit, offset: offset3 };
19498
19595
  }
19499
19596
  __name(tableQueryParamsToHasuraClauses, "tableQueryParamsToHasuraClauses");
19597
+ function getFieldsMappedByCCDisplayName(schema) {
19598
+ if (!schema || !schema.fields) return {};
19599
+ return schema.fields.reduce((acc, field) => {
19600
+ const ccDisplayName = getCCDisplayName(field);
19601
+ acc[ccDisplayName] = field;
19602
+ return acc;
19603
+ }, {});
19604
+ }
19605
+ __name(getFieldsMappedByCCDisplayName, "getFieldsMappedByCCDisplayName");
19606
+ function getCCDisplayName(field) {
19607
+ return camelCase(
19608
+ typeof field.displayName === "string" ? field.displayName : field.path
19609
+ );
19610
+ }
19611
+ __name(getCCDisplayName, "getCCDisplayName");
19500
19612
  function filterLocalEntitiesToHasura(records, { where, order_by, limit, offset: offset3, isInfinite } = {}) {
19501
19613
  let filteredRecords = [...records];
19502
19614
  if (where) {
@@ -19526,10 +19638,16 @@ function applyWhereClause(records, where) {
19526
19638
  }
19527
19639
  for (const key in filter2) {
19528
19640
  if (key === "_and") {
19641
+ if (isEmpty$1(filter2[key])) {
19642
+ continue;
19643
+ }
19529
19644
  if (!every(filter2[key], (subFilter) => applyFilter(record, subFilter))) {
19530
19645
  return false;
19531
19646
  }
19532
19647
  } else if (key === "_or") {
19648
+ if (isEmpty$1(filter2[key])) {
19649
+ continue;
19650
+ }
19533
19651
  if (!some(filter2[key], (subFilter) => applyFilter(record, subFilter))) {
19534
19652
  return false;
19535
19653
  }
@@ -19685,12 +19803,6 @@ function safeParse(val) {
19685
19803
  }
19686
19804
  }
19687
19805
  __name(safeParse, "safeParse");
19688
- function getCCDisplayName(field) {
19689
- return camelCase(
19690
- typeof field.displayName === "string" ? field.displayName : field.path
19691
- );
19692
- }
19693
- __name(getCCDisplayName, "getCCDisplayName");
19694
19806
  function getCurrentParamsFromUrl(location2, isSimple) {
19695
19807
  let { search: search2 } = location2;
19696
19808
  if (isSimple) {
@@ -19859,7 +19971,7 @@ function getQueryParams({
19859
19971
  isLocalCall,
19860
19972
  additionalFilter,
19861
19973
  doNotCoercePageSize,
19862
- // noOrderError,
19974
+ noOrderError,
19863
19975
  // isCodeModel,
19864
19976
  ownProps
19865
19977
  }) {
@@ -19883,11 +19995,31 @@ function getQueryParams({
19883
19995
  )[0];
19884
19996
  pageSize = closest;
19885
19997
  }
19998
+ const cleanedOrder = [];
19999
+ if (order2 && order2.length) {
20000
+ const ccFields = getFieldsMappedByCCDisplayName(schema);
20001
+ order2.forEach((orderVal) => {
20002
+ const ccDisplayName = orderVal.replace(/^-/gi, "");
20003
+ const schemaForField = ccFields[ccDisplayName];
20004
+ if (schemaForField) {
20005
+ const { path: path2 } = schemaForField;
20006
+ const reversed = ccDisplayName !== orderVal;
20007
+ const prefix2 = reversed ? "-" : "";
20008
+ cleanedOrder.push(prefix2 + path2);
20009
+ } else {
20010
+ !noOrderError && console.error(
20011
+ "No schema for field found!",
20012
+ ccDisplayName,
20013
+ JSON.stringify(schema.fields, null, 2)
20014
+ );
20015
+ }
20016
+ });
20017
+ }
19886
20018
  const toReturn = {
19887
20019
  //these are values that might be generally useful for the wrapped component
19888
20020
  page,
19889
20021
  pageSize: ownProps.controlled_pageSize || pageSize,
19890
- order: order2,
20022
+ order: cleanedOrder,
19891
20023
  filters,
19892
20024
  searchTerm
19893
20025
  };
@@ -19896,19 +20028,20 @@ function getQueryParams({
19896
20028
  pageSize,
19897
20029
  searchTerm,
19898
20030
  filters,
19899
- order: order2,
20031
+ order: cleanedOrder,
19900
20032
  schema
19901
20033
  });
19902
20034
  initializeHasuraWhereAndFilter(additionalFilter, where, currentParams);
19903
20035
  addCustomColumnFilters(where, schema.fields, currentParams);
19904
20036
  if (isLocalCall) {
19905
- return filterLocalEntitiesToHasura(entities, {
20037
+ const toRet = filterLocalEntitiesToHasura(entities, {
19906
20038
  where,
19907
20039
  order_by,
19908
20040
  limit,
19909
20041
  offset: offset3,
19910
20042
  isInfinite
19911
20043
  });
20044
+ return toRet;
19912
20045
  } else {
19913
20046
  return __spreadProps(__spreadValues({}, toReturn), {
19914
20047
  variables: {
@@ -71628,6 +71761,7 @@ const useTableParams = /* @__PURE__ */ __name((props) => {
71628
71761
  isInfinite: isInfinite || isSimple && !withPaging,
71629
71762
  isLocalCall,
71630
71763
  additionalFilter,
71764
+ noOrderError,
71631
71765
  ownProps: passingProps
71632
71766
  });
71633
71767
  }, [
package/index.es.js CHANGED
@@ -19384,6 +19384,7 @@ function tableQueryParamsToHasuraClauses({
19384
19384
  // Add schema as a parameter
19385
19385
  additionalFilter
19386
19386
  }) {
19387
+ const ccFields = getFieldsMappedByCCDisplayName(schema);
19387
19388
  let where = {};
19388
19389
  const order_by = {};
19389
19390
  const limit = pageSize || 25;
@@ -19431,28 +19432,124 @@ function tableQueryParamsToHasuraClauses({
19431
19432
  }
19432
19433
  if (filters && filters.length > 0) {
19433
19434
  const filterClauses = filters.map((filter2) => {
19434
- const { selectedFilter, filterOn, filterValue } = filter2;
19435
+ let { selectedFilter, filterOn, filterValue } = filter2;
19436
+ const fieldSchema = ccFields[filterOn] || {};
19437
+ const { path: path2, reference: reference2, type: type2 } = fieldSchema;
19438
+ let stringFilterValue = filterValue && filterValue.toString ? filterValue.toString() : filterValue;
19439
+ if (stringFilterValue === false) {
19440
+ stringFilterValue = "false";
19441
+ } else {
19442
+ stringFilterValue = stringFilterValue || "";
19443
+ }
19444
+ const arrayFilterValue = Array.isArray(filterValue) ? filterValue : stringFilterValue.split(";");
19445
+ if (type2 === "number" || type2 === "integer") {
19446
+ filterValue = Array.isArray(filterValue) ? filterValue.map((val) => Number(val)) : Number(filterValue);
19447
+ }
19448
+ if (fieldSchema.normalizeFilter) {
19449
+ filterValue = fieldSchema.normalizeFilter(
19450
+ filterValue,
19451
+ selectedFilter,
19452
+ filterOn
19453
+ );
19454
+ }
19455
+ if (reference2) {
19456
+ filterOn = reference2.sourceField;
19457
+ } else {
19458
+ filterOn = path2 || filterOn;
19459
+ }
19435
19460
  switch (selectedFilter) {
19436
- case "textContains":
19461
+ case "none":
19462
+ return {};
19463
+ case "startsWith":
19464
+ return { [filterOn]: { _ilike: `${filterValue}%` } };
19465
+ case "endsWith":
19466
+ return { [filterOn]: { _ilike: `%${filterValue}` } };
19467
+ case "contains":
19437
19468
  return { [filterOn]: { _ilike: `%${filterValue}%` } };
19438
- case "textEquals":
19469
+ case "notContains":
19470
+ return { [filterOn]: { _not_ilike: `%${filterValue}%` } };
19471
+ case "isExactly":
19439
19472
  return { [filterOn]: { _eq: filterValue } };
19440
- case "textNotEquals":
19441
- return { [filterOn]: { _neq: filterValue } };
19442
- case "numberEquals":
19443
- return { [filterOn]: { _eq: parseFloat(filterValue) } };
19444
- case "numberGreaterThan":
19473
+ case "isEmpty":
19474
+ return {
19475
+ _or: [
19476
+ { [filterOn]: { _eq: "" } },
19477
+ { [filterOn]: { _is_null: true } }
19478
+ ]
19479
+ };
19480
+ case "notEmpty":
19481
+ return {
19482
+ _and: [
19483
+ { [filterOn]: { _neq: "" } },
19484
+ { [filterOn]: { _is_null: false } }
19485
+ ]
19486
+ };
19487
+ case "inList":
19488
+ return { [filterOn]: { _in: filterValue } };
19489
+ case "notInList":
19490
+ return { [filterOn]: { _nin: filterValue } };
19491
+ case "true":
19492
+ return { [filterOn]: { _eq: true } };
19493
+ case "false":
19494
+ return { [filterOn]: { _eq: false } };
19495
+ case "dateIs":
19496
+ return { [filterOn]: { _eq: filterValue } };
19497
+ case "notBetween":
19498
+ return {
19499
+ _or: [
19500
+ {
19501
+ [filterOn]: {
19502
+ _lt: new Date(arrayFilterValue[0])
19503
+ }
19504
+ },
19505
+ {
19506
+ [filterOn]: {
19507
+ _gt: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
19508
+ }
19509
+ }
19510
+ ]
19511
+ };
19512
+ case "isBetween":
19513
+ return {
19514
+ [filterOn]: {
19515
+ _gte: new Date(arrayFilterValue[0]),
19516
+ _lte: new Date(new Date(arrayFilterValue[1]).setHours(23, 59))
19517
+ }
19518
+ };
19519
+ case "isBefore":
19520
+ return { [filterOn]: { _lt: new Date(filterValue) } };
19521
+ case "isAfter":
19522
+ return { [filterOn]: { _gt: new Date(filterValue) } };
19523
+ case "greaterThan":
19445
19524
  return { [filterOn]: { _gt: parseFloat(filterValue) } };
19446
- case "numberLessThan":
19525
+ case "lessThan":
19447
19526
  return { [filterOn]: { _lt: parseFloat(filterValue) } };
19448
- case "numberGreaterThanEquals":
19449
- return { [filterOn]: { _gte: parseFloat(filterValue) } };
19450
- case "numberLessThanEquals":
19451
- return { [filterOn]: { _lte: parseFloat(filterValue) } };
19452
- case "isNull":
19453
- return { [filterOn]: { _is_null: true } };
19454
- case "isNotNull":
19455
- return { [filterOn]: { _is_null: false } };
19527
+ case "inRange":
19528
+ return {
19529
+ [filterOn]: {
19530
+ _gte: parseFloat(arrayFilterValue[0]),
19531
+ _lte: parseFloat(arrayFilterValue[1])
19532
+ }
19533
+ };
19534
+ case "outsideRange":
19535
+ return {
19536
+ _or: [
19537
+ {
19538
+ [filterOn]: {
19539
+ _lt: parseFloat(arrayFilterValue[0])
19540
+ }
19541
+ },
19542
+ {
19543
+ [filterOn]: {
19544
+ _gt: parseFloat(arrayFilterValue[1])
19545
+ }
19546
+ }
19547
+ ]
19548
+ };
19549
+ case "equalTo":
19550
+ return { [filterOn]: { _eq: parseFloat(filterValue) } };
19551
+ case "regex":
19552
+ return { [filterOn]: { _regex: filterValue } };
19456
19553
  default:
19457
19554
  console.warn(`Unsupported filter type: ${selectedFilter}`);
19458
19555
  return {};
@@ -19479,6 +19576,21 @@ function tableQueryParamsToHasuraClauses({
19479
19576
  return { where, order_by, limit, offset: offset3 };
19480
19577
  }
19481
19578
  __name(tableQueryParamsToHasuraClauses, "tableQueryParamsToHasuraClauses");
19579
+ function getFieldsMappedByCCDisplayName(schema) {
19580
+ if (!schema || !schema.fields) return {};
19581
+ return schema.fields.reduce((acc, field) => {
19582
+ const ccDisplayName = getCCDisplayName(field);
19583
+ acc[ccDisplayName] = field;
19584
+ return acc;
19585
+ }, {});
19586
+ }
19587
+ __name(getFieldsMappedByCCDisplayName, "getFieldsMappedByCCDisplayName");
19588
+ function getCCDisplayName(field) {
19589
+ return camelCase(
19590
+ typeof field.displayName === "string" ? field.displayName : field.path
19591
+ );
19592
+ }
19593
+ __name(getCCDisplayName, "getCCDisplayName");
19482
19594
  function filterLocalEntitiesToHasura(records, { where, order_by, limit, offset: offset3, isInfinite } = {}) {
19483
19595
  let filteredRecords = [...records];
19484
19596
  if (where) {
@@ -19508,10 +19620,16 @@ function applyWhereClause(records, where) {
19508
19620
  }
19509
19621
  for (const key in filter2) {
19510
19622
  if (key === "_and") {
19623
+ if (isEmpty$1(filter2[key])) {
19624
+ continue;
19625
+ }
19511
19626
  if (!every(filter2[key], (subFilter) => applyFilter(record, subFilter))) {
19512
19627
  return false;
19513
19628
  }
19514
19629
  } else if (key === "_or") {
19630
+ if (isEmpty$1(filter2[key])) {
19631
+ continue;
19632
+ }
19515
19633
  if (!some(filter2[key], (subFilter) => applyFilter(record, subFilter))) {
19516
19634
  return false;
19517
19635
  }
@@ -19667,12 +19785,6 @@ function safeParse(val) {
19667
19785
  }
19668
19786
  }
19669
19787
  __name(safeParse, "safeParse");
19670
- function getCCDisplayName(field) {
19671
- return camelCase(
19672
- typeof field.displayName === "string" ? field.displayName : field.path
19673
- );
19674
- }
19675
- __name(getCCDisplayName, "getCCDisplayName");
19676
19788
  function getCurrentParamsFromUrl(location2, isSimple) {
19677
19789
  let { search: search2 } = location2;
19678
19790
  if (isSimple) {
@@ -19841,7 +19953,7 @@ function getQueryParams({
19841
19953
  isLocalCall,
19842
19954
  additionalFilter,
19843
19955
  doNotCoercePageSize,
19844
- // noOrderError,
19956
+ noOrderError,
19845
19957
  // isCodeModel,
19846
19958
  ownProps
19847
19959
  }) {
@@ -19865,11 +19977,31 @@ function getQueryParams({
19865
19977
  )[0];
19866
19978
  pageSize = closest;
19867
19979
  }
19980
+ const cleanedOrder = [];
19981
+ if (order2 && order2.length) {
19982
+ const ccFields = getFieldsMappedByCCDisplayName(schema);
19983
+ order2.forEach((orderVal) => {
19984
+ const ccDisplayName = orderVal.replace(/^-/gi, "");
19985
+ const schemaForField = ccFields[ccDisplayName];
19986
+ if (schemaForField) {
19987
+ const { path: path2 } = schemaForField;
19988
+ const reversed = ccDisplayName !== orderVal;
19989
+ const prefix2 = reversed ? "-" : "";
19990
+ cleanedOrder.push(prefix2 + path2);
19991
+ } else {
19992
+ !noOrderError && console.error(
19993
+ "No schema for field found!",
19994
+ ccDisplayName,
19995
+ JSON.stringify(schema.fields, null, 2)
19996
+ );
19997
+ }
19998
+ });
19999
+ }
19868
20000
  const toReturn = {
19869
20001
  //these are values that might be generally useful for the wrapped component
19870
20002
  page,
19871
20003
  pageSize: ownProps.controlled_pageSize || pageSize,
19872
- order: order2,
20004
+ order: cleanedOrder,
19873
20005
  filters,
19874
20006
  searchTerm
19875
20007
  };
@@ -19878,19 +20010,20 @@ function getQueryParams({
19878
20010
  pageSize,
19879
20011
  searchTerm,
19880
20012
  filters,
19881
- order: order2,
20013
+ order: cleanedOrder,
19882
20014
  schema
19883
20015
  });
19884
20016
  initializeHasuraWhereAndFilter(additionalFilter, where, currentParams);
19885
20017
  addCustomColumnFilters(where, schema.fields, currentParams);
19886
20018
  if (isLocalCall) {
19887
- return filterLocalEntitiesToHasura(entities, {
20019
+ const toRet = filterLocalEntitiesToHasura(entities, {
19888
20020
  where,
19889
20021
  order_by,
19890
20022
  limit,
19891
20023
  offset: offset3,
19892
20024
  isInfinite
19893
20025
  });
20026
+ return toRet;
19894
20027
  } else {
19895
20028
  return __spreadProps(__spreadValues({}, toReturn), {
19896
20029
  variables: {
@@ -71610,6 +71743,7 @@ const useTableParams = /* @__PURE__ */ __name((props) => {
71610
71743
  isInfinite: isInfinite || isSimple && !withPaging,
71611
71744
  isLocalCall,
71612
71745
  additionalFilter,
71746
+ noOrderError,
71613
71747
  ownProps: passingProps
71614
71748
  });
71615
71749
  }, [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teselagen/ui",
3
- "version": "0.7.33-beta.3",
3
+ "version": "0.7.33-beta.5",
4
4
  "main": "./src/index.js",
5
5
  "type": "module",
6
6
  "exports": {
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import { render, fireEvent } from "@testing-library/react";
3
+ import AdvancedOptions from "./AdvancedOptions";
4
+
5
+ describe("AdvancedOptions", () => {
6
+ test("renders correctly with given props and default state", () => {
7
+ const { queryByText, container } = render(
8
+ <AdvancedOptions label="Test Label" content="Test Content" />
9
+ );
10
+ expect(queryByText("Test Label")).toBeInTheDocument();
11
+ expect(queryByText("Test Content")).not.toBeInTheDocument();
12
+
13
+ expect(
14
+ container.querySelector(".bp3-icon-caret-right")
15
+ ).toBeInTheDocument();
16
+ });
17
+
18
+ test("toggles content when clicked", () => {
19
+ const { getByText, queryByText, container } = render(
20
+ <AdvancedOptions label="Test Label" content="Test Content" />
21
+ );
22
+ fireEvent.click(getByText("Test Label"));
23
+ expect(queryByText("Test Content")).toBeInTheDocument();
24
+ expect(container.querySelector(".bp3-icon-caret-down")).toBeInTheDocument();
25
+ });
26
+ });
@@ -0,0 +1,12 @@
1
+ /* Copyright (C) 2018 TeselaGen Biotechnology, Inc. */
2
+
3
+ import React from "react";
4
+ import { Spinner } from "@blueprintjs/core";
5
+
6
+ export default function AsyncValidateFieldSpinner({ validating }) {
7
+ if (validating) {
8
+ return <Spinner size="18" />;
9
+ } else {
10
+ return null;
11
+ }
12
+ }
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import { Classes } from "@blueprintjs/core";
3
+ import classNames from "classnames";
4
+
5
+ export default function BlueprintError({ error }) {
6
+ if (!error) return null;
7
+ return (
8
+ <div className={classNames(Classes.FORM_GROUP, Classes.INTENT_DANGER)}>
9
+ <div className={classNames(Classes.FORM_HELPER_TEXT, "preserve-newline")}>
10
+ {error}
11
+ </div>
12
+ </div>
13
+ );
14
+ }
@@ -0,0 +1,16 @@
1
+ /* taken from http://tobiasahlin.com/spinkit/ */
2
+ import React from "react";
3
+ import classNames from "classnames";
4
+ import "./style.css";
5
+
6
+ export function BounceLoader({ style, className }) {
7
+ return (
8
+ <div className={classNames("tg-bounce-loader", className)} style={style}>
9
+ <div className="rect1" />
10
+ <div className="rect2" />
11
+ <div className="rect3" />
12
+ <div className="rect4" />
13
+ <div className="rect5" />
14
+ </div>
15
+ );
16
+ }