PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.2
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.2
4.4.8 4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
learnpress / assets / js / dist / frontend / quiz.js

quiz.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.2, at assets/js/dist/frontend/quiz.js

3,612 lines 135.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /******/ (() => { // webpackBootstrap
2 /******/ var __webpack_modules__ = ({
3
4 /***/ "./assets/src/apps/js/frontend/quiz/components/attempts/index.js"
5 /*!***********************************************************************!*\
6 !*** ./assets/src/apps/js/frontend/quiz/components/attempts/index.js ***!
7 \***********************************************************************/
8 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
9
10 "use strict";
11 __webpack_require__.r(__webpack_exports__);
12 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
13 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14 /* harmony export */ });
15 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
16 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
17 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
18 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_1__);
19 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
20 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__);
21 /* harmony import */ var _duration__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../duration */ "./assets/src/apps/js/frontend/quiz/components/duration/index.js");
22
23
24
25
26
27 /**
28 * Displays list of all attempt from a quiz.
29 */
30 const Attempts = () => {
31 const attempts = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.select)('learnpress/quiz').getData('attempts') || [];
32 const hasAttempts = attempts && !!attempts.length;
33 return !hasAttempts ? false : (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
34 className: "quiz-attempts"
35 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("h4", {
36 className: "attempts-heading"
37 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Last Attempt', 'learnpress')), hasAttempts && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("table", null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("thead", null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("tr", null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("th", {
38 className: "quiz-attempts__questions"
39 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Questions', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("th", {
40 className: "quiz-attempts__spend"
41 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Time spent', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("th", {
42 className: "quiz-attempts__marks"
43 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Marks', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("th", {
44 className: "quiz-attempts__grade"
45 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Passing grade', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("th", {
46 className: "quiz-attempts__result"
47 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Result', 'learnpress')))), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("tbody", null, attempts.map((row, key) => {
48 // Re-write value to attempts.timeSpend
49 /*if ( lpQuizSettings.checkNorequizenroll === 1 ) {
50 const timespendStart = window.localStorage.getItem( 'quiz_start_' + lpQuizSettings.id ),
51 timespendEnd = window.localStorage.getItem( 'quiz_end_' + lpQuizSettings.id );
52 if ( timespendStart && timespendEnd ) {
53 row.timeSpend = timeDifference( timespendStart, timespendEnd ).duration;
54 }
55 }*/
56 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("tr", {
57 key: `attempt-${key}`
58 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("td", {
59 className: "quiz-attempts__questions"
60 }, `${row.questionCorrect} / ${row.questionCount}`), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("td", {
61 className: "quiz-attempts__spend"
62 }, row.timeSpend || '--'), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("td", {
63 className: "quiz-attempts__marks"
64 }, `${row.userMark} / ${row.mark}`), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("td", {
65 className: "quiz-attempts__grade"
66 }, row.passingGrade || '-'), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("td", {
67 className: "quiz-attempts__result"
68 }, `${parseFloat(row.result).toFixed(2)}%`, " ", (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, row.graduationText)));
69 })))));
70 };
71 function timeDifference(earlierDate, laterDate) {
72 const oDiff = new Object();
73
74 // Calculate Differences
75 // ------------------------------------------------------------------- //
76 let nTotalDiff = laterDate - earlierDate;
77 oDiff.days = Math.floor(nTotalDiff / 1000 / 60 / 60 / 24);
78 nTotalDiff -= oDiff.days * 1000 * 60 * 60 * 24;
79 oDiff.hours = Math.floor(nTotalDiff / 1000 / 60 / 60);
80 nTotalDiff -= oDiff.hours * 1000 * 60 * 60;
81 oDiff.minutes = Math.floor(nTotalDiff / 1000 / 60);
82 nTotalDiff -= oDiff.minutes * 1000 * 60;
83 oDiff.seconds = Math.floor(nTotalDiff / 1000);
84 // ------------------------------------------------------------------- //
85
86 // Format Duration
87 // ------------------------------------------------------------------- //
88 // Format Hours
89 let hourtext = '00';
90 if (oDiff.days > 0) {
91 hourtext = String(oDiff.days);
92 }
93 if (hourtext.length == 1) {
94 hourtext = '0' + hourtext;
95 }
96
97 // Format Minutes
98 let mintext = '00';
99 if (oDiff.minutes > 0) {
100 mintext = String(oDiff.minutes);
101 }
102 if (mintext.length == 1) {
103 mintext = '0' + mintext;
104 }
105
106 // Format Seconds
107 let sectext = '00';
108 if (oDiff.seconds > 0) {
109 sectext = String(oDiff.seconds);
110 }
111 if (sectext.length == 1) {
112 sectext = '0' + sectext;
113 }
114 // Set Duration
115 const sDuration = hourtext + ':' + mintext + ':' + sectext;
116 oDiff.duration = sDuration;
117 // ------------------------------------------------------------------- //
118
119 return oDiff;
120 }
121 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Attempts);
122
123 /***/ },
124
125 /***/ "./assets/src/apps/js/frontend/quiz/components/buttons/button-check.js"
126 /*!*****************************************************************************!*\
127 !*** ./assets/src/apps/js/frontend/quiz/components/buttons/button-check.js ***!
128 \*****************************************************************************/
129 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
130
131 "use strict";
132 __webpack_require__.r(__webpack_exports__);
133 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
134 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
135 /* harmony export */ });
136 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
137 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
138 /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
139 /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_1__);
140 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
141 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_2__);
142 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
143 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_3__);
144 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/compose */ "@wordpress/compose");
145 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_compose__WEBPACK_IMPORTED_MODULE_4__);
146 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
147 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__);
148
149
150
151
152
153
154 class ButtonCheck extends _wordpress_element__WEBPACK_IMPORTED_MODULE_2__.Component {
155 constructor() {
156 super(...arguments);
157 this.state = {
158 loading: false
159 };
160 }
161 checkAnswer = () => {
162 const {
163 checkAnswer,
164 question,
165 answered
166 } = this.props;
167
168 // Fix temporary for FIB.
169 if (question.type === 'fill_in_blanks') {
170 const elFIB = document.querySelector(`.question-fill_in_blanks[data-id="${question.id}"]`);
171 const elInputs = elFIB.querySelectorAll('.lp-fib-input > input');
172 elInputs.forEach(elInput => {
173 if (elInput.value.length > 0) {
174 this.setState({
175 loading: true
176 });
177 checkAnswer(question.id);
178 return false;
179 }
180 });
181 }
182 if (answered) {
183 checkAnswer(question.id);
184 this.setState({
185 loading: true
186 });
187 }
188 };
189 render() {
190 const {
191 answered
192 } = this.props;
193 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
194 className: classnames__WEBPACK_IMPORTED_MODULE_1___default()('lp-button', 'instant-check', {
195 loading: this.state.loading
196 }),
197 onClick: this.checkAnswer
198 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
199 className: "instant-check__icon"
200 }), (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Check answers', 'learnpress'), !answered && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
201 className: "instant-check__info",
202 dangerouslySetInnerHTML: {
203 __html: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('You need to answer the question before checking the answer key.', 'learnpress')
204 }
205 })));
206 }
207 }
208 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_4__.compose)((0,_wordpress_data__WEBPACK_IMPORTED_MODULE_3__.withSelect)((select, {
209 question: {
210 id
211 }
212 }) => {
213 const {
214 getQuestionAnswered
215 } = select('learnpress/quiz');
216 return {
217 answered: getQuestionAnswered(id)
218 };
219 }), (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_3__.withDispatch)((dispatch, {
220 id
221 }) => {
222 const {
223 checkAnswer
224 } = dispatch('learnpress/quiz');
225 return {
226 checkAnswer(id) {
227 checkAnswer(id);
228 }
229 };
230 }))(ButtonCheck));
231
232 /***/ },
233
234 /***/ "./assets/src/apps/js/frontend/quiz/components/buttons/button-hint.js"
235 /*!****************************************************************************!*\
236 !*** ./assets/src/apps/js/frontend/quiz/components/buttons/button-hint.js ***!
237 \****************************************************************************/
238 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
239
240 "use strict";
241 __webpack_require__.r(__webpack_exports__);
242 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
243 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
244 /* harmony export */ });
245 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
246 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
247 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
248 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
249 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
250 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
251 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/compose */ "@wordpress/compose");
252 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__);
253 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
254 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__);
255
256
257
258
259
260 class ButtonHint extends _wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Component {
261 /**
262 * Callback to show hint of question
263 */
264 showHint = () => {
265 const {
266 showHint,
267 question
268 } = this.props;
269 showHint(question.id, !question.showHint);
270 };
271 render() {
272 const {
273 question
274 } = this.props;
275 return question.hint ? (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
276 className: "btn-show-hint",
277 onClick: this.showHint
278 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Hint', 'learnpress'))) : '';
279 }
280 }
281 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__.compose)((0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withDispatch)((dispatch, {
282 id
283 }) => {
284 const {
285 showHint
286 } = dispatch('learnpress/quiz');
287 return {
288 showHint(id, show) {
289 showHint(id, show);
290 }
291 };
292 }))(ButtonHint));
293
294 /***/ },
295
296 /***/ "./assets/src/apps/js/frontend/quiz/components/buttons/index.js"
297 /*!**********************************************************************!*\
298 !*** ./assets/src/apps/js/frontend/quiz/components/buttons/index.js ***!
299 \**********************************************************************/
300 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
301
302 "use strict";
303 __webpack_require__.r(__webpack_exports__);
304 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
305 /* harmony export */ MaybeShowButton: () => (/* binding */ MaybeShowButton),
306 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
307 /* harmony export */ });
308 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
309 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
310 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
311 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
312 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
313 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
314 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/compose */ "@wordpress/compose");
315 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__);
316 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
317 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__);
318
319
320
321
322
323 class Buttons extends _wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Component {
324 startQuiz = event => {
325 event && event.preventDefault();
326 const btn = document.querySelector('.lp-button.start');
327 btn && btn.setAttribute('disabled', 'disabled');
328 btn.classList.add('loading');
329 const {
330 startQuiz,
331 status
332 } = this.props;
333 if (status === 'completed') {
334 const {
335 confirm,
336 isOpen
337 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.select)('learnpress/modal');
338 if ('no' === confirm((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Are you sure you want to retake the quiz?', 'learnpress'), this.startQuiz)) {
339 !isOpen() && btn && btn.removeAttribute('disabled');
340 btn.classList.remove('loading');
341 return;
342 }
343 }
344
345 // No require enroll
346 /*if ( lpQuizSettings.checkNorequizenroll === 1 ) {
347 // Reset data
348 window.localStorage.removeItem( 'quiz_start_' + lpQuizSettings.id );
349 window.localStorage.removeItem( 'quiz_userdata_' + lpQuizSettings.id );
350 window.localStorage.setItem( 'quiz_start_' + lpQuizSettings.id, Date.now() );
351 // Set retake to local.storage
352 const retakenNumber = window.localStorage.getItem( 'quiz_retake_' + lpQuizSettings.id );
353 if ( retakenNumber >= 1 ) {
354 window.localStorage.setItem( 'quiz_retake_' + lpQuizSettings.id, parseInt( retakenNumber ) + 1 );
355 } else {
356 window.localStorage.setItem( 'quiz_retake_' + lpQuizSettings.id, 1 );
357 }
358 }*/
359
360 startQuiz();
361 };
362 nav = to => event => {
363 let {
364 questionNav,
365 currentPage,
366 numPages,
367 setCurrentPage
368 } = this.props;
369 switch (to) {
370 case 'prev':
371 if (currentPage > 1) {
372 currentPage = currentPage - 1;
373 } else if (questionNav === 'infinity') {
374 currentPage = numPages;
375 } else {
376 currentPage = 1;
377 }
378 break;
379 default:
380 if (currentPage < numPages) {
381 currentPage = currentPage + 1;
382 } else if (questionNav === 'infinity') {
383 currentPage = 1;
384 } else {
385 currentPage = numPages;
386 }
387 }
388 setCurrentPage(currentPage);
389 };
390 moveTo = pageNum => event => {
391 event.preventDefault();
392 const {
393 numPages,
394 setCurrentPage
395 } = this.props;
396 if (pageNum < 1 || pageNum > numPages) {
397 return;
398 }
399 setCurrentPage(pageNum);
400 };
401 isLast = () => {
402 const {
403 currentPage,
404 numPages
405 } = this.props;
406 return currentPage === numPages;
407 };
408 isFirst = () => {
409 const {
410 currentPage
411 } = this.props;
412 return currentPage === 1;
413 };
414 submit = () => {
415 const {
416 submitQuiz
417 } = this.props;
418 const {
419 confirm
420 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.select)('learnpress/modal');
421 if ('no' === confirm((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Are you sure to submit the quiz?', 'learnpress'), this.submit)) {
422 return;
423 }
424 submitQuiz();
425 };
426 setQuizMode = mode => () => {
427 const {
428 setQuizMode
429 } = this.props;
430 setQuizMode(mode);
431 };
432 isReviewing = () => {
433 const {
434 isReviewing
435 } = this.props;
436 return isReviewing;
437 };
438 pageNumbers(args) {
439 const {
440 numPages,
441 currentPage
442 } = this.props;
443 if (numPages < 2) {
444 return '';
445 }
446 args = {
447 numPages,
448 currentPage,
449 midSize: 1,
450 endSize: 1,
451 prevNext: true,
452 ...(args || {})
453 };
454 if (args.endSize < 1) {
455 args.endSize = 1;
456 }
457 if (args.midSize < 0) {
458 args.midSize = 1;
459 }
460 const numbers = [...Array(numPages).keys()];
461 let dots = false;
462 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
463 className: "nav-links"
464 }, args.prevNext && !this.isFirst() && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
465 className: "page-numbers prev",
466 "data-type": "question-navx",
467 onClick: this.nav('prev')
468 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Prev', 'learnpress')), numbers.map(number => {
469 number = number + 1;
470 if (number === args.currentPage) {
471 dots = true;
472 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
473 key: `page-number-${number}`,
474 className: "page-numbers current"
475 }, number);
476 }
477 if (number <= args.endSize || args.currentPage && number >= args.currentPage - args.midSize && number <= args.currentPage + args.midSize || number > args.numPages - args.endSize) {
478 dots = true;
479 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
480 key: `page-number-${number}`,
481 className: "page-numbers",
482 onClick: this.moveTo(number)
483 }, number);
484 } else if (dots) {
485 dots = false;
486 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
487 key: `page-number-${number}`,
488 className: "page-numbers dots"
489 }, "\u2026");
490 }
491 return '';
492 }), args.prevNext && !this.isLast() && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
493 className: "page-numbers next",
494 "data-type": "question-navx",
495 onClick: this.nav('next')
496 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Next', 'learnpress')));
497 }
498 render() {
499 const {
500 status,
501 questionNav,
502 isReviewing,
503 showReview,
504 numPages,
505 question,
506 questionsPerPage,
507 canRetry,
508 retakeNumber,
509 requiredPassword,
510 allowRetake
511 } = this.props;
512 const classNames = ['quiz-buttons'];
513 if (status === 'started' || isReviewing) {
514 classNames.push('align-center');
515 }
516 if (questionNav === 'questionNav') {
517 classNames.push('infinity');
518 }
519 if (this.isFirst()) {
520 classNames.push('is-first');
521 }
522 if (this.isLast()) {
523 classNames.push('is-last');
524 }
525 const popupSidebar = document.querySelector('#popup-sidebar');
526 const quizzApp = document.querySelector('#learn-press-quiz-app');
527 let styles = '';
528 if (status === 'started' || isReviewing) {
529 styles = {
530 marginLeft: popupSidebar && popupSidebar.offsetWidth / 2,
531 width: quizzApp && quizzApp.offsetWidth
532 };
533 } else {
534 styles = null;
535 }
536 let navPositionClass = ' fixed';
537 if (lpQuizSettings.navigationPosition == 'no') {
538 navPositionClass = ' nav-center';
539 }
540 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
541 className: classNames.join(' ')
542 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
543 className: `button-left` + (status === 'started' || isReviewing ? navPositionClass : ''),
544 style: styles
545 }, (status === 'completed' && canRetry || -1 !== ['', 'viewed'].indexOf(status)) && !isReviewing && !requiredPassword && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
546 className: "lp-button start",
547 onClick: this.startQuiz
548 }, status === 'completed' ? `${(0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Retake', 'learnpress')} ${!allowRetake ? ` ${retakeNumber ? ` (${retakeNumber})` : ''}` : ''} ` : ' ' + (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Start', 'learnpress')), ('started' === status || isReviewing) && numPages > 1 && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
549 className: "questions-pagination"
550 }, this.pageNumbers()))), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
551 className: "button-right"
552 }, 'started' === status && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, ('infinity' === questionNav || this.isLast()) && !isReviewing && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
553 className: "lp-button submit-quiz",
554 onClick: this.submit
555 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Finish Quiz', 'learnpress'))), isReviewing && showReview && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
556 className: "lp-button back-quiz",
557 onClick: this.setQuizMode('')
558 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Result', 'learnpress')), 'completed' === status && showReview && !isReviewing && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
559 className: "lp-button review-quiz",
560 onClick: this.setQuizMode('reviewing')
561 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Review', 'learnpress')))), this.props.message && this.props.success !== true && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
562 className: "learn-press-message error"
563 }, this.props.message));
564 }
565 }
566
567 /**
568 * Helper function to check a button should be show or not.
569 *
570 * Buttons [hint, check]
571 */
572 const MaybeShowButton = (0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__.compose)((0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withSelect)(select => {
573 const {
574 getData
575 } = select('learnpress/quiz');
576 return {
577 status: getData('status'),
578 showCheck: getData('instantCheck'),
579 checkedQuestions: getData('checkedQuestions'),
580 hintedQuestions: getData('hintedQuestions'),
581 questionsPerPage: getData('questionsPerPage')
582 };
583 }))(props => {
584 const {
585 showCheck,
586 checkedQuestions,
587 hintedQuestions,
588 question,
589 status,
590 type,
591 Button
592 } = props;
593 if (status !== 'started') {
594 return false;
595 }
596 const theButton = (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(Button, {
597 question: question
598 });
599 switch (type) {
600 case 'hint':
601 if (!hintedQuestions) {
602 return theButton;
603 }
604 if (!question.hasHint) {
605 return false;
606 }
607 return hintedQuestions.indexOf(question.id) === -1 && theButton;
608 case 'check':
609 if (!showCheck) {
610 return false;
611 }
612 if (!checkedQuestions) {
613 return theButton;
614 }
615 return checkedQuestions.indexOf(question.id) === -1 && theButton;
616 }
617 });
618 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__.compose)([(0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withSelect)(select => {
619 const {
620 getData,
621 getCurrentQuestion
622 } = select('learnpress/quiz');
623 const data = {
624 id: getData('id'),
625 status: getData('status'),
626 questionIds: getData('questionIds'),
627 questionNav: getData('questionNav'),
628 isReviewing: getData('reviewQuestions') && getData('mode') === 'reviewing',
629 showReview: getData('reviewQuestions'),
630 showCheck: getData('instantCheck'),
631 checkedQuestions: getData('checkedQuestions'),
632 hintedQuestions: getData('hintedQuestions'),
633 numPages: getData('numPages'),
634 pages: getData('pages'),
635 currentPage: getData('currentPage'),
636 questionsPerPage: getData('questionsPerPage'),
637 pageNumbers: getData('pageNumbers'),
638 keyPressed: getData('keyPressed'),
639 canRetry: getData('retakeCount') > 0 && getData('retaken') < getData('retakeCount'),
640 retakeNumber: getData('retakeCount') > 0 && getData('retaken') < getData('retakeCount') ? getData('retakeCount') - getData('retaken') : null,
641 message: getData('messageResponse') || false,
642 success: getData('successResponse') !== undefined ? getData('successResponse') : true,
643 requiredPassword: getData('requiredPassword'),
644 allowRetake: getData('allowRetake')
645 };
646 if (data.questionsPerPage === 1) {
647 data.question = getCurrentQuestion('object');
648 }
649 if (lpQuizSettings.checkNorequizenroll === 1) {
650 const retakenCurrent = window.localStorage.getItem('quiz_off_retaken_' + lpQuizSettings.id);
651 if (getData('retakeCount') > retakenCurrent) {
652 data.retakeNumber = getData('retakeCount') - retakenCurrent;
653 data.canRetry = true;
654 } else {
655 data.canRetry = false;
656 }
657 }
658 if (data.allowRetake) {
659 data.canRetry = true;
660 }
661 return data;
662 }), (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withDispatch)((dispatch, {
663 id
664 }) => {
665 const {
666 startQuiz,
667 setCurrentQuestion,
668 submitQuiz,
669 setQuizMode,
670 showHint,
671 checkAnswer,
672 setCurrentPage
673 } = dispatch('learnpress/quiz');
674 return {
675 startQuiz,
676 setCurrentQuestion,
677 setQuizMode,
678 setCurrentPage,
679 submitQuiz(id) {
680 submitQuiz(id);
681 },
682 showHint(id) {
683 showHint(id);
684 },
685 checkAnswer(id) {
686 checkAnswer(id);
687 }
688 };
689 })])(Buttons));
690
691 /***/ },
692
693 /***/ "./assets/src/apps/js/frontend/quiz/components/content/index.js"
694 /*!**********************************************************************!*\
695 !*** ./assets/src/apps/js/frontend/quiz/components/content/index.js ***!
696 \**********************************************************************/
697 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
698
699 "use strict";
700 __webpack_require__.r(__webpack_exports__);
701 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
702 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
703 /* harmony export */ });
704 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
705 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
706 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
707 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_1__);
708
709 /**
710 * Quiz Content.
711 * Edit: Use React hook.
712 *
713 * @author nhamdv - ThimPress
714 */
715
716 const Content = () => {
717 const content = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.select)('learnpress/quiz').getData('content');
718 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
719 className: "quiz-content",
720 dangerouslySetInnerHTML: {
721 __html: content
722 }
723 });
724 };
725 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Content);
726
727 /***/ },
728
729 /***/ "./assets/src/apps/js/frontend/quiz/components/duration/index.js"
730 /*!***********************************************************************!*\
731 !*** ./assets/src/apps/js/frontend/quiz/components/duration/index.js ***!
732 \***********************************************************************/
733 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
734
735 "use strict";
736 __webpack_require__.r(__webpack_exports__);
737 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
738 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
739 /* harmony export */ });
740 const formatDuration = seconds => {
741 let d;
742 const dayInSeconds = 3600 * 24;
743 if (seconds > dayInSeconds) {
744 d = (seconds - seconds % dayInSeconds) / dayInSeconds;
745 seconds = seconds % dayInSeconds;
746 } else if (seconds == dayInSeconds) {
747 return '24:00';
748 }
749 const x = new Date(seconds * 1000).toUTCString().match(/\d{2}:\d{2}:\d{2}/)[0].split(':');
750 if (d) {
751 x[0] = parseInt(x[0]) + d * 24;
752 }
753 const html = x.join(':');
754 return html;
755 };
756 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (formatDuration);
757
758 /***/ },
759
760 /***/ "./assets/src/apps/js/frontend/quiz/components/index.js"
761 /*!**************************************************************!*\
762 !*** ./assets/src/apps/js/frontend/quiz/components/index.js ***!
763 \**************************************************************/
764 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
765
766 "use strict";
767 __webpack_require__.r(__webpack_exports__);
768 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
769 /* harmony export */ Attempts: () => (/* reexport safe */ _attempts__WEBPACK_IMPORTED_MODULE_5__["default"]),
770 /* harmony export */ Buttons: () => (/* reexport safe */ _buttons__WEBPACK_IMPORTED_MODULE_3__["default"]),
771 /* harmony export */ Content: () => (/* reexport safe */ _content__WEBPACK_IMPORTED_MODULE_1__["default"]),
772 /* harmony export */ Meta: () => (/* reexport safe */ _meta__WEBPACK_IMPORTED_MODULE_2__["default"]),
773 /* harmony export */ Questions: () => (/* reexport safe */ _questions__WEBPACK_IMPORTED_MODULE_4__["default"]),
774 /* harmony export */ Result: () => (/* reexport safe */ _result__WEBPACK_IMPORTED_MODULE_7__["default"]),
775 /* harmony export */ Status: () => (/* reexport safe */ _status__WEBPACK_IMPORTED_MODULE_8__["default"]),
776 /* harmony export */ Timer: () => (/* reexport safe */ _timer__WEBPACK_IMPORTED_MODULE_6__["default"]),
777 /* harmony export */ Title: () => (/* reexport safe */ _title__WEBPACK_IMPORTED_MODULE_0__["default"])
778 /* harmony export */ });
779 /* harmony import */ var _title__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./title */ "./assets/src/apps/js/frontend/quiz/components/title/index.js");
780 /* harmony import */ var _content__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./content */ "./assets/src/apps/js/frontend/quiz/components/content/index.js");
781 /* harmony import */ var _meta__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./meta */ "./assets/src/apps/js/frontend/quiz/components/meta/index.js");
782 /* harmony import */ var _buttons__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./buttons */ "./assets/src/apps/js/frontend/quiz/components/buttons/index.js");
783 /* harmony import */ var _questions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./questions */ "./assets/src/apps/js/frontend/quiz/components/questions/index.js");
784 /* harmony import */ var _attempts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./attempts */ "./assets/src/apps/js/frontend/quiz/components/attempts/index.js");
785 /* harmony import */ var _timer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./timer */ "./assets/src/apps/js/frontend/quiz/components/timer/index.js");
786 /* harmony import */ var _result__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./result */ "./assets/src/apps/js/frontend/quiz/components/result/index.js");
787 /* harmony import */ var _status__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./status */ "./assets/src/apps/js/frontend/quiz/components/status/index.js");
788
789
790
791
792
793
794
795
796
797
798 /***/ },
799
800 /***/ "./assets/src/apps/js/frontend/quiz/components/meta/index.js"
801 /*!*******************************************************************!*\
802 !*** ./assets/src/apps/js/frontend/quiz/components/meta/index.js ***!
803 \*******************************************************************/
804 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
805
806 "use strict";
807 __webpack_require__.r(__webpack_exports__);
808 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
809 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
810 /* harmony export */ });
811 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
812 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
813 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
814 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_1__);
815 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
816 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__);
817 /* harmony import */ var _duration__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../duration */ "./assets/src/apps/js/frontend/quiz/components/duration/index.js");
818
819 /**
820 * Quiz Meta.
821 * Edit: Use React Hook.
822 *
823 * @author Nhamdv - ThimPress
824 */
825
826
827
828 const {
829 Hook
830 } = LP;
831 const Meta = () => {
832 const getData = attr => {
833 return (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.select)('learnpress/quiz').getData(attr);
834 };
835 const metaFields = Hook.applyFilters('quiz-meta-fields', {
836 duration: {
837 title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Duration:', 'learnpress'),
838 name: 'duration',
839 content: (0,_duration__WEBPACK_IMPORTED_MODULE_3__["default"])(getData('duration')) || '--'
840 },
841 passingGrade: {
842 title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Passing grade:', 'learnpress'),
843 name: 'passing-grade',
844 content: getData('passingGrade') || '--'
845 },
846 questionsCount: {
847 title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Questions:', 'learnpress'),
848 name: 'questions-count',
849 content: getData('questionIds') ? getData('questionIds').length : 0
850 }
851 });
852 return metaFields && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {
853 className: "quiz-intro"
854 }, Object.values(metaFields).map((field, i) => {
855 const id = field.name || i;
856 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
857 key: `quiz-intro-field-${i}`,
858 className: `quiz-intro-item quiz-intro-item--${id}`
859 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
860 className: "quiz-intro-item__title",
861 dangerouslySetInnerHTML: {
862 __html: field.title
863 }
864 }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
865 className: "quiz-intro-item__content",
866 dangerouslySetInnerHTML: {
867 __html: field.content
868 }
869 }));
870 })));
871 };
872 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Meta);
873
874 /***/ },
875
876 /***/ "./assets/src/apps/js/frontend/quiz/components/questions/buttons.js"
877 /*!**************************************************************************!*\
878 !*** ./assets/src/apps/js/frontend/quiz/components/questions/buttons.js ***!
879 \**************************************************************************/
880 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
881
882 "use strict";
883 __webpack_require__.r(__webpack_exports__);
884 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
885 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
886 /* harmony export */ });
887 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
888 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
889 /* harmony import */ var _buttons_button_hint__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../buttons/button-hint */ "./assets/src/apps/js/frontend/quiz/components/buttons/button-hint.js");
890 /* harmony import */ var _buttons_button_check__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../buttons/button-check */ "./assets/src/apps/js/frontend/quiz/components/buttons/button-check.js");
891 /* harmony import */ var _buttons__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../buttons */ "./assets/src/apps/js/frontend/quiz/components/buttons/index.js");
892 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
893 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_4__);
894
895
896
897
898
899 const Buttons = function Buttons(props) {
900 const {
901 question
902 } = props;
903 const buttons = {
904 'instant-check': () => {
905 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_buttons__WEBPACK_IMPORTED_MODULE_3__.MaybeShowButton, {
906 type: "check",
907 Button: _buttons_button_check__WEBPACK_IMPORTED_MODULE_2__["default"],
908 question: question
909 });
910 },
911 hint: () => {
912 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_buttons__WEBPACK_IMPORTED_MODULE_3__.MaybeShowButton, {
913 type: "hint",
914 Button: _buttons_button_hint__WEBPACK_IMPORTED_MODULE_1__["default"],
915 question: question
916 });
917 }
918 };
919 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.Fragment, null, LP.config.questionFooterButtons().map(name => {
920 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.Fragment, {
921 key: `button-${name}`
922 }, buttons[name] && buttons[name]());
923 }));
924 };
925 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Buttons);
926
927 /***/ },
928
929 /***/ "./assets/src/apps/js/frontend/quiz/components/questions/index.js"
930 /*!************************************************************************!*\
931 !*** ./assets/src/apps/js/frontend/quiz/components/questions/index.js ***!
932 \************************************************************************/
933 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
934
935 "use strict";
936 __webpack_require__.r(__webpack_exports__);
937 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
938 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
939 /* harmony export */ });
940 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
941 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
942 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
943 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
944 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
945 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
946 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/compose */ "@wordpress/compose");
947 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__);
948 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
949 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__);
950 /* harmony import */ var _question__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./question */ "./assets/src/apps/js/frontend/quiz/components/questions/question.js");
951
952
953
954
955
956
957 class Questions extends _wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Component {
958 constructor(props) {
959 super(...arguments);
960 this.needToTop = false;
961 this.state = {
962 isReviewing: null,
963 currentPage: 0,
964 self: this
965 };
966 }
967 static getDerivedStateFromProps(props, state) {
968 const checkProps = ['isReviewing', 'currentPage'];
969 const changedProps = {};
970 for (let i = 0; i < checkProps.length; i++) {
971 if (props[checkProps[i]] !== state[checkProps[i]]) {
972 changedProps[checkProps[i]] = props[checkProps[i]];
973 }
974 }
975 if (Object.values(changedProps).length) {
976 if (props.questionsPerPage === 1) {
977 state.self.needToTop = true;
978 }
979 return changedProps;
980 }
981 return null;
982 }
983
984 // componentWillReceiveProps(nextProps){
985 // const checkProps = ['isReviewing', 'currentPage'];
986 //
987 // for(let i = 0; i < checkProps.length; i++){
988 // if(this.props[checkProps[i]] !== nextProps[checkProps[i]]){
989 // this.needToTop = true;
990 // return;
991 // }
992 // }
993 //
994 // }
995
996 // componentWillUpdate() {
997 // this.needToTop = this.state.needToTop;
998 // this.setState({needToTop: false});
999 // }
1000
1001 componentDidUpdate() {
1002 if (this.needToTop) {
1003 jQuery('#popup-content').animate({
1004 scrollTop: 0
1005 }).find('.content-item-scrollable:last').animate({
1006 scrollTop: 0
1007 });
1008 this.needToTop = false;
1009 }
1010 }
1011 startQuiz = event => {
1012 event.preventDefault();
1013 const {
1014 startQuiz
1015 } = this.props;
1016 startQuiz();
1017 };
1018 isInVisibleRange = (id, index) => {
1019 const {
1020 currentPage,
1021 questionsPerPage
1022 } = this.props;
1023 return currentPage === Math.ceil(index / questionsPerPage);
1024 };
1025 nav = event => {
1026 const {
1027 sendKey
1028 } = this.props;
1029 switch (event.keyCode) {
1030 case 37:
1031 return sendKey('left');
1032 case 38:
1033 return;
1034 case 39:
1035 return sendKey('right');
1036 case 40:
1037 return;
1038 default:
1039 if (event.keyCode >= 49 && event.keyCode <= 57) {
1040 sendKey(event.keyCode - 48);
1041 }
1042 }
1043 };
1044 render() {
1045 const {
1046 status,
1047 currentQuestion,
1048 questions,
1049 questionsRendered,
1050 isReviewing,
1051 questionsPerPage
1052 } = this.props;
1053 let isShow = true;
1054 if (status === 'completed' && !isReviewing) {
1055 isShow = false;
1056 }
1057 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1058 tabIndex: 100,
1059 onKeyUp: this.nav
1060 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1061 className: "quiz-questions",
1062 style: {
1063 display: isShow ? '' : 'none'
1064 }
1065 }, questions.map((question, index) => {
1066 const isCurrent = questionsPerPage ? false : currentQuestion === question.id;
1067 const isRendered = questionsRendered && questionsRendered.indexOf(question.id) !== -1;
1068 const isVisible = this.isInVisibleRange(question.id, index + 1);
1069 return isRendered || !isRendered || isVisible ? (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_question__WEBPACK_IMPORTED_MODULE_5__["default"], {
1070 key: `loop-question-${question.id}`,
1071 isCurrent: isCurrent,
1072 isShow: isVisible,
1073 isShowIndex: questionsPerPage ? index + 1 : false,
1074 questionsPerPage: questionsPerPage,
1075 question: question
1076 }) : '';
1077 }))));
1078 }
1079 }
1080 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__.compose)((0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withSelect)((select, a, b) => {
1081 const {
1082 getData,
1083 getQuestions
1084 } = select('learnpress/quiz');
1085 return {
1086 status: getData('status'),
1087 currentQuestion: getData('currentQuestion'),
1088 questions: getQuestions(),
1089 questionsRendered: getData('questionsRendered'),
1090 isReviewing: getData('mode') === 'reviewing',
1091 numPages: getData('numPages'),
1092 currentPage: getData('currentPage'),
1093 questionsPerPage: getData('questionsPerPage') || 1
1094 };
1095 }), (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withDispatch)(dispatch => {
1096 const {
1097 startQuiz,
1098 sendKey
1099 } = dispatch('learnpress/quiz');
1100 return {
1101 startQuiz,
1102 sendKey
1103 };
1104 }))(Questions));
1105
1106 /***/ },
1107
1108 /***/ "./assets/src/apps/js/frontend/quiz/components/questions/question.js"
1109 /*!***************************************************************************!*\
1110 !*** ./assets/src/apps/js/frontend/quiz/components/questions/question.js ***!
1111 \***************************************************************************/
1112 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1113
1114 "use strict";
1115 __webpack_require__.r(__webpack_exports__);
1116 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1117 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1118 /* harmony export */ });
1119 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1120 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1121 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1122 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
1123 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
1124 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
1125 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/compose */ "@wordpress/compose");
1126 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__);
1127 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
1128 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__);
1129 /* harmony import */ var _buttons__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./buttons */ "./assets/src/apps/js/frontend/quiz/components/questions/buttons.js");
1130 /* harmony import */ var _buttons__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../buttons */ "./assets/src/apps/js/frontend/quiz/components/buttons/index.js");
1131 /* harmony import */ var _buttons_button_check__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../buttons/button-check */ "./assets/src/apps/js/frontend/quiz/components/buttons/button-check.js");
1132 /* harmony import */ var _buttons_button_hint__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../buttons/button-hint */ "./assets/src/apps/js/frontend/quiz/components/buttons/button-hint.js");
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142 const $ = window.jQuery;
1143 const {
1144 uniqueId,
1145 isArray,
1146 isNumber,
1147 bind
1148 } = lodash;
1149 class Question extends _wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Component {
1150 constructor() {
1151 super(...arguments);
1152 this.state = {
1153 time: null,
1154 showHint: false
1155 };
1156 this.$wrap = null;
1157 }
1158 componentDidMount(a) {
1159 const {
1160 question,
1161 isCurrent,
1162 markQuestionRendered
1163 } = this.props;
1164 if (isCurrent) {
1165 markQuestionRendered(question.id);
1166 }
1167 if (!this.state.time) {
1168 this.setState({
1169 time: new Date()
1170 });
1171 }
1172 LP.Hook.doAction('lp-question-compatible-builder');
1173 if (typeof MathJax !== 'undefined' && typeof MathJax.Hub !== 'undefined') {
1174 MathJax.Hub.Queue(['Typeset', MathJax.Hub]);
1175 }
1176 return a;
1177 }
1178 setRef = el => {
1179 this.$wrap = $(el);
1180 };
1181 parseOptions = options => {
1182 if (options) {
1183 options = !isArray(options) ? JSON.parse(CryptoJS.AES.decrypt(options.data, options.key, {
1184 format: CryptoJSAesJson
1185 }).toString(CryptoJS.enc.Utf8)) : options;
1186 options = !isArray(options) ? JSON.parse(options) : options;
1187 }
1188 return options || [];
1189 };
1190 getWrapperClass = () => {
1191 const {
1192 question,
1193 answered
1194 } = this.props;
1195 const classes = ['question', 'question-' + question.type];
1196 const options = this.parseOptions(question.options);
1197 if (options.length && options[0].isTrue !== undefined) {
1198 classes.push('question-answered');
1199 }
1200 return classes;
1201 };
1202 getEditLink = () => {
1203 const {
1204 question,
1205 editPermalink
1206 } = this.props;
1207 return editPermalink ? editPermalink.replace(/post=(.*[0-9])/, `post=${question.id}`) : '';
1208 };
1209 editPermalink = editPermalink => {
1210 return (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.sprintf)('<a href="%s">%s</a>', editPermalink, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Edit', 'learnpress'));
1211 };
1212 render() {
1213 const {
1214 question,
1215 isShow,
1216 isShowIndex,
1217 isShowHint,
1218 status
1219 } = this.props;
1220 const QuestionTypes = LP.questionTypes.default;
1221 const editPermalink = this.getEditLink();
1222 if (editPermalink) {
1223 jQuery('#wp-admin-bar-edit-lp_question').find('.ab-item').attr('href', editPermalink);
1224 }
1225 const titleParts = {
1226 index: () => {
1227 return isShowIndex ? (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
1228 className: "question-index"
1229 }, isShowIndex, ".") : '';
1230 },
1231 title: () => {
1232 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
1233 dangerouslySetInnerHTML: {
1234 __html: question.title
1235 }
1236 });
1237 },
1238 hint: () => {
1239 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_buttons_button_hint__WEBPACK_IMPORTED_MODULE_8__["default"], {
1240 question: question
1241 });
1242 },
1243 'edit-permalink': () => {
1244 return editPermalink && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
1245 dangerouslySetInnerHTML: {
1246 __html: this.editPermalink(editPermalink)
1247 },
1248 className: "edit-link"
1249 });
1250 }
1251 };
1252 const blocks = {
1253 title: () => {
1254 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("h4", {
1255 className: "question-title"
1256 }, LP.config.questionTitleParts().map(name => {
1257 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Fragment, {
1258 key: `title-part-${name}`
1259 }, titleParts[name] && titleParts[name]());
1260 }));
1261 },
1262 content: () => {
1263 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1264 className: "question-content",
1265 dangerouslySetInnerHTML: {
1266 __html: question.content
1267 }
1268 });
1269 },
1270 'answer-options': () => {
1271 return this.$wrap && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(QuestionTypes, {
1272 ...this.props,
1273 $wrap: this.$wrap
1274 });
1275 },
1276 explanation: () => {
1277 return question.explanation && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1278 className: "question-explanation-content"
1279 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("strong", {
1280 className: "explanation-title"
1281 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Explanation', 'learnpress'), ":"), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1282 dangerouslySetInnerHTML: {
1283 __html: question.explanation
1284 }
1285 })));
1286 },
1287 hint: () => {
1288 return question.hint && !question.explanation && question.showHint && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1289 className: "question-hint-content"
1290 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("strong", {
1291 className: "hint-title"
1292 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Hint', 'learnpress'), ":"), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1293 dangerouslySetInnerHTML: {
1294 __html: question.hint
1295 }
1296 })));
1297 },
1298 buttons: () => {
1299 return 'started' === status && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_buttons__WEBPACK_IMPORTED_MODULE_5__["default"], {
1300 question: question
1301 });
1302 }
1303 };
1304 const configBlocks = LP.config.questionBlocks();
1305 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1306 className: this.getWrapperClass().join(' '),
1307 style: {
1308 display: isShow ? '' : 'none'
1309 },
1310 "data-id": question.id,
1311 ref: this.setRef
1312 }, configBlocks.map(name => {
1313 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Fragment, {
1314 key: `block-${name}`
1315 }, blocks[name] ? blocks[name]() : '');
1316 })));
1317 }
1318 }
1319 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_3__.compose)([(0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withSelect)((select, {
1320 question: {
1321 id
1322 }
1323 }) => {
1324 const {
1325 getData,
1326 getQuestionAnswered,
1327 getQuestionMark
1328 } = select('learnpress/quiz');
1329 return {
1330 status: getData('status'),
1331 questions: getData('question'),
1332 answered: getQuestionAnswered(id),
1333 questionsRendered: getData('questionsRendered'),
1334 editPermalink: getData('editPermalink'),
1335 numPages: getData('numPages'),
1336 mark: getQuestionMark(id) || ''
1337 };
1338 }), (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.withDispatch)(dispatch => {
1339 const {
1340 updateUserQuestionAnswers,
1341 updateUserQuestionFibAnswers,
1342 markQuestionRendered
1343 } = dispatch('learnpress/quiz');
1344 return {
1345 markQuestionRendered,
1346 updateUserQuestionAnswers,
1347 updateUserQuestionFibAnswers
1348 };
1349 })])(Question));
1350
1351 /***/ },
1352
1353 /***/ "./assets/src/apps/js/frontend/quiz/components/result/index.js"
1354 /*!*********************************************************************!*\
1355 !*** ./assets/src/apps/js/frontend/quiz/components/result/index.js ***!
1356 \*********************************************************************/
1357 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1358
1359 "use strict";
1360 __webpack_require__.r(__webpack_exports__);
1361 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1362 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1363 /* harmony export */ });
1364 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1365 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1366 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1367 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
1368 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
1369 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
1370 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
1371 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__);
1372 /* harmony import */ var _single_curriculum_components_items_progress__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../single-curriculum/components/items-progress */ "./assets/src/apps/js/frontend/single-curriculum/components/items-progress.js");
1373
1374 /**
1375 * Quizz Result.
1376 * Edit: Use React hook.
1377 *
1378 * @author Nhamdv - ThimPress
1379 */
1380
1381
1382
1383
1384 const {
1385 debounce
1386 } = lodash;
1387 const Result = () => {
1388 const [percentage, setPercentage] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useState)(0);
1389 const [done, setDone] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useState)(false);
1390 const QuizID = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.useSelect)(select => {
1391 return select('learnpress/quiz').getData('id');
1392 }, []);
1393 const results = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.useSelect)(select => {
1394 return select('learnpress/quiz').getData('results');
1395 }, []);
1396 const passingGrade = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.useSelect)(select => {
1397 return select('learnpress/quiz').getData('passingGrade');
1398 }, []);
1399 const submitting = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.useSelect)(select => {
1400 return select('learnpress/quiz').getData('submitting');
1401 }, []);
1402 (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
1403 animate();
1404 let graduation = '';
1405 if (results.graduation) {
1406 graduation = results.graduation;
1407 } else if (results.result >= passingGradeValue) {
1408 graduation = 'passed';
1409 } else {
1410 graduation = 'failed';
1411 }
1412 if (graduation) {
1413 const ele = document.querySelector(`.course-curriculum .course-item.course-item-${QuizID}`);
1414 if (ele) {
1415 ele.classList.remove('failed', 'passed');
1416 ele.classList.add('has-status', 'status-completed', graduation);
1417 }
1418 }
1419 const item = [...document.querySelectorAll('#popup-header .items-progress')][0];
1420 if (item) {
1421 const totalItems = item.dataset.totalItems;
1422 const itemCompleted = item.querySelector('.items-completed');
1423 const elProgress = item.querySelector('.learn-press-progress__active');
1424 if (itemCompleted) {
1425 // const number = parseInt( itemCompleted.textContent );
1426
1427 const allItemCompleted = document.querySelectorAll('#popup-sidebar .course-curriculum .course-item__status .completed');
1428 itemCompleted.textContent = parseInt(allItemCompleted.length);
1429
1430 // Set progress
1431 const perCent = parseInt(allItemCompleted.length) * 100 / parseInt(totalItems);
1432 const percentSet = 100 - perCent;
1433 elProgress.style.left = '-' + percentSet + '%';
1434 }
1435 }
1436 }, [results]);
1437 (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
1438 if (submitting !== undefined) {
1439 updateItemsProgress();
1440 }
1441 }, [submitting]);
1442 const updateItemsProgress = () => {
1443 const elements = document.querySelectorAll('.popup-header__inner');
1444 if (elements.length > 0 && elements[0].querySelectorAll('form.form-button-finish-course').length === 0) {
1445 (0,_single_curriculum_components_items_progress__WEBPACK_IMPORTED_MODULE_4__.getResponse)(elements[0]);
1446 }
1447 };
1448 const animate = () => {
1449 setPercentage(0);
1450 setDone(false);
1451 jQuery.easing._customEasing = function (e, f, a, h, g) {
1452 return h * Math.sqrt(1 - (f = f / g - 1) * f) + a;
1453 };
1454 debounce(() => {
1455 const $el = jQuery('<span />').css({
1456 width: 1,
1457 height: 1
1458 }).appendTo(document.body);
1459 $el.css('left', 0).animate({
1460 left: results.result
1461 }, {
1462 duration: 1500,
1463 step: (now, fx) => {
1464 setPercentage(now);
1465 },
1466 done: () => {
1467 setDone(true);
1468 $el.remove();
1469 jQuery('#quizResultGrade').css({
1470 transform: 'scale(1.3)',
1471 transition: 'all 0.25s'
1472 });
1473 debounce(() => {
1474 jQuery('#quizResultGrade').css({
1475 transform: 'scale(1)'
1476 });
1477 }, 500)();
1478 },
1479 easing: '_customEasing'
1480 });
1481 }, results.result > 0 ? 1000 : 10)();
1482 };
1483
1484 /**
1485 * Render HTML elements.
1486 *
1487 */
1488
1489 let percentResult = percentage;
1490 if (!Number.isInteger(percentage)) {
1491 percentResult = parseFloat(percentage).toFixed(2);
1492 }
1493 const border = 10;
1494 const width = 200;
1495 const radius = width / 2;
1496 const r = (width - border) / 2;
1497 const circumference = r * 2 * Math.PI;
1498 const offset = circumference - percentResult / 100 * circumference;
1499 const styles = {
1500 strokeDasharray: `${circumference} ${circumference}`,
1501 strokeDashoffset: offset
1502 };
1503 const passingGradeValue = parseFloat(results.passingGrade || passingGrade);
1504 let graduation = '';
1505 if (results.graduation) {
1506 graduation = results.graduation;
1507 } else if (percentResult >= passingGradeValue) {
1508 graduation = 'passed';
1509 } else {
1510 graduation = 'failed';
1511 }
1512 let message = '';
1513 if (results.graduationText) {
1514 message = results.graduationText;
1515 } else if (graduation === 'passed') {
1516 message = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Passed', 'learnpress');
1517 } else {
1518 message = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Failed', 'learnpress');
1519 }
1520 const classNames = ['quiz-result', graduation];
1521 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1522 className: classNames.join(' ')
1523 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("h3", {
1524 className: "result-heading"
1525 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Your Result', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1526 id: "quizResultGrade",
1527 className: "result-grade"
1528 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("svg", {
1529 className: "circle-progress-bar",
1530 width: width,
1531 height: width
1532 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("circle", {
1533 className: "circle-progress-bar__circle",
1534 stroke: "",
1535 strokeWidth: border,
1536 style: styles,
1537 fill: "transparent",
1538 r: r,
1539 cx: radius,
1540 cy: radius
1541 })), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
1542 className: "result-achieved"
1543 }, `${percentResult}%`), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", {
1544 className: "result-require"
1545 }, passingGradeValue + '%' || 0)), done && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", {
1546 className: "result-message"
1547 }, message), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {
1548 className: "result-statistic"
1549 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1550 className: "result-statistic-field result-time-spend"
1551 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Time spent', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.timeSpend)), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1552 className: "result-statistic-field result-point"
1553 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Points', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.userMark, " / ", results.mark)), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1554 className: "result-statistic-field result-questions"
1555 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Questions', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.questionCount)), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1556 className: "result-statistic-field result-questions-correct"
1557 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Correct', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.questionCorrect)), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1558 className: "result-statistic-field result-questions-wrong"
1559 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Wrong', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.questionWrong)), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1560 className: "result-statistic-field result-questions-skipped"
1561 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Skipped', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.questionEmpty)), typeof results.minusPoint !== 'undefined' && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
1562 className: "result-statistic-field result-questions-minus"
1563 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_3__.__)('Minus points', 'learnpress')), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, results.minusPoint))));
1564 function timeDifference(earlierDate, laterDate) {
1565 const oDiff = new Object();
1566
1567 // Calculate Differences
1568 // ------------------------------------------------------------------- //
1569 let nTotalDiff = laterDate - earlierDate;
1570 oDiff.days = Math.floor(nTotalDiff / 1000 / 60 / 60 / 24);
1571 nTotalDiff -= oDiff.days * 1000 * 60 * 60 * 24;
1572 oDiff.hours = Math.floor(nTotalDiff / 1000 / 60 / 60);
1573 nTotalDiff -= oDiff.hours * 1000 * 60 * 60;
1574 oDiff.minutes = Math.floor(nTotalDiff / 1000 / 60);
1575 nTotalDiff -= oDiff.minutes * 1000 * 60;
1576 oDiff.seconds = Math.floor(nTotalDiff / 1000);
1577 // ------------------------------------------------------------------- //
1578
1579 // Format Duration
1580 // ------------------------------------------------------------------- //
1581 // Format Hours
1582 let hourtext = '00';
1583 if (oDiff.days > 0) {
1584 hourtext = String(oDiff.days);
1585 }
1586 if (hourtext.length == 1) {
1587 hourtext = '0' + hourtext;
1588 }
1589
1590 // Format Minutes
1591 let mintext = '00';
1592 if (oDiff.minutes > 0) {
1593 mintext = String(oDiff.minutes);
1594 }
1595 if (mintext.length == 1) {
1596 mintext = '0' + mintext;
1597 }
1598
1599 // Format Seconds
1600 let sectext = '00';
1601 if (oDiff.seconds > 0) {
1602 sectext = String(oDiff.seconds);
1603 }
1604 if (sectext.length == 1) {
1605 sectext = '0' + sectext;
1606 }
1607 // Set Duration
1608 const sDuration = hourtext + ':' + mintext + ':' + sectext;
1609 oDiff.duration = sDuration;
1610 // ------------------------------------------------------------------- //
1611
1612 return oDiff;
1613 }
1614 };
1615 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Result);
1616
1617 /***/ },
1618
1619 /***/ "./assets/src/apps/js/frontend/quiz/components/status/index.js"
1620 /*!*********************************************************************!*\
1621 !*** ./assets/src/apps/js/frontend/quiz/components/status/index.js ***!
1622 \*********************************************************************/
1623 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1624
1625 "use strict";
1626 __webpack_require__.r(__webpack_exports__);
1627 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1628 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1629 /* harmony export */ });
1630 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1631 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1632 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1633 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
1634 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
1635 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
1636 /* harmony import */ var _timer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../timer */ "./assets/src/apps/js/frontend/quiz/components/timer/index.js");
1637 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
1638 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__);
1639
1640
1641
1642
1643
1644 const $ = jQuery;
1645 const {
1646 debounce
1647 } = lodash;
1648 const Status = () => {
1649 const {
1650 submitQuiz
1651 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.dispatch)('learnpress/quiz');
1652 (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
1653 const $pc = $('#popup-content');
1654 if (!$pc.length) {
1655 return;
1656 }
1657 const $sc = $pc.find('.content-item-scrollable:eq(1)');
1658 const $qs = $pc.find('.quiz-status');
1659 const pcTop = $qs.offset().top - 92;
1660 let isFixed = false;
1661
1662 /**
1663 * Check when status bar is stopped in the top
1664 * to add new class into html
1665 */
1666 $sc.on('scroll', () => {
1667 if ($sc.scrollTop() >= pcTop) {
1668 if (isFixed) {
1669 return;
1670 }
1671 isFixed = true;
1672 } else {
1673 if (!isFixed) {
1674 return;
1675 }
1676 isFixed = false;
1677 }
1678 if (isFixed) {
1679 $pc.addClass('fixed-quiz-status');
1680 } else {
1681 $pc.removeClass('fixed-quiz-status');
1682 }
1683 });
1684 }, []);
1685
1686 /**
1687 * Submit question to record results.
1688 */
1689 const submit = () => {
1690 const {
1691 confirm
1692 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.select)('learnpress/modal');
1693 if ('no' === confirm((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Are you sure to submit the quiz?', 'learnpress'), submit)) {
1694 return;
1695 }
1696 submitQuiz();
1697 };
1698 const getMark = () => {
1699 const answered = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.select)('learnpress/quiz').getData('answered');
1700 return Object.values(answered).reduce((m, r) => {
1701 return m + r.mark;
1702 }, 0);
1703 };
1704 const {
1705 getData,
1706 getUserMark
1707 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.select)('learnpress/quiz');
1708 const currentPage = getData('currentPage');
1709 const questionsPerPage = getData('questionsPerPage');
1710 const questionsCount = getData('numberQuestionsToDo');
1711 const submitting = getData('submitting');
1712 const duration = getData('duration');
1713 const userMark = getUserMark();
1714 const classNames = ['quiz-status'];
1715 const start = (currentPage - 1) * questionsPerPage + 1;
1716 let end = start + questionsPerPage - 1;
1717 let indexHtml = '';
1718 end = Math.min(end, questionsCount);
1719 if (submitting) {
1720 classNames.push('submitting');
1721 }
1722 if (end < questionsCount) {
1723 if (questionsPerPage > 1) {
1724 indexHtml = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.sprintf)((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Question <span>%d to %d of %d</span>', 'learnpress'), start, end, questionsCount);
1725 } else {
1726 indexHtml = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.sprintf)((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Question <span>%d of %d</span>', 'learnpress'), start, questionsCount);
1727 }
1728 } else {
1729 indexHtml = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.sprintf)((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Question <span>%d of %d</span>', 'learnpress'), start, end);
1730 }
1731 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1732 className: classNames.join(' ')
1733 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1734 className: "questions-index",
1735 dangerouslySetInnerHTML: {
1736 __html: indexHtml
1737 }
1738 }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1739 className: "current-point"
1740 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.sprintf)((0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Earned Point: %s', 'learnpress'), userMark)), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1741 className: "submit-quiz"
1742 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
1743 className: "lp-button",
1744 id: "button-submit-quiz",
1745 onClick: submit
1746 }, !submitting ? (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Finish Quiz', 'learnpress') : (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Submitting…', 'learnpress'))), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_timer__WEBPACK_IMPORTED_MODULE_3__["default"], null))));
1747 };
1748 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Status);
1749
1750 /***/ },
1751
1752 /***/ "./assets/src/apps/js/frontend/quiz/components/timer/index.js"
1753 /*!********************************************************************!*\
1754 !*** ./assets/src/apps/js/frontend/quiz/components/timer/index.js ***!
1755 \********************************************************************/
1756 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1757
1758 "use strict";
1759 __webpack_require__.r(__webpack_exports__);
1760 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1761 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1762 /* harmony export */ });
1763 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1764 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1765 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1766 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
1767 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
1768 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_2__);
1769
1770 /**
1771 * Edit: React hook.
1772 *
1773 * @author Nhamdv - ThimPress
1774 */
1775
1776
1777 const Timer = () => {
1778 const {
1779 getData
1780 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.select)('learnpress/quiz');
1781 const {
1782 submitQuiz
1783 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_2__.dispatch)('learnpress/quiz');
1784 let totalTime = getData('totalTime');
1785 const durationTime = getData('duration');
1786 const timeSpendG = getData('timeSpend');
1787 const [seconds, setSeconds] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useState)(totalTime);
1788 let [timeSpend, setTimeSpend] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useState)(timeSpendG);
1789 (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
1790 const myInterval = setInterval(() => {
1791 if (durationTime > 0) {
1792 let remainSeconds = seconds;
1793 remainSeconds -= 1;
1794 remainSeconds = wp.hooks.applyFilters('js-lp-quiz-remaining_time', remainSeconds, durationTime);
1795 if (remainSeconds > 0) {
1796 setSeconds(remainSeconds);
1797 timeSpend++;
1798 setTimeSpend(durationTime - remainSeconds);
1799 } else {
1800 clearInterval(myInterval);
1801 submitQuiz();
1802 }
1803 } else {
1804 // Apply when set duration = 0
1805 timeSpend++;
1806 setTimeSpend(timeSpend);
1807 setSeconds(timeSpend);
1808 }
1809 }, 1000);
1810 return () => clearInterval(myInterval);
1811 }, [seconds, timeSpend]);
1812 const formatTime = (separator = ':') => {
1813 const t = [];
1814 let m;
1815 if (timeSpendG) {
1816 totalTime = timeSpendG;
1817 }
1818 if (totalTime < 3600) {
1819 t.push((seconds - seconds % 60) / 60);
1820 t.push(seconds % 60);
1821 } else if (totalTime) {
1822 t.push((seconds - seconds % 3600) / 3600);
1823 m = seconds % 3600;
1824 t.push((m - m % 60) / 60);
1825 t.push(m % 60);
1826 }
1827 return t.map(a => {
1828 return a < 10 ? `0${a}` : a;
1829 }).join(separator);
1830 };
1831 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
1832 className: "countdown"
1833 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("i", {
1834 className: "lp-icon-stopwatch"
1835 }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("span", null, formatTime()), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("input", {
1836 type: "hidden",
1837 name: "lp-quiz-time-spend",
1838 value: timeSpend
1839 }));
1840 };
1841 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Timer);
1842
1843 /***/ },
1844
1845 /***/ "./assets/src/apps/js/frontend/quiz/components/title/index.js"
1846 /*!********************************************************************!*\
1847 !*** ./assets/src/apps/js/frontend/quiz/components/title/index.js ***!
1848 \********************************************************************/
1849 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1850
1851 "use strict";
1852 __webpack_require__.r(__webpack_exports__);
1853 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1854 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1855 /* harmony export */ });
1856 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1857 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1858
1859 const Title = () => {
1860 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("h3", null, "The title");
1861 };
1862 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Title);
1863
1864 /***/ },
1865
1866 /***/ "./assets/src/apps/js/frontend/quiz/index.js"
1867 /*!***************************************************!*\
1868 !*** ./assets/src/apps/js/frontend/quiz/index.js ***!
1869 \***************************************************/
1870 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1871
1872 "use strict";
1873 __webpack_require__.r(__webpack_exports__);
1874 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1875 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
1876 /* harmony export */ });
1877 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1878 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1879 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
1880 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_1__);
1881 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/compose */ "@wordpress/compose");
1882 /* harmony import */ var _wordpress_compose__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_compose__WEBPACK_IMPORTED_MODULE_2__);
1883 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
1884 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_3__);
1885 /* harmony import */ var _components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components */ "./assets/src/apps/js/frontend/quiz/components/index.js");
1886 /* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./store */ "./assets/src/apps/js/frontend/quiz/store/index.js");
1887
1888
1889
1890
1891
1892
1893 const {
1894 chunk
1895 } = lodash;
1896 class Quiz extends _wordpress_element__WEBPACK_IMPORTED_MODULE_1__.Component {
1897 constructor(props) {
1898 super(...arguments);
1899 this.state = {
1900 currentPage: 1,
1901 numPages: 0,
1902 pages: []
1903 };
1904 }
1905 componentDidMount() {
1906 const {
1907 settings,
1908 setQuizData
1909 } = this.props;
1910 const {
1911 question_ids,
1912 questions_per_page
1913 } = settings;
1914 const chunks = chunk(question_ids, questions_per_page);
1915 settings.currentPage = 1;
1916 settings.numPages = chunks.length;
1917 settings.pages = chunks;
1918 const answered = settings.id ? localStorage.getItem(`LP_Quiz_${settings.id}_Answered`) : false;
1919 if (answered) {
1920 settings.answered = JSON.parse(answered);
1921 }
1922 setQuizData(settings);
1923 }
1924 componentDidUpdate(prevProps, prevState, snapshot) {
1925 const {
1926 status
1927 } = prevProps;
1928 const elQuizContent = document.querySelector('.quiz-content');
1929 if (status !== undefined && elQuizContent) {
1930 elQuizContent.style.display = 'none';
1931 }
1932 }
1933 startQuiz = event => {
1934 this.props.startQuiz();
1935 };
1936 render() {
1937 const {
1938 status,
1939 isReviewing,
1940 answered
1941 } = this.props;
1942 wp.hooks.doAction('lp-js-quiz-answer', answered, status);
1943 const isA = -1 !== ['', 'completed', 'viewed'].indexOf(status) || !status;
1944 const notStarted = -1 !== ['', 'viewed', undefined].indexOf(status) || !status;
1945
1946 // Just render content if status !== undefined (meant all data loaded)
1947 return undefined !== status && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", null, !isReviewing && 'completed' === status && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components__WEBPACK_IMPORTED_MODULE_4__.Result, null), !isReviewing && notStarted && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components__WEBPACK_IMPORTED_MODULE_4__.Meta, null), 'started' === status && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components__WEBPACK_IMPORTED_MODULE_4__.Status, null), (-1 !== ['completed', 'started'].indexOf(status) || isReviewing) && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components__WEBPACK_IMPORTED_MODULE_4__.Questions, null), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components__WEBPACK_IMPORTED_MODULE_4__.Buttons, null), isA && !isReviewing && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_components__WEBPACK_IMPORTED_MODULE_4__.Attempts, null)));
1948 }
1949 }
1950 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_compose__WEBPACK_IMPORTED_MODULE_2__.compose)([(0,_wordpress_data__WEBPACK_IMPORTED_MODULE_3__.withSelect)(select => {
1951 const {
1952 getQuestions,
1953 getData
1954 } = select('learnpress/quiz');
1955 return {
1956 questions: getQuestions(),
1957 status: getData('status'),
1958 store: getData(),
1959 answered: getData('answered'),
1960 isReviewing: getData('mode') === 'reviewing',
1961 questionIds: getData('questionIds'),
1962 checkCount: getData('instantCheck'),
1963 questionsPerPage: getData('questionsPerPage') || 1
1964 };
1965 }), (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_3__.withDispatch)(dispatch => {
1966 const {
1967 setQuizData,
1968 startQuiz
1969 } = dispatch('learnpress/quiz');
1970 return {
1971 setQuizData,
1972 startQuiz
1973 };
1974 })])(Quiz));
1975
1976 /***/ },
1977
1978 /***/ "./assets/src/apps/js/frontend/quiz/store/actions.js"
1979 /*!***********************************************************!*\
1980 !*** ./assets/src/apps/js/frontend/quiz/store/actions.js ***!
1981 \***********************************************************/
1982 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
1983
1984 "use strict";
1985 __webpack_require__.r(__webpack_exports__);
1986 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1987 /* harmony export */ __requestBeforeStartQuiz: () => (/* binding */ __requestBeforeStartQuiz),
1988 /* harmony export */ __requestCheckAnswerSuccess: () => (/* binding */ __requestCheckAnswerSuccess),
1989 /* harmony export */ __requestShowHintSuccess: () => (/* binding */ __requestShowHintSuccess),
1990 /* harmony export */ __requestStartQuizSuccess: () => (/* binding */ __requestStartQuizSuccess),
1991 /* harmony export */ __requestSubmitQuiz: () => (/* binding */ __requestSubmitQuiz),
1992 /* harmony export */ __requestSubmitQuizSuccess: () => (/* binding */ __requestSubmitQuizSuccess),
1993 /* harmony export */ checkAnswer: () => (/* binding */ checkAnswer),
1994 /* harmony export */ markQuestionRendered: () => (/* binding */ markQuestionRendered),
1995 /* harmony export */ sendKey: () => (/* binding */ sendKey),
1996 /* harmony export */ setCurrentPage: () => (/* binding */ setCurrentPage),
1997 /* harmony export */ setCurrentQuestion: () => (/* binding */ setCurrentQuestion),
1998 /* harmony export */ setQuizData: () => (/* binding */ setQuizData),
1999 /* harmony export */ setQuizMode: () => (/* binding */ setQuizMode),
2000 /* harmony export */ showHint: () => (/* binding */ showHint),
2001 /* harmony export */ startQuiz: () => (/* binding */ startQuiz),
2002 /* harmony export */ submitQuiz: () => (/* binding */ submitQuiz),
2003 /* harmony export */ updateUserQuestionAnswers: () => (/* binding */ updateUserQuestionAnswers),
2004 /* harmony export */ updateUserQuestionFibAnswers: () => (/* binding */ updateUserQuestionFibAnswers)
2005 /* harmony export */ });
2006 /* harmony import */ var _learnpress_data_controls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @learnpress/data-controls */ "@learnpress/data-controls");
2007 /* harmony import */ var _learnpress_data_controls__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_learnpress_data_controls__WEBPACK_IMPORTED_MODULE_0__);
2008 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
2009 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_1__);
2010
2011
2012 function _dispatch() {
2013 const args = [].slice.call(arguments, 2);
2014 const d = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.dispatch)(arguments[0]);
2015 const f = arguments[1];
2016 d[f](...args);
2017 }
2018 const {
2019 camelCaseDashObjectKeys,
2020 Hook
2021 } = LP;
2022 /**
2023 * Set user data for app.
2024 *
2025 * @param key
2026 * @param data
2027 */
2028 function setQuizData(key, data) {
2029 if (typeof key === 'string') {
2030 data = {
2031 [key]: data
2032 };
2033 } else {
2034 data = key;
2035 }
2036 return {
2037 type: 'SET_QUIZ_DATA',
2038 data: camelCaseDashObjectKeys(data)
2039 };
2040 }
2041
2042 /**
2043 * Set question will display.
2044 *
2045 * @param questionId
2046 */
2047 function setCurrentQuestion(questionId) {
2048 return {
2049 type: 'SET_CURRENT_QUESTION',
2050 questionId
2051 };
2052 }
2053 function setCurrentPage(currentPage) {
2054 return {
2055 type: 'SET_CURRENT_PAGE',
2056 currentPage
2057 };
2058 }
2059 function __requestBeforeStartQuiz(quizId, courseId, userId) {
2060 return {
2061 type: 'BEFORE_START_QUIZ'
2062 };
2063 }
2064 function __requestStartQuizSuccess(results, quizId, courseId, userId) {
2065 Hook.doAction('quiz-started', results, quizId, courseId, userId);
2066 return {
2067 type: 'START_QUIZ_SUCCESS',
2068 quizId,
2069 courseId,
2070 userId,
2071 results
2072 };
2073 }
2074
2075 /**
2076 * Request to api for starting a quiz.
2077 */
2078 const startQuiz = function* () {
2079 const {
2080 itemId,
2081 courseId
2082 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.select)('learnpress/quiz').getDefaultRestArgs();
2083 const doStart = Hook.applyFilters('before-start-quiz', true, itemId, courseId);
2084 if (true !== doStart) {
2085 return;
2086 }
2087 let response = yield (0,_learnpress_data_controls__WEBPACK_IMPORTED_MODULE_0__.apiFetch)({
2088 path: 'lp/v1/users/start-quiz',
2089 method: 'POST',
2090 data: {
2091 item_id: itemId,
2092 course_id: courseId
2093 }
2094 });
2095 const btnStart = document.querySelector('.lp-button.start');
2096 if (response.status !== 'error') {
2097 response = Hook.applyFilters('request-start-quiz-response', response, itemId, courseId);
2098 const {
2099 results
2100 } = response;
2101 const {
2102 duration,
2103 status,
2104 question_ids,
2105 questions
2106 } = results;
2107
2108 // No require enroll
2109 if (lpQuizSettings.checkNorequizenroll === 1) {
2110 const keyQuizOff = 'quiz_off_' + lpQuizSettings.id;
2111 window.localStorage.removeItem(keyQuizOff);
2112 const quizDataOff = {
2113 endTime: Date.now() + duration * 1000,
2114 status,
2115 question_ids,
2116 questions
2117 };
2118 window.localStorage.setItem(keyQuizOff, JSON.stringify(quizDataOff));
2119
2120 // Set Retake quiz
2121 const keyQuizOffRetaken = 'quiz_off_retaken_' + lpQuizSettings.id;
2122 let quizOffRetaken = window.localStorage.getItem(keyQuizOffRetaken);
2123 if (null === quizOffRetaken) {
2124 quizOffRetaken = 0;
2125 } else {
2126 quizOffRetaken++;
2127 }
2128 window.localStorage.setItem(keyQuizOffRetaken, quizOffRetaken);
2129 // End
2130 }
2131
2132 // Reload when start/retake quiz
2133 window.localStorage.removeItem('LP');
2134 window.location.href = response.redirect_url;
2135 //window.location.reload();
2136
2137 //yield _dispatch( 'learnpress/quiz', '__requestStartQuizSuccess', camelCaseDashObjectKeys( response ), itemId, courseId );
2138 } else {
2139 const elButtons = document.querySelector('.quiz-buttons');
2140 const message = `<div class="learn-press-message error">${response.message}</div>`;
2141 elButtons.insertAdjacentHTML('afterend', message);
2142 btnStart.classList.remove('loading');
2143 }
2144 };
2145
2146 function __requestSubmitQuiz() {
2147 return {
2148 type: 'SUBMIT_QUIZ'
2149 };
2150 }
2151 function __requestSubmitQuizSuccess(results, quizId, courseId) {
2152 Hook.doAction('quiz-submitted', results, quizId, courseId);
2153 return {
2154 type: 'SUBMIT_QUIZ_SUCCESS',
2155 results
2156 };
2157 }
2158 function* submitQuiz() {
2159 const {
2160 getDefaultRestArgs,
2161 getQuestionsSelectedAnswers
2162 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.select)('learnpress/quiz');
2163 const {
2164 itemId,
2165 courseId
2166 } = getDefaultRestArgs();
2167 const doSubmit = Hook.applyFilters('before-submit-quiz', true);
2168 if (true !== doSubmit) {
2169 return;
2170 }
2171 const answered = getQuestionsSelectedAnswers();
2172 if (lpQuizSettings.checkNorequizenroll === 1) {
2173 const keyQuizOff = `quiz_off_${lpQuizSettings.id}`;
2174 const quizDataOffStr = window.localStorage.getItem(keyQuizOff);
2175 const quizDataOff = JSON.parse(quizDataOffStr);
2176 const keyAnswer = `LP_Quiz_${itemId}_Answered`;
2177 const answerDataStr = localStorage.getItem(keyAnswer);
2178 if (null !== answerDataStr) {
2179 const data = JSON.parse(answerDataStr);
2180 for (const [k, v] of Object.entries(data)) {
2181 answered[k] = v.answered;
2182 }
2183 }
2184
2185 // Added questions not answered
2186 quizDataOff.question_ids.forEach(question_id => {
2187 if (!answered[question_id]) {
2188 answered[question_id] = '';
2189 }
2190 });
2191 }
2192
2193 // Get time spend did quiz - tungnx
2194 let timeSpend = 0;
2195 const elTimeSpend = document.querySelector('input[name=lp-quiz-time-spend]');
2196 if (elTimeSpend) {
2197 timeSpend = elTimeSpend.value;
2198 }
2199 // End
2200
2201 let response = yield (0,_learnpress_data_controls__WEBPACK_IMPORTED_MODULE_0__.apiFetch)({
2202 path: 'lp/v1/users/submit-quiz',
2203 method: 'POST',
2204 data: {
2205 item_id: itemId,
2206 course_id: courseId,
2207 answered,
2208 time_spend: timeSpend
2209 }
2210 });
2211 response = Hook.applyFilters('request-submit-quiz-response', response, itemId, courseId);
2212 if (response.status === 'success') {
2213 if (lpQuizSettings.checkNorequizenroll === 1) {
2214 const keyQuizOff = 'quiz_off_' + lpQuizSettings.id;
2215 const quizDataOffStr = window.localStorage.getItem(keyQuizOff);
2216 if (null !== quizDataOffStr) {
2217 const quizDataOff = JSON.parse(quizDataOffStr);
2218 quizDataOff.status = response.results.status;
2219 quizDataOff.results = response.results.results;
2220 window.localStorage.setItem(keyQuizOff, JSON.stringify(quizDataOff));
2221 window.localStorage.removeItem('LP_Quiz_' + lpQuizSettings.id + '_Answered');
2222 }
2223 }
2224 yield _dispatch('learnpress/quiz', '__requestSubmitQuizSuccess', camelCaseDashObjectKeys(response.results), itemId, courseId);
2225 }
2226 }
2227 function updateUserQuestionAnswers(questionId, answers, quizId, courseId = 0, userId = 0) {
2228 return {
2229 type: 'UPDATE_USER_QUESTION_ANSWERS',
2230 questionId,
2231 answers
2232 };
2233 }
2234
2235 /**
2236 * Handle when user change value on input fill in blanks.
2237 *
2238 * @param questionId
2239 * @param idInput
2240 * @param valueInput
2241 * @param quizId
2242 * @param courseId
2243 * @param userId
2244 * @since 4.2.5.9
2245 * @version 1.0.0
2246 */
2247 function updateUserQuestionFibAnswers(questionId, idInput, valueInput, quizId, courseId = 0, userId = 0) {
2248 return {
2249 type: 'UPDATE_USER_QUESTION_FIB_ANSWERS',
2250 questionId,
2251 idInput,
2252 valueInput
2253 };
2254 }
2255 function __requestShowHintSuccess(id, showHint) {
2256 return {
2257 type: 'SET_QUESTION_HINT',
2258 questionId: id,
2259 showHint
2260 };
2261 }
2262 function* showHint(id, showHint) {
2263 yield _dispatch('learnpress/quiz', '__requestShowHintSuccess', id, showHint);
2264 }
2265 function __requestCheckAnswerSuccess(id, result) {
2266 return {
2267 type: 'CHECK_ANSWER',
2268 questionId: id,
2269 ...result
2270 };
2271 }
2272 function* checkAnswer(id) {
2273 const {
2274 getDefaultRestArgs,
2275 getQuestionAnswered
2276 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_1__.select)('learnpress/quiz');
2277 const {
2278 itemId,
2279 courseId
2280 } = getDefaultRestArgs();
2281 const result = yield (0,_learnpress_data_controls__WEBPACK_IMPORTED_MODULE_0__.apiFetch)({
2282 path: 'lp/v1/users/check-answer',
2283 method: 'POST',
2284 data: {
2285 item_id: itemId,
2286 course_id: courseId,
2287 question_id: id,
2288 answered: getQuestionAnswered(id) || ''
2289 }
2290 });
2291 if (result.status === 'success') {
2292 // No require enroll
2293 if (lpQuizSettings.checkNorequizenroll === 1) {
2294 const keyQuizOff = 'quiz_off_' + lpQuizSettings.id;
2295 const quizDataOffStr = window.localStorage.getItem(keyQuizOff);
2296 if (null !== quizDataOffStr) {
2297 const quizDataOff = JSON.parse(quizDataOffStr);
2298 const questionOptions = result.options;
2299 if (undefined === quizDataOff.checked_questions) {
2300 quizDataOff.checked_questions = [];
2301 quizDataOff.checked_questions.push(id);
2302 } else if (-1 === quizDataOff.checked_questions.indexOf(id)) {
2303 quizDataOff.checked_questions.push(id);
2304 }
2305 if (undefined === quizDataOff.question_options) {
2306 quizDataOff.question_options = {};
2307 quizDataOff.question_options[id] = questionOptions;
2308 } else if (undefined === quizDataOff.question_options[id]) {
2309 quizDataOff.question_options[id] = questionOptions;
2310 }
2311 window.localStorage.setItem(keyQuizOff, JSON.stringify(quizDataOff));
2312
2313 //console.log( quizDataOff );
2314 }
2315 }
2316 yield _dispatch('learnpress/quiz', '__requestCheckAnswerSuccess', id, camelCaseDashObjectKeys(result));
2317 }
2318 }
2319 function markQuestionRendered(questionId) {
2320 return {
2321 type: 'MARK_QUESTION_RENDERED',
2322 questionId
2323 };
2324 }
2325 function setQuizMode(mode) {
2326 return {
2327 type: 'SET_QUIZ_MODE',
2328 mode
2329 };
2330 }
2331 function sendKey(keyPressed) {
2332 setTimeout(() => {
2333 _dispatch('learnpress/quiz', 'sendKey', '');
2334 }, 300);
2335 return {
2336 type: 'SEND_KEY',
2337 keyPressed
2338 };
2339 }
2340
2341 /***/ },
2342
2343 /***/ "./assets/src/apps/js/frontend/quiz/store/index.js"
2344 /*!*********************************************************!*\
2345 !*** ./assets/src/apps/js/frontend/quiz/store/index.js ***!
2346 \*********************************************************/
2347 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2348
2349 "use strict";
2350 __webpack_require__.r(__webpack_exports__);
2351 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2352 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2353 /* harmony export */ });
2354 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
2355 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_0__);
2356 /* harmony import */ var _reducer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./reducer */ "./assets/src/apps/js/frontend/quiz/store/reducer.js");
2357 /* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actions */ "./assets/src/apps/js/frontend/quiz/store/actions.js");
2358 /* harmony import */ var _selectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./selectors */ "./assets/src/apps/js/frontend/quiz/store/selectors.js");
2359 /* harmony import */ var _middlewares__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./middlewares */ "./assets/src/apps/js/frontend/quiz/store/middlewares.js");
2360
2361
2362
2363
2364
2365 const {
2366 controls: dataControls
2367 } = LP.dataControls;
2368 const store = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.registerStore)('learnpress/quiz', {
2369 reducer: _reducer__WEBPACK_IMPORTED_MODULE_1__["default"],
2370 selectors: _selectors__WEBPACK_IMPORTED_MODULE_3__,
2371 actions: _actions__WEBPACK_IMPORTED_MODULE_2__,
2372 controls: {
2373 ...dataControls
2374 }
2375 });
2376 (0,_middlewares__WEBPACK_IMPORTED_MODULE_4__["default"])(store);
2377 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (store);
2378
2379 /***/ },
2380
2381 /***/ "./assets/src/apps/js/frontend/quiz/store/middlewares.js"
2382 /*!***************************************************************!*\
2383 !*** ./assets/src/apps/js/frontend/quiz/store/middlewares.js ***!
2384 \***************************************************************/
2385 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2386
2387 "use strict";
2388 __webpack_require__.r(__webpack_exports__);
2389 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2390 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2391 /* harmony export */ });
2392 /* harmony import */ var refx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! refx */ "./node_modules/refx/refx.js");
2393 /* harmony import */ var refx__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(refx__WEBPACK_IMPORTED_MODULE_0__);
2394 /**
2395 * External dependencies
2396 */
2397
2398
2399 /**
2400 * Internal dependencies
2401 */
2402 //import effects from './effects';
2403
2404 const effects = {
2405 ENROLL_COURSE_X: (action, store) => {
2406 enrollCourse: (action, store) => {
2407 const {
2408 dispatch
2409 } = store;
2410
2411 //dispatch()
2412 };
2413 }
2414 };
2415
2416 /**
2417 * Applies the custom middlewares used specifically in the editor module.
2418 *
2419 * @param {Object} store Store Object.
2420 *
2421 * @return {Object} Update Store Object.
2422 */
2423 function applyMiddlewares(store) {
2424 let enhancedDispatch = () => {
2425 throw new Error('Dispatching while constructing your middleware is not allowed. ' + 'Other middleware would not be applied to this dispatch.');
2426 };
2427 const middlewareAPI = {
2428 getState: store.getState,
2429 dispatch: (...args) => enhancedDispatch(...args)
2430 };
2431 enhancedDispatch = refx__WEBPACK_IMPORTED_MODULE_0___default()(effects)(middlewareAPI)(store.dispatch);
2432 store.dispatch = enhancedDispatch;
2433 return store;
2434 }
2435 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (applyMiddlewares);
2436
2437 /***/ },
2438
2439 /***/ "./assets/src/apps/js/frontend/quiz/store/reducer.js"
2440 /*!***********************************************************!*\
2441 !*** ./assets/src/apps/js/frontend/quiz/store/reducer.js ***!
2442 \***********************************************************/
2443 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2444
2445 "use strict";
2446 __webpack_require__.r(__webpack_exports__);
2447 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2448 /* harmony export */ blocks: () => (/* binding */ blocks),
2449 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
2450 /* harmony export */ setItemStatus: () => (/* binding */ setItemStatus),
2451 /* harmony export */ userQuiz: () => (/* binding */ userQuiz)
2452 /* harmony export */ });
2453 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
2454 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_0__);
2455
2456 const {
2457 omit,
2458 flow,
2459 isArray,
2460 chunk
2461 } = lodash;
2462 const {
2463 camelCaseDashObjectKeys
2464 } = LP;
2465 const {
2466 get: storageGet,
2467 set: storageSet
2468 } = LP.localStorage;
2469 const STORE_DATA = {};
2470 const setItemStatus = (item, status) => {
2471 const userSettings = {
2472 ...item.userSettings,
2473 status
2474 };
2475 return {
2476 ...item,
2477 userSettings
2478 };
2479 };
2480 const updateUserQuestionAnswer = (state, action) => {
2481 const {
2482 answered,
2483 id
2484 } = state;
2485 const newAnswer = {
2486 ...(answered[action.questionId] || {}),
2487 answered: action.answers,
2488 temp: true
2489 };
2490 if (id) {
2491 localStorage.setItem(`LP_Quiz_${id}_Answered`, JSON.stringify({
2492 ...state.answered,
2493 [action.questionId]: newAnswer
2494 }));
2495 }
2496 return {
2497 ...state,
2498 answered: {
2499 ...state.answered,
2500 [action.questionId]: newAnswer
2501 }
2502 };
2503 };
2504 const updateUserQuestionFibAnswer = (state, action) => {
2505 const {
2506 id
2507 } = state;
2508 const {
2509 questionId,
2510 idInput,
2511 valueInput
2512 } = action;
2513 if (state.answered.hasOwnProperty(questionId)) {
2514 state.answered[questionId].answered[idInput] = valueInput;
2515 } else {
2516 state.answered[action.questionId] = {
2517 answered: {
2518 [idInput]: valueInput
2519 },
2520 temp: true
2521 };
2522 }
2523 localStorage.setItem(`LP_Quiz_${id}_Answered`, JSON.stringify(state.answered));
2524 return state;
2525 };
2526 const markQuestionRendered = (state, action) => {
2527 const {
2528 questionsRendered
2529 } = state;
2530 if (isArray(questionsRendered)) {
2531 questionsRendered.push(action.questionId);
2532 return {
2533 ...state,
2534 questionsRendered: [...questionsRendered]
2535 };
2536 }
2537 return {
2538 ...state,
2539 questionsRendered: [action.questionId]
2540 };
2541 };
2542 const resetCurrentPage = (state, args) => {
2543 if (args.currentPage) {
2544 storageSet(`Q${state.id}.currentPage`, args.currentPage);
2545 }
2546 return {
2547 ...state,
2548 ...args
2549 };
2550 };
2551 const setQuestionHint = (state, action) => {
2552 const questions = state.questions.map(question => {
2553 return question.id == action.questionId ? {
2554 ...question,
2555 showHint: action.showHint
2556 } : question;
2557 });
2558 return {
2559 ...state,
2560 questions: [...questions]
2561 };
2562 };
2563 const checkAnswer = (state, action) => {
2564 const questions = state.questions.map(question => {
2565 if (question.id !== action.questionId) {
2566 return question;
2567 }
2568 const newArgs = {
2569 explanation: action.explanation
2570 };
2571 if (action.options) {
2572 newArgs.options = action.options;
2573 }
2574 return {
2575 ...question,
2576 ...newArgs
2577 };
2578 });
2579 const answered = {
2580 ...state.answered,
2581 [action.questionId]: action.result
2582 };
2583 let newAnswered = localStorage.getItem(`LP_Quiz_${state.id}_Answered`);
2584 if (newAnswered) {
2585 newAnswered = {
2586 ...JSON.parse(newAnswered),
2587 ...answered
2588 };
2589 localStorage.setItem(`LP_Quiz_${state.id}_Answered`, JSON.stringify(newAnswered));
2590 }
2591 return {
2592 ...state,
2593 questions: [...questions],
2594 answered,
2595 checkedQuestions: [...state.checkedQuestions, action.questionId]
2596 };
2597 };
2598 const submitQuiz = (state, action) => {
2599 localStorage.removeItem(`LP_Quiz_${state.id}_Answered`);
2600 const questions = state.questions.map(question => {
2601 const newArgs = {};
2602 if (state.reviewQuestions) {
2603 if (action.results.questions[question.id]?.explanation) {
2604 newArgs.explanation = action.results.questions[question.id].explanation;
2605 }
2606 if (action.results.questions[question.id]?.options) {
2607 newArgs.options = action.results.questions[question.id].options;
2608 }
2609 }
2610 return {
2611 ...question,
2612 ...newArgs
2613 };
2614 });
2615 return resetCurrentPage(state, {
2616 submitting: false,
2617 currentPage: 1,
2618 ...action.results,
2619 questions: [...questions]
2620 });
2621 };
2622 const startQuizz = (state, action) => {
2623 const successResponse = action.results.success !== undefined ? action.results.success : false;
2624 const messageResponse = action.results.message || false;
2625 const chunks = chunk(action.results.results.questionIds, state.questionsPerPage);
2626 state.numPages = chunks.length;
2627 return resetCurrentPage(state, {
2628 checkedQuestions: [],
2629 hintedQuestions: [],
2630 mode: '',
2631 currentPage: 1,
2632 ...action.results.results,
2633 successResponse,
2634 messageResponse
2635 });
2636 };
2637 const userQuiz = (state = STORE_DATA, action) => {
2638 switch (action.type) {
2639 case 'SET_QUIZ_DATA':
2640 if (1 > action.data.questionsPerPage) {
2641 action.data.questionsPerPage = 1;
2642 }
2643 const chunks = chunk(state.questionIds || action.data.questionIds, action.data.questionsPerPage);
2644 action.data.numPages = chunks.length;
2645 action.data.pages = chunks;
2646 return {
2647 ...state,
2648 ...action.data,
2649 currentPage: storageGet(`Q${action.data.id}.currentPage`) || action.data.currentPage
2650 };
2651 case 'SUBMIT_QUIZ':
2652 return {
2653 ...state,
2654 submitting: true
2655 };
2656 case 'START_QUIZ':
2657 case 'START_QUIZ_SUCCESS':
2658 return startQuizz(state, action);
2659 case 'SET_CURRENT_QUESTION':
2660 storageSet(`Q${state.id}.currentQuestion`, action.questionId);
2661 return {
2662 ...state,
2663 currentQuestion: action.questionId
2664 };
2665 case 'SET_CURRENT_PAGE':
2666 storageSet(`Q${state.id}.currentPage`, action.currentPage);
2667 return {
2668 ...state,
2669 currentPage: action.currentPage
2670 };
2671 case 'SUBMIT_QUIZ_SUCCESS':
2672 return submitQuiz(state, action);
2673 case 'UPDATE_USER_QUESTION_ANSWERS':
2674 return state.status === 'started' ? updateUserQuestionAnswer(state, action) : state;
2675 case 'UPDATE_USER_QUESTION_FIB_ANSWERS':
2676 return state.status === 'started' ? updateUserQuestionFibAnswer(state, action) : state;
2677 case 'MARK_QUESTION_RENDERED':
2678 return markQuestionRendered(state, action);
2679 case 'SET_QUIZ_MODE':
2680 if (action.mode == 'reviewing') {
2681 return resetCurrentPage(state, {
2682 mode: action.mode
2683 });
2684 }
2685 return {
2686 ...state,
2687 mode: action.mode
2688 };
2689 case 'SET_QUESTION_HINT':
2690 return setQuestionHint(state, action);
2691 case 'CHECK_ANSWER':
2692 return checkAnswer(state, action);
2693 case 'SEND_KEY':
2694 return {
2695 ...state,
2696 keyPressed: action.keyPressed
2697 };
2698 }
2699 return state;
2700 };
2701 const blocks = flow(_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.combineReducers, reducer => (state, action) => {
2702 return reducer(state, action);
2703 }, reducer => (state, action) => {
2704 return reducer(state, action);
2705 }, reducer => (state, action) => {
2706 return reducer(state, action);
2707 })({
2708 a(state = {
2709 a: 1
2710 }, action) {
2711 return state;
2712 },
2713 b(state = {
2714 b: 2
2715 }, action) {
2716 return state;
2717 }
2718 });
2719 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.combineReducers)({
2720 blocks,
2721 userQuiz
2722 }));
2723
2724 /***/ },
2725
2726 /***/ "./assets/src/apps/js/frontend/quiz/store/selectors.js"
2727 /*!*************************************************************!*\
2728 !*** ./assets/src/apps/js/frontend/quiz/store/selectors.js ***!
2729 \*************************************************************/
2730 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2731
2732 "use strict";
2733 __webpack_require__.r(__webpack_exports__);
2734 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2735 /* harmony export */ getCurrentQuestion: () => (/* binding */ getCurrentQuestion),
2736 /* harmony export */ getData: () => (/* binding */ getData),
2737 /* harmony export */ getDefaultRestArgs: () => (/* binding */ getDefaultRestArgs),
2738 /* harmony export */ getItemStatus: () => (/* binding */ getItemStatus),
2739 /* harmony export */ getProp: () => (/* binding */ getProp),
2740 /* harmony export */ getQuestion: () => (/* binding */ getQuestion),
2741 /* harmony export */ getQuestionAnswered: () => (/* binding */ getQuestionAnswered),
2742 /* harmony export */ getQuestionMark: () => (/* binding */ getQuestionMark),
2743 /* harmony export */ getQuestionOptions: () => (/* binding */ getQuestionOptions),
2744 /* harmony export */ getQuestions: () => (/* binding */ getQuestions),
2745 /* harmony export */ getQuestionsSelectedAnswers: () => (/* binding */ getQuestionsSelectedAnswers),
2746 /* harmony export */ getQuizAnswered: () => (/* binding */ getQuizAnswered),
2747 /* harmony export */ getQuizAttempts: () => (/* binding */ getQuizAttempts),
2748 /* harmony export */ getUserMark: () => (/* binding */ getUserMark),
2749 /* harmony export */ isCheckedAnswer: () => (/* binding */ isCheckedAnswer),
2750 /* harmony export */ isCorrect: () => (/* binding */ isCorrect)
2751 /* harmony export */ });
2752 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
2753 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_0__);
2754
2755 const {
2756 get,
2757 isArray
2758 } = lodash;
2759 const getQuestionOptions = function getQuestionOptions(state, id) {
2760 console.time('parseOptions');
2761 const question = getQuestion(state, id);
2762 let options = question.options;
2763 options = !isArray(options) ? JSON.parse(CryptoJS.AES.decrypt(options.data, options.key, {
2764 format: CryptoJSAesJson
2765 }).toString(CryptoJS.enc.Utf8)) : options;
2766 options = !isArray(options) ? JSON.parse(options) : options;
2767 console.timeEnd('parseOptions');
2768 return options;
2769 };
2770
2771
2772 /**
2773 * Get current status of an item in course.
2774 *
2775 * @param state
2776 * @param itemId
2777 */
2778 function getItemStatus(state, itemId) {
2779 const item = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.select)('course-learner/user').getItemById(itemId);
2780 return item ? get(item, 'userSettings.status') : '';
2781 }
2782 function getProp(state, prop, defaultValue) {
2783 return state[prop] || defaultValue;
2784 }
2785
2786 /**
2787 * Get quiz attempted.
2788 *
2789 * @param state
2790 * @param itemId
2791 * @return {Array}
2792 */
2793 function getQuizAttempts(state, itemId) {
2794 const item = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.select)('course-learner/user').getItemById(itemId);
2795 return item ? get(item, 'userSettings.attempts') : [];
2796 }
2797
2798 /**
2799 * Get answers for a quiz user has did.
2800 *
2801 * @param state
2802 * @param itemId
2803 * @return {{}}
2804 */
2805 function getQuizAnswered(state, itemId) {
2806 const item = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.select)('course-learner/user').getItemById(itemId);
2807 return item ? get(item, 'userSettings.answered', {}) : {};
2808 }
2809
2810 /**
2811 * Get all questions in quiz.
2812 *
2813 * @param state
2814 * @return {*}
2815 */
2816 function getQuestions(state) {
2817 const {
2818 userQuiz
2819 } = state;
2820 const questions = get(userQuiz, 'questions');
2821 return questions ? Object.values(questions) : [];
2822 }
2823
2824 /**
2825 * Get property of store data.
2826 *
2827 * @param state - Store data
2828 * @param prop - Optional. NULL will return all data.
2829 * @return {*}
2830 */
2831 function getData(state, prop) {
2832 const {
2833 userQuiz
2834 } = state;
2835 if (prop) {
2836 return get(userQuiz, prop);
2837 }
2838 return userQuiz;
2839 }
2840 function getDefaultRestArgs(state) {
2841 const {
2842 userQuiz
2843 } = state;
2844 return {
2845 itemId: userQuiz.id,
2846 courseId: userQuiz.courseId
2847 };
2848 }
2849 function getQuestionAnswered(state, id) {
2850 const {
2851 userQuiz
2852 } = state;
2853 return get(userQuiz, `answered.${id}.answered`) || undefined;
2854 }
2855 function getQuestionMark(state, id) {
2856 const {
2857 userQuiz
2858 } = state;
2859 return get(userQuiz, `answered.${id}.mark`) || undefined;
2860 }
2861
2862 /**
2863 * Get current question is doing.
2864 *
2865 * @param {Object} state
2866 * @param {string} ret
2867 * @return {*}
2868 */
2869 function getCurrentQuestion(state, ret = '') {
2870 const questionsPerPage = get(state, 'userQuiz.questionsPerPage') || 1;
2871 if (questionsPerPage > 1) {
2872 return false;
2873 }
2874 const currentPage = get(state, 'userQuiz.currentPage') || 1;
2875 return ret === 'object' ? get(state, `userQuiz.questions[${currentPage - 1}]`) : get(state, `userQuiz.questionIds[${currentPage - 1}]`);
2876 }
2877
2878 /**
2879 * Return a question contains fully data with title, content, ...
2880 *
2881 * @param state
2882 * @param theId
2883 */
2884 const getQuestion = function getQuestion(state, theId) {
2885 const {
2886 userQuiz
2887 } = state;
2888 const s = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_0__.select)('learnpress/quiz');
2889 const questions = s.getQuestions();
2890 return questions.find(q => {
2891 return q.id == theId;
2892 });
2893 };
2894
2895
2896 /**
2897 * If user has used 'Instant check' for a question.
2898 *
2899 * @param {Object} state - Global state for app.
2900 * @param {number} id
2901 * @return {boolean}
2902 */
2903 function isCheckedAnswer(state, id) {
2904 const checkedQuestions = get(state, 'userQuiz.checkedQuestions') || [];
2905 return checkedQuestions.indexOf(id) !== -1;
2906 }
2907 function isCorrect(state, id) {}
2908
2909 /**
2910 * Get questions user has selected answers.
2911 *
2912 * @param {Object} state. Global app state
2913 * @param state
2914 * @param {number} questionId
2915 * @return {{}}
2916 */
2917 const getQuestionsSelectedAnswers = function (state, questionId) {
2918 const data = get(state, 'userQuiz.answered');
2919 const returnData = {};
2920 for (const loopId in data) {
2921 if (!data.hasOwnProperty(loopId)) {
2922 continue;
2923 }
2924
2925 // Answer filled by user
2926 if (data[loopId].temp || data[loopId].blanks) {
2927 // If specific a question then return it only.
2928 if (questionId && loopId === questionId) {
2929 return data[loopId].answered;
2930 }
2931 returnData[loopId] = data[loopId].answered;
2932 }
2933 }
2934 return returnData;
2935 };
2936
2937
2938 /**
2939 * Get mark user earned.
2940 * Just for questions user has used 'Instant check' button.
2941 *
2942 * @param state
2943 * @return {number}
2944 */
2945 function getUserMark(state) {
2946 const userQuiz = state.userQuiz || {};
2947 const {
2948 answered,
2949 negativeMarking,
2950 questions,
2951 checkedQuestions
2952 } = userQuiz;
2953 let totalMark = 0;
2954 for (let id in answered) {
2955 if (!answered.hasOwnProperty(id)) {
2956 continue;
2957 }
2958 id = parseInt(id);
2959 const data = answered[id];
2960 const questionMark = data.questionMark ? data.questionMark : function () {
2961 const question = questions.find(q => {
2962 return q.id === id;
2963 });
2964 return question ? question.point : 0;
2965 }();
2966 const isChecked = checkedQuestions.indexOf(id) !== -1;
2967 if (data.temp) {
2968 continue;
2969 }
2970 if (negativeMarking) {
2971 if (data.answered) {
2972 totalMark = data.correct ? totalMark + data.mark : totalMark - questionMark;
2973 }
2974 } else if (data.answered && data.correct) {
2975 totalMark += data.mark;
2976 }
2977 }
2978 return totalMark > 0 ? totalMark : 0;
2979 }
2980
2981 /***/ },
2982
2983 /***/ "./assets/src/apps/js/frontend/show-lp-overlay-complete-item.js"
2984 /*!**********************************************************************!*\
2985 !*** ./assets/src/apps/js/frontend/show-lp-overlay-complete-item.js ***!
2986 \**********************************************************************/
2987 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
2988
2989 "use strict";
2990 __webpack_require__.r(__webpack_exports__);
2991 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2992 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2993 /* harmony export */ });
2994 /* harmony import */ var _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/lp-modal-overlay */ "./assets/src/apps/js/utils/lp-modal-overlay.js");
2995
2996 const lpModalOverlayCompleteItem = {
2997 elBtnFinishCourse: null,
2998 elBtnCompleteItem: null,
2999 init() {
3000 if (!_utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].init()) {
3001 return;
3002 }
3003 if (undefined === lpGlobalSettings || 'yes' !== lpGlobalSettings.option_enable_popup_confirm_finish) {
3004 return;
3005 }
3006 this.elBtnFinishCourse = document.querySelectorAll('.lp-btn-finish-course');
3007 this.elBtnCompleteItem = document.querySelector('.lp-btn-complete-item');
3008 if (this.elBtnCompleteItem) {
3009 this.elBtnCompleteItem.addEventListener('click', e => {
3010 e.preventDefault();
3011 const form = e.target.closest('form');
3012 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].elLPOverlay.show();
3013 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setTitleModal(form.dataset.title);
3014 // ESC html
3015 const div = document.createElement('div');
3016 div.appendChild(document.createTextNode(form.dataset.confirm));
3017 const contentModal = div.innerHTML;
3018 // End ESC html
3019 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setContentModal('<div class="pd-2em">' + contentModal + '</div>');
3020 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].callBackYes = () => {
3021 form.submit();
3022 };
3023 });
3024 }
3025 if (this.elBtnFinishCourse) {
3026 this.elBtnFinishCourse.forEach(element => element.addEventListener('click', e => {
3027 e.preventDefault();
3028 const form = e.target.closest('form');
3029 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].elLPOverlay.show();
3030 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setTitleModal(form.dataset.title);
3031 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].setContentModal('<div class="pd-2em">' + form.dataset.confirm + '</div>');
3032 _utils_lp_modal_overlay__WEBPACK_IMPORTED_MODULE_0__["default"].callBackYes = () => {
3033 form.submit();
3034 };
3035 }));
3036 }
3037 }
3038 };
3039 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (lpModalOverlayCompleteItem);
3040
3041 /***/ },
3042
3043 /***/ "./assets/src/apps/js/frontend/single-curriculum/components/compatible.js"
3044 /*!********************************************************************************!*\
3045 !*** ./assets/src/apps/js/frontend/single-curriculum/components/compatible.js ***!
3046 \********************************************************************************/
3047 () {
3048
3049 /**
3050 * Compatible with Page Builder.
3051 *
3052 * @author nhamdv
3053 */
3054
3055 LP.Hook.addAction('lp-compatible-builder', () => {
3056 LP.Hook.removeAction('lp-compatible-builder');
3057 if (typeof elementorFrontend !== 'undefined') {
3058 [...document.querySelectorAll('#popup-content')][0].addEventListener('scroll', () => {
3059 //Waypoint.refreshAll();
3060 window.dispatchEvent(new Event('resize'));
3061 });
3062 }
3063
3064 /*if ( typeof vc_js !== 'undefined' && typeof VcWaypoint !== 'undefined' ) {
3065 [ ...document.querySelectorAll( '#popup-content' ) ][ 0 ].addEventListener( 'scroll', () => {
3066 VcWaypoint.refreshAll();
3067 } );
3068 }*/
3069 });
3070 LP.Hook.addAction('lp-quiz-compatible-builder', () => {
3071 LP.Hook.removeAction('lp-quiz-compatible-builder');
3072 LP.Hook.doAction('lp-compatible-builder');
3073 if (typeof elementorFrontend !== 'undefined') {
3074 return window.elementorFrontend.init();
3075 }
3076 if (typeof vc_js !== 'undefined') {
3077 if (typeof vc_round_charts !== 'undefined') {
3078 vc_round_charts();
3079 }
3080 if (typeof vc_pieChart !== 'undefined') {
3081 vc_pieChart();
3082 }
3083 if (typeof vc_line_charts !== 'undefined') {
3084 vc_line_charts();
3085 }
3086 return window.vc_js();
3087 }
3088 });
3089 LP.Hook.addAction('lp-question-compatible-builder', () => {
3090 LP.Hook.removeAction('lp-question-compatible-builder');
3091 LP.Hook.removeAction('lp-quiz-compatible-builder');
3092 LP.Hook.doAction('lp-compatible-builder');
3093 if (typeof elementorFrontend !== 'undefined') {
3094 return window.elementorFrontend.init();
3095 }
3096 if (typeof vc_js !== 'undefined') {
3097 if (typeof vc_round_charts !== 'undefined') {
3098 vc_round_charts();
3099 }
3100 if (typeof vc_pieChart !== 'undefined') {
3101 vc_pieChart();
3102 }
3103 if (typeof vc_line_charts !== 'undefined') {
3104 vc_line_charts();
3105 }
3106 return window.vc_js();
3107 }
3108 });
3109
3110 /***/ },
3111
3112 /***/ "./assets/src/apps/js/frontend/single-curriculum/components/items-progress.js"
3113 /*!************************************************************************************!*\
3114 !*** ./assets/src/apps/js/frontend/single-curriculum/components/items-progress.js ***!
3115 \************************************************************************************/
3116 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3117
3118 "use strict";
3119 __webpack_require__.r(__webpack_exports__);
3120 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3121 /* harmony export */ getResponse: () => (/* binding */ getResponse),
3122 /* harmony export */ itemsProgress: () => (/* binding */ itemsProgress)
3123 /* harmony export */ });
3124 /* harmony import */ var _wordpress_url__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/url */ "@wordpress/url");
3125 /* harmony import */ var _wordpress_url__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_url__WEBPACK_IMPORTED_MODULE_0__);
3126 /* harmony import */ var _show_lp_overlay_complete_item__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../show-lp-overlay-complete-item */ "./assets/src/apps/js/frontend/show-lp-overlay-complete-item.js");
3127 // Rest API load content course progress - Nhamdv.
3128
3129
3130 const itemsProgress = () => {
3131 const elements = document.querySelectorAll('.popup-header__inner');
3132 if (!elements.length) {
3133 return;
3134 }
3135 if (document.querySelector('#learn-press-quiz-app div.quiz-result') !== null) {
3136 return;
3137 }
3138 if (elements[0].querySelectorAll('form.form-button-finish-course').length !== 0) {
3139 return;
3140 }
3141 const user_id = lpGlobalSettings.user_id || 0;
3142 if (user_id === 0) {
3143 return;
3144 }
3145 if ('IntersectionObserver' in window) {
3146 const eleObserver = new IntersectionObserver((entries, observer) => {
3147 entries.forEach(entry => {
3148 if (entry.isIntersecting) {
3149 const ele = entry.target;
3150 getResponse(ele);
3151 eleObserver.unobserve(ele);
3152 }
3153 });
3154 });
3155 [...elements].map(ele => eleObserver.observe(ele));
3156 }
3157 };
3158 const getResponse = async ele => {
3159 const response = await wp.apiFetch({
3160 path: (0,_wordpress_url__WEBPACK_IMPORTED_MODULE_0__.addQueryArgs)('lp/v1/lazy-load/items-progress', {
3161 courseId: lpGlobalSettings.post_id || '',
3162 userId: lpGlobalSettings.user_id || ''
3163 }),
3164 method: 'GET'
3165 });
3166 const {
3167 data
3168 } = response;
3169 ele.innerHTML += data;
3170 ele.classList.add('can-finish-course');
3171 _show_lp_overlay_complete_item__WEBPACK_IMPORTED_MODULE_1__["default"].init();
3172 };
3173
3174 /***/ },
3175
3176 /***/ "./assets/src/apps/js/utils/lp-modal-overlay.js"
3177 /*!******************************************************!*\
3178 !*** ./assets/src/apps/js/utils/lp-modal-overlay.js ***!
3179 \******************************************************/
3180 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
3181
3182 "use strict";
3183 __webpack_require__.r(__webpack_exports__);
3184 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3185 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3186 /* harmony export */ });
3187 const $ = jQuery;
3188 let elLPOverlay = null;
3189 const lpModalOverlay = {
3190 elLPOverlay: null,
3191 elMainContent: null,
3192 elTitle: null,
3193 elBtnYes: null,
3194 elBtnNo: null,
3195 elFooter: null,
3196 elCalledModal: null,
3197 callBackYes: null,
3198 instance: null,
3199 init() {
3200 if (this.instance) {
3201 return true;
3202 }
3203 this.elLPOverlay = $('.lp-overlay');
3204 if (!this.elLPOverlay.length) {
3205 return false;
3206 }
3207 elLPOverlay = this.elLPOverlay;
3208 this.elMainContent = elLPOverlay.find('.main-content');
3209 this.elTitle = elLPOverlay.find('.modal-title');
3210 this.elBtnYes = elLPOverlay.find('.btn-yes');
3211 this.elBtnNo = elLPOverlay.find('.btn-no');
3212 this.elFooter = elLPOverlay.find('.lp-modal-footer');
3213 $(document).on('click', '.close, .btn-no', function () {
3214 elLPOverlay.hide();
3215 });
3216 $(document).on('click', '.btn-yes', function (e) {
3217 e.preventDefault();
3218 e.stopPropagation();
3219 if ('function' === typeof lpModalOverlay.callBackYes) {
3220 lpModalOverlay.callBackYes(e);
3221 }
3222 });
3223 this.instance = this;
3224 return true;
3225 },
3226 setElCalledModal(elCalledModal) {
3227 this.elCalledModal = elCalledModal;
3228 },
3229 setContentModal(content, event) {
3230 this.elMainContent.html(content);
3231 if ('function' === typeof event) {
3232 event();
3233 }
3234 },
3235 setTitleModal(content) {
3236 this.elTitle.html(content);
3237 }
3238 };
3239 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (lpModalOverlay);
3240
3241 /***/ },
3242
3243 /***/ "./node_modules/refx/refx.js"
3244 /*!***********************************!*\
3245 !*** ./node_modules/refx/refx.js ***!
3246 \***********************************/
3247 (module) {
3248
3249 "use strict";
3250
3251
3252 function flattenIntoMap( map, effects ) {
3253 var i;
3254 if ( Array.isArray( effects ) ) {
3255 for ( i = 0; i < effects.length; i++ ) {
3256 flattenIntoMap( map, effects[ i ] );
3257 }
3258 } else {
3259 for ( i in effects ) {
3260 map[ i ] = ( map[ i ] || [] ).concat( effects[ i ] );
3261 }
3262 }
3263 }
3264
3265 function refx( effects ) {
3266 var map = {},
3267 middleware;
3268
3269 flattenIntoMap( map, effects );
3270
3271 middleware = function( store ) {
3272 return function( next ) {
3273 return function( action ) {
3274 var handlers = map[ action.type ],
3275 result = next( action ),
3276 i, handlerAction;
3277
3278 if ( handlers ) {
3279 for ( i = 0; i < handlers.length; i++ ) {
3280 handlerAction = handlers[ i ]( action, store );
3281 if ( handlerAction ) {
3282 store.dispatch( handlerAction );
3283 }
3284 }
3285 }
3286
3287 return result;
3288 };
3289 };
3290 };
3291
3292 middleware.effects = map;
3293
3294 return middleware;
3295 }
3296
3297 module.exports = refx;
3298
3299
3300 /***/ },
3301
3302 /***/ "react"
3303 /*!************************!*\
3304 !*** external "React" ***!
3305 \************************/
3306 (module) {
3307
3308 "use strict";
3309 module.exports = window["React"];
3310
3311 /***/ },
3312
3313 /***/ "@learnpress/data-controls"
3314 /*!**************************************!*\
3315 !*** external ["LP","dataControls"] ***!
3316 \**************************************/
3317 (module) {
3318
3319 "use strict";
3320 module.exports = window["LP"]["dataControls"];
3321
3322 /***/ },
3323
3324 /***/ "@wordpress/compose"
3325 /*!*********************************!*\
3326 !*** external ["wp","compose"] ***!
3327 \*********************************/
3328 (module) {
3329
3330 "use strict";
3331 module.exports = window["wp"]["compose"];
3332
3333 /***/ },
3334
3335 /***/ "@wordpress/data"
3336 /*!******************************!*\
3337 !*** external ["wp","data"] ***!
3338 \******************************/
3339 (module) {
3340
3341 "use strict";
3342 module.exports = window["wp"]["data"];
3343
3344 /***/ },
3345
3346 /***/ "@wordpress/element"
3347 /*!*********************************!*\
3348 !*** external ["wp","element"] ***!
3349 \*********************************/
3350 (module) {
3351
3352 "use strict";
3353 module.exports = window["wp"]["element"];
3354
3355 /***/ },
3356
3357 /***/ "@wordpress/i18n"
3358 /*!******************************!*\
3359 !*** external ["wp","i18n"] ***!
3360 \******************************/
3361 (module) {
3362
3363 "use strict";
3364 module.exports = window["wp"]["i18n"];
3365
3366 /***/ },
3367
3368 /***/ "@wordpress/url"
3369 /*!*****************************!*\
3370 !*** external ["wp","url"] ***!
3371 \*****************************/
3372 (module) {
3373
3374 "use strict";
3375 module.exports = window["wp"]["url"];
3376
3377 /***/ },
3378
3379 /***/ "./node_modules/classnames/index.js"
3380 /*!******************************************!*\
3381 !*** ./node_modules/classnames/index.js ***!
3382 \******************************************/
3383 (module, exports) {
3384
3385 var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
3386 Copyright (c) 2018 Jed Watson.
3387 Licensed under the MIT License (MIT), see
3388 http://jedwatson.github.io/classnames
3389 */
3390 /* global define */
3391
3392 (function () {
3393 'use strict';
3394
3395 var hasOwn = {}.hasOwnProperty;
3396
3397 function classNames () {
3398 var classes = '';
3399
3400 for (var i = 0; i < arguments.length; i++) {
3401 var arg = arguments[i];
3402 if (arg) {
3403 classes = appendClass(classes, parseValue(arg));
3404 }
3405 }
3406
3407 return classes;
3408 }
3409
3410 function parseValue (arg) {
3411 if (typeof arg === 'string' || typeof arg === 'number') {
3412 return arg;
3413 }
3414
3415 if (typeof arg !== 'object') {
3416 return '';
3417 }
3418
3419 if (Array.isArray(arg)) {
3420 return classNames.apply(null, arg);
3421 }
3422
3423 if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
3424 return arg.toString();
3425 }
3426
3427 var classes = '';
3428
3429 for (var key in arg) {
3430 if (hasOwn.call(arg, key) && arg[key]) {
3431 classes = appendClass(classes, key);
3432 }
3433 }
3434
3435 return classes;
3436 }
3437
3438 function appendClass (value, newClass) {
3439 if (!newClass) {
3440 return value;
3441 }
3442
3443 if (value) {
3444 return value + ' ' + newClass;
3445 }
3446
3447 return value + newClass;
3448 }
3449
3450 if ( true && module.exports) {
3451 classNames.default = classNames;
3452 module.exports = classNames;
3453 } else if (true) {
3454 // register as 'classnames', consistent with npm package name
3455 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
3456 return classNames;
3457 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
3458 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
3459 } else // removed by dead control flow
3460 {}
3461 }());
3462
3463
3464 /***/ }
3465
3466 /******/ });
3467 /************************************************************************/
3468 /******/ // The module cache
3469 /******/ var __webpack_module_cache__ = {};
3470 /******/
3471 /******/ // The require function
3472 /******/ function __webpack_require__(moduleId) {
3473 /******/ // Check if module is in cache
3474 /******/ var cachedModule = __webpack_module_cache__[moduleId];
3475 /******/ if (cachedModule !== undefined) {
3476 /******/ return cachedModule.exports;
3477 /******/ }
3478 /******/ // Create a new module (and put it into the cache)
3479 /******/ var module = __webpack_module_cache__[moduleId] = {
3480 /******/ // no module.id needed
3481 /******/ // no module.loaded needed
3482 /******/ exports: {}
3483 /******/ };
3484 /******/
3485 /******/ // Execute the module function
3486 /******/ if (!(moduleId in __webpack_modules__)) {
3487 /******/ delete __webpack_module_cache__[moduleId];
3488 /******/ var e = new Error("Cannot find module '" + moduleId + "'");
3489 /******/ e.code = 'MODULE_NOT_FOUND';
3490 /******/ throw e;
3491 /******/ }
3492 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
3493 /******/
3494 /******/ // Return the exports of the module
3495 /******/ return module.exports;
3496 /******/ }
3497 /******/
3498 /************************************************************************/
3499 /******/ /* webpack/runtime/compat get default export */
3500 /******/ (() => {
3501 /******/ // getDefaultExport function for compatibility with non-harmony modules
3502 /******/ __webpack_require__.n = (module) => {
3503 /******/ var getter = module && module.__esModule ?
3504 /******/ () => (module['default']) :
3505 /******/ () => (module);
3506 /******/ __webpack_require__.d(getter, { a: getter });
3507 /******/ return getter;
3508 /******/ };
3509 /******/ })();
3510 /******/
3511 /******/ /* webpack/runtime/define property getters */
3512 /******/ (() => {
3513 /******/ // define getter functions for harmony exports
3514 /******/ __webpack_require__.d = (exports, definition) => {
3515 /******/ for(var key in definition) {
3516 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
3517 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
3518 /******/ }
3519 /******/ }
3520 /******/ };
3521 /******/ })();
3522 /******/
3523 /******/ /* webpack/runtime/hasOwnProperty shorthand */
3524 /******/ (() => {
3525 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
3526 /******/ })();
3527 /******/
3528 /******/ /* webpack/runtime/make namespace object */
3529 /******/ (() => {
3530 /******/ // define __esModule on exports
3531 /******/ __webpack_require__.r = (exports) => {
3532 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
3533 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
3534 /******/ }
3535 /******/ Object.defineProperty(exports, '__esModule', { value: true });
3536 /******/ };
3537 /******/ })();
3538 /******/
3539 /************************************************************************/
3540 var __webpack_exports__ = {};
3541 // This entry needs to be wrapped in an IIFE because it needs to be in strict mode.
3542 (() => {
3543 "use strict";
3544 /*!*********************************************!*\
3545 !*** ./assets/src/apps/js/frontend/quiz.js ***!
3546 \*********************************************/
3547 __webpack_require__.r(__webpack_exports__);
3548 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
3549 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
3550 /* harmony export */ init: () => (/* binding */ init)
3551 /* harmony export */ });
3552 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
3553 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3554 /* harmony import */ var _quiz_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./quiz/index */ "./assets/src/apps/js/frontend/quiz/index.js");
3555 /* harmony import */ var _single_curriculum_components_compatible__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./single-curriculum/components/compatible */ "./assets/src/apps/js/frontend/single-curriculum/components/compatible.js");
3556 /* harmony import */ var _single_curriculum_components_compatible__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_single_curriculum_components_compatible__WEBPACK_IMPORTED_MODULE_2__);
3557
3558
3559
3560 const {
3561 modal: {
3562 default: Modal
3563 }
3564 } = LP;
3565 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_quiz_index__WEBPACK_IMPORTED_MODULE_1__["default"]);
3566 const init = (elem, settings) => {
3567 // For no require enroll
3568 if (lpQuizSettings.checkNorequizenroll === 1) {
3569 const keyQuizOff = 'quiz_off_' + lpQuizSettings.id;
3570 const quizDataOffStr = window.localStorage.getItem(keyQuizOff);
3571 if (null !== quizDataOffStr) {
3572 const quizDataOff = JSON.parse(quizDataOffStr);
3573 settings.status = quizDataOff.status;
3574 settings.questions = quizDataOff.questions;
3575 if ('started' === quizDataOff.status) {
3576 const now = Date.now();
3577 settings.total_time = Math.floor((quizDataOff.endTime - now) / 1000);
3578 } else if ('completed' === quizDataOff.status) {
3579 settings.results = quizDataOff.results;
3580 settings.answered = quizDataOff.results.answered;
3581 settings.questions = quizDataOff.results.questions;
3582 }
3583 if (undefined !== quizDataOff.checked_questions) {
3584 settings.checked_questions = quizDataOff.checked_questions;
3585 }
3586 if (undefined !== quizDataOff.question_options) {
3587 //settings.checked_questions = quizDataOff.checked_questions;
3588
3589 for (const i in settings.questions) {
3590 const question = settings.questions[i];
3591 if (undefined !== quizDataOff.question_options[question.id]) {
3592 question.options = quizDataOff.question_options[question.id];
3593 }
3594 settings.questions[i] = question;
3595 }
3596 }
3597 }
3598 }
3599
3600 //console.log(settings);
3601
3602 wp.element.render((0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(Modal, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_quiz_index__WEBPACK_IMPORTED_MODULE_1__["default"], {
3603 settings: settings
3604 })), [...document.querySelectorAll(elem)][0]);
3605 LP.Hook.doAction('lp-quiz-compatible-builder');
3606 };
3607 })();
3608
3609 (window.LP = window.LP || {}).quiz = __webpack_exports__;
3610 /******/ })()
3611 ;
3612 //# sourceMappingURL=quiz.js.map