@agilemotion/oui-react-js 1.8.45 → 1.8.47

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.
@@ -1,4 +1,5 @@
1
1
  .oui button {
2
2
  margin-right: 4px !important;
3
- height: 40px;
3
+ min-height: 40px;
4
+ max-height: 60px;
4
5
  }
@@ -76,6 +76,12 @@ const DocumentTemplateDesigner = props => {
76
76
  },
77
77
  set loading(val) {
78
78
  setLoading(val);
79
+ },
80
+ getDocumentValue: async () => {
81
+ if (templateDesignerHandle.api) {
82
+ return await templateDesignerHandle.api.getValue();
83
+ }
84
+ return null;
79
85
  }
80
86
  };
81
87
  };
@@ -475,6 +475,22 @@ const DocumentTemplateDesignerComponent = props => {
475
475
  container.documentEditor.search.find(selectedPropertyRows[0].placeHolder);
476
476
  }
477
477
  };
478
+ const saveAsBase64 = async () => {
479
+ if (props.allowUnresolvedChanges === false && container.documentEditor.revisions.length > 0) {
480
+ setErrorMessage("Please accept or reject all suggested changes");
481
+ return null;
482
+ }
483
+ if (container) {
484
+ container.documentEditor.editor.stopProtection("password");
485
+ let blob = await container.documentEditor.saveAsBlob('Docx');
486
+ if (props.commentsOnly) {
487
+ container.documentEditor.editor.enforceProtection('password', 'CommentsOnly');
488
+ }
489
+ return new File([blob], props.file?.name ? props.file.name : 'document.docx', {
490
+ type: props.file?.type ? props.file.type : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
491
+ });
492
+ }
493
+ };
478
494
  const api = () => {
479
495
  return {
480
496
  get id() {
@@ -482,6 +498,9 @@ const DocumentTemplateDesignerComponent = props => {
482
498
  },
483
499
  highlightSelection: selectedPropertyRow => {
484
500
  doHighlightSelection(selectedPropertyRow);
501
+ },
502
+ getValue: () => {
503
+ return saveAsBase64();
485
504
  }
486
505
  };
487
506
  };
@@ -1,9 +1,28 @@
1
+ /* container that holds ALL steps */
2
+ .stepper-container {
3
+ display: flex;
4
+ flex-wrap: wrap; /* allow wrapping */
5
+ width: 100%; /* small space between steps */
6
+ }
7
+
8
+ /* each single step wrapper (the thing we flex) */
9
+ .step-item {
10
+ flex: 0 1 180px; /* target width */
11
+ min-width: 140px; /* don’t go too small */
12
+ max-width: 240px; /* don’t go too wide */
13
+ padding-top: 8px;
14
+ }
15
+
16
+ /* original classes kept */
1
17
  .step,
2
18
  .stepActive,
3
19
  .stepVisited {
4
20
  }
5
21
 
6
- .box, .box-pending, .dot {
22
+ /* pill + dot box */
23
+ .box,
24
+ .box-pending,
25
+ .dot {
7
26
  border-radius: 100px;
8
27
  text-align: center;
9
28
  font-size: 14px;
@@ -11,6 +30,12 @@
11
30
  border: 1px solid #888888;
12
31
  display: flex;
13
32
  justify-content: center;
33
+ align-items: center;
34
+ }
35
+
36
+ .box,
37
+ .box-pending {
38
+ width: calc(100% - 16px);
14
39
  }
15
40
 
16
41
  .box-pending {
@@ -18,6 +43,11 @@
18
43
  border-right: 1px solid #888888;
19
44
  border-top: 1px solid #888888;
20
45
  border-bottom: 1px solid #888888;
46
+ justify-content: flex-start;
47
+ }
48
+
49
+ .first-box {
50
+ width: 100%;
21
51
  }
22
52
 
23
53
  .line {
@@ -32,7 +62,23 @@
32
62
  float: left;
33
63
  }
34
64
 
35
- .stepVisited .firstBox {
65
+ .dash {
66
+ width: 16px;
67
+ display: flex;
68
+ align-items: center;
69
+ }
70
+
71
+ .dash div {
72
+ border-bottom: 1px solid #888888;
73
+ width: 16px;
74
+ }
75
+
76
+ .boxWrapper,
77
+ .firstBoxWrapper {
78
+ border: 1px solid green;
79
+ }
80
+
81
+ .stepVisited .firstBoxWrapper {
36
82
  margin-left: calc(50% - 15px);
37
83
  }
38
84
 
@@ -40,23 +86,31 @@
40
86
  border: none;
41
87
  }
42
88
 
43
- .stepActive .box {
44
- }
45
-
46
89
  .dot {
47
- width: 30px;
90
+ max-width: 30px;
91
+ min-width: 30px;
48
92
  height: 30px;
49
93
  font-size: 18px;
94
+ border-radius: 50%;
50
95
  }
51
96
 
97
+ /* active step dot */
52
98
  .stepActive .dot {
53
99
  color: #000000;
54
100
  border-color: #ffffff;
55
101
  }
56
102
 
57
- .stepVisited .dot {
103
+ /* the label text inside the step */
104
+ .step-title {
105
+ margin: 0 4px;
106
+ max-width: 140px;
107
+ overflow: hidden;
108
+ text-overflow: ellipsis;
109
+ white-space: nowrap;
110
+ align-self: center;
58
111
  }
59
112
 
113
+ /* lines (your old ones) */
60
114
  .leftLine,
61
115
  .rightLine {
62
116
  border-bottom: 1px solid;
@@ -101,4 +155,4 @@
101
155
  border-bottom-right-radius: 100px;
102
156
  padding: 2px 8px;
103
157
  font-weight: 600;
104
- }
158
+ }
@@ -10,6 +10,7 @@ var _ApplicationManager = _interopRequireDefault(require("../ApplicationManager"
10
10
  var _Observable = _interopRequireDefault(require("../event/Observable"));
11
11
  var _EventType = _interopRequireDefault(require("../event/EventType"));
12
12
  var _styles = require("@mui/styles");
13
+ var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
13
14
  require("./StepperTitleBar.css");
14
15
  var _jquery = _interopRequireDefault(require("jquery"));
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -31,17 +32,12 @@ const StepperTitleBar = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.def
31
32
  const [visible, setVisible] = _react.default.useState(false);
32
33
  const [activeSegmentPercentage, setActiveSegmentPercentage] = _react.default.useState(null);
33
34
  const currentIndex = _react.default.useRef(null);
34
- let keyCounter = 0;
35
- let counter = 0;
36
- let graphicsCounter = 0;
37
35
  const classes = useStyles();
36
+
37
+ // re-attach API on each render
38
38
  _react.default.useEffect(() => {
39
39
  props.handle.api = api();
40
- recalcLinePosition();
41
40
  });
42
- _react.default.useLayoutEffect(() => {
43
- recalcLinePosition();
44
- }, []);
45
41
  _react.default.useEffect(() => {
46
42
  let parsedConfig = _Utils.default.parseConfig(props.config, props.viewId);
47
43
  let eventHandlingConfig = _Utils.default.isNull(parsedConfig.eventHandlingConfig) ? {} : parsedConfig.eventHandlingConfig;
@@ -67,18 +63,37 @@ const StepperTitleBar = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.def
67
63
  recalcLinePosition();
68
64
  }, []);
69
65
  const recalcLinePosition = () => {
70
- let titleDiv = (0, _jquery.default)("#titleDiv");
71
- let step = (0, _jquery.default)("#step-container-" + currentIndex.current);
72
- if (currentIndex.current !== null && !_Utils.default.isNull(step.width())) {
73
- let titleWidth = titleDiv.width() + 46;
66
+ // Your old logic depended on single-row layout and a single #titleDiv
67
+ // Now that we allow wrapping, we guard this so it doesn't break.
68
+ if (currentIndex.current == null) return;
69
+ const stepEl = (0, _jquery.default)("#step-container-" + currentIndex.current);
70
+ if (!stepEl || stepEl.length === 0) return;
71
+ const stepTop = stepEl.offset().top;
72
+ const firstTop = (0, _jquery.default)("#step-container-0").offset()?.top;
73
+
74
+ // if wrapped to multiple rows, skip line math (each item already has its own line segment)
75
+ if (firstTop != null && stepTop !== firstTop) {
74
76
  (0, _jquery.default)(".stepActive .rightLine").css({
75
- 'margin-left': currentIndex.current === 0 ? titleWidth : titleWidth / 2 + step.width() / 2 - 2 + 'px',
76
- 'width': currentIndex.current === 0 ? step.width() - titleWidth + 2 : step.width() / 2 - titleWidth / 2 + 'px'
77
+ width: 0
77
78
  });
78
79
  (0, _jquery.default)(".stepActive .leftLine").css({
79
- 'width': step.width() / 2 - titleWidth / 2 + 'px'
80
+ width: 0
80
81
  });
82
+ return;
81
83
  }
84
+
85
+ // if still on one row, we can keep the old logic roughly
86
+ const stepWidth = stepEl.width();
87
+ if (!stepWidth) return;
88
+ const activeBox = stepEl.find(".box, .box-pending").first();
89
+ const titleWidth = activeBox.width();
90
+ (0, _jquery.default)(".stepActive .rightLine").css({
91
+ 'margin-left': titleWidth / 2 + 'px',
92
+ 'width': stepWidth - titleWidth + 'px'
93
+ });
94
+ (0, _jquery.default)(".stepActive .leftLine").css({
95
+ 'width': (stepWidth - titleWidth) / 2 + 'px'
96
+ });
82
97
  };
83
98
  const api = () => {
84
99
  return {
@@ -97,7 +112,6 @@ const StepperTitleBar = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.def
97
112
  },
98
113
  show() {
99
114
  let graph;
100
- let graphs = [];
101
115
  let view = _ApplicationManager.default.getView(props.viewId);
102
116
  if (view) {
103
117
  for (const key of Object.keys(_ApplicationManager.default.viewContext)) {
@@ -114,86 +128,68 @@ const StepperTitleBar = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.def
114
128
  setSteps(steps);
115
129
  currentIndex.current = graph.getCurrentNodeIndex();
116
130
  setActiveSegmentPercentage(100 - 10 * (steps.length - 1));
131
+ // recalc after render
132
+ setTimeout(() => recalcLinePosition(), 0);
117
133
  }
118
134
  }
119
135
  };
120
136
  };
121
- function renderStep(step) {
137
+ function renderStep(step, graphicsCounter, totalSteps) {
138
+ const isActive = graphicsCounter === currentIndex.current;
139
+ const isVisited = graphicsCounter < currentIndex.current;
140
+ const isLast = graphicsCounter === totalSteps - 1;
122
141
  return /*#__PURE__*/_react.default.createElement("div", {
123
- className: graphicsCounter === currentIndex.current ? `stepActive` : graphicsCounter < currentIndex.current ? 'stepVisited' : 'step'
142
+ className: isActive ? `stepActive` : isVisited ? 'stepVisited' : 'step'
124
143
  }, graphicsCounter > 0 ? /*#__PURE__*/_react.default.createElement("div", {
125
- className: (graphicsCounter <= currentIndex.current ? `${classes.themeBorder} ` : '') + '' + (graphicsCounter === steps.length - 1 ? ' lastLine' : '')
144
+ className: (graphicsCounter <= currentIndex.current ? `${classes.themeBorder} ` : '') + (isLast ? ' lastLine' : '')
126
145
  }) : null, /*#__PURE__*/_react.default.createElement("div", {
127
- className: 'row flex-nowrap' + (graphicsCounter === 0 ? ' firstBox' : ''),
146
+ className: 'row flex-nowrap' + (graphicsCounter === 0 ? ' firstBox' : 'boxWrapper'),
128
147
  style: {
129
148
  marginLeft: 'unset',
130
149
  marginRight: 'unset',
131
150
  width: '100%'
132
151
  },
133
152
  id: 'step-' + graphicsCounter
134
- }, /*#__PURE__*/_react.default.createElement("div", {
153
+ }, step.index > 0 && /*#__PURE__*/_react.default.createElement("div", {
154
+ className: 'col-*-* dash',
155
+ style: {
156
+ color: isVisited ? '#ffffff' : null
157
+ }
158
+ }, /*#__PURE__*/_react.default.createElement("div", null)), /*#__PURE__*/_react.default.createElement("div", {
135
159
  style: {
136
160
  whiteSpace: "nowrap"
137
161
  },
138
- className: (graphicsCounter < currentIndex.current ? `${classes.secondary} box flex-nowrap` : graphicsCounter === currentIndex.current ? `${classes.primary} box` : 'box-pending') + ' row no-margin no-padding'
162
+ className: (isVisited ? `${classes.secondary} box` : isActive ? `${classes.primary} box` : 'box-pending') + ' row no-margin no-padding flex-nowrap' + (step.index === 0 ? ' first-box' : '')
139
163
  }, /*#__PURE__*/_react.default.createElement("div", {
140
164
  className: 'dot col-*-*',
141
165
  style: {
142
- color: graphicsCounter < currentIndex.current ? '#ffffff' : null
166
+ color: isVisited ? '#ffffff' : null
143
167
  }
144
- }, step.index + 1), graphicsCounter <= currentIndex.current ? /*#__PURE__*/_react.default.createElement("div", {
145
- className: `col-*-*`,
146
- id: "titleDiv",
147
- style: {
148
- alignContent: 'center',
149
- color: graphicsCounter === currentIndex.current ? '#000000' : '#ffffff',
150
- margin: '0 4px'
151
- }
152
- }, step.title) : /*#__PURE__*/_react.default.createElement("div", {
153
- className: `col-*-*`,
154
- id: "titleDiv",
168
+ }, step.index + 1), /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
169
+ title: step.title
170
+ }, /*#__PURE__*/_react.default.createElement("div", {
171
+ className: "step-title",
155
172
  style: {
156
- alignContent: 'center',
157
- color: '#888888',
158
- margin: '0 4px'
173
+ color: isActive ? '#000000' : isVisited ? '#ffffff' : '#888888'
159
174
  }
160
- }, step.title)), graphicsCounter < steps.length - 1 && /*#__PURE__*/_react.default.createElement("div", {
161
- style: {
162
- flex: 1,
163
- overflow: "hidden",
164
- alignContent: 'center'
165
- },
166
- className: 'col-*-*'
167
- }, /*#__PURE__*/_react.default.createElement("div", {
168
- className: 'line'
169
- }, "\xA0"))), graphicsCounter < steps.length - 1 ? /*#__PURE__*/_react.default.createElement("div", {
170
- className: (graphicsCounter < currentIndex.current ? `${classes.themeBorder} ` : '') + '' + (graphicsCounter === 0 ? ' firstLine' : '')
171
- }) : null, graphicsCounter++ ? null : null);
175
+ }, step.title)))), !isLast ? /*#__PURE__*/_react.default.createElement("div", {
176
+ className: (graphicsCounter < currentIndex.current ? `${classes.themeBorder} ` : '') + (graphicsCounter === 0 ? ' firstLine' : '')
177
+ }) : null);
172
178
  }
