@agilemotion/oui-react-js 1.8.41 → 1.8.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Button.js +0 -1
- package/dist/components/DocumentTemplateDesigner.js +1 -0
- package/dist/components/DocumentTemplateDesignerComponent.css +2 -0
- package/dist/components/DocumentTemplateDesignerComponent.js +4 -3
- package/dist/components/DocumentViewer.js +10 -3
- package/dist/components/Icon.js +6 -0
- package/dist/components/WordDocumentViewer.js +217 -21
- package/dist/components/form/GridField.js +3 -1
- package/dist/components/form/RadioGroup.js +4 -1
- package/dist/components/media/Toolbar.js +93 -2
- package/dist/components/media/TrainingRoom.js +31 -1
- package/dist/components/media/VCRoom.js +2 -1
- package/dist/components/media/VCRoomWorkspace.js +225 -5
- package/dist/js/Calendar.js +1 -0
- package/dist/js/ProcurementMeetings.js +34 -17
- package/package.json +3 -2
|
@@ -90,7 +90,6 @@ const Button = props => {
|
|
|
90
90
|
refresh() {
|
|
91
91
|
let parsedConfig = _Utils.default.parseConfig(config ? config : props.config, props.viewId);
|
|
92
92
|
setDisabled(_Utils.default.evaluateBooleanExpression(parsedConfig.disabled, parsedConfig.id));
|
|
93
|
-
console.log("\n\n\n\nVISIBILITY CHECK [" + props.config.id + "] - [" + parsedConfig.visible + "] - [" + _Utils.default.evaluateBooleanExpression(parsedConfig.visible, parsedConfig.id) + "]");
|
|
94
93
|
setVisible(_Utils.default.isNull(parsedConfig.visible) || _Utils.default.evaluateBooleanExpression(parsedConfig.visible, parsedConfig.id));
|
|
95
94
|
}
|
|
96
95
|
};
|
|
@@ -11,6 +11,7 @@ require("./DocumentTemplateDesigner.css");
|
|
|
11
11
|
var _DocumentTemplateDesignerComponent = _interopRequireDefault(require("./DocumentTemplateDesignerComponent"));
|
|
12
12
|
var _Event = _interopRequireDefault(require("../event/Event"));
|
|
13
13
|
var _EventType = _interopRequireDefault(require("../event/EventType"));
|
|
14
|
+
var _WordDocumentViewer = _interopRequireDefault(require("./WordDocumentViewer"));
|
|
14
15
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
16
|
const DocumentTemplateDesigner = props => {
|
|
16
17
|
const [visible, setVisible] = _react.default.useState(false);
|
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
@import '@syncfusion/ej2-splitbuttons/styles/material.css';
|
|
8
8
|
@import '@syncfusion/ej2-dropdowns/styles/material.css';
|
|
9
9
|
@import "@syncfusion/ej2-react-documenteditor/styles/material.css";
|
|
10
|
+
@import '@syncfusion/ej2-buttons/styles/material.css';
|
|
11
|
+
@import '@syncfusion/ej2-splitbuttons/styles/material.css';
|
|
10
12
|
|
|
11
13
|
.e-de-toolbar.e-toolbar .e-toolbar-items .e-toolbar-item .e-tbar-btn.e-btn {
|
|
12
14
|
}
|
|
@@ -15,10 +15,11 @@ var _EventType = _interopRequireDefault(require("../event/EventType"));
|
|
|
15
15
|
var _Observable = _interopRequireDefault(require("../event/Observable"));
|
|
16
16
|
var _Utils = _interopRequireDefault(require("../Utils"));
|
|
17
17
|
var _reactPromiseTracker = require("react-promise-tracker");
|
|
18
|
+
var _WordDocumentViewer = require("./WordDocumentViewer");
|
|
18
19
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
20
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
20
21
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
21
|
-
(0, _ej2Base.registerLicense)(
|
|
22
|
+
(0, _ej2Base.registerLicense)(_WordDocumentViewer.KEY);
|
|
22
23
|
_ej2ReactDocumenteditor.DocumentEditorContainerComponent.Inject(_ej2ReactDocumenteditor.Toolbar);
|
|
23
24
|
const DocumentTemplateDesignerComponent = props => {
|
|
24
25
|
const {
|
|
@@ -135,7 +136,7 @@ const DocumentTemplateDesignerComponent = props => {
|
|
|
135
136
|
});
|
|
136
137
|
const formData = new FormData();
|
|
137
138
|
formData.append('files', file, 'document.docx');
|
|
138
|
-
(0, _reactPromiseTracker.trackPromise)(fetch(
|
|
139
|
+
(0, _reactPromiseTracker.trackPromise)(fetch(`${_WordDocumentViewer.DOCSVC}Import`, {
|
|
139
140
|
method: 'POST',
|
|
140
141
|
body: formData
|
|
141
142
|
}).then(response => {
|
|
@@ -571,7 +572,7 @@ const DocumentTemplateDesignerComponent = props => {
|
|
|
571
572
|
toolbarItems: items,
|
|
572
573
|
toolbarClick: onToolbarClick,
|
|
573
574
|
contentChange: onContentChange,
|
|
574
|
-
serviceUrl:
|
|
575
|
+
serviceUrl: _WordDocumentViewer.DOCSVC,
|
|
575
576
|
enableToolbar: true
|
|
576
577
|
})));
|
|
577
578
|
};
|
|
@@ -117,6 +117,12 @@ const DocumentViewer = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defa
|
|
|
117
117
|
setVisible(true);
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
|
+
setValue(newValue) {
|
|
121
|
+
setValue(newValue);
|
|
122
|
+
},
|
|
123
|
+
getValue() {
|
|
124
|
+
return value;
|
|
125
|
+
},
|
|
120
126
|
getDocumentValue: async () => {
|
|
121
127
|
if (wordEditorValueHandler.api) {
|
|
122
128
|
return await wordEditorValueHandler.api.getValue();
|
|
@@ -145,7 +151,7 @@ const DocumentViewer = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defa
|
|
|
145
151
|
}, "Error loading document"), !loading && !hasLoadingError && _Utils.default.prop(parsedConfig.fileType) === 'application/pdf' && !_Utils.default.isNull(value) && /*#__PURE__*/_react.default.createElement(_PDFViewer.default, {
|
|
146
152
|
file: value,
|
|
147
153
|
onDocumentLoadSuccess: () => {}
|
|
148
|
-
}), !loading && !hasLoadingError && _Utils.default.prop(parsedConfig.fileType) === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' && (!_Utils.default.isNull(value) || props.config.enableUpload) && /*#__PURE__*/_react.default.createElement(_WordDocumentViewer.default, {
|
|
154
|
+
}), !loading && !hasLoadingError && _Utils.default.prop(parsedConfig.fileType) === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' && (!_Utils.default.isNull(value) || props.config.enableUpload) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_WordDocumentViewer.default, {
|
|
149
155
|
file: value,
|
|
150
156
|
onDocumentLoadSuccess: () => {},
|
|
151
157
|
valueHandler: wordEditorValueHandler,
|
|
@@ -159,7 +165,8 @@ const DocumentViewer = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defa
|
|
|
159
165
|
readOnly: _Utils.default.evaluateBooleanExpression(parsedConfig.readOnly, props.config.id),
|
|
160
166
|
commentsOnly: _Utils.default.evaluateBooleanExpression(parsedConfig.commentsOnly, props.config.id),
|
|
161
167
|
enableUpload: _Utils.default.evaluateBooleanExpression(parsedConfig.enableUpload, props.config.id),
|
|
162
|
-
trackChanges: _Utils.default.evaluateBooleanExpression(parsedConfig.trackChanges, props.config.id)
|
|
163
|
-
|
|
168
|
+
trackChanges: _Utils.default.evaluateBooleanExpression(parsedConfig.trackChanges, props.config.id),
|
|
169
|
+
id: props.config.id
|
|
170
|
+
})));
|
|
164
171
|
}));
|
|
165
172
|
var _default = exports.default = DocumentViewer;
|
package/dist/components/Icon.js
CHANGED
|
@@ -261,6 +261,12 @@ class Icon extends _react.Component {
|
|
|
261
261
|
color: '#2e7d32'
|
|
262
262
|
}
|
|
263
263
|
});
|
|
264
|
+
} else if (this.props.id === 'MINUTES') {
|
|
265
|
+
return /*#__PURE__*/_react.default.createElement(_iconsMaterial.EditNote, {
|
|
266
|
+
style: {
|
|
267
|
+
color: '#2e7d32'
|
|
268
|
+
}
|
|
269
|
+
});
|
|
264
270
|
}
|
|
265
271
|
return null;
|
|
266
272
|
}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
var _react =
|
|
6
|
+
exports.default = exports.KEY = exports.DOCSVC = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactPromiseTracker = require("react-promise-tracker");
|
|
9
9
|
var _Utils = _interopRequireDefault(require("../Utils"));
|
|
10
10
|
var _ej2ReactDocumenteditor = require("@syncfusion/ej2-react-documenteditor");
|
|
@@ -13,17 +13,83 @@ var _ApplicationManager = _interopRequireDefault(require("../ApplicationManager"
|
|
|
13
13
|
var _ej2Base = require("@syncfusion/ej2-base");
|
|
14
14
|
var _Alert = _interopRequireDefault(require("react-bootstrap/Alert"));
|
|
15
15
|
var _LottieIcon = _interopRequireDefault(require("./LottieIcon"));
|
|
16
|
+
var _ej2ReactSplitbuttons = require("@syncfusion/ej2-react-splitbuttons");
|
|
16
17
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
|
-
(
|
|
18
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
19
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
20
|
+
const KEY = exports.KEY = 'ORg4AjUWIQA/Gnt2U1hhQlJBfV5AQmBIYVp/TGpJfl96cVxMZVVBJAtUQF1hTX5adkJiWHtWdXBXT2Je';
|
|
21
|
+
(0, _ej2Base.registerLicense)(KEY);
|
|
22
|
+
const DOCSVC = exports.DOCSVC = "https://document.syncfusion.com/web-services/docx-editor/api/documenteditor/";
|
|
18
23
|
_ej2ReactDocumenteditor.DocumentEditorContainerComponent.Inject(_ej2ReactDocumenteditor.Toolbar);
|
|
24
|
+
function useOnFullyVisible(callback) {
|
|
25
|
+
let {
|
|
26
|
+
threshold = 0.1
|
|
27
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
28
|
+
const ref = (0, _react.useRef)(null);
|
|
29
|
+
(0, _react.useEffect)(() => {
|
|
30
|
+
const el = ref.current;
|
|
31
|
+
if (!el) return;
|
|
32
|
+
const nextPaint = () => new Promise(res => requestAnimationFrame(() => requestAnimationFrame(res)));
|
|
33
|
+
const waitImages = () => {
|
|
34
|
+
const imgs = Array.from(el.querySelectorAll('img'));
|
|
35
|
+
const pending = imgs.filter(img => !(img.complete && img.naturalWidth > 0));
|
|
36
|
+
if (!pending.length) return Promise.resolve();
|
|
37
|
+
return Promise.all(pending.map(img => new Promise(r => {
|
|
38
|
+
const done = () => {
|
|
39
|
+
img.removeEventListener('load', done);
|
|
40
|
+
img.removeEventListener('error', done);
|
|
41
|
+
r();
|
|
42
|
+
};
|
|
43
|
+
img.addEventListener('load', done, {
|
|
44
|
+
once: true
|
|
45
|
+
});
|
|
46
|
+
img.addEventListener('error', done, {
|
|
47
|
+
once: true
|
|
48
|
+
});
|
|
49
|
+
})));
|
|
50
|
+
};
|
|
51
|
+
const waitFonts = () => 'fonts' in document && document.fonts && document.fonts.ready ? document.fonts.ready : Promise.resolve();
|
|
52
|
+
const io = new IntersectionObserver(async entries => {
|
|
53
|
+
const entry = entries[0];
|
|
54
|
+
const fullyVisible = entry.intersectionRatio >= threshold || entry.intersectionRatio >= 0.99;
|
|
55
|
+
if (fullyVisible) {
|
|
56
|
+
io.disconnect();
|
|
57
|
+
await waitImages();
|
|
58
|
+
await waitFonts();
|
|
59
|
+
await nextPaint();
|
|
60
|
+
callback(el);
|
|
61
|
+
}
|
|
62
|
+
}, {
|
|
63
|
+
threshold: [threshold, 0.99]
|
|
64
|
+
});
|
|
65
|
+
io.observe(el);
|
|
66
|
+
return () => io.disconnect();
|
|
67
|
+
}, [callback, threshold]);
|
|
68
|
+
return ref;
|
|
69
|
+
}
|
|
70
|
+
const LEVEL_FMT = ['%1.', '%1.%2.', '%1.%2.%3.'];
|
|
71
|
+
function applyLevel(ed) {
|
|
72
|
+
let level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
73
|
+
const depth = Math.max(0, Math.min(level, LEVEL_FMT.length - 1));
|
|
74
|
+
ed.selection.paragraphFormat.listLevelNumber = depth;
|
|
75
|
+
ed.applyNumbering(LEVEL_FMT[depth], 'Arabic');
|
|
76
|
+
}
|
|
19
77
|
const WordDocumentViewer = props => {
|
|
20
78
|
const [container, setContainer] = _react.default.useState(null);
|
|
21
79
|
const [items, setItems] = _react.default.useState(null);
|
|
22
80
|
const [height, setHeight] = _react.default.useState(0);
|
|
23
81
|
const [width, setWidth] = _react.default.useState(0);
|
|
24
|
-
const [visible, setVisible] = _react.default.useState(
|
|
82
|
+
const [visible, setVisible] = _react.default.useState(true);
|
|
83
|
+
const [reRendering, setReRendering] = _react.default.useState(false);
|
|
25
84
|
const [json, setJson] = _react.default.useState(null);
|
|
26
85
|
const [errorMessage, setErrorMessage] = _react.default.useState(null);
|
|
86
|
+
const ref = useOnFullyVisible(el => {
|
|
87
|
+
console.log('Document fully visible & rendered:', el);
|
|
88
|
+
if (!reRendering) {
|
|
89
|
+
setVisible(false);
|
|
90
|
+
setReRendering(true);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
27
93
|
|
|
28
94
|
/*let items = ['Bold', 'Italic', 'Underline', '|', 'Formats', '|', 'CreateLink', '|',
|
|
29
95
|
{
|
|
@@ -45,14 +111,105 @@ const WordDocumentViewer = props => {
|
|
|
45
111
|
_react.default.useEffect(() => {
|
|
46
112
|
props.valueHandler.api = api();
|
|
47
113
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
114
|
+
const numberingItems = [{
|
|
115
|
+
id: 'lvl-0',
|
|
116
|
+
text: '1.'
|
|
117
|
+
}, {
|
|
118
|
+
id: 'lvl-1',
|
|
119
|
+
text: '1.1'
|
|
120
|
+
}, {
|
|
121
|
+
id: 'lvl-2',
|
|
122
|
+
text: '1.1.1'
|
|
123
|
+
}, {
|
|
124
|
+
separator: true
|
|
125
|
+
}, {
|
|
126
|
+
id: 'clear',
|
|
127
|
+
text: 'Clear list'
|
|
128
|
+
}];
|
|
129
|
+
const onNumberingSelect = args => {
|
|
130
|
+
const ed = containerRef.current?.documentEditor?.editor;
|
|
131
|
+
if (!ed) return;
|
|
132
|
+
switch (args.item.id) {
|
|
133
|
+
case 'lvl-0':
|
|
134
|
+
applyLevel(ed, 0);
|
|
135
|
+
break;
|
|
136
|
+
case 'lvl-1':
|
|
137
|
+
applyLevel(ed, 1);
|
|
138
|
+
break;
|
|
139
|
+
case 'lvl-2':
|
|
140
|
+
applyLevel(ed, 2);
|
|
141
|
+
break;
|
|
142
|
+
case 'clear':
|
|
143
|
+
ed.clearList();
|
|
144
|
+
break;
|
|
145
|
+
default:
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const onCreated = () => {
|
|
150
|
+
const container = containerRef.current;
|
|
151
|
+
const tb = container?.toolbarModule?.toolbar; // EJ2 Toolbar instance
|
|
152
|
+
if (!tb) return;
|
|
153
|
+
|
|
154
|
+
// 1) Add a placeholder button into the toolbar at the end
|
|
155
|
+
tb.addItems([{
|
|
156
|
+
type: 'Separator'
|
|
157
|
+
}, {
|
|
158
|
+
// Use a real HTML template (string) and give it an id
|
|
159
|
+
template: '<button id="numbering-ddb" class="e-btn e-flat" type="button">Numbering</button>',
|
|
160
|
+
tooltipText: 'Numbering styles'
|
|
161
|
+
}], tb.items.length);
|
|
162
|
+
|
|
163
|
+
// 2) Turn that placeholder into a functioning DropDownButton
|
|
164
|
+
const ddb = new DropDownButton({
|
|
165
|
+
content: 'Numbering',
|
|
166
|
+
cssClass: 'e-flat',
|
|
167
|
+
items: [{
|
|
168
|
+
id: 'lvl-0',
|
|
169
|
+
text: '1.'
|
|
170
|
+
}, {
|
|
171
|
+
id: 'lvl-1',
|
|
172
|
+
text: '1.1'
|
|
173
|
+
}, {
|
|
174
|
+
id: 'lvl-2',
|
|
175
|
+
text: '1.1.1'
|
|
176
|
+
}, {
|
|
177
|
+
separator: true
|
|
178
|
+
}, {
|
|
179
|
+
id: 'clear',
|
|
180
|
+
text: 'Clear list'
|
|
181
|
+
}],
|
|
182
|
+
select: args => {
|
|
183
|
+
const ed = container.documentEditor.editor;
|
|
184
|
+
if (!ed) return;
|
|
185
|
+
switch (args.item.id) {
|
|
186
|
+
case 'lvl-0':
|
|
187
|
+
applyLevel(ed, 0);
|
|
188
|
+
break;
|
|
189
|
+
case 'lvl-1':
|
|
190
|
+
applyLevel(ed, 1);
|
|
191
|
+
break;
|
|
192
|
+
case 'lvl-2':
|
|
193
|
+
applyLevel(ed, 2);
|
|
194
|
+
break;
|
|
195
|
+
case 'clear':
|
|
196
|
+
ed.clearList();
|
|
197
|
+
break;
|
|
198
|
+
default:
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}, '#numbering-ddb');
|
|
203
|
+
|
|
204
|
+
// (optional) keep a ref if you want to dispose on unmount
|
|
205
|
+
container._numberingDDB = ddb;
|
|
206
|
+
};
|
|
54
207
|
_react.default.useEffect(() => {
|
|
55
|
-
let toolbarItems = ["Undo", "Redo", "Separator", {
|
|
208
|
+
let toolbarItems = props.commentsOnly ? ["Comments"] : ["Undo", "Redo", "Separator", {
|
|
209
|
+
id: 'bullets',
|
|
210
|
+
text: '• Bullets',
|
|
211
|
+
tooltipText: 'Bulleted list'
|
|
212
|
+
}, "Separator", {
|
|
56
213
|
tooltipText: 'Bold',
|
|
57
214
|
prefixIcon: 'e-icons e-bold',
|
|
58
215
|
command: 'Bold'
|
|
@@ -75,7 +232,7 @@ const WordDocumentViewer = props => {
|
|
|
75
232
|
});
|
|
76
233
|
const formData = new FormData();
|
|
77
234
|
formData.append('files', file, 'document.docx');
|
|
78
|
-
(0, _reactPromiseTracker.trackPromise)(fetch(
|
|
235
|
+
(0, _reactPromiseTracker.trackPromise)(fetch(`${DOCSVC}Import`, {
|
|
79
236
|
method: 'POST',
|
|
80
237
|
body: formData
|
|
81
238
|
}).then(response => {
|
|
@@ -85,6 +242,14 @@ const WordDocumentViewer = props => {
|
|
|
85
242
|
}));
|
|
86
243
|
}
|
|
87
244
|
}, [props.file]);
|
|
245
|
+
_react.default.useEffect(() => {
|
|
246
|
+
if (reRendering) {
|
|
247
|
+
const timer = window.setTimeout(() => {
|
|
248
|
+
setVisible(true);
|
|
249
|
+
}, 1_000);
|
|
250
|
+
return () => window.clearTimeout(timer);
|
|
251
|
+
}
|
|
252
|
+
}, [reRendering]);
|
|
88
253
|
function setupContainer() {
|
|
89
254
|
container.documentEditor.currentUser = _ApplicationManager.default.getUserDetails().name + " " + _ApplicationManager.default.getUserDetails().surname;
|
|
90
255
|
}
|
|
@@ -142,12 +307,39 @@ const WordDocumentViewer = props => {
|
|
|
142
307
|
//container.documentEditor.isReadOnly = (props.readOnly || props.commentsOnly);
|
|
143
308
|
}
|
|
144
309
|
}, [json, container]);
|
|
310
|
+
const onToolbarClick = args => {
|
|
311
|
+
const ed = container?.documentEditor?.editor;
|
|
312
|
+
if (!ed) return;
|
|
313
|
+
switch (args.item.id) {
|
|
314
|
+
case 'bullets':
|
|
315
|
+
ed.applyBullet('\uf0b7', 'Symbol'); // •
|
|
316
|
+
break;
|
|
317
|
+
case 'numbering':
|
|
318
|
+
ed.applyNumbering('%1.', 'Arabic'); // 1.
|
|
319
|
+
break;
|
|
320
|
+
case 'level-0':
|
|
321
|
+
applyLevel(ed, 0);
|
|
322
|
+
break;
|
|
323
|
+
case 'level-1':
|
|
324
|
+
applyLevel(ed, 1);
|
|
325
|
+
break;
|
|
326
|
+
case 'level-2':
|
|
327
|
+
applyLevel(ed, 2);
|
|
328
|
+
break;
|
|
329
|
+
case 'clear-list':
|
|
330
|
+
ed.clearList();
|
|
331
|
+
break;
|
|
332
|
+
default:
|
|
333
|
+
// let built-ins (Undo/Redo/New/Open) work normally
|
|
334
|
+
}
|
|
335
|
+
};
|
|
145
336
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
146
337
|
className: 'no-margin no-padding',
|
|
147
338
|
style: {
|
|
148
339
|
height: '100%'
|
|
149
340
|
},
|
|
150
|
-
id:
|
|
341
|
+
id: `parent-container`,
|
|
342
|
+
ref: ref
|
|
151
343
|
}, !visible && /*#__PURE__*/_react.default.createElement("div", {
|
|
152
344
|
style: {
|
|
153
345
|
height: '100%',
|
|
@@ -177,7 +369,7 @@ const WordDocumentViewer = props => {
|
|
|
177
369
|
color: 'rgba(255, 255, 255, 0.8)'
|
|
178
370
|
}
|
|
179
371
|
}, errorMessage))), visible && items && (_Utils.default.isNull(props.trackChanges) || props.trackChanges === true) && /*#__PURE__*/_react.default.createElement(_ej2ReactDocumenteditor.DocumentEditorContainerComponent, {
|
|
180
|
-
id:
|
|
372
|
+
id: `${props.id}-container`,
|
|
181
373
|
height: '690px',
|
|
182
374
|
ref: scope => {
|
|
183
375
|
setContainer(scope);
|
|
@@ -188,14 +380,16 @@ const WordDocumentViewer = props => {
|
|
|
188
380
|
container.documentEditor.resize();
|
|
189
381
|
}
|
|
190
382
|
},
|
|
383
|
+
enablePersistence: false,
|
|
384
|
+
toolbarClick: onToolbarClick,
|
|
191
385
|
toolbarItems: items,
|
|
192
|
-
restrictEditing: props.readOnly,
|
|
386
|
+
restrictEditing: props.readOnly && !props.commentsOnly,
|
|
193
387
|
showPropertiesPane: false,
|
|
194
388
|
enableTrackChanges: true,
|
|
195
|
-
serviceUrl:
|
|
196
|
-
enableToolbar: !
|
|
389
|
+
serviceUrl: DOCSVC,
|
|
390
|
+
enableToolbar: !props.readOnly || props.commentsOnly
|
|
197
391
|
}), visible && items && props.trackChanges === false && /*#__PURE__*/_react.default.createElement(_ej2ReactDocumenteditor.DocumentEditorContainerComponent, {
|
|
198
|
-
id:
|
|
392
|
+
id: `${props.id}-container`,
|
|
199
393
|
height: '690px',
|
|
200
394
|
ref: scope => {
|
|
201
395
|
setContainer(scope);
|
|
@@ -206,11 +400,13 @@ const WordDocumentViewer = props => {
|
|
|
206
400
|
container.documentEditor.resize();
|
|
207
401
|
}
|
|
208
402
|
},
|
|
403
|
+
enablePersistence: false,
|
|
404
|
+
toolbarClick: onToolbarClick,
|
|
209
405
|
toolbarItems: items,
|
|
210
|
-
restrictEditing: props.readOnly,
|
|
406
|
+
restrictEditing: props.readOnly && !props.commentsOnly,
|
|
211
407
|
showPropertiesPane: false,
|
|
212
|
-
serviceUrl:
|
|
213
|
-
enableToolbar: !
|
|
408
|
+
serviceUrl: DOCSVC,
|
|
409
|
+
enableToolbar: !props.readOnly || props.commentsOnly
|
|
214
410
|
}));
|
|
215
411
|
};
|
|
216
412
|
var _default = exports.default = WordDocumentViewer;
|
|
@@ -15,6 +15,7 @@ var _Toolbar = _interopRequireDefault(require("../Toolbar"));
|
|
|
15
15
|
var _Observable = _interopRequireDefault(require("../../event/Observable"));
|
|
16
16
|
var _DynamicJS = _interopRequireDefault(require("../../DynamicJS"));
|
|
17
17
|
var _FormHelperText = _interopRequireDefault(require("@mui/material/FormHelperText"));
|
|
18
|
+
var _ApplicationManager = _interopRequireDefault(require("../../ApplicationManager"));
|
|
18
19
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
20
|
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
21
|
function getEditorType(columnName, gridConfig) {
|
|
@@ -58,7 +59,8 @@ const GridFieldWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.de
|
|
|
58
59
|
}
|
|
59
60
|
setCrudToolstripWidth(numCrudButtons * 40 + 'px');
|
|
60
61
|
try {
|
|
61
|
-
let
|
|
62
|
+
let parsedConfig = _Utils.default.parseConfig(props.config, props.viewId);
|
|
63
|
+
let label = _ApplicationManager.default.isExpression(parsedConfig.attributes['label']) ? _DynamicJS.default.executeScript(props.config.id + 'label', _Utils.default.getComponentAttribute(parsedConfig, 'label', ''), props.config.viewId, true, null, null, false) : parsedConfig.attributes['label'];
|
|
62
64
|
setLabel(label);
|
|
63
65
|
} catch (e) {
|
|
64
66
|
setLabel(_Utils.default.getComponentAttribute(props.config, 'label', ''));
|
|
@@ -13,6 +13,8 @@ var _BaseField = require("./BaseField");
|
|
|
13
13
|
var _Utils = _interopRequireDefault(require("../../Utils"));
|
|
14
14
|
var _FormHelperText = _interopRequireDefault(require("@mui/material/FormHelperText"));
|
|
15
15
|
var _FormControl = _interopRequireDefault(require("@mui/material/FormControl"));
|
|
16
|
+
var _DynamicJS = _interopRequireDefault(require("../../DynamicJS"));
|
|
17
|
+
var _ApplicationManager = _interopRequireDefault(require("../../ApplicationManager"));
|
|
16
18
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
17
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); }
|
|
18
20
|
const RadioGroupWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
@@ -50,6 +52,7 @@ const RadioGroupWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.d
|
|
|
50
52
|
base.handleValueChange(e.target.value);
|
|
51
53
|
}
|
|
52
54
|
}, options.map((option, index) => {
|
|
55
|
+
let label = _ApplicationManager.default.isExpression(option.label) ? _DynamicJS.default.executeScript(props.config.id + 'label', option.label, props.config.viewId, true, null, null, false) : option.label;
|
|
53
56
|
return /*#__PURE__*/_react.default.createElement(_FormControlLabel.default, {
|
|
54
57
|
key: index,
|
|
55
58
|
value: option.value,
|
|
@@ -57,7 +60,7 @@ const RadioGroupWrapper = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.d
|
|
|
57
60
|
disabled: base.disabled,
|
|
58
61
|
checked: option.value === value
|
|
59
62
|
}),
|
|
60
|
-
label:
|
|
63
|
+
label: label
|
|
61
64
|
});
|
|
62
65
|
})), base.errorMessage && /*#__PURE__*/_react.default.createElement(_FormHelperText.default, {
|
|
63
66
|
style: {
|
|
@@ -29,6 +29,7 @@ const Toolbar = props => {
|
|
|
29
29
|
const openMoreActions = Boolean(anchorEl);
|
|
30
30
|
const leaveButtonOpen = Boolean(leaveButtonAnchorEl);
|
|
31
31
|
const [screenShared, setScreenShared] = (0, _react.useState)(false);
|
|
32
|
+
const [minutesShown, setMinutesShown] = (0, _react.useState)(false);
|
|
32
33
|
const [roomStatus, setRoomStatus] = (0, _react.useState)();
|
|
33
34
|
const [raisedHandsNames, setRaisedHandsNames] = (0, _react.useState)([]);
|
|
34
35
|
const [buttonVisibility, setButtonVisibility] = (0, _react.useState)({});
|
|
@@ -60,6 +61,9 @@ const Toolbar = props => {
|
|
|
60
61
|
(0, _react.useEffect)(() => {
|
|
61
62
|
setScreenShared(props.screenShared);
|
|
62
63
|
}, [props.screenShared]);
|
|
64
|
+
(0, _react.useEffect)(() => {
|
|
65
|
+
setMinutesShown(props.minutesShown);
|
|
66
|
+
}, [props.minutesShown]);
|
|
63
67
|
(0, _react.useEffect)(() => {
|
|
64
68
|
setIsRecording(props.isRecording);
|
|
65
69
|
}, [props.isRecording]);
|
|
@@ -143,6 +147,15 @@ const Toolbar = props => {
|
|
|
143
147
|
const showChat = () => {
|
|
144
148
|
eventHandler.showChat();
|
|
145
149
|
};
|
|
150
|
+
const showMinutes = () => {
|
|
151
|
+
eventHandler.showMinutes();
|
|
152
|
+
};
|
|
153
|
+
const hideMinutes = () => {
|
|
154
|
+
eventHandler.hideMinutes();
|
|
155
|
+
};
|
|
156
|
+
const saveMinutes = () => {
|
|
157
|
+
eventHandler.saveMinutes();
|
|
158
|
+
};
|
|
146
159
|
const raiseHand = () => {
|
|
147
160
|
eventHandler.raiseHand();
|
|
148
161
|
};
|
|
@@ -401,7 +414,63 @@ const Toolbar = props => {
|
|
|
401
414
|
id: 'CHAT_BUBBLE'
|
|
402
415
|
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
403
416
|
className: 'text'
|
|
404
|
-
}, "Chat"))))))), roomStatus === 'SESSION' && /*#__PURE__*/_react.default.createElement("div", {
|
|
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", {
|
|
405
474
|
className: 'button-wrapper'
|
|
406
475
|
}, raisedHands.length > 0 && /*#__PURE__*/_react.default.createElement("div", {
|
|
407
476
|
className: 'marker'
|
|
@@ -661,7 +730,29 @@ const Toolbar = props => {
|
|
|
661
730
|
}
|
|
662
731
|
}, /*#__PURE__*/_react.default.createElement(_material.ListItemIcon, null, /*#__PURE__*/_react.default.createElement(_Icon.default, {
|
|
663
732
|
id: 'CHAT_BUBBLE'
|
|
664
|
-
})), /*#__PURE__*/_react.default.createElement("div", null, hasUnreadChats ? '1' : '', "\xA0Chat"))), !buttonVisibility.
|
|
733
|
+
})), /*#__PURE__*/_react.default.createElement("div", null, hasUnreadChats ? '1' : '', "\xA0Chat"))), !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", {
|
|
665
756
|
className: 'button-wrapper no-margin no-padding'
|
|
666
757
|
}, /*#__PURE__*/_react.default.createElement(_material.MenuItem, {
|
|
667
758
|
onClick: () => {
|
|
@@ -65,6 +65,9 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
|
|
|
65
65
|
const [screenShared, setScreenShared] = _react.default.useState(null);
|
|
66
66
|
const [startScreenSharing, setStartScreenSharing] = _react.default.useState(false);
|
|
67
67
|
const [raisedHands, setRaisedHands] = (0, _react.useState)([]);
|
|
68
|
+
const [minutesShown, setMinutesShown] = _react.default.useState(false);
|
|
69
|
+
const [startShowingMinutes, setStartShowingMinutes] = _react.default.useState(false);
|
|
70
|
+
const vcRoomWorkspaceRef = (0, _react.useRef)();
|
|
68
71
|
const api = () => {
|
|
69
72
|
return {
|
|
70
73
|
loadChats() {
|
|
@@ -472,6 +475,18 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
|
|
|
472
475
|
setScreenShared(false);
|
|
473
476
|
setStartScreenSharing(false);
|
|
474
477
|
},
|
|
478
|
+
showMinutes: () => {
|
|
479
|
+
setStartShowingMinutes(true);
|
|
480
|
+
},
|
|
481
|
+
hideMinutes: () => {
|
|
482
|
+
setMinutesShown(false);
|
|
483
|
+
setStartShowingMinutes(false);
|
|
484
|
+
},
|
|
485
|
+
saveMinutes: () => {
|
|
486
|
+
if (vcRoomWorkspaceRef.current && vcRoomWorkspaceRef.current.saveMinutes) {
|
|
487
|
+
vcRoomWorkspaceRef.current.saveMinutes();
|
|
488
|
+
}
|
|
489
|
+
},
|
|
475
490
|
recordMeeting: () => {
|
|
476
491
|
recordMeeting();
|
|
477
492
|
},
|
|
@@ -494,6 +509,7 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
|
|
|
494
509
|
audioMuted: audioMuted,
|
|
495
510
|
displayState: displayState,
|
|
496
511
|
screenShared: screenShared,
|
|
512
|
+
minutesShown: minutesShown,
|
|
497
513
|
roomStatus: roomStatus,
|
|
498
514
|
isHost: props.calendarEvent.host.username === _ApplicationManager.default.getUserDetails().username,
|
|
499
515
|
autoPermit: !props.calendarEvent.host.askToJoin,
|
|
@@ -522,12 +538,16 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
|
|
|
522
538
|
},
|
|
523
539
|
className: 'centered-flex-box'
|
|
524
540
|
}, /*#__PURE__*/_react.default.createElement("div", null, _VCRoom.SYSTEM_ERROR_MESSAGE)), rtpCapabilities && participants && currentUserFullName && (roomStatus === Status.SESSION || roomStatus === Status.LOBBY) && /*#__PURE__*/_react.default.createElement(_VCRoomWorkspace.default, {
|
|
541
|
+
ref: vcRoomWorkspaceRef,
|
|
525
542
|
participants: participants,
|
|
526
543
|
mode: meetingParticipantGridMode,
|
|
544
|
+
viewId: props.viewId,
|
|
527
545
|
audioMuted: audioMuted,
|
|
528
546
|
videoMuted: videoMuted,
|
|
529
547
|
meetingTitle: props.calendarEvent.title,
|
|
530
|
-
|
|
548
|
+
eventKey: props.calendarEvent.key,
|
|
549
|
+
minutesDocumentId: props.calendarEvent.minutesDocumentId,
|
|
550
|
+
procMeetingId: props.procMeetingId,
|
|
531
551
|
currentUserFullName: currentUserFullName,
|
|
532
552
|
onGridSetup: () => {
|
|
533
553
|
//setSideBarTab('People');
|
|
@@ -545,6 +565,16 @@ const TrainingRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.defaul
|
|
|
545
565
|
setScreenShared(true);
|
|
546
566
|
setStartScreenSharing(false);
|
|
547
567
|
},
|
|
568
|
+
startShowingMinutes: startShowingMinutes,
|
|
569
|
+
onStartShowingMinutes: () => {
|
|
570
|
+
setMinutesShown(true);
|
|
571
|
+
setStartShowingMinutes(false);
|
|
572
|
+
},
|
|
573
|
+
onStopShowingMinutes: () => {
|
|
574
|
+
setMinutesShown(false);
|
|
575
|
+
setStartShowingMinutes(false);
|
|
576
|
+
},
|
|
577
|
+
minutesShown: minutesShown,
|
|
548
578
|
autoPermit: autoPermit,
|
|
549
579
|
rtpCapabilities: rtpCapabilities,
|
|
550
580
|
screenShared: screenShared,
|
|
@@ -76,7 +76,8 @@ const VCRoom = /*#__PURE__*/_react.default.memo(/*#__PURE__*/_react.default.forw
|
|
|
76
76
|
}, props.config.roomType === 'training' ? /*#__PURE__*/_react.default.createElement(_TrainingRoom.default, {
|
|
77
77
|
settings: settings,
|
|
78
78
|
calendarEvent: calendarEvent,
|
|
79
|
-
handle: vcHandle
|
|
79
|
+
handle: vcHandle,
|
|
80
|
+
viewId: props.viewId
|
|
80
81
|
}) : /*#__PURE__*/_react.default.createElement("div", null, "Unknown room type"))));
|
|
81
82
|
}));
|
|
82
83
|
var _default = exports.default = VCRoom;
|
|
@@ -19,6 +19,13 @@ var _LobbyWaitingList = _interopRequireDefault(require("./LobbyWaitingList"));
|
|
|
19
19
|
var _VCRoom = require("./VCRoom");
|
|
20
20
|
var _SideBarContent = _interopRequireDefault(require("./SideBarContent"));
|
|
21
21
|
var _ApplicationManager = _interopRequireDefault(require("../../ApplicationManager"));
|
|
22
|
+
var _WordDocumentViewer = _interopRequireDefault(require("../WordDocumentViewer"));
|
|
23
|
+
var _Utils = _interopRequireDefault(require("../../Utils"));
|
|
24
|
+
var _DocumentViewer = _interopRequireDefault(require("../DocumentViewer"));
|
|
25
|
+
var _Event = _interopRequireDefault(require("../../event/Event"));
|
|
26
|
+
var _Observable = _interopRequireDefault(require("../../event/Observable"));
|
|
27
|
+
var _EventType = _interopRequireDefault(require("../../event/EventType"));
|
|
28
|
+
var _uuid = require("uuid");
|
|
22
29
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
23
30
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
24
31
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -26,9 +33,44 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
26
33
|
|
|
27
34
|
const MAX_COLS = 3;
|
|
28
35
|
const MAX_ROWS = 2;
|
|
36
|
+
const meetingViewConfig2 = {
|
|
37
|
+
"type": "documentViewer",
|
|
38
|
+
"id": "meetingMinute",
|
|
39
|
+
"fileType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
40
|
+
"attributes": {
|
|
41
|
+
"style": {
|
|
42
|
+
"width": "100%",
|
|
43
|
+
"minHeight": "100%",
|
|
44
|
+
"height": "100%",
|
|
45
|
+
"padding": "24px"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"trackChanges": false,
|
|
49
|
+
"readOnly": false,
|
|
50
|
+
"commentsOnly": false,
|
|
51
|
+
"eventHandlingConfig": {
|
|
52
|
+
"subscriptions": [{
|
|
53
|
+
"publisher": "vcRoom",
|
|
54
|
+
"eventType": "DATA_ARRIVED",
|
|
55
|
+
"actions": [{
|
|
56
|
+
"actionType": "loadData"
|
|
57
|
+
}]
|
|
58
|
+
}]
|
|
59
|
+
},
|
|
60
|
+
"dataService": {
|
|
61
|
+
"type": "rest",
|
|
62
|
+
"url": "/docs/api/v1/manager/find",
|
|
63
|
+
"method": "GET",
|
|
64
|
+
"parameters": [{
|
|
65
|
+
"name": "documentId",
|
|
66
|
+
"httpParameterType": "PATH_VARIABLE",
|
|
67
|
+
"value": "c28a4a56-6fc0-4887-bca0-29f43da0b3b2"
|
|
68
|
+
}]
|
|
69
|
+
}
|
|
70
|
+
};
|
|
29
71
|
|
|
30
72
|
// TODO : Clean-up all tracks and producers and consumers when the component closes
|
|
31
|
-
const VCRoomWorkspace = props => {
|
|
73
|
+
const VCRoomWorkspace = /*#__PURE__*/_react.default.forwardRef((props, ref) => {
|
|
32
74
|
const [currentUserParticipant, setCurrentUserParticipant] = _react.default.useState(null);
|
|
33
75
|
const [inViewParticipants, setInViewParticipants] = _react.default.useState([]);
|
|
34
76
|
const [consumerTransport, setConsumerTransport] = _react.default.useState(null);
|
|
@@ -43,6 +85,20 @@ const VCRoomWorkspace = props => {
|
|
|
43
85
|
const [shareScreenConsumer, setShareScreenConsumer] = _react.default.useState(null);
|
|
44
86
|
const [grid, setGrid] = _react.default.useState(null);
|
|
45
87
|
const [eventHandler] = (0, _react.useState)({});
|
|
88
|
+
const [minutesShown, setMinutesShown] = _react.default.useState(false);
|
|
89
|
+
const [showMinutes, setShowMinutes] = _react.default.useState(false);
|
|
90
|
+
const [meetingViewHandler, setMeetingViewHandler] = _react.default.useState(null);
|
|
91
|
+
const [minutesDocument, setMinutesDocument] = _react.default.useState(null);
|
|
92
|
+
const [meetingViewConfig, setMeetingViewConfig] = _react.default.useState(null);
|
|
93
|
+
const [hasLoadedMinutes, setHasLoadedMinutes] = _react.default.useState(false);
|
|
94
|
+
|
|
95
|
+
// Create handler once on mount
|
|
96
|
+
_react.default.useEffect(() => {
|
|
97
|
+
if (!meetingViewHandler) {
|
|
98
|
+
setMeetingViewHandler({});
|
|
99
|
+
}
|
|
100
|
+
}, []);
|
|
101
|
+
const wordEditorValueHandler = (0, _react.useRef)({});
|
|
46
102
|
const transports = (0, _react.useRef)(new _Transports.default());
|
|
47
103
|
const shareScreenVideoRef = (0, _react.useRef)();
|
|
48
104
|
const shareScreenStream = (0, _react.useRef)();
|
|
@@ -50,6 +106,8 @@ const VCRoomWorkspace = props => {
|
|
|
50
106
|
waitingList,
|
|
51
107
|
roomStatus,
|
|
52
108
|
meetingId,
|
|
109
|
+
minutesDocumentId,
|
|
110
|
+
eventKey,
|
|
53
111
|
meetingChat,
|
|
54
112
|
sideBarTab,
|
|
55
113
|
meetingTitle,
|
|
@@ -61,8 +119,91 @@ const VCRoomWorkspace = props => {
|
|
|
61
119
|
onloadScreenShareData,
|
|
62
120
|
displayState,
|
|
63
121
|
startScreenSharing,
|
|
64
|
-
participants
|
|
122
|
+
participants,
|
|
123
|
+
startShowingMinutes,
|
|
124
|
+
onStartShowingMinutes,
|
|
125
|
+
onStopShowingMinutes,
|
|
126
|
+
minutesShown: minutesShownProp
|
|
65
127
|
} = props;
|
|
128
|
+
const saveMinutes = async () => {
|
|
129
|
+
try {
|
|
130
|
+
if (!meetingViewHandler || !meetingViewHandler.api) {
|
|
131
|
+
console.error("Meeting view handler not available");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const file = await meetingViewHandler.api.getDocumentValue();
|
|
135
|
+
if (!file) {
|
|
136
|
+
console.error("No document to save");
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const newDocumentId = (0, _uuid.v4)();
|
|
140
|
+
const metadata = {
|
|
141
|
+
documentRepositoryCacheId: newDocumentId,
|
|
142
|
+
correlationId: props.viewId + ".minutesDocument",
|
|
143
|
+
name: file.name,
|
|
144
|
+
type: file.type
|
|
145
|
+
};
|
|
146
|
+
const accessToken = sessionStorage.getItem("accessToken");
|
|
147
|
+
const idToken = sessionStorage.getItem("idToken");
|
|
148
|
+
const location = window.location.protocol + "//" + window.location.hostname;
|
|
149
|
+
let data = new FormData();
|
|
150
|
+
data.append("metadata", JSON.stringify(metadata));
|
|
151
|
+
data.append("file", file);
|
|
152
|
+
let fetchConfig = {
|
|
153
|
+
method: 'POST',
|
|
154
|
+
headers: {
|
|
155
|
+
'Accept': 'application/json',
|
|
156
|
+
'Authorization': 'Bearer ' + accessToken,
|
|
157
|
+
'idToken': idToken,
|
|
158
|
+
'tenant': _ApplicationManager.default.getActiveTenant()
|
|
159
|
+
},
|
|
160
|
+
body: data
|
|
161
|
+
};
|
|
162
|
+
let uploadUrl = location + _ApplicationManager.default.getContextRoot() + "/docs/api/v1/manager/upload/save";
|
|
163
|
+
const uploadResponse = await fetch(encodeURI(uploadUrl), fetchConfig);
|
|
164
|
+
if (!uploadResponse.ok) {
|
|
165
|
+
throw new Error('Upload failed');
|
|
166
|
+
}
|
|
167
|
+
const updatePayload = {
|
|
168
|
+
id: eventKey,
|
|
169
|
+
minutesDocumentId: newDocumentId
|
|
170
|
+
};
|
|
171
|
+
let updateFetchConfig = {
|
|
172
|
+
method: 'POST',
|
|
173
|
+
headers: {
|
|
174
|
+
'Accept': 'application/json',
|
|
175
|
+
'Content-Type': 'application/json',
|
|
176
|
+
'Authorization': 'Bearer ' + accessToken,
|
|
177
|
+
'idToken': idToken,
|
|
178
|
+
'tenant': _ApplicationManager.default.getActiveTenant()
|
|
179
|
+
},
|
|
180
|
+
body: JSON.stringify(updatePayload)
|
|
181
|
+
};
|
|
182
|
+
let updateUrl = location + _ApplicationManager.default.getContextRoot() + "/tender/api/v1/evaluation/meeting/minuteDocument";
|
|
183
|
+
const updateResponse = await fetch(encodeURI(updateUrl), updateFetchConfig);
|
|
184
|
+
if (!updateResponse.ok) {
|
|
185
|
+
throw new Error('Failed to update meeting minutes document');
|
|
186
|
+
}
|
|
187
|
+
console.log("Minutes saved successfully");
|
|
188
|
+
let message = {
|
|
189
|
+
messageType: 'SUCCESS',
|
|
190
|
+
message: 'Meeting minutes saved successfully'
|
|
191
|
+
};
|
|
192
|
+
let event = new _Event.default(meetingViewHandler, props.viewId, message);
|
|
193
|
+
_Observable.default.fireEvent(_EventType.default.MESSAGE_ARRIVED, event);
|
|
194
|
+
} catch (e) {
|
|
195
|
+
console.error("Error saving minutes:", e);
|
|
196
|
+
let message = {
|
|
197
|
+
messageType: 'ERROR',
|
|
198
|
+
message: 'Failed to save meeting minutes'
|
|
199
|
+
};
|
|
200
|
+
let event = new _Event.default(meetingViewHandler, props.viewId, message);
|
|
201
|
+
_Observable.default.fireEvent(_EventType.default.MESSAGE_ARRIVED, event);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
_react.default.useImperativeHandle(ref, () => ({
|
|
205
|
+
saveMinutes
|
|
206
|
+
}));
|
|
66
207
|
const startShareScreen = () => {
|
|
67
208
|
produceScreenShare();
|
|
68
209
|
};
|
|
@@ -306,6 +447,65 @@ const VCRoomWorkspace = props => {
|
|
|
306
447
|
produceScreenShare();
|
|
307
448
|
}
|
|
308
449
|
}, [startScreenSharing]);
|
|
450
|
+
(0, _react.useEffect)(() => {
|
|
451
|
+
if (startShowingMinutes) {
|
|
452
|
+
setShowMinutes(true);
|
|
453
|
+
setMinutesShown(true);
|
|
454
|
+
onStartShowingMinutes();
|
|
455
|
+
}
|
|
456
|
+
}, [startShowingMinutes]);
|
|
457
|
+
(0, _react.useEffect)(() => {
|
|
458
|
+
// Sync with parent's minutesShown state
|
|
459
|
+
if (minutesShownProp === false && minutesShown === true) {
|
|
460
|
+
setShowMinutes(false);
|
|
461
|
+
setMinutesShown(false);
|
|
462
|
+
}
|
|
463
|
+
}, [minutesShownProp]);
|
|
464
|
+
(0, _react.useEffect)(() => {
|
|
465
|
+
if (minutesDocumentId) {
|
|
466
|
+
const newConfig = {
|
|
467
|
+
"type": "documentViewer",
|
|
468
|
+
"id": "meetingMinute",
|
|
469
|
+
"fileType": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
470
|
+
"attributes": {
|
|
471
|
+
"style": {
|
|
472
|
+
"width": "calc(100% - 436px)",
|
|
473
|
+
"minHeight": "100%",
|
|
474
|
+
"height": "100%",
|
|
475
|
+
"padding": "24px"
|
|
476
|
+
},
|
|
477
|
+
"label": "Meeting Minutes"
|
|
478
|
+
},
|
|
479
|
+
"trackChanges": true,
|
|
480
|
+
"readOnly": false,
|
|
481
|
+
"commentsOnly": false,
|
|
482
|
+
"eventHandlingConfig": {
|
|
483
|
+
"subscriptions": []
|
|
484
|
+
},
|
|
485
|
+
"dataService": {
|
|
486
|
+
"type": "rest",
|
|
487
|
+
"url": "/docs/api/v1/manager/find",
|
|
488
|
+
"method": "GET",
|
|
489
|
+
"parameters": [{
|
|
490
|
+
"name": "documentId",
|
|
491
|
+
"httpParameterType": "PATH_VARIABLE",
|
|
492
|
+
"value": minutesDocumentId
|
|
493
|
+
}]
|
|
494
|
+
}
|
|
495
|
+
};
|
|
496
|
+
setMeetingViewConfig(newConfig);
|
|
497
|
+
}
|
|
498
|
+
}, [minutesDocumentId]);
|
|
499
|
+
(0, _react.useEffect)(() => {
|
|
500
|
+
if (meetingViewHandler && meetingViewHandler.api) {
|
|
501
|
+
meetingViewHandler.api.loadData();
|
|
502
|
+
}
|
|
503
|
+
}, [meetingViewHandler]);
|
|
504
|
+
(0, _react.useEffect)(() => {
|
|
505
|
+
if (meetingViewConfig2 && minutesDocumentId && meetingViewHandler && meetingViewHandler.api && showMinutes) {
|
|
506
|
+
meetingViewHandler.api.refresh();
|
|
507
|
+
}
|
|
508
|
+
}, [minutesDocumentId, meetingViewConfig2, meetingViewHandler, showMinutes]);
|
|
309
509
|
(0, _react.useEffect)(() => {
|
|
310
510
|
if (onloadScreenShareData && device && consumerTransport) {
|
|
311
511
|
consume(onloadScreenShareData);
|
|
@@ -476,8 +676,11 @@ const VCRoomWorkspace = props => {
|
|
|
476
676
|
isHost: isHost
|
|
477
677
|
}));
|
|
478
678
|
}
|
|
679
|
+
function getMeetingDocument() {
|
|
680
|
+
return meetingViewHandler.value;
|
|
681
|
+
}
|
|
479
682
|
function renderParticipantGrid() {
|
|
480
|
-
return (!screenShared && !whiteBoardShown || screenShared && !showSharedScreen && !someoneSharing) && /*#__PURE__*/_react.default.createElement(_Box.default, {
|
|
683
|
+
return (!screenShared && !whiteBoardShown && !minutesShown || screenShared && !showSharedScreen && !someoneSharing && !minutesShown) && /*#__PURE__*/_react.default.createElement(_Box.default, {
|
|
481
684
|
style: {
|
|
482
685
|
flexGrow: 1,
|
|
483
686
|
height: displayState === 'MAXIMIZED' ? 'calc(100% - 232px)' : '100%',
|
|
@@ -563,13 +766,30 @@ const VCRoomWorkspace = props => {
|
|
|
563
766
|
maxHeight: '100%',
|
|
564
767
|
zIndex: '0'
|
|
565
768
|
}
|
|
769
|
+
}))), /*#__PURE__*/_react.default.createElement("div", {
|
|
770
|
+
className: 'content-box',
|
|
771
|
+
style: {
|
|
772
|
+
display: !(minutesShown && showMinutes) ? 'none' : null,
|
|
773
|
+
backgroundColor: 'white',
|
|
774
|
+
padding: '16px',
|
|
775
|
+
overflow: 'auto'
|
|
776
|
+
}
|
|
777
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
778
|
+
style: {
|
|
779
|
+
width: '100%',
|
|
780
|
+
maxHeight: '100%'
|
|
781
|
+
}
|
|
782
|
+
}, /*#__PURE__*/_react.default.createElement(_DocumentViewer.default, {
|
|
783
|
+
config: meetingViewConfig2,
|
|
784
|
+
handle: meetingViewHandler,
|
|
785
|
+
viewId: props.viewId
|
|
566
786
|
})))), /*#__PURE__*/_react.default.createElement("div", {
|
|
567
787
|
className: `${displayState === 'MAXIMIZED' ? 'row-*-*' : ''}`,
|
|
568
788
|
style: {
|
|
569
789
|
width: displayState === 'MAXIMIZED' ? '100%' : '200px',
|
|
570
790
|
height: displayState === 'MAXIMIZED' ? '152px' : displayState === 'MINIMIZED' ? '100%' : null,
|
|
571
791
|
marginRight: '0',
|
|
572
|
-
display: screenShared && showSharedScreen || someoneSharing ? 'none' : displayState === 'MAXIMIZED' ? 'flex' : displayState === 'MINIMIZED' ? 'table-cell' : '',
|
|
792
|
+
display: screenShared && showSharedScreen || someoneSharing || minutesShown && showMinutes ? 'none' : displayState === 'MAXIMIZED' ? 'flex' : displayState === 'MINIMIZED' ? 'table-cell' : '',
|
|
573
793
|
alignItems: 'center',
|
|
574
794
|
verticalAlign: 'top',
|
|
575
795
|
bottom: '8px',
|
|
@@ -609,5 +829,5 @@ const VCRoomWorkspace = props => {
|
|
|
609
829
|
rejectUserHandler: props.rejectUserHandler,
|
|
610
830
|
acceptUserHandler: props.acceptUserHandler
|
|
611
831
|
}))) : null;
|
|
612
|
-
};
|
|
832
|
+
});
|
|
613
833
|
var _default = exports.default = VCRoomWorkspace;
|
package/dist/js/Calendar.js
CHANGED
|
@@ -153,6 +153,7 @@ class Calendar {
|
|
|
153
153
|
status: event.extendedProps.status,
|
|
154
154
|
host: event.extendedProps.host,
|
|
155
155
|
chairPersonId: event.chairPersonId ? event.chairPersonId : event.extendedProps.host.id,
|
|
156
|
+
minutesDocumentId: event.minutesDocumentId,
|
|
156
157
|
attendees: event.extendedProps.attendees,
|
|
157
158
|
privacyType: event.extendedProps.privacyType,
|
|
158
159
|
documents: event.extendedProps.documents,
|
|
@@ -13,20 +13,25 @@ class ProcurementMeetings {
|
|
|
13
13
|
constructor(resolver) {
|
|
14
14
|
this.resolver = resolver;
|
|
15
15
|
}
|
|
16
|
-
emitSocketEvent = (systemEventType, data, meeting) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
emitSocketEvent = (viewId, systemEventType, data, meeting) => {
|
|
17
|
+
return new Promise((resolve, reject) => {
|
|
18
|
+
let recipientIds = [];
|
|
19
|
+
for (const attendee of meeting.attendees) {
|
|
20
|
+
let username = attendee.username;
|
|
21
|
+
if (username !== _ApplicationManager.default.getUserDetails().username) {
|
|
22
|
+
recipientIds.push(username);
|
|
23
|
+
}
|
|
22
24
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
let eventData = {
|
|
26
|
+
systemEventType: systemEventType,
|
|
27
|
+
recipients: recipientIds,
|
|
28
|
+
data: data
|
|
29
|
+
};
|
|
30
|
+
_SocketManager.default.emitEvent(_VCEventType.VCEventType.SYSTEM_EVENT, eventData).then(result => resolve(result)).catch(e => {
|
|
31
|
+
_ApplicationManager.default.alert(viewId, "You are currently offline. Please check your network connectivity", "ERROR");
|
|
32
|
+
reject(e);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
30
35
|
};
|
|
31
36
|
startMeeting = meeting => {
|
|
32
37
|
return this.emitSocketEvent("startMeeting", {
|
|
@@ -57,13 +62,25 @@ class ProcurementMeetings {
|
|
|
57
62
|
}
|
|
58
63
|
} else if (event.systemEventType === 'openPoll') {
|
|
59
64
|
_ApplicationManager.default.resolveComponentApi("vcRoom").loadChats();
|
|
60
|
-
} else if (event.systemEventType === '
|
|
61
|
-
let
|
|
62
|
-
if (
|
|
63
|
-
|
|
65
|
+
} else if (event.systemEventType === 'meetingStepChanged') {
|
|
66
|
+
let api = _ApplicationManager.default.resolveComponentApi(viewId);
|
|
67
|
+
if (api.model.currentMeetingStep === 'QUORUM' && data.step === 'COMPLIANCE_EVALUATION') {
|
|
68
|
+
this.showComponent("preEvaluationNext");
|
|
69
|
+
} else if (api.model.currentMeetingStep === 'PRE_COMPLIANCE_EVALUATION' && data.step === 'FUNCTIONAL_EVALUATION') {
|
|
70
|
+
this.showComponent("complianceEvaluationNext");
|
|
71
|
+
} else if (api.model.currentMeetingStep === 'COMPLIANCE_EVALUATION' && data.step === 'PRICE_EVALUATION') {
|
|
72
|
+
this.showComponent("functionalEvaluationNext");
|
|
73
|
+
} else if (api.model.currentMeetingStep === 'FUNCTIONAL_EVALUATION' && data.step === 'CONDITION_OF_AWARD') {
|
|
74
|
+
this.showComponent("priceEvaluationNext");
|
|
64
75
|
}
|
|
65
76
|
}
|
|
66
77
|
};
|
|
78
|
+
showComponent = id => {
|
|
79
|
+
let component = _ApplicationManager.default.resolveComponentApi(id);
|
|
80
|
+
if (component) {
|
|
81
|
+
component.visible = true;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
67
84
|
}
|
|
68
85
|
exports.ProcurementMeetings = ProcurementMeetings;
|
|
69
86
|
const instance = new ProcurementMeetings();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agilemotion/oui-react-js",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.43",
|
|
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": "",
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"@syncfusion/ej2-react-base": "^26.2.10",
|
|
63
63
|
"@syncfusion/ej2-react-documenteditor": "^26.2.14",
|
|
64
64
|
"@syncfusion/ej2-react-popups": "^26.2.11",
|
|
65
|
+
"@syncfusion/ej2-react-splitbuttons": "^31.2.2",
|
|
65
66
|
"@syncfusion/ej2-splitbuttons": "^26.2.10",
|
|
66
67
|
"@testing-library/dom": "^10.4.0",
|
|
67
68
|
"@testing-library/jest-dom": "^6.6.3",
|
|
@@ -93,10 +94,10 @@
|
|
|
93
94
|
"process": "^0.11.10",
|
|
94
95
|
"prop-types": "^15.7.2",
|
|
95
96
|
"react": "^18.3.1",
|
|
96
|
-
"react-dom": "^18.3.1",
|
|
97
97
|
"react-bootstrap": "^1.5.2",
|
|
98
98
|
"react-bootstrap-switch": "^15.5.3",
|
|
99
99
|
"react-confirm-alert": "^3.0.6",
|
|
100
|
+
"react-dom": "^18.3.1",
|
|
100
101
|
"react-draggable": "^4.4.6",
|
|
101
102
|
"react-feather": "^2.0.10",
|
|
102
103
|
"react-google-autocomplete": "^2.7.3",
|