@agilemotion/oui-react-js 1.4.2 → 1.4.4

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 (41) hide show
  1. package/dist/RestUtils.js +16 -37
  2. package/dist/Utils.js +10 -1
  3. package/dist/assets/img/default-file-thumb.png +0 -0
  4. package/dist/assets/img/doc.png +0 -0
  5. package/dist/assets/img/excel.png +0 -0
  6. package/dist/assets/img/media.png +0 -0
  7. package/dist/assets/img/pdf-icon.png +0 -0
  8. package/dist/assets/img/powerpoint.png +0 -0
  9. package/dist/assets/img/zip.png +0 -0
  10. package/dist/components/Calendar.js +15 -0
  11. package/dist/components/DataGrid.js +1 -3
  12. package/dist/components/FileThumb.js +1 -1
  13. package/dist/components/Icon.js +8 -0
  14. package/dist/components/SocketManager.js +1 -1
  15. package/dist/components/Toolbar.js +1 -0
  16. package/dist/components/Tree.js +2 -2
  17. package/dist/components/dashboard/BasicBusinessAppDashboard.js +19 -2
  18. package/dist/components/form/FieldSet.js +1 -1
  19. package/dist/components/form/Form.js +1 -2
  20. package/dist/components/form/ImageEditor.js +4 -4
  21. package/dist/components/form/SelectItem.js +1 -1
  22. package/dist/components/form/TransferList.js +1 -1
  23. package/dist/components/layout/VC.css +9 -0
  24. package/dist/components/layout/View.css +8 -0
  25. package/dist/components/layout/Window.js +63 -8
  26. package/dist/components/layout/WindowViewPort.js +41 -2
  27. package/dist/components/media/Toolbar.css +24 -3
  28. package/dist/components/media/Toolbar.js +77 -81
  29. package/dist/components/media/TrainingRoom.js +82 -12
  30. package/dist/components/media/VCEventType.js +5 -1
  31. package/dist/components/media/VCRoomParticipant.css +9 -2
  32. package/dist/components/media/VCRoomParticipant.js +2 -4
  33. package/dist/components/media/VCRoomWorkspace.css +14 -0
  34. package/dist/components/media/VCRoomWorkspace.js +71 -48
  35. package/dist/components/signatures/SignatureTemplateDesigner.js +1 -1
  36. package/dist/event/ServiceCallActionHandler.js +1 -7
  37. package/dist/js/Media.js +43 -39
  38. package/dist/view/security/ChangePasswordBasic.js +1 -1
  39. package/dist/view/security/LoginBasic.js +1 -1
  40. package/dist/view/security/Security.js +1 -0
  41. package/package.json +1 -1
package/dist/RestUtils.js CHANGED
@@ -26,9 +26,7 @@ const status = response => {
26
26
  if (response.ok) {
27
27
  return Promise.resolve(response);
28
28
  } else {
29
- let error = new Error(response.statusText);
30
- error.code = response.status;
31
- return Promise.reject(error);
29
+ return Promise.reject(response);
32
30
  }
33
31
  };
34
32
 