173
179
  function render() {
174
180
  return /*#__PURE__*/_react.default.createElement("div", {
175
- className: "w-100 flex-nowrap",
176
- style: {
177
- display: "flex",
178
- width: "100%"
179
- }
180
- }, steps.map(step => /*#__PURE__*/_react.default.createElement("div", {
181
- align: graphicsCounter === 0 ? "left" : graphicsCounter === steps.length - 1 ? "right" : "center",
182
- key: keyCounter++,
183
- style: {
184
- whiteSpace: "nowrap",
185
- paddingTop: "8px",
186
- maxHeight: "8px",
187
- width: 100 / steps.length + "%"
188
- },
189
- id: "step-container-" + counter++
190
- }, renderStep(step))));
181
+ className: "stepper-container"
182
+ }, steps.map((step, idx) => /*#__PURE__*/_react.default.createElement("div", {
183
+ key: idx,
184
+ id: "step-container-" + idx,
185
+ className: "step-item"
186
+ }, renderStep(step, idx, steps.length))));
191
187
  }
192
188
  return /*#__PURE__*/_react.default.createElement("div", null, visible && !_Utils.default.isNull(props.config) ? /*#__PURE__*/_react.default.createElement("div", {
193
189
  style: _Utils.default.mergeStyles({
194
190
  fontSize: '24px',
195
191
  color: '#202124',
196
- padding: "0 0 32px 0",
192
+ padding: "0",
197
193
  display: 'flex',
198
194
  justifyContent: 'center',
199
195
  margin: "0 0 16px 0"
@@ -25,6 +25,7 @@ function a11yProps(index) {
25
25
  const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.forwardRef((props, ref) => {
26
26
  const [tabValue, setTabValue] = _react.default.useState(0);
27
27
  const [errors, setErrors] = _react.default.useState({});
28
+ const [visibleTabPages, setVisibleTabPages] = _react.default.useState(null);
28
29
  const [componentHandles] = _react.default.useState({});
29
30
  const handleTabChange = (event, newValue) => {
30
31
  setTabValue(newValue);
@@ -56,6 +57,21 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
56
57
  }
57
58
  });
58
59
  }
60
+ if (props.config.tabPages) {
61
+ let allVisibleTabPages = [];
62
+ for (const page of props.config.tabPages) {
63
+ if (_Utils.default.isNull(page.id)) {
64
+ page.id = index + '-tab-page';
65
+ }
66
+ let parsedConfig = _Utils.default.parseConfig(page, props.viewId);
67
+ let visible = _Utils.default.isNull(parsedConfig.visible) || _Utils.default.evaluateBooleanExpression(parsedConfig.visible, page.id);
68
+ console.log("VISIBLE : " + page.id + " = " + visible + " - " + parsedConfig.visible);
69
+ if (visible) {
70
+ allVisibleTabPages.push(page);
71
+ }
72
+ }
73
+ setVisibleTabPages(allVisibleTabPages);
74
+ }
59
75
  }, []);
60
76
  function renderTabPageComponent(component, tabId, index) {
61
77
  if (_Utils.default.isNull(component.id)) {
@@ -63,7 +79,7 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
63
79
  }
64
80
  return component.type === 'formSection' ? /*#__PURE__*/_react.default.createElement(_Section.default, {
65
81
  keyHandler: props.keyHandler,
66
- key: index,
82
+ key: component.id,
67
83
  config: component,
68
84
  handle: createComponentHandle(component),
69
85
  form: props.form,
@@ -73,12 +89,12 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
73
89
  }) : component.type === 'toolbar' ? /*#__PURE__*/_react.default.createElement(_Toolbar.default, {
74
90
  config: component,
75
91
  handle: createComponentHandle(component),
76
- key: index,
92
+ key: component.id,
77
93
  viewId: props.viewId
78
94
  }) : component.type === 'layout' ? /*#__PURE__*/_react.default.createElement(_Layout.Layout, {
79
95
  config: component,
80
96
  handle: createComponentHandle(component),
81
- key: index,
97
+ key: component.id,
82
98
  viewId: props.viewId
83
99
  }) : /*#__PURE__*/_react.default.createElement("div", null, 'Unsupported component type ' + component.type);
84
100
  }
@@ -103,7 +119,7 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
103
119
  for (const property of properties) {
104
120
  let componentHandle = componentHandles[property];
105
121
  children.push(componentHandle);
106
- if (!_Utils.default.isNull(componentHandle.api.getChildren)) {
122
+ if (!_Utils.default.isNull(componentHandle.api?.getChildren)) {
107
123
  for (const child of componentHandle.api.getChildren()) {
108
124
  children.push(child);
109
125
  }
@@ -128,7 +144,7 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
128
144
  }
129
145
  };
130
146
  };
131
- return /*#__PURE__*/_react.default.createElement("div", {
147
+ return !_Utils.default.isNull(visibleTabPages) && /*#__PURE__*/_react.default.createElement("div", {
132
148
  style: _Utils.default.mergeStyles({
133
149
  width: '100%'
134
150
  }, props.config)
@@ -158,7 +174,7 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
158
174
  minWidth: 120
159
175
  }
160
176
  }
161
- }, props?.config?.tabPages?.length > 0 ? props.config.tabPages.map((page, index) => /*#__PURE__*/_react.default.createElement(_Tab.default, _extends({
177
+ }, visibleTabPages.map((page, index) => /*#__PURE__*/_react.default.createElement(_Tab.default, _extends({
162
178
  key: index,
163
179
  label: page.attributes['label'],
164
180
  wrapped: true // allow multi-line label
@@ -174,16 +190,13 @@ const TabPanel = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.fo
174
190
  // keep original casing
175
191
  color: _ApplicationManager.default.isFormMarkersEnabled() && errors !== null && errors[page.id] === true ? '#ed5249' : undefined
176
192
  }
177
- }))) : null)), !_Utils.default.isNull(props.config) && !_Utils.default.isNull(props.config.tabPages) && props.config.tabPages.length > 0 ? props.config.tabPages.map((page, index) => {
178
- if (_Utils.default.isNull(page.id)) {
179
- page.id = index + '-tab-page';
180
- }
193
+ }))))), visibleTabPages.map((page, index) => {
181
194
  return /*#__PURE__*/_react.default.createElement(_TabPage.default, {
182
195
  value: tabValue,
183
196
  key: index,
184
197
  index: index,
185
198
  config: page
186
199
  }, renderPage(page, index));
187
- }) : null);
200
+ }));
188
201
  }));
