@pie-element/ebsr 12.3.4-next.3 → 13.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/configure/lib/defaults.js +23 -36
- package/configure/lib/defaults.js.map +1 -1
- package/configure/lib/index.js +114 -202
- package/configure/lib/index.js.map +1 -1
- package/configure/lib/main.js +188 -271
- package/configure/lib/main.js.map +1 -1
- package/configure/node_modules/@pie-element/multiple-choice/CHANGELOG.json +1972 -0
- package/configure/node_modules/@pie-element/multiple-choice/CHANGELOG.md +4213 -0
- package/configure/node_modules/@pie-element/multiple-choice/PRINT.md +35 -0
- package/configure/node_modules/@pie-element/multiple-choice/README.md +56 -0
- package/configure/node_modules/@pie-element/multiple-choice/choice.png +0 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/CHANGELOG.json +1387 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/CHANGELOG.md +3351 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/__tests__/root.test.js +248 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/defaults.js +200 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/defaults.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/index.js +211 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/index.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/main.js +477 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/main.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/utils.js +18 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/lib/utils.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/configure/package.json +22 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/CHANGELOG.json +527 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/CHANGELOG.md +2316 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/__tests__/index.test.js +520 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/__tests__/utils.test.js +8 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/defaults.js +33 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/defaults.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/index.js +251 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/index.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/utils.js +16 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/lib/utils.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/controller/package.json +15 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/config-schema.json +2993 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/config-schema.json.md +2217 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/demo/config.js +8 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/demo/generate.js +61 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/demo/index.html +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/demo/pie.manifest.json +11 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/demo/session.js +7 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/pie-schema.json +1332 -0
- package/configure/node_modules/@pie-element/multiple-choice/docs/pie-schema.json.md +1015 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/choice-input-test.js +117 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/index-test.js +151 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/key-events-test.js +95 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/multiple-choice-test.js +223 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/__tests__/session-updater-test.js +70 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/choice-input.js +370 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/choice-input.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/choice.js +197 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/choice.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/feedback-tick.js +130 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/feedback-tick.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/index.js +292 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/index.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/main.js +54 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/main.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/multiple-choice.js +386 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/multiple-choice.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/print.js +92 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/print.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/session-updater.js +37 -0
- package/configure/node_modules/@pie-element/multiple-choice/lib/session-updater.js.map +1 -0
- package/configure/node_modules/@pie-element/multiple-choice/package.json +39 -0
- package/configure/package.json +9 -6
- package/configure/src/__tests__/index.test.js +99 -108
- package/configure/src/index.js +13 -6
- package/configure/src/main.jsx +14 -18
- package/controller/lib/defaults.js +20 -32
- package/controller/lib/defaults.js.map +1 -1
- package/controller/lib/index.js +224 -349
- package/controller/lib/index.js.map +1 -1
- package/controller/lib/utils.js +4 -18
- package/controller/lib/utils.js.map +1 -1
- package/controller/package.json +3 -3
- package/lib/index.js +113 -181
- package/lib/index.js.map +1 -1
- package/lib/print.js +120 -204
- package/lib/print.js.map +1 -1
- package/package.json +5 -13
- package/src/__tests__/index.test.js +18 -5
- package/configure/src/__tests__/__snapshots__/index.test.js.snap +0 -83
- package/esm/configure.js +0 -12003
- package/esm/configure.js.map +0 -1
- package/esm/controller.js +0 -3358
- package/esm/controller.js.map +0 -1
- package/esm/element.js +0 -2203
- package/esm/element.js.map +0 -1
- package/esm/package.json +0 -3
- package/esm/print.js +0 -4092
- package/esm/print.js.map +0 -1
- package/module/configure.js +0 -1
- package/module/controller.js +0 -6469
- package/module/demo.js +0 -77
- package/module/element.js +0 -1
- package/module/index.html +0 -21
- package/module/manifest.json +0 -14
- package/module/print-demo.js +0 -115
- package/module/print.html +0 -18
- package/module/print.js +0 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.isComplete = exports.default = void 0;
|
|
8
|
+
var _main = _interopRequireDefault(require("./main"));
|
|
9
|
+
var _react = _interopRequireDefault(require("react"));
|
|
10
|
+
var _client = require("react-dom/client");
|
|
11
|
+
var _debounce = _interopRequireDefault(require("lodash/debounce"));
|
|
12
|
+
var _debug = _interopRequireDefault(require("debug"));
|
|
13
|
+
var _piePlayerEvents = require("@pie-framework/pie-player-events");
|
|
14
|
+
var _mathRendering = require("@pie-lib/math-rendering");
|
|
15
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
16
|
+
var _sessionUpdater = require("./session-updater");
|
|
17
|
+
const log = (0, _debug.default)('pie-ui:multiple-choice');
|
|
18
|
+
const isComplete = (session, model, audioComplete, elementContext) => {
|
|
19
|
+
const {
|
|
20
|
+
autoplayAudioEnabled,
|
|
21
|
+
completeAudioEnabled
|
|
22
|
+
} = model || {};
|
|
23
|
+
|
|
24
|
+
// check audio completion if audio settings are enabled and audio actually exists
|
|
25
|
+
if (autoplayAudioEnabled && completeAudioEnabled && !audioComplete) {
|
|
26
|
+
if (elementContext) {
|
|
27
|
+
const audio = elementContext.querySelector('audio');
|
|
28
|
+
const isInsidePrompt = audio && audio.closest('#preview-prompt');
|
|
29
|
+
|
|
30
|
+
// only require audio completion if audio exists and is inside the prompt
|
|
31
|
+
if (audio && isInsidePrompt) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (!session || !session.value) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const {
|
|
40
|
+
choiceMode,
|
|
41
|
+
minSelections = 1,
|
|
42
|
+
maxSelections
|
|
43
|
+
} = model || {};
|
|
44
|
+
const selections = session.value.length || 0;
|
|
45
|
+
if (choiceMode === 'radio') {
|
|
46
|
+
return !!selections;
|
|
47
|
+
}
|
|
48
|
+
if (selections < minSelections || selections > maxSelections) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
exports.isComplete = isComplete;
|
|
54
|
+
class MultipleChoice extends HTMLElement {
|
|
55
|
+
constructor() {
|
|
56
|
+
super();
|
|
57
|
+
this._model = null;
|
|
58
|
+
this._session = null;
|
|
59
|
+
this.audioComplete = false;
|
|
60
|
+
this._boundHandleKeyDown = this.handleKeyDown.bind(this);
|
|
61
|
+
this._keyboardEventsEnabled = false;
|
|
62
|
+
this._audioInitialized = false;
|
|
63
|
+
this._root = null;
|
|
64
|
+
this._rerender = (0, _debounce.default)(() => {
|
|
65
|
+
if (this._model && this._session) {
|
|
66
|
+
var element = /*#__PURE__*/_react.default.createElement(_main.default, {
|
|
67
|
+
model: this._model,
|
|
68
|
+
session: this._session,
|
|
69
|
+
onChoiceChanged: this._onChange.bind(this),
|
|
70
|
+
onShowCorrectToggle: this.onShowCorrectToggle.bind(this)
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
//TODO: aria-label is set in the _rerender because we need to change it when the model.choiceMode is updated. Consider revisiting the placement of the aria-label setting in the _rerender
|
|
74
|
+
this.setAttribute('aria-label', this._model.choiceMode === 'radio' ? 'Multiple Choice Question' : 'Multiple Correct Answer Question');
|
|
75
|
+
this.setAttribute('role', 'region');
|
|
76
|
+
this.setLangAttribute();
|
|
77
|
+
if (!this._root) {
|
|
78
|
+
this._root = (0, _client.createRoot)(this);
|
|
79
|
+
}
|
|
80
|
+
this._root.render(element);
|
|
81
|
+
queueMicrotask(() => {
|
|
82
|
+
log('render complete - render math');
|
|
83
|
+
(0, _mathRendering.renderMath)(this);
|
|
84
|
+
});
|
|
85
|
+
if (this._model.keyboardEventsEnabled === true && !this._keyboardEventsEnabled) {
|
|
86
|
+
this.enableKeyboardEvents();
|
|
87
|
+
}
|
|
88
|
+
} else {
|
|
89
|
+
log('skip');
|
|
90
|
+
}
|
|
91
|
+
}, 50, {
|
|
92
|
+
leading: false,
|
|
93
|
+
trailing: true
|
|
94
|
+
});
|
|
95
|
+
this._dispatchResponseChanged = (0, _debounce.default)(() => {
|
|
96
|
+
this.dispatchEvent(new _piePlayerEvents.SessionChangedEvent(this.tagName.toLowerCase(), isComplete(this._session, this._model, this.audioComplete, this)));
|
|
97
|
+
});
|
|
98
|
+
this._dispatchModelSet = (0, _debounce.default)(() => {
|
|
99
|
+
this.dispatchEvent(new _piePlayerEvents.ModelSetEvent(this.tagName.toLowerCase(), isComplete(this._session, this._model, this.audioComplete, this), this._model !== undefined));
|
|
100
|
+
}, 50, {
|
|
101
|
+
leading: false,
|
|
102
|
+
trailing: true
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
onShowCorrectToggle() {
|
|
106
|
+
(0, _mathRendering.renderMath)(this);
|
|
107
|
+
}
|
|
108
|
+
setLangAttribute() {
|
|
109
|
+
const language = this._model && typeof this._model.language ? this._model.language : '';
|
|
110
|
+
const lang = language ? language.slice(0, 2) : 'en';
|
|
111
|
+
this.setAttribute('lang', lang);
|
|
112
|
+
}
|
|
113
|
+
set model(s) {
|
|
114
|
+
this._model = s;
|
|
115
|
+
this._rerender();
|
|
116
|
+
// reset the audioInitialized to false since the model changed, and we might need to reinitialize the audio
|
|
117
|
+
this._audioInitialized = false;
|
|
118
|
+
this._dispatchModelSet();
|
|
119
|
+
}
|
|
120
|
+
get session() {
|
|
121
|
+
return this._session;
|
|
122
|
+
}
|
|
123
|
+
set session(s) {
|
|
124
|
+
this._session = s;
|
|
125
|
+
this._rerender();
|
|
126
|
+
//TODO: remove this session-changed should only be emit on user change
|
|
127
|
+
this._dispatchResponseChanged();
|
|
128
|
+
}
|
|
129
|
+
_onChange(data) {
|
|
130
|
+
(0, _sessionUpdater.updateSessionValue)(this._session, this._model.choiceMode, data);
|
|
131
|
+
this._dispatchResponseChanged();
|
|
132
|
+
this._rerender();
|
|
133
|
+
}
|
|
134
|
+
_createAudioInfoToast() {
|
|
135
|
+
const info = document.createElement('div');
|
|
136
|
+
info.id = 'play-audio-info';
|
|
137
|
+
Object.assign(info.style, {
|
|
138
|
+
position: 'absolute',
|
|
139
|
+
top: 0,
|
|
140
|
+
width: '100%',
|
|
141
|
+
height: '100%',
|
|
142
|
+
display: 'flex',
|
|
143
|
+
justifyContent: 'center',
|
|
144
|
+
alignItems: 'center',
|
|
145
|
+
background: 'white',
|
|
146
|
+
zIndex: '1000',
|
|
147
|
+
cursor: 'pointer'
|
|
148
|
+
});
|
|
149
|
+
const img = document.createElement('img');
|
|
150
|
+
img.src = _renderUi.EnableAudioAutoplayImage;
|
|
151
|
+
img.alt = 'Click anywhere to enable audio autoplay';
|
|
152
|
+
img.width = 500;
|
|
153
|
+
img.height = 300;
|
|
154
|
+
info.appendChild(img);
|
|
155
|
+
return info;
|
|
156
|
+
}
|
|
157
|
+
connectedCallback() {
|
|
158
|
+
this._rerender();
|
|
159
|
+
|
|
160
|
+
// Observation: audio in Chrome will have the autoplay attribute,
|
|
161
|
+
// while other browsers will not have the autoplay attribute and will need a user interaction to play the audio
|
|
162
|
+
// This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox
|
|
163
|
+
const observer = new MutationObserver((mutationsList, observer) => {
|
|
164
|
+
mutationsList.forEach(mutation => {
|
|
165
|
+
if (mutation.type === 'childList') {
|
|
166
|
+
if (this._audioInitialized) return;
|
|
167
|
+
const audio = this.querySelector('audio');
|
|
168
|
+
const isInsidePrompt = audio && audio.closest('#preview-prompt');
|
|
169
|
+
if (!this._model) return;
|
|
170
|
+
if (!this._model.autoplayAudioEnabled) return;
|
|
171
|
+
if (audio && !isInsidePrompt) return;
|
|
172
|
+
if (!audio) return;
|
|
173
|
+
const info = this._createAudioInfoToast();
|
|
174
|
+
const container = this.querySelector('#main-container');
|
|
175
|
+
const enableAudio = () => {
|
|
176
|
+
if (this.querySelector('#play-audio-info')) {
|
|
177
|
+
audio.play();
|
|
178
|
+
container.removeChild(info);
|
|
179
|
+
}
|
|
180
|
+
document.removeEventListener('click', enableAudio);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
// if the audio is paused, it means the user has not interacted with the page yet and the audio will not play
|
|
184
|
+
// FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked
|
|
185
|
+
setTimeout(() => {
|
|
186
|
+
if (audio.paused && !this.querySelector('#play-audio-info')) {
|
|
187
|
+
// add info message as a toast to enable audio playback
|
|
188
|
+
container.appendChild(info);
|
|
189
|
+
document.addEventListener('click', enableAudio);
|
|
190
|
+
} else {
|
|
191
|
+
document.removeEventListener('click', enableAudio);
|
|
192
|
+
}
|
|
193
|
+
}, 500);
|
|
194
|
+
|
|
195
|
+
// we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering
|
|
196
|
+
const handlePlaying = () => {
|
|
197
|
+
(0, _sessionUpdater.updateSessionMetadata)(this._session, {
|
|
198
|
+
audioStartTime: new Date().getTime()
|
|
199
|
+
});
|
|
200
|
+
const info = this.querySelector('#play-audio-info');
|
|
201
|
+
if (info) {
|
|
202
|
+
container.removeChild(info);
|
|
203
|
+
}
|
|
204
|
+
audio.removeEventListener('playing', handlePlaying);
|
|
205
|
+
};
|
|
206
|
+
audio.addEventListener('playing', handlePlaying);
|
|
207
|
+
|
|
208
|
+
// we need to listen for the ended event to update the isComplete state
|
|
209
|
+
const handleEnded = () => {
|
|
210
|
+
(0, _sessionUpdater.updateSessionMetadata)(this._session, {
|
|
211
|
+
audioEndTime: new Date().getTime()
|
|
212
|
+
});
|
|
213
|
+
this.audioComplete = true;
|
|
214
|
+
this._dispatchResponseChanged();
|
|
215
|
+
audio.removeEventListener('ended', handleEnded);
|
|
216
|
+
};
|
|
217
|
+
audio.addEventListener('ended', handleEnded);
|
|
218
|
+
|
|
219
|
+
// store references to remove later
|
|
220
|
+
this._audio = audio;
|
|
221
|
+
this._handlePlaying = handlePlaying;
|
|
222
|
+
this._handleEnded = handleEnded;
|
|
223
|
+
this._enableAudio = enableAudio;
|
|
224
|
+
// set to true to prevent multiple initializations
|
|
225
|
+
this._audioInitialized = true;
|
|
226
|
+
observer.disconnect();
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
observer.observe(this, {
|
|
231
|
+
childList: true,
|
|
232
|
+
subtree: true
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
enableKeyboardEvents() {
|
|
236
|
+
if (!this._keyboardEventsEnabled) {
|
|
237
|
+
window.addEventListener('keydown', this._boundHandleKeyDown);
|
|
238
|
+
this._keyboardEventsEnabled = true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
disconnectedCallback() {
|
|
242
|
+
if (this._keyboardEventsEnabled) {
|
|
243
|
+
window.removeEventListener('keydown', this._boundHandleKeyDown);
|
|
244
|
+
this._keyboardEventsEnabled = false;
|
|
245
|
+
}
|
|
246
|
+
document.removeEventListener('click', this._enableAudio);
|
|
247
|
+
if (this._audio) {
|
|
248
|
+
this._audio.removeEventListener('playing', this._handlePlaying);
|
|
249
|
+
this._audio.removeEventListener('ended', this._handleEnded);
|
|
250
|
+
this._audio = null;
|
|
251
|
+
}
|
|
252
|
+
if (this._root) {
|
|
253
|
+
this._root.unmount();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Handles global keyboard events for selecting or toggling multiple-choice answers.
|
|
259
|
+
* Maps keys (1-9, 0, a-j, A-J) to choices and updates the session state accordingly.
|
|
260
|
+
* Ensures valid key presses toggle or select the appropriate choice based on the model.
|
|
261
|
+
*/
|
|
262
|
+
handleKeyDown(event) {
|
|
263
|
+
if (!this._model || !this._session) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
const {
|
|
267
|
+
mode
|
|
268
|
+
} = this._model;
|
|
269
|
+
if (mode !== 'gather') {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const keyToIndex = key => {
|
|
273
|
+
const numOffset = key >= '1' && key <= '9' ? key - '1' : key === '0' ? 9 : -1;
|
|
274
|
+
const letterOffset = /^[a-jA-J]$/.test(key) ? key.toLowerCase().charCodeAt(0) - 'a'.charCodeAt(0) : -1;
|
|
275
|
+
return numOffset >= 0 ? numOffset : letterOffset;
|
|
276
|
+
};
|
|
277
|
+
const choiceIndex = keyToIndex(event.key);
|
|
278
|
+
if (choiceIndex === undefined || choiceIndex <= -1 || choiceIndex >= this._model.choices?.length) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
const currentValue = this._session.value || [];
|
|
282
|
+
const choiceId = this._model.choices[choiceIndex].value;
|
|
283
|
+
const newValue = {
|
|
284
|
+
value: choiceId,
|
|
285
|
+
selected: !currentValue.includes(choiceId),
|
|
286
|
+
selector: 'Keyboard'
|
|
287
|
+
};
|
|
288
|
+
this._onChange(newValue);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
exports.default = MultipleChoice;
|
|
292
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWFpbiIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3JlYWN0IiwiX2NsaWVudCIsIl9kZWJvdW5jZSIsIl9kZWJ1ZyIsIl9waWVQbGF5ZXJFdmVudHMiLCJfbWF0aFJlbmRlcmluZyIsIl9yZW5kZXJVaSIsIl9zZXNzaW9uVXBkYXRlciIsImxvZyIsImRlYnVnIiwiaXNDb21wbGV0ZSIsInNlc3Npb24iLCJtb2RlbCIsImF1ZGlvQ29tcGxldGUiLCJlbGVtZW50Q29udGV4dCIsImF1dG9wbGF5QXVkaW9FbmFibGVkIiwiY29tcGxldGVBdWRpb0VuYWJsZWQiLCJhdWRpbyIsInF1ZXJ5U2VsZWN0b3IiLCJpc0luc2lkZVByb21wdCIsImNsb3Nlc3QiLCJ2YWx1ZSIsImNob2ljZU1vZGUiLCJtaW5TZWxlY3Rpb25zIiwibWF4U2VsZWN0aW9ucyIsInNlbGVjdGlvbnMiLCJsZW5ndGgiLCJleHBvcnRzIiwiTXVsdGlwbGVDaG9pY2UiLCJIVE1MRWxlbWVudCIsImNvbnN0cnVjdG9yIiwiX21vZGVsIiwiX3Nlc3Npb24iLCJfYm91bmRIYW5kbGVLZXlEb3duIiwiaGFuZGxlS2V5RG93biIsImJpbmQiLCJfa2V5Ym9hcmRFdmVudHNFbmFibGVkIiwiX2F1ZGlvSW5pdGlhbGl6ZWQiLCJfcm9vdCIsIl9yZXJlbmRlciIsImRlYm91bmNlIiwiZWxlbWVudCIsIlJlYWN0IiwiY3JlYXRlRWxlbWVudCIsIk1haW4iLCJvbkNob2ljZUNoYW5nZWQiLCJfb25DaGFuZ2UiLCJvblNob3dDb3JyZWN0VG9nZ2xlIiwic2V0QXR0cmlidXRlIiwic2V0TGFuZ0F0dHJpYnV0ZSIsImNyZWF0ZVJvb3QiLCJyZW5kZXIiLCJxdWV1ZU1pY3JvdGFzayIsInJlbmRlck1hdGgiLCJrZXlib2FyZEV2ZW50c0VuYWJsZWQiLCJlbmFibGVLZXlib2FyZEV2ZW50cyIsImxlYWRpbmciLCJ0cmFpbGluZyIsIl9kaXNwYXRjaFJlc3BvbnNlQ2hhbmdlZCIsImRpc3BhdGNoRXZlbnQiLCJTZXNzaW9uQ2hhbmdlZEV2ZW50IiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiX2Rpc3BhdGNoTW9kZWxTZXQiLCJNb2RlbFNldEV2ZW50IiwidW5kZWZpbmVkIiwibGFuZ3VhZ2UiLCJsYW5nIiwic2xpY2UiLCJzIiwiZGF0YSIsInVwZGF0ZVNlc3Npb25WYWx1ZSIsIl9jcmVhdGVBdWRpb0luZm9Ub2FzdCIsImluZm8iLCJkb2N1bWVudCIsImlkIiwiT2JqZWN0IiwiYXNzaWduIiwic3R5bGUiLCJwb3NpdGlvbiIsInRvcCIsIndpZHRoIiwiaGVpZ2h0IiwiZGlzcGxheSIsImp1c3RpZnlDb250ZW50IiwiYWxpZ25JdGVtcyIsImJhY2tncm91bmQiLCJ6SW5kZXgiLCJjdXJzb3IiLCJpbWciLCJzcmMiLCJFbmFibGVBdWRpb0F1dG9wbGF5SW1hZ2UiLCJhbHQiLCJhcHBlbmRDaGlsZCIsImNvbm5lY3RlZENhbGxiYWNrIiwib2JzZXJ2ZXIiLCJNdXRhdGlvbk9ic2VydmVyIiwibXV0YXRpb25zTGlzdCIsImZvckVhY2giLCJtdXRhdGlvbiIsInR5cGUiLCJjb250YWluZXIiLCJlbmFibGVBdWRpbyIsInBsYXkiLCJyZW1vdmVDaGlsZCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJzZXRUaW1lb3V0IiwicGF1c2VkIiwiYWRkRXZlbnRMaXN0ZW5lciIsImhhbmRsZVBsYXlpbmciLCJ1cGRhdGVTZXNzaW9uTWV0YWRhdGEiLCJhdWRpb1N0YXJ0VGltZSIsIkRhdGUiLCJnZXRUaW1lIiwiaGFuZGxlRW5kZWQiLCJhdWRpb0VuZFRpbWUiLCJfYXVkaW8iLCJfaGFuZGxlUGxheWluZyIsIl9oYW5kbGVFbmRlZCIsIl9lbmFibGVBdWRpbyIsImRpc2Nvbm5lY3QiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsIndpbmRvdyIsImRpc2Nvbm5lY3RlZENhbGxiYWNrIiwidW5tb3VudCIsImV2ZW50IiwibW9kZSIsImtleVRvSW5kZXgiLCJrZXkiLCJudW1PZmZzZXQiLCJsZXR0ZXJPZmZzZXQiLCJ0ZXN0IiwiY2hhckNvZGVBdCIsImNob2ljZUluZGV4IiwiY2hvaWNlcyIsImN1cnJlbnRWYWx1ZSIsImNob2ljZUlkIiwibmV3VmFsdWUiLCJzZWxlY3RlZCIsImluY2x1ZGVzIiwic2VsZWN0b3IiLCJkZWZhdWx0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYWluIGZyb20gJy4vbWFpbic7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2xvZGFzaC9kZWJvdW5jZSc7XG5pbXBvcnQgZGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgTW9kZWxTZXRFdmVudCwgU2Vzc2lvbkNoYW5nZWRFdmVudCB9IGZyb20gJ0BwaWUtZnJhbWV3b3JrL3BpZS1wbGF5ZXItZXZlbnRzJztcbmltcG9ydCB7IHJlbmRlck1hdGggfSBmcm9tICdAcGllLWxpYi9tYXRoLXJlbmRlcmluZyc7XG5pbXBvcnQgeyBFbmFibGVBdWRpb0F1dG9wbGF5SW1hZ2UgfSBmcm9tICdAcGllLWxpYi9yZW5kZXItdWknO1xuaW1wb3J0IHsgdXBkYXRlU2Vzc2lvblZhbHVlLCB1cGRhdGVTZXNzaW9uTWV0YWRhdGEgfSBmcm9tICcuL3Nlc3Npb24tdXBkYXRlcic7XG5cbmNvbnN0IGxvZyA9IGRlYnVnKCdwaWUtdWk6bXVsdGlwbGUtY2hvaWNlJyk7XG5cbmV4cG9ydCBjb25zdCBpc0NvbXBsZXRlID0gKHNlc3Npb24sIG1vZGVsLCBhdWRpb0NvbXBsZXRlLCBlbGVtZW50Q29udGV4dCkgPT4ge1xuICBjb25zdCB7IGF1dG9wbGF5QXVkaW9FbmFibGVkLCBjb21wbGV0ZUF1ZGlvRW5hYmxlZCB9ID0gbW9kZWwgfHwge307XG5cbiAgLy8gY2hlY2sgYXVkaW8gY29tcGxldGlvbiBpZiBhdWRpbyBzZXR0aW5ncyBhcmUgZW5hYmxlZCBhbmQgYXVkaW8gYWN0dWFsbHkgZXhpc3RzXG4gIGlmIChhdXRvcGxheUF1ZGlvRW5hYmxlZCAmJiBjb21wbGV0ZUF1ZGlvRW5hYmxlZCAmJiAhYXVkaW9Db21wbGV0ZSkge1xuICAgIGlmIChlbGVtZW50Q29udGV4dCkge1xuICAgICAgY29uc3QgYXVkaW8gPSBlbGVtZW50Q29udGV4dC5xdWVyeVNlbGVjdG9yKCdhdWRpbycpO1xuICAgICAgY29uc3QgaXNJbnNpZGVQcm9tcHQgPSBhdWRpbyAmJiBhdWRpby5jbG9zZXN0KCcjcHJldmlldy1wcm9tcHQnKTtcblxuICAgICAgLy8gb25seSByZXF1aXJlIGF1ZGlvIGNvbXBsZXRpb24gaWYgYXVkaW8gZXhpc3RzIGFuZCBpcyBpbnNpZGUgdGhlIHByb21wdFxuICAgICAgaWYgKGF1ZGlvICYmIGlzSW5zaWRlUHJvbXB0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIXNlc3Npb24gfHwgIXNlc3Npb24udmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IGNob2ljZU1vZGUsIG1pblNlbGVjdGlvbnMgPSAxLCBtYXhTZWxlY3Rpb25zIH0gPSBtb2RlbCB8fCB7fTtcbiAgY29uc3Qgc2VsZWN0aW9ucyA9IHNlc3Npb24udmFsdWUubGVuZ3RoIHx8IDA7XG5cbiAgaWYgKGNob2ljZU1vZGUgPT09ICdyYWRpbycpIHtcbiAgICByZXR1cm4gISFzZWxlY3Rpb25zO1xuICB9XG5cbiAgaWYgKHNlbGVjdGlvbnMgPCBtaW5TZWxlY3Rpb25zIHx8IHNlbGVjdGlvbnMgPiBtYXhTZWxlY3Rpb25zKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNdWx0aXBsZUNob2ljZSBleHRlbmRzIEhUTUxFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9tb2RlbCA9IG51bGw7XG4gICAgdGhpcy5fc2Vzc2lvbiA9IG51bGw7XG4gICAgdGhpcy5hdWRpb0NvbXBsZXRlID0gZmFsc2U7XG4gICAgdGhpcy5fYm91bmRIYW5kbGVLZXlEb3duID0gdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fa2V5Ym9hcmRFdmVudHNFbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5fYXVkaW9Jbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuXG4gICAgdGhpcy5fcmVyZW5kZXIgPSBkZWJvdW5jZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX21vZGVsICYmIHRoaXMuX3Nlc3Npb24pIHtcbiAgICAgICAgICB2YXIgZWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFpbiwge1xuICAgICAgICAgICAgbW9kZWw6IHRoaXMuX21vZGVsLFxuICAgICAgICAgICAgc2Vzc2lvbjogdGhpcy5fc2Vzc2lvbixcbiAgICAgICAgICAgIG9uQ2hvaWNlQ2hhbmdlZDogdGhpcy5fb25DaGFuZ2UuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIG9uU2hvd0NvcnJlY3RUb2dnbGU6IHRoaXMub25TaG93Q29ycmVjdFRvZ2dsZS5iaW5kKHRoaXMpLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy9UT0RPOiBhcmlhLWxhYmVsIGlzIHNldCBpbiB0aGUgX3JlcmVuZGVyIGJlY2F1c2Ugd2UgbmVlZCB0byBjaGFuZ2UgaXQgd2hlbiB0aGUgbW9kZWwuY2hvaWNlTW9kZSBpcyB1cGRhdGVkLiBDb25zaWRlciByZXZpc2l0aW5nIHRoZSBwbGFjZW1lbnQgb2YgdGhlIGFyaWEtbGFiZWwgc2V0dGluZyBpbiB0aGUgX3JlcmVuZGVyXG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAnYXJpYS1sYWJlbCcsXG4gICAgICAgICAgICB0aGlzLl9tb2RlbC5jaG9pY2VNb2RlID09PSAncmFkaW8nID8gJ011bHRpcGxlIENob2ljZSBRdWVzdGlvbicgOiAnTXVsdGlwbGUgQ29ycmVjdCBBbnN3ZXIgUXVlc3Rpb24nLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncmVnaW9uJyk7XG4gICAgICAgICAgdGhpcy5zZXRMYW5nQXR0cmlidXRlKCk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuX3Jvb3QpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3QgPSBjcmVhdGVSb290KHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLl9yb290LnJlbmRlcihlbGVtZW50KTtcbiAgICAgICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICAgICAgICBsb2coJ3JlbmRlciBjb21wbGV0ZSAtIHJlbmRlciBtYXRoJyk7XG4gICAgICAgICAgICByZW5kZXJNYXRoKHRoaXMpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX21vZGVsLmtleWJvYXJkRXZlbnRzRW5hYmxlZCA9PT0gdHJ1ZSAmJiAhdGhpcy5fa2V5Ym9hcmRFdmVudHNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZUtleWJvYXJkRXZlbnRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZygnc2tpcCcpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgNTAsXG4gICAgICB7IGxlYWRpbmc6IGZhbHNlLCB0cmFpbGluZzogdHJ1ZSB9LFxuICAgICk7XG5cbiAgICB0aGlzLl9kaXNwYXRjaFJlc3BvbnNlQ2hhbmdlZCA9IGRlYm91bmNlKCgpID0+IHtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgbmV3IFNlc3Npb25DaGFuZ2VkRXZlbnQoXG4gICAgICAgICAgdGhpcy50YWdOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgaXNDb21wbGV0ZSh0aGlzLl9zZXNzaW9uLCB0aGlzLl9tb2RlbCwgdGhpcy5hdWRpb0NvbXBsZXRlLCB0aGlzKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9kaXNwYXRjaE1vZGVsU2V0ID0gZGVib3VuY2UoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChcbiAgICAgICAgICBuZXcgTW9kZWxTZXRFdmVudChcbiAgICAgICAgICAgIHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgaXNDb21wbGV0ZSh0aGlzLl9zZXNzaW9uLCB0aGlzLl9tb2RlbCwgdGhpcy5hdWRpb0NvbXBsZXRlLCB0aGlzKSxcbiAgICAgICAgICAgIHRoaXMuX21vZGVsICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICA1MCxcbiAgICAgIHsgbGVhZGluZzogZmFsc2UsIHRyYWlsaW5nOiB0cnVlIH0sXG4gICAgKTtcbiAgfVxuXG4gIG9uU2hvd0NvcnJlY3RUb2dnbGUoKSB7XG4gICAgcmVuZGVyTWF0aCh0aGlzKTtcbiAgfVxuXG4gIHNldExhbmdBdHRyaWJ1dGUoKSB7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLl9tb2RlbCAmJiB0eXBlb2YgdGhpcy5fbW9kZWwubGFuZ3VhZ2UgPyB0aGlzLl9tb2RlbC5sYW5ndWFnZSA6ICcnO1xuICAgIGNvbnN0IGxhbmcgPSBsYW5ndWFnZSA/IGxhbmd1YWdlLnNsaWNlKDAsIDIpIDogJ2VuJztcbiAgICB0aGlzLnNldEF0dHJpYnV0ZSgnbGFuZycsIGxhbmcpO1xuICB9XG5cbiAgc2V0IG1vZGVsKHMpIHtcbiAgICB0aGlzLl9tb2RlbCA9IHM7XG4gICAgdGhpcy5fcmVyZW5kZXIoKTtcbiAgICAvLyByZXNldCB0aGUgYXVkaW9Jbml0aWFsaXplZCB0byBmYWxzZSBzaW5jZSB0aGUgbW9kZWwgY2hhbmdlZCwgYW5kIHdlIG1pZ2h0IG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSBhdWRpb1xuICAgIHRoaXMuX2F1ZGlvSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9kaXNwYXRjaE1vZGVsU2V0KCk7XG4gIH1cblxuICBnZXQgc2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbjtcbiAgfVxuXG4gIHNldCBzZXNzaW9uKHMpIHtcbiAgICB0aGlzLl9zZXNzaW9uID0gcztcbiAgICB0aGlzLl9yZXJlbmRlcigpO1xuICAgIC8vVE9ETzogcmVtb3ZlIHRoaXMgc2Vzc2lvbi1jaGFuZ2VkIHNob3VsZCBvbmx5IGJlIGVtaXQgb24gdXNlciBjaGFuZ2VcbiAgICB0aGlzLl9kaXNwYXRjaFJlc3BvbnNlQ2hhbmdlZCgpO1xuICB9XG5cbiAgX29uQ2hhbmdlKGRhdGEpIHtcbiAgICB1cGRhdGVTZXNzaW9uVmFsdWUodGhpcy5fc2Vzc2lvbiwgdGhpcy5fbW9kZWwuY2hvaWNlTW9kZSwgZGF0YSk7XG4gICAgdGhpcy5fZGlzcGF0Y2hSZXNwb25zZUNoYW5nZWQoKTtcbiAgICB0aGlzLl9yZXJlbmRlcigpO1xuICB9XG5cbiAgX2NyZWF0ZUF1ZGlvSW5mb1RvYXN0KCkge1xuICAgIGNvbnN0IGluZm8gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpbmZvLmlkID0gJ3BsYXktYXVkaW8taW5mbyc7XG5cbiAgICBPYmplY3QuYXNzaWduKGluZm8uc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgdG9wOiAwLFxuICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxuICAgICAgekluZGV4OiAnMTAwMCcsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgIGltZy5zcmMgPSBFbmFibGVBdWRpb0F1dG9wbGF5SW1hZ2U7XG4gICAgaW1nLmFsdCA9ICdDbGljayBhbnl3aGVyZSB0byBlbmFibGUgYXVkaW8gYXV0b3BsYXknO1xuICAgIGltZy53aWR0aCA9IDUwMDtcbiAgICBpbWcuaGVpZ2h0ID0gMzAwO1xuXG4gICAgaW5mby5hcHBlbmRDaGlsZChpbWcpO1xuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgY29ubmVjdGVkQ2FsbGJhY2soKSB7XG4gICAgdGhpcy5fcmVyZW5kZXIoKTtcblxuICAgIC8vIE9ic2VydmF0aW9uOiAgYXVkaW8gaW4gQ2hyb21lIHdpbGwgaGF2ZSB0aGUgYXV0b3BsYXkgYXR0cmlidXRlLFxuICAgIC8vIHdoaWxlIG90aGVyIGJyb3dzZXJzIHdpbGwgbm90IGhhdmUgdGhlIGF1dG9wbGF5IGF0dHJpYnV0ZSBhbmQgd2lsbCBuZWVkIGEgdXNlciBpbnRlcmFjdGlvbiB0byBwbGF5IHRoZSBhdWRpb1xuICAgIC8vIFRoaXMgd29ya2Fyb3VuZCBmaXhlcyB0aGUgaXNzdWUgb2YgYXVkaW8gYmVpbmcgY2FjaGVkIGFuZCBwbGF5ZWQgb24gYW55IHVzZXIgaW50ZXJhY3Rpb24gaW4gU2FmYXJpIGFuZCBGaXJlZm94XG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zTGlzdCwgb2JzZXJ2ZXIpID0+IHtcbiAgICAgIG11dGF0aW9uc0xpc3QuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcbiAgICAgICAgaWYgKG11dGF0aW9uLnR5cGUgPT09ICdjaGlsZExpc3QnKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2F1ZGlvSW5pdGlhbGl6ZWQpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGF1ZGlvID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdhdWRpbycpO1xuICAgICAgICAgIGNvbnN0IGlzSW5zaWRlUHJvbXB0ID0gYXVkaW8gJiYgYXVkaW8uY2xvc2VzdCgnI3ByZXZpZXctcHJvbXB0Jyk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuX21vZGVsKSByZXR1cm47XG4gICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbC5hdXRvcGxheUF1ZGlvRW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmIChhdWRpbyAmJiAhaXNJbnNpZGVQcm9tcHQpIHJldHVybjtcbiAgICAgICAgICBpZiAoIWF1ZGlvKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fY3JlYXRlQXVkaW9JbmZvVG9hc3QoKTtcbiAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJyNtYWluLWNvbnRhaW5lcicpO1xuICAgICAgICAgIGNvbnN0IGVuYWJsZUF1ZGlvID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvcignI3BsYXktYXVkaW8taW5mbycpKSB7XG4gICAgICAgICAgICAgIGF1ZGlvLnBsYXkoKTtcbiAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGluZm8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGVuYWJsZUF1ZGlvKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gaWYgdGhlIGF1ZGlvIGlzIHBhdXNlZCwgaXQgbWVhbnMgdGhlIHVzZXIgaGFzIG5vdCBpbnRlcmFjdGVkIHdpdGggdGhlIHBhZ2UgeWV0IGFuZCB0aGUgYXVkaW8gd2lsbCBub3QgcGxheVxuICAgICAgICAgIC8vIEZJWCBGT1IgU0FGQVJJOiBwbGF5IHdpdGggYSBzbGlnaHQgZGVsYXkgdG8gY2hlY2sgaWYgYXV0b3BsYXkgd2FzIGJsb2NrZWRcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChhdWRpby5wYXVzZWQgJiYgIXRoaXMucXVlcnlTZWxlY3RvcignI3BsYXktYXVkaW8taW5mbycpKSB7XG4gICAgICAgICAgICAgIC8vIGFkZCBpbmZvIG1lc3NhZ2UgYXMgYSB0b2FzdCB0byBlbmFibGUgYXVkaW8gcGxheWJhY2tcbiAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGluZm8pO1xuICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGVuYWJsZUF1ZGlvKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZW5hYmxlQXVkaW8pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIDUwMCk7XG5cbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGxpc3RlbiBmb3IgdGhlIHBsYXlpbmcgZXZlbnQgdG8gcmVtb3ZlIHRoZSB0b2FzdCBpbiBjYXNlIHRoZSBhdWRpbyBwbGF5cyBiZWNhdXNlIG9mIHJlLXJlbmRlcmluZ1xuICAgICAgICAgIGNvbnN0IGhhbmRsZVBsYXlpbmcgPSAoKSA9PiB7XG4gICAgICAgICAgICB1cGRhdGVTZXNzaW9uTWV0YWRhdGEodGhpcy5fc2Vzc2lvbiwgeyBhdWRpb1N0YXJ0VGltZTogbmV3IERhdGUoKS5nZXRUaW1lKCkgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJyNwbGF5LWF1ZGlvLWluZm8nKTtcbiAgICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChpbmZvKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGxheWluZycsIGhhbmRsZVBsYXlpbmcpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhdWRpby5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgaGFuZGxlUGxheWluZyk7XG5cbiAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGxpc3RlbiBmb3IgdGhlIGVuZGVkIGV2ZW50IHRvIHVwZGF0ZSB0aGUgaXNDb21wbGV0ZSBzdGF0ZVxuICAgICAgICAgIGNvbnN0IGhhbmRsZUVuZGVkID0gKCkgPT4ge1xuICAgICAgICAgICAgdXBkYXRlU2Vzc2lvbk1ldGFkYXRhKHRoaXMuX3Nlc3Npb24sIHsgYXVkaW9FbmRUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSB9KTtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9Db21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl9kaXNwYXRjaFJlc3BvbnNlQ2hhbmdlZCgpO1xuICAgICAgICAgICAgYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBoYW5kbGVFbmRlZCk7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGF1ZGlvLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgaGFuZGxlRW5kZWQpO1xuXG4gICAgICAgICAgLy8gc3RvcmUgcmVmZXJlbmNlcyB0byByZW1vdmUgbGF0ZXJcbiAgICAgICAgICB0aGlzLl9hdWRpbyA9IGF1ZGlvO1xuICAgICAgICAgIHRoaXMuX2hhbmRsZVBsYXlpbmcgPSBoYW5kbGVQbGF5aW5nO1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUVuZGVkID0gaGFuZGxlRW5kZWQ7XG4gICAgICAgICAgdGhpcy5fZW5hYmxlQXVkaW8gPSBlbmFibGVBdWRpbztcbiAgICAgICAgICAvLyBzZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgICAgICAgIHRoaXMuX2F1ZGlvSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7XG4gIH1cblxuICBlbmFibGVLZXlib2FyZEV2ZW50cygpIHtcbiAgICBpZiAoIXRoaXMuX2tleWJvYXJkRXZlbnRzRW5hYmxlZCkge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9ib3VuZEhhbmRsZUtleURvd24pO1xuICAgICAgdGhpcy5fa2V5Ym9hcmRFdmVudHNFbmFibGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICBpZiAodGhpcy5fa2V5Ym9hcmRFdmVudHNFbmFibGVkKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2JvdW5kSGFuZGxlS2V5RG93bik7XG4gICAgICB0aGlzLl9rZXlib2FyZEV2ZW50c0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2VuYWJsZUF1ZGlvKTtcblxuICAgIGlmICh0aGlzLl9hdWRpbykge1xuICAgICAgdGhpcy5fYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGxheWluZycsIHRoaXMuX2hhbmRsZVBsYXlpbmcpO1xuICAgICAgdGhpcy5fYXVkaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCB0aGlzLl9oYW5kbGVFbmRlZCk7XG4gICAgICB0aGlzLl9hdWRpbyA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3Jvb3QpIHtcbiAgICAgIHRoaXMuX3Jvb3QudW5tb3VudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGdsb2JhbCBrZXlib2FyZCBldmVudHMgZm9yIHNlbGVjdGluZyBvciB0b2dnbGluZyBtdWx0aXBsZS1jaG9pY2UgYW5zd2Vycy5cbiAgICogTWFwcyBrZXlzICgxLTksIDAsIGEtaiwgQS1KKSB0byBjaG9pY2VzIGFuZCB1cGRhdGVzIHRoZSBzZXNzaW9uIHN0YXRlIGFjY29yZGluZ2x5LlxuICAgKiBFbnN1cmVzIHZhbGlkIGtleSBwcmVzc2VzIHRvZ2dsZSBvciBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGNob2ljZSBiYXNlZCBvbiB0aGUgbW9kZWwuXG4gICAqL1xuICBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLl9tb2RlbCB8fCAhdGhpcy5fc2Vzc2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgbW9kZSB9ID0gdGhpcy5fbW9kZWw7XG4gICAgaWYgKG1vZGUgIT09ICdnYXRoZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5VG9JbmRleCA9IChrZXkpID0+IHtcbiAgICAgIGNvbnN0IG51bU9mZnNldCA9IGtleSA+PSAnMScgJiYga2V5IDw9ICc5JyA/IGtleSAtICcxJyA6IGtleSA9PT0gJzAnID8gOSA6IC0xO1xuICAgICAgY29uc3QgbGV0dGVyT2Zmc2V0ID0gL15bYS1qQS1KXSQvLnRlc3Qoa2V5KSA/IGtleS50b0xvd2VyQ2FzZSgpLmNoYXJDb2RlQXQoMCkgLSAnYScuY2hhckNvZGVBdCgwKSA6IC0xO1xuICAgICAgcmV0dXJuIG51bU9mZnNldCA+PSAwID8gbnVtT2Zmc2V0IDogbGV0dGVyT2Zmc2V0O1xuICAgIH07XG5cbiAgICBjb25zdCBjaG9pY2VJbmRleCA9IGtleVRvSW5kZXgoZXZlbnQua2V5KTtcblxuICAgIGlmIChjaG9pY2VJbmRleCA9PT0gdW5kZWZpbmVkIHx8IGNob2ljZUluZGV4IDw9IC0xIHx8IGNob2ljZUluZGV4ID49IHRoaXMuX21vZGVsLmNob2ljZXM/Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuX3Nlc3Npb24udmFsdWUgfHwgW107XG4gICAgY29uc3QgY2hvaWNlSWQgPSB0aGlzLl9tb2RlbC5jaG9pY2VzW2Nob2ljZUluZGV4XS52YWx1ZTtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0ge1xuICAgICAgdmFsdWU6IGNob2ljZUlkLFxuICAgICAgc2VsZWN0ZWQ6ICFjdXJyZW50VmFsdWUuaW5jbHVkZXMoY2hvaWNlSWQpLFxuICAgICAgc2VsZWN0b3I6ICdLZXlib2FyZCcsXG4gICAgfTtcblxuICAgIHRoaXMuX29uQ2hhbmdlKG5ld1ZhbHVlKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsU0FBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksTUFBQSxHQUFBTCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGNBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFNBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGVBQUEsR0FBQVIsT0FBQTtBQUVBLE1BQU1TLEdBQUcsR0FBRyxJQUFBQyxjQUFLLEVBQUMsd0JBQXdCLENBQUM7QUFFcEMsTUFBTUMsVUFBVSxHQUFHQSxDQUFDQyxPQUFPLEVBQUVDLEtBQUssRUFBRUMsYUFBYSxFQUFFQyxjQUFjLEtBQUs7RUFDM0UsTUFBTTtJQUFFQyxvQkFBb0I7SUFBRUM7RUFBcUIsQ0FBQyxHQUFHSixLQUFLLElBQUksQ0FBQyxDQUFDOztFQUVsRTtFQUNBLElBQUlHLG9CQUFvQixJQUFJQyxvQkFBb0IsSUFBSSxDQUFDSCxhQUFhLEVBQUU7SUFDbEUsSUFBSUMsY0FBYyxFQUFFO01BQ2xCLE1BQU1HLEtBQUssR0FBR0gsY0FBYyxDQUFDSSxhQUFhLENBQUMsT0FBTyxDQUFDO01BQ25ELE1BQU1DLGNBQWMsR0FBR0YsS0FBSyxJQUFJQSxLQUFLLENBQUNHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzs7TUFFaEU7TUFDQSxJQUFJSCxLQUFLLElBQUlFLGNBQWMsRUFBRTtRQUMzQixPQUFPLEtBQUs7TUFDZDtJ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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_main","_interopRequireDefault","require","_react","_client","_debounce","_debug","_piePlayerEvents","_mathRendering","_renderUi","_sessionUpdater","log","debug","isComplete","session","model","audioComplete","elementContext","autoplayAudioEnabled","completeAudioEnabled","audio","querySelector","isInsidePrompt","closest","value","choiceMode","minSelections","maxSelections","selections","length","exports","MultipleChoice","HTMLElement","constructor","_model","_session","_boundHandleKeyDown","handleKeyDown","bind","_keyboardEventsEnabled","_audioInitialized","_root","_rerender","debounce","element","React","createElement","Main","onChoiceChanged","_onChange","onShowCorrectToggle","setAttribute","setLangAttribute","createRoot","render","queueMicrotask","renderMath","keyboardEventsEnabled","enableKeyboardEvents","leading","trailing","_dispatchResponseChanged","dispatchEvent","SessionChangedEvent","tagName","toLowerCase","_dispatchModelSet","ModelSetEvent","undefined","language","lang","slice","s","data","updateSessionValue","_createAudioInfoToast","info","document","id","Object","assign","style","position","top","width","height","display","justifyContent","alignItems","background","zIndex","cursor","img","src","EnableAudioAutoplayImage","alt","appendChild","connectedCallback","observer","MutationObserver","mutationsList","forEach","mutation","type","container","enableAudio","play","removeChild","removeEventListener","setTimeout","paused","addEventListener","handlePlaying","updateSessionMetadata","audioStartTime","Date","getTime","handleEnded","audioEndTime","_audio","_handlePlaying","_handleEnded","_enableAudio","disconnect","observe","childList","subtree","window","disconnectedCallback","unmount","event","mode","keyToIndex","key","numOffset","letterOffset","test","charCodeAt","choiceIndex","choices","currentValue","choiceId","newValue","selected","includes","selector","default"],"sources":["../src/index.js"],"sourcesContent":["import Main from './main';\nimport React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport debounce from 'lodash/debounce';\nimport debug from 'debug';\nimport { ModelSetEvent, SessionChangedEvent } from '@pie-framework/pie-player-events';\nimport { renderMath } from '@pie-lib/math-rendering';\nimport { EnableAudioAutoplayImage } from '@pie-lib/render-ui';\nimport { updateSessionValue, updateSessionMetadata } from './session-updater';\n\nconst log = debug('pie-ui:multiple-choice');\n\nexport const isComplete = (session, model, audioComplete, elementContext) => {\n const { autoplayAudioEnabled, completeAudioEnabled } = model || {};\n\n // check audio completion if audio settings are enabled and audio actually exists\n if (autoplayAudioEnabled && completeAudioEnabled && !audioComplete) {\n if (elementContext) {\n const audio = elementContext.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n // only require audio completion if audio exists and is inside the prompt\n if (audio && isInsidePrompt) {\n return false;\n }\n }\n }\n\n if (!session || !session.value) {\n return false;\n }\n\n const { choiceMode, minSelections = 1, maxSelections } = model || {};\n const selections = session.value.length || 0;\n\n if (choiceMode === 'radio') {\n return !!selections;\n }\n\n if (selections < minSelections || selections > maxSelections) {\n return false;\n }\n\n return true;\n};\n\nexport default class MultipleChoice extends HTMLElement {\n constructor() {\n super();\n this._model = null;\n this._session = null;\n this.audioComplete = false;\n this._boundHandleKeyDown = this.handleKeyDown.bind(this);\n this._keyboardEventsEnabled = false;\n this._audioInitialized = false;\n this._root = null;\n\n this._rerender = debounce(\n () => {\n if (this._model && this._session) {\n var element = React.createElement(Main, {\n model: this._model,\n session: this._session,\n onChoiceChanged: this._onChange.bind(this),\n onShowCorrectToggle: this.onShowCorrectToggle.bind(this),\n });\n\n //TODO: aria-label is set in the _rerender because we need to change it when the model.choiceMode is updated. Consider revisiting the placement of the aria-label setting in the _rerender\n this.setAttribute(\n 'aria-label',\n this._model.choiceMode === 'radio' ? 'Multiple Choice Question' : 'Multiple Correct Answer Question',\n );\n this.setAttribute('role', 'region');\n this.setLangAttribute();\n\n if (!this._root) {\n this._root = createRoot(this);\n }\n this._root.render(element);\n queueMicrotask(() => {\n log('render complete - render math');\n renderMath(this);\n });\n\n if (this._model.keyboardEventsEnabled === true && !this._keyboardEventsEnabled) {\n this.enableKeyboardEvents();\n }\n } else {\n log('skip');\n }\n },\n 50,\n { leading: false, trailing: true },\n );\n\n this._dispatchResponseChanged = debounce(() => {\n this.dispatchEvent(\n new SessionChangedEvent(\n this.tagName.toLowerCase(),\n isComplete(this._session, this._model, this.audioComplete, this),\n ),\n );\n });\n\n this._dispatchModelSet = debounce(\n () => {\n this.dispatchEvent(\n new ModelSetEvent(\n this.tagName.toLowerCase(),\n isComplete(this._session, this._model, this.audioComplete, this),\n this._model !== undefined,\n ),\n );\n },\n 50,\n { leading: false, trailing: true },\n );\n }\n\n onShowCorrectToggle() {\n renderMath(this);\n }\n\n setLangAttribute() {\n const language = this._model && typeof this._model.language ? this._model.language : '';\n const lang = language ? language.slice(0, 2) : 'en';\n this.setAttribute('lang', lang);\n }\n\n set model(s) {\n this._model = s;\n this._rerender();\n // reset the audioInitialized to false since the model changed, and we might need to reinitialize the audio\n this._audioInitialized = false;\n this._dispatchModelSet();\n }\n\n get session() {\n return this._session;\n }\n\n set session(s) {\n this._session = s;\n this._rerender();\n //TODO: remove this session-changed should only be emit on user change\n this._dispatchResponseChanged();\n }\n\n _onChange(data) {\n updateSessionValue(this._session, this._model.choiceMode, data);\n this._dispatchResponseChanged();\n this._rerender();\n }\n\n _createAudioInfoToast() {\n const info = document.createElement('div');\n info.id = 'play-audio-info';\n\n Object.assign(info.style, {\n position: 'absolute',\n top: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n background: 'white',\n zIndex: '1000',\n cursor: 'pointer',\n });\n\n const img = document.createElement('img');\n img.src = EnableAudioAutoplayImage;\n img.alt = 'Click anywhere to enable audio autoplay';\n img.width = 500;\n img.height = 300;\n\n info.appendChild(img);\n return info;\n }\n\n connectedCallback() {\n this._rerender();\n\n // Observation: audio in Chrome will have the autoplay attribute,\n // while other browsers will not have the autoplay attribute and will need a user interaction to play the audio\n // This workaround fixes the issue of audio being cached and played on any user interaction in Safari and Firefox\n const observer = new MutationObserver((mutationsList, observer) => {\n mutationsList.forEach((mutation) => {\n if (mutation.type === 'childList') {\n if (this._audioInitialized) return;\n\n const audio = this.querySelector('audio');\n const isInsidePrompt = audio && audio.closest('#preview-prompt');\n\n if (!this._model) return;\n if (!this._model.autoplayAudioEnabled) return;\n if (audio && !isInsidePrompt) return;\n if (!audio) return;\n\n const info = this._createAudioInfoToast();\n const container = this.querySelector('#main-container');\n const enableAudio = () => {\n if (this.querySelector('#play-audio-info')) {\n audio.play();\n container.removeChild(info);\n }\n\n document.removeEventListener('click', enableAudio);\n };\n\n // if the audio is paused, it means the user has not interacted with the page yet and the audio will not play\n // FIX FOR SAFARI: play with a slight delay to check if autoplay was blocked\n setTimeout(() => {\n if (audio.paused && !this.querySelector('#play-audio-info')) {\n // add info message as a toast to enable audio playback\n container.appendChild(info);\n document.addEventListener('click', enableAudio);\n } else {\n document.removeEventListener('click', enableAudio);\n }\n }, 500);\n\n // we need to listen for the playing event to remove the toast in case the audio plays because of re-rendering\n const handlePlaying = () => {\n updateSessionMetadata(this._session, { audioStartTime: new Date().getTime() });\n\n const info = this.querySelector('#play-audio-info');\n if (info) {\n container.removeChild(info);\n }\n\n audio.removeEventListener('playing', handlePlaying);\n };\n\n audio.addEventListener('playing', handlePlaying);\n\n // we need to listen for the ended event to update the isComplete state\n const handleEnded = () => {\n updateSessionMetadata(this._session, { audioEndTime: new Date().getTime() });\n this.audioComplete = true;\n this._dispatchResponseChanged();\n audio.removeEventListener('ended', handleEnded);\n };\n\n audio.addEventListener('ended', handleEnded);\n\n // store references to remove later\n this._audio = audio;\n this._handlePlaying = handlePlaying;\n this._handleEnded = handleEnded;\n this._enableAudio = enableAudio;\n // set to true to prevent multiple initializations\n this._audioInitialized = true;\n\n observer.disconnect();\n }\n });\n });\n\n observer.observe(this, { childList: true, subtree: true });\n }\n\n enableKeyboardEvents() {\n if (!this._keyboardEventsEnabled) {\n window.addEventListener('keydown', this._boundHandleKeyDown);\n this._keyboardEventsEnabled = true;\n }\n }\n\n disconnectedCallback() {\n if (this._keyboardEventsEnabled) {\n window.removeEventListener('keydown', this._boundHandleKeyDown);\n this._keyboardEventsEnabled = false;\n }\n\n document.removeEventListener('click', this._enableAudio);\n\n if (this._audio) {\n this._audio.removeEventListener('playing', this._handlePlaying);\n this._audio.removeEventListener('ended', this._handleEnded);\n this._audio = null;\n }\n\n if (this._root) {\n this._root.unmount();\n }\n }\n\n /**\n * Handles global keyboard events for selecting or toggling multiple-choice answers.\n * Maps keys (1-9, 0, a-j, A-J) to choices and updates the session state accordingly.\n * Ensures valid key presses toggle or select the appropriate choice based on the model.\n */\n handleKeyDown(event) {\n if (!this._model || !this._session) {\n return;\n }\n\n const { mode } = this._model;\n if (mode !== 'gather') {\n return;\n }\n\n const keyToIndex = (key) => {\n const numOffset = key >= '1' && key <= '9' ? key - '1' : key === '0' ? 9 : -1;\n const letterOffset = /^[a-jA-J]$/.test(key) ? key.toLowerCase().charCodeAt(0) - 'a'.charCodeAt(0) : -1;\n return numOffset >= 0 ? numOffset : letterOffset;\n };\n\n const choiceIndex = keyToIndex(event.key);\n\n if (choiceIndex === undefined || choiceIndex <= -1 || choiceIndex >= this._model.choices?.length) {\n return;\n }\n\n const currentValue = this._session.value || [];\n const choiceId = this._model.choices[choiceIndex].value;\n\n const newValue = {\n value: choiceId,\n selected: !currentValue.includes(choiceId),\n selector: 'Keyboard',\n };\n\n this._onChange(newValue);\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,KAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAF,OAAA;AACA,IAAAG,SAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,MAAA,GAAAL,sBAAA,CAAAC,OAAA;AACA,IAAAK,gBAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AACA,IAAAO,SAAA,GAAAP,OAAA;AACA,IAAAQ,eAAA,GAAAR,OAAA;AAEA,MAAMS,GAAG,GAAG,IAAAC,cAAK,EAAC,wBAAwB,CAAC;AAEpC,MAAMC,UAAU,GAAGA,CAACC,OAAO,EAAEC,KAAK,EAAEC,aAAa,EAAEC,cAAc,KAAK;EAC3E,MAAM;IAAEC,oBAAoB;IAAEC;EAAqB,CAAC,GAAGJ,KAAK,IAAI,CAAC,CAAC;;EAElE;EACA,IAAIG,oBAAoB,IAAIC,oBAAoB,IAAI,CAACH,aAAa,EAAE;IAClE,IAAIC,cAAc,EAAE;MAClB,MAAMG,KAAK,GAAGH,cAAc,CAACI,aAAa,CAAC,OAAO,CAAC;MACnD,MAAMC,cAAc,GAAGF,KAAK,IAAIA,KAAK,CAACG,OAAO,CAAC,iBAAiB,CAAC;;MAEhE;MACA,IAAIH,KAAK,IAAIE,cAAc,EAAE;QAC3B,OAAO,KAAK;MACd;IACF;EACF;EAEA,IAAI,CAACR,OAAO,IAAI,CAACA,OAAO,CAACU,KAAK,EAAE;IAC9B,OAAO,KAAK;EACd;EAEA,MAAM;IAAEC,UAAU;IAAEC,aAAa,GAAG,CAAC;IAAEC;EAAc,CAAC,GAAGZ,KAAK,IAAI,CAAC,CAAC;EACpE,MAAMa,UAAU,GAAGd,OAAO,CAACU,KAAK,CAACK,MAAM,IAAI,CAAC;EAE5C,IAAIJ,UAAU,KAAK,OAAO,EAAE;IAC1B,OAAO,CAAC,CAACG,UAAU;EACrB;EAEA,IAAIA,UAAU,GAAGF,aAAa,IAAIE,UAAU,GAAGD,aAAa,EAAE;IAC5D,OAAO,KAAK;EACd;EAEA,OAAO,IAAI;AACb,CAAC;AAACG,OAAA,CAAAjB,UAAA,GAAAA,UAAA;AAEa,MAAMkB,cAAc,SAASC,WAAW,CAAC;EACtDC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,CAAC;IACP,IAAI,CAACC,MAAM,GAAG,IAAI;IAClB,IAAI,CAACC,QAAQ,GAAG,IAAI;IACpB,IAAI,CAACnB,aAAa,GAAG,KAAK;IAC1B,IAAI,CAACoB,mBAAmB,GAAG,IAAI,CAACC,aAAa,CAACC,IAAI,CAAC,IAAI,CAAC;IACxD,IAAI,CAACC,sBAAsB,GAAG,KAAK;IACnC,IAAI,CAACC,iBAAiB,GAAG,KAAK;IAC9B,IAAI,CAACC,KAAK,GAAG,IAAI;IAEjB,IAAI,CAACC,SAAS,GAAG,IAAAC,iBAAQ,EACvB,MAAM;MACJ,IAAI,IAAI,CAACT,MAAM,IAAI,IAAI,CAACC,QAAQ,EAAE;QAChC,IAAIS,OAAO,gBAAGC,cAAK,CAACC,aAAa,CAACC,aAAI,EAAE;UACtChC,KAAK,EAAE,IAAI,CAACmB,MAAM;UAClBpB,OAAO,EAAE,IAAI,CAACqB,QAAQ;UACtBa,eAAe,EAAE,IAAI,CAACC,SAAS,CAACX,IAAI,CAAC,IAAI,CAAC;UAC1CY,mBAAmB,EAAE,IAAI,CAACA,mBAAmB,CAACZ,IAAI,CAAC,IAAI;QACzD,CAAC,CAAC;;QAEF;QACA,IAAI,CAACa,YAAY,CACf,YAAY,EACZ,IAAI,CAACjB,MAAM,CAACT,UAAU,KAAK,OAAO,GAAG,0BAA0B,GAAG,kCACpE,CAAC;QACD,IAAI,CAAC0B,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;QACnC,IAAI,CAACC,gBAAgB,CAAC,CAAC;QAEvB,IAAI,CAAC,IAAI,CAACX,KAAK,EAAE;UACf,IAAI,CAACA,KAAK,GAAG,IAAAY,kBAAU,EAAC,IAAI,CAAC;QAC/B;QACA,IAAI,CAACZ,KAAK,CAACa,MAAM,CAACV,OAAO,CAAC;QAC1BW,cAAc,CAAC,MAAM;UACnB5C,GAAG,CAAC,+BAA+B,CAAC;UACpC,IAAA6C,yBAAU,EAAC,IAAI,CAAC;QAClB,CAAC,CAAC;QAEF,IAAI,IAAI,CAACtB,MAAM,CAACuB,qBAAqB,KAAK,IAAI,IAAI,CAAC,IAAI,CAAClB,sBAAsB,EAAE;UAC9E,IAAI,CAACmB,oBAAoB,CAAC,CAAC;QAC7B;MACF,CAAC,MAAM;QACL/C,GAAG,CAAC,MAAM,CAAC;MACb;IACF,CAAC,EACD,EAAE,EACF;MAAEgD,OAAO,EAAE,KAAK;MAAEC,QAAQ,EAAE;IAAK,CACnC,CAAC;IAED,IAAI,CAACC,wBAAwB,GAAG,IAAAlB,iBAAQ,EAAC,MAAM;MAC7C,IAAI,CAACmB,aAAa,CAChB,IAAIC,oCAAmB,CACrB,IAAI,CAACC,OAAO,CAACC,WAAW,CAAC,CAAC,EAC1BpD,UAAU,CAAC,IAAI,CAACsB,QAAQ,EAAE,IAAI,CAACD,MAAM,EAAE,IAAI,CAAClB,aAAa,EAAE,IAAI,CACjE,CACF,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,CAACkD,iBAAiB,GAAG,IAAAvB,iBAAQ,EAC/B,MAAM;MACJ,IAAI,CAACmB,aAAa,CAChB,IAAIK,8BAAa,CACf,IAAI,CAACH,OAAO,CAACC,WAAW,CAAC,CAAC,EAC1BpD,UAAU,CAAC,IAAI,CAACsB,QAAQ,EAAE,IAAI,CAACD,MAAM,EAAE,IAAI,CAAClB,aAAa,EAAE,IAAI,CAAC,EAChE,IAAI,CAACkB,MAAM,KAAKkC,SAClB,CACF,CAAC;IACH,CAAC,EACD,EAAE,EACF;MAAET,OAAO,EAAE,KAAK;MAAEC,QAAQ,EAAE;IAAK,CACnC,CAAC;EACH;EAEAV,mBAAmBA,CAAA,EAAG;IACpB,IAAAM,yBAAU,EAAC,IAAI,CAAC;EAClB;EAEAJ,gBAAgBA,CAAA,EAAG;IACjB,MAAMiB,QAAQ,GAAG,IAAI,CAACnC,MAAM,IAAI,OAAO,IAAI,CAACA,MAAM,CAACmC,QAAQ,GAAG,IAAI,CAACnC,MAAM,CAACmC,QAAQ,GAAG,EAAE;IACvF,MAAMC,IAAI,GAAGD,QAAQ,GAAGA,QAAQ,CAACE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;IACnD,IAAI,CAACpB,YAAY,CAAC,MAAM,EAAEmB,IAAI,CAAC;EACjC;EAEA,IAAIvD,KAAKA,CAACyD,CAAC,EAAE;IACX,IAAI,CAACtC,MAAM,GAAGsC,CAAC;IACf,IAAI,CAAC9B,SAAS,CAAC,CAAC;IAChB;IACA,IAAI,CAACF,iBAAiB,GAAG,KAAK;IAC9B,IAAI,CAAC0B,iBAAiB,CAAC,CAAC;EAC1B;EAEA,IAAIpD,OAAOA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACqB,QAAQ;EACtB;EAEA,IAAIrB,OAAOA,CAAC0D,CAAC,EAAE;IACb,IAAI,CAACrC,QAAQ,GAAGqC,CAAC;IACjB,IAAI,CAAC9B,SAAS,CAAC,CAAC;IAChB;IACA,IAAI,CAACmB,wBAAwB,CAAC,CAAC;EACjC;EAEAZ,SAASA,CAACwB,IAAI,EAAE;IACd,IAAAC,kCAAkB,EAAC,IAAI,CAACvC,QAAQ,EAAE,IAAI,CAACD,MAAM,CAACT,UAAU,EAAEgD,IAAI,CAAC;IAC/D,IAAI,CAACZ,wBAAwB,CAAC,CAAC;IAC/B,IAAI,CAACnB,SAAS,CAAC,CAAC;EAClB;EAEAiC,qBAAqBA,CAAA,EAAG;IACtB,MAAMC,IAAI,GAAGC,QAAQ,CAAC/B,aAAa,CAAC,KAAK,CAAC;IAC1C8B,IAAI,CAACE,EAAE,GAAG,iBAAiB;IAE3BC,MAAM,CAACC,MAAM,CAACJ,IAAI,CAACK,KAAK,EAAE;MACxBC,QAAQ,EAAE,UAAU;MACpBC,GAAG,EAAE,CAAC;MACNC,KAAK,EAAE,MAAM;MACbC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,MAAM;MACfC,cAAc,EAAE,QAAQ;MACxBC,UAAU,EAAE,QAAQ;MACpBC,UAAU,EAAE,OAAO;MACnBC,MAAM,EAAE,MAAM;MACdC,MAAM,EAAE;IACV,CAAC,CAAC;IAEF,MAAMC,GAAG,GAAGf,QAAQ,CAAC/B,aAAa,CAAC,KAAK,CAAC;IACzC8C,GAAG,CAACC,GAAG,GAAGC,kCAAwB;IAClCF,GAAG,CAACG,GAAG,GAAG,yCAAyC;IACnDH,GAAG,CAACR,KAAK,GAAG,GAAG;IACfQ,GAAG,CAACP,MAAM,GAAG,GAAG;IAEhBT,IAAI,CAACoB,WAAW,CAACJ,GAAG,CAAC;IACrB,OAAOhB,IAAI;EACb;EAEAqB,iBAAiBA,CAAA,EAAG;IAClB,IAAI,CAACvD,SAAS,CAAC,CAAC;;IAEhB;IACA;IACA;IACA,MAAMwD,QAAQ,GAAG,IAAIC,gBAAgB,CAAC,CAACC,aAAa,EAAEF,QAAQ,KAAK;MACjEE,aAAa,CAACC,OAAO,CAAEC,QAAQ,IAAK;QAClC,IAAIA,QAAQ,CAACC,IAAI,KAAK,WAAW,EAAE;UACjC,IAAI,IAAI,CAAC/D,iBAAiB,EAAE;UAE5B,MAAMpB,KAAK,GAAG,IAAI,CAACC,aAAa,CAAC,OAAO,CAAC;UACzC,MAAMC,cAAc,GAAGF,KAAK,IAAIA,KAAK,CAACG,OAAO,CAAC,iBAAiB,CAAC;UAEhE,IAAI,CAAC,IAAI,CAACW,MAAM,EAAE;UAClB,IAAI,CAAC,IAAI,CAACA,MAAM,CAAChB,oBAAoB,EAAE;UACvC,IAAIE,KAAK,IAAI,CAACE,cAAc,EAAE;UAC9B,IAAI,CAACF,KAAK,EAAE;UAEZ,MAAMwD,IAAI,GAAG,IAAI,CAACD,qBAAqB,CAAC,CAAC;UACzC,MAAM6B,SAAS,GAAG,IAAI,CAACnF,aAAa,CAAC,iBAAiB,CAAC;UACvD,MAAMoF,WAAW,GAAGA,CAAA,KAAM;YACxB,IAAI,IAAI,CAACpF,aAAa,CAAC,kBAAkB,CAAC,EAAE;cAC1CD,KAAK,CAACsF,IAAI,CAAC,CAAC;cACZF,SAAS,CAACG,WAAW,CAAC/B,IAAI,CAAC;YAC7B;YAEAC,QAAQ,CAAC+B,mBAAmB,CAAC,OAAO,EAAEH,WAAW,CAAC;UACpD,CAAC;;UAED;UACA;UACAI,UAAU,CAAC,MAAM;YACf,IAAIzF,KAAK,CAAC0F,MAAM,IAAI,CAAC,IAAI,CAACzF,aAAa,CAAC,kBAAkB,CAAC,EAAE;cAC3D;cACAmF,SAAS,CAACR,WAAW,CAACpB,IAAI,CAAC;cAC3BC,QAAQ,CAACkC,gBAAgB,CAAC,OAAO,EAAEN,WAAW,CAAC;YACjD,CAAC,MAAM;cACL5B,QAAQ,CAAC+B,mBAAmB,CAAC,OAAO,EAAEH,WAAW,CAAC;YACpD;UACF,CAAC,EAAE,GAAG,CAAC;;UAEP;UACA,MAAMO,aAAa,GAAGA,CAAA,KAAM;YAC1B,IAAAC,qCAAqB,EAAC,IAAI,CAAC9E,QAAQ,EAAE;cAAE+E,cAAc,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC;YAAE,CAAC,CAAC;YAE9E,MAAMxC,IAAI,GAAG,IAAI,CAACvD,aAAa,CAAC,kBAAkB,CAAC;YACnD,IAAIuD,IAAI,EAAE;cACR4B,SAAS,CAACG,WAAW,CAAC/B,IAAI,CAAC;YAC7B;YAEAxD,KAAK,CAACwF,mBAAmB,CAAC,SAAS,EAAEI,aAAa,CAAC;UACrD,CAAC;UAED5F,KAAK,CAAC2F,gBAAgB,CAAC,SAAS,EAAEC,aAAa,CAAC;;UAEhD;UACA,MAAMK,WAAW,GAAGA,CAAA,KAAM;YACxB,IAAAJ,qCAAqB,EAAC,IAAI,CAAC9E,QAAQ,EAAE;cAAEmF,YAAY,EAAE,IAAIH,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC;YAAE,CAAC,CAAC;YAC5E,IAAI,CAACpG,aAAa,GAAG,IAAI;YACzB,IAAI,CAAC6C,wBAAwB,CAAC,CAAC;YAC/BzC,KAAK,CAACwF,mBAAmB,CAAC,OAAO,EAAES,WAAW,CAAC;UACjD,CAAC;UAEDjG,KAAK,CAAC2F,gBAAgB,CAAC,OAAO,EAAEM,WAAW,CAAC;;UAE5C;UACA,IAAI,CAACE,MAAM,GAAGnG,KAAK;UACnB,IAAI,CAACoG,cAAc,GAAGR,aAAa;UACnC,IAAI,CAACS,YAAY,GAAGJ,WAAW;UAC/B,IAAI,CAACK,YAAY,GAAGjB,WAAW;UAC/B;UACA,IAAI,CAACjE,iBAAiB,GAAG,IAAI;UAE7B0D,QAAQ,CAACyB,UAAU,CAAC,CAAC;QACvB;MACF,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFzB,QAAQ,CAAC0B,OAAO,CAAC,IAAI,EAAE;MAAEC,SAAS,EAAE,IAAI;MAAEC,OAAO,EAAE;IAAK,CAAC,CAAC;EAC5D;EAEApE,oBAAoBA,CAAA,EAAG;IACrB,IAAI,CAAC,IAAI,CAACnB,sBAAsB,EAAE;MAChCwF,MAAM,CAAChB,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC3E,mBAAmB,CAAC;MAC5D,IAAI,CAACG,sBAAsB,GAAG,IAAI;IACpC;EACF;EAEAyF,oBAAoBA,CAAA,EAAG;IACrB,IAAI,IAAI,CAACzF,sBAAsB,EAAE;MAC/BwF,MAAM,CAACnB,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACxE,mBAAmB,CAAC;MAC/D,IAAI,CAACG,sBAAsB,GAAG,KAAK;IACrC;IAEAsC,QAAQ,CAAC+B,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACc,YAAY,CAAC;IAExD,IAAI,IAAI,CAACH,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,CAACX,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAACY,cAAc,CAAC;MAC/D,IAAI,CAACD,MAAM,CAACX,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAACa,YAAY,CAAC;MAC3D,IAAI,CAACF,MAAM,GAAG,IAAI;IACpB;IAEA,IAAI,IAAI,CAAC9E,KAAK,EAAE;MACd,IAAI,CAACA,KAAK,CAACwF,OAAO,CAAC,CAAC;IACtB;EACF;;EAEA;AACF;AACA;AACA;AACA;EACE5F,aAAaA,CAAC6F,KAAK,EAAE;IACnB,IAAI,CAAC,IAAI,CAAChG,MAAM,IAAI,CAAC,IAAI,CAACC,QAAQ,EAAE;MAClC;IACF;IAEA,MAAM;MAAEgG;IAAK,CAAC,GAAG,IAAI,CAACjG,MAAM;IAC5B,IAAIiG,IAAI,KAAK,QAAQ,EAAE;MACrB;IACF;IAEA,MAAMC,UAAU,GAAIC,GAAG,IAAK;MAC1B,MAAMC,SAAS,GAAGD,GAAG,IAAI,GAAG,IAAIA,GAAG,IAAI,GAAG,GAAGA,GAAG,GAAG,GAAG,GAAGA,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;MAC7E,MAAME,YAAY,GAAG,YAAY,CAACC,IAAI,CAACH,GAAG,CAAC,GAAGA,GAAG,CAACpE,WAAW,CAAC,CAAC,CAACwE,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAACA,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;MACtG,OAAOH,SAAS,IAAI,CAAC,GAAGA,SAAS,GAAGC,YAAY;IAClD,CAAC;IAED,MAAMG,WAAW,GAAGN,UAAU,CAACF,KAAK,CAACG,GAAG,CAAC;IAEzC,IAAIK,WAAW,KAAKtE,SAAS,IAAIsE,WAAW,IAAI,CAAC,CAAC,IAAIA,WAAW,IAAI,IAAI,CAACxG,MAAM,CAACyG,OAAO,EAAE9G,MAAM,EAAE;MAChG;IACF;IAEA,MAAM+G,YAAY,GAAG,IAAI,CAACzG,QAAQ,CAACX,KAAK,IAAI,EAAE;IAC9C,MAAMqH,QAAQ,GAAG,IAAI,CAAC3G,MAAM,CAACyG,OAAO,CAACD,WAAW,CAAC,CAAClH,KAAK;IAEvD,MAAMsH,QAAQ,GAAG;MACftH,KAAK,EAAEqH,QAAQ;MACfE,QAAQ,EAAE,CAACH,YAAY,CAACI,QAAQ,CAACH,QAAQ,CAAC;MAC1CI,QAAQ,EAAE;IACZ,CAAC;IAED,IAAI,CAAChG,SAAS,CAAC6F,QAAQ,CAAC;EAC1B;AACF;AAAChH,OAAA,CAAAoH,OAAA,GAAAnH,cAAA","ignoreList":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
var _react = _interopRequireDefault(require("react"));
|
|
11
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
12
|
+
var _renderUi = require("@pie-lib/render-ui");
|
|
13
|
+
var _multipleChoice = _interopRequireDefault(require("./multiple-choice"));
|
|
14
|
+
class Main extends _react.default.Component {
|
|
15
|
+
render() {
|
|
16
|
+
const {
|
|
17
|
+
model,
|
|
18
|
+
onChoiceChanged,
|
|
19
|
+
session,
|
|
20
|
+
onShowCorrectToggle
|
|
21
|
+
} = this.props;
|
|
22
|
+
const {
|
|
23
|
+
extraCSSRules,
|
|
24
|
+
fontSizeFactor
|
|
25
|
+
} = model;
|
|
26
|
+
|
|
27
|
+
// model.partLabel is a property used for ebsr
|
|
28
|
+
return /*#__PURE__*/_react.default.createElement(_renderUi.PreviewLayout, {
|
|
29
|
+
extraCSSRules: extraCSSRules,
|
|
30
|
+
fontSizeFactor: fontSizeFactor,
|
|
31
|
+
classes: {}
|
|
32
|
+
}, /*#__PURE__*/_react.default.createElement(_multipleChoice.default, (0, _extends2.default)({}, model, {
|
|
33
|
+
session: session,
|
|
34
|
+
onChoiceChanged: onChoiceChanged,
|
|
35
|
+
onShowCorrectToggle: onShowCorrectToggle
|
|
36
|
+
})));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
(0, _defineProperty2.default)(Main, "propTypes", {
|
|
40
|
+
model: _propTypes.default.object,
|
|
41
|
+
session: _propTypes.default.object,
|
|
42
|
+
onChoiceChanged: _propTypes.default.func,
|
|
43
|
+
onShowCorrectToggle: _propTypes.default.func,
|
|
44
|
+
extraCSSRules: _propTypes.default.shape({
|
|
45
|
+
names: _propTypes.default.arrayOf(_propTypes.default.string),
|
|
46
|
+
rules: _propTypes.default.string
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
(0, _defineProperty2.default)(Main, "defaultProps", {
|
|
50
|
+
model: {},
|
|
51
|
+
session: {}
|
|
52
|
+
});
|
|
53
|
+
var _default = exports.default = Main;
|
|
54
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9wcm9wVHlwZXMiLCJfcmVuZGVyVWkiLCJfbXVsdGlwbGVDaG9pY2UiLCJNYWluIiwiUmVhY3QiLCJDb21wb25lbnQiLCJyZW5kZXIiLCJtb2RlbCIsIm9uQ2hvaWNlQ2hhbmdlZCIsInNlc3Npb24iLCJvblNob3dDb3JyZWN0VG9nZ2xlIiwicHJvcHMiLCJleHRyYUNTU1J1bGVzIiwiZm9udFNpemVGYWN0b3IiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsIlByZXZpZXdMYXlvdXQiLCJjbGFzc2VzIiwiX2V4dGVuZHMyIiwiX2RlZmluZVByb3BlcnR5MiIsIlByb3BUeXBlcyIsIm9iamVjdCIsImZ1bmMiLCJzaGFwZSIsIm5hbWVzIiwiYXJyYXlPZiIsInN0cmluZyIsInJ1bGVzIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL21haW4uanN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnO1xuaW1wb3J0IHsgUHJldmlld0xheW91dCB9IGZyb20gJ0BwaWUtbGliL3JlbmRlci11aSc7XG5pbXBvcnQgTXVsdGlwbGVDaG9pY2UgZnJvbSAnLi9tdWx0aXBsZS1jaG9pY2UnO1xuXG5jbGFzcyBNYWluIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICBtb2RlbDogUHJvcFR5cGVzLm9iamVjdCxcbiAgICBzZXNzaW9uOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIG9uQ2hvaWNlQ2hhbmdlZDogUHJvcFR5cGVzLmZ1bmMsXG4gICAgb25TaG93Q29ycmVjdFRvZ2dsZTogUHJvcFR5cGVzLmZ1bmMsXG4gICAgZXh0cmFDU1NSdWxlczogUHJvcFR5cGVzLnNoYXBlKHtcbiAgICAgIG5hbWVzOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMuc3RyaW5nKSxcbiAgICAgIHJ1bGVzOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIH0pLFxuICB9O1xuXG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgbW9kZWw6IHt9LFxuICAgIHNlc3Npb246IHt9LFxuICB9O1xuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IG1vZGVsLCBvbkNob2ljZUNoYW5nZWQsIHNlc3Npb24sIG9uU2hvd0NvcnJlY3RUb2dnbGUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBleHRyYUNTU1J1bGVzLCBmb250U2l6ZUZhY3RvciB9ID0gbW9kZWw7XG5cbiAgICAvLyBtb2RlbC5wYXJ0TGFiZWwgaXMgYSBwcm9wZXJ0eSB1c2VkIGZvciBlYnNyXG4gICAgcmV0dXJuIChcbiAgICAgIDxQcmV2aWV3TGF5b3V0IGV4dHJhQ1NTUnVsZXM9e2V4dHJhQ1NTUnVsZXN9IGZvbnRTaXplRmFjdG9yPXtmb250U2l6ZUZhY3Rvcn0gY2xhc3Nlcz17e319PlxuICAgICAgICA8TXVsdGlwbGVDaG9pY2VcbiAgICAgICAgICB7Li4ubW9kZWx9XG4gICAgICAgICAgc2Vzc2lvbj17c2Vzc2lvbn1cbiAgICAgICAgICBvbkNob2ljZUNoYW5nZWQ9e29uQ2hvaWNlQ2hhbmdlZH1cbiAgICAgICAgICBvblNob3dDb3JyZWN0VG9nZ2xlPXtvblNob3dDb3JyZWN0VG9nZ2xlfVxuICAgICAgICAvPlxuICAgICAgPC9QcmV2aWV3TGF5b3V0PlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFpbjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsVUFBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsU0FBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsZUFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsTUFBTUksSUFBSSxTQUFTQyxjQUFLLENBQUNDLFNBQVMsQ0FBQztFQWlCakNDLE1BQU1BLENBQUEsRUFBRztJQUNQLE1BQU07TUFBRUMsS0FBSztNQUFFQyxlQUFlO01BQUVDLE9BQU87TUFBRUM7SUFBb0IsQ0FBQyxHQUFHLElBQUksQ0FBQ0MsS0FBSztJQUMzRSxNQUFNO01BQUVDLGFBQWE7TUFBRUM7SUFBZSxDQUFDLEdBQUdOLEtBQUs7O0lBRS9DO0lBQ0Esb0JBQ0VWLE1BQUEsQ0FBQWlCLE9BQUEsQ0FBQUMsYUFBQSxDQUFDZCxTQUFBLENBQUFlLGFBQWE7TUFBQ0osYUFBYSxFQUFFQSxhQUFjO01BQUNDLGNBQWMsRUFBRUEsY0FBZTtNQUFDSSxPQUFPLEVBQUUsQ0FBQztJQUFFLGdCQUN2RnBCLE1BQUEsQ0FBQWlCLE9BQUEsQ0FBQUMsYUFBQSxDQUFDYixlQUFBLENBQUFZLE9BQWMsTUFBQUksU0FBQSxDQUFBSixPQUFBLE1BQ1RQLEtBQUs7TUFDVEUsT0FBTyxFQUFFQSxPQUFRO01BQ2pCRCxlQUFlLEVBQUVBLGVBQWdCO01BQ2pDRSxtQkFBbUIsRUFBRUE7SUFBb0IsRUFDMUMsQ0FDWSxDQUFDO0VBRXBCO0FBQ0Y7QUFBQyxJQUFBUyxnQkFBQSxDQUFBTCxPQUFBLEVBakNLWCxJQUFJLGVBQ1c7RUFDakJJLEtBQUssRUFBRWEsa0JBQVMsQ0FBQ0MsTUFBTTtFQUN2QlosT0FBTyxFQUFFVyxrQkFBUyxDQUFDQyxNQUFNO0VBQ3pCYixlQUFlLEVBQUVZLGtCQUFTLENBQUNFLElBQUk7RUFDL0JaLG1CQUFtQixFQUFFVSxrQkFBUyxDQUFDRSxJQUFJO0VBQ25DVixhQUFhLEVBQUVRLGtCQUFTLENBQUNHLEtBQUssQ0FBQztJQUM3QkMsS0FBSyxFQUFFSixrQkFBUyxDQUFDSyxPQUFPLENBQUNMLGtCQUFTLENBQUNNLE1BQU0sQ0FBQztJQUMxQ0MsS0FBSyxFQUFFUCxrQkFBUyxDQUFDTTtFQUNuQixDQUFDO0FBQ0gsQ0FBQztBQUFBLElBQUFQLGdCQUFBLENBQUFMLE9BQUEsRUFWR1gsSUFBSSxrQkFZYztFQUNwQkksS0FBSyxFQUFFLENBQUMsQ0FBQztFQUNURSxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFBQSxJQUFBbUIsUUFBQSxHQUFBQyxPQUFBLENBQUFmLE9BQUEsR0FvQllYLElBQUkiLCJpZ25vcmVMaXN0IjpbXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","names":["_react","_interopRequireDefault","require","_propTypes","_renderUi","_multipleChoice","Main","React","Component","render","model","onChoiceChanged","session","onShowCorrectToggle","props","extraCSSRules","fontSizeFactor","default","createElement","PreviewLayout","classes","_extends2","_defineProperty2","PropTypes","object","func","shape","names","arrayOf","string","rules","_default","exports"],"sources":["../src/main.jsx"],"sourcesContent":["import React from 'react';\nimport PropTypes from 'prop-types';\nimport { PreviewLayout } from '@pie-lib/render-ui';\nimport MultipleChoice from './multiple-choice';\n\nclass Main extends React.Component {\n static propTypes = {\n model: PropTypes.object,\n session: PropTypes.object,\n onChoiceChanged: PropTypes.func,\n onShowCorrectToggle: PropTypes.func,\n extraCSSRules: PropTypes.shape({\n names: PropTypes.arrayOf(PropTypes.string),\n rules: PropTypes.string,\n }),\n };\n\n static defaultProps = {\n model: {},\n session: {},\n };\n\n render() {\n const { model, onChoiceChanged, session, onShowCorrectToggle } = this.props;\n const { extraCSSRules, fontSizeFactor } = model;\n\n // model.partLabel is a property used for ebsr\n return (\n <PreviewLayout extraCSSRules={extraCSSRules} fontSizeFactor={fontSizeFactor} classes={{}}>\n <MultipleChoice\n {...model}\n session={session}\n onChoiceChanged={onChoiceChanged}\n onShowCorrectToggle={onShowCorrectToggle}\n />\n </PreviewLayout>\n );\n }\n}\n\nexport default Main;\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,eAAA,GAAAJ,sBAAA,CAAAC,OAAA;AAEA,MAAMI,IAAI,SAASC,cAAK,CAACC,SAAS,CAAC;EAiBjCC,MAAMA,CAAA,EAAG;IACP,MAAM;MAAEC,KAAK;MAAEC,eAAe;MAAEC,OAAO;MAAEC;IAAoB,CAAC,GAAG,IAAI,CAACC,KAAK;IAC3E,MAAM;MAAEC,aAAa;MAAEC;IAAe,CAAC,GAAGN,KAAK;;IAE/C;IACA,oBACEV,MAAA,CAAAiB,OAAA,CAAAC,aAAA,CAACd,SAAA,CAAAe,aAAa;MAACJ,aAAa,EAAEA,aAAc;MAACC,cAAc,EAAEA,cAAe;MAACI,OAAO,EAAE,CAAC;IAAE,gBACvFpB,MAAA,CAAAiB,OAAA,CAAAC,aAAA,CAACb,eAAA,CAAAY,OAAc,MAAAI,SAAA,CAAAJ,OAAA,MACTP,KAAK;MACTE,OAAO,EAAEA,OAAQ;MACjBD,eAAe,EAAEA,eAAgB;MACjCE,mBAAmB,EAAEA;IAAoB,EAC1C,CACY,CAAC;EAEpB;AACF;AAAC,IAAAS,gBAAA,CAAAL,OAAA,EAjCKX,IAAI,eACW;EACjBI,KAAK,EAAEa,kBAAS,CAACC,MAAM;EACvBZ,OAAO,EAAEW,kBAAS,CAACC,MAAM;EACzBb,eAAe,EAAEY,kBAAS,CAACE,IAAI;EAC/BZ,mBAAmB,EAAEU,kBAAS,CAACE,IAAI;EACnCV,aAAa,EAAEQ,kBAAS,CAACG,KAAK,CAAC;IAC7BC,KAAK,EAAEJ,kBAAS,CAACK,OAAO,CAACL,kBAAS,CAACM,MAAM,CAAC;IAC1CC,KAAK,EAAEP,kBAAS,CAACM;EACnB,CAAC;AACH,CAAC;AAAA,IAAAP,gBAAA,CAAAL,OAAA,EAVGX,IAAI,kBAYc;EACpBI,KAAK,EAAE,CAAC,CAAC;EACTE,OAAO,EAAE,CAAC;AACZ,CAAC;AAAA,IAAAmB,QAAA,GAAAC,OAAA,CAAAf,OAAA,GAoBYX,IAAI","ignoreList":[]}
|