@teselagen/ui 0.6.5 → 0.7.1

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 (98) hide show
  1. package/DataTable/ColumnFilterMenu.d.ts +2 -1
  2. package/DataTable/Columns.d.ts +51 -0
  3. package/DataTable/DisplayOptions.d.ts +14 -14
  4. package/DataTable/EditabelCell.d.ts +2 -5
  5. package/DataTable/EditableCell.d.ts +7 -0
  6. package/DataTable/FilterAndSortMenu.d.ts +9 -9
  7. package/DataTable/PagingTool.d.ts +25 -2
  8. package/DataTable/RenderCell.d.ts +18 -0
  9. package/DataTable/SearchBar.d.ts +4 -3
  10. package/DataTable/SortableColumns.d.ts +6 -9
  11. package/DataTable/ThComponent.d.ts +9 -0
  12. package/DataTable/index.d.ts +0 -5
  13. package/DataTable/utils/getIdOrCodeOrIndex.d.ts +1 -2
  14. package/DataTable/utils/handleCopyTable.d.ts +1 -0
  15. package/DataTable/utils/index.d.ts +4 -2
  16. package/DataTable/utils/primarySelectedValue.d.ts +1 -0
  17. package/DataTable/utils/queryParams.d.ts +13 -8
  18. package/DataTable/utils/removeCleanRows.d.ts +1 -1
  19. package/DataTable/utils/rowClick.d.ts +24 -3
  20. package/DataTable/utils/useDeepEqualMemo.d.ts +1 -0
  21. package/DataTable/utils/useTableEntities.d.ts +5 -0
  22. package/DataTable/utils/useTableParams.d.ts +49 -0
  23. package/DataTable/utils/withTableParams.d.ts +3 -16
  24. package/DataTable/viewColumn.d.ts +11 -4
  25. package/FormComponents/AbstractField.d.ts +1 -0
  26. package/FormComponents/Uploader.d.ts +34 -1
  27. package/FormComponents/index.d.ts +111 -60
  28. package/MatchHeaders.d.ts +9 -10
  29. package/SimpleStepViz.d.ts +2 -1
  30. package/TgSuggest/index.d.ts +1 -21
  31. package/UploadCsvWizard.d.ts +1 -1
  32. package/index.cjs.js +47862 -49125
  33. package/index.d.ts +6 -3
  34. package/index.es.js +45189 -46452
  35. package/package.json +6 -5
  36. package/src/DataTable/CellDragHandle.js +70 -69
  37. package/src/DataTable/ColumnFilterMenu.js +23 -21
  38. package/src/DataTable/Columns.js +948 -0
  39. package/src/DataTable/Columns.jsx +945 -0
  40. package/src/DataTable/DisplayOptions.js +173 -192
  41. package/src/DataTable/EditabelCell.js +7 -18
  42. package/src/DataTable/EditabelCell.jsx +44 -0
  43. package/src/DataTable/EditableCell.js +44 -0
  44. package/src/DataTable/FilterAndSortMenu.js +215 -234
  45. package/src/DataTable/PagingTool.js +47 -56
  46. package/src/DataTable/RenderCell.js +191 -0
  47. package/src/DataTable/RenderCell.jsx +191 -0
  48. package/src/DataTable/SearchBar.js +12 -5
  49. package/src/DataTable/SortableColumns.js +44 -39
  50. package/src/DataTable/ThComponent.js +44 -0
  51. package/src/DataTable/dataTableEnhancer.js +32 -295
  52. package/src/DataTable/index.js +2945 -3596
  53. package/src/DataTable/utils/getIdOrCodeOrIndex.js +1 -1
  54. package/src/DataTable/utils/handleCopyTable.js +16 -0
  55. package/src/DataTable/utils/index.js +7 -3
  56. package/src/DataTable/utils/primarySelectedValue.js +1 -0
  57. package/src/DataTable/utils/queryParams.js +110 -85
  58. package/src/DataTable/utils/removeCleanRows.js +3 -3
  59. package/src/DataTable/utils/rowClick.js +34 -9
  60. package/src/DataTable/utils/selection.js +1 -1
  61. package/src/DataTable/utils/useDeepEqualMemo.js +10 -0
  62. package/src/DataTable/utils/useTableEntities.js +38 -0
  63. package/src/DataTable/utils/useTableParams.js +362 -0
  64. package/src/DataTable/utils/withTableParams.js +244 -274
  65. package/src/DataTable/validateTableWideErrors.js +1 -1
  66. package/src/DataTable/viewColumn.js +5 -9
  67. package/src/DialogFooter/index.js +3 -3
  68. package/src/FillWindow.js +2 -3
  69. package/src/FormComponents/AbstractField.js +388 -0
  70. package/src/FormComponents/Uploader.js +674 -649
  71. package/src/FormComponents/index.js +505 -654
  72. package/src/FormComponents/tryToMatchSchemas.js +1 -6
  73. package/src/MatchHeaders.js +27 -22
  74. package/src/SimpleStepViz.js +19 -23
  75. package/src/TgSelect/index.js +2 -2
  76. package/src/TgSuggest/index.js +94 -106
  77. package/src/UploadCsvWizard.js +571 -577
  78. package/src/enhancers/withDialog/tg_modalState.js +1 -0
  79. package/src/index.js +10 -4
  80. package/src/showDialogOnDocBody.js +5 -9
  81. package/src/useDialog.js +25 -26
  82. package/src/utils/commandControls.js +2 -2
  83. package/src/utils/handlerHelpers.js +19 -25
  84. package/src/utils/hooks/index.js +1 -0
  85. package/src/utils/hooks/useDeepEqualMemo.js +10 -0
  86. package/src/utils/hooks/useStableReference.js +9 -0
  87. package/src/utils/renderOnDoc.js +8 -5
  88. package/src/utils/tagUtils.js +3 -3
  89. package/src/utils/useTraceUpdate.js +19 -0
  90. package/src/wrapDialog.js +0 -2
  91. package/style.css +251 -251
  92. package/useDialog.d.ts +2 -6
  93. package/utils/hooks/index.d.ts +1 -0
  94. package/utils/hooks/useDeepEqualMemo.d.ts +1 -0
  95. package/utils/hooks/useStableReference.d.ts +1 -0
  96. package/utils/renderOnDoc.d.ts +1 -1
  97. package/utils/tagUtils.d.ts +5 -1
  98. package/utils/useTraceUpdate.d.ts +1 -0