189
202
  var _default = exports.default = TabPanel;
@@ -203,6 +203,20 @@ const Toolbar = props => {
203
203
  }, renderItem(item, defaultId));
204
204
  })));
205
205
  }
206
+ function getChildren() {
207
+ let children = [];
208
+ let properties = Object.getOwnPropertyNames(buttonItemHandles);
209
+ for (const property of properties) {
210
+ let itemHandle = buttonItemHandles[property];
211
+ children.push(itemHandle);
212
+ }
213
+ properties = Object.getOwnPropertyNames(menuItemHandles);
214
+ for (const property of properties) {
215
+ let itemHandle = menuItemHandles[property];
216
+ children.push(itemHandle);
217
+ }
218
+ return children;
219
+ }
206
220
  const api = () => {
207
221
  return {
208
222
  get id() {
@@ -213,18 +227,7 @@ const Toolbar = props => {
213
227
  return props.tableRow;
214
228
  },
215
229
  getChildren: () => {
216
- let children = [];
217
- let properties = Object.getOwnPropertyNames(buttonItemHandles);
218
- for (const property of properties) {
219
- let itemHandle = buttonItemHandles[property];
220
- children.push(itemHandle);
221
- }
222
- properties = Object.getOwnPropertyNames(menuItemHandles);
223
- for (const property of properties) {
224
- let itemHandle = menuItemHandles[property];
225
- children.push(itemHandle);
226
- }
227
- return children;
230
+ return getChildren();
228
231
  },
229
232
  set visible(visible) {
230
233
  setVisible(visible);
@@ -232,7 +235,11 @@ const Toolbar = props => {
232
235
  refresh() {
233
236
  let parsedConfig = _Utils.default.parseConfig(props.config, props.viewId);
234
237
  setVisible(_Utils.default.evaluateBooleanExpression(parsedConfig.visible, parsedConfig.id, true));
235
- let requiredNewVal = !_Utils.default.isNull(parsedConfig.validator) ? !_Utils.default.evaluateBooleanExpression(parsedConfig.validator.nullable, parsedConfig.id, true) || _Utils.default.evaluateBooleanExpression(parsedConfig.validator.required, parsedConfig.id, false) : false;
238
+ for (const child of getChildren()) {
239
+ if (child.api && child.api.refresh) {
240
+ child.api.refresh();
241
+ }
242
+ }
236
243
  }
237
244
  };
238
245
  };
@@ -42,16 +42,23 @@ const BaseField = props => {
42
42
  if (boundValue && !initialValueBound.current) {
43
43
  initialValueBound.current = true;
44
44
  if (props.config.fieldType === 'SELECT' || props.config.fieldType === 'LOOKUP') {
45
- console.log("BINDING : " + props.config.id, valueObject[valueProperty]);
46
45
  if (!boundValue || _Utils.default.isNull(boundValue.id)) {
47
46
  setValue(null);
48
47
  valueRef.current = null;
49
48
  } else {
50
- setValue(boundValue);
49
+ if (props.valueParser) {
50
+ setValue(props.valueParser(boundValue, true));
51
+ } else {
52
+ setValue(boundValue);
53
+ }
51
54
  valueRef.current = boundValue;
52
55
  }
53
56
  } else {
54
- setValue(boundValue);
57
+ if (props.valueParser) {
58
+ setValue(props.valueParser(boundValue, true));
59
+ } else {
60
+ setValue(boundValue);
61
+ }
55
62
  valueRef.current = boundValue;
56
63
  }
57
64
  }
@@ -46,8 +46,7 @@ const GridFieldWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.de
46
46
  const [rows, setRows] = _react.default.useState([]);
47
47
  const [crudToolstripWidth, setCrudToolstripWidth] = _react.default.useState(null);
48
48
  const [hasButtons] = _react.default.useState(_Utils.default.isNull(props.config.attributes) || _Utils.default.isNull(props.config.attributes.addDisabled) || _Utils.default.evaluateBooleanExpression(props.config.attributes.addDisabled, props.config.id) === false || _Utils.default.isNull(props.config.attributes.removeDisabled) || _Utils.default.evaluateBooleanExpression(props.config.attributes.removeDisabled, props.config.id) === false);
49
- //const initialValueSet = React.useRef(false);
50
-
49
+ const initialValueSet = _react.default.useRef(false);
51
50
  _react.default.useEffect(() => {
52
51
  let numCrudButtons = 0;
53
52
  let addDisabled = _Utils.default.evaluateBooleanExpression(props.config.attributes?.addDisabled, props.config.id);
@@ -67,11 +66,25 @@ const GridFieldWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.de
67
66
  setLabel(_Utils.default.getComponentAttribute(props.config, 'label', ''));
68
67
  }
69
68
  }, []);
69
+ function setNewRows(values) {
70
+ if (Array.isArray(values)) {
71
+ let newRows = [];
72
+ for (const value of values) {
73
+ if (value) {
74
+ newRows.push(value);
75
+ }
76
+ }
77
+ setRows(newRows);
78
+ }
79
+ }
70
80
  _react.default.useEffect(() => {
71
- if (!_Utils.default.isNull(base.value) /* && !initialValueSet.current*/) {
72
- setRows([].concat(base.value));
81
+ if (!_Utils.default.isNull(base.value) && !initialValueSet.current) {
82
+ setNewRows(base.value);
73
83
  }
74
84
  }, [base.value]);
85
+ _react.default.useEffect(() => {
86
+ initialValueSet.current = false;
87
+ }, [base.valueObject[base.valueProperty]]);
75
88
  return /*#__PURE__*/_react.default.createElement("div", {
76
89
  className: "MuiFormControl-root MuiTextField-root MuiFormControl-marginDense",
77
90
  style: _Utils.default.mergeStyles({}, props.config)
@@ -155,7 +168,7 @@ const GridFieldWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.de
155
168
  pagination: false,
156
169
  onSelectionChange: selection => {
157
170
  setSelection(selection);
158
- //base.initialValueSet.current = true;
171
+ initialValueSet.current = true;
159
172
  },
160
173
  filterWrapperClass: 'transferListFilterWrapper',
161
174
  hasBorder: false
@@ -20,18 +20,26 @@ const SelectItemComponent = props => {
20
20
  const width = !_Utils.default.isNull(props.config.attributes?.style?.width) ? props.config.attributes.style.width : "100%";
21
21
  const maxWidth = !_Utils.default.isNull(props.config.attributes?.style?.maxWidth) ? props.config.attributes.style.maxWidth : null;
22
22
  const minWidth = !_Utils.default.isNull(props.config.attributes?.style?.minWidth) ? props.config.attributes.style.minWidth : "240px";
23
- _react.default.useEffect(() => {
24
- if (!_Utils.default.isNull(base.value) && !optionsLoaded) {
23
+ function processValueChange(newValue, isOptionsLoaded) {
24
+ if (!_Utils.default.isNull(newValue) && !isOptionsLoaded) {
25
25
  let defaultOptions = [];
26
- defaultOptions.push(base.value);
26
+ defaultOptions.push(newValue);
27
27
  base.setSelectOptions(defaultOptions);
28
28
  setOptionsLoaded(true);
29
+ console.log("DEFAULT SETTINGS SET");
29
30
  }
30
- if (_Utils.default.isNull(initialValue.current) && !_Utils.default.isNull(base.value)) {
31
- initialValue.current = base.value;
31
+ if (_Utils.default.isNull(initialValue.current) && !_Utils.default.isNull(newValue)) {
32
+ initialValue.current = newValue;
32
33
  }
33
- setValue(base.value?.id);
34
+ setValue(newValue ? newValue.id : '');
35
+ }
36
+ _react.default.useEffect(() => {
37
+ processValueChange(base.value, optionsLoaded);
34
38
  }, [base.value]);
39
+ _react.default.useEffect(() => {
40
+ initialValue.current = null;
41
+ processValueChange(base.valueObject[base.valueProperty], false);
42
+ }, [base.valueObject[base.valueProperty]]);
35
43
  _react.default.useEffect(() => {
36
44
  if (!_Utils.default.isNull(base.selectOptions) && base.selectOptions.length > 0) {
37
45
  if (initialValue.current) {
@@ -19,7 +19,6 @@ 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
20
  const CustomTimePickerComponent = props => {
21
21
  const base = props.base;
22
- const defaultDate = !_Utils.default.isNull(base.valueObject[base.valueProperty]) ? new Date(base.valueObject[base.valueProperty]) : null;
23
22
  let minWidth = _Utils.default.getComponentAttribute(props.config, 'minWidth', '240px');
24
23
  let width = _Utils.default.getComponentAttribute(props.config, 'width', '100%');
25
24
  const handleDateChange = date => {
@@ -27,8 +26,8 @@ const CustomTimePickerComponent = props => {
27
26
  base.handleValueChange(date);
28
27
  };
29
28
  _react.default.useEffect(() => {
30
- base.setValue(defaultDate);
31
- }, [props.base.valueObject[props.base.valueProperty]]);
29
+ base.setValue(base.value);
30
+ }, [base.value]);
32
31
  const secondaryColor = (0, _reactRedux.useSelector)(state => state.dashboard.secondaryThemeColor);
33
32
  const style = {
34
33
  minWidth: minWidth,
@@ -68,16 +67,26 @@ const TimePicker = props => {
68
67
  valueParser: (value, inbound) => {
69
68
  if (!_Utils.default.isNull(value)) {
70
69
  if (!value.toString().includes("T")) {
71
- if (typeof value === 'string') {
72
- const [hours, minutes] = value.split(":").map(Number);
70
+ if (typeof value === "string") {
71
+ const parts = value.split(":");
72
+ const hours = Number(parts[0] ?? 0);
73
+ const minutes = Number(parts[1] ?? 0);
73
74
  const dateObject = new Date();
74
- dateObject.setHours(hours, minutes, 0, 0);
75
- return inbound ? dateObject : dateObject.toLocaleTimeString('it-IT');
75
+ dateObject.setHours(hours, minutes);
76
+ return inbound ? dateObject : dateObject.toLocaleTimeString("it-IT", {
77
+ hour: "2-digit",
78
+ minute: "2-digit"
79
+ });
76
80
  }
77
81
  return value;
78
82
  }
79
83
  }
80
- return !_Utils.default.isNull(value) ? inbound ? new Date(value) : new Date(value).toLocaleTimeString('it-IT') : null;
84
+
85
+ // date-time value (contains "T") or something parsable by Date
86
+ return !_Utils.default.isNull(value) ? inbound ? new Date(value) : new Date(value).toLocaleTimeString("it-IT", {
87
+ hour: "2-digit",
88
+ minute: "2-digit"
89
+ }) : null;
81
90
  }
82
91
  }), base => /*#__PURE__*/_react.default.createElement(CustomTimePickerComponent, _extends({
83
92
  base: base
@@ -301,6 +301,23 @@ const Layout = props => {
301
301
  }
302
302
  }
303
303
  }
304
+ function getChildren() {
305
+ let children = [];
306
+ let properties = Object.getOwnPropertyNames(componentHandles);
307
+ for (const property of properties) {
308
+ let componentHandle = componentHandles[property];
309
+ children.push(componentHandle);
310
+ if (!_Utils.default.isNull(componentHandle.api) && !_Utils.default.isNull(componentHandle.api.getChildren)) {
311
+ let moreChildren = componentHandle.api.getChildren();
312
+ if (!_Utils.default.isNull(moreChildren)) {
313
+ for (const child of moreChildren) {
314
+ children.push(child);
315
+ }
316
+ }
317
+ }
318
+ }
319
+ return children;
320
+ }
304
321
  const api = () => {
305
322
  return {
306
323
  get id() {
@@ -311,27 +328,18 @@ const Layout = props => {
311
328
  setVisible(val);
312
329
  },
313
330
  getChildren: () => {
314
- let children = [];
315
- let properties = Object.getOwnPropertyNames(componentHandles);
316
- for (const property of properties) {
317
- let componentHandle = componentHandles[property];
318
- children.push(componentHandle);
319
- if (!_Utils.default.isNull(componentHandle.api) && !_Utils.default.isNull(componentHandle.api.getChildren)) {
320
- let moreChildren = componentHandle.api.getChildren();
321
- if (!_Utils.default.isNull(moreChildren)) {
322
- for (const child of moreChildren) {
323
- children.push(child);
324
- }
325
- }
326
- }
327
- }
328
- return children;
331
+ return getChildren();
329
332
  },
330
333
  refresh() {
331
334
  if (!_Utils.default.isNull(props.config.visible)) {
332
335
  let parsedConfig = _Utils.default.parseConfig(props.config, props.viewId);
333
336
  setVisible(_Utils.default.evaluateBooleanExpression(parsedConfig.visible, props.config.id));
334
337
  }
338
+ for (const child of getChildren()) {
339
+ if (child.api && child.api.refresh) {
340
+ child.api.refresh();
341
+ }
342
+ }
335
343
  }
336
344
  };
337
345
  };
@@ -15,6 +15,7 @@ const SideBarContent = props => {
15
15
  const {
16
16
  tab,
17
17
  isHost,
18
+ isChairPerson,
18
19
  meetingId,
19
20
  participants,
20
21
  meetingChat
@@ -36,7 +37,8 @@ const SideBarContent = props => {
36
37
  chatTab: true,
37
38
  selectedChat: meetingChat,
38
39
  meetingId: meetingId,
39
- isHost: isHost
40
+ isHost: isHost,
41
+ isChairPerson: isChairPerson
40
42
  })));
41
43
  };
42
44
  var _default = exports.default = SideBarContent;
@@ -414,63 +414,7 @@ const Toolbar = props => {
414
414
  id: 'CHAT_BUBBLE'
415
415
  })), /*#__PURE__*/_react.default.createElement("div", {
416
416
  className: 'text'
417
- }, "Chat"))))))), isHost && roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
418
- className: 'button-wrapper no-margin no-padding'
419
- }, /*#__PURE__*/_react.default.createElement(_ToolbarButton.default, {
420
- root: buttonStripRef,
421
- onVisibilityChange: visible => handleVisibilityChange('minutes', visible)
422
- }, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
423
- title: "Minutes"
424
- }, /*#__PURE__*/_react.default.createElement(_Button.default, {
425
- onClick: () => {
426
- if (minutesShown) {
427
- hideMinutes();
428
- } else {
429
- showMinutes();
430
- }
431
- },
432
- style: {
433
- color: minutesShown ? '#8eb2f5' : '#404239',
434
- marginRight: '4px'
435
- }
436
- }, /*#__PURE__*/_react.default.createElement("div", {
437
- style: {
438
- height: '100%'
439
- }
440
- }, /*#__PURE__*/_react.default.createElement("div", {
441
- className: 'icon'
442
- }, minutesShown ? /*#__PURE__*/_react.default.createElement(_Icon.default, {
443
- id: 'CLOSE'
444
- }) : /*#__PURE__*/_react.default.createElement(_Icon.default, {
445
- id: 'MINUTES'
446
- })), /*#__PURE__*/_react.default.createElement("div", {
447
- className: 'text'
448
- }, minutesShown ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Hide") : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Minutes"))))))), minutesShown && roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
449
- className: 'button-wrapper no-margin no-padding'
450
- }, /*#__PURE__*/_react.default.createElement(_ToolbarButton.default, {
451
- root: buttonStripRef,
452
- onVisibilityChange: visible => handleVisibilityChange('saveMinutes', visible)
453
- }, /*#__PURE__*/_react.default.createElement(_Tooltip.default, {
454
- title: "Save Minutes"
455
- }, /*#__PURE__*/_react.default.createElement(_Button.default, {
456
- onClick: () => {
457
- saveMinutes();
458
- },
459
- style: {
460
- color: '#404239',
461
- marginRight: '4px'
462
- }
463
- }, /*#__PURE__*/_react.default.createElement("div", {
464
- style: {
465
- height: '100%'
466
- }
467
- }, /*#__PURE__*/_react.default.createElement("div", {
468
- className: 'icon'
469
- }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
470
- id: 'SAVE'
471
- })), /*#__PURE__*/_react.default.createElement("div", {
472
- className: 'text'
473
- }, "Save")))))), roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
417
+ }, "Chat"))))))), roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
474
418
  className: 'button-wrapper'
