chem-generic-ui 0.1.12 → 0.1.13

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.
package/dist/app.js CHANGED
@@ -9,6 +9,12 @@ Object.defineProperty(exports, "ElementManager", {
9
9
  return _ElementManager.default;
10
10
  }
11
11
  });
12
+ Object.defineProperty(exports, "GenDSMisType", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _GenDSMisType.default;
16
+ }
17
+ });
12
18
  Object.defineProperty(exports, "GenPropertiesNumber", {
13
19
  enumerable: true,
14
20
  get: function get() {
@@ -22,8 +28,52 @@ Object.defineProperty(exports, "GenPropertiesText", {
22
28
  }
23
29
  });
24
30
 
31
+ var _fontawesomeSvgCore = require("@fortawesome/fontawesome-svg-core");
32
+
33
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
34
+
35
+ var _freeRegularSvgIcons = require("@fortawesome/free-regular-svg-icons");
36
+
25
37
  var _ElementManager = _interopRequireDefault(require("./components/admin/ElementManager"));
26
38
 
39
+ var _GenDSMisType = _interopRequireDefault(require("./components/fields/GenDSMisType"));
40
+
27
41
  var _GenPropertiesText = require("./components/fields/GenPropertiesText");
28
42
 
29
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
43
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
44
+
45
+ // import React, { useState, useEffect } from 'react';
46
+ // import logo from './logo.svg';
47
+ // import 'bootstrap/dist/css/bootstrap.min.css';
48
+ // import { ElementManager, GenPropertiesText } from './components/admin/ElementManager';
49
+ _fontawesomeSvgCore.library.add(_freeSolidSvgIcons.fas, _freeRegularSvgIcons.far); // export { GenPropertiesNumber, GenPropertiesText };
50
+ // function App() {
51
+ // return (
52
+ // <div className="App">
53
+ // <header className="App-header">
54
+ // <img src={logo} className="App-logo" alt="logo" />
55
+ // <p>
56
+ // Edit <code>src/App.js</code> and save to reload.
57
+ // </p>
58
+ // <a
59
+ // className="App-link"
60
+ // href="https://reactjs.org"
61
+ // target="_blank"
62
+ // rel="noopener noreferrer"
63
+ // >
64
+ // Learn React
65
+ // </a>
66
+ // </header>
67
+ // </div>
68
+ // );
69
+ // }
70
+ // export { ElementManager, GenPropertiesText };
71
+ // function App() {
72
+ // return (
73
+ // <div>
74
+ // Project A
75
+ // <ElementManager />
76
+ // </div>
77
+ // );
78
+ // }
79
+ // export default App;
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _lodash = require("lodash");
13
+
14
+ var _reactBootstrap = require("react-bootstrap");
15
+
16
+ var _utils = require("../tools/utils");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
21
+
22
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
23
+
24
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
25
+
26
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
27
+
28
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
29
+
30
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
31
+
32
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
33
+
34
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
35
+
36
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
37
+
38
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
39
+
40
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
41
+
42
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
43
+
44
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
45
+
46
+ var GenericDSDetails = /*#__PURE__*/function (_Component) {
47
+ _inherits(GenericDSDetails, _Component);
48
+
49
+ var _super = _createSuper(GenericDSDetails);
50
+
51
+ function GenericDSDetails(props) {
52
+ var _this;
53
+
54
+ _classCallCheck(this, GenericDSDetails);
55
+
56
+ _this = _super.call(this, props);
57
+ _this.handleInputChange = _this.handleInputChange.bind(_assertThisInitialized(_this));
58
+ _this.handleUnitClick = _this.handleUnitClick.bind(_assertThisInitialized(_this));
59
+ _this.handleReload = _this.handleReload.bind(_assertThisInitialized(_this));
60
+ return _this;
61
+ }
62
+
63
+ _createClass(GenericDSDetails, [{
64
+ key: "handleInputChange",
65
+ value: function handleInputChange(event, field, layer) {
66
+ var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'text';
67
+ var genericDS = this.props.genericDS;
68
+ var properties = genericDS.properties;
69
+ var value = '';
70
+
71
+ switch (type) {
72
+ case 'checkbox':
73
+ value = event.target.checked;
74
+ break;
75
+
76
+ case 'select':
77
+ value = event ? event.value : null;
78
+ break;
79
+
80
+ case 'formula-field':
81
+ if (event.target) {
82
+ value = event.target.value;
83
+ } else {
84
+ value = event;
85
+ }
86
+
87
+ break;
88
+
89
+ case 'integer':
90
+ value = event.target.value;
91
+ value = Math.trunc(value);
92
+ break;
93
+
94
+ default:
95
+ value = event.target.value;
96
+ }
97
+
98
+ properties.layers["".concat(layer)].fields.find(function (e) {
99
+ return e.field === field;
100
+ }).value = value;
101
+
102
+ if (type === 'system-defined' && (!properties.layers["".concat(layer)].fields.find(function (e) {
103
+ return e.field === field;
104
+ }).value_system || properties.layers["".concat(layer)].fields.find(function (e) {
105
+ return e.field === field;
106
+ }).value_system === '')) {
107
+ var opt = properties.layers["".concat(layer)].fields.find(function (e) {
108
+ return e.field === field;
109
+ }).option_layers;
110
+ properties.layers["".concat(layer)].fields.find(function (e) {
111
+ return e.field === field;
112
+ }).value_system = (0, _utils.genUnits)(opt)[0].key;
113
+ }
114
+
115
+ genericDS.properties = properties;
116
+ genericDS.changed = true;
117
+ this.props.onChange('dataset', {
118
+ target: {
119
+ value: genericDS
120
+ }
121
+ });
122
+ }
123
+ }, {
124
+ key: "handleUnitClick",
125
+ value: function handleUnitClick(layer, obj) {
126
+ var genericDS = this.props.genericDS;
127
+ var properties = genericDS.properties;
128
+ var newVal = (0, _utils.unitConversion)(obj.option_layers, obj.value_system, obj.value);
129
+ properties.layers["".concat(layer)].fields.find(function (e) {
130
+ return e.field === obj.field;
131
+ }).value_system = obj.value_system;
132
+ properties.layers["".concat(layer)].fields.find(function (e) {
133
+ return e.field === obj.field;
134
+ }).value = newVal;
135
+ genericDS.properties = properties;
136
+ genericDS.changed = true;
137
+ this.props.onChange('dataset', {
138
+ target: {
139
+ value: genericDS
140
+ }
141
+ });
142
+ }
143
+ }, {
144
+ key: "handleReload",
145
+ value: function handleReload() {
146
+ var _this$props = this.props,
147
+ klass = _this$props.klass,
148
+ genericDS = _this$props.genericDS;
149
+
150
+ if (klass.properties_release) {
151
+ var newProps = (0, _lodash.cloneDeep)(klass.properties_release);
152
+ newProps.klass_uuid = klass.uuid;
153
+ Object.keys(newProps.layers).forEach(function (key) {
154
+ var newLayer = newProps.layers[key] || {};
155
+ var curFields = genericDS.properties.layers[key] && genericDS.properties.layers[key].fields || [];
156
+ (newLayer.fields || []).forEach(function (f, idx) {
157
+ var curIdx = (0, _lodash.findIndex)(curFields, function (o) {
158
+ return o.field === f.field;
159
+ });
160
+
161
+ if (curIdx >= 0) {
162
+ var curVal = genericDS.properties.layers[key].fields[curIdx].value;
163
+
164
+ var curType = _typeof(curVal);
165
+
166
+ if (['select', 'text', 'textarea', 'formula-field'].includes(newProps.layers[key].fields[idx].type)) {
167
+ newProps.layers[key].fields[idx].value = curType !== 'undefined' ? curVal.toString() : '';
168
+ }
169
+
170
+ if (newProps.layers[key].fields[idx].type === 'integer') {
171
+ newProps.layers[key].fields[idx].value = curType === 'undefined' || curType === 'boolean' || isNaN(curVal) ? 0 : parseInt(curVal, 10);
172
+ }
173
+
174
+ if (newProps.layers[key].fields[idx].type === 'checkbox') {
175
+ newProps.layers[key].fields[idx].value = curType !== 'undefined' ? (0, _utils.toBool)(curVal) : false;
176
+ }
177
+
178
+ if (newProps.layers[key].fields[idx].type === 'system-defined') {
179
+ var units = (0, _utils.genUnits)(newProps.layers[key].fields[idx].option_layers);
180
+ var vs = units.find(function (u) {
181
+ return u.key === genericDS.properties.layers[key].fields[curIdx].value_system;
182
+ });
183
+ newProps.layers[key].fields[idx].value_system = vs && vs.key || units[0].key;
184
+ newProps.layers[key].fields[idx].value = (0, _utils.toNum)(curVal);
185
+ }
186
+ }
187
+ });
188
+ });
189
+ genericDS.properties = newProps;
190
+ genericDS.dataset_klass_id = klass.id;
191
+ genericDS.klass_ols = klass.ols_term_id;
192
+ genericDS.klass_label = klass.label;
193
+ genericDS.changed = true;
194
+ this.props.onChange('dataset', {
195
+ target: {
196
+ value: genericDS
197
+ }
198
+ });
199
+ } else {
200
+ this.props.onChange('dataset', {
201
+ target: {
202
+ value: undefined
203
+ }
204
+ });
205
+ }
206
+ } // elementalPropertiesItem(genericDS, klass) {
207
+ // const layersLayout = LayersLayout(
208
+ // genericDS.properties.layers,
209
+ // (klass.properties_release && klass.properties_release.select_options) || {},
210
+ // this.handleInputChange,
211
+ // () => {},
212
+ // this.handleUnitClick
213
+ // );
214
+ // return (<div style={{ margin: '5px' }}>{layersLayout}</div>);
215
+ // }
216
+
217
+ }, {
218
+ key: "render",
219
+ value: function render() {
220
+ var _this2 = this;
221
+
222
+ var _this$props2 = this.props,
223
+ uiCtrl = _this$props2.uiCtrl,
224
+ genericDS = _this$props2.genericDS,
225
+ klass = _this$props2.klass,
226
+ kind = _this$props2.kind;
227
+
228
+ if (uiCtrl && Object.keys(genericDS).length !== 0) {
229
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Panel, {
230
+ className: "panel-detail"
231
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Panel.Body, {
232
+ style: {
233
+ position: 'relative',
234
+ minHeight: 260,
235
+ overflowY: 'unset'
236
+ }
237
+ }, /*#__PURE__*/_react.default.createElement("span", {
238
+ className: "g-ds-note label"
239
+ }, /*#__PURE__*/_react.default.createElement("span", {
240
+ className: "g-ds-title"
241
+ }, "Note"), /*#__PURE__*/_react.default.createElement("br", null), "Selected analysis type: ", (0, _utils.absOlsTermLabel)(kind), /*#__PURE__*/_react.default.createElement("br", null), "Content is designed for: ", genericDS.klass_label), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonToolbar, {
242
+ className: "pull-right"
243
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
244
+ placement: "top",
245
+ overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
246
+ id: "_tooltip_reload"
247
+ }, "click to reload the content template")
248
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
249
+ bsSize: "xsmall",
250
+ bsStyle: "danger",
251
+ onClick: function onClick() {
252
+ return _this2.handleReload();
253
+ }
254
+ }, "Reload")))));
255
+ }
256
+
257
+ return null;
258
+ }
259
+ }]);
260
+
261
+ return GenericDSDetails;
262
+ }(_react.Component);
263
+
264
+ GenericDSDetails.propTypes = {
265
+ uiCtrl: _propTypes.default.bool.isRequired,
266
+ // MatrixCheck(currentUser.matrix, 'genericDataset')
267
+ kind: _propTypes.default.string.isRequired,
268
+ // selected analysis type
269
+ genericDS: _propTypes.default.object,
270
+ klass: _propTypes.default.object,
271
+ onChange: _propTypes.default.func.isRequired
272
+ };
273
+ GenericDSDetails.defaultProps = {
274
+ genericDS: {},
275
+ klass: {}
276
+ };
277
+ var _default = GenericDSDetails;
278
+ exports.default = _default;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _reactBootstrap = require("react-bootstrap");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ var ButtonConfirm = function ButtonConfirm(props) {
17
+ var msg = props.msg,
18
+ size = props.size,
19
+ bs = props.bs,
20
+ fnClick = props.fnClick,
21
+ fnParams = props.fnParams,
22
+ place = props.place,
23
+ fa = props.fa,
24
+ disabled = props.disabled;
25
+
26
+ var popover = /*#__PURE__*/_react.default.createElement(_reactBootstrap.Popover, {
27
+ id: "popover-button-confirm"
28
+ }, msg, " ", /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("div", {
29
+ className: "btn-toolbar"
30
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
31
+ bsSize: "xsmall",
32
+ bsStyle: "danger",
33
+ "aria-hidden": "true",
34
+ onClick: function onClick() {
35
+ return fnClick(fnParams);
36
+ }
37
+ }, "Yes"), /*#__PURE__*/_react.default.createElement("span", null, "\xA0\xA0"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
38
+ bsSize: "xsmall",
39
+ bsStyle: "warning"
40
+ }, "No")));
41
+
42
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
43
+ animation: true,
44
+ placement: place,
45
+ root: true,
46
+ trigger: "focus",
47
+ overlay: popover
48
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
49
+ bsSize: size,
50
+ bsStyle: bs,
51
+ disabled: disabled
52
+ }, /*#__PURE__*/_react.default.createElement("i", {
53
+ className: "fa ".concat(fa),
54
+ "aria-hidden": "true"
55
+ })));
56
+ };
57
+
58
+ ButtonConfirm.propTypes = {
59
+ msg: _propTypes.default.string.isRequired,
60
+ fnParams: _propTypes.default.object.isRequired,
61
+ fnClick: _propTypes.default.func.isRequired,
62
+ bs: _propTypes.default.string,
63
+ size: _propTypes.default.string,
64
+ place: _propTypes.default.string,
65
+ fa: _propTypes.default.string,
66
+ disabled: _propTypes.default.bool
67
+ };
68
+ ButtonConfirm.defaultProps = {
69
+ bs: 'danger',
70
+ size: 'xs',
71
+ place: 'right',
72
+ fa: 'fa-trash-o',
73
+ disabled: false
74
+ };
75
+ var _default = ButtonConfirm;
76
+ exports.default = _default;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _reactBootstrap = require("react-bootstrap");
13
+
14
+ var _uuid = _interopRequireDefault(require("uuid"));
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ var ButtonTooltip = function ButtonTooltip(props) {
19
+ var tip = /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
20
+ id: _uuid.default.v4()
21
+ }, props.tip);
22
+
23
+ var size = props.size,
24
+ bs = props.bs,
25
+ fnClick = props.fnClick,
26
+ element = props.element,
27
+ place = props.place,
28
+ fa = props.fa,
29
+ disabled = props.disabled,
30
+ txt = props.txt;
31
+ var content = txt ? /*#__PURE__*/_react.default.createElement("span", null, txt, "\xA0") : '';
32
+
33
+ if (bs === '') {
34
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
35
+ delayShow: 1000,
36
+ placement: place,
37
+ overlay: tip
38
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
39
+ bsSize: size,
40
+ onClick: function onClick() {
41
+ return fnClick(element);
42
+ },
43
+ disabled: disabled
44
+ }, content, /*#__PURE__*/_react.default.createElement("i", {
45
+ className: "fa ".concat(fa),
46
+ "aria-hidden": "true"
47
+ })));
48
+ }
49
+
50
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
51
+ delayShow: 1000,
52
+ placement: place,
53
+ overlay: tip
54
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
55
+ bsSize: size,
56
+ bsStyle: bs,
57
+ onClick: function onClick() {
58
+ return fnClick(element);
59
+ },
60
+ disabled: disabled
61
+ }, content, /*#__PURE__*/_react.default.createElement("i", {
62
+ className: "fa ".concat(fa),
63
+ "aria-hidden": "true"
64
+ })));
65
+ };
66
+
67
+ ButtonTooltip.propTypes = {
68
+ tip: _propTypes.default.string.isRequired,
69
+ element: _propTypes.default.oneOfType([_propTypes.default.object, _propTypes.default.bool]),
70
+ fnClick: _propTypes.default.func.isRequired,
71
+ bs: _propTypes.default.string,
72
+ size: _propTypes.default.string,
73
+ place: _propTypes.default.string,
74
+ fa: _propTypes.default.string,
75
+ disabled: _propTypes.default.bool,
76
+ txt: _propTypes.default.string
77
+ };
78
+ ButtonTooltip.defaultProps = {
79
+ bs: '',
80
+ size: 'xs',
81
+ place: 'right',
82
+ fa: 'fa-pencil-square-o',
83
+ disabled: false,
84
+ txt: null,
85
+ element: {}
86
+ };
87
+ var _default = ButtonTooltip;
88
+ exports.default = _default;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _reactBootstrap = require("react-bootstrap");
13
+
14
+ var _uuid = _interopRequireDefault(require("uuid"));
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ var FieldLabel = function FieldLabel(props) {
19
+ var label = props.label,
20
+ desc = props.desc;
21
+ return desc && desc !== '' ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
22
+ placement: "top",
23
+ delayShow: 1000,
24
+ overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
25
+ id: _uuid.default.v4()
26
+ }, desc)
27
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ControlLabel, null, label)) : /*#__PURE__*/_react.default.createElement(_reactBootstrap.ControlLabel, null, label);
28
+ };
29
+
30
+ FieldLabel.propTypes = {
31
+ label: _propTypes.default.string.isRequired,
32
+ desc: _propTypes.default.string
33
+ };
34
+ FieldLabel.defaultProps = {
35
+ desc: ''
36
+ };
37
+ var _default = FieldLabel;
38
+ exports.default = _default;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _reactBootstrap = require("react-bootstrap");
13
+
14
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ var GenDSMisType = function GenDSMisType(props) {
19
+ var uiCtrl = props.uiCtrl;
20
+
21
+ if (uiCtrl) {
22
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
23
+ placement: "top",
24
+ overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
25
+ id: "tooltip"
26
+ }, "Type (Chemical Methods Ontology) has been changed. ", /*#__PURE__*/_react.default.createElement("br", null), "Please review this Dataset content.")
27
+ }, /*#__PURE__*/_react.default.createElement("span", {
28
+ style: {
29
+ color: 'red'
30
+ }
31
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
32
+ icon: "fas fa-exclamation-circle"
33
+ }), "\xA0"));
34
+ }
35
+
36
+ return null;
37
+ };
38
+
39
+ GenDSMisType.propTypes = {
40
+ uiCtrl: _propTypes.default.bool.isRequired
41
+ };
42
+ var _default = GenDSMisType;
43
+ exports.default = _default;
@@ -0,0 +1,489 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.unitConversion = exports.unitConvToBase = exports.toNum = exports.toBool = exports.swapAryEls = exports.storeFlow = exports.samOptions = exports.reUnit = exports.molOptions = exports.inputEventVal = exports.genUnitsSystem = exports.genUnits = exports.genUnitSup = exports.genUnit = exports.flowDefault = exports.decorateNode = exports.conFlowEls = exports.clsInputGroup = exports.absOlsTermLabel = exports.absOlsTermId = exports.GenericDummy = void 0;
7
+
8
+ var _react = _interopRequireDefault(require("react"));
9
+
10
+ var _uuid = _interopRequireDefault(require("uuid"));
11
+
12
+ var _lodash = require("lodash");
13
+
14
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
19
+
20
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
21
+
22
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
23
+
24
+ var GenericDummy = /*#__PURE__*/_createClass(function GenericDummy() {
25
+ _classCallCheck(this, GenericDummy);
26
+
27
+ this.type = 'dummy';
28
+ this.field = _uuid.default.v1();
29
+ this.position = 100;
30
+ this.label = '';
31
+ this.default = '';
32
+ this.required = false;
33
+ });
34
+
35
+ exports.GenericDummy = GenericDummy;
36
+
37
+ var inputEventVal = function inputEventVal(event, type) {
38
+ if (type === 'select') {
39
+ return event ? event.value : null;
40
+ } else if (type.startsWith('drag')) {
41
+ return event;
42
+ } else if (type === 'checkbox') {
43
+ return event.target.checked;
44
+ } else if (type === 'formula-field') {
45
+ if (event.target) {
46
+ return event.target.value;
47
+ }
48
+
49
+ return event;
50
+ }
51
+
52
+ return event.target && event.target.value;
53
+ };
54
+
55
+ exports.inputEventVal = inputEventVal;
56
+
57
+ var absOlsTermId = function absOlsTermId(val) {
58
+ return (val || '').split('|')[0].trim();
59
+ };
60
+
61
+ exports.absOlsTermId = absOlsTermId;
62
+
63
+ var absOlsTermLabel = function absOlsTermLabel(val) {
64
+ return val.replace(absOlsTermId(val), '').replace('|', '').trim();
65
+ };
66
+
67
+ exports.absOlsTermLabel = absOlsTermLabel;
68
+
69
+ var toNum = function toNum(val) {
70
+ var parse = Number(val || '');
71
+ return Number.isNaN(parse) ? 0 : parse;
72
+ };
73
+
74
+ exports.toNum = toNum;
75
+
76
+ var genUnitSup = function genUnitSup(val) {
77
+ if (typeof val === 'undefined' || val === null) return '';
78
+ var vals = val.match(/<\s*(\w+\b)(?:(?!<\s*\/\s*\1\b)[\s\S])*<\s*\/\s*\1\s*>|[^<]+/g);
79
+ var reV = vals.map(function (v) {
80
+ var supVal = v.match(/<sup[^>]*>([^<]+)<\/sup>/);
81
+ if (supVal) return /*#__PURE__*/_react.default.createElement("sup", {
82
+ key: _uuid.default.v4()
83
+ }, supVal[1]);
84
+ var subVal = v.match(/<sub[^>]*>([^<]+)<\/sub>/);
85
+ if (subVal) return /*#__PURE__*/_react.default.createElement("sub", {
86
+ key: _uuid.default.v4()
87
+ }, subVal[1]);
88
+ return v;
89
+ });
90
+ return /*#__PURE__*/_react.default.createElement("span", null, reV);
91
+ };
92
+
93
+ exports.genUnitSup = genUnitSup;
94
+
95
+ var toBool = function toBool(val) {
96
+ var valLower = String(val).toLowerCase();
97
+ return !(!valLower || valLower === 'false' || valLower === '0');
98
+ };
99
+
100
+ exports.toBool = toBool;
101
+
102
+ var genUnitsSystem = function genUnitsSystem() {
103
+ fetch('units_system.json', {
104
+ headers: {
105
+ 'Content-Type': 'application/json',
106
+ Accept: 'application/json'
107
+ }
108
+ }).then(function (response) {
109
+ var units = response.json();
110
+ console.log(units);
111
+ return (units || {}).fields || [];
112
+ }).catch(function (errorMessage) {
113
+ console.log(errorMessage);
114
+ return [];
115
+ });
116
+ };
117
+
118
+ exports.genUnitsSystem = genUnitsSystem;
119
+
120
+ var genUnits = function genUnits(field) {
121
+ return (genUnitsSystem().find(function (u) {
122
+ return u.field === field;
123
+ }) || {}).units || [];
124
+ };
125
+
126
+ exports.genUnits = genUnits;
127
+
128
+ var genUnit = function genUnit(field, key) {
129
+ var units = genUnits(field);
130
+ return units.find(function (u) {
131
+ return u.key === key;
132
+ }) || {};
133
+ };
134
+
135
+ exports.genUnit = genUnit;
136
+
137
+ var reUnit = function reUnit(unitsSystem, optionLayers) {
138
+ var uniFileds = unitsSystem.fields || [];
139
+ var uniObj = uniFileds.find(function (fiel) {
140
+ return fiel.field === optionLayers;
141
+ });
142
+ var defaultUnit = uniObj && uniObj.field || '';
143
+ var preUnit = uniFileds.length > 0 ? uniFileds[0].field : '';
144
+ return defaultUnit === '' ? preUnit : defaultUnit;
145
+ };
146
+
147
+ exports.reUnit = reUnit;
148
+
149
+ var convertTemp = function convertTemp(key, val) {
150
+ switch (key) {
151
+ case 'F':
152
+ return (parseFloat(val) * 1.8 + 32).toFixed(2);
153
+
154
+ case 'K':
155
+ return ((parseFloat(val) + 459.67) * 5 / 9).toFixed(2);
156
+
157
+ case 'C':
158
+ return (parseFloat(val) - 273.15).toFixed(2);
159
+
160
+ default:
161
+ return val;
162
+ }
163
+ };
164
+
165
+ var unitConvToBase = function unitConvToBase() {
166
+ var field = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
167
+ var units = genUnits(field.option_layers);
168
+
169
+ if (units.length <= 1) {
170
+ return field.value;
171
+ }
172
+
173
+ var idx = (0, _lodash.findIndex)(units, function (u) {
174
+ return u.key === field.value_system;
175
+ });
176
+ if (idx <= 0) return field.value;
177
+ return field.value * units[0].nm / (units[idx] && units[idx].nm || 1) || 0;
178
+ };
179
+
180
+ exports.unitConvToBase = unitConvToBase;
181
+
182
+ var unitConversion = function unitConversion(field, key, val) {
183
+ if (typeof val === 'undefined' || val == null || val === 0 || val === '') {
184
+ return val;
185
+ }
186
+
187
+ if (field === 'temperature') {
188
+ return convertTemp(key, val);
189
+ }
190
+
191
+ var units = genUnits(field);
192
+
193
+ if (units.length <= 1) {
194
+ return val;
195
+ }
196
+
197
+ var idx = (0, _lodash.findIndex)(units, function (u) {
198
+ return u.key === key;
199
+ });
200
+
201
+ if (idx === -1) {
202
+ return val;
203
+ }
204
+
205
+ var pIdx = idx === 0 ? units.length : idx;
206
+ var pre = units[pIdx - 1] && units[pIdx - 1].nm || 1;
207
+ var curr = units[idx] && units[idx].nm || 1;
208
+ return parseFloat((parseFloat(val) * (curr / pre)).toFixed(5));
209
+ }; // const notification = props =>
210
+ // (
211
+ // NotificationActions.add({
212
+ // title: props.title,
213
+ // message: props.msg,
214
+ // level: props.lvl,
215
+ // position: 'tc',
216
+ // dismissible: 'button',
217
+ // autoDismiss: props.autoDismiss || 5,
218
+ // uid: props.uid || uuid.v4()
219
+ // })
220
+ // );
221
+ // const validateLayerInput = (layer, act = 'new') => {
222
+ // if (layer.key === '') {
223
+ // notification({ title: `Layer [${layer.key}]`, lvl: 'error', msg: 'Please input Name.' });
224
+ // return false;
225
+ // }
226
+ // if (act === 'new' && !(/^[a-z][a-z_]+[a-z]$/g.test(layer.key))) {
227
+ // notification({ title: `Layer [${layer.key}]`, lvl: 'error', msg: 'This Name is invalid, please try a different one.' });
228
+ // return false;
229
+ // }
230
+ // if (parseInt((layer.cols || 1), 10) < 1) {
231
+ // notification({ title: `Layer [${layer.key}]`, lvl: 'error', msg: 'The minimun of Column per Row is 1, please input a different one.' });
232
+ // return false;
233
+ // }
234
+ // return true;
235
+ // };
236
+ // const validateSelectList = (selectName, element) => {
237
+ // if (selectName === '') {
238
+ // notification({ title: `Select List [${selectName}]`, lvl: 'error', msg: 'Please input Name.' });
239
+ // return false;
240
+ // }
241
+ // if (!(/^[a-z][a-z_]+[a-z]$/g.test(selectName))) {
242
+ // notification({ title: `Select List [${selectName}]`, lvl: 'error', msg: 'This Name is invalid, please try a different one.' });
243
+ // return false;
244
+ // }
245
+ // if (element.properties_template.select_options[`${selectName}`]) {
246
+ // notification({ title: `Select List [${selectName}]`, lvl: 'error', msg: 'This name of Select List is already taken. Please choose another one.' });
247
+ // return false;
248
+ // }
249
+ // return true;
250
+ // };
251
+
252
+
253
+ exports.unitConversion = unitConversion;
254
+
255
+ var clsInputGroup = function clsInputGroup(el) {
256
+ if (!el) return el;
257
+ var genericEl = el;
258
+ var layers = genericEl.properties_template.layers;
259
+ var keys = Object.keys(layers);
260
+ keys.forEach(function (key) {
261
+ var layer = layers[key];
262
+ layer.fields.filter(function (e) {
263
+ return e.type === 'input-group';
264
+ }).forEach(function (e) {
265
+ e.sub_fields.forEach(function (s) {
266
+ var ff = s;
267
+
268
+ if (ff.type === 'text') {
269
+ ff.value = '';
270
+ }
271
+ });
272
+ });
273
+ });
274
+ return genericEl;
275
+ };
276
+
277
+ exports.clsInputGroup = clsInputGroup;
278
+ var molOptions = [{
279
+ label: 'InChiKey',
280
+ value: 'inchikey'
281
+ }, {
282
+ label: 'SMILES',
283
+ value: 'smiles'
284
+ }, {
285
+ label: 'IUPAC',
286
+ value: 'iupac'
287
+ }, {
288
+ label: 'Mass',
289
+ value: 'molecular_weight'
290
+ }];
291
+ exports.molOptions = molOptions;
292
+ var samOptions = [{
293
+ label: 'Name',
294
+ value: 'name'
295
+ }, {
296
+ label: 'Ext. Label',
297
+ value: 'external_label'
298
+ }, {
299
+ label: 'Mass',
300
+ value: 'molecular_weight'
301
+ }];
302
+ exports.samOptions = samOptions;
303
+
304
+ var findCurrentNode = function findCurrentNode(_srcKey, _layerVals) {
305
+ var result = [];
306
+
307
+ var fs = _layerVals.filter(function (o) {
308
+ return o.wf && o.wf_info && o.wf_info.source_layer === _srcKey;
309
+ });
310
+
311
+ if (fs.length > 1) {
312
+ fs.forEach(function (o) {
313
+ findCurrentNode(o, _layerVals);
314
+ });
315
+ } else if (fs.length === 1) {
316
+ return findCurrentNode(fs[0].key, _layerVals);
317
+ }
318
+
319
+ return [_srcKey];
320
+ };
321
+
322
+ var decorateNode = function decorateNode(_elements, _layers) {
323
+ if (!_elements || _elements.length < 1) return _elements;
324
+ var m = {
325
+ background: '#D6D5E6',
326
+ color: '#333' // border: '1px solid #222138',
327
+ // width: 180,
328
+
329
+ };
330
+ var elements = _elements;
331
+ elements.map(function (e) {
332
+ if (['input', 'output'].includes(e.type) || e.animated) return e;
333
+ var lk = e.data.lKey;
334
+ var fk = (0, _lodash.findKey)(_layers, function (o) {
335
+ return o.wf && (o.key === lk || o.key.startsWith("".concat(lk, ".")));
336
+ });
337
+
338
+ if (fk) {
339
+ e.style = m;
340
+ return e;
341
+ }
342
+
343
+ return e;
344
+ });
345
+ return elements;
346
+ };
347
+
348
+ exports.decorateNode = decorateNode;
349
+
350
+ var conFlowEls = function conFlowEls(props) {
351
+ var properties = props.properties,
352
+ properties_release = props.properties_release;
353
+ var flow = properties_release.flow,
354
+ layers = properties_release.layers;
355
+ var deep = (0, _lodash.cloneDeep)(flow);
356
+ var els = deep && deep.elements || [];
357
+ els.map(function (d) {
358
+ if (['default'].includes(d.type) && d.data) {
359
+ var lKey = d.data.lKey;
360
+ var fk = (0, _lodash.findKey)(properties.layers || {}, function (o) {
361
+ return o.wf && (o.key === lKey || o.key.startsWith("".concat(lKey, ".")));
362
+ });
363
+ var chk = fk ? /*#__PURE__*/_react.default.createElement("div", {
364
+ style: {
365
+ position: 'absolute',
366
+ top: '0px',
367
+ right: '2px',
368
+ color: 'green',
369
+ zIndex: '100'
370
+ }
371
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
372
+ icon: "far fa-check-circle"
373
+ })) : null;
374
+ var layer = layers[lKey] || {};
375
+
376
+ var ll = /*#__PURE__*/_react.default.createElement("div", null, chk, /*#__PURE__*/_react.default.createElement("div", {
377
+ style: {
378
+ borderWidth: '0px 0px 1px 0px',
379
+ borderColor: 'black',
380
+ borderStyle: 'solid'
381
+ }
382
+ }, /*#__PURE__*/_react.default.createElement("b", null, layer.label)), /*#__PURE__*/_react.default.createElement("div", null, "(", layer.key, ")"));
383
+
384
+ d.data = {
385
+ label: ll,
386
+ lKey: layer.key
387
+ };
388
+ }
389
+
390
+ return d;
391
+ });
392
+ return els;
393
+ };
394
+
395
+ exports.conFlowEls = conFlowEls;
396
+
397
+ var storeFlow = function storeFlow(props) {
398
+ var elements = props.elements;
399
+ var els = (0, _lodash.cloneDeep)(elements);
400
+ els.map(function (d) {
401
+ if (['default'].includes(d.type) && d.data) {
402
+ delete d.data.label;
403
+ delete d.data.layer;
404
+ }
405
+
406
+ return d;
407
+ });
408
+ return els;
409
+ };
410
+
411
+ exports.storeFlow = storeFlow;
412
+ var flowDefault = [{
413
+ id: '1',
414
+ type: 'input',
415
+ data: {
416
+ label: 'Start'
417
+ },
418
+ position: {
419
+ x: 250,
420
+ y: 15
421
+ }
422
+ }, {
423
+ id: '2',
424
+ type: 'output',
425
+ data: {
426
+ label: 'End'
427
+ },
428
+ position: {
429
+ x: 250,
430
+ y: 255
431
+ }
432
+ }];
433
+ exports.flowDefault = flowDefault;
434
+
435
+ var isLayerInWF = function isLayerInWF(_element, _layerKey) {
436
+ var flow = _element.properties_template.flow;
437
+ var finds = ((flow || {}).elements || []).filter(function (e) {
438
+ return e.type === 'default' && (e.data || {}).lKey === _layerKey;
439
+ });
440
+ return finds.length > 0;
441
+ }; // const validateLayerDeletion = (_element, _delKey) => {
442
+ // if (isLayerInWF(_element, _delKey)) {
443
+ // notification({ title: `Layer [${_delKey}]`, lvl: 'warning', msg: `This layer [${_delKey}] can not be removed because it is currently used in workflow.` });
444
+ // return false;
445
+ // }
446
+ // return true;
447
+ // };
448
+ // const validateLayerUpdation = (_element, _updates) => {
449
+ // const { key, wf } = _updates;
450
+ // if (isLayerInWF(_element, key)) {
451
+ // if (!wf) {
452
+ // notification({ title: `Layer [${key}]`, lvl: 'warning', msg: `Can not change the attribute 'used in Workflow?' because this layer [${key}] is currently used in workflow.` });
453
+ // return false;
454
+ // }
455
+ // }
456
+ // const { layers } = _element.properties_template;
457
+ // if (wf && layers[key] && (layers[key].cond_fields || []).length > 0) {
458
+ // notification({ title: `Layer [${key}]`, lvl: 'warning', msg: 'Can not use in Workflow because the Layer Restriction has been set.' });
459
+ // return false;
460
+ // }
461
+ // return true;
462
+ // };
463
+
464
+
465
+ var swapAryEls = function swapAryEls(_ary, idx1, idx2) {
466
+ var ary = _ary;
467
+ var temp = ary[idx1];
468
+ ary[idx1] = ary[idx2];
469
+ ary[idx2] = temp;
470
+ return ary;
471
+ }; // re-fetch workflow and set to state of store, should be out-of this project
472
+ // const renderFlowModal = (generic, isToggle) => {
473
+ // const segmentKlasses = (UserStore.getState() && UserStore.getState().segmentKlasses) || [];
474
+ // let shortLabel = generic.short_label;
475
+ // if (!shortLabel) {
476
+ // shortLabel = segmentKlasses.filter(s => s.id === generic.segment_klass_id);
477
+ // shortLabel = shortLabel.length > 0 ? shortLabel[0].label : '';
478
+ // }
479
+ // const params = {
480
+ // properties_release: cloneDeep(generic.properties_release) || {},
481
+ // properties: cloneDeep(generic.properties) || {},
482
+ // shortLabel,
483
+ // toggle: isToggle
484
+ // };
485
+ // UIActions.rerenderGenericWorkflow(params);
486
+ // };
487
+
488
+
489
+ exports.swapAryEls = swapAryEls;
package/dist/index.js CHANGED
@@ -17,10 +17,12 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
17
17
  // import reportWebVitals from './reportWebVitals';
