@agilemotion/oui-react-js 1.8.31 → 1.8.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/ApplicationManager.js +13 -0
  2. package/dist/DynamicJS.js +1 -0
  3. package/dist/RestService.js +4 -0
  4. package/dist/ViewContext.js +1 -1
  5. package/dist/components/AlertBar.js +1 -1
  6. package/dist/components/Button.css +3 -0
  7. package/dist/components/Button.js +2 -1
  8. package/dist/components/DataGrid.js +25 -29
  9. package/dist/components/HtmlPanel.js +4 -2
  10. package/dist/components/Icon.js +7 -0
  11. package/dist/components/PopupView.js +9 -5
  12. package/dist/components/SocketManager.js +2 -0
  13. package/dist/components/StepperTitleBar.js +33 -18
  14. package/dist/components/TabPanel.js +30 -11
  15. package/dist/components/Toolbar.js +4 -7
  16. package/dist/components/customInput/File.js +1 -2
  17. package/dist/components/form/AutoComplete.js +4 -4
  18. package/dist/components/form/DatePicker.js +2 -2
  19. package/dist/components/form/IconField.js +3 -1
  20. package/dist/components/form/ImageEditor_bck.js +466 -0
  21. package/dist/components/form/TimePicker.js +4 -4
  22. package/dist/components/layout/CollapsiblePanel.css +9 -9
  23. package/dist/components/layout/Layout.js +9 -3
  24. package/dist/components/layout/View.css +125 -125
  25. package/dist/components/layout/Window.css +14 -14
  26. package/dist/components/layout/Window.js +6 -3
  27. package/dist/components/layout/WindowViewPort.js +5 -18
  28. package/dist/components/loader.css +36 -36
  29. package/dist/components/media/ClosablePanel.css +1 -1
  30. package/dist/components/media/ToolbarButton.js +2 -1
  31. package/dist/components/media/TrainingRoom.js +9 -1
  32. package/dist/components/media/VCRoom.js +15 -1
  33. package/dist/components/media/Video.css +4 -4
  34. package/dist/components/media/chat/ChatRoom.js +6 -17
  35. package/dist/components/media/chat/ChatRoomItem.js +8 -8
  36. package/dist/components/media/chat/ChatRooms.scss +27 -13
  37. package/dist/components/media/chat/PollContainer.js +27 -22
  38. package/dist/components/signatures/ResponsiveTable.css +91 -91
  39. package/dist/components/signatures/widgets.css +126 -126
  40. package/dist/event/EventType.js +1 -0
  41. package/dist/event/Observable.js +4 -4
  42. package/dist/event/RouteActionHandler.js +8 -8
  43. package/dist/js/ProcurementMeetings.js +15 -6
  44. package/dist/view/Dashboard.bck.js +562 -0
  45. package/package.json +14 -12
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.ImageEditorComponent = exports.ImageEditor = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _Button = _interopRequireDefault(require("@mui/material/Button"));
9
+ var _BaseField = require("./BaseField");
10
+ var _styles = require("@mui/styles");
11
+ var _Utils = _interopRequireDefault(require("../../Utils"));
12
+ var _ApplicationManager = _interopRequireDefault(require("../../ApplicationManager"));
13
+ var _Icon = _interopRequireDefault(require("../Icon"));
14
+ var _reactPromiseTracker = require("react-promise-tracker");
15
+ var _Event = _interopRequireDefault(require("../../event/Event"));
16
+ var _Observable = _interopRequireDefault(require("../../event/Observable"));
17
+ var _EventType = _interopRequireDefault(require("../../event/EventType"));
18
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
20
+ const useStyles = (0, _styles.makeStyles)(theme => ({
21
+ button: {
22
+ margin: theme.spacing(1)
23
+ },
24
+ input: {
25
+ display: 'none'
26
+ },
27
+ errorMessageDisplay: {
28
+ color: 'red'
29
+ }
30
+ }));
31
+ const status = response => {
32
+ if (response.ok) {
33
+ return Promise.resolve(response);
34
+ } else {
35
+ let error = new Error(response.statusText);
36
+ error.code = response.status;
37
+ return Promise.reject(error);
38
+ }
39
+ };
40
+ const json = response => {
41
+ return response.text();
42
+ };
43
+ const location = window.location.protocol + "//" + window.location.hostname;
44
+ const ImageEditorComponent = exports.ImageEditorComponent = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.forwardRef((props, ref) => {
45
+ const [multiple] = _react.default.useState(props.multiple === true);
46
+ const [angle, setAngle] = _react.default.useState(0);
47
+ const [zoomDepth, setZoomDepth] = _react.default.useState(null);
48
+ const [originalImageWidth, setOriginalImageWidth] = _react.default.useState(null);
49
+ const [originalImageHeight, setOriginalImageHeight] = _react.default.useState(null);
50
+ const [payloadStorageMode] = _react.default.useState(props.config.payloadStorageMode || 'base64');
51
+ const classes = useStyles();
52
+ const width = _Utils.default.getComponentAttribute(props.config, 'width', '320px');
53
+ const height = _Utils.default.getComponentAttribute(props.config, 'height', '320px');
54
+ const cacheId = _react.default.useRef(!_Utils.default.isNull(props.base.value) ? props.base.value.documentRepositoryCacheId : null);
55
+ const base = props.base;
56
+ _react.default.useEffect(() => {}, [props.initialFile]);
57
+ function getFetchConfig(data) {
58
+ const accessToken = sessionStorage.getItem("accessToken");
59
+ const idToken = sessionStorage.getItem("idToken");
60
+ return {
61
+ method: 'POST',
62
+ headers: {
63
+ 'Accept': 'application/json',
64
+ 'Authorization': 'Bearer ' + accessToken,
65
+ 'idToken': idToken
66
+ },
67
+ body: data
68
+ };
69
+ }
70
+ function getRotateAngle(action) {
71
+ let rotateAngle = null;
72
+ if ("rotateLeft" === action) {
73
+ rotateAngle = -90;
74
+ } else if ("rotateRight" === action) {
75
+ rotateAngle = 90;
76
+ }
77
+ return rotateAngle;
78
+ }
79
+ function process(callback, data, action) {
80
+ let fetchConfig = getFetchConfig(data);
81
+ let url = location + _ApplicationManager.default.getContextRoot() + _Utils.default.getComponentAttribute(props.config, 'processingUrl', null) + "/" + action + "/" + _Utils.default.getComponentAttribute(props.config, "mode", "DOC");
82
+ let rotateAngle = getRotateAngle(action);
83
+ if (rotateAngle) {
84
+ url += "?" + rotateAngle;
85
+ }
86
+ (0, _reactPromiseTracker.trackPromise)(fetch(encodeURI(url), fetchConfig).then(status).then(json).then(data => {
87
+ callback(data);
88
+ }).catch(e => {
89
+ if (e.code === 401) {
90
+ _ApplicationManager.default.clear();
91
+ _ApplicationManager.default.getApplicationHistory().push('/login');
92
+ }
93
+ }));
94
+ }
95
+ const handleChange = () => event => {
96
+ if (cacheId.current) {
97
+ remove().then(() => cacheId.current = null).catch(e => {});
98
+ }
99
+ let files = event.target.files;
100
+ let file = files[0];
101
+ let reader = new FileReader();
102
+ reader.readAsDataURL(file);
103
+ reader.onload = () => {
104
+ if (!_Utils.default.isNull(file)) {
105
+ let fileMetaData = {};
106
+ fileMetaData.name = file.name;
107
+ fileMetaData.type = file.type;
108
+ fileMetaData.size = file.size;
109
+ if (base.value) {
110
+ fileMetaData.id = base.value.id;
111
+ }
112
+ if ('base64' === payloadStorageMode) {
113
+ if (_Utils.default.getComponentAttribute(props.config, 'autoRemoveBackground', false)) {
114
+ process(data => {
115
+ fileMetaData.url = data;
116
+ base.handleValueChange(fileMetaData);
117
+ }, reader.result, 'removeBackground');
118
+ } else {
119
+ fileMetaData.url = file.base64;
120
+ base.handleValueChange(fileMetaData);
121
+ }
122
+ } else {
123
+ if (_Utils.default.getComponentAttribute(props.config, 'autoRemoveBackground', false)) {
124
+ process(data => {
125
+ setCacheModeValue(fileMetaData, file);
126
+ }, reader.result, 'removeBackground');
127
+ } else {
128
+ setCacheModeValue(fileMetaData, file);
129
+ }
130
+ }
131
+ }
132
+ };
133
+ reader.onloadend = () => {};
134
+ };
135
+ const setCacheModeValue = (fileMetaData, file) => {
136
+ fileMetaData.correlationId = props.config.id;
137
+ fileMetaData.domain = props.viewId;
138
+ if (cacheId.current) {
139
+ remove().then(() => {
140
+ cacheId.current = null;
141
+ upload(fileMetaData, file, reader);
142
+ }).catch(e => {});
143
+ } else {
144
+ upload(fileMetaData, file, reader);
145
+ }
146
+ };
147
+ const upload = (metadata, file, reader) => {
148
+ let uploadUrl = _Utils.default.getComponentAttribute(props.config, 'uploadUrl', null);
149
+ if (uploadUrl === null) {
150
+ uploadUrl = _ApplicationManager.default.getContextRoot() + "/docs/api/v1/manager/upload/save";
151
+ }
152
+ let payloadStorageMode = props.config.payloadStorageMode;
153
+ if (payloadStorageMode === 'post') {
154
+ const accessToken = sessionStorage.getItem("accessToken");
155
+ const idToken = sessionStorage.getItem("idToken");
156
+ let data = new FormData();
157
+ metadata.correlationId = props.viewId + "." + props.config.id;
158
+ data.append("metadata", JSON.stringify(metadata));
159
+ data.append("file", file);
160
+ let fetchConfig = {
161
+ method: 'POST',
162
+ headers: {
163
+ 'Accept': 'application/json',
164
+ 'Authorization': 'Bearer ' + accessToken,
165
+ 'idToken': idToken,
166
+ 'tenant': _ApplicationManager.default.getActiveTenant()
167
+ },
168
+ body: data
169
+ };
170
+ let url = location + uploadUrl;
171
+ (0, _reactPromiseTracker.trackPromise)(fetch(encodeURI(url), fetchConfig).then(status).then(json).then(data => {
172
+ metadata.documentRepositoryId = !_Utils.default.isNull(base.value) ? base.value.documentRepositoryId : null;
173
+ metadata.documentRepositoryCacheId = data;
174
+ cacheId.current = data;
175
+ base.handleValueChange(metadata);
176
+ }).catch(e => {
177
+ if (e.code === 401) {
178
+ _ApplicationManager.default.clear();
179
+ _ApplicationManager.default.getApplicationHistory().push('/login');
180
+ }
181
+ let message = {
182
+ messageType: 'ERROR',
183
+ message: 'An error has accurred while uploading file'
184
+ };
185
+ let event = new _Event.default(_ApplicationManager.default, props.viewId, message);
186
+ _Observable.default.fireEvent(_EventType.default.MESSAGE_ARRIVED, event);
187
+ }));
188
+ } else {
189
+ metadata.payload = reader.result;
190
+ base.handleValueChange(metadata);
191
+ }
192
+ };
193
+ const remove = () => {
194
+ return new Promise((resolve, reject) => {
195
+ const accessToken = sessionStorage.getItem("accessToken");
196
+ const idToken = sessionStorage.getItem("idToken");
197
+ let fetchConfig = {
198
+ method: 'GET',
199
+ headers: {
200
+ 'Accept': 'application/json',
201
+ 'Authorization': 'Bearer ' + accessToken,
202
+ 'idToken': idToken,
203
+ 'tenant': _ApplicationManager.default.getActiveTenant()
204
+ }
205
+ };
206
+ let url = location + _ApplicationManager.default.getContextRoot() + '/docs/api/v1/manager/upload/remove/' + cacheId.current;
207
+ (0, _reactPromiseTracker.trackPromise)(fetch(encodeURI(url), fetchConfig).then(status).then(() => {
208
+ resolve();
209
+ }).catch(e => {
210
+ if (e.code === 401) {
211
+ _ApplicationManager.default.clear();
212
+ _ApplicationManager.default.getApplicationHistory().push('/login');
213
+ } else {
214
+ reject(e);
215
+ }
216
+ }));
217
+ });
218
+ };
219
+ _react.default.useEffect(() => {
220
+ let container = document.getElementById("__image_container");
221
+ let image = document.getElementById("__image");
222
+ if (container) {
223
+ let ratio = 10 * zoomDepth / 100;
224
+ container.style.width = originalImageWidth + originalImageWidth * ratio + "px";
225
+ container.style.height = originalImageHeight + originalImageHeight * ratio + "px";
226
+ image.style.width = container.style.width;
227
+ image.style.height = container.style.height;
228
+ }
229
+ }, [zoomDepth]);
230
+ const zoom = direction => {
231
+ if (originalImageWidth === null) {
232
+ setOriginalImageWidth(document.getElementById("__image").width);
233
+ setOriginalImageHeight(document.getElementById("__image").height);
234
+ }
235
+ let depth = direction === "In" ? zoomDepth + 1 : zoomDepth - 1;
236
+ if (depth <= 0) {
237
+ depth = 1;
238
+ }
239
+ setZoomDepth(depth);
240
+ };
241
+ const rotate = direction => {
242
+ let rotateMode = _Utils.default.getComponentAttribute(props.config, "rotateMode", null);
243
+ if (rotateMode === null || rotateMode === 'SERVER') {
244
+ process(data => {
245
+ base.handleValueChange({
246
+ ...base.value,
247
+ url: data
248
+ });
249
+ }, base.value.url, 'rotate' + direction);
250
+ } else {
251
+ let rotateAngle = angle + getRotateAngle("rotate" + direction);
252
+ document.getElementById("__image_container").style.transform = "rotate(" + rotateAngle + "deg)";
253
+ setAngle(rotateAngle);
254
+ }
255
+ };
256
+ return /*#__PURE__*/_react.default.createElement("div", {
257
+ style: _Utils.default.mergeStyles({
258
+ width: width
259
+ }, props.config)
260
+ }, /*#__PURE__*/_react.default.createElement("div", {
261
+ className: "row",
262
+ style: {
263
+ marginLeft: '0',
264
+ marginRight: '0'
265
+ }
266
+ }, /*#__PURE__*/_react.default.createElement("div", {
267
+ className: "col-*-*"
268
+ }, /*#__PURE__*/_react.default.createElement("label", null, _Utils.default.getComponentAttribute(props.config, 'label', '')))), /*#__PURE__*/_react.default.createElement("div", {
269
+ className: "row",
270
+ style: {
271
+ marginLeft: '0',
272
+ marginRight: '0'
273
+ }
274
+ }, /*#__PURE__*/_react.default.createElement("div", {
275
+ className: "col-*-*"
276
+ }, /*#__PURE__*/_react.default.createElement("input", {
277
+ accept: "image/jpeg,image/gif,image/png,image/x-eps",
278
+ className: classes.input,
279
+ id: `contained-button-file-${props.config.id}`,
280
+ disabled: base.disabled,
281
+ required: base.required,
282
+ multiple: multiple,
283
+ onChange: handleChange(),
284
+ type: "file"
285
+ }), /*#__PURE__*/_react.default.createElement("label", {
286
+ htmlFor: `contained-button-file-${props.config.id}`
287
+ }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Button.default, {
288
+ component: "span",
289
+ variant: 'contained',
290
+ size: "large",
291
+ style: {
292
+ width: '120px',
293
+ height: '40px',
294
+ border: base.hasError ? "1px solid #f44336" : null,
295
+ color: base.hasError ? "#f44336" : null
296
+ },
297
+ startIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
298
+ id: 'UPLOAD'
299
+ })
300
+ }, "UPLOAD")), base.hasError ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
301
+ style: {
302
+ color: "#f44336",
303
+ padding: "8px 0"
304
+ }
305
+ }, base.errorMessage)) : null)), /*#__PURE__*/_react.default.createElement("div", {
306
+ className: "col-*-*",
307
+ style: {
308
+ marginLeft: '4px'
309
+ }
310
+ }, base.value ? /*#__PURE__*/_react.default.createElement(_Button.default, {
311
+ variant: 'contained',
312
+ size: "large",
313
+ style: {
314
+ width: '40px',
315
+ height: '40px'
316
+ },
317
+ onClick: () => rotate('Left'),
318
+ startIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
319
+ id: 'ROTATE_LEFT'
320
+ })
321
+ }) : null), /*#__PURE__*/_react.default.createElement("div", {
322
+ className: "col-*-*",
323
+ style: {
324
+ marginLeft: '4px'
325
+ }
326
+ }, base.value ? /*#__PURE__*/_react.default.createElement(_Button.default, {
327
+ variant: 'contained',
328
+ size: "large",
329
+ style: {
330
+ width: '40px',
331
+ height: '40px'
332
+ },
333
+ onClick: () => rotate('Right'),
334
+ startIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
335
+ id: 'ROTATE_RIGHT'
336
+ })
337
+ }) : null), /*#__PURE__*/_react.default.createElement("div", {
338
+ className: "col-*-*",
339
+ style: {
340
+ marginLeft: '4px'
341
+ }
342
+ }, base.value ? /*#__PURE__*/_react.default.createElement(_Button.default, {
343
+ variant: 'contained',
344
+ size: "large",
345
+ style: {
346
+ width: '40px',
347
+ height: '40px'
348
+ },
349
+ onClick: () => zoom('Out'),
350
+ startIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
351
+ id: 'ZOOM_OUT'
352
+ })
353
+ }) : null), /*#__PURE__*/_react.default.createElement("div", {
354
+ className: "col-*-*",
355
+ style: {
356
+ marginLeft: '4px'
357
+ }
358
+ }, base.value ? /*#__PURE__*/_react.default.createElement(_Button.default, {
359
+ variant: 'contained',
360
+ size: "large",
361
+ style: {
362
+ width: '40px',
363
+ height: '40px'
364
+ },
365
+ onClick: () => zoom('In'),
366
+ startIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
367
+ id: 'ZOOM_IN'
368
+ })
369
+ }) : null)), !_Utils.default.isNull(base.value) ? /*#__PURE__*/_react.default.createElement("div", {
370
+ className: "row",
371
+ style: {
372
+ padding: "8px 0",
373
+ marginLeft: '0',
374
+ marginRight: '0'
375
+ }
376
+ }, /*#__PURE__*/_react.default.createElement("div", {
377
+ id: "__image_parent",
378
+ style: {
379
+ width: "100%",
380
+ height: height,
381
+ backgroundRepeat: 'no-repeat',
382
+ backgroundSize: 'cover',
383
+ backgroundColor: 'transparent',
384
+ backgroundImage: `url(${require('./transparent.jpeg')})`,
385
+ border: '4px solid #e1e1e1',
386
+ borderRadius: '4px'
387
+ },
388
+ className: "col-*-*"
389
+ }, /*#__PURE__*/_react.default.createElement("div", {
390
+ className: classes.button,
391
+ style: {
392
+ width: 'auto',
393
+ height: parseFloat(height.replace('px', '')) - 20 + 'px',
394
+ maxHeight: parseFloat(height.replace('px', '')) - 20 + 'px',
395
+ textAlign: 'center',
396
+ overflow: 'auto',
397
+ display: 'flex',
398
+ justifyContent: 'center',
399
+ alignItems: 'center'
400
+ }
401
+ }, /*#__PURE__*/_react.default.createElement("div", {
402
+ id: "__image_container"
403
+ }, /*#__PURE__*/_react.default.createElement("img", {
404
+ id: "__image",
405
+ src: base.value.url,
406
+ alt: '',
407
+ style: {
408
+ maxHeight: parseFloat(height.replace('px', '')) - 20 + 'px'
409
+ }
410
+ }))))) : null);
411
+ }));
412
+ const ImageEditor = exports.ImageEditor = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.forwardRef((props, ref) => {
413
+ const [file, setFile] = _react.default.useState(null);
414
+ const clearTrigger = _react.default.useRef(false);
415
+ return /*#__PURE__*/_react.default.createElement(_BaseField.BaseField, _extends({}, props, {
416
+ handle: props.handle,
417
+ valueParser: (value, inbound) => {
418
+ if (inbound) {
419
+ clearTrigger.current = !clearTrigger.current;
420
+ if (!_Utils.default.isNull(value)) {
421
+ let val = value;
422
+
423
+ // TODO : Support multiple file upload
424
+ if (_Utils.default.getComponentAttribute(props.config, 'multiple', false)) {
425
+ if (typeof value.length !== 'undefined' && value.length > 0) {
426
+ val = value[0];
427
+ } else {
428
+ if (value.documentRepositoryId) {
429
+ return value;
430
+ }
431
+ return null;
432
+ }
433
+ }
434
+ if (val.map) {
435
+ val = val.map;
436
+ }
437
+ let fileMetaData = {};
438
+ fileMetaData.name = !_Utils.default.isNull(val.label) ? val.label : val.name;
439
+ fileMetaData.id = val.id;
440
+ fileMetaData.type = val.type;
441
+ fileMetaData.size = val.size;
442
+ fileMetaData.documentRepositoryId = !_Utils.default.isNull(val.key) ? val.key : val.documentRepositoryId;
443
+ fileMetaData.documentRepositoryCacheId = val.documentRepositoryCacheId;
444
+ fileMetaData.url = val.url;
445
+ if (!_Utils.default.isNull(val.url)) {
446
+ let file = {};
447
+ file.base64 = val.url;
448
+ setFile(file);
449
+ }
450
+ return fileMetaData;
451
+ }
452
+ }
453
+ return value;
454
+ },
455
+ valueChangeCallback: value => {
456
+ if (_Utils.default.isNull(value)) {
457
+ clearTrigger.current = !clearTrigger.current;
458
+ }
459
+ }
460
+ }), base => /*#__PURE__*/_react.default.createElement(ImageEditorComponent, _extends({
461
+ base: base,
462
+ initialFile: file,
463
+ clearTrigger: clearTrigger.current
464
+ }, props)));
465
+ }));
466
+ var _default = exports.default = ImageEditor;
@@ -17,7 +17,7 @@ var _dayjs = _interopRequireDefault(require("dayjs"));
17
17
  var _demo = require("@mui/x-date-pickers/internals/demo");
