@configuratorware/configurator-frontendgui 1.34.2 → 1.35.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.
- package/App/Modules/Creator/Components/Option/index.js +42 -11
- package/App/Modules/Creator/Components/OptionsList/index.js +4 -1
- package/App/Modules/Creator/Components/ProductPart/index.js +19 -5
- package/App/Modules/Creator/Components/ProductPartsList/index.js +8 -4
- package/App/Modules/Creator/Containers/InvalidConfigurationNotice/index.js +6 -3
- package/App/Modules/Creator/Containers/OptionsList/index.js +5 -0
- package/App/Modules/Creator/Containers/ProductPartsList/index.js +8 -2
- package/App/Reducers/Configurator/Actions.js +80 -12
- package/App/Reducers/Configurator/Reducer.js +34 -1
- package/App/Services/ConfiguratorService.js +5 -0
- package/package.json +4 -4
- package/src/App/Modules/Creator/Components/Option/__snapshots__/index.test.js.snap +126 -67
- package/src/App/Modules/Creator/Components/Option/index.js +32 -3
- package/src/App/Modules/Creator/Components/Option/index.test.js +16 -0
- package/src/App/Modules/Creator/Components/OptionsList/index.js +3 -0
- package/src/App/Modules/Creator/Components/ProductPart/index.js +13 -5
- package/src/App/Modules/Creator/Components/ProductPartsList/index.js +4 -0
- package/src/App/Modules/Creator/Containers/InvalidConfigurationNotice/index.js +4 -1
- package/src/App/Modules/Creator/Containers/OptionsList/index.js +2 -0
- package/src/App/Modules/Creator/Containers/ProductPartsList/index.js +4 -1
- package/src/App/Reducers/Configurator/Actions.js +40 -0
- package/src/App/Reducers/Configurator/Reducer.js +31 -0
- package/src/App/Services/ConfiguratorService.js +4 -0
|
@@ -17,7 +17,11 @@ var _clsx = _interopRequireDefault(require("clsx"));
|
|
|
17
17
|
|
|
18
18
|
var _Grid = _interopRequireDefault(require("@material-ui/core/Grid/Grid"));
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _useMediaQuery = _interopRequireDefault(require("@material-ui/core/useMediaQuery"));
|
|
21
|
+
|
|
22
|
+
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
|
|
23
|
+
|
|
24
|
+
var _TextField = _interopRequireDefault(require("@material-ui/core/TextField"));
|
|
21
25
|
|
|
22
26
|
var _BlockRounded = _interopRequireDefault(require("@material-ui/icons/BlockRounded"));
|
|
23
27
|
|
|
@@ -184,7 +188,8 @@ var styles = function styles(theme) {
|
|
|
184
188
|
'& $text': {
|
|
185
189
|
width: textWidthWithAmount
|
|
186
190
|
}
|
|
187
|
-
}
|
|
191
|
+
},
|
|
192
|
+
optionTextInput: {}
|
|
188
193
|
};
|
|
189
194
|
};
|
|
190
195
|
|
|
@@ -197,6 +202,7 @@ var Option = function Option(_ref) {
|
|
|
197
202
|
onClick = props.onClick,
|
|
198
203
|
onSelect = props.onSelect,
|
|
199
204
|
onToggle = props.onToggle,
|
|
205
|
+
onInputTextChange = props.onInputTextChange,
|
|
200
206
|
option = props.option,
|
|
201
207
|
optionclassification = props.optionclassification,
|
|
202
208
|
selected = props.selected,
|
|
@@ -212,9 +218,16 @@ var Option = function Option(_ref) {
|
|
|
212
218
|
imageAvailable = _useState2[0],
|
|
213
219
|
setImageAvailable = _useState2[1];
|
|
214
220
|
|
|
221
|
+
var selectedoptions = optionclassification.selectedoptions;
|
|
222
|
+
|
|
223
|
+
var _useState3 = (0, _react.useState)((0, _lodash.get)((0, _lodash.find)(selectedoptions, ['identifier', option.identifier]), 'inputText', '')),
|
|
224
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
225
|
+
inputText = _useState4[0],
|
|
226
|
+
setInputText = _useState4[1];
|
|
227
|
+
|
|
215
228
|
var query = new URLSearchParams(location.search);
|
|
216
229
|
var hidePrices = query.has('_hide_prices') && query.get('_hide_prices') === '1';
|
|
217
|
-
var smallerScreen = (0,
|
|
230
|
+
var smallerScreen = (0, _useMediaQuery["default"])('(min-device-width : 300px) and (max-device-width : 340px)');
|
|
218
231
|
var thumbnail = (0, _lodash.get)(option, 'thumbnail', '');
|
|
219
232
|
var detailImage = (0, _lodash.get)(option, 'detailImage');
|
|
220
233
|
var optionIdentifier = (0, _lodash.get)(option, 'identifier', '');
|
|
@@ -222,6 +235,7 @@ var Option = function Option(_ref) {
|
|
|
222
235
|
var resultStatus = (0, _lodash.get)(option, 'check_results.status', true);
|
|
223
236
|
var optionIsMultiSelect = (0, _lodash.get)(option, 'is_multiselect', false);
|
|
224
237
|
var optionAmount = (0, _lodash.get)(option, 'amount', 0);
|
|
238
|
+
var hasTextinput = (0, _lodash.get)(option, 'hasTextinput', false);
|
|
225
239
|
|
|
226
240
|
var translations = _objectSpread(_objectSpread({}, (0, _i18n.t)('common')), (0, _i18n.t)('optionlistitem'));
|
|
227
241
|
|
|
@@ -265,7 +279,7 @@ var Option = function Option(_ref) {
|
|
|
265
279
|
event.preventDefault();
|
|
266
280
|
event.stopPropagation();
|
|
267
281
|
|
|
268
|
-
if (isEnabled()) {
|
|
282
|
+
if (isEnabled() && !(hasTextinput && selected)) {
|
|
269
283
|
onOptionSelected();
|
|
270
284
|
onClick();
|
|
271
285
|
}
|
|
@@ -343,7 +357,7 @@ var Option = function Option(_ref) {
|
|
|
343
357
|
var renderNotAvailableImage = function renderNotAvailableImage() {
|
|
344
358
|
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
345
359
|
className: 'imageNotAvailableElement'
|
|
346
|
-
}, /*#__PURE__*/_react["default"].createElement(
|
|
360
|
+
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
347
361
|
variant: 'caption'
|
|
348
362
|
}, translations.imageNotAvailable));
|
|
349
363
|
};
|
|
@@ -356,7 +370,7 @@ var Option = function Option(_ref) {
|
|
|
356
370
|
className: classes.iconWithText
|
|
357
371
|
}, /*#__PURE__*/_react["default"].createElement(_BlockRounded["default"], {
|
|
358
372
|
className: classes.materialIcon
|
|
359
|
-
}), ' ', /*#__PURE__*/_react["default"].createElement(
|
|
373
|
+
}), ' ', /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
360
374
|
variant: 'body2'
|
|
361
375
|
}, translations.notAvailable));
|
|
362
376
|
|
|
@@ -366,7 +380,7 @@ var Option = function Option(_ref) {
|
|
|
366
380
|
onClick: onLateDeliveryClicked
|
|
367
381
|
}, /*#__PURE__*/_react["default"].createElement(_RestoreRounded["default"], {
|
|
368
382
|
className: classes.materialIcon
|
|
369
|
-
}), ' ', /*#__PURE__*/_react["default"].createElement(
|
|
383
|
+
}), ' ', /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
370
384
|
variant: 'body2'
|
|
371
385
|
}, translations.lateDelivery)));
|
|
372
386
|
|
|
@@ -410,7 +424,7 @@ var Option = function Option(_ref) {
|
|
|
410
424
|
onClick: onDetailsClicked
|
|
411
425
|
}, /*#__PURE__*/_react["default"].createElement(_InfoRounded["default"], {
|
|
412
426
|
className: (0, _clsx["default"])(classes.materialIcon, (0, _customClassName["default"])('rule-info-icon-option'))
|
|
413
|
-
}), /*#__PURE__*/_react["default"].createElement(
|
|
427
|
+
}), /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
414
428
|
variant: 'body2',
|
|
415
429
|
className: classes.iconWithText
|
|
416
430
|
}, translations.details))), resultStatus !== true && /*#__PURE__*/_react["default"].createElement("div", null, /*#__PURE__*/_react["default"].createElement("a", {
|
|
@@ -418,7 +432,7 @@ var Option = function Option(_ref) {
|
|
|
418
432
|
onClick: onIncompatibilityClicked
|
|
419
433
|
}, /*#__PURE__*/_react["default"].createElement(_WarningRounded["default"], {
|
|
420
434
|
className: (0, _clsx["default"])(classes.materialIcon, (0, _customClassName["default"])('rule-alert-icon-option'))
|
|
421
|
-
}), /*#__PURE__*/_react["default"].createElement(
|
|
435
|
+
}), /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
422
436
|
variant: 'body2'
|
|
423
437
|
}, translations.incompatibility))), renderStockStatus(), renderOptionGroup());
|
|
424
438
|
};
|
|
@@ -427,13 +441,13 @@ var Option = function Option(_ref) {
|
|
|
427
441
|
return /*#__PURE__*/_react["default"].createElement(_Grid["default"], {
|
|
428
442
|
item: true,
|
|
429
443
|
xs: 12
|
|
430
|
-
}, /*#__PURE__*/_react["default"].createElement(
|
|
444
|
+
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
431
445
|
component: 'div',
|
|
432
446
|
className: classes.optionList,
|
|
433
447
|
variant: 'body2'
|
|
434
448
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
435
449
|
className: classes.title
|
|
436
|
-
}, option.title), !hidePrices && /*#__PURE__*/_react["default"].createElement("div", {
|
|
450
|
+
}, option.title), hasTextinput && renderTextInput(), !hidePrices && /*#__PURE__*/_react["default"].createElement("div", {
|
|
437
451
|
className: classes.price
|
|
438
452
|
}, option.priceFormatted), smallerScreen && renderControls('horizontal'), option["abstract"] && /*#__PURE__*/_react["default"].createElement(_Markdown["default"], {
|
|
439
453
|
className: classes.description
|
|
@@ -453,6 +467,21 @@ var Option = function Option(_ref) {
|
|
|
453
467
|
}
|
|
454
468
|
};
|
|
455
469
|
|
|
470
|
+
var handleTextInputChange = function handleTextInputChange(event) {
|
|
471
|
+
setInputText(event.target.value);
|
|
472
|
+
onInputTextChange(option.identifier, event.target.value);
|
|
473
|
+
};
|
|
474
|
+
|
|
475
|
+
var renderTextInput = function renderTextInput() {
|
|
476
|
+
return /*#__PURE__*/_react["default"].createElement(_TextField["default"], {
|
|
477
|
+
className: classes.optionTextInput,
|
|
478
|
+
label: '',
|
|
479
|
+
value: inputText,
|
|
480
|
+
onChange: handleTextInputChange,
|
|
481
|
+
disabled: !selected
|
|
482
|
+
});
|
|
483
|
+
};
|
|
484
|
+
|
|
456
485
|
var getRootClassName = function getRootClassName() {
|
|
457
486
|
return (0, _clsx["default"])(classes.root, selected && 'selected', (0, _customClassName["default"])('option'));
|
|
458
487
|
};
|
|
@@ -511,6 +540,7 @@ Option.defaultProps = {
|
|
|
511
540
|
onClick: function onClick() {},
|
|
512
541
|
onSelect: function onSelect() {},
|
|
513
542
|
onToggle: function onToggle() {},
|
|
543
|
+
onInputTextChange: function onInputTextChange() {},
|
|
514
544
|
optionclassification: {},
|
|
515
545
|
option: {},
|
|
516
546
|
selected: false,
|
|
@@ -525,6 +555,7 @@ Option.propTypes = {
|
|
|
525
555
|
onClick: _propTypes["default"].func,
|
|
526
556
|
onSelect: _propTypes["default"].func,
|
|
527
557
|
onToggle: _propTypes["default"].func,
|
|
558
|
+
onInputTextChange: _propTypes["default"].func,
|
|
528
559
|
option: _propTypes["default"].object,
|
|
529
560
|
optionclassification: _propTypes["default"].object,
|
|
530
561
|
selected: _propTypes["default"].bool,
|
|
@@ -94,7 +94,8 @@ var OptionsList = function OptionsList(_ref2) {
|
|
|
94
94
|
viewStockInformation = props.viewStockInformation,
|
|
95
95
|
LoadingComponent = props.LoadingComponent,
|
|
96
96
|
OptionComponent = props.OptionComponent,
|
|
97
|
-
isAdminMode = props.isAdminMode
|
|
97
|
+
isAdminMode = props.isAdminMode,
|
|
98
|
+
setOptionInputText = props.setOptionInputText;
|
|
98
99
|
var classes = useStyles();
|
|
99
100
|
|
|
100
101
|
var createOptions = function createOptions() {
|
|
@@ -143,6 +144,7 @@ var OptionsList = function OptionsList(_ref2) {
|
|
|
143
144
|
viewDetails: viewDetails,
|
|
144
145
|
viewStockInformation: viewStockInformation,
|
|
145
146
|
onClick: onOptionClicked,
|
|
147
|
+
onInputTextChange: setOptionInputText,
|
|
146
148
|
onToggle: onToggle,
|
|
147
149
|
isAdminMode: isAdminMode
|
|
148
150
|
});
|
|
@@ -205,6 +207,7 @@ OptionsList.propTypes = {
|
|
|
205
207
|
onClose: _propTypes["default"].func,
|
|
206
208
|
onSelect: _propTypes["default"].func,
|
|
207
209
|
onToggle: _propTypes["default"].func,
|
|
210
|
+
setOptionInputText: _propTypes["default"].func,
|
|
208
211
|
options: _propTypes["default"].array,
|
|
209
212
|
optionclassification: _propTypes["default"].object,
|
|
210
213
|
show: _propTypes["default"].bool,
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
|
4
|
+
|
|
3
5
|
Object.defineProperty(exports, "__esModule", {
|
|
4
6
|
value: true
|
|
5
7
|
});
|
|
6
8
|
exports["default"] = exports.StyledProductPart = void 0;
|
|
7
9
|
|
|
8
|
-
var _react =
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
11
|
|
|
10
12
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
13
|
|
|
@@ -25,6 +27,10 @@ var _styles = require("@material-ui/core/styles");
|
|
|
25
27
|
|
|
26
28
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
27
29
|
|
|
30
|
+
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); }
|
|
31
|
+
|
|
32
|
+
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; }
|
|
33
|
+
|
|
28
34
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
29
35
|
|
|
30
36
|
var ProductPart = function ProductPart(_ref) {
|
|
@@ -35,9 +41,16 @@ var ProductPart = function ProductPart(_ref) {
|
|
|
35
41
|
verticalMode = _ref.verticalMode,
|
|
36
42
|
setAnchorRef = _ref.setAnchorRef,
|
|
37
43
|
classes = _ref.classes,
|
|
38
|
-
optionListVisible = _ref.optionListVisible
|
|
39
|
-
|
|
44
|
+
optionListVisible = _ref.optionListVisible,
|
|
45
|
+
onCloseSelected = _ref.onCloseSelected;
|
|
46
|
+
var selected = (0, _get["default"])(selectedOption, 'identifier', null) === (0, _get["default"])(optionclassification, 'identifier', '');
|
|
47
|
+
var selectedAndVisible = optionListVisible && selected;
|
|
40
48
|
var direction = verticalMode ? 'vertical' : 'horizontal';
|
|
49
|
+
(0, _react.useEffect)(function () {
|
|
50
|
+
if (!optionListVisible && selected) {
|
|
51
|
+
onCloseSelected(optionclassification);
|
|
52
|
+
}
|
|
53
|
+
}, [optionListVisible]);
|
|
41
54
|
|
|
42
55
|
var displayImage = function displayImage() {
|
|
43
56
|
var imageUrl = displaySwitchedOptions && selectedOption ? (0, _getImageUrl["default"])(selectedOption.thumbnail) : (0, _getImageUrl["default"])(optionclassification.thumbnail);
|
|
@@ -66,7 +79,7 @@ var ProductPart = function ProductPart(_ref) {
|
|
|
66
79
|
className: (0, _clsx["default"])(classes.root, direction, (0, _customClassName["default"])('component')),
|
|
67
80
|
ref: setAnchorRef
|
|
68
81
|
}, /*#__PURE__*/_react["default"].createElement("div", {
|
|
69
|
-
className: "".concat(classes.marker, " ").concat(direction, " ").concat(
|
|
82
|
+
className: "".concat(classes.marker, " ").concat(direction, " ").concat(selectedAndVisible ? 'selected' : '')
|
|
70
83
|
}), /*#__PURE__*/_react["default"].createElement("div", {
|
|
71
84
|
className: "".concat(classes.content, " ").concat(direction),
|
|
72
85
|
onClick: onClick
|
|
@@ -91,7 +104,8 @@ ProductPart.propTypes = {
|
|
|
91
104
|
verticalMode: _propTypes["default"].bool,
|
|
92
105
|
setAnchorRef: _propTypes["default"].func,
|
|
93
106
|
classes: _propTypes["default"].object,
|
|
94
|
-
optionListVisible: _propTypes["default"].bool
|
|
107
|
+
optionListVisible: _propTypes["default"].bool,
|
|
108
|
+
onCloseSelected: _propTypes["default"].func
|
|
95
109
|
};
|
|
96
110
|
var StyledProductPart = (0, _styles.withStyles)(function (theme) {
|
|
97
111
|
var _root, _selected;
|
|
@@ -90,7 +90,8 @@ var ProductPartsList = function ProductPartsList(_ref) {
|
|
|
90
90
|
ProductPartComponent = _ref.ProductPartComponent,
|
|
91
91
|
CallToActionComponent = _ref.CallToActionComponent,
|
|
92
92
|
width = _ref.width,
|
|
93
|
-
optionListVisible = _ref.optionListVisible
|
|
93
|
+
optionListVisible = _ref.optionListVisible,
|
|
94
|
+
onCloseSelectedPart = _ref.onCloseSelectedPart;
|
|
94
95
|
var classes = useStyles();
|
|
95
96
|
|
|
96
97
|
var _useState = (0, _react.useState)(null),
|
|
@@ -113,7 +114,8 @@ var ProductPartsList = function ProductPartsList(_ref) {
|
|
|
113
114
|
optionclassification: option,
|
|
114
115
|
selectedOption: selectedoptionclassification,
|
|
115
116
|
verticalMode: vertical,
|
|
116
|
-
optionListVisible: optionListVisible
|
|
117
|
+
optionListVisible: optionListVisible,
|
|
118
|
+
onCloseSelected: onCloseSelectedPart
|
|
117
119
|
}, refProps));
|
|
118
120
|
})), showStartHere && width !== 'xs' && /*#__PURE__*/_react["default"].createElement(CallToActionComponent, {
|
|
119
121
|
offsetDirection: vertical ? 'right' : 'top',
|
|
@@ -131,7 +133,8 @@ ProductPartsList.defaultProps = {
|
|
|
131
133
|
selectedoptionclassification: {},
|
|
132
134
|
showStartHere: false,
|
|
133
135
|
vertical: true,
|
|
134
|
-
ProductPartComponent: _ProductPart["default"]
|
|
136
|
+
ProductPartComponent: _ProductPart["default"],
|
|
137
|
+
onCloseSelectedPart: function onCloseSelectedPart() {}
|
|
135
138
|
};
|
|
136
139
|
ProductPartsList.propTypes = {
|
|
137
140
|
onSelect: _propTypes["default"].func,
|
|
@@ -143,7 +146,8 @@ ProductPartsList.propTypes = {
|
|
|
143
146
|
ProductPartComponent: _propTypes["default"].elementType,
|
|
144
147
|
CallToActionComponent: _propTypes["default"].elementType,
|
|
145
148
|
width: _propTypes["default"].string,
|
|
146
|
-
optionListVisible: _propTypes["default"].bool
|
|
149
|
+
optionListVisible: _propTypes["default"].bool,
|
|
150
|
+
onCloseSelectedPart: _propTypes["default"].func
|
|
147
151
|
};
|
|
148
152
|
|
|
149
153
|
var _default = (0, _core.withWidth)({
|
|
@@ -46,16 +46,19 @@ var getValidationErrors = function getValidationErrors(configuratorState) {
|
|
|
46
46
|
return (0, _cached.getCached)('getValidationErrors', validation, optionclassifications && optionclassifications.length).use(function () {
|
|
47
47
|
var errors = validation.validationErrors || validation.errors || {};
|
|
48
48
|
return !optionclassifications ? [] : Object.entries(errors).map(function (_ref) {
|
|
49
|
+
var _optionclassification;
|
|
50
|
+
|
|
49
51
|
var _ref2 = _slicedToArray(_ref, 2),
|
|
50
52
|
key = _ref2[0],
|
|
51
53
|
error = _ref2[1];
|
|
52
54
|
|
|
53
55
|
return {
|
|
54
|
-
title: optionclassifications.find(function (_ref3) {
|
|
56
|
+
title: ((_optionclassification = optionclassifications.find(function (_ref3) {
|
|
55
57
|
var identifier = _ref3.identifier;
|
|
56
58
|
return identifier === key;
|
|
57
|
-
}).title,
|
|
58
|
-
errors: error.errors
|
|
59
|
+
})) === null || _optionclassification === void 0 ? void 0 : _optionclassification.title) || error.componentTitle,
|
|
60
|
+
errors: error.errors,
|
|
61
|
+
key: key
|
|
59
62
|
};
|
|
60
63
|
});
|
|
61
64
|
});
|
|
@@ -15,6 +15,8 @@ var _OptionsList = _interopRequireDefault(require("../../Components/OptionsList"
|
|
|
15
15
|
|
|
16
16
|
var _configuration = require("../../../../configuration");
|
|
17
17
|
|
|
18
|
+
var _ServiceLocator = require("../../../../ServiceLocator");
|
|
19
|
+
|
|
18
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
19
21
|
|
|
20
22
|
var mapStateToProps = function mapStateToProps(_ref) {
|
|
@@ -40,6 +42,9 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|
|
40
42
|
},
|
|
41
43
|
onClose: function onClose() {
|
|
42
44
|
return dispatch((0, _Actions2.setVisible)('optionlist', false));
|
|
45
|
+
},
|
|
46
|
+
setOptionInputText: function setOptionInputText(identifier, value) {
|
|
47
|
+
return _ServiceLocator.Services.configurator.setOptionInputText(identifier, value);
|
|
43
48
|
}
|
|
44
49
|
};
|
|
45
50
|
};
|
|
@@ -15,6 +15,8 @@ var _CallToAction = _interopRequireDefault(require("../../../../Shared/Component
|
|
|
15
15
|
|
|
16
16
|
var _memoize = _interopRequireDefault(require("../../../../../Utils/Function/memoize"));
|
|
17
17
|
|
|
18
|
+
var _Actions = require("../../../../Reducers/Configurator/Actions");
|
|
19
|
+
|
|
18
20
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
19
21
|
|
|
20
22
|
var removeHiddenComponents = (0, _memoize["default"])(function (components) {
|
|
@@ -41,8 +43,12 @@ var mapStateToProps = function mapStateToProps(_ref2) {
|
|
|
41
43
|
};
|
|
42
44
|
};
|
|
43
45
|
|
|
44
|
-
var mapDispatchToProps = function mapDispatchToProps() {
|
|
45
|
-
return {
|
|
46
|
+
var mapDispatchToProps = function mapDispatchToProps(dispatch) {
|
|
47
|
+
return {
|
|
48
|
+
onCloseSelectedPart: function onCloseSelectedPart(optionClassification) {
|
|
49
|
+
return dispatch((0, _Actions.applyOptionInputText)(optionClassification));
|
|
50
|
+
}
|
|
51
|
+
};
|
|
46
52
|
};
|
|
47
53
|
|
|
48
54
|
var _default = (0, _ComponentContainer.containerConnect)(mapStateToProps, mapDispatchToProps);
|
|
@@ -3,12 +3,15 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.setSelectedCalculation = exports.switchSelectedAmount = exports.setComment = exports.deleteSelectedAmounts = exports.setSelectedAmounts = exports.deleteSelectedAmount = exports.clearBulkNames = exports.saveBulkNames = exports.setSelectedAmount = exports.loadDesignerData = exports.receiveDesignerData = exports.loadConfiguration = exports.viewOptionDetails = exports.selectMultipleOptions = exports.selectOption = exports.resolveConflicts = exports.loadInitialOptionclassification = exports.fetchInitialConfiguration = exports.setConflictingSwitchoptionData = exports.setOptionclassificationChecked = exports.setCalculationEnabled = exports.setSelectedVariantIdentifier = exports.setStockInformationOption = exports.setLoadIdentifier = exports.setLoadCode = exports.fetchInspirations = exports.fetchClientData = exports.fetchCodesnippets = exports.fetchConfigurationVariants = exports.validateConfiguration = exports.saveConfiguration = exports.fetchOptionDetails = exports.doCalculation = exports.switchOptions = exports.switchOptionsBasic = exports.fetchOptions = exports.fetchConfigurationByCodeAsync = exports.fetchConfigurationByCode = exports.fetchConfiguration = exports.inspectValidationResults = exports.inspectCheckResults = exports.setCustomTitle = exports.receiveInspirations = exports.receiveClientData = exports.fetchConfigurationForDesignerProductPreview = exports.receiveCodesnippets = exports.receiveConfigurationVariants = exports.receiveValidation = exports.receiveSavedConfiguration = exports.clearOptionDetails = exports.receiveOptionDetails = exports.skipNextAutoResolve = exports.setCalculationAutoResolveEnabled = exports.setCalculationErrorsResolved = exports.invalidateCalculation = exports.receiveCalculation = exports.receiveSwitchoptionsresult = exports.receiveOptions = exports.selectOptionclassification = exports.applyVariantAmountPreSelection = exports.setDefaultSelectedVariantIdentifier = exports.deleteMissingVariants = exports.receiveConfiguration = exports.DELETE_SELECTED_AMOUNTS = exports.SET_SELECTED_AMOUNTS = exports.SET_COMMENT = exports.SET_SELECTED_CALCULATION = exports.DELETE_SELECTED_AMOUNT = exports.CLEAR_BULKNAMES = exports.SAVE_BULKNAMES = exports.SWITCH_SELECTED_AMOUNT = exports.SET_SELECTED_AMOUNT = exports.SET_CONFLICTING_SWITCHOPTION_DATA = exports.SET_OPTIONCLASSIFICATION_CHECKED = exports.SET_CALCULATION_AUTO_RESOLVE_ENABLED = exports.SET_CALCULATION_ERRORS_RESOLVED = exports.SET_CALCULATION_ENABLED = exports.SET_SELECTED_VARIANT_IDENTIFIER = exports.SET_STOCK_INFORMATION_OPTION = exports.SET_LOAD_IDENTIFIER = exports.SET_LOAD_CODE = exports.SET_CUSTOM_TITLE = exports.RECEIVE_INSPIRATIONS = exports.RECEIVE_CLIENT_DATA = exports.RECEIVE_CODESNIPPETS = exports.RECEIVE_CONFIGURATIONVARIANTS = exports.RECEIVE_VALIDATION = exports.RECEIVE_SAVEDCONFIGURATION = exports.RECEIVE_OPTIONDETAILS = exports.INVALIDATE_CALCULATION = exports.RECEIVE_CALCULATION = exports.RECEIVE_SWITCHOPTIONSRESULT = exports.RECEIVE_OPTIONS = exports.SELECT_OPTIONCLASSIFICATION = exports.RECEIVE_DESIGNER_DATA = exports.RECEIVE_CONFIGURATION = void 0;
|
|
6
|
+
exports.setOptionInputText = exports.setSelectedCalculation = exports.switchSelectedAmount = exports.setComment = exports.deleteSelectedAmounts = exports.setSelectedAmounts = exports.deleteSelectedAmount = exports.clearBulkNames = exports.saveBulkNames = exports.setSelectedAmount = exports.loadDesignerData = exports.receiveDesignerData = exports.loadConfiguration = exports.viewOptionDetails = exports.selectMultipleOptions = exports.applyOptionInputText = exports.selectOption = exports.resolveConflicts = exports.loadInitialOptionclassification = exports.fetchInitialConfiguration = exports.setConflictingSwitchoptionData = exports.setOptionclassificationChecked = exports.setCalculationEnabled = exports.setSelectedVariantIdentifier = exports.setStockInformationOption = exports.setLoadIdentifier = exports.setLoadCode = exports.fetchInspirations = exports.fetchClientData = exports.fetchCodesnippets = exports.fetchConfigurationVariants = exports.validateConfiguration = exports.saveConfiguration = exports.fetchOptionDetails = exports.doCalculation = exports.switchOptions = exports.switchOptionsBasic = exports.fetchOptions = exports.fetchConfigurationByCodeAsync = exports.fetchConfigurationByCode = exports.fetchConfiguration = exports.inspectValidationResults = exports.inspectCheckResults = exports.setCustomTitle = exports.receiveInspirations = exports.receiveClientData = exports.fetchConfigurationForDesignerProductPreview = exports.receiveCodesnippets = exports.receiveConfigurationVariants = exports.receiveValidation = exports.receiveSavedConfiguration = exports.clearOptionDetails = exports.receiveOptionDetails = exports.skipNextAutoResolve = exports.setCalculationAutoResolveEnabled = exports.setCalculationErrorsResolved = exports.invalidateCalculation = exports.receiveCalculation = exports.receiveSwitchoptionsresult = exports.receiveOptions = exports.selectOptionclassification = exports.applyVariantAmountPreSelection = exports.setDefaultSelectedVariantIdentifier = exports.deleteMissingVariants = exports.receiveConfiguration = exports.DELETE_SELECTED_AMOUNTS = exports.SET_SELECTED_AMOUNTS = exports.SET_COMMENT = exports.SET_SELECTED_CALCULATION = exports.DELETE_SELECTED_AMOUNT = exports.CLEAR_BULKNAMES = exports.SAVE_BULKNAMES = exports.SWITCH_SELECTED_AMOUNT = exports.RESET_OPTION_INPUT_TEXTS = exports.SET_OPTION_INPUT_TEXT = exports.SET_SELECTED_AMOUNT = exports.SET_CONFLICTING_SWITCHOPTION_DATA = exports.SET_OPTIONCLASSIFICATION_CHECKED = exports.SET_CALCULATION_AUTO_RESOLVE_ENABLED = exports.SET_CALCULATION_ERRORS_RESOLVED = exports.SET_CALCULATION_ENABLED = exports.SET_SELECTED_VARIANT_IDENTIFIER = exports.SET_STOCK_INFORMATION_OPTION = exports.SET_LOAD_IDENTIFIER = exports.SET_LOAD_CODE = exports.SET_CUSTOM_TITLE = exports.RECEIVE_INSPIRATIONS = exports.RECEIVE_CLIENT_DATA = exports.RECEIVE_CODESNIPPETS = exports.RECEIVE_CONFIGURATIONVARIANTS = exports.RECEIVE_VALIDATION = exports.RECEIVE_SAVEDCONFIGURATION = exports.RECEIVE_OPTIONDETAILS = exports.INVALIDATE_CALCULATION = exports.RECEIVE_CALCULATION = exports.RECEIVE_SWITCHOPTIONSRESULT = exports.RECEIVE_OPTIONS = exports.SELECT_OPTIONCLASSIFICATION = exports.RECEIVE_DESIGNER_DATA = exports.RECEIVE_CONFIGURATION = void 0;
|
|
7
|
+
exports.resetOptionInputTexts = void 0;
|
|
7
8
|
|
|
8
9
|
var apiActions = _interopRequireWildcard(require("../Actions"));
|
|
9
10
|
|
|
10
11
|
var _lodash = require("lodash");
|
|
11
12
|
|
|
13
|
+
var _find = _interopRequireDefault(require("lodash/find"));
|
|
14
|
+
|
|
12
15
|
var _uniq = _interopRequireDefault(require("lodash/uniq"));
|
|
13
16
|
|
|
14
17
|
var _i18n = require("../../../Framework/i18n");
|
|
@@ -121,6 +124,10 @@ var SET_CONFLICTING_SWITCHOPTION_DATA = 'SET_CONFLICTING_SWITCHOPTION_DATA';
|
|
|
121
124
|
exports.SET_CONFLICTING_SWITCHOPTION_DATA = SET_CONFLICTING_SWITCHOPTION_DATA;
|
|
122
125
|
var SET_SELECTED_AMOUNT = 'SET_SELECTED_AMOUNT';
|
|
123
126
|
exports.SET_SELECTED_AMOUNT = SET_SELECTED_AMOUNT;
|
|
127
|
+
var SET_OPTION_INPUT_TEXT = 'SET_OPTION_INPUT_TEXT';
|
|
128
|
+
exports.SET_OPTION_INPUT_TEXT = SET_OPTION_INPUT_TEXT;
|
|
129
|
+
var RESET_OPTION_INPUT_TEXTS = 'RESET_OPTION_INPUT_TEXTS';
|
|
130
|
+
exports.RESET_OPTION_INPUT_TEXTS = RESET_OPTION_INPUT_TEXTS;
|
|
124
131
|
var SWITCH_SELECTED_AMOUNT = 'SWITCH_SELECTED_AMOUNT';
|
|
125
132
|
exports.SWITCH_SELECTED_AMOUNT = SWITCH_SELECTED_AMOUNT;
|
|
126
133
|
var SAVE_BULKNAMES = 'SAVE_BULKNAMES';
|
|
@@ -895,7 +902,7 @@ exports.setCalculationEnabled = setCalculationEnabled;
|
|
|
895
902
|
var setOptionclassificationChecked = function setOptionclassificationChecked(optionclassification) {
|
|
896
903
|
return function (dispatch, getState) {
|
|
897
904
|
if (_typeof(optionclassification) !== 'object') {
|
|
898
|
-
optionclassification =
|
|
905
|
+
optionclassification = (0, _find["default"])(getState().configurator.configuration.optionclassifications, {
|
|
899
906
|
identifier: optionclassification
|
|
900
907
|
});
|
|
901
908
|
}
|
|
@@ -1094,17 +1101,60 @@ var selectOption = function selectOption(option) {
|
|
|
1094
1101
|
|
|
1095
1102
|
exports.selectOption = selectOption;
|
|
1096
1103
|
|
|
1104
|
+
var applyOptionInputText = function applyOptionInputText(optionClassification) {
|
|
1105
|
+
return function (dispatch, getState) {
|
|
1106
|
+
var switchOptionData = _defineProperty({}, optionClassification.identifier, []);
|
|
1107
|
+
|
|
1108
|
+
var _getState$configurato4 = getState().configurator,
|
|
1109
|
+
configuration = _getState$configurato4.configuration,
|
|
1110
|
+
optionInputTexts = _getState$configurato4.optionInputTexts;
|
|
1111
|
+
|
|
1112
|
+
if (!optionClassification.selectedoptions) {
|
|
1113
|
+
return;
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
var _iterator3 = _createForOfIteratorHelper(optionClassification.selectedoptions),
|
|
1117
|
+
_step3;
|
|
1118
|
+
|
|
1119
|
+
try {
|
|
1120
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
1121
|
+
var selectedOption = _step3.value;
|
|
1122
|
+
var inputText = (0, _lodash.get)((0, _find["default"])(optionInputTexts, ['optionIdentifier', selectedOption.identifier]), 'inputText', null);
|
|
1123
|
+
|
|
1124
|
+
if (inputText && inputText !== selectedOption.inputText) {
|
|
1125
|
+
switchOptionData[optionClassification.identifier].push(_objectSpread(_objectSpread({}, selectedOption), {}, {
|
|
1126
|
+
inputText: inputText,
|
|
1127
|
+
check_results: null
|
|
1128
|
+
}));
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
} catch (err) {
|
|
1132
|
+
_iterator3.e(err);
|
|
1133
|
+
} finally {
|
|
1134
|
+
_iterator3.f();
|
|
1135
|
+
}
|
|
1136
|
+
|
|
1137
|
+
dispatch(resetOptionInputTexts());
|
|
1138
|
+
|
|
1139
|
+
if (switchOptionData[optionClassification.identifier].length > 0) {
|
|
1140
|
+
return dispatch(switchOptions(configuration, switchOptionData, false, true, true));
|
|
1141
|
+
}
|
|
1142
|
+
};
|
|
1143
|
+
};
|
|
1144
|
+
|
|
1145
|
+
exports.applyOptionInputText = applyOptionInputText;
|
|
1146
|
+
|
|
1097
1147
|
var selectMultipleOptions = function selectMultipleOptions(optionsList) {
|
|
1098
1148
|
return function (dispatch, getState) {
|
|
1099
1149
|
var configuration = (0, _Selectors.getConfiguration)((0, _Selectors.getConfigurator)(getState()));
|
|
1100
1150
|
var switchOptionData = {};
|
|
1101
1151
|
|
|
1102
|
-
var
|
|
1103
|
-
|
|
1152
|
+
var _iterator4 = _createForOfIteratorHelper(optionsList),
|
|
1153
|
+
_step4;
|
|
1104
1154
|
|
|
1105
1155
|
try {
|
|
1106
|
-
for (
|
|
1107
|
-
var component =
|
|
1156
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
1157
|
+
var component = _step4.value;
|
|
1108
1158
|
switchOptionData[component.identifier] = component.selectedoptions.map(function (_ref5) {
|
|
1109
1159
|
var identifier = _ref5.identifier,
|
|
1110
1160
|
amount = _ref5.amount;
|
|
@@ -1116,9 +1166,9 @@ var selectMultipleOptions = function selectMultipleOptions(optionsList) {
|
|
|
1116
1166
|
});
|
|
1117
1167
|
}
|
|
1118
1168
|
} catch (err) {
|
|
1119
|
-
|
|
1169
|
+
_iterator4.e(err);
|
|
1120
1170
|
} finally {
|
|
1121
|
-
|
|
1171
|
+
_iterator4.f();
|
|
1122
1172
|
}
|
|
1123
1173
|
|
|
1124
1174
|
return dispatch(switchOptions(configuration, switchOptionData, false, false, true));
|
|
@@ -1133,9 +1183,9 @@ var viewOptionDetails = function viewOptionDetails(option) {
|
|
|
1133
1183
|
return;
|
|
1134
1184
|
}
|
|
1135
1185
|
|
|
1136
|
-
var _getState$
|
|
1137
|
-
configuration = _getState$
|
|
1138
|
-
optiondetails = _getState$
|
|
1186
|
+
var _getState$configurato5 = getState().configurator,
|
|
1187
|
+
configuration = _getState$configurato5.configuration,
|
|
1188
|
+
optiondetails = _getState$configurato5.optiondetails;
|
|
1139
1189
|
|
|
1140
1190
|
if (optiondetails.identifier !== option.identifier) {
|
|
1141
1191
|
dispatch(fetchOptionDetails(option.identifier, configuration));
|
|
@@ -1353,4 +1403,22 @@ var setSelectedCalculation = function setSelectedCalculation(identifier, value)
|
|
|
1353
1403
|
};
|
|
1354
1404
|
};
|
|
1355
1405
|
|
|
1356
|
-
exports.setSelectedCalculation = setSelectedCalculation;
|
|
1406
|
+
exports.setSelectedCalculation = setSelectedCalculation;
|
|
1407
|
+
|
|
1408
|
+
var setOptionInputText = function setOptionInputText(identifier, value) {
|
|
1409
|
+
return {
|
|
1410
|
+
type: SET_OPTION_INPUT_TEXT,
|
|
1411
|
+
identifier: identifier,
|
|
1412
|
+
value: value
|
|
1413
|
+
};
|
|
1414
|
+
};
|
|
1415
|
+
|
|
1416
|
+
exports.setOptionInputText = setOptionInputText;
|
|
1417
|
+
|
|
1418
|
+
var resetOptionInputTexts = function resetOptionInputTexts() {
|
|
1419
|
+
return {
|
|
1420
|
+
type: RESET_OPTION_INPUT_TEXTS
|
|
1421
|
+
};
|
|
1422
|
+
};
|
|
1423
|
+
|
|
1424
|
+
exports.resetOptionInputTexts = resetOptionInputTexts;
|
|
@@ -20,6 +20,8 @@ var _lodash = _interopRequireDefault(require("lodash"));
|
|
|
20
20
|
|
|
21
21
|
var _get = _interopRequireDefault(require("lodash/get"));
|
|
22
22
|
|
|
23
|
+
var _findIndex = _interopRequireDefault(require("lodash/findIndex"));
|
|
24
|
+
|
|
23
25
|
var _omit = _interopRequireDefault(require("lodash/omit"));
|
|
24
26
|
|
|
25
27
|
var _forEach = _interopRequireDefault(require("lodash/forEach"));
|
|
@@ -71,7 +73,8 @@ var initialState = {
|
|
|
71
73
|
checkedOptionclassifications: {},
|
|
72
74
|
filteredOptionclassifications: [],
|
|
73
75
|
selectedVariantIdentifier: null,
|
|
74
|
-
selectedAmountsUpdated: false
|
|
76
|
+
selectedAmountsUpdated: false,
|
|
77
|
+
optionInputTexts: []
|
|
75
78
|
};
|
|
76
79
|
|
|
77
80
|
function configurationHandler(state, action) {
|
|
@@ -571,6 +574,36 @@ function configurationModifierHandler(state, action) {
|
|
|
571
574
|
return (0, _set["default"])(state, "configuration.customdata.userSelectedCalculation.".concat(action.identifier), action.value);
|
|
572
575
|
}
|
|
573
576
|
|
|
577
|
+
case actionTypes.SET_OPTION_INPUT_TEXT:
|
|
578
|
+
{
|
|
579
|
+
var optionInputTexts = state.optionInputTexts;
|
|
580
|
+
var optionInputTextIndex = (0, _findIndex["default"])(optionInputTexts, ['optionIdentifier', action.identifier]);
|
|
581
|
+
|
|
582
|
+
if (optionInputTextIndex !== -1) {
|
|
583
|
+
optionInputTexts[optionInputTextIndex] = {
|
|
584
|
+
optionIdentifier: action.identifier,
|
|
585
|
+
inputText: action.value
|
|
586
|
+
};
|
|
587
|
+
} else if (optionInputTextIndex === -1 && action.value) {
|
|
588
|
+
optionInputTexts.push({
|
|
589
|
+
optionIdentifier: action.identifier,
|
|
590
|
+
inputText: action.value
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
595
|
+
optionInputTexts: optionInputTexts
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
case actionTypes.RESET_OPTION_INPUT_TEXTS:
|
|
600
|
+
{
|
|
601
|
+
var _optionInputTexts = [];
|
|
602
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
603
|
+
optionInputTexts: _optionInputTexts
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
|
|
574
607
|
default:
|
|
575
608
|
return state;
|
|
576
609
|
}
|
|
@@ -1127,6 +1127,11 @@ var ConfiguratorService = /*#__PURE__*/function (_AbstractConfigurator) {
|
|
|
1127
1127
|
value: function setSelectedVariantIdentifier(identifier) {
|
|
1128
1128
|
return _ServiceLocator.Services.store.dispatch(configuratorActions.setSelectedVariantIdentifier(identifier));
|
|
1129
1129
|
}
|
|
1130
|
+
}, {
|
|
1131
|
+
key: "setOptionInputText",
|
|
1132
|
+
value: function setOptionInputText(identifier, value) {
|
|
1133
|
+
return _ServiceLocator.Services.store.dispatch(configuratorActions.setOptionInputText(identifier, value));
|
|
1134
|
+
}
|
|
1130
1135
|
/**
|
|
1131
1136
|
* A simple method for saving the configuration without any additional design data or screenshot
|
|
1132
1137
|
* @param {string} saveType
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@configuratorware/configurator-frontendgui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.1",
|
|
4
4
|
"license": "UNLICENSED",
|
|
5
5
|
"private": false,
|
|
6
6
|
"main": "./index.js",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"@babel/polyfill": "^7.12.1",
|
|
9
|
-
"@configuratorware/scripts": "1.
|
|
9
|
+
"@configuratorware/scripts": "1.35.1",
|
|
10
10
|
"@hot-loader/react-dom": "^17.0.1",
|
|
11
11
|
"@material-ui/core": "^4.12.2",
|
|
12
12
|
"@material-ui/icons": "^4.11.2",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"react-router-dom": "^5.2.0",
|
|
40
40
|
"react-swipeable": "^5.5.1",
|
|
41
41
|
"react-zoom-pan-pinch": "^2.1.3",
|
|
42
|
-
"redhotmagma-graphics-editor": "1.
|
|
43
|
-
"redhotmagma-visualization": "1.
|
|
42
|
+
"redhotmagma-graphics-editor": "1.35.1",
|
|
43
|
+
"redhotmagma-visualization": "1.35.1",
|
|
44
44
|
"redux": "^4.1.0",
|
|
45
45
|
"redux-logger": "^3.0.6",
|
|
46
46
|
"redux-persist": "^5.10.0",
|