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

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 (137) hide show
  1. package/package.json +1 -1
  2. package/src/AdvancedOptions.spec.js +26 -0
  3. package/src/AsyncValidateFieldSpinner/index.js +12 -0
  4. package/src/BlueprintError/index.js +14 -0
  5. package/src/BounceLoader/index.js +16 -0
  6. package/src/BounceLoader/style.css +45 -0
  7. package/src/CollapsibleCard/index.js +68 -0
  8. package/src/CollapsibleCard/style.css +23 -0
  9. package/src/DNALoader/index.js +20 -0
  10. package/src/DNALoader/style.css +251 -0
  11. package/src/DataTable/index.js +3209 -0
  12. package/src/DataTable/style.css +608 -0
  13. package/src/DataTable/utils/filterLocalEntitiesToHasura.test.js +515 -0
  14. package/src/DataTable/utils/index.js +55 -0
  15. package/src/DataTable/utils/simplifyHasuraWhere.test.js +73 -0
  16. package/src/DataTable/utils/tableQueryParamsToHasuraClauses.test.js +219 -0
  17. package/src/DialogFooter/index.js +86 -0
  18. package/src/DialogFooter/style.css +9 -0
  19. package/src/FormComponents/index.js +1266 -0
  20. package/src/FormComponents/style.css +275 -0
  21. package/src/FormComponents/utils.js +6 -0
  22. package/src/HotkeysDialog/index.js +79 -0
  23. package/src/HotkeysDialog/style.css +54 -0
  24. package/src/InfoHelper/index.js +78 -0
  25. package/src/InfoHelper/style.css +7 -0
  26. package/src/IntentText/index.js +18 -0
  27. package/src/Loading/index.js +70 -0
  28. package/src/Loading/style.css +4 -0
  29. package/src/MenuBar/index.js +423 -0
  30. package/src/MenuBar/style.css +45 -0
  31. package/src/PromptUnsavedChanges/index.js +38 -0
  32. package/src/ResizableDraggableDialog/index.js +141 -0
  33. package/src/ResizableDraggableDialog/style.css +42 -0
  34. package/src/ScrollToTop/index.js +72 -0
  35. package/src/TagSelect/index.js +69 -0
  36. package/src/TagSelect/style.css +13 -0
  37. package/src/TgHtmlSelect/index.js +20 -0
  38. package/src/TgSelect/index.js +537 -0
  39. package/src/TgSelect/style.css +61 -0
  40. package/src/TgSuggest/index.js +124 -0
  41. package/src/Timeline/index.js +15 -0
  42. package/src/Timeline/style.css +29 -0
  43. package/src/enhancers/withDialog/index.js +196 -0
  44. package/src/index.js +88 -1
  45. package/src/showConfirmationDialog/index.js +148 -0
  46. package/src/style.css +261 -9
  47. package/src/utils/hooks/index.js +1 -0
  48. /package/src/{CellDragHandle.js → DataTable/CellDragHandle.js} +0 -0
  49. /package/src/{ColumnFilterMenu.js → DataTable/ColumnFilterMenu.js} +0 -0
  50. /package/src/{Columns.js → DataTable/Columns.js} +0 -0
  51. /package/src/{DisabledLoadingComponent.js → DataTable/DisabledLoadingComponent.js} +0 -0
  52. /package/src/{DisplayOptions.js → DataTable/DisplayOptions.js} +0 -0
  53. /package/src/{DropdownCell.js → DataTable/DropdownCell.js} +0 -0
  54. /package/src/{EditableCell.js → DataTable/EditableCell.js} +0 -0
  55. /package/src/{FilterAndSortMenu.js → DataTable/FilterAndSortMenu.js} +0 -0
  56. /package/src/{PagingTool.js → DataTable/PagingTool.js} +0 -0
  57. /package/src/{RenderCell.js → DataTable/RenderCell.js} +0 -0
  58. /package/src/{SearchBar.js → DataTable/SearchBar.js} +0 -0
  59. /package/src/{SortableColumns.js → DataTable/SortableColumns.js} +0 -0
  60. /package/src/{TableFormTrackerContext.js → DataTable/TableFormTrackerContext.js} +0 -0
  61. /package/src/{ThComponent.js → DataTable/ThComponent.js} +0 -0
  62. /package/src/{dataTableEnhancer.js → DataTable/dataTableEnhancer.js} +0 -0
  63. /package/src/{defaultFormatters.js → DataTable/defaultFormatters.js} +0 -0
  64. /package/src/{defaultValidators.js → DataTable/defaultValidators.js} +0 -0
  65. /package/src/{editCellHelper.js → DataTable/editCellHelper.js} +0 -0
  66. /package/src/{getCellVal.js → DataTable/getCellVal.js} +0 -0
  67. /package/src/{getVals.js → DataTable/getVals.js} +0 -0
  68. /package/src/{isTruthy.js → DataTable/isTruthy.js} +0 -0
  69. /package/src/{isValueEmpty.js → DataTable/isValueEmpty.js} +0 -0
  70. /package/src/{convertSchema.js → DataTable/utils/convertSchema.js} +0 -0
  71. /package/src/{filterLocalEntitiesToHasura.js → DataTable/utils/filterLocalEntitiesToHasura.js} +0 -0
  72. /package/src/{formatPasteData.js → DataTable/utils/formatPasteData.js} +0 -0
  73. /package/src/{getAllRows.js → DataTable/utils/getAllRows.js} +0 -0
  74. /package/src/{getCellCopyText.js → DataTable/utils/getCellCopyText.js} +0 -0
  75. /package/src/{getCellInfo.js → DataTable/utils/getCellInfo.js} +0 -0
  76. /package/src/{getFieldPathToField.js → DataTable/utils/getFieldPathToField.js} +0 -0
  77. /package/src/{getIdOrCodeOrIndex.js → DataTable/utils/getIdOrCodeOrIndex.js} +0 -0
  78. /package/src/{getLastSelectedEntity.js → DataTable/utils/getLastSelectedEntity.js} +0 -0
  79. /package/src/{getNewEntToSelect.js → DataTable/utils/getNewEntToSelect.js} +0 -0
  80. /package/src/{getRowCopyText.js → DataTable/utils/getRowCopyText.js} +0 -0
  81. /package/src/{getTableConfigFromStorage.js → DataTable/utils/getTableConfigFromStorage.js} +0 -0
  82. /package/src/{handleCopyColumn.js → DataTable/utils/handleCopyColumn.js} +0 -0
  83. /package/src/{handleCopyHelper.js → DataTable/utils/handleCopyHelper.js} +0 -0
  84. /package/src/{handleCopyRows.js → DataTable/utils/handleCopyRows.js} +0 -0
  85. /package/src/{handleCopyTable.js → DataTable/utils/handleCopyTable.js} +0 -0
  86. /package/src/{initializeHasuraWhereAndFilter.js → DataTable/utils/initializeHasuraWhereAndFilter.js} +0 -0
  87. /package/src/{isBottomRightCornerOfRectangle.js → DataTable/utils/isBottomRightCornerOfRectangle.js} +0 -0
  88. /package/src/{isEntityClean.js → DataTable/utils/isEntityClean.js} +0 -0
  89. /package/src/{primarySelectedValue.js → DataTable/utils/primarySelectedValue.js} +0 -0
  90. /package/src/{queryParams.js → DataTable/utils/queryParams.js} +0 -0
  91. /package/src/{removeCleanRows.js → DataTable/utils/removeCleanRows.js} +0 -0
  92. /package/src/{rowClick.js → DataTable/utils/rowClick.js} +0 -0
  93. /package/src/{selection.js → DataTable/utils/selection.js} +0 -0
  94. /package/src/{simplifyHasuraWhere.js → DataTable/utils/simplifyHasuraWhere.js} +0 -0
  95. /package/src/{tableQueryParamsToHasuraClauses.js → DataTable/utils/tableQueryParamsToHasuraClauses.js} +0 -0
  96. /package/src/{useTableEntities.js → DataTable/utils/useTableEntities.js} +0 -0
  97. /package/src/{utils.js → DataTable/utils/utils.js} +0 -0
  98. /package/src/{withSelectedEntities.js → DataTable/utils/withSelectedEntities.js} +0 -0
  99. /package/src/{withTableParams.js → DataTable/utils/withTableParams.js} +0 -0
  100. /package/src/{validateTableWideErrors.js → DataTable/validateTableWideErrors.js} +0 -0
  101. /package/src/{viewColumn.js → DataTable/viewColumn.js} +0 -0
  102. /package/src/{FormSeparator.js → FormComponents/FormSeparator.js} +0 -0
  103. /package/src/{LoadingDots.js → FormComponents/LoadingDots.js} +0 -0
  104. /package/src/{Uploader.js → FormComponents/Uploader.js} +0 -0
  105. /package/src/{getNewName.js → FormComponents/getNewName.js} +0 -0
  106. /package/src/{itemUpload.js → FormComponents/itemUpload.js} +0 -0
  107. /package/src/{sortify.js → FormComponents/sortify.js} +0 -0
  108. /package/src/{tryToMatchSchemas.js → FormComponents/tryToMatchSchemas.js} +0 -0
  109. /package/src/{TimelineEvent.js → Timeline/TimelineEvent.js} +0 -0
  110. /package/src/{tg_modalState.js → enhancers/withDialog/tg_modalState.js} +0 -0
  111. /package/src/{withField.js → enhancers/withField.js} +0 -0
  112. /package/src/{withFields.js → enhancers/withFields.js} +0 -0
  113. /package/src/{withLocalStorage.js → enhancers/withLocalStorage.js} +0 -0
  114. /package/src/{adHoc.js → utils/adHoc.js} +0 -0
  115. /package/src/{basicHandleActionsWithFullState.js → utils/basicHandleActionsWithFullState.js} +0 -0
  116. /package/src/{browserUtils.js → utils/browserUtils.js} +0 -0
  117. /package/src/{combineReducersWithFullState.js → utils/combineReducersWithFullState.js} +0 -0
  118. /package/src/{commandControls.js → utils/commandControls.js} +0 -0
  119. /package/src/{commandUtils.js → utils/commandUtils.js} +0 -0
  120. /package/src/{determineBlackOrWhiteTextColor.js → utils/determineBlackOrWhiteTextColor.js} +0 -0
  121. /package/src/{getDayjsFormatter.js → utils/getDayjsFormatter.js} +0 -0
  122. /package/src/{getTextFromEl.js → utils/getTextFromEl.js} +0 -0
  123. /package/src/{handlerHelpers.js → utils/handlerHelpers.js} +0 -0
  124. /package/src/{useDeepEqualMemo.js → utils/hooks/useDeepEqualMemo.js} +0 -0
  125. /package/src/{useStableReference.js → utils/hooks/useStableReference.js} +0 -0
  126. /package/src/{hotkeyUtils.js → utils/hotkeyUtils.js} +0 -0
  127. /package/src/{isBeingCalledExcessively.js → utils/isBeingCalledExcessively.js} +0 -0
  128. /package/src/{menuUtils.js → utils/menuUtils.js} +0 -0
  129. /package/src/{popoverOverflowModifiers.js → utils/popoverOverflowModifiers.js} +0 -0
  130. /package/src/{pureNoFunc.js → utils/pureNoFunc.js} +0 -0
  131. /package/src/{renderOnDoc.js → utils/renderOnDoc.js} +0 -0
  132. /package/src/{showProgressToast.js → utils/showProgressToast.js} +0 -0
  133. /package/src/{tagUtils.js → utils/tagUtils.js} +0 -0
  134. /package/src/{tgFormValues.js → utils/tgFormValues.js} +0 -0
  135. /package/src/{useTraceUpdate.js → utils/useTraceUpdate.js} +0 -0
  136. /package/src/{withSelectTableRecords.js → utils/withSelectTableRecords.js} +0 -0
  137. /package/src/{withStore.js → utils/withStore.js} +0 -0