@@ -141,21 +139,17 @@ class RestUtils {
141
139
  if (requestBody !== null || service.method === 'POST') {
142
140
  console.log("POSTING REST REQUEST BODY : ", requestBody);
143
141
  postData(url, response => {
144
- if (!_Utils.default.isNull(response) && response.dataType === 'message' && response.messageType === 'ERROR') {
145
- this.fireEvent(viewId, component, _EventType.default.SERVICE_CALL_FAILURE);
146
- } else {
147
- if (!_Utils.default.isNull(successCallback)) {
148
- this.processSuccessfulResponseData(component, response, successCallback, viewId, successMessage);
149
- }
150
-
151
- let path = _Utils.default.getPropertyChainPath(returnValueBinding);
142
+ if (!_Utils.default.isNull(successCallback)) {
143
+ this.processSuccessfulResponseData(component, response, successCallback, viewId, successMessage);
144
+ }
152
145
 
153
- if (!_Utils.default.isNull(path.valueObject) && !_Utils.default.isNull(path.property)) {
154
- path.valueObject[path.property] = response;
155
- }
146
+ let path = _Utils.default.getPropertyChainPath(returnValueBinding);
156
147
 
157
- this.fireEvent(viewId, component, _EventType.default.SERVICE_CALL_SUCCESS, response);
148
+ if (!_Utils.default.isNull(path.valueObject) && !_Utils.default.isNull(path.property)) {
149
+ path.valueObject[path.property] = response;
158
150
  }
151
+
152
+ this.fireEvent(viewId, component, _EventType.default.SERVICE_CALL_SUCCESS, response);
159
153
  }, e => {
160
154
  if (!_Utils.default.isNull(errorCallback)) {
161
155
  errorCallback(e);
@@ -212,13 +206,8 @@ class RestUtils {
212
206
  let val = _ApplicationManager.default.resolveParameterValue(parameterConfig, event ? event.data : null);
213
207
 
214
208
  if (!_Utils.default.isNull(val)) {
215
- parameter.value = val.value; // TODO : Make the default object type a library setting
216
-
217
- if (val.type === 'object') {
218
- parameter.type = 'MapObject';
219
- } else {
220
- parameter.type = val.type;
221
- }
209
+ parameter.value = val.value;
210
+ parameter.type = val.type;
222
211
  }
223
212
 
224
213
  if (typeof parameter.value === 'undefined') {
@@ -247,23 +236,13 @@ class RestUtils {
247
236
  let path = _Utils.default.getPropertyChainPath(returnValueBinding);
248
237
 
249
238
  if (!_Utils.default.isNull(path.valueObject) && !_Utils.default.isNull(path.property)) {
250
- path.valueObject[path.property] = response.data;
239
+ path.valueObject[path.property] = response;
251
240
  }
252
241
 
253
- let responseData = !_Utils.default.isNull(response) ? response.data : null;
254
-
255
- if (!_Utils.default.isNull(responseData) && response.dataType === 'message' && responseData.messageType === 'ERROR') {
256
- this.fireEvent(viewId, component, _EventType.default.SERVICE_CALL_FAILURE, responseData);
242
+ this.fireEvent(viewId, component, _EventType.default.SERVICE_CALL_SUCCESS, response.data);
257
243
 
258
- if (errorCallback !== null) {
259
- errorCallback(response);
260
- }
261
- } else {
262
- this.fireEvent(viewId, component, _EventType.default.SERVICE_CALL_SUCCESS, response.data);
263
-
264
- if (successCallback !== null) {
265
- successCallback(response);
266
- }
244
+ if (successCallback !== null) {
245
+ successCallback(response);
267
246
  }
268
247
  }
269
248
  }, e => {
@@ -346,7 +325,7 @@ class RestUtils {
346
325
  }).catch(e => {
347
326
  console.error(e);
348
327
 
349
- if (e.code === 401 && !url.endsWith('/logout')) {
328
+ if (e.status === 401 && !url.endsWith('/logout')) {
350
329
  errorCallback(e);
351
330
 
352
331
  _ApplicationManager.default.clear();
package/dist/Utils.js CHANGED
@@ -404,7 +404,16 @@ _defineProperty(Utils, "mergeStyles", (defaultStyle, config) => {
404
404
  return defaultStyle;
405
405
  });
406
406
 
407
- _defineProperty(Utils, "publishErrorMessage", (messageText, viewId, component = null) => {
407
+ _defineProperty(Utils, "publishErrorMessage", async (e, viewId, component = null) => {
408
+ let messageText;
409
+
410
+ if (e.json) {
411
+ let data = await e.json();
412
+ messageText = data.message;
413
+ } else {
414
+ messageText = Utils.SYSTEM_ERROR_MESSAGE;
415
+ }
416
+
408
417
  let message = {
409
418
  messageType: 'ERROR',
410
419
  message: messageText
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -111,6 +111,7 @@ const Calendar = props => {
111
111
  const dialogRef = (0, _react.useRef)(null);
112
112
  const [dialogTop, setDialogTop] = (0, _react.useState)(null);
113
113
  const [dialogLeft, setDialogLeft] = (0, _react.useState)(null);
114
+ const [refresher, setRefresher] = (0, _react.useState)(null);
114
115
  const StyledDialog = (0, _withStyles.default)({
115
116
  root: {
116
117
  pointerEvents: "none"
@@ -147,6 +148,20 @@ const Calendar = props => {
147
148
 
148
149
  (0, _react.useEffect)(() => {
149
150
  loadEvents();
151
+
152
+ _ApplicationManager.default.addApplicationContextSubscription({
153
+ handler: {
154
+ get id() {
155
+ return 'window';
156
+ },
157
+
158
+ onContextChange: (context, newValues) => {
159
+ if (Object.keys(newValues).find(key => key === 'windowDisplayState')) {
160
+ setRefresher(!refresher);
161
+ }
162
+ }
163
+ }
164
+ });
150
165
  }, []);
151
166
 
152
167
  const calenderScrollListener = () => {
@@ -499,9 +499,7 @@ const DataGrid = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.default.f
499
499
  let data = serviceType === 'rpc' ? result.data : result;
500
500
  processData(data, conf);
501
501
  }, e => {
502
- console.error(e);
503
-
504
- _Utils.default.publishSystemErrorMessage(props.viewId);
502
+ console.error(e); //Utils.publishSystemErrorMessage(props.viewId);
505
503
  });
506
504
  } else {
507
505
  throw new Error('Unknown service type : ' + serviceType);
@@ -117,7 +117,7 @@ const FileThumb = props => {
117
117
  backgroundSize: 'contain',
118
118
  backgroundPosition: 'center',
119
119
  backgroundColor: 'transparent',
120
- backgroundImage: isImage() ? "url(".concat(file.repositoryId ? downloadUrl : file.payload, ")") : "url(".concat(require('../../assets/img/' + getThumbImage()), ")")
120
+ backgroundImage: isImage() ? "url(".concat(file.repositoryId ? downloadUrl : file.payload, ")") : "url(".concat(require('../assets/img/' + getThumbImage()), ")")
121
121
  }
122
122
  })));
123
123
  };
@@ -69,6 +69,8 @@ var _MicOff = _interopRequireDefault(require("@material-ui/icons/MicOff"));
69
69
 
70
70
  var _CallEnd = _interopRequireDefault(require("@material-ui/icons/CallEnd"));
71
71
 
72
+ var _Dock = _interopRequireDefault(require("@material-ui/icons/Dock"));
73
+
72
74
  var _icons = require("@material-ui/icons");
73
75
 
74
76
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
@@ -195,6 +197,12 @@ class Icon extends _react.Component {
195
197
  color: this.props.color
196
198
  }
197
199
  });
200
+ } else if (this.props.id === 'DOCK') {
201
+ return /*#__PURE__*/_react.default.createElement(_Dock.default, {
202
+ style: {
203
+ color: this.props.color
204
+ }
205
+ });
198
206
  } else if (this.props.id === 'CAMERA_OFF') {
199
207
  return /*#__PURE__*/_react.default.createElement(_VideocamOff.default, {
200
208
  style: {
@@ -126,7 +126,7 @@ class SocketManager {
126
126
  }
127
127
 
128
128
  registerOnline() {
129
- (0, _RestUtils.sendRequest)(_RestUtils.location + _ApplicationManager.default.getContextRoot() + '/auth/api/v1/user/admin/find', response => {
129
+ (0, _RestUtils.sendRequest)(_RestUtils.location + _ApplicationManager.default.getContextRoot() + '/auth/api/v1/user/find', response => {
130
130
  this.profile = response.profile;
131
131
  this.emitEvent(_SocketRequest.default.REGISTER_ONLINE, {
132
132
  user: {
@@ -96,6 +96,7 @@ const Toolbar = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
96
96
  minWidth: item.type === 'toolbarSpacer' ? '2' : _Utils.default.isNull(item.attributes) || _Utils.default.isNull(item.attributes['label']) ? '60px' : null,
97
97
  marginLeft: item.type === 'toolbarSpacer' ? '4px' : 0,
98
98
  marginRight: 4,
99
+ marginBottom: 4,
99
100
  marginTop: item.type === 'toolbarSpacer' ? '6px' : 0
100
101
  };
101
102
  }
@@ -163,12 +163,12 @@ const Tree = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
163
163
  } catch (e) {
164
164
  console.error(e);
165
165
 
166
- _Utils.default.publishSystemErrorMessage(props.viewId);
166
+ _Utils.default.publishErrorMessage(e, props.viewId);
167
167
  }
168
168
  }, e => {
169
169
  props.console.error(e);
170
170
 
171
- _Utils.default.publishSystemErrorMessage(props.viewId);
171
+ _Utils.default.publishErrorMessage(e, props.viewId);
172
172
  }, parameter => {});
173
173
  } else if (!_Utils.default.isNull(componentConfig.value)) {
174
174
  let value = _ApplicationManager.default.isExpression(componentConfig.value) ? _ApplicationManager.default.resolveExpressionValue(componentConfig.value) : componentConfig.value;
@@ -64,6 +64,8 @@ const BasicBusinessAppDashboard = props => {
64
64
 
65
65
  const [opacity, setOpacity] = _react.default.useState(0);
66
66
 
67
+ const [windowPinned, setWindowPinned] = _react.default.useState(false);
68
+
67
69
  const dispatch = (0, _reactRedux.useDispatch)();
68
70
 
69
71
  const handleChangeRequestNavDrawer = () => {
@@ -351,8 +353,23 @@ const BasicBusinessAppDashboard = props => {
351
353
  toggleSidebar: toggleSidebar,
352
354
  logoutCallBack: props.logoutCallBack
353
355
  })), ' ', /*#__PURE__*/_react.default.createElement("div", {
354
- className: "content"
355
- }, /*#__PURE__*/_react.default.createElement(_ViewPort.default, null), /*#__PURE__*/_react.default.createElement(_WindowViewPort.default, null))), ' '));
356
+ className: "content w-100 h-100"
357
+ }, /*#__PURE__*/_react.default.createElement("div", {
358
+ className: "content w-100 h-100 row no-margin no-padding"
359
+ }, /*#__PURE__*/_react.default.createElement("div", {
360
+ style: {
361
+ width: windowPinned ? 'calc(100% - 320px)' : '100%'
362
+ }
363
+ }, /*#__PURE__*/_react.default.createElement(_ViewPort.default, null)), /*#__PURE__*/_react.default.createElement("div", {
364
+ className: 'col no-margin no-padding',
365
+ style: {
366
+ width: windowPinned ? '320px' : '0'
367
+ }
368
+ }, /*#__PURE__*/_react.default.createElement(_WindowViewPort.default, {
369
+ stateChangeHandler: state => {
370
+ setWindowPinned(state.pinned);
371
+ }
372
+ }))))), ' '));
356
373
  };
357
374
 
358
375
  BasicBusinessAppDashboard.propTypes = {
@@ -453,7 +453,7 @@ const FieldSet = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.default.f
453
453
  }, e => {
454
454
  props.console.error(e);
455
455
 
456
- _Utils.default.publishSystemErrorMessage(props.viewId);
456
+ _Utils.default.publishErrorMessage(e, props.viewId);
457
457
  }, parameter => {});
458
458
  return true;
459
459
  }
@@ -172,7 +172,6 @@ const Form = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.default.forwa
172
172
  let fieldValid = field.handle.api.validate(values.current, null);
173
173
 
174
174
  if (fieldValid === false) {
175
- console.log("INVALID : " + field.id);
176
175
  doValidateParent(field, !fieldValid, false);
177
176
  valid = false;
178
177
  } else if (valid) {
@@ -298,7 +297,7 @@ const Form = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.default.forwa
298
297
  }, e => {
299
298
  console.error(e);
300
299
 
301
- _Utils.default.publishSystemErrorMessage(props.viewId);
300
+ _Utils.default.publishErrorMessage(e, props.viewId);
302
301
  }, parameter => {
303
302
  loadingRef.current = false;
304
303
  handleDataArrived(null);
@@ -362,13 +362,13 @@ exports.ImageEditorComponent = ImageEditorComponent;
362
362
  const ImageEditor = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.default.forwardRef((props, ref) => {
363
363
  const [file, setFile] = _react.default.useState(null);
364
364
 
365
- const [clearTrigger, setClearTrigger] = _react.default.useState(false);
365
+ const clearTrigger = _react.default.useRef(false);
366
366
 
367
367
  return /*#__PURE__*/_react.default.createElement(_BaseField.BaseField, _extends({}, props, {
368
368
  handle: props.handle,
369
369
  valueParser: (value, inbound) => {
370
370
  if (inbound) {
371
- setClearTrigger(!clearTrigger);
371
+ clearTrigger.current = !clearTrigger.current;
372
372
 
373
373
  if (!_Utils.default.isNull(value)) {
374
374
  let val = value; // TODO : Support multiple file upload
@@ -412,14 +412,14 @@ const ImageEditor = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.defaul
412
412
  },
413
413
  valueChangeCallback: value => {
414
414
  if (_Utils.default.isNull(value)) {
415
- setClearTrigger(!clearTrigger);
415
+ clearTrigger.current = !clearTrigger.current;
416
416
  }
417
417
  }
418
418
  }), base => /*#__PURE__*/_react.default.createElement(ImageEditorComponent, _extends({
419
419
  ref: ref,
420
420
  base: base,
421
421
  initialFile: file,
422
- clearTrigger: clearTrigger
422
+ clearTrigger: clearTrigger.current
423
423
  }, props)));
424
424
  }));
425
425
 
@@ -67,7 +67,7 @@ const SelectItemComponent = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_reac
67
67
  }, e => {
68
68
  console.error(e);
69
69
 
70
- _Utils.default.publishSystemErrorMessage(props.viewId);
70
+ _Utils.default.publishErrorMessage(e, props.viewId);
71
71
  });
72
72
  setOptionsLoaded(true);
73
73
  }
@@ -214,7 +214,7 @@ const TransferList = /*#__PURE__*/_react.default.memo( /*#__PURE__*/_react.defau
214
214
  }, e => {
215
215
  console.error(e);
216
216
 
217
- _Utils.default.publishSystemErrorMessage(props.viewId);
217
+ _Utils.default.publishErrorMessage(e, props.viewId);
218
218
 
219
219
  reject(e);
220
220
  });
@@ -15,3 +15,12 @@
15
15
  width: 500px !important;
16
16
  height: 400px !important;
17
17
  }
18
+
19
+ .window-pinned .av-settings-container {
20
+ width: 240px !important;
21
+ height: 700px !important;
22
+ }
23
+
24
+ .window-pinned .av-settings-container .user-video {
25
+ min-width: 220px !important;
26
+ }
@@ -4,6 +4,14 @@
4
4
  border-radius: 4px;
5
5
  }
6
6
 
7
+ .window-unpinned .view {
8
+ width: 0 !important;;
9
+ }
10
+
11
+ .window-pinned .view {
12
+ padding: 0 8px;
13
+ }
14
+
7
15
  .no-margin {
8
16
  margin-left: 0 !important;
9
17
  margin-right: 0 !important;
@@ -130,8 +130,10 @@ const Window = props => {
130
130
 
131
131
  if (newValues.windowDisplayState === 'MAXIMIZED') {
132
132
  maximizeView(null, false);
133
- } else {
133
+ } else if (newValues.windowDisplayState === 'MINIMIZED') {
134
134
  minimizeView(null, false);
135
+ } else {
136
+ pinView(null, false);
135
137
  }
136
138
  }
137
139
  }
@@ -139,12 +141,16 @@ const Window = props => {
139
141
  }).then(initialContext => {
140
142
  setDisplayState(initialContext ? initialContext.windowDisplayState : 'MAXIMIZED');
141
143
  });
144
+
145
+ return () => {};
142
146
  }, []);
143
147
  (0, _react.useEffect)(() => {
144
148
  if (displayState === 'MAXIMIZED') {
145
149
  maximizeView(null);
146
- } else {
150
+ } else if (displayState === 'MINIMIZED') {
147
151
  minimizeView(null);
152
+ } else {
153
+ pinView(null);
148
154
  }
149
155
  }, [displayState]);
150
156
 
@@ -168,6 +174,41 @@ const Window = props => {
168
174
  };
169
175
  };
170
176
 
177
+ const getPinnedStyle = () => {
178
+ return {
179
+ transform: 'translate(0, 0)',
180
+ backgroundColor: '#FFFFFF',
181
+ width: '320px',
182
+ height: 'calc(100% - 88px)',
183
+ margin: '8px'
184
+ };
185
+ };
186
+
187
+ const pinView = (e, updateContext = true) => {
188
+ if (props.pinnable) {
189
+ let paper = document.getElementById('meetingDialogPaper');
190
+
191
+ if (paper) {
192
+ if (windowTransformValue) {
193
+ paper.style.transform = windowTransformValue;
194
+ }
195
+
196
+ paper.style.width = '320px';
197
+ paper.style.height = 'calc(100% - 88px)';
198
+ paper.style.boxShadow = 'unset';
199
+ let header = document.getElementsByClassName('dialogHeader')[0];
200
+ header.getElementsByTagName('button')[0].style.color = '#000000';
201
+ setDisplayState('PINNED');
202
+
203
+ if (updateContext) {
204
+ _ApplicationManager.default.updateContext({
205
+ windowDisplayState: 'PINNED'
206
+ });
207
+ }
208
+ }
209
+ }
210
+ };
211
+
171
212
  const minimizeView = (e, updateContext = true) => {
172
213
  if (minimizable) {
173
214
  let paper = document.getElementById('meetingDialogPaper');
@@ -224,7 +265,7 @@ const Window = props => {
224
265
  }
225
266
  };
226
267
 
227
- return /*#__PURE__*/_react.default.createElement("div", {
268
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
228
269
  style: {
229
270
  width: '100%',
230
271
  height: '100%',
@@ -237,7 +278,9 @@ const Window = props => {
237
278
  }, /*#__PURE__*/_react.default.createElement(StyledDialog, {
238
279
  disableEnforceFocus: true,
239
280
  open: open,
240
- onClose: e => {},
281
+ onClose: e => {
282
+ props.onClose();
283
+ },
241
284
  keepMounted: true,
242
285
  hideBackdrop: true,
243
286
  "aria-labelledby": "meeting-window-title",
@@ -247,12 +290,15 @@ const Window = props => {
247
290
  PaperProps: {
248
291
  id: 'meetingDialogPaper',
249
292
  disabled: displayState === 'MAXIMIZED',
250
- style: displayState === 'MINIMIZED' ? getMinimizedStyle() : getMaximizedStyle
293
+ style: displayState === 'MINIMIZED' ? getMinimizedStyle() : displayState === 'MAXIMIZED' ? getMaximizedStyle() : getMinimizedStyle()
251
294
  }
295
+ }, /*#__PURE__*/_react.default.createElement("div", {
296
+ id: 'window-content',
297
+ className: "".concat((displayState === 'PINNED' ? 'window-pinned ' : '') + 'w-100 h-100')
252
298
  }, /*#__PURE__*/_react.default.createElement("div", {
253
299
  className: 'meeting-window-header',
254
300
  id: "meeting-window-header"
255
- }, /*#__PURE__*/_react.default.createElement("div", null, minimizable && displayState && /*#__PURE__*/_react.default.createElement("div", {
301
+ }, /*#__PURE__*/_react.default.createElement("div", null, displayState && /*#__PURE__*/_react.default.createElement("div", {
256
302
  style: {
257
303
  width: '48px',
258
304
  height: '48px',
@@ -262,7 +308,7 @@ const Window = props => {
262
308
  }
263
309
  }, /*#__PURE__*/_react.default.createElement("div", {
264
310
  className: 'dialogHeader row'
265
- }, /*#__PURE__*/_react.default.createElement("div", null, displayState === 'MAXIMIZED' ? /*#__PURE__*/_react.default.createElement(_IconButton.default, {
311
+ }, minimizable && /*#__PURE__*/_react.default.createElement("div", null, displayState === 'MAXIMIZED' ? /*#__PURE__*/_react.default.createElement(_IconButton.default, {
266
312
  onClick: e => {
267
313
  minimizeView(e);
268
314
  },
@@ -280,7 +326,16 @@ const Window = props => {
280
326
  }
281
327
  }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
282
328
  id: 'MAXIMIZE'
283
- }))))))), children));
329
+ }))), props.pinnable && /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_IconButton.default, {
330
+ onClick: e => {
331
+ props.onPin();
332
+ },
333
+ style: {
334
+ marginRight: '4px'
335
+ }
336
+ }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
337
+ id: 'DOCK'
338
+ }))))))), children))));
284
339
  };