475
419
  }, raisedHands.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
476
420
  className: 'marker'
@@ -730,29 +674,7 @@ const Toolbar = props => {
730
674
  }
731
675
  }, /*#__PURE__*/_react.default.createElement(_material.ListItemIcon, null, /*#__PURE__*/_react.default.createElement(_Icon.default, {
732
676
  id: 'CHAT_BUBBLE'
733
- })), /*#__PURE__*/_react.default.createElement("div", null, hasUnreadChats ? '1' : '', "\xA0Chat"))), isHost && !buttonVisibility.minutes && roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
734
- className: 'button-wrapper no-margin no-padding'
735
- }, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
736
- onClick: () => {
737
- if (minutesShown) {
738
- hideMinutes();
739
- } else {
740
- showMinutes();
741
- }
742
- }
743
- }, /*#__PURE__*/_react.default.createElement(_material.ListItemIcon, null, minutesShown ? /*#__PURE__*/_react.default.createElement(_Icon.default, {
744
- id: 'CLOSE'
745
- }) : /*#__PURE__*/_react.default.createElement(_Icon.default, {
746
- id: 'DESCRIPTION'
747
- })), minutesShown ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Hide Minutes") : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Minutes"))), minutesShown && roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
748
- className: 'button-wrapper no-margin no-padding'
749
- }, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
750
- onClick: () => {
751
- saveMinutes();
752
- }
753
- }, /*#__PURE__*/_react.default.createElement(_material.ListItemIcon, null, /*#__PURE__*/_react.default.createElement(_Icon.default, {
754
- id: 'SAVE'
755
- })), "Save Minutes")), !buttonVisibility.raiseHand && roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
677
+ })), /*#__PURE__*/_react.default.createElement("div", null, hasUnreadChats ? '1' : '', "\xA0Chat"))), !buttonVisibility.raiseHand && roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
756
678
  className: 'button-wrapper no-margin no-padding'
