@teselagen/ui 0.5.23-beta.33 → 0.5.23-beta.34

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.
@@ -0,0 +1 @@
1
+ export function withAbstractWrapper(ComponentToWrap: any, opts?: {}): (props: any) => import("react/jsx-runtime").JSX.Element;
package/index.cjs.js CHANGED
@@ -3123,63 +3123,89 @@ function getAugmentedNamespace(n2) {
3123
3123
  }
3124
3124
  __name(getAugmentedNamespace, "getAugmentedNamespace");
3125
3125
  var propTypes$1 = { exports: {} };
3126
- var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
3127
- var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
3128
- var ReactPropTypesSecret = ReactPropTypesSecret_1;
3129
- function emptyFunction() {
3130
- }
3131
- __name(emptyFunction, "emptyFunction");
3132
- function emptyFunctionWithReset() {
3133
- }
3134
- __name(emptyFunctionWithReset, "emptyFunctionWithReset");
3135
- emptyFunctionWithReset.resetWarningCache = emptyFunction;
3136
- var factoryWithThrowingShims = /* @__PURE__ */ __name(function() {
3137
- function shim(props, propName, componentName, location2, propFullName, secret) {
3138
- if (secret === ReactPropTypesSecret) {
3139
- return;
3126
+ var ReactPropTypesSecret_1;
3127
+ var hasRequiredReactPropTypesSecret;
3128
+ function requireReactPropTypesSecret() {
3129
+ if (hasRequiredReactPropTypesSecret)
3130
+ return ReactPropTypesSecret_1;
3131
+ hasRequiredReactPropTypesSecret = 1;
3132
+ var ReactPropTypesSecret = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
3133
+ ReactPropTypesSecret_1 = ReactPropTypesSecret;
3134
+ return ReactPropTypesSecret_1;
3135
+ }
3136
+ __name(requireReactPropTypesSecret, "requireReactPropTypesSecret");
3137
+ var factoryWithThrowingShims;
3138
+ var hasRequiredFactoryWithThrowingShims;
3139
+ function requireFactoryWithThrowingShims() {
3140
+ if (hasRequiredFactoryWithThrowingShims)
3141
+ return factoryWithThrowingShims;
3142
+ hasRequiredFactoryWithThrowingShims = 1;
3143
+ var ReactPropTypesSecret = requireReactPropTypesSecret();
3144
+ function emptyFunction() {
3145
+ }
3146
+ __name(emptyFunction, "emptyFunction");
3147
+ function emptyFunctionWithReset() {
3148
+ }
3149
+ __name(emptyFunctionWithReset, "emptyFunctionWithReset");
3150
+ emptyFunctionWithReset.resetWarningCache = emptyFunction;
3151
+ factoryWithThrowingShims = /* @__PURE__ */ __name(function() {
3152
+ function shim(props, propName, componentName, location2, propFullName, secret) {
3153
+ if (secret === ReactPropTypesSecret) {
3154
+ return;
3155
+ }
3156
+ var err = new Error(
3157
+ "Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"
3158
+ );
3159
+ err.name = "Invariant Violation";
3160
+ throw err;
3140
3161
  }
3141
- var err = new Error(
3142
- "Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"
3143
- );
3144
- err.name = "Invariant Violation";
3145
- throw err;
3162
+ __name(shim, "shim");
3163
+ shim.isRequired = shim;
3164
+ function getShim() {
3165
+ return shim;
3166
+ }
3167
+ __name(getShim, "getShim");
3168
+ var ReactPropTypes = {
3169
+ array: shim,
3170
+ bigint: shim,
3171
+ bool: shim,
3172
+ func: shim,
3173
+ number: shim,
3174
+ object: shim,
3175
+ string: shim,
3176
+ symbol: shim,
3177
+ any: shim,
3178
+ arrayOf: getShim,
3179
+ element: shim,
3180
+ elementType: shim,
3181
+ instanceOf: getShim,
3182
+ node: shim,
3183
+ objectOf: getShim,
3184
+ oneOf: getShim,
3185
+ oneOfType: getShim,
3186
+ shape: getShim,
3187
+ exact: getShim,
3188
+ checkPropTypes: emptyFunctionWithReset,
3189
+ resetWarningCache: emptyFunction
3190
+ };
3191
+ ReactPropTypes.PropTypes = ReactPropTypes;
3192
+ return ReactPropTypes;
3193
+ }, "factoryWithThrowingShims");
3194
+ return factoryWithThrowingShims;
3195
+ }
3196
+ __name(requireFactoryWithThrowingShims, "requireFactoryWithThrowingShims");
3197
+ var hasRequiredPropTypes;
3198
+ function requirePropTypes() {
3199
+ if (hasRequiredPropTypes)
3200
+ return propTypes$1.exports;
3201
+ hasRequiredPropTypes = 1;
3202
+ {
3203
+ propTypes$1.exports = requireFactoryWithThrowingShims()();
3146
3204
  }
3147
- __name(shim, "shim");
3148
- shim.isRequired = shim;
3149
- function getShim() {
3150
- return shim;
3151
- }
3152
- __name(getShim, "getShim");
3153
- var ReactPropTypes = {
3154
- array: shim,
3155
- bigint: shim,
3156
- bool: shim,
3157
- func: shim,
3158
- number: shim,
3159
- object: shim,
3160
- string: shim,
3161
- symbol: shim,
3162
- any: shim,
3163
- arrayOf: getShim,
3164
- element: shim,
3165
- elementType: shim,
3166
- instanceOf: getShim,
3167
- node: shim,
3168
- objectOf: getShim,
3169
- oneOf: getShim,
3170
- oneOfType: getShim,
3171
- shape: getShim,
3172
- exact: getShim,
3173
- checkPropTypes: emptyFunctionWithReset,
3174
- resetWarningCache: emptyFunction
3175
- };
3176
- ReactPropTypes.PropTypes = ReactPropTypes;
3177
- return ReactPropTypes;
3178
- }, "factoryWithThrowingShims");
3179
- {
3180
- propTypes$1.exports = factoryWithThrowingShims();
3205
+ return propTypes$1.exports;
3181
3206
  }
3182
- var propTypesExports = propTypes$1.exports;
3207
+ __name(requirePropTypes, "requirePropTypes");
3208
+ var propTypesExports = requirePropTypes();
3183
3209
  const PropTypes$1 = /* @__PURE__ */ getDefaultExportFromCjs(propTypesExports);
3184
3210
  function __awaiter(thisArg, _arguments, P2, generator) {
3185
3211
  function adopt(value) {
@@ -13470,7 +13496,7 @@ var reactList = {};
13470
13496
  (function(exports2) {
13471
13497
  (function(global2, factory) {
13472
13498
  {
13473
- factory(exports2, propTypesExports, React$1);
13499
+ factory(exports2, requirePropTypes(), React$1);
13474
13500
  }
13475
13501
  })(commonjsGlobal, function(_exports, _propTypes2, _react3) {
13476
13502
  Object.defineProperty(_exports, "__esModule", {
@@ -69352,7 +69378,7 @@ Object.defineProperty(DraggableCore$2, "__esModule", {
69352
69378
  });
69353
69379
  DraggableCore$2.default = void 0;
69354
69380
  var React = _interopRequireWildcard$1(React$1);
69355
- var _propTypes = _interopRequireDefault$2(propTypesExports);
69381
+ var _propTypes = _interopRequireDefault$2(requirePropTypes());
69356
69382
  var _reactDom$1 = _interopRequireDefault$2(require$$2$1);
69357
69383
  var _domFns = domFns;
69358
69384
  var _positionFns = positionFns;
@@ -69944,7 +69970,7 @@ _defineProperty(DraggableCore$1, "defaultProps", {
69944
69970
  });
69945
69971
  exports2.default = void 0;
69946
69972
  var React2 = _interopRequireWildcard2(React$1);
69947
- var _propTypes2 = _interopRequireDefault2(propTypesExports);
69973
+ var _propTypes2 = _interopRequireDefault2(requirePropTypes());
69948
69974
  var _reactDom2 = _interopRequireDefault2(require$$2$1);
69949
69975
  var _clsx2 = _interopRequireDefault2(require$$3);
69950
69976
  var _domFns2 = domFns;
@@ -73775,7 +73801,7 @@ var Transition$1 = {};
73775
73801
  const require$$2 = /* @__PURE__ */ getAugmentedNamespace(reactLifecyclesCompat_es);
73776
73802
  Transition$1.__esModule = true;
73777
73803
  Transition$1.default = Transition$1.EXITING = Transition$1.ENTERED = Transition$1.ENTERING = Transition$1.EXITED = Transition$1.UNMOUNTED = void 0;
73778
- var PropTypes = _interopRequireWildcard(propTypesExports);
73804
+ var PropTypes = _interopRequireWildcard(requirePropTypes());
73779
73805
  var _react$1 = _interopRequireDefault$1(React$1);
73780
73806
  var _reactDom = _interopRequireDefault$1(require$$2$1);
73781
73807
  var _reactLifecyclesCompat = require$$2;
@@ -74093,7 +74119,7 @@ Transition$1.default = _default;
74093
74119
  (function(module2, exports2) {
74094
74120
  exports2.__esModule = true;
74095
74121
  exports2.default = void 0;
74096
- _interopRequireWildcard2(propTypesExports);
74122
+ _interopRequireWildcard2(requirePropTypes());
74097
74123
  var _addClass = _interopRequireDefault2(addClassExports);
74098
74124
  var _removeClass = _interopRequireDefault2(removeClass);
74099
74125
  var _react3 = _interopRequireDefault2(React$1);
@@ -74376,7 +74402,7 @@ __name(getNextChildMapping, "getNextChildMapping");
74376
74402
  (function(module2, exports2) {
74377
74403
  exports2.__esModule = true;
74378
74404
  exports2.default = void 0;
74379
- var _propTypes2 = _interopRequireDefault2(propTypesExports);
74405
+ var _propTypes2 = _interopRequireDefault2(requirePropTypes());
74380
74406
  var _react3 = _interopRequireDefault2(React$1);
74381
74407
  var _reactLifecyclesCompat2 = require$$2;
74382
74408
  var _ChildMapping = ChildMapping;
@@ -74530,7 +74556,7 @@ var TransitionGroupExports = TransitionGroup.exports;
74530
74556
  (function(module2, exports2) {
74531
74557
  exports2.__esModule = true;
74532
74558
  exports2.default = void 0;
74533
- _interopRequireDefault2(propTypesExports);
74559
+ _interopRequireDefault2(requirePropTypes());
74534
74560
  var _react3 = _interopRequireDefault2(React$1);
74535
74561
  var _reactDom2 = require$$2$1;
74536
74562
  var _TransitionGroup2 = _interopRequireDefault2(TransitionGroupExports);
@@ -74867,6 +74893,7 @@ exports.tickMenuEnhancer = tickMenuEnhancer;
74867
74893
  exports.tubeIcon = tubeIcon;
74868
74894
  exports.useDeepEqualMemo = useDeepEqualMemo;
74869
74895
  exports.useDialog = useDialog;
74896
+ exports.useStableReference = useStableReference;
74870
74897
  exports.useTableEntities = useTableEntities;
74871
74898
  exports.useTableParams = useTableParams;
74872
74899
  exports.useTraceUpdate = useTraceUpdate;
package/index.d.ts CHANGED
@@ -14,6 +14,7 @@ export * from './utils/browserUtils';
14
14
  export * from './utils/commandUtils';
15
15
  export * from './utils/commandControls';
16
16
  export * from './utils/useTraceUpdate';
17
+ export * from './utils/hooks/useStableReference';
17
18
  export { default as Uploader } from './FormComponents/Uploader';
18
19
  export { useDeepEqualMemo } from './utils/hooks';
19
20
  export { default as Loading } from './Loading';
package/index.es.js CHANGED
@@ -3105,63 +3105,89 @@ function getAugmentedNamespace(n2) {
3105
3105
  }
3106
3106
  __name(getAugmentedNamespace, "getAugmentedNamespace");
3107
3107
  var propTypes$1 = { exports: {} };
3108
- var ReactPropTypesSecret$1 = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
3109
- var ReactPropTypesSecret_1 = ReactPropTypesSecret$1;
3110
- var ReactPropTypesSecret = ReactPropTypesSecret_1;
3111
- function emptyFunction() {
3112
- }
3113
- __name(emptyFunction, "emptyFunction");
3114
- function emptyFunctionWithReset() {
3115
- }
3116
- __name(emptyFunctionWithReset, "emptyFunctionWithReset");
3117
- emptyFunctionWithReset.resetWarningCache = emptyFunction;
3118
- var factoryWithThrowingShims = /* @__PURE__ */ __name(function() {
3119
- function shim(props, propName, componentName, location2, propFullName, secret) {
3120
- if (secret === ReactPropTypesSecret) {
3121
- return;
3108
+ var ReactPropTypesSecret_1;
3109
+ var hasRequiredReactPropTypesSecret;
3110
+ function requireReactPropTypesSecret() {
3111
+ if (hasRequiredReactPropTypesSecret)
3112
+ return ReactPropTypesSecret_1;
3113
+ hasRequiredReactPropTypesSecret = 1;
3114
+ var ReactPropTypesSecret = "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
3115
+ ReactPropTypesSecret_1 = ReactPropTypesSecret;
3116
+ return ReactPropTypesSecret_1;
3117
+ }
3118
+ __name(requireReactPropTypesSecret, "requireReactPropTypesSecret");
3119
+ var factoryWithThrowingShims;
3120
+ var hasRequiredFactoryWithThrowingShims;
3121
+ function requireFactoryWithThrowingShims() {
3122
+ if (hasRequiredFactoryWithThrowingShims)
3123
+ return factoryWithThrowingShims;
3124
+ hasRequiredFactoryWithThrowingShims = 1;
3125
+ var ReactPropTypesSecret = requireReactPropTypesSecret();
3126
+ function emptyFunction() {
3127
+ }
3128
+ __name(emptyFunction, "emptyFunction");
3129
+ function emptyFunctionWithReset() {
3130
+ }
3131
+ __name(emptyFunctionWithReset, "emptyFunctionWithReset");
3132
+ emptyFunctionWithReset.resetWarningCache = emptyFunction;
3133
+ factoryWithThrowingShims = /* @__PURE__ */ __name(function() {
3134
+ function shim(props, propName, componentName, location2, propFullName, secret) {
3135
+ if (secret === ReactPropTypesSecret) {
3136
+ return;
3137
+ }
3138
+ var err = new Error(
3139
+ "Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"
3140
+ );
3141
+ err.name = "Invariant Violation";
3142
+ throw err;
3122
3143
  }
3123
- var err = new Error(
3124
- "Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types"
3125
- );
3126
- err.name = "Invariant Violation";
3127
- throw err;
3144
+ __name(shim, "shim");
3145
+ shim.isRequired = shim;
3146
+ function getShim() {
3147
+ return shim;
3148
+ }
3149
+ __name(getShim, "getShim");
3150
+ var ReactPropTypes = {
3151
+ array: shim,
3152
+ bigint: shim,
3153
+ bool: shim,
3154
+ func: shim,
3155
+ number: shim,
3156
+ object: shim,
3157
+ string: shim,
3158
+ symbol: shim,
3159
+ any: shim,
3160
+ arrayOf: getShim,
3161
+ element: shim,
3162
+ elementType: shim,
3163
+ instanceOf: getShim,
3164
+ node: shim,
3165
+ objectOf: getShim,
3166
+ oneOf: getShim,
3167
+ oneOfType: getShim,
3168
+ shape: getShim,
3169
+ exact: getShim,
3170
+ checkPropTypes: emptyFunctionWithReset,
3171
+ resetWarningCache: emptyFunction
3172
+ };
3173
+ ReactPropTypes.PropTypes = ReactPropTypes;
3174
+ return ReactPropTypes;
3175
+ }, "factoryWithThrowingShims");
3176
+ return factoryWithThrowingShims;
3177
+ }
3178
+ __name(requireFactoryWithThrowingShims, "requireFactoryWithThrowingShims");
3179
+ var hasRequiredPropTypes;
3180
+ function requirePropTypes() {
3181
+ if (hasRequiredPropTypes)
3182
+ return propTypes$1.exports;
3183
+ hasRequiredPropTypes = 1;
3184
+ {
3185
+ propTypes$1.exports = requireFactoryWithThrowingShims()();
3128
3186
  }
3129
- __name(shim, "shim");
3130
- shim.isRequired = shim;
3131
- function getShim() {
3132
- return shim;
3133
- }
3134
- __name(getShim, "getShim");
3135
- var ReactPropTypes = {
3136
- array: shim,
3137
- bigint: shim,
3138
- bool: shim,
3139
- func: shim,
3140
- number: shim,
3141
- object: shim,
3142
- string: shim,
3143
- symbol: shim,
3144
- any: shim,
3145
- arrayOf: getShim,
3146
- element: shim,
3147
- elementType: shim,
3148
- instanceOf: getShim,
3149
- node: shim,
3150
- objectOf: getShim,
3151
- oneOf: getShim,
3152
- oneOfType: getShim,
3153
- shape: getShim,
3154
- exact: getShim,
3155
- checkPropTypes: emptyFunctionWithReset,
3156
- resetWarningCache: emptyFunction
3157
- };
3158
- ReactPropTypes.PropTypes = ReactPropTypes;
3159
- return ReactPropTypes;
3160
- }, "factoryWithThrowingShims");
3161
- {
3162
- propTypes$1.exports = factoryWithThrowingShims();
3187
+ return propTypes$1.exports;
3163
3188
  }
3164
- var propTypesExports = propTypes$1.exports;
3189
+ __name(requirePropTypes, "requirePropTypes");
3190
+ var propTypesExports = requirePropTypes();
3165
3191
  const PropTypes$1 = /* @__PURE__ */ getDefaultExportFromCjs(propTypesExports);
3166
3192
  function __awaiter(thisArg, _arguments, P2, generator) {
3167
3193
  function adopt(value) {
@@ -13452,7 +13478,7 @@ var reactList = {};
13452
13478
  (function(exports2) {
13453
13479
  (function(global2, factory) {
13454
13480
  {
13455
- factory(exports2, propTypesExports, React__default);
13481
+ factory(exports2, requirePropTypes(), React__default);
13456
13482
  }
13457
13483
  })(commonjsGlobal, function(_exports, _propTypes2, _react3) {
13458
13484
  Object.defineProperty(_exports, "__esModule", {
@@ -69334,7 +69360,7 @@ Object.defineProperty(DraggableCore$2, "__esModule", {
69334
69360
  });
69335
69361
  DraggableCore$2.default = void 0;
69336
69362
  var React = _interopRequireWildcard$1(React__default);
69337
- var _propTypes = _interopRequireDefault$2(propTypesExports);
69363
+ var _propTypes = _interopRequireDefault$2(requirePropTypes());
69338
69364
  var _reactDom$1 = _interopRequireDefault$2(require$$2$1);
69339
69365
  var _domFns = domFns;
69340
69366
  var _positionFns = positionFns;
@@ -69926,7 +69952,7 @@ _defineProperty(DraggableCore$1, "defaultProps", {
69926
69952
  });
69927
69953
  exports2.default = void 0;
69928
69954
  var React2 = _interopRequireWildcard2(React__default);
69929
- var _propTypes2 = _interopRequireDefault2(propTypesExports);
69955
+ var _propTypes2 = _interopRequireDefault2(requirePropTypes());
69930
69956
  var _reactDom2 = _interopRequireDefault2(require$$2$1);
69931
69957
  var _clsx2 = _interopRequireDefault2(require$$3);
69932
69958
  var _domFns2 = domFns;
@@ -73757,7 +73783,7 @@ var Transition$1 = {};
73757
73783
  const require$$2 = /* @__PURE__ */ getAugmentedNamespace(reactLifecyclesCompat_es);
73758
73784
  Transition$1.__esModule = true;
73759
73785
  Transition$1.default = Transition$1.EXITING = Transition$1.ENTERED = Transition$1.ENTERING = Transition$1.EXITED = Transition$1.UNMOUNTED = void 0;
73760
- var PropTypes = _interopRequireWildcard(propTypesExports);
73786
+ var PropTypes = _interopRequireWildcard(requirePropTypes());
73761
73787
  var _react$1 = _interopRequireDefault$1(React__default);
73762
73788
  var _reactDom = _interopRequireDefault$1(require$$2$1);
73763
73789
  var _reactLifecyclesCompat = require$$2;
@@ -74075,7 +74101,7 @@ Transition$1.default = _default;
74075
74101
  (function(module2, exports2) {
74076
74102
  exports2.__esModule = true;
74077
74103
  exports2.default = void 0;
74078
- _interopRequireWildcard2(propTypesExports);
74104
+ _interopRequireWildcard2(requirePropTypes());
74079
74105
  var _addClass = _interopRequireDefault2(addClassExports);
74080
74106
  var _removeClass = _interopRequireDefault2(removeClass);
74081
74107
  var _react3 = _interopRequireDefault2(React__default);
@@ -74358,7 +74384,7 @@ __name(getNextChildMapping, "getNextChildMapping");
74358
74384
  (function(module2, exports2) {
74359
74385
  exports2.__esModule = true;
74360
74386
  exports2.default = void 0;
74361
- var _propTypes2 = _interopRequireDefault2(propTypesExports);
74387
+ var _propTypes2 = _interopRequireDefault2(requirePropTypes());
74362
74388
  var _react3 = _interopRequireDefault2(React__default);
74363
74389
  var _reactLifecyclesCompat2 = require$$2;
74364
74390
  var _ChildMapping = ChildMapping;
@@ -74512,7 +74538,7 @@ var TransitionGroupExports = TransitionGroup.exports;
74512
74538
  (function(module2, exports2) {
74513
74539
  exports2.__esModule = true;
74514
74540
  exports2.default = void 0;
74515
- _interopRequireDefault2(propTypesExports);
74541
+ _interopRequireDefault2(requirePropTypes());
74516
74542
  var _react3 = _interopRequireDefault2(React__default);
74517
74543
  var _reactDom2 = require$$2$1;
74518
74544
  var _TransitionGroup2 = _interopRequireDefault2(TransitionGroupExports);
@@ -74850,6 +74876,7 @@ export {
74850
74876
  tubeIcon,
74851
74877
  useDeepEqualMemo,
74852
74878
  useDialog,
74879
+ useStableReference,
74853
74880
  useTableEntities,
74854
74881
  useTableParams,
74855
74882
  useTraceUpdate,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teselagen/ui",
3
- "version": "0.5.23-beta.33",
3
+ "version": "0.5.23-beta.34",
4
4
  "main": "./src/index.js",
5
5
  "exports": {
6
6
  ".": {
@@ -1,13 +1,13 @@
1
- import React, { useEffect, useRef, useState } from "react";
1
+ import React, { useEffect, useRef } from "react";
2
2
 
3
3
  export const EditableCell = ({
4
+ value,
5
+ setValue,
4
6
  cancelEdit,
5
7
  dataTest,
6
8
  finishEdit,
7
- isNumeric,
8
- initialValue
9
+ isNumeric
9
10
  }) => {
10
- const [value, setValue] = useState(initialValue);
11
11
  const inputRef = useRef(null);
12
12
 
13
13
  useEffect(() => {
@@ -352,6 +352,7 @@ export default function useTableParams(
352
352
  reduxFormSearchInput,
353
353
  onlyShowRowsWErrors,
354
354
  reduxFormCellValidation,
355
+ reduxFormEntities,
355
356
  reduxFormSelectedCells,
356
357
  reduxFormSelectedEntityIdMap,
357
358
  reduxFormQueryParams,
@@ -0,0 +1,388 @@
1
+ import { Button, FormGroup, Position, Tooltip } from "@blueprintjs/core";
2
+ import { useCallback, useContext, useEffect, useRef, useState } from "react";
3
+ import {
4
+ AssignDefaultsModeContext,
5
+ WorkflowDefaultParamsContext,
6
+ workflowDefaultParamsObj
7
+ } from "../AssignDefaultsModeContext";
8
+ import { difference, isEqual, kebabCase } from "lodash-es";
9
+ import {
10
+ fakeWait,
11
+ getIntent,
12
+ getIntentClass,
13
+ LabelWithTooltipInfo
14
+ } from "./utils";
15
+ import useDeepCompareEffect from "use-deep-compare-effect";
16
+ import { change } from "redux-form";
17
+ import popoverOverflowModifiers from "../utils/popoverOverflowModifiers";
18
+ import classNames from "classnames";
19
+
20
+ const AbstractInput = props => {
21
+ const {
22
+ defaultValue,
23
+ meta: { dispatch, form, touched, error, warning },
24
+ onDefaultValChanged,
25
+ onFieldSubmit,
26
+ children,
27
+ tooltipProps,
28
+ tooltipError,
29
+ disabled,
30
+ intent,
31
+ tooltipInfo,
32
+ label,
33
+ inlineLabel,
34
+ isLabelTooltip,
35
+ secondaryLabel,
36
+ className,
37
+ showErrorIfUntouched,
38
+ asyncValidating,
39
+ containerStyle,
40
+ leftEl,
41
+ rightEl,
42
+ labelStyle,
43
+ noOuterLabel,
44
+ fileLimit,
45
+ noMarginBottom,
46
+ assignDefaultButton,
47
+ showGenerateDefaultDot,
48
+ setAssignDefaultsMode,
49
+ startAssigningDefault,
50
+ input,
51
+ noFillField,
52
+ isRequired,
53
+ isLoadingDefaultValue,
54
+ enableReinitialize,
55
+ defaultValCount
56
+ } = props;
57
+
58
+ const prevProps = useRef({ defaultValue, defaultValCount });
59
+
60
+ const updateDefaultValue = useCallback(() => {
61
+ dispatch(change(form, input.name, defaultValue));
62
+ onDefaultValChanged &&
63
+ onDefaultValChanged(defaultValue, input.name, form, props);
64
+ onFieldSubmit && onFieldSubmit(defaultValue);
65
+ }, [
66
+ defaultValue,
67
+ dispatch,
68
+ form,
69
+ input.name,
70
+ onDefaultValChanged,
71
+ onFieldSubmit,
72
+ props
73
+ ]);
74
+
75
+ useEffect(() => {
76
+ if (
77
+ ((input.value !== false && !input.value) || enableReinitialize) &&
78
+ defaultValue !== undefined
79
+ ) {
80
+ updateDefaultValue();
81
+ }
82
+ }, [defaultValue, enableReinitialize, input.value, updateDefaultValue]);
83
+
84
+ useEffect(() => {
85
+ const {
86
+ defaultValue: oldDefaultValue,
87
+ defaultValCount: oldDefaultValCount
88
+ } = prevProps.current;
89
+
90
+ if (
91
+ ((input.value !== false && !input.value) ||
92
+ enableReinitialize ||
93
+ defaultValCount !== oldDefaultValCount) &&
94
+ !isEqual(defaultValue, oldDefaultValue)
95
+ ) {
96
+ updateDefaultValue();
97
+ }
98
+
99
+ prevProps.current = { defaultValue, defaultValCount };
100
+ }, [
101
+ defaultValue,
102
+ defaultValCount,
103
+ enableReinitialize,
104
+ input.value,
105
+ updateDefaultValue
106
+ ]);
107
+
108
+ // if our custom field level validation is happening then we don't want to show the error visually
109
+ const showError =
110
+ (touched || showErrorIfUntouched) && error && !asyncValidating;
111
+ const showWarning = (touched || showErrorIfUntouched) && warning;
112
+ let componentToWrap =
113
+ isLabelTooltip || tooltipError ? (
114
+ <Tooltip
115
+ disabled={isLabelTooltip ? false : !showError}
116
+ intent={isLabelTooltip ? "none" : error ? "danger" : "warning"}
117
+ content={isLabelTooltip ? label : error || warning}
118
+ position={Position.TOP}
119
+ modifiers={popoverOverflowModifiers}
120
+ {...tooltipProps}
121
+ >
122
+ {children}
123
+ </Tooltip>
124
+ ) : (
125
+ children
126
+ );
127
+ const testClassName = "tg-test-" + kebabCase(input.name);
128
+ if (noFillField) {
129
+ componentToWrap = <div className="tg-no-fill-field">{componentToWrap}</div>;
130
+ }
131
+
132
+ let helperText;
133
+ if (!tooltipError) {
134
+ if (showError) {
135
+ helperText = error;
136
+ } else if (showWarning) {
137
+ helperText = warning;
138
+ }
139
+ }
140
+
141
+ // if in a cypress test show message so that inputs will not be interactable
142
+ if (window.Cypress && isLoadingDefaultValue) {
143
+ return "Loading default value...";
144
+ }
145
+
146
+ let labelInfo = secondaryLabel;
147
+
148
+ const hasOuterLabel = !noOuterLabel && !isLabelTooltip;
149
+ function getFileLimitInfo() {
150
+ if (!fileLimit) return "";
151
+ return `max ${fileLimit} file${fileLimit === 1 ? "" : "s"}`;
152
+ }
153
+
154
+ if (isRequired && hasOuterLabel && label && !labelInfo) {
155
+ labelInfo = `(required${fileLimit ? `, ${getFileLimitInfo()}` : ""})`;
156
+ } else if (!labelInfo && fileLimit) {
157
+ labelInfo = `(${getFileLimitInfo()})`;
158
+ }
159
+
160
+ return (
161
+ <FormGroup
162
+ className={classNames(className, testClassName, {
163
+ "tg-flex-form-content": leftEl || rightEl,
164
+ "tg-tooltipError": tooltipError,
165
+ "tg-has-error": showError && error
166
+ })}
167
+ disabled={disabled}
168
+ helperText={helperText}
169
+ intent={intent}
170
+ label={
171
+ hasOuterLabel && (
172
+ <LabelWithTooltipInfo
173
+ labelStyle={labelStyle}
174
+ label={label}
175
+ tooltipInfo={tooltipInfo}
176
+ />
177
+ )
178
+ }
179
+ inline={inlineLabel}
180
+ labelInfo={labelInfo}
181
+ style={{
182
+ ...(noMarginBottom && { marginBottom: 0 }),
183
+ ...containerStyle
184
+ }}
185
+ >
186
+ {showGenerateDefaultDot && (
187
+ <div style={{ zIndex: 10, position: "relative", height: 0, width: 0 }}>
188
+ <div style={{ position: "absolute", left: "0px", top: "0px" }}>
189
+ <Tooltip
190
+ modifiers={popoverOverflowModifiers}
191
+ content="Allows a Default to be Set. Click to Enter Set Default Mode (or press Shift+D when outside the input field)"
192
+ >
193
+ <div
194
+ onClick={() => {
195
+ setAssignDefaultsMode(true);
196
+ startAssigningDefault();
197
+ }}
198
+ className="generateDefaultDot"
199
+ ></div>
200
+ </Tooltip>
201
+ </div>
202
+ </div>
203
+ )}
204
+ {assignDefaultButton}
205
+ {leftEl} {componentToWrap} {rightEl}
206
+ </FormGroup>
207
+ );
208
+ };
209
+
210
+ export const withAbstractWrapper = (ComponentToWrap, opts = {}) => {
211
+ return props => {
212
+ const {
213
+ massageDefaultIdValue,
214
+ generateDefaultValue,
215
+ defaultValueByIdOverride,
216
+ defaultValue: defaultValueFromProps,
217
+ isRequired,
218
+ ...rest
219
+ } = props;
220
+
221
+ //get is assign defaults mode
222
+ //if assign default value mode then add on to the component
223
+ const [defaultValCount, setDefaultValCount] = useState(0);
224
+ const [defaultValueFromBackend, setDefault] = useState();
225
+ const [allowUserOverride, setUserOverride] = useState(true);
226
+ const [isLoadingDefaultValue, setLoadingDefaultValue] = useState(false);
227
+ const { inAssignDefaultsMode, setAssignDefaultsMode } = useContext(
228
+ AssignDefaultsModeContext
229
+ );
230
+ // tnr: we might want to grab this context object off the window in the future and have it live in lims by default
231
+ // there is no reason for those vals to live in TRC. Example code below:
232
+ // const workflowParams = useContext(window.__tgDefaultValParamsContext || defaultNullContext);
233
+ const workflowParams = useContext(WorkflowDefaultParamsContext);
234
+
235
+ const caresAboutToolContext = generateDefaultValue?.params?.toolName;
236
+
237
+ const customParamsToUse = {
238
+ ...(caresAboutToolContext
239
+ ? { ...workflowDefaultParamsObj, ...workflowParams }
240
+ : {}),
241
+ ...(generateDefaultValue ? generateDefaultValue.customParams : {})
242
+ };
243
+
244
+ async function triggerGetDefault() {
245
+ if (!defaultValueByIdOverride) {
246
+ //if defaultValueByIdOverride is passed, we can skip over getting the value from the backend straight to massaging the default value
247
+ if (!window.__triggerGetDefaultValueRequest) return;
248
+ if (!generateDefaultValue) return;
249
+ setLoadingDefaultValue(true);
250
+ //custom params should match params keys. if not throw an error
251
+ const doParamsMatch = isEqual(
252
+ Object.keys({
253
+ ...(caresAboutToolContext ? workflowDefaultParamsObj : {}), //we don't want to compare these keys so we just spread them here
254
+ ...(generateDefaultValue.params || {})
255
+ }).sort(),
256
+ Object.keys(customParamsToUse).sort()
257
+ );
258
+ if (!doParamsMatch) {
259
+ console.warn(
260
+ `Issue with generateDefaultValue. customParams don't match params`
261
+ );
262
+ console.warn(
263
+ `generateDefaultValue.params:`,
264
+ generateDefaultValue.params
265
+ );
266
+ console.warn(`generateDefaultValue.customParams:`, customParamsToUse);
267
+ throw new Error(
268
+ `Issue with generateDefaultValue code=${
269
+ generateDefaultValue.code
270
+ }: Difference detected with: ${difference(
271
+ Object.keys(generateDefaultValue.params || {}),
272
+ Object.keys(customParamsToUse || {})
273
+ ).join(
274
+ ", "
275
+ )}. customParams passed into the field should match params (as defined in defaultValueConstants.js). See console for more details.`
276
+ );
277
+ }
278
+ }
279
+
280
+ try {
281
+ let { defaultValue, allowUserOverride } = defaultValueByIdOverride
282
+ ? { defaultValue: defaultValueByIdOverride }
283
+ : await window.__triggerGetDefaultValueRequest(
284
+ generateDefaultValue.code,
285
+ customParamsToUse
286
+ );
287
+ if (massageDefaultIdValue) {
288
+ const massagedRes = await massageDefaultIdValue({
289
+ defaultValueById: defaultValue
290
+ });
291
+ if (massagedRes.defaultValue) {
292
+ defaultValue = massagedRes.defaultValue;
293
+ }
294
+ if (massagedRes.preventUserOverrideFromBeingDisabled) {
295
+ allowUserOverride = true;
296
+ }
297
+ }
298
+
299
+ // TODO:Add ths back in when we have a better way to determine if a field is a checkbox or switch
300
+ // if (
301
+ // "false" === false
302
+ // // ComponentToWrap === renderBlueprintCheckbox ||
303
+ // // ComponentToWrap === renderBlueprintSwitch
304
+ // ) {
305
+ // setDefault(defaultValue === "true");
306
+ // } else {
307
+ if (typeof defaultValue === "string") {
308
+ // remove double spaces and leading/trailing
309
+ defaultValue = defaultValue.replace(/\s+/g, " ").trim();
310
+ }
311
+ setDefault(defaultValue);
312
+ // }
313
+ setUserOverride(allowUserOverride);
314
+ setDefaultValCount(defaultValCount + 1);
315
+ } catch (error) {
316
+ console.error(`error aswf298f:`, error);
317
+ }
318
+ if (window.Cypress && window.Cypress.addFakeDefaultValueWait) {
319
+ await fakeWait();
320
+ }
321
+ setLoadingDefaultValue(false);
322
+ }
323
+ // if generateDefaultValue, hit the backend for that value
324
+ useDeepCompareEffect(() => {
325
+ // if the input already has a value we don't want to override with the default value request
326
+ if (rest.input.value) return;
327
+ triggerGetDefault();
328
+ }, [generateDefaultValue || {}]);
329
+ // const asyncValidating = props.asyncValidating;
330
+ const defaultProps = {
331
+ ...rest,
332
+ defaultValue: defaultValueFromBackend || defaultValueFromProps,
333
+ disabled: props.disabled || allowUserOverride === false,
334
+ readOnly: props.readOnly || isLoadingDefaultValue,
335
+ intent: getIntent(props),
336
+ intentClass: getIntentClass(props)
337
+ };
338
+
339
+ // don't show intent while async validating
340
+ // if (asyncValidating) {
341
+ // delete defaultProps.intent;
342
+ // delete defaultProps.intentClass;
343
+ // }
344
+
345
+ const startAssigningDefault = () =>
346
+ window.__showAssignDefaultValueModal &&
347
+ window.__showAssignDefaultValueModal({
348
+ ...props,
349
+ generateDefaultValue: {
350
+ ...props.generateDefaultValue,
351
+ customParams: customParamsToUse
352
+ },
353
+ onFinish: () => {
354
+ triggerGetDefault();
355
+ }
356
+ });
357
+
358
+ return (
359
+ <AbstractInput
360
+ {...{
361
+ ...opts,
362
+ defaultValCount,
363
+ isRequired,
364
+ ...defaultProps,
365
+ isLoadingDefaultValue,
366
+ showGenerateDefaultDot:
367
+ !inAssignDefaultsMode &&
368
+ window.__showGenerateDefaultDot &&
369
+ window.__showGenerateDefaultDot() &&
370
+ !!generateDefaultValue,
371
+ setAssignDefaultsMode,
372
+ startAssigningDefault,
373
+ assignDefaultButton: inAssignDefaultsMode && generateDefaultValue && (
374
+ <Button
375
+ onClick={startAssigningDefault}
376
+ small
377
+ style={{ background: "yellow", color: "black" }}
378
+ >
379
+ Assign Default
380
+ </Button>
381
+ )
382
+ }}
383
+ >
384
+ <ComponentToWrap {...defaultProps} />
385
+ </AbstractInput>
386
+ );
387
+ };
388
+ };
package/src/index.js CHANGED
@@ -75,6 +75,7 @@ export * from "./utils/browserUtils";
75
75
  export * from "./utils/commandUtils";
76
76
  export * from "./utils/commandControls";
77
77
  export * from "./utils/useTraceUpdate";
78
+ export * from "./utils/hooks/useStableReference";
78
79
  export { default as AsyncValidateFieldSpinner } from "./AsyncValidateFieldSpinner";
79
80
  export { default as showProgressToast } from "./utils/showProgressToast";
80
81
  export { default as getTextFromEl } from "./utils/getTextFromEl";