285
340
 
286
341
  var _default = Window;
@@ -17,6 +17,10 @@ var _Observable = _interopRequireDefault(require("../../event/Observable"));
17
17
 
18
18
  var _ApplicationManager = _interopRequireDefault(require("../../ApplicationManager"));
19
19
 
20
+ var _Icon = _interopRequireDefault(require("../Icon"));
21
+
22
+ var _IconButton = _interopRequireDefault(require("@material-ui/core/IconButton"));
23
+
20
24
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
25
 
22
26
  function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
@@ -26,11 +30,14 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj;
26
30
  const WindowViewContainer = props => {
27
31
  const [view, setView] = _react.default.useState(null);
28
32
 
33
+ const [pinned, setPinned] = _react.default.useState(false);
34
+
29
35
  function loadView(context) {
30
36
  if (context) {
31
37
  if (Object.keys(context).find(key => key === 'windowView')) {
32
38
  setView(null);
33
39
  setView(context.windowView);
40
+ setPinned(false);
34
41
  }
35
42
  }
36
43
  }
@@ -51,16 +58,48 @@ const WindowViewContainer = props => {
51
58
  });
52
59
  }, []);
53
60
 
61
+ _react.default.useEffect(() => {
62
+ props.stateChangeHandler({
63
+ pinned
64
+ });
65
+ }, [pinned]);
66
+
54
67
  const renderView = () => {
55
68
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, view && /*#__PURE__*/_react.default.createElement(_Window.default, {
56
- minimizable: true,
69
+ pinnable: true,
70
+ minimizable: false,
57
71
  open: true,
58
- displayState: 'MAXIMIZED'
72
+ displayState: 'MAXIMIZED',
73
+ onPin: () => {
74
+ _ApplicationManager.default.updateContext({
75
+ windowDisplayState: pinned ? 'MAXIMIZED' : 'PINNED'
76
+ });
77
+
78
+ setPinned(!pinned);
79
+ },
80
+ onClose: () => {//setPinned(false)
81
+ }
59
82
  }, /*#__PURE__*/_react.default.createElement(_View.View, {
60
83
  config: view.config,
61
84
  parameters: view.parameters,
62
85
  ref: /*#__PURE__*/_react.default.createRef(),
63
86
  handle: view.handle
87
+ })), view && pinned && /*#__PURE__*/_react.default.createElement(_IconButton.default, {
88
+ onClick: e => {
89
+ _ApplicationManager.default.updateContext({
90
+ windowDisplayState: 'MAXIMIZED'
91
+ });
92
+
93
+ setPinned(false);
94
+ },
95
+ style: {
96
+ marginRight: '8px',
97
+ position: 'absolute',
98
+ right: 0,
99
+ top: 0
100
+ }
101
+ }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
102
+ id: 'DOCK'
64
103
  })));
65
104
  };
66
105
 
@@ -1,7 +1,25 @@
1
1
 
2
- .vc-toolbar button {
3
- min-width: 80px;
4
- width: 80px;
2
+ .vc-toolbar .button-container {
3
+ min-width: 200px;
4
+ overflow: hidden;
5
+ margin-left: 8px;
6
+ }
7
+
8
+ .window-pinned .vc-toolbar .timer {
9
+ width: 100% !important;
10
+ text-align: center !important;
11
+ }
12
+
13
+ .vc-toolbar button,
14
+ .vc-toolbar .button-wrapper {
15
+ min-width: 88px;
16
+ width: 88px;
17
+ }
18
+
19
+ .vc-toolbar .hang-up,
20
+ .vc-toolbar .hang-up button {
21
+ min-width: 120px;
22
+ width: 120px;
5
23
  }
6
24
 
7
25
  .vc-toolbar button .icon,
@@ -32,4 +50,7 @@
32
50
  color: #404239;
33
51
  background-color: #e9e9e9;
34
52
  font-size: 14px;
53
+ position: absolute;
54
+ margin-left: -56px;
55
+ margin-bottom: 16px;
35
56
  }