PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / trunk
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses vtrunk
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 4.2.1 All 138 releases
learnpress / assets / src / js / elementor / courses.js

courses.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses trunk, at assets/src/js/elementor/courses.js

414 lines 12.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { lpAddQueryArgs, lpFetchAPI, lpGetCurrentURLNoParam } from '../../apps/js/utils/utils';
2 import Cookie from '../utils/cookie';
3
4 window.lpElWidgetCoursesByPage = ( () => {
5 const classCoursesWrapper = 'list-courses-elm-wrapper';
6 const classListCourse = 'list-courses-elm';
7 const classPaginationCourse = 'learn-press-pagination';
8 const classCoursesPageResult = 'courses-page-result';
9 const classSkeleton = 'lp-skeleton-animation';
10 let filterCourses = {};
11 const currentUrl = lpGetCurrentURLNoParam();
12 let urlAPI;
13 let typePagination = 'number';
14 let firstLoad = true;
15 let timeOutSearch;
16 let isLoadingInfinite = false;
17 const isLoadRest = false;
18 const fetchAPI = ( args, callBack = {} ) => {
19 //console.log( 'Fetch API Courses' );
20 const paramsFetch = {
21 method: 'POST',
22 body: JSON.stringify( args ),
23 headers: {
24 'Content-Type': 'application/json', // Set the content type to JSON
25 },
26 };
27
28 if ( 'undefined' !== typeof args.nonce ) {
29 paramsFetch.headers[ 'X-WP-Nonce' ] = args.nonce;
30 }
31
32 lpFetchAPI( urlAPI + 'lp/v1/courses/courses-widget-by-page', paramsFetch, callBack );
33 };
34 const callBackFilter = ( elCoursesWrapper ) => {
35 if ( ! elCoursesWrapper ) {
36 return;
37 }
38 const skeleton = elCoursesWrapper.querySelector( `.${ classSkeleton }` );
39 const elListCourse = elCoursesWrapper.querySelector( `.${ classListCourse }` );
40 const elPagination = elCoursesWrapper.querySelector( `.${ classPaginationCourse }` );
41 const elCoursesPageResult = elCoursesWrapper.querySelector( `.${ classCoursesPageResult }` );
42
43 return {
44 before: () => {
45
46 },
47 success: ( res ) => {
48 const divTmp = document.createElement( 'div' );
49 divTmp.innerHTML = res.data.content || '';
50 const elListCourseTmp = divTmp.querySelector( `.${ classListCourse }` );
51 const elPaginationTmp = divTmp.querySelector( `.${ classPaginationCourse }` );
52 const elCoursesPageResultTmp = divTmp.querySelector( `.${ classCoursesPageResult }` );
53
54 if ( elListCourse ) {
55 elListCourse.innerHTML = elListCourseTmp.innerHTML;
56
57 if ( elPagination ) {
58 elPagination.innerHTML = elPaginationTmp.innerHTML;
59 }
60
61 if ( elCoursesPageResult ) {
62 elCoursesPageResult.innerHTML = elCoursesPageResultTmp.innerHTML;
63 }
64
65 // Scroll to el
66 const optionScroll = { behavior: 'smooth' };
67 elListCourse.scrollIntoView( optionScroll );
68 } else {
69 elCoursesWrapper.insertAdjacentHTML( 'beforeend', res.data.content || '' );
70 }
71
72 if ( res.data.pagination ) {
73 elCoursesWrapper.insertAdjacentHTML( 'beforeend', res.data.pagination || '' );
74 }
75 },
76 error: ( error ) => {
77
78 },
79 completed: () => {
80 if ( skeleton ) {
81 skeleton.style.display = 'none';
82 }
83 },
84 };
85 };
86 const callBackPaginationTypeLoadMore = ( elCoursesWrapper ) => {
87 const btnLoadMore = elCoursesWrapper.querySelector( '.courses-btn-load-more' );
88 let elLoading;
89 if ( btnLoadMore ) {
90 elLoading = btnLoadMore.querySelector( '.lp-loading-circle' );
91 }
92 const skeleton = elCoursesWrapper.querySelector( `.${ classSkeleton }` );
93 const elListCourse = elCoursesWrapper.querySelector( `.${ classListCourse }` );
94
95 return {
96 before: () => {
97 if ( btnLoadMore ) {
98 elLoading.classList.remove( 'hide' );
99 btnLoadMore.setAttribute( 'disabled', 'disabled' );
100 }
101 },
102 success: ( res ) => {
103 const divTmp = document.createElement( 'div' );
104 divTmp.innerHTML = res.data.content || '';
105 const elListCourseTmp = divTmp.querySelector( `.${ classListCourse }` );
106 const elPaginationTmp = divTmp.querySelector( `.${ classPaginationCourse }` );
107
108 if ( elListCourse ) {
109 elListCourse.insertAdjacentHTML( 'beforeend', elListCourseTmp.innerHTML );
110 if ( ! elPaginationTmp ) {
111 btnLoadMore.remove();
112 }
113 } else {
114 elCoursesWrapper.insertAdjacentHTML( 'beforeend', res.data.content || '' );
115 }
116
117 if ( res.data.pagination ) {
118 elCoursesWrapper.insertAdjacentHTML( 'beforeend', res.data.pagination || '' );
119 }
120 },
121 error: ( error ) => {
122
123 },
124 completed: () => {
125 if ( skeleton ) {
126 skeleton.style.display = 'none';
127 }
128 if ( btnLoadMore ) {
129 elLoading.classList.add( 'hide' );
130 btnLoadMore.removeAttribute( 'disabled' );
131 }
132 },
133 };
134 };
135 const callBackPaginationTypeInfinite = ( elCoursesWrapper ) => {
136 const skeleton = elCoursesWrapper.querySelector( `.${ classSkeleton }` );
137 const elInfinite = elCoursesWrapper.querySelector( '.courses-load-infinite' );
138 let loading;
139 if ( elInfinite ) {
140 loading = elInfinite.querySelector( '.lp-loading-circle' );
141 }
142 const elListCourse = elCoursesWrapper.querySelector( `.${ classListCourse }` );
143
144 return {
145 before: () => {
146 isLoadingInfinite = true;
147 if ( loading ) {
148 loading.classList.remove( 'hide' );
149 }
150 },
151 success: ( res ) => {
152 const divTmp = document.createElement( 'div' );
153 divTmp.innerHTML = res.data.content || '';
154 const elListCourseTmp = divTmp.querySelector( `.${ classListCourse }` );
155 const elPaginationTmp = divTmp.querySelector( `.${ classPaginationCourse }` );
156
157 if ( elListCourse ) {
158 elListCourse.insertAdjacentHTML( 'beforeend', elListCourseTmp.innerHTML );
159 if ( ! elPaginationTmp ) {
160 elInfinite.remove();
161 }
162 } else {
163 elCoursesWrapper.insertAdjacentHTML( 'beforeend', res.data.content || '' );
164 }
165
166 if ( res.data.pagination ) {
167 elCoursesWrapper.insertAdjacentHTML( 'beforeend', res.data.pagination || '' );
168 }
169 },
170 error: ( error ) => {
171
172 },
173 completed: () => {
174 isLoadingInfinite = false;
175 if ( skeleton ) {
176 skeleton.style.display = 'none';
177 }
178 if ( elInfinite ) {
179 loading.classList.add( 'hide' );
180 }
181 },
182 };
183 };
184 const callApiCoursesOfWidget = ( elCoursesWrapper, args = {} ) => {
185 console.log( '/*** loadApiCoursesOfWidget ***/' );
186 const idWidget = elCoursesWrapper.dataset.widgetId;
187 let settingsWidget = window[ `lpWidget_${ idWidget }` ];
188
189 if ( ! settingsWidget ) {
190 return;
191 }
192 if ( 'yes' !== settingsWidget.courses_rest ) {
193 return;
194 }
195 if ( 'yes' === settingsWidget.courses_rest_no_load_page && firstLoad ) {
196 firstLoad = false;
197 return;
198 }
199
200 settingsWidget = { ...settingsWidget, ...args };
201
202 urlAPI = settingsWidget.lp_rest_url ?? '';
203 typePagination = settingsWidget.courses_rest_pagination_type ?? 'number';
204
205 let callBack;
206 switch ( typePagination ) {
207 case 'load-more':
208 callBack = callBackPaginationTypeLoadMore( elCoursesWrapper );
209 break;
210 case 'infinite':
211 callBack = callBackPaginationTypeInfinite( elCoursesWrapper );
212 break;
213 default: // number
214 callBack = callBackFilter( elCoursesWrapper );
215 break;
216 }
217
218 if ( ! callBack ) {
219 return;
220 }
221
222 fetchAPI( settingsWidget, callBack );
223 };
224 const findAllWidgetCoursesByPage = () => {
225 const elCoursesWrappers = document.querySelectorAll( `.${ classCoursesWrapper }` );
226 if ( ! elCoursesWrappers ) {
227 return;
228 }
229
230 elCoursesWrappers.forEach( ( el ) => {
231 callApiCoursesOfWidget( el );
232 } );
233 };
234 const onChangeSortBy = ( e, target ) => {
235 if ( ! target.classList.contains( 'courses-order-by' ) ) {
236 return;
237 }
238 const elCoursesWrapper = target.closest( `.${ classCoursesWrapper }` );
239 if ( ! elCoursesWrapper ) {
240 return;
241 }
242
243 e.preventDefault();
244 const idWidget = elCoursesWrapper.dataset.widgetId;
245 const settingsWidget = window[ `lpWidget_${ idWidget }` ];
246 filterCourses.order_by = target.value;
247 filterCourses.paged = 1;
248
249 if ( 'yes' !== settingsWidget.courses_rest ) {
250 window.location.href = lpAddQueryArgs( currentUrl, filterCourses );
251 } else {
252 callApiCoursesOfWidget( elCoursesWrapper, filterCourses );
253 }
254 };
255 const onChangeLayout = ( e, target ) => {
256 if ( ! target.classList.contains( 'courses-layout' ) ) {
257 if ( ! target.closest( '.courses-layout' ) ) {
258 return;
259 }
260 target = target.closest( '.courses-layout' );
261 }
262 const elCoursesWrapper = target.closest( `.${ classCoursesWrapper }` );
263 if ( ! elCoursesWrapper ) {
264 return;
265 }
266 e.preventDefault();
267 const elListCourse = elCoursesWrapper.querySelector( `.${ classListCourse }` );
268 const elUlLayouts = target.closest( '.courses-layouts-display-list' );
269 const widgetId = elCoursesWrapper.dataset.widgetId;
270 const elLayouts = elUlLayouts.querySelectorAll( 'li' );
271 elLayouts.forEach( ( el ) => {
272 el.classList.remove( 'active' );
273 } );
274 const layout = target.dataset.layout;
275 target.classList.add( 'active' );
276 elListCourse.classList.remove( 'grid', 'list' );
277 elListCourse.classList.add( layout );
278 Cookie.set( `layout_widget_${ widgetId }`, layout, 7 );
279 };
280 const events = () => {
281 document.addEventListener( 'change', function( e ) {
282 const target = e.target;
283
284 onChangeSortBy( e, target );
285 } );
286 document.addEventListener( 'click', function( e ) {
287 const target = e.target;
288
289 clickLoadMore( e, target );
290 clickNumberPage( e, target );
291 onChangeLayout( e, target );
292 } );
293 document.addEventListener( 'scroll', function( e ) {
294 const target = e.target;
295
296 scrollInfinite( e, target );
297 } );
298 document.addEventListener( 'keyup', function( e ) {
299 const target = e.target;
300
301 //window.lpCourseList.searchCourse( e, target );
302 } );
303 document.addEventListener( 'submit', function( e ) {
304 const target = e.target;
305
306 //window.lpCourseList.searchCourse( e, target );
307 } );
308 };
309 const clickNumberPage = ( e, target ) => {
310 if ( ! target.classList.contains( 'page-numbers' ) ) {
311 if ( ! target.closest( '.page-numbers' ) ) {
312 return;
313 }
314 target = target.closest( '.page-numbers' );
315 }
316 const elCoursesWrapper = target.closest( `.${ classCoursesWrapper }` );
317 if ( ! elCoursesWrapper ) {
318 return;
319 }
320 const idWidget = elCoursesWrapper.dataset.widgetId;
321 const settingsWidget = window[ `lpWidget_${ idWidget }` ];
322 if ( ! settingsWidget || 'yes' !== settingsWidget.courses_rest ) {
323 return;
324 }
325
326 e.preventDefault();
327 const pageCurrent = filterCourses.paged;
328 if ( target.classList.contains( 'prev' ) ) {
329 filterCourses.paged = pageCurrent - 1;
330 } else if ( target.classList.contains( 'next' ) ) {
331 filterCourses.paged = pageCurrent + 1;
332 } else {
333 filterCourses.paged = parseInt( target.textContent );
334 }
335
336 callApiCoursesOfWidget( elCoursesWrapper, filterCourses );
337 };
338 const clickLoadMore = ( e, target ) => {
339 if ( ! target.classList.contains( 'courses-btn-load-more' ) ) {
340 if ( ! target.closest( '.courses-btn-load-more' ) ) {
341 return;
342 }
343 target = target.closest( '.courses-btn-load-more' );
344 }
345 const elCoursesWrapper = target.closest( `.${ classCoursesWrapper }` );
346 if ( ! elCoursesWrapper ) {
347 return;
348 }
349 const idWidget = elCoursesWrapper.dataset.widgetId;
350 const settingsWidget = window[ `lpWidget_${ idWidget }` ];
351 if ( ! settingsWidget || 'yes' !== settingsWidget.courses_rest ) {
352 return;
353 }
354
355 e.preventDefault();
356 ++filterCourses.paged;
357
358 callApiCoursesOfWidget( elCoursesWrapper, filterCourses );
359 };
360 const scrollInfinite = ( e, target ) => {
361 const elCoursesWrapper = document.querySelector( `.${ classCoursesWrapper }` );
362 if ( ! elCoursesWrapper ) {
363 return;
364 }
365 const elInfinite = elCoursesWrapper.querySelector( '.courses-load-infinite' );
366 if ( ! elInfinite ) {
367 return;
368 }
369 const idWidget = elCoursesWrapper.dataset.widgetId;
370 const settingsWidget = window[ `lpWidget_${ idWidget }` ];
371 if ( ! settingsWidget || 'yes' !== settingsWidget.courses_rest ) {
372 return;
373 }
374
375 // Create an IntersectionObserver object.
376 const observer = new IntersectionObserver( function( entries ) {
377 for ( const entry of entries ) {
378 // If the entry is intersecting, load the image.
379 if ( entry.isIntersecting ) {
380 if ( isLoadingInfinite ) {
381 return;
382 }
383
384 ++filterCourses.paged;
385 callApiCoursesOfWidget( elCoursesWrapper, filterCourses );
386 observer.unobserve( entry.target );
387 }
388 }
389 } );
390
391 observer.observe( elInfinite );
392 };
393 return {
394 init: () => {
395 const urlParams = {};
396 const urlQueryString = window.location.search;
397 const urlSearchParams = new URLSearchParams( urlQueryString );
398 for ( const [ key, val ] of urlSearchParams.entries() ) {
399 urlParams[ key ] = val;
400 }
401
402 //filterCourses = { ...lpArchiveSkeletonParam, ...urlParams };
403 filterCourses = { ...urlParams };
404 filterCourses.paged = parseInt( filterCourses.paged || 1 );
405 findAllWidgetCoursesByPage();
406 events();
407 },
408 };
409 } )();
410
411 document.addEventListener( 'DOMContentLoaded', function() {
412 window.lpElWidgetCoursesByPage.init();
413 } );
414