18
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
19
19
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
20
- const CustomTimePickerComponent = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.forwardRef((props, ref) => {
20
+ const CustomTimePickerComponent = props => {
21
21
  const base = props.base;
22
22
  const defaultDate = !_Utils.default.isNull(base.valueObject[base.valueProperty]) ? new Date(base.valueObject[base.valueProperty]) : null;
23
23
  let minWidth = _Utils.default.getComponentAttribute(props.config, 'minWidth', '240px');
@@ -61,8 +61,8 @@ const CustomTimePickerComponent = /*#__PURE__*/_react.default.memo(/*#__PURE__*/
61
61
  onChange: newValue => handleDateChange(newValue.toDate()),
62
62
  value: base.value ? (0, _dayjs.default)(base.value) : null
63
63
  })));
64
- }));
65
- const TimePicker = /*#__PURE__*/_react.default.memo((props, ref) => {
64
+ };
65
+ const TimePicker = props => {
66
66
  return /*#__PURE__*/_react.default.createElement(_BaseField.BaseField, _extends({}, props, {
67
67
  handle: props.handle,
68
68
  valueParser: (value, inbound) => {
@@ -82,5 +82,5 @@ const TimePicker = /*#__PURE__*/_react.default.memo((props, ref) => {
82
82
  }), base => /*#__PURE__*/_react.default.createElement(CustomTimePickerComponent, _extends({
83
83
  base: base
84
84
  }, props)));
85
- });
85
+ };
86
86
  var _default = exports.default = TimePicker;
@@ -1,9 +1,9 @@
1
- .coll-panel-container {
2
- font-family: sans-serif;
3
- text-align: center;
4
- }
5
-
6
- .coll-panel-btn:focus {
7
- outline: 0;
8
- box-shadow: none;
9
- }
1
+ .coll-panel-container {
2
+ font-family: sans-serif;
3
+ text-align: center;
4
+ }
5
+
6
+ .coll-panel-btn:focus {
7
+ outline: 0;
8
+ box-shadow: none;
9
+ }
@@ -69,17 +69,22 @@ const Layout = props => {
69
69
  _react.default.useLayoutEffect(() => {
70
70
  props.handle.api = api();
71
71
  }, []);
72
+ function uniqueId(prefix) {
73
+ // time + random + counter, all base36 (no dashes)
74
+ uniqueId._c = (uniqueId._c || 0) + 1;
75
+ return prefix + Date.now().toString(36) + Math.random().toString(36).slice(2) + uniqueId._c.toString(36);
76
+ }
72
77
  const setMissingComponentIds = () => {
73
78
  let layout = props.config;
74
79
  if (!layout.id) {
75
- layout.id = '_parent_layout';
80
+ layout.id = uniqueId('_parent_layout_');
76
81
  }
77
82
  layout.key = keyCounter++;
78
83
  if (!_Utils.default.isNull(layout.components)) {
79
84
  for (let i = 0; i < layout.components.length; i++) {
80
85
  let component = layout.components[i];
81
86
  if (_Utils.default.isNull(component.id)) {
82
- component.id = layout.id + '_' + component.type + '_' + i;
87
+ component.id = uniqueId(layout.id + '_' + component.type + '_');
83
88
  }
84
89
  component.key = keyCounter++;
85
90
  }
@@ -385,7 +390,8 @@ const Layout = props => {
385
390
  return /*#__PURE__*/_react.default.createElement("div", {
386
391
  id: props.config.id,
387
392
  style: getLayoutStyle(props.config, 'transparent'),
388
- className: `${_Utils.default.getComponentAttribute(props.config, 'className', 'default-oui-layout') + (props.config.orientation === 'HORIZONTAL' ? ' row' : '')}`
393
+ className: `${_Utils.default.getComponentAttribute(props.config, 'className', 'default-oui-layout') + (props.config.orientation === 'HORIZONTAL' ? ' row' : '')}`,
394
+ key: props.config.id
389
395
  }, render(props.config));
390
396
  };
391
397
  exports.Layout = Layout;