PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.1.6.9.2
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.1.6.9.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 / src / apps / js / frontend / courses.js

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

246 lines 6.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 const urlCourses = lpGlobalSettings.courses_url || '';
2 const urlCurrent = document.location.href;
3 let filterCourses = JSON.parse( window.localStorage.getItem( 'lp_filter_courses' ) ) || {};
4 let skeleton;
5 let skeletonClone;
6 let isLoading = false;
7 let firstLoad = 1;
8 let elNoLoadAjaxFirst = null;
9 let elArchive = null;
10
11 if ( lpGlobalSettings.is_course_archive ) {
12 const queryString = window.location.search;
13
14 if ( ! queryString.length && urlCurrent.search( 'page' ) === -1 ) {
15 filterCourses = {};
16 }
17 }
18
19 const lpArchiveAddQueryArgs = ( endpoint, args ) => {
20 const url = new URL( endpoint );
21
22 Object.keys( args ).forEach( ( arg ) => {
23 url.searchParams.set( arg, args[ arg ] );
24 } );
25
26 return url;
27 };
28
29 const lpArchiveCourse = () => {
30 skeleton = document.querySelector( '.lp-archive-course-skeleton' );
31 elNoLoadAjaxFirst = document.querySelector( '.no-first-load-ajax' );
32
33 if ( ! skeleton ) {
34 return;
35 }
36
37 if ( skeleton && ! elNoLoadAjaxFirst ) {
38 lpArchiveRequestCourse( filterCourses );
39 }
40
41 lpArchivePaginationCourse();
42 lpArchiveSearchCourse();
43 };
44
45 window.lpArchiveRequestCourse = ( args, callBackSuccess ) => {
46 const wpRestUrl = lpGlobalSettings.lp_rest_url;
47
48 if ( ! wpRestUrl ) {
49 return;
50 }
51
52 if ( ! skeleton ) {
53 return;
54 }
55
56 const archiveCourse = elArchive && elArchive.querySelector( 'div.lp-archive-courses .lp-content-area' );
57 const listCourse = archiveCourse && archiveCourse.querySelector( 'ul.learn-press-courses' );
58
59 if ( ! listCourse ) {
60 return;
61 }
62
63 if ( isLoading ) {
64 return;
65 }
66
67 isLoading = true;
68
69 if ( ! skeletonClone ) {
70 skeletonClone = skeleton.outerHTML;
71 } else {
72 listCourse.append( skeleton );
73 // return;
74 }
75
76 const urlCourseArchive = lpArchiveAddQueryArgs( wpRestUrl + 'lp/v1/courses/archive-course', { ...lpArchiveSkeleton, ...args } );
77
78 wp.apiFetch( {
79 path: 'lp/v1/courses/archive-course' + urlCourseArchive.search,
80 method: 'GET',
81 } ).then( ( response ) => {
82 if ( typeof response.data.content !== 'undefined' && listCourse ) {
83 listCourse.innerHTML = response.data.content || '';
84 }
85
86 const pagination = response.data.pagination;
87
88 // lpArchiveSearchCourse();
89
90 const paginationEle = document.querySelector( '.learn-press-pagination' );
91 if ( paginationEle ) {
92 paginationEle.remove();
93 }
94
95 if ( typeof pagination !== 'undefined' ) {
96 const paginationHTML = new DOMParser().parseFromString( pagination, 'text/html' );
97 const paginationNewNode = paginationHTML.querySelector( '.learn-press-pagination' );
98 //const paginationInnerHTML = paginationSelector && paginationSelector.innerHTML;
99
100 if ( paginationNewNode ) {
101 listCourse.after( paginationNewNode );
102 lpArchivePaginationCourse();
103 }
104 }
105
106 wp.hooks.doAction( 'lp-js-get-courses', response );
107
108 if ( typeof callBackSuccess === 'function' ) {
109 callBackSuccess( response );
110 }
111 } ).catch( ( error ) => {
112 listCourse.innerHTML += `<div class="lp-ajax-message error" style="display:block">${ error.message || 'Error: Query lp/v1/courses/archive-course' }</div>`;
113 console.log( error );
114 } ).finally( () => {
115 isLoading = false;
116 // skeleton && skeleton.remove();
117
118 jQuery( 'form.search-courses button' ).removeClass( 'loading' );
119
120 if ( ! firstLoad ) {
121 // Scroll to archive element
122 const optionScroll = { behavior: 'smooth' };
123 elArchive.scrollIntoView( optionScroll );
124 } else {
125 firstLoad = 0;
126 }
127
128 // Save filter courses to Storage
129 window.localStorage.setItem( 'lp_filter_courses', JSON.stringify( args ) );
130 // Change url by params filter courses
131 const urlPush = lpArchiveAddQueryArgs( document.location, args );
132 window.history.pushState( '', '', urlPush );
133 } );
134 };
135
136 const lpArchiveSearchCourse = () => {
137 const searchForm = document.querySelectorAll( 'form.search-courses' );
138 const filterCourses = JSON.parse( window.localStorage.getItem( 'lp_filter_courses' ) ) || {};
139
140 searchForm.forEach( ( s ) => {
141 const search = s.querySelector( 'input[name="c_search"]' );
142 const btn = s.querySelector( '[type="submit"]' );
143 let timeOutSearch;
144
145 search.addEventListener( 'keyup', ( event ) => {
146 if ( skeleton ) {
147 skeleton.style.display = 'block';
148 }
149 event.preventDefault();
150
151 const s = event.target.value.trim();
152
153 if ( ! s || ( s && s.length > 2 ) ) {
154 if ( undefined !== timeOutSearch ) {
155 clearTimeout( timeOutSearch );
156 }
157
158 timeOutSearch = setTimeout( function() {
159 btn.classList.add( 'loading' );
160
161 filterCourses.c_search = s;
162 filterCourses.paged = 1;
163
164 lpArchiveRequestCourse( { ...filterCourses } );
165 }, 800 );
166 }
167 } );
168
169 s.addEventListener( 'submit', ( e ) => {
170 e.preventDefault();
171
172 const eleSearch = s.querySelector( 'input[name="c_search"]' );
173 eleSearch && eleSearch.dispatchEvent( new Event( 'keyup' ) );
174 } );
175 } );
176 };
177
178 const lpArchivePaginationCourse = () => {
179 const paginationEle = document.querySelectorAll( '.lp-archive-courses .learn-press-pagination .page-numbers' );
180
181 paginationEle.length > 0 && paginationEle.forEach( ( ele ) => ele.addEventListener( 'click', ( event ) => {
182 event.preventDefault();
183 event.stopPropagation();
184
185 if ( ! elArchive ) {
186 return;
187 }
188
189 if ( skeleton ) {
190 skeleton.style.display = 'block';
191 }
192
193 // Scroll to archive element
194 elArchive.scrollIntoView( { behavior: 'smooth' } );
195
196 let filterCourses = {};
197 filterCourses = JSON.parse( window.localStorage.getItem( 'lp_filter_courses' ) ) || {};
198
199 const urlString = event.currentTarget.getAttribute( 'href' );
200
201 if ( urlString ) {
202 const current = [ ...paginationEle ].filter( ( el ) => el.classList.contains( 'current' ) );
203 const paged = event.currentTarget.textContent || ( ele.classList.contains( 'next' ) && parseInt( current[ 0 ].textContent ) + 1 ) || ( ele.classList.contains( 'prev' ) && parseInt( current[ 0 ].textContent ) - 1 );
204 filterCourses.paged = paged;
205
206 lpArchiveRequestCourse( { ...filterCourses } );
207 }
208 } ) );
209 };
210
211 const lpArchiveGridListCourse = () => {
212 const layout = LP.Cookies.get( 'courses-layout' );
213
214 const switches = document.querySelectorAll( '.lp-courses-bar .switch-layout [name="lp-switch-layout-btn"]' );
215
216 switches.length > 0 && [ ...switches ].map( ( ele ) => ele.value === layout && ( ele.checked = true ) );
217 };
218
219 const lpArchiveGridListCourseHandle = () => {
220 const gridList = document.querySelectorAll( '.lp-archive-courses input[name="lp-switch-layout-btn"]' );
221
222 gridList.length > 0 && gridList.forEach( ( element ) => element.addEventListener( 'change', ( e ) => {
223 e.preventDefault();
224
225 const layout = e.target.value;
226
227 if ( layout ) {
228 const dataLayout = document.querySelector( '.lp-archive-courses .learn-press-courses[data-layout]' );
229
230 dataLayout && ( dataLayout.dataset.layout = layout );
231 LP.Cookies.set( 'courses-layout', layout );
232 }
233 } ) );
234 };
235
236 function LPArchiveCourseInit() {
237 elArchive = document.querySelector( '.lp-archive-courses' );
238 lpArchiveCourse();
239 lpArchiveGridListCourseHandle();
240 lpArchiveGridListCourse();
241 }
242
243 document.addEventListener( 'DOMContentLoaded', function( event ) {
244 LPArchiveCourseInit();
245 } );
246