@teselagen/ui 0.6.6 → 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 +47861 -49125
  33. package/index.d.ts +6 -3
  34. package/index.es.js +47959 -49223
  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 +1 -1
  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
@@ -1,4 +1,5 @@
1
1
  import { omit } from "lodash-es";
2
+
2
3
  export default function tg_modalState(
3
4
  state = {},
4
5
  { type, name, uniqueName, props = {} }
package/src/index.js CHANGED
@@ -18,11 +18,12 @@ export {
18
18
  } from "./DataTable/utils/withSelectedEntities";
19
19
  export {
20
20
  default as DataTable,
21
- ConnectedPagingTool as PagingTool,
22
- removeCleanRows
21
+ ConnectedPagingTool as PagingTool
23
22
  } from "./DataTable";
23
+ export { removeCleanRows, useTableEntities } from "./DataTable/utils";
24
24
 
25
- export { default as getIdOrCodeOrIndex } from "./DataTable/utils/getIdOrCodeOrIndex";
25
+ export { useDeepEqualMemo } from "./utils/hooks";
26
+ export { getIdOrCodeOrIndex } from "./DataTable/utils";
26
27
  export { default as convertSchema } from "./DataTable/utils/convertSchema";
27
28
  export { default as Loading } from "./Loading";
28
29
  export { throwFormError } from "./throwFormError";
@@ -39,7 +40,10 @@ export { default as popoverOverflowModifiers } from "./utils/popoverOverflowModi
39
40
  export * from "./utils/tgFormValues";
40
41
  export { default as tgFormValues } from "./utils/tgFormValues";
41
42
  export { default as withStore } from "./utils/withStore";
42
- export { default as withTableParams } from "./DataTable/utils/withTableParams";
43
+ export {
44
+ default as withTableParams,
45
+ useTableParams
46
+ } from "./DataTable/utils/withTableParams";
43
47
  export { default as InfoHelper } from "./InfoHelper";
44
48
  export { default as showConfirmationDialog } from "./showConfirmationDialog";
45
49
  export { default as showAppSpinner } from "./showAppSpinner";
@@ -70,6 +74,8 @@ export * from "./utils/menuUtils";
70
74
  export * from "./utils/browserUtils";
71
75
  export * from "./utils/commandUtils";
72
76
  export * from "./utils/commandControls";
77
+ export * from "./utils/useTraceUpdate";
78
+ export * from "./utils/hooks/useStableReference";
73
79
  export { default as AsyncValidateFieldSpinner } from "./AsyncValidateFieldSpinner";
74
80
  export { default as showProgressToast } from "./utils/showProgressToast";
75
81
  export { default as getTextFromEl } from "./utils/getTextFromEl";
@@ -1,4 +1,4 @@
1
- import ReactDOM from "react-dom";
1
+ import { createRoot } from "react-dom/client";
2
2
  import React from "react";
3
3
  // import withDialog from "./enhancers/withDialog";
4
4
  import { Dialog } from "@blueprintjs/core";
@@ -19,19 +19,15 @@ export default function showDialogOnDocBody(DialogComp, options = {}) {
19
19
  DialogCompToUse = props => {
20
20
  return (
21
21
  <Dialog usePortal={false} title="pass a {title} prop" isOpen {...props}>
22
- <DialogComp
23
- {...props}
24
- hideModal={onClose}
25
- onClose={onClose}
26
- ></DialogComp>
22
+ <DialogComp {...props} hideModal={onClose} onClose={onClose} />
27
23
  </Dialog>
28
24
  );
29
25
  };
30
26
  } else {
31
27
  DialogCompToUse = DialogComp;
32
28
  }
33
- ReactDOM.render(
34
- <DialogCompToUse hideModal={onClose} onClose={onClose} {...options} />,
35
- dialogHolder
29
+ const root = createRoot(dialogHolder);
30
+ root.render(
31
+ <DialogCompToUse hideModal={onClose} onClose={onClose} {...options} />
36
32
  );
37
33
  }
package/src/useDialog.js CHANGED
@@ -1,10 +1,9 @@
1
- import React, { useState } from "react";
1
+ import React, { useCallback, useState } from "react";
2
2
 
3
- /*
3
+ /*
4
4
 
5
5
  const {toggleDialog, comp} = useDialog({
6
6
  ModalComponent: SimpleInsertData,
7
- validateAgainstSchema,
8
7
  });
9
8
 
10
9
  return <div>
@@ -13,30 +12,29 @@ import React, { useState } from "react";
13
12
  </div>
14
13
 
15
14
  */
16
- export const useDialog = ({ ModalComponent, ...rest }) => {
15
+ export const useDialog = ({ ModalComponent }) => {
17
16
  const [isOpen, setOpen] = useState(false);
18
17
  const [additionalProps, setAdditionalProps] = useState(false);
19
- const comp = (
20
- <ModalComponent
21
- hideModal={() => {
22
- setOpen(false);
23
- }}
24
- hideDialog={() => {
25
- setOpen(false);
26
- }}
27
- {...rest}
28
- {...additionalProps}
29
- dialogProps={{
30
- isOpen,
31
- ...rest?.dialogProps,
32
- ...additionalProps?.dialogProps
33
- }}
34
- ></ModalComponent>
18
+ const Comp = useCallback(
19
+ () => (
20
+ <ModalComponent
21
+ hideModal={() => {
22
+ setOpen(false);
23
+ }}
24
+ hideDialog={() => {
25
+ setOpen(false);
26
+ }}
27
+ {...additionalProps}
28
+ dialogProps={{
29
+ isOpen,
30
+ ...additionalProps?.dialogProps
31
+ }}
32
+ />
33
+ ),
34
+ [ModalComponent, additionalProps, isOpen]
35
35
  );
36
- const toggleDialog = () => {
37
- setOpen(!isOpen);
38
- };
39
- async function showDialogPromise(handlerName, moreProps = {}) {
36
+
37
+ const showDialogPromise = useCallback(async (handlerName, moreProps = {}) => {
40
38
  return new Promise(resolve => {
41
39
  //return a promise that can be awaited
42
40
  setAdditionalProps({
@@ -59,6 +57,7 @@ export const useDialog = ({ ModalComponent, ...rest }) => {
59
57
  });
60
58
  setOpen(true); //open the dialog
61
59
  });
62
- }
63
- return { comp, showDialogPromise, toggleDialog, setAdditionalProps };
60
+ }, []);
61
+
62
+ return { Comp, showDialogPromise };
64
63
  };
@@ -11,8 +11,8 @@ export const withCommand =
11
11
  mappings[k] === "execute"
12
12
  ? event => cmd.execute({ event })
13
13
  : typeof mappings[k] === "function"
14
- ? mappings[k](cmd, props)
15
- : cmd[mappings[k]];
14
+ ? mappings[k](cmd, props)
15
+ : cmd[mappings[k]];
16
16
  });
17
17
 
18
18
  let out = <WrappedComponent {...mappedProps} {...props} />;
@@ -1,30 +1,24 @@
1
- export function onEnterHelper(callback) {
2
- return {
3
- onKeyDown: function (event) {
4
- if (event.key === "Enter") {
5
- callback(event);
6
- }
7
- }
8
- };
9
- }
10
-
11
- export function onBlurHelper(callback) {
12
- return {
13
- onBlur: function (event) {
1
+ export const onEnterHelper = callback => ({
2
+ onKeyDown: event => {
3
+ if (event.key === "Enter") {
14
4
  callback(event);
15
5
  }
16
- };
17
- }
6
+ }
7
+ });
8
+
9
+ export const onBlurHelper = callback => ({
10
+ onBlur: event => {
11
+ callback(event);
12
+ }
13
+ });
18
14
 
19
- export function onEnterOrBlurHelper(callback) {
20
- return {
21
- onKeyDown: function (event) {
22
- if (event.key === "Enter") {
23
- callback(event);
24
- }
25
- },
26
- onBlur: function (event) {
15
+ export const onEnterOrBlurHelper = callback => ({
16
+ onKeyDown: function (event) {
17
+ if (event.key === "Enter") {
27
18
  callback(event);
28
19
  }
29
- };
30
- }
20
+ },
21
+ onBlur: function (event) {
22
+ callback(event);
23
+ }
24
+ });
@@ -0,0 +1 @@
1
+ export { useDeepEqualMemo } from "./useDeepEqualMemo";
@@ -0,0 +1,10 @@
1
+ import { isEqual } from "lodash-es";
2
+ import { useRef } from "react";
3
+
4
+ export const useDeepEqualMemo = value => {
5
+ const ref = useRef();
6
+ if (!isEqual(value, ref.current)) {
7
+ ref.current = value;
8
+ }
9
+ return ref.current;
10
+ };
@@ -0,0 +1,9 @@
1
+ import { useEffect, useRef } from "react";
2
+
3
+ export const useStableReference = value => {
4
+ const ref = useRef();
5
+ useEffect(() => {
6
+ ref.current = value;
7
+ }, [value]);
8
+ return ref;
9
+ };
@@ -1,29 +1,32 @@
1
- import ReactDOM from "react-dom";
1
+ import { createRoot } from "react-dom/client";
2
2
 
3
3
  export function renderOnDoc(fn) {
4
4
  const elemDiv = document.createElement("div");
5
5
  elemDiv.style.cssText =
6
6
  "position:absolute;width:100%;height:100%;top:0px;opacity:0.3;z-index:0;";
7
7
  document.body.appendChild(elemDiv);
8
+ const root = createRoot(elemDiv);
8
9
  const handleClose = () => {
9
10
  setTimeout(() => {
10
- ReactDOM.unmountComponentAtNode(elemDiv);
11
+ root.unmount(elemDiv);
11
12
  document.body.removeChild(elemDiv);
12
13
  });
13
14
  };
14
- return ReactDOM.render(fn(handleClose), elemDiv);
15
+ root.render(fn(handleClose));
15
16
  }
17
+
16
18
  export function renderOnDocSimple(el) {
17
19
  const elemDiv = document.createElement("div");
18
20
  elemDiv.style.cssText =
19
21
  "position:absolute;width:100%;height:100%;top:0px;opacity:1;z-index:10000;";
20
22
  document.body.appendChild(elemDiv);
23
+ const root = createRoot(elemDiv);
24
+ root.render(el);
21
25
  const handleClose = () => {
22
26
  setTimeout(() => {
23
- ReactDOM.unmountComponentAtNode(elemDiv);
27
+ root.unmount();
24
28
  document.body.removeChild(elemDiv);
25
29
  });
26
30
  };
27
- ReactDOM.render(el, elemDiv);
28
31
  return handleClose;
29
32
  }
@@ -37,9 +37,9 @@ export function getTagColorStyle(color) {
37
37
  }
38
38
  : {};
39
39
  }
40
- export function getTagProps(vals) {
40
+ export function getTagProps({ color, label, name }) {
41
41
  return {
42
- ...getTagColorStyle(vals.color),
43
- children: vals.label || vals.name
42
+ ...getTagColorStyle(color),
43
+ children: label || name
44
44
  };
45
45
  }
@@ -0,0 +1,19 @@
1
+ import { useEffect, useRef } from "react";
2
+
3
+ // useful for debugging rerender errors
4
+ export const useTraceUpdate = props => {
5
+ const prev = useRef(props);
6
+ useEffect(() => {
7
+ const changedProps = Object.entries(props).reduce((ps, [k, v]) => {
8
+ if (prev.current[k] !== v) {
9
+ ps[k] = [prev.current[k], v];
10
+ }
11
+ return ps;
12
+ }, {});
13
+ if (Object.keys(changedProps).length > 0) {
14
+ // eslint-disable-next-line no-console
15
+ console.log("Changed props:", changedProps);
16
+ }
17
+ prev.current = props;
18
+ });
19
+ };
package/src/wrapDialog.js CHANGED
@@ -1,11 +1,9 @@
1
1
  /* Copyright (C) 2018 TeselaGen Biotechnology, Inc. */
2
-
3
2
  import React, { useMemo, useRef } from "react";
4
3
  import { Dialog, useHotkeys } from "@blueprintjs/core";
5
4
  import { noop, isFunction } from "lodash-es";
6
5
  import { ResizableDraggableDialog } from ".";
7
6
 
8
- // eslint-disable-next-line import/no-anonymous-default-export
9
7
  export default (topLevelDialogProps = {}) =>
10
8
  Component =>
11
9
  props => {