@@ -0,0 +1,219 @@
1
+ import { tableQueryParamsToHasuraClauses } from "./tableQueryParamsToHasuraClauses";
2
+
3
+ describe("tableQueryParamsToHasuraClauses", () => {
4
+ const schema = {
5
+ fields: [
6
+ { path: "name", type: "string" },
7
+ { path: "age", type: "number" },
8
+ { path: "isActive", type: "boolean" },
9
+ { path: "email", type: "string" }
10
+ ]
11
+ };
12
+
13
+ it("should handle empty query params", () => {
14
+ const result = tableQueryParamsToHasuraClauses({});
15
+ expect(result).toEqual({
16
+ where: {},
17
+ order_by: {},
18
+ limit: 25,
19
+ offset: 0
20
+ });
21
+ });
22
+
23
+ it("should handle page and pageSize", () => {
24
+ const result = tableQueryParamsToHasuraClauses({ page: 2, pageSize: 10 });
25
+ expect(result).toEqual({
26
+ where: {},
27
+ order_by: {},
28
+ limit: 10,
29
+ offset: 10
30
+ });
31
+ });
32
+
33
+ it("should handle searchTerm with string fields", () => {
34
+ const result = tableQueryParamsToHasuraClauses({
35
+ searchTerm: "test",
36
+ schema
37
+ });
38
+ expect(result).toEqual({
39
+ where: {
40
+ _or: [{ name: { _ilike: "%test%" } }, { email: { _ilike: "%test%" } }]
41
+ },
42
+ order_by: {},
43
+ limit: 25,
44
+ offset: 0
45
+ });
46
+ });
47
+
48
+ it("should handle searchTerm with number fields", () => {
49
+ const result = tableQueryParamsToHasuraClauses({
50
+ searchTerm: "30",
51
+ schema
52
+ });
53
+ expect(result).toEqual({
54
+ where: {
55
+ _or: [
56
+ { name: { _ilike: "%30%" } },
57
+ { age: { _eq: 30 } },
58
+ { email: { _ilike: "%30%" } }
59
+ ]
60
+ },
61
+ order_by: {},
62
+ limit: 25,
63
+ offset: 0
64
+ });
65
+ });
66
+
67
+ it("should handle searchTerm with boolean fields", () => {
68
+ const result = tableQueryParamsToHasuraClauses({
69
+ searchTerm: "true",
70
+ schema
71
+ });
72
+ expect(result).toEqual({
73
+ where: {
74
+ _or: [
75
+ { name: { _ilike: "%true%" } },
76
+ { isActive: { _eq: true } },
77
+ { email: { _ilike: "%true%" } }
78
+ ]
79
+ },
80
+ order_by: {},
81
+ limit: 25,
82
+ offset: 0
83
+ });
84
+ });
85
+
86
+ it("should handle searchTerm with multiple field types", () => {
87
+ const result = tableQueryParamsToHasuraClauses({
88
+ searchTerm: "test",
89
+ schema
90
+ });
91
+ expect(result).toEqual({
92
+ where: {
93
+ _or: [{ name: { _ilike: "%test%" } }, { email: { _ilike: "%test%" } }]
94
+ },
95
+ order_by: {},
96
+ limit: 25,
97
+ offset: 0
98
+ });
99
+ });
100
+
101
+ it("should handle textContains filter", () => {
102
+ const result = tableQueryParamsToHasuraClauses({
103
+ filters: [
104
+ {
105
+ selectedFilter: "textContains",
106
+ filterOn: "name",
107
+ filterValue: "test"
108
+ }
109
+ ]
110
+ });
111
+ expect(result).toEqual({
112
+ where: { _and: [{ name: { _ilike: "%test%" } }] },
113
+ order_by: {},
114
+ limit: 25,
115
+ offset: 0
116
+ });
117
+ });
118
+
119
+ it("should handle textEquals filter", () => {
120
+ const result = tableQueryParamsToHasuraClauses({
121
+ filters: [
122
+ { selectedFilter: "textEquals", filterOn: "name", filterValue: "test" }
123
+ ]
124
+ });
125
+ expect(result).toEqual({
126
+ where: { _and: [{ name: { _eq: "test" } }] },
127
+ order_by: {},
128
+ limit: 25,
129
+ offset: 0
130
+ });
131
+ });
132
+
133
+ it("should handle numberEquals filter", () => {
134
+ const result = tableQueryParamsToHasuraClauses({
135
+ filters: [
136
+ { selectedFilter: "numberEquals", filterOn: "age", filterValue: "30" }
137
+ ]
138
+ });
139
+ expect(result).toEqual({
140
+ where: { _and: [{ age: { _eq: 30 } }] },
141
+ order_by: {},
142
+ limit: 25,
143
+ offset: 0
144
+ });
145
+ });
146
+
147
+ it("should handle order", () => {
148
+ const result = tableQueryParamsToHasuraClauses({ order: ["name", "-age"] });
149
+ expect(result).toEqual({
150
+ where: {},
151
+ order_by: { name: "asc", age: "desc" },
152
+ limit: 25,
153
+ offset: 0
154
+ });
155
+ });
156
+
157
+ it("should combine all params", () => {
158
+ const result = tableQueryParamsToHasuraClauses({
159
+ page: 2,
160
+ pageSize: 10,
161
+ searchTerm: "test",
162
+ filters: [
163
+ {
164
+ selectedFilter: "numberGreaterThan",
165
+ filterOn: "age",
166
+ filterValue: "30"
167
+ }
168
+ ],
169
+ order: ["name"],
170
+ schema
171
+ });
172
+ expect(result).toEqual({
173
+ where: {
174
+ _and: [
175
+ {
176
+ _or: [
177
+ { name: { _ilike: "%test%" } },
178
+ { email: { _ilike: "%test%" } }
179
+ ]
180
+ },
181
+ { age: { _gt: 30 } }
182
+ ]
183
+ },
184
+ order_by: { name: "asc" },
185
+ limit: 10,
186
+ offset: 10
187
+ });
188
+ });
189
+
190
+ it("should combine searchTerm and filters", () => {
191
+ const result = tableQueryParamsToHasuraClauses({
192
+ searchTerm: "test",
193
+ filters: [
194
+ {
195
+ selectedFilter: "numberGreaterThan",
196
+ filterOn: "age",
197
+ filterValue: "30"
198
+ }
199
+ ],
200
+ schema
201
+ });
202
+ expect(result).toEqual({
203
+ where: {
204
+ _and: [
205
+ {
206
+ _or: [
207
+ { name: { _ilike: "%test%" } },
208
+ { email: { _ilike: "%test%" } }
209
+ ]
210
+ },
211
+ { age: { _gt: 30 } }
212
+ ]
213
+ },
214
+ order_by: {},
215
+ limit: 25,
216
+ offset: 0
217
+ });
218
+ });
219
+ });
@@ -0,0 +1,86 @@
1
+ /* Copyright (C) 2018 TeselaGen Biotechnology, Inc. */
2
+
3
+ import React, { useRef } from "react";
4
+ import { Intent, Button, Classes } from "@blueprintjs/core";
5
+ import { noop } from "lodash-es";
6
+ import classNames from "classnames";
7
+
8
+ function DialogFooter({
9
+ hideModal,
10
+ loading,
11
+ submitting,
12
+ onBackClick,
13
+ style,
14
+ onClick = noop,
15
+ secondaryAction,
16
+ secondaryDisabled,
17
+ secondaryNotMinimal,
18
+ intent = Intent.PRIMARY,
19
+ secondaryIntent,
20
+ backText = "Back",
21
+ secondaryText = "Cancel",
22
+ additionalButtons,
23
+ className,
24
+ secondaryClassName = "",
25
+ text = "Submit",
26
+ disabled,
27
+ containerClassname,
28
+ noCancel
29
+ }) {
30
+ const divRef = useRef();
31
+ return (
32
+ <div
33
+ style={style}
34
+ ref={divRef}
35
+ className={classNames(Classes.DIALOG_FOOTER, containerClassname)}
36
+ >
37
+ <div className={Classes.DIALOG_FOOTER_ACTIONS}>
38
+ {onBackClick && (
39
+ <Button
40
+ className={Classes.MINIMAL + " " + secondaryClassName}
41
+ text={backText}
42
+ onClick={onBackClick}
43
+ />
44
+ )}
45
+ {!noCancel && (
46
+ <Button
47
+ intent={secondaryIntent}
48
+ disabled={secondaryDisabled}
49
+ className={
50
+ (!secondaryNotMinimal ? Classes.MINIMAL : "") +
51
+ " " +
52
+ secondaryClassName
53
+ }
54
+ text={secondaryText}
55
+ onClick={
56
+ secondaryAction ||
57
+ hideModal ||
58
+ function () {
59
+ try {
60
+ divRef.current
61
+ .closest(".bp3-dialog")
62
+ .querySelector(".bp3-dialog-close-button")
63
+ .click();
64
+ } catch (error) {
65
+ console.error(`error closing dialog:`, error);
66
+ }
67
+ }
68
+ }
69
+ />
70
+ )}
71
+ {additionalButtons}
72
+ <Button
73
+ text={text}
74
+ intent={intent}
75
+ type="submit"
76
+ className={className}
77
+ onClick={onClick}
78
+ disabled={disabled}
79
+ loading={loading || submitting}
80
+ />
81
+ </div>
82
+ </div>
83
+ );
84
+ }
85
+
86
+ export default DialogFooter;
@@ -0,0 +1,9 @@
1
+ .tg-dialog-footer-error {
2
+ display: flex;
3
+ justify-content: flex-end;
4
+ margin-top: 5;
5
+ }
6
+
7
+ .tg-dialog-footer-error .bp3-form-group {
8
+ margin-bottom: 0;
9
+ }