757
679
  }, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
758
680
  onClick: () => {
@@ -52,6 +52,7 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
52
52
  const [allUserParticipantsLeft, setAllUserParticipantsLeft] = (0, _react.useState)(false);
53
53
  const [lobbyWaitingList, setLobbyWaitingList] = (0, _react.useState)([]);
54
54
  const [isHost, setIsHost] = (0, _react.useState)(false);
55
+ const [isChairPerson, setIsChairPerson] = (0, _react.useState)(false);
55
56
  const [meetingParticipantGridMode, setMeetingParticipantGridMode] = (0, _react.useState)('DEFAULT');
56
57
  const [autoPermit, setAutoPermit] = (0, _react.useState)(!props.calendarEvent.askToJoin);
57
58
  const [rtpCapabilities, setRtpCapabilities] = (0, _react.useState)(null);
@@ -309,6 +310,7 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
309
310
  }
310
311
  setCurrentUserFullName(userFullName);
311
312
  setIsHost(props.calendarEvent.host.username === _ApplicationManager.default.getUserDetails().username);
313
+ setIsChairPerson(props.calendarEvent.chairPersonId === _ApplicationManager.default.getUserDetails().username);
312
314
  try {
313
315
  _Media.default.joinMeeting(props.calendarEvent, props.settings, userFullName).then(response => {
314
316
  console.log('JOIN RESPONSE : ', response);
@@ -329,18 +331,15 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
329
331
  }, []);
330
332
  function addUserToParticipants(user) {
331
333
  // Typically, a user shoud not exist. We are ensuring that there are never duplicates
332
- console.log('SEARCHING PARTICIPANT : ' + user.userId);
333
334
  console.log(participants);
334
335
  let participant = participants.find(u => u.userId === user.userId);
335
336
  if (participant) {
336
- console.log('FOUND EXISTING PARTICIPANT : ', participant);
337
337
  participant.name = user.name;
338
338
  participant.avatar = user.avatar;
339
339
  participant.audioMuted = user.audioMuted;
340
340
  participant.videoMuted = user.videoMuted;
341
341
  participant.producers = user.producers;
342
342
  } else {
343
- console.log('DID NOT FIND EXISTING PARTICIPANT : ', participant);
344
343
  participant = {
345
344
  userId: user.userId,
346
345
  name: user.name,
@@ -381,7 +380,7 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
381
380
  _SocketManager.default.endSession(props.calendarEvent.id);
382
381
  _ApplicationManager.default.setHasActiveMeeting(false);
383
382
  _ApplicationManager.default.setActiveMeetingKey(null);
384
- _ApplicationManager.default.removeLoadedGraph(false);
383
+ _ApplicationManager.default.removeLoadedGraph('window');
385
384
  setSideBarOpen(false);
386
385
  setSideBarTab('');
387
386
  }
@@ -555,6 +554,7 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
555
554
  sideBarTab: sideBarTab,
556
555
  roomStatus: roomStatus,
557
556
  isHost: isHost,
557
+ isChairPerson: isChairPerson,
558
558
  startScreenSharing: startScreenSharing,
559
559
  sharingHandler: someoneSharing => setSomeoneSharing(someoneSharing),
560
560
  onStopSharing: () => {
@@ -601,6 +601,7 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
601
601
  }, /*#__PURE__*/_react.default.createElement(_SideBarContent.default, {
602
602
  meetingChat: meetingChat,
603
603
  isHost: isHost,
604
+ isChairPerson: isChairPerson,
604
605
  tab: sideBarTab,
605
606
  meetingId: props.calendarEvent.id,
606
607
  participants: participants,
@@ -10,6 +10,17 @@
10
10
  background-color: #f9f9f9;
11
11
  }
12
12
 
13
+ .people-content-list {
14
+ margin: 4px;
15
+ }
16
+
17
+ .person-card-wrapper {
18
+ border: 1px solid rgb(233, 233, 233);
19
+ border-radius: 4px;
20
+ background-color: rgb(233, 233, 233);
21
+ margin-bottom: 2px;
22
+ }
23
+
13
24
  .meeting-participant-container-current-user {
14
25
  min-width: 212px;
15
26
  min-height: 150px;
@@ -586,14 +586,26 @@ const VCRoomParticipant = props => {
586
586
  }), /*#__PURE__*/_react.default.createElement("div", {
587
587
  className: props.sizing === 'sm' ? 'name-label-sm' : 'name-label',
588
588
  style: {
589
+ display: 'flex',
589
590
  position: 'absolute',
591
+ width: '100%',
590
592
  bottom: props.isCurrentUser ? '12px' : '0',
591
593
  padding: props.isCurrentUser ? '4px 16px' : props.sizing !== 'sm' ? '4px' : '4px'
592
594
  }
593
- }, !props.isCurrentUser && getParticipantName(), !props.isCurrentUser && /*#__PURE__*/_react.default.createElement("span", {
595
+ }, /*#__PURE__*/_react.default.createElement("div", {
594
596
  style: {
597
+ width: '50%',
598
+ display: 'flex',
599
+ justifyContent: 'flex-start',
595
600
  marginLeft: '4px'
596
601
  }
602
+ }, !props.isCurrentUser && getParticipantName(), props.isCurrentUser && 'You'), !props.isCurrentUser && /*#__PURE__*/_react.default.createElement("div", {
603
+ style: {
604
+ marginLeft: '4px',
605
+ display: 'flex',
606
+ justifyContent: 'flex-end',
607
+ width: '50%'
608
+ }
597
609
  }, props.isHost && !audioMuted ? /*#__PURE__*/_react.default.createElement(_IconButton.default, {
598
610
  onClick: e => {
599
611
  props.onHostAudioMute(props.data);
@@ -623,22 +635,14 @@ const VCRoomParticipant = props => {
623
635
  }, /*#__PURE__*/_react.default.createElement(_Icon.default, {
624
636
  id: 'CAMERA'
625
637
  }))), props.isCurrentUser && /*#__PURE__*/_react.default.createElement("div", {
626
- className: 'row',
638
+ className: 'row no-margin no-padding',
627
639
  style: {
628
- width: '216px'
640
+ width: '100%'
629
641
  }
630
642
  }, /*#__PURE__*/_react.default.createElement("div", {
631
643
  className: 'col no-margin no-padding',
632
644
  style: {
633
- textAlign: 'left'
634
- }
635
- }, /*#__PURE__*/_react.default.createElement("span", {
636
- style: {
637
- marginLeft: '4px'
638
- }
639
- }, "You")), /*#__PURE__*/_react.default.createElement("div", {
640
- className: 'col no-margin no-padding',
641
- style: {
645
+ width: '50%',
642
646
  display: 'flex',
643
647
  justifyContent: 'flex-end'
644
648
  }
@@ -681,7 +685,8 @@ const VCRoomParticipant = props => {
681
685
  filter: 'drop-shadow(0px 2px 8px rgba(0,0,0,0.32))',
682
686
  mt: 1.5,
683
687
  '& .MuiList-root': {
684
- border: '1px solid red'
688
+ border: '1px solid #e1e1e1',
689
+ borderRadius: '4px'
685
690
  },
686
691
  '& .MuiAvatar-root': {
687
692
  width: 32,
@@ -115,6 +115,7 @@ const VCRoomWorkspace = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
115
115
  videoMuted,
116
116
  audioMuted,
117
117
  isHost,
118
+ isChairPerson,
118
119
  rtpCapabilities,
119
120
  onloadScreenShareData,
120
121
  displayState,
@@ -741,6 +742,7 @@ const VCRoomWorkspace = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
741
742
  }, /*#__PURE__*/_react.default.createElement(_SideBarContent.default, {
742
743
  meetingChat: meetingChat,
743
744
  isHost: isHost,
745
+ isChairPerson: isChairPerson,
744
746
  tab: 'People',
745
747
  meetingId: meetingId,
746
748
  participants: props.participants,
@@ -810,10 +812,15 @@ const VCRoomWorkspace = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
810
812
  height: '100%'
811
813
  }
812
814
  }, renderStrip())), /*#__PURE__*/_react.default.createElement("div", {
813
- className: `${(displayState === 'MAXIMIZED' ? 'col ' : '') + 'no-margin no-padding'}`,
815
+ className: `${displayState === 'MAXIMIZED' ? 'col ' : ''}`,
814
816
  style: {
815
817
  width: '200px',
816
- height: '148px'
818
+ height: '148px',
819
+ display: 'flex',
820
+ alignItems: 'center',
821
+ justifyContent: 'flex-end',
822
+ marginLeft: '16px',
823
+ marginRight: '0'
817
824
  }
818
825
  }, renderCurrentParticipant())), waitingList && waitingList.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
819
826
  className: 'no-side-margin no-side-padding grid-side-bar',
@@ -50,7 +50,7 @@ const ChatRoom = props => {
50
50
  const [mode, setMode] = (0, _react.useState)('CHAT');
51
51
  const [clearUploadedFileSwitch, setClearUploadedFileSwitch] = (0, _react.useState)(false);
52
52
  const [socketEventHandler] = (0, _react.useState)({});
53
- const [currentUser, setCurrentUser] = (0, _react.useState)(_ApplicationManager.default.getUserDetails());
53
+ const [currentUser] = (0, _react.useState)(_ApplicationManager.default.getUserDetails());
54
54
  const socketEventHandlerApi = () => {
55
55
  return {
56
56
  get id() {
@@ -146,7 +146,7 @@ const ChatRoom = props => {
146
146
  if (selectedChat) {
147
147
  const newMessages = [].concat(selectedChat.messages);
148
148
  if (!props.showAllMessagesForNewParticipants) {
149
- let find = selectedChat.participants.find(p => p.userId === currentUser.userId);
149
+ let find = selectedChat.participants.find(p => p.username === currentUser.username);
150
150
  const dateAddedToChat = find ? find.dateAddedToChat : new Date();
151
151
  const filteredMessages = newMessages.filter(txt => dateAddedToChat === null || new Date(dateAddedToChat) < new Date(txt.createdDate));
152
152
  setMessages(filteredMessages);
@@ -172,7 +172,7 @@ const ChatRoom = props => {
172
172
  if (selectedChat && currentUser) {
173
173
  setMessage('');
174
174
  setDocuments(null);
175
- let find = selectedChat.participants.find(p => p.userId === currentUser.userId);
175
+ let find = selectedChat.participants.find(p => p.userId === currentUser.username || p.username === currentUser.username);
176
176
  if (_Utils.default.isNull(find)) {
177
177
  (0, _RestUtils.postData)(`${location + '/' + _ApplicationManager.default.getContextRoot()}/calendar/api/v1/chat/addParticipants`, () => {}, e => {}, true, {
178
178
  chatId: selectedChat.id,
@@ -497,7 +497,8 @@ const ChatRoom = props => {
497
497
  messageId: message.id,
498
498
  participantsToSignalIds,
499
499
  profile: _ApplicationManager.default.getUserDetails().profile,
500
- userId: _ApplicationManager.default.getUserDetails().username
500
+ userId: _ApplicationManager.default.getUserDetails().username,
501
+ username: _ApplicationManager.default.getUserDetails().username
501
502
  }).then(data => {
502
503
  message.active = false;
503
504
  setRefresher(!refresher);
@@ -626,7 +627,7 @@ const ChatRoom = props => {
626
627
  className: "cv-poll-choice-details"
627
628
  }, /*#__PURE__*/_react.default.createElement("span", {
628
629
  className: "cv-choice-percentage"
629
- }, /*#__PURE__*/_react.default.createElement(Info, {
630
+ }, /*#__PURE__*/_react.default.createElement(_reactFeather.Info, {
630
631
  className: "selected-choice-icon"
631
632
  })), /*#__PURE__*/_react.default.createElement("span", {
632
633
  className: "cv-choice-text"
@@ -641,10 +642,11 @@ const ChatRoom = props => {
641
642
  poll: message.poll,
642
643
  chatTab: props.chatTab,
643
644
  isHost: props.isHost,
645
+ isChairPerson: props.isChairPerson,
644
646
  pollCreator: message.participant,
645
647
  createdDate: message.createdDate,
646
648
  submitPollVoteHandler: poll => submitPollVoteHandler(poll),
647
- pollParticipantIDs: selectedChat.participants.map(p => p.userId),
649
+ pollParticipantIDs: selectedChat.participants.map(p => p.username),
648
650
  currentUser: currentUser,
649
651
  closePollHandler: (e, poll) => closePollHandler(e, poll),
650
652
  numberOfPollParticipants: selectedChat.participants.length
@@ -193,7 +193,8 @@
193
193
 
194
194
  .chatroom__body {
195
195
  height: 95%;
196
- overflow: auto;
196
+ overflow-y: auto;
197
+ overflow-x: hidden;
197
198
  padding: 0 15px;
198
199
  }
199
200
 
@@ -396,7 +397,6 @@
396
397
 
397
398
  .poll-content {
398
399
  margin-top: 16px;
399
- margin-left: 26px;
400
400
  margin-bottom: 28px;
401
401
  padding: 20px 15px 20px 15px;
402
402
  letter-spacing: .01em;
@@ -488,11 +488,9 @@
488
488
  }
489
489
 
490
490
  .cv-choice-text {
491
- margin-left: 10px;
491
+ margin: 0 10px;
492
492
  display: inline-block;
493
493
  vertical-align: bottom;
494
- text-overflow: ellipsis;
495
- white-space: nowrap;
496
494
  overflow: hidden;
497
495
  color: rgba(0, 0, 0, 0.75);
498
496
  }
@@ -189,7 +189,7 @@ const PollContainer = props => {
189
189
  }).catch(() => {});
190
190
  }
191
191
  }
192
- }, "Submit Vote"), props.currentUser.userId === props.pollCreator.userId && /*#__PURE__*/_react.default.createElement(_Button.default, {
192
+ }, "Submit Vote"), props.currentUser.username === props.pollCreator.username && /*#__PURE__*/_react.default.createElement(_Button.default, {
193
193
  className: "vote-button",
194
194
  variant: "outlined",
195
195
  onClick: e => props.closePollHandler(e, poll)
@@ -216,7 +216,7 @@ const PollContainer = props => {
216
216
  style: {
217
217
  color: '#945c33'
218
218
  }
219
- }, "You have voted ", props.poll.options.find(o => o.id === poll.selectedOption)?.text)), props.isHost && tieOptions.length > 0 && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
219
+ }, "You have voted ", props.poll.options.find(o => o.id === poll.selectedOption)?.text)), props.isChairPerson && tieOptions.length > 0 && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
220
220
  className: "poll-choices",
221
221
  style: {
222
222
  marginTop: '8px'
@@ -72,6 +72,6 @@ const MenuItem = props => {
72
72
  },
73
73
  righticon: props.mode === 'cascaded' && !_Utils.default.isNull(props.menuItems) && props.menuItems.length > 0 ? /*#__PURE__*/_react.default.createElement(_chevronRight.default, null) : null,
74
74
  menuitems: props.menuItems
75
- }, config.attributes['label']);
75
+ }, config.attributes?.label);
76
76
  };
77
77
  var _default = exports.default = MenuItem;
@@ -40,6 +40,16 @@ class ProcurementMeetings {
40
40
  procurementNumber: meeting.procurementNumber
41
41
  }, meeting);
42
42
  };
43
+ endMeeting = meeting => {
44
+ console.log("\n\n\n\n\nENDING SESSION : ", meeting);
45
+ let api = _ApplicationManager.default.resolveComponentApi("conclusionLayout");
46
+ api.visible = true;
47
+ api = _ApplicationManager.default.resolveComponentApi("toolbar");
48
+ api.visible = false;
49
+ api = _ApplicationManager.default.resolveComponentApi("meetingLayout");
50
+ api.visible = false;
51
+ _SocketManager.default.endSession(meeting.id);
52
+ };
43
53
  handleSystemEvent = (event, meeting, viewId) => {
44
54
  console.log("PROCESSING MEETING SYSTEM EVENT : ", event);
45
55
  let data = event.data;
@@ -66,14 +76,18 @@ class ProcurementMeetings {
66
76
  _ApplicationManager.default.resolveComponentApi("vcRoom").loadChats();
67
77
  } else if (event.systemEventType === 'meetingStepChanged') {
68
78
  let api = _ApplicationManager.default.resolveComponentApi(viewId);
69
- if (api.model.currentMeetingStep === 'QUORUM' && data.step === 'COMPLIANCE_EVALUATION') {
70
- this.showComponent("preEvaluationNext");
71
- } else if (api.model.currentMeetingStep === 'PRE_COMPLIANCE_EVALUATION' && data.step === 'FUNCTIONAL_EVALUATION') {
72
- this.showComponent("complianceEvaluationNext");
73
- } else if (api.model.currentMeetingStep === 'COMPLIANCE_EVALUATION' && data.step === 'PRICE_EVALUATION') {
74
- this.showComponent("functionalEvaluationNext");
75
- } else if (api.model.currentMeetingStep === 'FUNCTIONAL_EVALUATION' && data.step === 'CONDITION_OF_AWARD') {
76
- this.showComponent("priceEvaluationNext");
79
+ api.model.currentStep = data.step;
80
+ api.model.meetingStep = data.step;
81
+ let component = _ApplicationManager.default.resolveComponentApi("toolbar");
82
+ if (component) {
83
+ component.refresh();
84
+ }
85
+ } else if (event.systemEventType === 'documentSaved') {
86
+ let documentType = data.documentType;
87
+ if (documentType === 'minutes') {
88
+ meeting.minutesDraftDocumentId = data.documentId;
89
+ } else if (documentType === 'agenda') {
90
+ meeting.agendaDocumentId = data.documentId;
77
91
  }
78
92
  }
79
93
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agilemotion/oui-react-js",
3
- "version": "1.8.45",
3
+ "version": "1.8.47",
4
4
  "description": "AgileMotion React UI Component Library - A comprehensive collection of dashboard components, forms, media controls, and more",
5
5
  "license": "ISC",
6
6
  "author": "",