PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.6
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.6
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 / blocks / course-item-template.js

course-item-template.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.6, at assets/js/dist/blocks/course-item-template.js

1,153 lines 39.3 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/blocks/courses/course-item-template/edit.js"
5 /*!************************************************************************!*\
6 !*** ./assets/src/apps/js/blocks/courses/course-item-template/edit.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_block_editor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/block-editor */ "@wordpress/block-editor");
18 /* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__);
19 /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! classnames */ "./node_modules/classnames/index.js");
20 /* harmony import */ var classnames__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(classnames__WEBPACK_IMPORTED_MODULE_2__);
21 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @wordpress/data */ "@wordpress/data");
22 /* harmony import */ var _wordpress_data__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_wordpress_data__WEBPACK_IMPORTED_MODULE_3__);
23 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/element */ "@wordpress/element");
24 /* harmony import */ var _wordpress_element__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_element__WEBPACK_IMPORTED_MODULE_4__);
25 /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/components */ "@wordpress/components");
26 /* harmony import */ var _wordpress_components__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_components__WEBPACK_IMPORTED_MODULE_5__);
27 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n");
28 /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__);
29 /* harmony import */ var lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! lpAssetsJsPath/utils.js */ "./assets/src/js/utils.js");
30 /* harmony import */ var lpAssetsJsPath_api_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! lpAssetsJsPath/api.js */ "./assets/src/js/api.js");
31
32
33
34
35
36
37
38
39
40 const TEMPLATE_DEFAULT = [['learnpress/course-image'], ['learnpress/course-title'], ['learnpress/course-price']];
41 function PostTemplateInnerBlocks({
42 classList
43 }) {
44 const innerBlocksProps = (0,_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.useInnerBlocksProps)({
45 className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('wp-block-learnpress-course-item-template')
46 }, {
47 template: TEMPLATE_DEFAULT
48 });
49 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
50 className: "course"
51 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
52 ...innerBlocksProps
53 }));
54 }
55 function PostTemplateBlockPreview({
56 blocks,
57 blockContextId,
58 classList,
59 isHidden,
60 setActiveBlockContextId
61 }) {
62 const blockPreviewProps = (0,_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.__experimentalUseBlockPreview)({
63 blocks
64 });
65 const handleOnClick = () => {
66 setActiveBlockContextId(blockContextId);
67 };
68 const style = {
69 display: isHidden ? 'none' : undefined
70 };
71 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
72 className: "course",
73 tabIndex: 0
74 // eslint-disable-next-line jsx-a11y/no-noninteractive-element-to-interactive-role
75 ,
76 role: "button",
77 onClick: handleOnClick,
78 onKeyPress: handleOnClick,
79 style: style
80 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
81 ...blockPreviewProps,
82 className: "wp-block-learnpress-course-item-template"
83 }));
84 }
85 const fetchLearnPressCourses = async (courseQuery, signal) => {
86 let url = lpAssetsJsPath_api_js__WEBPACK_IMPORTED_MODULE_8__["default"].apiEditCoursesArchiveBlock;
87 url = lpAssetsJsPath_utils_js__WEBPACK_IMPORTED_MODULE_7__.lpAddQueryArgs(url, courseQuery);
88 const response = await fetch(url, {
89 method: 'GET',
90 signal
91 });
92 if (!response.ok) {
93 throw new Error(`HTTP error! Status: ${response.status}`);
94 }
95 return await response.json();
96 };
97 const MemoizedPostTemplateBlockPreview = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.memo)(PostTemplateBlockPreview);
98 const Edit = ({
99 clientId,
100 context,
101 attributes,
102 setAttributes
103 }) => {
104 const blockProps = (0,_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.useBlockProps)({
105 className: classnames__WEBPACK_IMPORTED_MODULE_2___default()('learn-press-courses')
106 });
107 const [activeBlockContextId, setActiveBlockContextId] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useState)();
108 const [coursesData, setCoursesData] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useState)();
109 const [listCourses, setListCourses] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useState)([]);
110 const [loadingAPI, setLoadingAPI] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useState)(0);
111 // const [ totalPages, setTotalPages ] = useState( 1 );
112 const {
113 columns
114 } = attributes;
115 const layoutPagination = context.lpCourseQuery?.pagination_type || 'number';
116
117 // Fetch courses when query parameters change
118 (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useEffect)(() => {
119 var _context$lpCourseQuer;
120 const courseQuery = (_context$lpCourseQuer = context.lpCourseQuery) !== null && _context$lpCourseQuer !== void 0 ? _context$lpCourseQuer : {};
121 let signal, controller;
122 const fetchCourses = async () => {
123 try {
124 setLoadingAPI(1);
125 controller = new AbortController();
126 signal = controller.signal;
127 const response = await fetchLearnPressCourses(courseQuery, signal);
128 const {
129 data
130 } = response;
131 const {
132 courses,
133 page,
134 total,
135 total_pages
136 } = data;
137 setCoursesData(response);
138 setListCourses(courses);
139 // setTotalPages( total_pages );
140 } catch (error) {
141 if (error.name !== 'AbortError') {
142 console.error('Failed to fetch courses:', error);
143 }
144 } finally {
145 setLoadingAPI(0);
146 }
147 };
148 fetchCourses();
149 return () => {
150 controller.abort();
151 };
152 }, [context.lpCourseQuery?.order_by, context.lpCourseQuery?.limit]);
153 const {
154 blocks
155 } = (0,_wordpress_data__WEBPACK_IMPORTED_MODULE_3__.useSelect)(select => {
156 const {
157 getBlocks
158 } = select(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.store);
159 return {
160 blocks: getBlocks(clientId)
161 };
162 }, [clientId]);
163 const blockContexts = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useMemo)(() => listCourses?.map(course => ({
164 lpCourseData: course,
165 courseId: course?.ID
166 })), [listCourses]);
167 if (loadingAPI) {
168 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {
169 ...blockProps
170 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", null, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Courses Fetching…', 'learnpress')));
171 }
172 if (listCourses.length === 0 && !loadingAPI) {
173 const dataDummy = [{
174 ID: 1,
175 post_title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Course One', 'learnpress')
176 }, {
177 ID: 2,
178 post_title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Course two', 'learnpress')
179 }];
180 setListCourses(dataDummy);
181 }
182 function paginationTypeDisplay(type) {
183 switch (type) {
184 case 'load-more':
185 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("button", {
186 className: "courses-btn-load-more"
187 }, (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Load More', 'learnpress'));
188 case 'infinite':
189 return '';
190 default:
191 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("nav", {
192 className: "learnpress-block-pagination navigation pagination"
193 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {
194 className: "page-numbers"
195 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("a", {
196 className: "prev page-numbers",
197 href: "?paged=1"
198 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("i", {
199 className: "lp-icon-arrow-left"
200 }))), Array.from({
201 length: 3
202 }, (_, index) => (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("li", {
203 key: index
204 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("a", {
205 className: "page-numbers",
206 href: "{index}"
207 }, index + 1)))));
208 }
209 }
210 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.InspectorControls, null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_5__.PanelBody, {
211 title: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Settings', 'learnpress')
212 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_5__.__experimentalToggleGroupControl, {
213 label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Layout', 'learnpress'),
214 value: attributes.layout || 'gird',
215 onChange: value => {
216 setAttributes({
217 layout: value || 'gird'
218 });
219 },
220 isBlock: true
221 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_5__.__experimentalToggleGroupControlOption, {
222 value: "list",
223 label: "Stack"
224 }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_5__.__experimentalToggleGroupControlOption, {
225 value: "grid",
226 label: "Grid"
227 })), attributes.layout === 'grid' && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_5__.RangeControl, {
228 label: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_6__.__)('Columns', 'learnpress'),
229 value: attributes.columns || 3,
230 onChange: value => {
231 setAttributes({
232 columns: value
233 });
234 },
235 min: 2,
236 max: 6,
237 step: 1,
238 marks: [{
239 value: 2,
240 label: '2'
241 }, {
242 value: 3,
243 label: '3'
244 }, {
245 value: 4,
246 label: '4'
247 }, {
248 value: 5,
249 label: '5'
250 }, {
251 value: 6,
252 label: '6'
253 }],
254 withInputField: true
255 }))), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("ul", {
256 className: "learn-press-courses wp-block-learn-press-courses",
257 "data-layout": attributes.layout ? attributes.layout : 'list',
258 style: {
259 '--columns': attributes.columns || 3
260 }
261 }, blockContexts && blockContexts.map(blockContext => (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.BlockContextProvider, {
262 key: blockContext.courseId,
263 value: blockContext
264 }, blockContext.courseId === (activeBlockContextId || blockContexts[0]?.courseId) ? (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(PostTemplateInnerBlocks, {
265 classList: blockContext.classList
266 }) : null, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(MemoizedPostTemplateBlockPreview, {
267 blocks: blocks,
268 blockContextId: blockContext.courseId,
269 classList: blockContext.classList,
270 setActiveBlockContextId: setActiveBlockContextId,
271 isHidden: blockContext.courseId === (activeBlockContextId || blockContexts[0]?.courseId)
272 })))), context.lpCourseQuery?.pagination ? paginationTypeDisplay(layoutPagination) : null);
273 };
274 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Edit);
275
276 /***/ },
277
278 /***/ "./assets/src/apps/js/blocks/courses/course-item-template/save.js"
279 /*!************************************************************************!*\
280 !*** ./assets/src/apps/js/blocks/courses/course-item-template/save.js ***!
281 \************************************************************************/
282 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
283
284 "use strict";
285 __webpack_require__.r(__webpack_exports__);
286 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
287 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
288 /* harmony export */ });
289 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
290 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
291 /* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @wordpress/block-editor */ "@wordpress/block-editor");
292 /* harmony import */ var _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__);
293
294
295 const Save = props => {
296 const blockProps = _wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.useBlockProps.save();
297 return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
298 ...blockProps
299 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_block_editor__WEBPACK_IMPORTED_MODULE_1__.InnerBlocks.Content, null));
300 };
301 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Save);
302
303 /***/ },
304
305 /***/ "./assets/src/js/api.js"
306 /*!******************************!*\
307 !*** ./assets/src/js/api.js ***!
308 \******************************/
309 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
310
311 "use strict";
312 __webpack_require__.r(__webpack_exports__);
313 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
314 /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
315 /* harmony export */ });
316 /**
317 * List API on backend
318 *
319 * @since 4.2.6
320 * @version 1.0.2
321 */
322
323 const lplistAPI = {};
324 let lp_rest_url;
325 if ('undefined' !== typeof lpDataAdmin) {
326 lp_rest_url = lpDataAdmin.lp_rest_url;
327 lplistAPI.admin = {
328 apiAdminNotice: lp_rest_url + 'lp/v1/admin/tools/admin-notices',
329 apiAddons: lp_rest_url + 'lp/v1/addon/all',
330 apiAddonAction: lp_rest_url + 'lp/v1/addon/action-n',
331 apiAddonsPurchase: lp_rest_url + 'lp/v1/addon/info-addons-purchase',
332 apiSearchCourses: lp_rest_url + 'lp/v1/admin/tools/search-course',
333 apiSearchUsers: lp_rest_url + 'lp/v1/admin/tools/search-user',
334 apiAssignUserCourse: lp_rest_url + 'lp/v1/admin/tools/assign-user-course',
335 apiUnAssignUserCourse: lp_rest_url + 'lp/v1/admin/tools/unassign-user-course'
336 };
337 }
338 if ('undefined' !== typeof lpData) {
339 lp_rest_url = lpData.lp_rest_url;
340 lplistAPI.frontend = {
341 apiWidgets: lp_rest_url + 'lp/v1/widgets/api',
342 apiCourses: lp_rest_url + 'lp/v1/courses/archive-course',
343 // Deprecated API, don't load from v4.3.7
344 apiAJAX: lp_rest_url + 'lp/v1/load_content_via_ajax/',
345 // Deprecated since 4.3.0
346 apiProfileCoverImage: lp_rest_url + 'lp/v1/profile/cover-image'
347 };
348 }
349 if (lp_rest_url) {
350 lplistAPI.apiCourses = lp_rest_url + 'lp/v1/courses/';
351 lplistAPI.apiEditCoursesArchiveBlock = lp_rest_url + 'lp/v1/courses/edit-archive-block';
352 lplistAPI.apiCoursesSuggest = lp_rest_url + 'lp/v1/courses/courses-suggest';
353 }
354 /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (lplistAPI);
355
356 /***/ },
357
358 /***/ "./assets/src/js/utils.js"
359 /*!********************************!*\
360 !*** ./assets/src/js/utils.js ***!
361 \********************************/
362 (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
363
364 "use strict";
365 __webpack_require__.r(__webpack_exports__);
366 /* harmony export */ __webpack_require__.d(__webpack_exports__, {
367 /* harmony export */ debounce: () => (/* binding */ debounce),
368 /* harmony export */ eventHandlers: () => (/* binding */ eventHandlers),
369 /* harmony export */ fullScreenView: () => (/* binding */ fullScreenView),
370 /* harmony export */ getDataOfForm: () => (/* binding */ getDataOfForm),
371 /* harmony export */ getFieldKeysOfForm: () => (/* binding */ getFieldKeysOfForm),
372 /* harmony export */ listenElementCreated: () => (/* binding */ listenElementCreated),
373 /* harmony export */ listenElementViewed: () => (/* binding */ listenElementViewed),
374 /* harmony export */ lpAddQueryArgs: () => (/* binding */ lpAddQueryArgs),
375 /* harmony export */ lpAjaxParseJsonOld: () => (/* binding */ lpAjaxParseJsonOld),
376 /* harmony export */ lpClassName: () => (/* binding */ lpClassName),
377 /* harmony export */ lpFetchAPI: () => (/* binding */ lpFetchAPI),
378 /* harmony export */ lpGetCurrentURLNoParam: () => (/* binding */ lpGetCurrentURLNoParam),
379 /* harmony export */ lpOnElementReady: () => (/* binding */ lpOnElementReady),
380 /* harmony export */ lpSetLoadingEl: () => (/* binding */ lpSetLoadingEl),
381 /* harmony export */ lpShowHideEl: () => (/* binding */ lpShowHideEl),
382 /* harmony export */ mergeDataWithDatForm: () => (/* binding */ mergeDataWithDatForm),
383 /* harmony export */ toggleCollapse: () => (/* binding */ toggleCollapse),
384 /* harmony export */ toggleEnable: () => (/* binding */ toggleEnable)
385 /* harmony export */ });
386 /**
387 * Utils functions
388 *
389 * @param url
390 * @param data
391 * @param functions
392 * @since 4.2.5.1
393 * @version 1.0.7
394 */
395 const lpClassName = {
396 hidden: 'lp-hidden',
397 loading: 'loading',
398 elCollapse: 'lp-collapse',
399 elSectionToggle: '.lp-section-toggle',
400 elTriggerToggle: '.lp-trigger-toggle',
401 elBtnFullScreen: '.lp-btn-full-screen-view',
402 elFullScreen: 'lp-full-screen-view',
403 elBtnFullScreenClose: 'lp-full-screen-view__close'
404 };
405 const lpFetchAPI = (url, data = {}, functions = {}) => {
406 if ('function' === typeof functions.before) {
407 functions.before();
408 }
409 fetch(url, {
410 method: 'GET',
411 ...data
412 }).then(response => response.json()).then(response => {
413 if ('function' === typeof functions.success) {
414 functions.success(response);
415 }
416 }).catch(err => {
417 if ('function' === typeof functions.error) {
418 functions.error(err);
419 }
420 }).finally(() => {
421 if ('function' === typeof functions.completed) {
422 functions.completed();
423 }
424 });
425 };
426
427 /**
428 * Get current URL without params.
429 *
430 * @since 4.2.5.1
431 */
432 const lpGetCurrentURLNoParam = () => {
433 let currentUrl = window.location.href;
434 const hasParams = currentUrl.includes('?');
435 if (hasParams) {
436 currentUrl = currentUrl.split('?')[0];
437 }
438 return currentUrl;
439 };
440 const lpAddQueryArgs = (endpoint, args) => {
441 const url = new URL(endpoint);
442 Object.keys(args).forEach(arg => {
443 url.searchParams.set(arg, args[arg]);
444 });
445 return url;
446 };
447
448 /**
449 * Listen element viewed.
450 *
451 * @param el
452 * @param callback
453 * @since 4.2.5.8
454 */
455 const listenElementViewed = (el, callback) => {
456 const observerSeeItem = new IntersectionObserver(function (entries) {
457 for (const entry of entries) {
458 if (entry.isIntersecting) {
459 callback(entry);
460 }
461 }
462 });
463 observerSeeItem.observe(el);
464 };
465
466 /**
467 * Listen element created.
468 *
469 * @param callback
470 * @since 4.2.5.8
471 */
472 const listenElementCreated = callback => {
473 const observerCreateItem = new MutationObserver(function (mutations) {
474 mutations.forEach(function (mutation) {
475 if (mutation.addedNodes) {
476 mutation.addedNodes.forEach(function (node) {
477 if (node.nodeType === 1) {
478 callback(node);
479 }
480 });
481 }
482 });
483 });
484 observerCreateItem.observe(document, {
485 childList: true,
486 subtree: true
487 });
488 // End.
489 };
490
491 /**
492 * Listen element created.
493 *
494 * @param selector
495 * @param callback
496 * @since 4.2.7.1
497 */
498 const lpOnElementReady = (selector, callback) => {
499 const element = document.querySelector(selector);
500 if (element) {
501 callback(element);
502 return;
503 }
504 const observer = new MutationObserver((mutations, obs) => {
505 const element = document.querySelector(selector);
506 if (element) {
507 obs.disconnect();
508 callback(element);
509 }
510 });
511 observer.observe(document.documentElement, {
512 childList: true,
513 subtree: true
514 });
515 };
516
517 // Parse JSON from string with content include LP_AJAX_START.
518 const lpAjaxParseJsonOld = data => {
519 if (typeof data !== 'string') {
520 return data;
521 }
522 const m = String.raw({
523 raw: data
524 }).match(/<-- LP_AJAX_START -->(.*)<-- LP_AJAX_END -->/s);
525 try {
526 if (m) {
527 data = JSON.parse(m[1].replace(/(?:\r\n|\r|\n)/g, ''));
528 } else {
529 data = JSON.parse(data);
530 }
531 } catch (e) {
532 data = {};
533 }
534 return data;
535 };
536
537 // status 0: hide, 1: show
538 const lpShowHideEl = (el, status = 0) => {
539 if (!el) {
540 return;
541 }
542 if (!status) {
543 el.classList.add(lpClassName.hidden);
544 } else {
545 el.classList.remove(lpClassName.hidden);
546 }
547 };
548
549 // status 0: hide, 1: show
550 const lpSetLoadingEl = (el, status) => {
551 if (!el) {
552 return;
553 }
554 if (!status) {
555 el.classList.remove(lpClassName.loading);
556 } else {
557 el.classList.add(lpClassName.loading);
558 }
559 };
560
561 // Toggle collapse section
562 const toggleCollapse = (e, target, elTriggerClassName = '', elsExclude = [], callback) => {
563 if (!elTriggerClassName) {
564 elTriggerClassName = lpClassName.elTriggerToggle;
565 }
566
567 // Exclude elements, which should not trigger the collapse toggle
568 if (elsExclude && elsExclude.length > 0) {
569 for (const elExclude of elsExclude) {
570 if (target.closest(elExclude)) {
571 return;
572 }
573 }
574 }
575 const elTrigger = target.closest(elTriggerClassName);
576 if (!elTrigger) {
577 return;
578 }
579
580 //console.log( 'elTrigger', elTrigger );
581
582 const elSectionToggle = elTrigger.closest(`${lpClassName.elSectionToggle}`);
583 if (!elSectionToggle) {
584 return;
585 }
586 elSectionToggle.classList.toggle(`${lpClassName.elCollapse}`);
587 if ('function' === typeof callback) {
588 callback(elSectionToggle);
589 }
590 };
591
592 // Get data of form
593 const getDataOfForm = form => {
594 const dataSend = {};
595 const formData = new FormData(form);
596 for (const pair of formData.entries()) {
597 const key = pair[0];
598 const value = formData.getAll(key);
599 if (!dataSend.hasOwnProperty(key)) {
600 // Convert value array to string.
601 dataSend[key] = value.join(',');
602 }
603 }
604 return dataSend;
605 };
606
607 // Get field keys of form
608 const getFieldKeysOfForm = form => {
609 const keys = [];
610 const elements = form.elements;
611 for (let i = 0; i < elements.length; i++) {
612 const name = elements[i].name;
613 if (name && !keys.includes(name)) {
614 keys.push(name);
615 }
616 }
617 return keys;
618 };
619
620 // Merge data handle with data form.
621 const mergeDataWithDatForm = (elForm, dataHandle) => {
622 const dataForm = getDataOfForm(elForm);
623 const keys = getFieldKeysOfForm(elForm);
624 keys.forEach(key => {
625 if (!dataForm.hasOwnProperty(key)) {
626 delete dataHandle[key];
627 } else if (dataForm[key][0] === '') {
628 delete dataForm[key];
629 delete dataHandle[key];
630 }
631 });
632 dataHandle = {
633 ...dataHandle,
634 ...dataForm
635 };
636 return dataHandle;
637 };
638
639 /**
640 * Event trigger
641 * For each list of event handlers, listen event on document.
642 *
643 * eventName: 'click', 'change', ...
644 * eventHandlers = [ { selector: '.lp-button', callBack: function(){}, class: object } ]
645 *
646 * @param eventName
647 * @param eventHandlers
648 */
649 const eventHandlers = (eventName, eventHandlers) => {
650 document.addEventListener(eventName, e => {
651 const target = e.target;
652 let args = {
653 e,
654 target
655 };
656 eventHandlers.forEach(eventHandler => {
657 args = {
658 ...args,
659 ...eventHandler
660 };
661
662 //console.log( args );
663
664 // Check condition before call back
665 if (eventHandler.conditionBeforeCallBack) {
666 if (eventHandler.conditionBeforeCallBack(args) !== true) {
667 return;
668 }
669 }
670
671 // Special check for keydown event with checkIsEventEnter = true
672 if (eventName === 'keydown' && eventHandler.checkIsEventEnter) {
673 if (e.key !== 'Enter') {
674 return;
675 }
676 }
677 if (target.closest(eventHandler.selector)) {
678 if (eventHandler.class) {
679 // Call method of class, function callBack will understand exactly {this} is class object.
680 eventHandler.class[eventHandler.callBack](args);
681 } else {
682 // For send args is objected, {this} is eventHandler object, not class object.
683 eventHandler.callBack(args);
684 }
685 }
686 });
687 });
688 };
689
690 /**
691 * Debounce - delays function execution until after `wait` ms of inactivity.
692 *
693 * Each call resets the timer. Only the last call in a burst executes.
694 *
695 * USE CASES:
696 * - Search inputs, form validation, window resize
697 * - Multiple elements need independent timers
698 * - When you need to call with different arguments
699 *
700 * EXAMPLES:
701 * const debouncedSearch = debounce( (query) => fetchResults(query), 300 );
702 * searchInput.addEventListener('input', (e) => debouncedSearch(e.target.value));
703 *
704 * const debouncedResize = debounce( recalculateLayout, 250 );
705 * window.addEventListener('resize', debouncedResize);
706 *
707 * ⚠️ Create ONCE outside event handlers, not inside.
708 *
709 * @param {Function} func - Function to debounce (can be anonymous)
710 * @param {number} wait - Milliseconds to wait (default: 500)
711 * @return {Function} Debounced wrapper function
712 * @since 4.3.7
713 * @version 1.0.0
714 */
715 const debounce = (func, wait = 500) => {
716 let timer;
717 return args => {
718 clearTimeout(timer);
719 timer = setTimeout(() => func(args), wait);
720 };
721 };
722
723 /**
724 * Initialize lp-toggle-enable components.
725 *
726 * Finds all `.lp-toggle-enable` elements and wires up toggle behavior.
727 * Reads initial state from `data-enabled` attribute ("true"/"false").
728 * Calls `data-on-toggle` callback (if provided via options) on state change.
729 *
730 * HTML structure:
731 * <label class="lp-toggle-enable" data-enabled="true">
732 * <input type="checkbox" class="lp-toggle-enable__input" />
733 * <span class="lp-toggle-enable__track"></span>
734 * </label>
735 *
736 * @param {string} selector CSS selector for toggle elements (default: '.lp-toggle-enable')
737 * @param {Function} onToggle Optional callback( el, isEnabled ) called on state change
738 * @since 4.4.5
739 * @version 1.0.0
740 */
741 window.lpToggleEnableInit = 0;
742 const toggleEnable = (onToggle = null) => {
743 if (window.lpToggleEnableInit) {
744 return;
745 }
746 window.lpToggleEnableInit = 1;
747 const selector = '.lp-toggle-enable';
748 const updateUI = (toggle, isEnabled) => {
749 toggle.classList.toggle('is-enabled', isEnabled);
750 const input = toggle.querySelector('.lp-toggle-enable__input');
751 if (input) {
752 input.checked = isEnabled;
753 input.value = isEnabled ? '1' : '0';
754 }
755 };
756
757 // Delegate click handling via eventHandlers.
758 eventHandlers('click', [{
759 selector,
760 callBack: args => {
761 const {
762 e,
763 target
764 } = args;
765 const toggle = target.closest(selector);
766 if (!toggle || toggle.classList.contains('is-disabled')) {
767 return;
768 }
769 e.preventDefault();
770 const isEnabled = !toggle.classList.contains('is-enabled');
771 updateUI(toggle, isEnabled);
772 if ('function' === typeof onToggle) {
773 onToggle(toggle, isEnabled);
774 }
775 }
776 }]);
777 };
778
779 /**
780 * Initialize custom fullscreen view buttons.
781 *
782 * Delegates clicks on `.lp-btn-full-screen-view` buttons to
783 * `lpToggleFullscreenView`. Reads the `data-target` attribute to find the
784 * target element. Falls back to the button's parent element when
785 * `data-target` is not provided.
786 *
787 * @since 4.4.5
788 * @version 1.0.0
789 */
790 window.lpFullScreenViewInit = 0;
791 const fullScreenView = () => {
792 if (window.lpFullScreenViewInit) {
793 return;
794 }
795 window.lpFullScreenViewInit = 1;
796 let lastScrollY = 0;
797 const lpToggleFullscreenView = (elTarget, elBtnFullScreen = null) => {
798 const isFullscreen = elTarget.classList.contains(lpClassName.elFullScreen);
799 if (isFullscreen) {
800 elTarget.classList.remove(lpClassName.elFullScreen);
801 document.documentElement.classList.remove('lp-full-screen-active');
802 window.scrollTo(0, lastScrollY);
803 } else {
804 lastScrollY = window.scrollY;
805 elTarget.classList.add(lpClassName.elFullScreen);
806 document.documentElement.classList.add('lp-full-screen-active');
807 }
808 if (!isFullscreen) {
809 if (!elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`)) {
810 const closeButton = document.createElement('button');
811 closeButton.type = 'button';
812 closeButton.className = lpClassName.elBtnFullScreenClose;
813 closeButton.setAttribute('aria-label', 'Close');
814 closeButton.innerHTML = lpData.i18n.closeButtonFullScreen || 'Close &times;';
815 closeButton.addEventListener('click', e => {
816 e.preventDefault();
817 lpToggleFullscreenView(elTarget);
818 });
819 elTarget.appendChild(closeButton);
820 }
821 } else {
822 const closeButton = elTarget.querySelector(`.${lpClassName.elBtnFullScreenClose}`);
823 if (closeButton) {
824 closeButton.remove();
825 }
826 }
827 };
828 eventHandlers('click', [{
829 selector: lpClassName.elBtnFullScreen,
830 callBack: args => {
831 const {
832 e,
833 target
834 } = args;
835 const elBtnFullScreen = target.closest(lpClassName.elBtnFullScreen);
836 if (!elBtnFullScreen) {
837 console.log('No full screen button found');
838 return;
839 }
840 e.preventDefault();
841 let elTarget = null;
842 const targetSelector = elBtnFullScreen.dataset.targetFullscreen;
843 console.log(targetSelector);
844 if (targetSelector) {
845 elTarget = document.querySelector(targetSelector);
846 }
847 if (!elTarget) {
848 console.log('No target element found');
849 return;
850 }
851 lpToggleFullscreenView(elTarget, elBtnFullScreen);
852 }
853 }]);
854 };
855
856 /***/ },
857
858 /***/ "react"
859 /*!************************!*\
860 !*** external "React" ***!
861 \************************/
862 (module) {
863
864 "use strict";
865 module.exports = window["React"];
866
867 /***/ },
868
869 /***/ "@wordpress/block-editor"
870 /*!*************************************!*\
871 !*** external ["wp","blockEditor"] ***!
872 \*************************************/
873 (module) {
874
875 "use strict";
876 module.exports = window["wp"]["blockEditor"];
877
878 /***/ },
879
880 /***/ "@wordpress/blocks"
881 /*!********************************!*\
882 !*** external ["wp","blocks"] ***!
883 \********************************/
884 (module) {
885
886 "use strict";
887 module.exports = window["wp"]["blocks"];
888
889 /***/ },
890
891 /***/ "@wordpress/components"
892 /*!************************************!*\
893 !*** external ["wp","components"] ***!
894 \************************************/
895 (module) {
896
897 "use strict";
898 module.exports = window["wp"]["components"];
899
900 /***/ },
901
902 /***/ "@wordpress/data"
903 /*!******************************!*\
904 !*** external ["wp","data"] ***!
905 \******************************/
906 (module) {
907
908 "use strict";
909 module.exports = window["wp"]["data"];
910
911 /***/ },
912
913 /***/ "@wordpress/element"
914 /*!*********************************!*\
915 !*** external ["wp","element"] ***!
916 \*********************************/
917 (module) {
918
919 "use strict";
920 module.exports = window["wp"]["element"];
921
922 /***/ },
923
924 /***/ "@wordpress/i18n"
925 /*!******************************!*\
926 !*** external ["wp","i18n"] ***!
927 \******************************/
928 (module) {
929
930 "use strict";
931 module.exports = window["wp"]["i18n"];
932
933 /***/ },
934
935 /***/ "./node_modules/classnames/index.js"
936 /*!******************************************!*\
937 !*** ./node_modules/classnames/index.js ***!
938 \******************************************/
939 (module, exports) {
940
941 var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!
942 Copyright (c) 2018 Jed Watson.
943 Licensed under the MIT License (MIT), see
944 http://jedwatson.github.io/classnames
945 */
946 /* global define */
947
948 (function () {
949 'use strict';
950
951 var hasOwn = {}.hasOwnProperty;
952
953 function classNames () {
954 var classes = '';
955
956 for (var i = 0; i < arguments.length; i++) {
957 var arg = arguments[i];
958 if (arg) {
959 classes = appendClass(classes, parseValue(arg));
960 }
961 }
962
963 return classes;
964 }
965
966 function parseValue (arg) {
967 if (typeof arg === 'string' || typeof arg === 'number') {
968 return arg;
969 }
970
971 if (typeof arg !== 'object') {
972 return '';
973 }
974
975 if (Array.isArray(arg)) {
976 return classNames.apply(null, arg);
977 }
978
979 if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {
980 return arg.toString();
981 }
982
983 var classes = '';
984
985 for (var key in arg) {
986 if (hasOwn.call(arg, key) && arg[key]) {
987 classes = appendClass(classes, key);
988 }
989 }
990
991 return classes;
992 }
993
994 function appendClass (value, newClass) {
995 if (!newClass) {
996 return value;
997 }
998
999 if (value) {
1000 return value + ' ' + newClass;
1001 }
1002
1003 return value + newClass;
1004 }
1005
1006 if ( true && module.exports) {
1007 classNames.default = classNames;
1008 module.exports = classNames;
1009 } else if (true) {
1010 // register as 'classnames', consistent with npm package name
1011 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {
1012 return classNames;
1013 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
1014 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
1015 } else // removed by dead control flow
1016 {}
1017 }());
1018
1019
1020 /***/ },
1021
1022 /***/ "./assets/src/apps/js/blocks/courses/course-item-template/block.json"
1023 /*!***************************************************************************!*\
1024 !*** ./assets/src/apps/js/blocks/courses/course-item-template/block.json ***!
1025 \***************************************************************************/
1026 (module) {
1027
1028 "use strict";
1029 module.exports = /*#__PURE__*/JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":3,"name":"learnpress/course-item-template","title":"Course Item Template","category":"","description":"Course Item Template","textdomain":"learnpress","keywords":["course item","learnpress"],"usesContext":["lpCourseQuery"],"supports":{"align":true},"attributes":{"layout":{"type":"string","default":"list"},"columns":{"type":"number","default":3}},"ancestor":["learnpress/list-courses"]}');
1030
1031 /***/ }
1032
1033 /******/ });
1034 /************************************************************************/
1035 /******/ // The module cache
1036 /******/ var __webpack_module_cache__ = {};
1037 /******/
1038 /******/ // The require function
1039 /******/ function __webpack_require__(moduleId) {
1040 /******/ // Check if module is in cache
1041 /******/ var cachedModule = __webpack_module_cache__[moduleId];
1042 /******/ if (cachedModule !== undefined) {
1043 /******/ return cachedModule.exports;
1044 /******/ }
1045 /******/ // Create a new module (and put it into the cache)
1046 /******/ var module = __webpack_module_cache__[moduleId] = {
1047 /******/ // no module.id needed
1048 /******/ // no module.loaded needed
1049 /******/ exports: {}
1050 /******/ };
1051 /******/
1052 /******/ // Execute the module function
1053 /******/ if (!(moduleId in __webpack_modules__)) {
1054 /******/ delete __webpack_module_cache__[moduleId];
1055 /******/ var e = new Error("Cannot find module '" + moduleId + "'");
1056 /******/ e.code = 'MODULE_NOT_FOUND';
1057 /******/ throw e;
1058 /******/ }
1059 /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
1060 /******/
1061 /******/ // Return the exports of the module
1062 /******/ return module.exports;
1063 /******/ }
1064 /******/
1065 /************************************************************************/
1066 /******/ /* webpack/runtime/compat get default export */
1067 /******/ (() => {
1068 /******/ // getDefaultExport function for compatibility with non-harmony modules
1069 /******/ __webpack_require__.n = (module) => {
1070 /******/ var getter = module && module.__esModule ?
1071 /******/ () => (module['default']) :
1072 /******/ () => (module);
1073 /******/ __webpack_require__.d(getter, { a: getter });
1074 /******/ return getter;
1075 /******/ };
1076 /******/ })();
1077 /******/
1078 /******/ /* webpack/runtime/define property getters */
1079 /******/ (() => {
1080 /******/ // define getter functions for harmony exports
1081 /******/ __webpack_require__.d = (exports, definition) => {
1082 /******/ for(var key in definition) {
1083 /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
1084 /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
1085 /******/ }
1086 /******/ }
1087 /******/ };
1088 /******/ })();
1089 /******/
1090 /******/ /* webpack/runtime/hasOwnProperty shorthand */
1091 /******/ (() => {
1092 /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
1093 /******/ })();
1094 /******/
1095 /******/ /* webpack/runtime/make namespace object */
1096 /******/ (() => {
1097 /******/ // define __esModule on exports
1098 /******/ __webpack_require__.r = (exports) => {
1099 /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
1100 /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
1101 /******/ }
1102 /******/ Object.defineProperty(exports, '__esModule', { value: true });
1103 /******/ };
1104 /******/ })();
1105 /******/
1106 /************************************************************************/
1107 var __webpack_exports__ = {};
1108 // This entry needs to be wrapped in an IIFE because it needs to be in strict mode.
1109 (() => {
1110 "use strict";
1111 /*!*************************************************************************!*\
1112 !*** ./assets/src/apps/js/blocks/courses/course-item-template/index.js ***!
1113 \*************************************************************************/
1114 __webpack_require__.r(__webpack_exports__);
1115 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
1116 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1117 /* harmony import */ var _edit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./edit */ "./assets/src/apps/js/blocks/courses/course-item-template/edit.js");
1118 /* harmony import */ var _save__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./save */ "./assets/src/apps/js/blocks/courses/course-item-template/save.js");
1119 /* harmony import */ var _block_json__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./block.json */ "./assets/src/apps/js/blocks/courses/course-item-template/block.json");
1120 /* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/blocks */ "@wordpress/blocks");
1121 /* harmony import */ var _wordpress_blocks__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_blocks__WEBPACK_IMPORTED_MODULE_4__);
1122
1123 /**
1124 * Register block single course property.
1125 */
1126
1127
1128
1129
1130 (0,_wordpress_blocks__WEBPACK_IMPORTED_MODULE_4__.registerBlockType)('learnpress/course-item-template', {
1131 ..._block_json__WEBPACK_IMPORTED_MODULE_3__,
1132 icon: {
1133 src: (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("svg", {
1134 xmlns: "http://www.w3.org/2000/svg",
1135 viewBox: "0 0 24 24",
1136 width: "24",
1137 height: "24",
1138 "aria-hidden": "true",
1139 focusable: "false"
1140 }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("path", {
1141 fillRule: "evenodd",
1142 d: "M5 5.5h14a.5.5 0 01.5.5v1.5a.5.5 0 01-.5.5H5a.5.5 0 01-.5-.5V6a.5.5 0 01.5-.5zM4 9.232A2 2 0 013 7.5V6a2 2 0 012-2h14a2 2 0 012 2v1.5a2 2 0 01-1 1.732V18a2 2 0 01-2 2H6a2 2 0 01-2-2V9.232zm1.5.268V18a.5.5 0 00.5.5h12a.5.5 0 00.5-.5V9.5h-13z",
1143 clipRule: "evenodd"
1144 }))
1145 },
1146 edit: _edit__WEBPACK_IMPORTED_MODULE_1__["default"],
1147 save: _save__WEBPACK_IMPORTED_MODULE_2__["default"]
1148 });
1149 })();
1150
1151 /******/ })()
1152 ;
1153 //# sourceMappingURL=course-item-template.js.map