@configuratorware/configurator-frontendgui 1.39.2 → 1.40.0
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/Routing.js +5 -1
- package/App/Screens/Configurator/Components/ItemTile/ItemTile.js +88 -0
- package/App/Screens/ItemOverview.js +340 -0
- package/App/Screens.js +6 -0
- package/App/Utils/Request/lazyFetch.js +60 -0
- package/App/Utils/Request/pathParams.js +21 -0
- package/package.json +4 -4
- package/public/translations/de_DE.json +31 -1
- package/public/translations/en_GB.json +31 -1
- package/src/App/Routing.js +3 -1
- package/src/App/Screens/Configurator/Components/ItemTile/ItemTile.js +69 -0
- package/src/App/Screens/ItemOverview.js +214 -0
- package/src/App/Screens.js +4 -0
- package/src/App/Utils/Request/lazyFetch.js +15 -0
- package/src/App/Utils/Request/pathParams.js +8 -0
package/App/Routing.js
CHANGED
|
@@ -137,7 +137,11 @@ var Routing = /*#__PURE__*/function (_Component2) {
|
|
|
137
137
|
}, /*#__PURE__*/_react["default"].createElement(_ErrorBoundary["default"], null, /*#__PURE__*/_react["default"].createElement(_Frame["default"], null, /*#__PURE__*/_react["default"].createElement(_reactRouter.Switch, null, /*#__PURE__*/_react["default"].createElement(Route, {
|
|
138
138
|
exact: true,
|
|
139
139
|
path: "/",
|
|
140
|
-
component: _Screens["default"].
|
|
140
|
+
component: _Screens["default"].ItemOverview
|
|
141
|
+
}), /*#__PURE__*/_react["default"].createElement(Route, {
|
|
142
|
+
exact: true,
|
|
143
|
+
path: "/items",
|
|
144
|
+
component: _Screens["default"].ItemOverview
|
|
141
145
|
}), /*#__PURE__*/_react["default"].createElement(_reactRouter.Redirect, {
|
|
142
146
|
from: "blank",
|
|
143
147
|
to: this.basePath
|
|
@@ -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 _makeStyles = _interopRequireDefault(require("@material-ui/core/styles/makeStyles"));
|
|
11
|
+
|
|
12
|
+
var _Typography = _interopRequireDefault(require("@material-ui/core/Typography"));
|
|
13
|
+
|
|
14
|
+
var _MainButton = _interopRequireDefault(require("../../../../../Shared/Components/MainButton"));
|
|
15
|
+
|
|
16
|
+
var _i18n = require("../../../../../Framework/i18n");
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
19
|
+
|
|
20
|
+
var useStyles = (0, _makeStyles["default"])(function (theme) {
|
|
21
|
+
return {
|
|
22
|
+
root: {
|
|
23
|
+
display: 'flex',
|
|
24
|
+
flexDirection: 'column',
|
|
25
|
+
gap: '10px',
|
|
26
|
+
width: '70%',
|
|
27
|
+
height: '300px',
|
|
28
|
+
backgroundColor: '#fff',
|
|
29
|
+
padding: '25px',
|
|
30
|
+
borderRadius: '5px',
|
|
31
|
+
margin: '20px',
|
|
32
|
+
boxShadow: '0px 0px 5px 0px rgba(0,0,0,0.2)'
|
|
33
|
+
},
|
|
34
|
+
image: {
|
|
35
|
+
margin: 'auto',
|
|
36
|
+
width: '170px',
|
|
37
|
+
height: '170px',
|
|
38
|
+
'& img': {
|
|
39
|
+
width: '100%',
|
|
40
|
+
height: '100%',
|
|
41
|
+
objectFit: 'contain'
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
title: {
|
|
45
|
+
marginBottom: 'auto'
|
|
46
|
+
},
|
|
47
|
+
buttonContainer: {
|
|
48
|
+
width: '150px',
|
|
49
|
+
margin: 'auto'
|
|
50
|
+
},
|
|
51
|
+
button: {
|
|
52
|
+
width: '100%',
|
|
53
|
+
backgroundColor: theme.palette.primary.main,
|
|
54
|
+
'&:hover': {
|
|
55
|
+
backgroundColor: theme.palette.primary.light
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}, {
|
|
60
|
+
name: 'ItemTile'
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
var ItemTile = function ItemTile(_ref) {
|
|
64
|
+
var title = _ref.title,
|
|
65
|
+
linkTo = _ref.linkTo,
|
|
66
|
+
image = _ref.image;
|
|
67
|
+
var classes = useStyles();
|
|
68
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
69
|
+
className: classes.root
|
|
70
|
+
}, /*#__PURE__*/_react["default"].createElement(_Typography["default"], {
|
|
71
|
+
variant: "h6",
|
|
72
|
+
className: classes.title
|
|
73
|
+
}, title), /*#__PURE__*/_react["default"].createElement("div", {
|
|
74
|
+
className: classes.image
|
|
75
|
+
}, /*#__PURE__*/_react["default"].createElement("img", {
|
|
76
|
+
src: image,
|
|
77
|
+
alt: title
|
|
78
|
+
})), /*#__PURE__*/_react["default"].createElement("div", {
|
|
79
|
+
className: classes.buttonContainer
|
|
80
|
+
}, /*#__PURE__*/_react["default"].createElement("a", {
|
|
81
|
+
href: linkTo
|
|
82
|
+
}, /*#__PURE__*/_react["default"].createElement(_MainButton["default"], {
|
|
83
|
+
className: classes.button
|
|
84
|
+
}, (0, _i18n.T)('itemOverview.customize')))));
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
var _default = ItemTile;
|
|
88
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
"use strict";
|
|
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
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports["default"] = void 0;
|
|
9
|
+
|
|
10
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
+
|
|
12
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
+
|
|
14
|
+
var _clsx = _interopRequireDefault(require("clsx"));
|
|
15
|
+
|
|
16
|
+
var _ItemTile = _interopRequireDefault(require("./Configurator/Components/ItemTile/ItemTile"));
|
|
17
|
+
|
|
18
|
+
var _makeStyles = _interopRequireDefault(require("@material-ui/core/styles/makeStyles"));
|
|
19
|
+
|
|
20
|
+
var _core = require("@material-ui/core");
|
|
21
|
+
|
|
22
|
+
var _i18n = require("../../Framework/i18n");
|
|
23
|
+
|
|
24
|
+
var _lazyFetch = require("../Utils/Request/lazyFetch");
|
|
25
|
+
|
|
26
|
+
var _lab = require("@material-ui/lab");
|
|
27
|
+
|
|
28
|
+
var _configuration = require("../configuration");
|
|
29
|
+
|
|
30
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
31
|
+
|
|
32
|
+
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); }
|
|
33
|
+
|
|
34
|
+
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; }
|
|
35
|
+
|
|
36
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
37
|
+
|
|
38
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
39
|
+
|
|
40
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
41
|
+
|
|
42
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
43
|
+
|
|
44
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
45
|
+
|
|
46
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
47
|
+
|
|
48
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
49
|
+
|
|
50
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
51
|
+
|
|
52
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
53
|
+
|
|
54
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
55
|
+
|
|
56
|
+
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; }
|
|
57
|
+
|
|
58
|
+
var useStyles = (0, _makeStyles["default"])(function (theme) {
|
|
59
|
+
return {
|
|
60
|
+
container: _defineProperty({
|
|
61
|
+
marginTop: '80px',
|
|
62
|
+
display: 'flex',
|
|
63
|
+
flexDirection: 'column',
|
|
64
|
+
alignItems: 'center',
|
|
65
|
+
width: '70%',
|
|
66
|
+
margin: 'auto'
|
|
67
|
+
}, theme.breakpoints.down('sm'), {
|
|
68
|
+
width: '95%'
|
|
69
|
+
}),
|
|
70
|
+
itemContainer: _defineProperty({
|
|
71
|
+
minWidth: '100%',
|
|
72
|
+
backgroundColor: '#C4C4C4',
|
|
73
|
+
padding: '30px',
|
|
74
|
+
marginBottom: '30px',
|
|
75
|
+
borderRadius: '10px'
|
|
76
|
+
}, theme.breakpoints.down('sm'), {
|
|
77
|
+
minWidth: '85%',
|
|
78
|
+
maxWidth: '95%'
|
|
79
|
+
}),
|
|
80
|
+
gridContainer: {
|
|
81
|
+
margin: 'auto'
|
|
82
|
+
},
|
|
83
|
+
categoryContainer: _defineProperty({
|
|
84
|
+
display: 'flex',
|
|
85
|
+
gap: '15px',
|
|
86
|
+
width: '100%',
|
|
87
|
+
marginTop: '40px',
|
|
88
|
+
marginBottom: '30px',
|
|
89
|
+
overflowX: 'auto'
|
|
90
|
+
}, theme.breakpoints.down('md'), {
|
|
91
|
+
marginTop: '20px'
|
|
92
|
+
}),
|
|
93
|
+
categoryButton: {
|
|
94
|
+
backgroundColor: '#ededed',
|
|
95
|
+
color: '#000',
|
|
96
|
+
borderRadius: '50px',
|
|
97
|
+
padding: '20px',
|
|
98
|
+
'&.active': {
|
|
99
|
+
backgroundColor: theme.palette.primary.main,
|
|
100
|
+
color: '#fff'
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
header: {
|
|
104
|
+
minHeight: '64px',
|
|
105
|
+
display: 'flex',
|
|
106
|
+
justifyContent: 'center',
|
|
107
|
+
paddingLeft: '25px'
|
|
108
|
+
},
|
|
109
|
+
paginationContainer: {
|
|
110
|
+
display: 'flex',
|
|
111
|
+
justifyContent: 'center',
|
|
112
|
+
alignItems: 'center',
|
|
113
|
+
marginBottom: '10px'
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
}, {
|
|
117
|
+
name: 'ItemOverview'
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
var ItemOverview = function ItemOverview(_ref) {
|
|
121
|
+
var pageSize = _ref.pageSize;
|
|
122
|
+
var classes = useStyles();
|
|
123
|
+
var theme = (0, _core.useTheme)();
|
|
124
|
+
var isMobile = (0, _core.useMediaQuery)(theme.breakpoints.down('sm'));
|
|
125
|
+
|
|
126
|
+
var _useState = (0, _react.useState)([]),
|
|
127
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
128
|
+
allItems = _useState2[0],
|
|
129
|
+
setAllItems = _useState2[1];
|
|
130
|
+
|
|
131
|
+
var _useState3 = (0, _react.useState)([]),
|
|
132
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
133
|
+
items = _useState4[0],
|
|
134
|
+
setItems = _useState4[1];
|
|
135
|
+
|
|
136
|
+
var _useState5 = (0, _react.useState)([]),
|
|
137
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
138
|
+
categories = _useState6[0],
|
|
139
|
+
setCategories = _useState6[1];
|
|
140
|
+
|
|
141
|
+
var _useState7 = (0, _react.useState)(''),
|
|
142
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
143
|
+
chosenCategory = _useState8[0],
|
|
144
|
+
setChosenCategory = _useState8[1];
|
|
145
|
+
|
|
146
|
+
var _useState9 = (0, _react.useState)({
|
|
147
|
+
count: 0,
|
|
148
|
+
from: 0,
|
|
149
|
+
to: pageSize
|
|
150
|
+
}),
|
|
151
|
+
_useState10 = _slicedToArray(_useState9, 2),
|
|
152
|
+
pagination = _useState10[0],
|
|
153
|
+
setPagination = _useState10[1];
|
|
154
|
+
|
|
155
|
+
var HOST = (0, _configuration.getConf)('network.host');
|
|
156
|
+
|
|
157
|
+
var fetchItems = /*#__PURE__*/function () {
|
|
158
|
+
var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
|
|
159
|
+
var response;
|
|
160
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
161
|
+
while (1) {
|
|
162
|
+
switch (_context.prev = _context.next) {
|
|
163
|
+
case 0:
|
|
164
|
+
_context.next = 2;
|
|
165
|
+
return (0, _lazyFetch.lazyFetch)('items');
|
|
166
|
+
|
|
167
|
+
case 2:
|
|
168
|
+
response = _context.sent;
|
|
169
|
+
return _context.abrupt("return", response.data.data);
|
|
170
|
+
|
|
171
|
+
case 4:
|
|
172
|
+
case "end":
|
|
173
|
+
return _context.stop();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}, _callee);
|
|
177
|
+
}));
|
|
178
|
+
|
|
179
|
+
return function fetchItems() {
|
|
180
|
+
return _ref2.apply(this, arguments);
|
|
181
|
+
};
|
|
182
|
+
}();
|
|
183
|
+
|
|
184
|
+
var fetchCategories = /*#__PURE__*/function () {
|
|
185
|
+
var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
|
|
186
|
+
var response;
|
|
187
|
+
return regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
188
|
+
while (1) {
|
|
189
|
+
switch (_context2.prev = _context2.next) {
|
|
190
|
+
case 0:
|
|
191
|
+
_context2.next = 2;
|
|
192
|
+
return (0, _lazyFetch.lazyFetch)('item-classifications');
|
|
193
|
+
|
|
194
|
+
case 2:
|
|
195
|
+
response = _context2.sent;
|
|
196
|
+
return _context2.abrupt("return", response.data);
|
|
197
|
+
|
|
198
|
+
case 4:
|
|
199
|
+
case "end":
|
|
200
|
+
return _context2.stop();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}, _callee2);
|
|
204
|
+
}));
|
|
205
|
+
|
|
206
|
+
return function fetchCategories() {
|
|
207
|
+
return _ref3.apply(this, arguments);
|
|
208
|
+
};
|
|
209
|
+
}();
|
|
210
|
+
|
|
211
|
+
(0, _react.useEffect)(function () {
|
|
212
|
+
_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
|
|
213
|
+
var items;
|
|
214
|
+
return regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
215
|
+
while (1) {
|
|
216
|
+
switch (_context3.prev = _context3.next) {
|
|
217
|
+
case 0:
|
|
218
|
+
_context3.next = 2;
|
|
219
|
+
return fetchItems();
|
|
220
|
+
|
|
221
|
+
case 2:
|
|
222
|
+
items = _context3.sent;
|
|
223
|
+
setAllItems(items);
|
|
224
|
+
setItems(items);
|
|
225
|
+
_context3.t0 = setCategories;
|
|
226
|
+
_context3.next = 8;
|
|
227
|
+
return fetchCategories();
|
|
228
|
+
|
|
229
|
+
case 8:
|
|
230
|
+
_context3.t1 = _context3.sent;
|
|
231
|
+
(0, _context3.t0)(_context3.t1);
|
|
232
|
+
|
|
233
|
+
case 10:
|
|
234
|
+
case "end":
|
|
235
|
+
return _context3.stop();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}, _callee3);
|
|
239
|
+
}))();
|
|
240
|
+
}, []);
|
|
241
|
+
(0, _react.useEffect)(function () {
|
|
242
|
+
setPagination(_objectSpread(_objectSpread({}, pagination), {}, {
|
|
243
|
+
count: Math.ceil(items.length / pageSize)
|
|
244
|
+
}));
|
|
245
|
+
}, [items, pagination.from, pagination.to]);
|
|
246
|
+
(0, _react.useEffect)(function () {
|
|
247
|
+
setPagination(_objectSpread(_objectSpread({}, pagination), {}, {
|
|
248
|
+
from: 0,
|
|
249
|
+
to: pageSize
|
|
250
|
+
}));
|
|
251
|
+
if (!chosenCategory) return setItems(allItems);
|
|
252
|
+
setItems(allItems.filter(function (item) {
|
|
253
|
+
return item.itemclassifications.some(function (classification) {
|
|
254
|
+
return classification.identifier === chosenCategory;
|
|
255
|
+
});
|
|
256
|
+
}));
|
|
257
|
+
}, [chosenCategory]);
|
|
258
|
+
|
|
259
|
+
var onClickCategory = function onClickCategory(identifier) {
|
|
260
|
+
if (chosenCategory === identifier) return setChosenCategory('');
|
|
261
|
+
setChosenCategory(identifier);
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
var handlePageChange = function handlePageChange(event, page) {
|
|
265
|
+
var from = (page - 1) * pageSize;
|
|
266
|
+
var to = (page - 1) * pageSize + pageSize;
|
|
267
|
+
setPagination(_objectSpread(_objectSpread({}, pagination), {}, {
|
|
268
|
+
from: from,
|
|
269
|
+
to: to
|
|
270
|
+
}));
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
var renderCategories = function renderCategories() {
|
|
274
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
275
|
+
className: classes.categoryContainer
|
|
276
|
+
}, categories.map(function (category) {
|
|
277
|
+
return /*#__PURE__*/_react["default"].createElement(_core.ButtonBase, {
|
|
278
|
+
className: (0, _clsx["default"])(classes.categoryButton, chosenCategory === category.identifier && 'active'),
|
|
279
|
+
key: category.identifier,
|
|
280
|
+
onClick: function onClick() {
|
|
281
|
+
return onClickCategory(category.identifier);
|
|
282
|
+
}
|
|
283
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Typography, {
|
|
284
|
+
variant: "body2"
|
|
285
|
+
}, category.translated_title));
|
|
286
|
+
}));
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
var renderPagination = function renderPagination() {
|
|
290
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
291
|
+
className: classes.paginationContainer
|
|
292
|
+
}, /*#__PURE__*/_react["default"].createElement(_lab.Pagination, {
|
|
293
|
+
count: pagination.count,
|
|
294
|
+
color: "primary",
|
|
295
|
+
onChange: handlePageChange,
|
|
296
|
+
size: isMobile ? 'small' : 'large'
|
|
297
|
+
}));
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
var renderItems = function renderItems() {
|
|
301
|
+
var itemsPerPage = items.slice(pagination.from, pagination.to);
|
|
302
|
+
return /*#__PURE__*/_react["default"].createElement("div", {
|
|
303
|
+
className: classes.itemContainer
|
|
304
|
+
}, renderPagination(), /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
305
|
+
container: true,
|
|
306
|
+
className: classes.gridContainer
|
|
307
|
+
}, itemsPerPage.map(function (item, index) {
|
|
308
|
+
return /*#__PURE__*/_react["default"].createElement(_core.Grid, {
|
|
309
|
+
item: true,
|
|
310
|
+
key: item.identifier,
|
|
311
|
+
xs: 12,
|
|
312
|
+
sm: 6,
|
|
313
|
+
md: 3
|
|
314
|
+
}, /*#__PURE__*/_react["default"].createElement(_ItemTile["default"], {
|
|
315
|
+
title: item.title,
|
|
316
|
+
index: index,
|
|
317
|
+
image: item.thumbnail,
|
|
318
|
+
linkTo: "".concat(HOST, "/identifier:").concat(item.identifier),
|
|
319
|
+
key: item.identifier
|
|
320
|
+
}));
|
|
321
|
+
})));
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_core.AppBar, {
|
|
325
|
+
className: classes.header
|
|
326
|
+
}, /*#__PURE__*/_react["default"].createElement(_core.Typography, {
|
|
327
|
+
variant: "h5"
|
|
328
|
+
}, (0, _i18n.T)('itemOverview.title'))), /*#__PURE__*/_react["default"].createElement("div", {
|
|
329
|
+
className: classes.container
|
|
330
|
+
}, !!categories.length && renderCategories(), !!items.length && renderItems()));
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
ItemOverview.propTypes = {
|
|
334
|
+
pageSize: _propTypes["default"].number
|
|
335
|
+
};
|
|
336
|
+
ItemOverview.defaultProps = {
|
|
337
|
+
pageSize: 8
|
|
338
|
+
};
|
|
339
|
+
var _default = ItemOverview;
|
|
340
|
+
exports["default"] = _default;
|
package/App/Screens.js
CHANGED
|
@@ -13,6 +13,12 @@ var screens = (0, _configuration.getConf)('screens', {}); // IMPORTANT
|
|
|
13
13
|
// import base Screens if not replaced in custom project
|
|
14
14
|
// note: require should be used here to avoid importing the screen when it's not used
|
|
15
15
|
|
|
16
|
+
if (!screens.ItemOverview) {
|
|
17
|
+
var ItemOverview = require("./Screens/ItemOverview")["default"];
|
|
18
|
+
|
|
19
|
+
screens.ItemOverview = ItemOverview;
|
|
20
|
+
}
|
|
21
|
+
|
|
16
22
|
if (!screens.Configurator) {
|
|
17
23
|
var _require = require("./Screens/Configurator/Screen"),
|
|
18
24
|
ConnectedConfiguratorScreen = _require.ConnectedConfiguratorScreen;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.lazyFetch = void 0;
|
|
7
|
+
|
|
8
|
+
var _pathParams = require("./pathParams");
|
|
9
|
+
|
|
10
|
+
var _Api = _interopRequireDefault(require("../../../Framework/Api"));
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
13
|
+
|
|
14
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
15
|
+
|
|
16
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
17
|
+
|
|
18
|
+
var lazyFetch = /*#__PURE__*/function () {
|
|
19
|
+
var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(url, params, fallbackValue) {
|
|
20
|
+
return regeneratorRuntime.wrap(function _callee$(_context) {
|
|
21
|
+
while (1) {
|
|
22
|
+
switch (_context.prev = _context.next) {
|
|
23
|
+
case 0:
|
|
24
|
+
_context.prev = 0;
|
|
25
|
+
_context.next = 3;
|
|
26
|
+
return _Api["default"].request((0, _pathParams.pathParams)(url, params));
|
|
27
|
+
|
|
28
|
+
case 3:
|
|
29
|
+
return _context.abrupt("return", _context.sent);
|
|
30
|
+
|
|
31
|
+
case 6:
|
|
32
|
+
_context.prev = 6;
|
|
33
|
+
_context.t0 = _context["catch"](0);
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.error(_context.t0);
|
|
36
|
+
|
|
37
|
+
if (!(typeof fallbackValue !== 'undefined')) {
|
|
38
|
+
_context.next = 11;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return _context.abrupt("return", fallbackValue);
|
|
43
|
+
|
|
44
|
+
case 11:
|
|
45
|
+
throw _context.t0;
|
|
46
|
+
|
|
47
|
+
case 12:
|
|
48
|
+
case "end":
|
|
49
|
+
return _context.stop();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}, _callee, null, [[0, 6]]);
|
|
53
|
+
}));
|
|
54
|
+
|
|
55
|
+
return function lazyFetch(_x, _x2, _x3) {
|
|
56
|
+
return _ref.apply(this, arguments);
|
|
57
|
+
};
|
|
58
|
+
}();
|
|
59
|
+
|
|
60
|
+
exports.lazyFetch = lazyFetch;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.pathParams = void 0;
|
|
7
|
+
|
|
8
|
+
var pathParams = function pathParams(path) {
|
|
9
|
+
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
10
|
+
var keys = Object.keys(params);
|
|
11
|
+
var result = path;
|
|
12
|
+
|
|
13
|
+
for (var _i = 0, _keys = keys; _i < _keys.length; _i++) {
|
|
14
|
+
var key = _keys[_i];
|
|
15
|
+
result = result.replace("{".concat(key, "}"), params[key]);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.pathParams = pathParams;
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@configuratorware/configurator-frontendgui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.40.0",
|
|
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.40.0",
|
|
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.40.0",
|
|
43
|
+
"redhotmagma-visualization": "1.40.0",
|
|
44
44
|
"redux": "^4.1.0",
|
|
45
45
|
"redux-logger": "^3.0.6",
|
|
46
46
|
"redux-persist": "^5.10.0",
|
|
@@ -171,7 +171,8 @@
|
|
|
171
171
|
},
|
|
172
172
|
"calculationTypes": {
|
|
173
173
|
"setup_cost": "Einrichtungskosten",
|
|
174
|
-
"production_cost": "Produktionskosten"
|
|
174
|
+
"production_cost": "Produktionskosten",
|
|
175
|
+
"gallery_image": "Gallerie-Bild"
|
|
175
176
|
},
|
|
176
177
|
"calculationWidget": {
|
|
177
178
|
"addImage": "Bild gewünscht",
|
|
@@ -465,5 +466,34 @@
|
|
|
465
466
|
"maxTexts_1": "Im gewählten Produktionsverfahren ist maximal %{max} Textelement erlaubt. Bitte lösche einen Text um das Produktionsverfahren zu wechseln.",
|
|
466
467
|
"maxTexts_0": "Im gewählten Produktionsverfahren sind keine Textelemente erlaubt. Bitte lösche alle Texte um das Produktionsverfahren zu wechseln."
|
|
467
468
|
}
|
|
469
|
+
},
|
|
470
|
+
"receiveOffersRequestMail": {
|
|
471
|
+
"subject": "Sie haben eine Angebotsanfrage über den Konfigurator erhalten.",
|
|
472
|
+
"configurationCode": "Konfiguration Code",
|
|
473
|
+
"emailAddress": "E-Mail",
|
|
474
|
+
"name": "Name",
|
|
475
|
+
"company": "Firma",
|
|
476
|
+
"phoneNumber": "Telefonnummer",
|
|
477
|
+
"zip": "PLZ",
|
|
478
|
+
"city": "Ort",
|
|
479
|
+
"street": "Straße",
|
|
480
|
+
"country": "Land",
|
|
481
|
+
"note": "Hinweis",
|
|
482
|
+
"productionData": "Produktionsdaten"
|
|
483
|
+
},
|
|
484
|
+
"offerRequestCustomerEmail": {
|
|
485
|
+
"subject": "Ihre Konfigurationsanfrage %{code}",
|
|
486
|
+
"greeting": "Sehr geehrte(r) %{name}",
|
|
487
|
+
"text1": "Vielen Dank für Ihre Anfrage.",
|
|
488
|
+
"text2": "Ihr Konfigurations-Code lautet: %{code}",
|
|
489
|
+
"text3": "Sie können Ihre Konfiguration unter folgendem Link aufrufen: %{shareUrl}",
|
|
490
|
+
"text4": "Wir werden Ihnen das Angebot innerhalb der nächsten 1-2 Werktage bearbeitet zukommen lassen.",
|
|
491
|
+
"text5": "Sollten sich Fragen oder Änderungen ergeben, lassen Sie es uns gerne wissen.",
|
|
492
|
+
"regards": "Mit freundlichen Grüßen",
|
|
493
|
+
"signature": ""
|
|
494
|
+
},
|
|
495
|
+
"itemOverview": {
|
|
496
|
+
"title": "Produktübersicht",
|
|
497
|
+
"customize": "Konfigurieren"
|
|
468
498
|
}
|
|
469
499
|
}
|
|
@@ -171,7 +171,8 @@
|
|
|
171
171
|
},
|
|
172
172
|
"calculationTypes": {
|
|
173
173
|
"setup_cost": "Setup cost",
|
|
174
|
-
"production_cost": "Production cost"
|
|
174
|
+
"production_cost": "Production cost",
|
|
175
|
+
"gallery_image": "Gallery image"
|
|
175
176
|
},
|
|
176
177
|
"calculationWidget": {
|
|
177
178
|
"addImage": "Image wanted",
|
|
@@ -465,5 +466,34 @@
|
|
|
465
466
|
"maxTexts_1": "A maximum of %{max} text element is allowed for the selected production method. Please delete a text to change the production method.",
|
|
466
467
|
"maxTexts_0": "There are no text elements allowed for the selected production method. Please delete all texts to change the production method."
|
|
467
468
|
}
|
|
469
|
+
},
|
|
470
|
+
"receiveOffersRequestMail": {
|
|
471
|
+
"subject": "You have received an offer request via the configurator.",
|
|
472
|
+
"configurationCode": "Configuration code",
|
|
473
|
+
"emailAddress": "Email",
|
|
474
|
+
"name": "Name",
|
|
475
|
+
"company": "Company",
|
|
476
|
+
"phoneNumber": "Phone",
|
|
477
|
+
"zip": "Zip",
|
|
478
|
+
"city": "City",
|
|
479
|
+
"street": "Street",
|
|
480
|
+
"country": "Country",
|
|
481
|
+
"note": "Note",
|
|
482
|
+
"productionData": "Production data"
|
|
483
|
+
},
|
|
484
|
+
"offerRequestCustomerEmail": {
|
|
485
|
+
"subject": "Your configuration request %{code}",
|
|
486
|
+
"greeting": "Dear %{name}",
|
|
487
|
+
"text1": "Thank you for your inquiry.",
|
|
488
|
+
"text2": "Your configuration code is: %{code}",
|
|
489
|
+
"text3": "You can access your configuration under the following link:",
|
|
490
|
+
"text4": "We will send you our offer within the next 1-2 working days.",
|
|
491
|
+
"text5": "If you have any questions or changes, please let us know.",
|
|
492
|
+
"regards": "Best regards",
|
|
493
|
+
"signature": ""
|
|
494
|
+
},
|
|
495
|
+
"itemOverview": {
|
|
496
|
+
"title": "Item Overview",
|
|
497
|
+
"customize": "Customize"
|
|
468
498
|
}
|
|
469
499
|
}
|
package/src/App/Routing.js
CHANGED
|
@@ -53,7 +53,9 @@ export default class Routing extends Component {
|
|
|
53
53
|
<ErrorBoundary>
|
|
54
54
|
<WrapperFrame>
|
|
55
55
|
<Switch>
|
|
56
|
-
<Route exact path="/" component={combinedScreens.
|
|
56
|
+
<Route exact path="/" component={combinedScreens.ItemOverview} />
|
|
57
|
+
|
|
58
|
+
<Route exact path="/items" component={combinedScreens.ItemOverview} />
|
|
57
59
|
|
|
58
60
|
<Redirect from="blank" to={this.basePath} />
|
|
59
61
|
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import makeStyles from '@material-ui/core/styles/makeStyles';
|
|
3
|
+
import Typography from '@material-ui/core/Typography';
|
|
4
|
+
import MainButton from '../../../../../Shared/Components/MainButton';
|
|
5
|
+
import { T } from 'Framework/i18n';
|
|
6
|
+
|
|
7
|
+
const useStyles = makeStyles(
|
|
8
|
+
theme => ({
|
|
9
|
+
root: {
|
|
10
|
+
display: 'flex',
|
|
11
|
+
flexDirection: 'column',
|
|
12
|
+
gap: '10px',
|
|
13
|
+
width: '70%',
|
|
14
|
+
height: '300px',
|
|
15
|
+
backgroundColor: '#fff',
|
|
16
|
+
padding: '25px',
|
|
17
|
+
borderRadius: '5px',
|
|
18
|
+
margin: '20px',
|
|
19
|
+
boxShadow: '0px 0px 5px 0px rgba(0,0,0,0.2)',
|
|
20
|
+
},
|
|
21
|
+
image: {
|
|
22
|
+
margin: 'auto',
|
|
23
|
+
width: '170px',
|
|
24
|
+
height: '170px',
|
|
25
|
+
'& img': {
|
|
26
|
+
width: '100%',
|
|
27
|
+
height: '100%',
|
|
28
|
+
objectFit: 'contain',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
title: {
|
|
32
|
+
marginBottom: 'auto',
|
|
33
|
+
},
|
|
34
|
+
buttonContainer: {
|
|
35
|
+
width: '150px',
|
|
36
|
+
margin: 'auto',
|
|
37
|
+
},
|
|
38
|
+
button: {
|
|
39
|
+
width: '100%',
|
|
40
|
+
backgroundColor: theme.palette.primary.main,
|
|
41
|
+
'&:hover': {
|
|
42
|
+
backgroundColor: theme.palette.primary.light,
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
}),
|
|
46
|
+
{ name: 'ItemTile' }
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const ItemTile = ({ title, linkTo, image }) => {
|
|
50
|
+
const classes = useStyles();
|
|
51
|
+
|
|
52
|
+
return (
|
|
53
|
+
<div className={classes.root}>
|
|
54
|
+
<Typography variant="h6" className={classes.title}>
|
|
55
|
+
{title}
|
|
56
|
+
</Typography>
|
|
57
|
+
<div className={classes.image}>
|
|
58
|
+
<img src={image} alt={title} />
|
|
59
|
+
</div>
|
|
60
|
+
<div className={classes.buttonContainer}>
|
|
61
|
+
<a href={linkTo}>
|
|
62
|
+
<MainButton className={classes.button}>{T('itemOverview.customize')}</MainButton>
|
|
63
|
+
</a>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default ItemTile;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import React, { useEffect, useState } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import clsx from 'clsx';
|
|
4
|
+
import ItemTile from './Configurator/Components/ItemTile/ItemTile';
|
|
5
|
+
import makeStyles from '@material-ui/core/styles/makeStyles';
|
|
6
|
+
import { AppBar, ButtonBase, Typography, Grid, useMediaQuery, useTheme } from '@material-ui/core';
|
|
7
|
+
import { T } from 'Framework/i18n';
|
|
8
|
+
import { lazyFetch } from '../Utils/Request/lazyFetch';
|
|
9
|
+
import { Pagination } from '@material-ui/lab';
|
|
10
|
+
import { getConf } from '../configuration';
|
|
11
|
+
|
|
12
|
+
const useStyles = makeStyles(
|
|
13
|
+
theme => ({
|
|
14
|
+
container: {
|
|
15
|
+
marginTop: '80px',
|
|
16
|
+
display: 'flex',
|
|
17
|
+
flexDirection: 'column',
|
|
18
|
+
alignItems: 'center',
|
|
19
|
+
width: '70%',
|
|
20
|
+
margin: 'auto',
|
|
21
|
+
[theme.breakpoints.down('sm')]: {
|
|
22
|
+
width: '95%',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
itemContainer: {
|
|
26
|
+
minWidth: '100%',
|
|
27
|
+
backgroundColor: '#C4C4C4',
|
|
28
|
+
padding: '30px',
|
|
29
|
+
marginBottom: '30px',
|
|
30
|
+
borderRadius: '10px',
|
|
31
|
+
[theme.breakpoints.down('sm')]: {
|
|
32
|
+
minWidth: '85%',
|
|
33
|
+
maxWidth: '95%',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
gridContainer: {
|
|
37
|
+
margin: 'auto',
|
|
38
|
+
},
|
|
39
|
+
categoryContainer: {
|
|
40
|
+
display: 'flex',
|
|
41
|
+
gap: '15px',
|
|
42
|
+
width: '100%',
|
|
43
|
+
marginTop: '40px',
|
|
44
|
+
marginBottom: '30px',
|
|
45
|
+
overflowX: 'auto',
|
|
46
|
+
[theme.breakpoints.down('md')]: {
|
|
47
|
+
marginTop: '20px',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
categoryButton: {
|
|
51
|
+
backgroundColor: '#ededed',
|
|
52
|
+
color: '#000',
|
|
53
|
+
borderRadius: '50px',
|
|
54
|
+
padding: '20px',
|
|
55
|
+
'&.active': {
|
|
56
|
+
backgroundColor: theme.palette.primary.main,
|
|
57
|
+
color: '#fff',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
header: {
|
|
61
|
+
minHeight: '64px',
|
|
62
|
+
display: 'flex',
|
|
63
|
+
justifyContent: 'center',
|
|
64
|
+
paddingLeft: '25px',
|
|
65
|
+
},
|
|
66
|
+
paginationContainer: {
|
|
67
|
+
display: 'flex',
|
|
68
|
+
justifyContent: 'center',
|
|
69
|
+
alignItems: 'center',
|
|
70
|
+
marginBottom: '10px',
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
{ name: 'ItemOverview' }
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
const ItemOverview = ({ pageSize }) => {
|
|
77
|
+
const classes = useStyles();
|
|
78
|
+
const theme = useTheme();
|
|
79
|
+
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
|
|
80
|
+
|
|
81
|
+
const [allItems, setAllItems] = useState([]);
|
|
82
|
+
const [items, setItems] = useState([]);
|
|
83
|
+
const [categories, setCategories] = useState([]);
|
|
84
|
+
const [chosenCategory, setChosenCategory] = useState('');
|
|
85
|
+
const [pagination, setPagination] = useState({
|
|
86
|
+
count: 0,
|
|
87
|
+
from: 0,
|
|
88
|
+
to: pageSize,
|
|
89
|
+
});
|
|
90
|
+
const HOST = getConf('network.host');
|
|
91
|
+
|
|
92
|
+
const fetchItems = async () => {
|
|
93
|
+
const response = await lazyFetch('items');
|
|
94
|
+
return response.data.data;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const fetchCategories = async () => {
|
|
98
|
+
const response = await lazyFetch('item-classifications');
|
|
99
|
+
return response.data;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
(async () => {
|
|
104
|
+
const items = await fetchItems();
|
|
105
|
+
setAllItems(items);
|
|
106
|
+
setItems(items);
|
|
107
|
+
setCategories(await fetchCategories());
|
|
108
|
+
})();
|
|
109
|
+
}, []);
|
|
110
|
+
|
|
111
|
+
useEffect(() => {
|
|
112
|
+
setPagination({ ...pagination, count: Math.ceil(items.length / pageSize) });
|
|
113
|
+
}, [items, pagination.from, pagination.to]);
|
|
114
|
+
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
setPagination({ ...pagination, from: 0, to: pageSize });
|
|
117
|
+
|
|
118
|
+
if (!chosenCategory) return setItems(allItems);
|
|
119
|
+
setItems(
|
|
120
|
+
allItems.filter(item =>
|
|
121
|
+
item.itemclassifications.some(classification => classification.identifier === chosenCategory)
|
|
122
|
+
)
|
|
123
|
+
);
|
|
124
|
+
}, [chosenCategory]);
|
|
125
|
+
|
|
126
|
+
const onClickCategory = identifier => {
|
|
127
|
+
if (chosenCategory === identifier) return setChosenCategory('');
|
|
128
|
+
setChosenCategory(identifier);
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const handlePageChange = (event, page) => {
|
|
132
|
+
const from = (page - 1) * pageSize;
|
|
133
|
+
const to = (page - 1) * pageSize + pageSize;
|
|
134
|
+
|
|
135
|
+
setPagination({ ...pagination, from: from, to: to });
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const renderCategories = () => {
|
|
139
|
+
return (
|
|
140
|
+
<div className={classes.categoryContainer}>
|
|
141
|
+
{categories.map(category => (
|
|
142
|
+
<ButtonBase
|
|
143
|
+
className={clsx(
|
|
144
|
+
classes.categoryButton,
|
|
145
|
+
chosenCategory === category.identifier && 'active'
|
|
146
|
+
)}
|
|
147
|
+
key={category.identifier}
|
|
148
|
+
onClick={() => onClickCategory(category.identifier)}
|
|
149
|
+
>
|
|
150
|
+
<Typography variant="body2">{category.translated_title}</Typography>
|
|
151
|
+
</ButtonBase>
|
|
152
|
+
))}
|
|
153
|
+
</div>
|
|
154
|
+
);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
const renderPagination = () => {
|
|
158
|
+
return (
|
|
159
|
+
<div className={classes.paginationContainer}>
|
|
160
|
+
<Pagination
|
|
161
|
+
count={pagination.count}
|
|
162
|
+
color="primary"
|
|
163
|
+
onChange={handlePageChange}
|
|
164
|
+
size={isMobile ? 'small' : 'large'}
|
|
165
|
+
/>
|
|
166
|
+
</div>
|
|
167
|
+
);
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const renderItems = () => {
|
|
171
|
+
const itemsPerPage = items.slice(pagination.from, pagination.to);
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
<div className={classes.itemContainer}>
|
|
175
|
+
{renderPagination()}
|
|
176
|
+
<Grid container className={classes.gridContainer}>
|
|
177
|
+
{itemsPerPage.map((item, index) => (
|
|
178
|
+
<Grid item key={item.identifier} xs={12} sm={6} md={3}>
|
|
179
|
+
<ItemTile
|
|
180
|
+
title={item.title}
|
|
181
|
+
index={index}
|
|
182
|
+
image={item.thumbnail}
|
|
183
|
+
linkTo={`${HOST}/identifier:${item.identifier}`}
|
|
184
|
+
key={item.identifier}
|
|
185
|
+
></ItemTile>
|
|
186
|
+
</Grid>
|
|
187
|
+
))}
|
|
188
|
+
</Grid>
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
return (
|
|
194
|
+
<>
|
|
195
|
+
<AppBar className={classes.header}>
|
|
196
|
+
<Typography variant="h5">{T('itemOverview.title')}</Typography>
|
|
197
|
+
</AppBar>
|
|
198
|
+
<div className={classes.container}>
|
|
199
|
+
{!!categories.length && renderCategories()}
|
|
200
|
+
{!!items.length && renderItems()}
|
|
201
|
+
</div>
|
|
202
|
+
</>
|
|
203
|
+
);
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
ItemOverview.propTypes = {
|
|
207
|
+
pageSize: PropTypes.number,
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
ItemOverview.defaultProps = {
|
|
211
|
+
pageSize: 8,
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
export default ItemOverview;
|
package/src/App/Screens.js
CHANGED
|
@@ -9,6 +9,10 @@ const screens = getConf('screens', {});
|
|
|
9
9
|
// import base Screens if not replaced in custom project
|
|
10
10
|
// note: require should be used here to avoid importing the screen when it's not used
|
|
11
11
|
|
|
12
|
+
if (!screens.ItemOverview) {
|
|
13
|
+
const ItemOverview = require('./Screens/ItemOverview').default;
|
|
14
|
+
screens.ItemOverview = ItemOverview;
|
|
15
|
+
}
|
|
12
16
|
if (!screens.Configurator) {
|
|
13
17
|
const { ConnectedConfiguratorScreen } = require('./Screens/Configurator/Screen');
|
|
14
18
|
screens.Configurator = ConnectedConfiguratorScreen;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { pathParams } from './pathParams';
|
|
2
|
+
import Api from '../../../Framework/Api';
|
|
3
|
+
|
|
4
|
+
export const lazyFetch = async (url, params, fallbackValue) => {
|
|
5
|
+
try {
|
|
6
|
+
return await Api.request(pathParams(url, params));
|
|
7
|
+
} catch (e) {
|
|
8
|
+
// eslint-disable-next-line no-console
|
|
9
|
+
console.error(e);
|
|
10
|
+
if (typeof fallbackValue !== 'undefined') {
|
|
11
|
+
return fallbackValue;
|
|
12
|
+
}
|
|
13
|
+
throw e;
|
|
14
|
+
}
|
|
15
|
+
};
|