18
18
  // import { ElementManager, GenPropertiesText } from './components/admin/ElementManager';
19
19
  // export { ElementManager, GenPropertiesText };
20
- _reactDom.default.render( /*#__PURE__*/_react.default.createElement(_app.ElementManager, {
20
+ _reactDom.default.render( /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_app.ElementManager, {
21
21
  elements: [],
22
22
  element: {}
23
- }), document.getElementById('root')); // function App() {
23
+ }), /*#__PURE__*/_react.default.createElement(_app.GenDSMisType, {
24
+ uiCtrl: true
25
+ })), document.getElementById('root')); // function App() {
24
26
  // return (
25
27
  // <div>
26
28
  // Project A
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chem-generic-ui",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "scripts": {
@@ -14,11 +14,11 @@
14
14
  "react-dom": "^17.0.2"
15
15
  },
16
16
  "devDependencies": {
17
- "react-scripts": "4.0.1",
18
17
  "eslint-config-airbnb": "^16.1.0",
19
18
  "eslint-plugin-import": "^2.8.0",
20
19
  "eslint-plugin-jsx-a11y": "^6.0.2",
21
- "eslint-plugin-react": "^7.4.0"
20
+ "eslint-plugin-react": "^7.4.0",
21
+ "react-scripts": "4.0.1"
22
22
  },
23
23
  "main": "dist/app.js",
24
24
  "module": "dist/app.js",
@@ -34,8 +34,14 @@
34
34
  "@babel/core": "^7.0.0",
35
35
  "@babel/preset-env": "7.3.1",
36
36
  "@babel/preset-react": "7.0.0",
37
+ "@fortawesome/fontawesome-svg-core": "^1.3.0",
38
+ "@fortawesome/free-brands-svg-icons": "^6.0.0",
39
+ "@fortawesome/free-regular-svg-icons": "^6.0.0",
40
+ "@fortawesome/free-solid-svg-icons": "^6.0.0",
41
+ "@fortawesome/react-fontawesome": "^0.1.17",
37
42
  "bootstrap": "5.1.3",
38
43
  "lodash": "^4.17.21",
44
+ "prop-types": "^15.8.1",
39
45
  "react": "^17.0.2",
40
46
  "react-bootstrap": "^2.2.1",
41
47
  "react-dom": "^17.0.2",