@@ -14,13 +14,8 @@ const getSchema = data => ({
14
14
  return { path, type: "string" };
15
15
  }),
16
16
  userData: data
17
- // userData: data.map((d) => {
18
- // if (!d.id) {
19
- // d.id = nanoid();
20
- // }
21
- // return d
22
- // })
23
17
  });
18
+
24
19
  export default async function tryToMatchSchemas({
25
20
  incomingData,
26
21
  validateAgainstSchema
@@ -1,4 +1,4 @@
1
- import React from "react";
1
+ import React, { useMemo } from "react";
2
2
  import { Callout, Card, Intent } from "@blueprintjs/core";
3
3
  import immer, { setAutoFreeze } from "immer";
4
4
  import { flatMap, forEach } from "lodash-es";
@@ -7,30 +7,35 @@ import showConfirmationDialog from "./showConfirmationDialog";
7
7
  import { startCase } from "lodash-es";
8
8
  import { typeToCommonType } from "./typeToCommonType";
9
9
  import { camelCase } from "lodash-es";
10
+ import { change } from "redux-form";
11
+ import { useDispatch } from "react-redux";
10
12
 
11
13
  setAutoFreeze(false);
12
- export function MatchHeaders({
13
- onMultiFileUploadSubmit,
14
- doAllFilesHaveSameHeaders,
14
+ export const MatchHeaders = ({
15
15
  csvValidationIssue,
16
+ datatableFormName,
17
+ datatableFormNames: _datatableFormNames,
18
+ doAllFilesHaveSameHeaders,
19
+ fileIndex,
20
+ filesWIssues,
16
21
  ignoredHeadersMsg,
17
- searchResults,
18
22
  matchedHeaders,
19
- userSchema,
23
+ onMultiFileUploadSubmit,
20
24
  reduxFormEntitiesArray,
21
- changeForm,
22
- datatableFormName,
23
- datatableFormNames: _datatableFormNames,
25
+ searchResults,
24
26
  setFilesWIssues,
25
- filesWIssues,
26
- fileIndex
27
- }) {
27
+ userSchema
28
+ }) => {
28
29
  const datatableFormNames = _datatableFormNames || [datatableFormName];
29
- const flippedMatchedHeaders = {};
30
+ const dispatch = useDispatch();
31
+ const flippedMatchedHeaders = useMemo(() => {
32
+ const _flippedMatchedHeaders = {};
33
+ forEach(matchedHeaders, (v, k) => {
34
+ if (v) _flippedMatchedHeaders[v] = k;
35
+ });
36
+ return _flippedMatchedHeaders;
37
+ }, [matchedHeaders]);
30
38
 
31
- forEach(matchedHeaders, (v, k) => {
32
- if (v) flippedMatchedHeaders[v] = k;
33
- });
34
39
  return (
35
40
  <div style={{ maxWidth: 500 }}>
36
41
  {!onMultiFileUploadSubmit && (
@@ -43,7 +48,7 @@ export function MatchHeaders({
43
48
  {ignoredHeadersMsg}
44
49
  </Callout>
45
50
  )}
46
- <br></br>
51
+ <br />
47
52
  <tr
48
53
  style={{
49
54
  display: "flex",
@@ -106,7 +111,7 @@ export function MatchHeaders({
106
111
  return rb - ra;
107
112
  });
108
113
  return (
109
- <Card style={{ padding: 2 }} key={i}>
114
+ <Card style={{ padding: 2 }} key={`field-${i}`}>
110
115
  <table>
111
116
  <tbody>
112
117
  <tr
@@ -146,7 +151,7 @@ export function MatchHeaders({
146
151
  beforeOnChange={async () => {
147
152
  const clearEntities = () => {
148
153
  datatableFormNames.forEach(name => {
149
- changeForm(name, "reduxFormEntities", null);
154
+ dispatch(change(name, "reduxFormEntities", null));
150
155
  });
151
156
  };
152
157
  if (reduxFormEntitiesArray.some(r => r?.isDirty)) {
@@ -184,7 +189,7 @@ export function MatchHeaders({
184
189
  // isRequired={!allowEmpty && defaultValue === undefined}
185
190
  defaultValue={userMatchedHeader}
186
191
  options={opts}
187
- ></ReactSelectField>
192
+ />
188
193
  </td>
189
194
  <td
190
195
  style={{
@@ -208,7 +213,7 @@ export function MatchHeaders({
208
213
  textOverflow: "ellipsis",
209
214
  whiteSpace: "nowrap"
210
215
  }}
211
- key={i}
216
+ key={`userMatchedHeader-${i}`}
212
217
  >
213
218
  {row?.[userMatchedHeader] || ""}
214
219
  </div>
@@ -226,4 +231,4 @@ export function MatchHeaders({
226
231
  })}
227
232
  </div>
228
233
  );
229
- }
234
+ };
@@ -1,26 +1,22 @@
1
+ import React from "react";
1
2
  import { Icon } from "@blueprintjs/core";
2
3
  import classNames from "classnames";
3
- import React from "react";
4
4
 
5
- export default function SimpleStepViz({ steps, ...rest }) {
6
- return (
7
- <div style={{ display: "flex", justifyContent: "center" }}>
8
- <ul className="bp3-breadcrumbs" {...rest}>
9
- {steps.map(({ completed, active, text }, i) => {
10
- return (
11
- <li key={i}>
12
- <div
13
- className={classNames("bp3-breadcrumb", {
14
- "bp3-breadcrumb-current": active
15
- })}
16
- >
17
- <Icon icon={completed ? "tick-circle" : undefined}></Icon>
18
- {text}
19
- </div>
20
- </li>
21
- );
22
- })}
23
- </ul>
24
- </div>
25
- );
26
- }
5
+ export default ({ steps, ...rest }) => (
6
+ <div style={{ display: "flex", justifyContent: "center" }}>
7
+ <ul className="bp3-breadcrumbs" {...rest}>
8
+ {steps.map(({ completed, active, text }, i) => (
9
+ <li key={i}>
10
+ <div
11
+ className={classNames("bp3-breadcrumb", {
12
+ "bp3-breadcrumb-current": active
13
+ })}
14
+ >
15
+ <Icon icon={completed ? "tick-circle" : undefined} />
16
+ {text}
17
+ </div>
18
+ </li>
19
+ ))}
20
+ </ul>
21
+ </div>
22
+ );
@@ -126,7 +126,7 @@ class TgSelect extends React.Component {
126
126
  e.preventDefault();
127
127
  let newValue = null;
128
128
  if (multi) {
129
- newValue = filter(value, obj => obj.disabled) || [];
129
+ newValue = filter(value, obj => obj?.disabled) || [];
130
130
  } else if (value && value.disabled) {
131
131
  newValue = value;
132
132
  }
@@ -231,7 +231,7 @@ class TgSelect extends React.Component {
231
231
  text={`Create "${query}"`}
232
232
  active={active}
233
233
  onClick={(...args) => {
234
- const shouldStopEarly = this.props.onCreateNewOption(query);
234
+ const shouldStopEarly = this.props.onCreateNewOption?.(query);
235
235
  if (shouldStopEarly) {
236
236
  this.setOpenState(false);
237
237
  } else {
@@ -1,121 +1,109 @@
1
1
  import { Suggest } from "@blueprintjs/select";
2
2
  import { Keys } from "@blueprintjs/core";
3
- import React from "react";
3
+ import React, { useRef } from "react";
4
4
  import classNames from "classnames";
5
5
  import { itemListPredicate } from "../TgSelect";
6
6
 
7
- class TgSuggest extends React.Component {
8
- static defaultProps = {
7
+ const itemRenderer = (i = "", { index, handleClick, modifiers }) => (
8
+ <div //we specifically don't use a BP MenuItem component here because the menu item is too slow when 100s are loaded and will cause the component to lag
9
+ onClick={handleClick}
10
+ key={index}
11
+ className={classNames(
12
+ "tg-select-option bp3-menu-item bp3-fill bp3-text-overflow-ellipsis",
13
+ {
14
+ "bp3-active": modifiers.active
15
+ }
16
+ )}
17
+ >
18
+ {i}
19
+ </div>
20
+ );
21
+
22
+ const TgSuggest = props => {
23
+ const {
24
+ disabled,
25
+ inputProps,
26
+ intent,
27
+ isLoading,
28
+ isSimpleSearch,
29
+ multi,
30
+ noResultsText,
31
+ notCreateable,
32
+ onBlur,
9
33
  // eslint-disable-next-line @typescript-eslint/no-empty-function
10
- onChange: () => {},
11
- options: [],
12
- value: undefined
13
- };
14
- itemRenderer = (i = "", { index, handleClick, modifiers }) => {
15
- return (
16
- <div //we specifically don't use a BP MenuItem component here because the menu item is too slow when 100s are loaded and will cause the component to lag
17
- onClick={handleClick}
18
- key={index}
19
- className={classNames(
20
- "tg-select-option bp3-menu-item bp3-fill bp3-text-overflow-ellipsis",
21
- {
22
- "bp3-active": modifiers.active
23
- }
24
- )}
25
- >
26
- {i}
27
- </div>
28
- );
29
- };
34
+ onChange = () => {},
35
+ optionRenderer, //pull this one out here so it doesn't get passsed along
36
+ options = [],
37
+ placeholder,
38
+ popoverProps,
39
+ value = undefined,
40
+ ...rest
41
+ } = props;
42
+
43
+ const inputRef = useRef(null);
30
44
 
31
- handleItemSelect = item => {
32
- const { onChange } = this.props;
33
- this.input && this.input.blur();
45
+ const handleItemSelect = item => {
46
+ inputRef.current && inputRef.current.blur();
34
47
  return onChange(item);
35
48
  };
36
49
 
37
- itemListPredicate = (queryString, item) => {
38
- const { isSimpleSearch } = this.props;
50
+ const _itemListPredicate = (queryString, item) => {
39
51
  return itemListPredicate(queryString, item, isSimpleSearch);
40
52
  };
41
53
 
42
- onQueryChange = query => {
43
- const { onChange } = this.props;
44
- onChange(query);
45
- };
46
-
47
- renderInputValue = item => item;
48
-
49
- render() {
50
- const {
51
- multi,
52
- options,
53
- notCreateable,
54
- value,
55
- optionRenderer, //pull this one out here so it doesn't get passsed along
56
- noResultsText,
57
- inputProps,
58
- placeholder,
59
- isLoading,
60
- onBlur,
61
- disabled,
62
- popoverProps,
63
- ...rest
64
- } = this.props;
65
-
66
- return (
67
- <Suggest
68
- closeOnSelect
69
- items={options || []}
70
- query={value}
71
- popoverProps={{
72
- minimal: true,
73
- className: classNames("tg-select", {
74
- "tg-single-select": !multi
75
- }),
76
- wrapperTagName: "div",
77
- usePortal: false,
78
- canEscapeKeyClose: true,
79
- ...popoverProps
80
- }}
81
- onKeyDown={e => {
82
- const { which } = e;
83
- if (which === Keys.ENTER) {
84
- e.preventDefault();
85
- e.stopPropagation(); //this prevents the dialog it is in from closing
54
+ return (
55
+ <Suggest
56
+ closeOnSelect
57
+ items={options || []}
58
+ query={value}
59
+ popoverProps={{
60
+ minimal: true,
61
+ className: classNames("tg-select", {
62
+ "tg-single-select": !multi
63
+ }),
64
+ wrapperTagName: "div",
65
+ usePortal: false,
66
+ canEscapeKeyClose: true,
67
+ ...popoverProps
68
+ }}
69
+ onKeyDown={e => {
70
+ const { which } = e;
71
+ if (which === Keys.ENTER) {
72
+ e.preventDefault();
73
+ e.stopPropagation(); //this prevents the dialog it is in from closing
74
+ }
75
+ if (which === Keys.ESCAPE || which === Keys.TAB) {
76
+ // By default the escape key will not trigger a blur on the
77
+ // input element. It must be done explicitly.
78
+ if (inputRef.current != null) {
79
+ inputRef.current.blur();
86
80
  }
87
- if (which === Keys.ESCAPE || which === Keys.TAB) {
88
- // By default the escape key will not trigger a blur on the
89
- // input element. It must be done explicitly.
90
- if (this.input != null) {
91
- this.input.blur();
92
- }
93
- e.preventDefault();
94
- e.stopPropagation(); //this prevents dialog's it is in from closing
95
- }
96
- }}
97
- {...{
98
- onItemSelect: this.handleItemSelect,
99
- noResults: null,
100
- resetOnSelect: false,
101
- onQueryChange: this.onQueryChange,
102
- itemRenderer: this.itemRenderer,
103
- itemListPredicate: this.itemListPredicate,
104
- selectedItem: value,
105
- inputValueRenderer: this.renderInputValue,
106
- inputProps: {
107
- inputRef: n => {
108
- if (n) this.input = n;
109
- },
110
- placeholder: placeholder || "Type here...",
111
- disabled: disabled, // tg: adding isLoading will cause the input to be blurred when using generic select asReactSelect (don't do it),
112
- intent: this.props.intent,
113
- ...inputProps
114
- },
115
- ...rest
116
- }}
117
- />
118
- );
119
- }
120
- }
81
+ e.preventDefault();
82
+ e.stopPropagation(); //this prevents dialog's it is in from closing
83
+ }
84
+ }}
85
+ onItemSelect={handleItemSelect}
86
+ noResults={null}
87
+ resetOnSelect={false}
88
+ onQueryChange={onChange}
89
+ itemRenderer={itemRenderer}
90
+ itemListPredicate={_itemListPredicate}
91
+ selectedItem={value}
92
+ inputValueRenderer={item => item}
93
+ inputProps={{
94
+ inputRef: n => {
95
+ if (n) inputRef.current = n;
96
+ },
97
+ placeholder: placeholder || "Type here...",
98
+ disabled: disabled, // tg: adding isLoading will cause the input to be blurred when using generic select asReactSelect (don't do it),
99
+ intent: intent,
100
+ ...inputProps
101
+ }}
102
+ isSimpleSearch={isSimpleSearch}
103
+ onChange={onChange}
104
+ {...rest}
105
+ />
106
+ );
107
+ };
108
+
121
109
  export default TgSuggest;