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

245 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 } ).finally( () => {
114 isLoading = false;
115 // skeleton && skeleton.remove();
116
117 jQuery( 'form.search-courses button' ).removeClass( 'loading' );
118
119 if ( ! firstLoad ) {
120 // Scroll to archive element
121 const optionScroll = { behavior: 'smooth' };
122 elArchive.scrollIntoView( optionScroll );
123 } else {
124 firstLoad = 0;
125 }
126
127 // Save filter courses to Storage
128 window.localStorage.setItem( 'lp_filter_courses', JSON.stringify( args ) );
129 // Change url by params filter courses
130 const urlPush = lpArchiveAddQueryArgs( document.location, args );
131 window.history.pushState( '', '', urlPush );
132 } );
133 };
134
135 const lpArchiveSearchCourse = () => {
136 const searchForm = document.querySelectorAll( 'form.search-courses' );
137 const filterCourses = JSON.parse( window.localStorage.getItem( 'lp_filter_courses' ) ) || {};
138
139 searchForm.forEach( ( s ) => {
140 const search = s.querySelector( 'input[name="c_search"]' );
141 const btn = s.querySelector( '[type="submit"]' );
142 let timeOutSearch;
143
144 search.addEventListener( 'keyup', ( event ) => {
145 if ( skeleton ) {
146 skeleton.style.display = 'block';
147 }
148 event.preventDefault();
149
150 const s = event.target.value.trim();
151
152 if ( ! s || ( s && s.length > 2 ) ) {
153 if ( undefined !== timeOutSearch ) {
154 clearTimeout( timeOutSearch );
155 }
156
157 timeOutSearch = setTimeout( function() {
158 btn.classList.add( 'loading' );
159
160 filterCourses.c_search = s;
161 filterCourses.paged = 1;
162
163 lpArchiveRequestCourse( { ...filterCourses } );
164 }, 800 );
165 }
166 } );
167
168 s.addEventListener( 'submit', ( e ) => {
169 e.preventDefault();
170
171 const eleSearch = s.querySelector( 'input[name="c_search"]' );
172 eleSearch && eleSearch.dispatchEvent( new Event( 'keyup' ) );
173 } );
174 } );
175 };
176
177 const lpArchivePaginationCourse = () => {
178 const paginationEle = document.querySelectorAll( '.lp-archive-courses .learn-press-pagination .page-numbers' );
179
180 paginationEle.length > 0 && paginationEle.forEach( ( ele ) => ele.addEventListener( 'click', ( event ) => {
181 event.preventDefault();
182 event.stopPropagation();
183
184 if ( ! elArchive ) {
185 return;
186 }
187
188 if ( skeleton ) {
189 skeleton.style.display = 'block';
190 }
191
192 // Scroll to archive element
193 elArchive.scrollIntoView( { behavior: 'smooth' } );
194
195 let filterCourses = {};
196 filterCourses = JSON.parse( window.localStorage.getItem( 'lp_filter_courses' ) ) || {};
197
198 const urlString = event.currentTarget.getAttribute( 'href' );
199
200 if ( urlString ) {
201 const current = [ ...paginationEle ].filter( ( el ) => el.classList.contains( 'current' ) );
202 const paged = event.currentTarget.textContent || ( ele.classList.contains( 'next' ) && parseInt( current[ 0 ].textContent ) + 1 ) || ( ele.classList.contains( 'prev' ) && parseInt( current[ 0 ].textContent ) - 1 );
203 filterCourses.paged = paged;
204
205 lpArchiveRequestCourse( { ...filterCourses } );
206 }
207 } ) );
208 };
209
210 const lpArchiveGridListCourse = () => {
211 const layout = LP.Cookies.get( 'courses-layout' );
212
213 const switches = document.querySelectorAll( '.lp-courses-bar .switch-layout [name="lp-switch-layout-btn"]' );
214
215 switches.length > 0 && [ ...switches ].map( ( ele ) => ele.value === layout && ( ele.checked = true ) );
216 };
217
218 const lpArchiveGridListCourseHandle = () => {
219 const gridList = document.querySelectorAll( '.lp-archive-courses input[name="lp-switch-layout-btn"]' );
220
221 gridList.length > 0 && gridList.forEach( ( element ) => element.addEventListener( 'change', ( e ) => {
222 e.preventDefault();
223
224 const layout = e.target.value;
225
226 if ( layout ) {
227 const dataLayout = document.querySelector( '.lp-archive-courses .learn-press-courses[data-layout]' );
228
229 dataLayout && ( dataLayout.dataset.layout = layout );
230 LP.Cookies.set( 'courses-layout', layout );
231 }
232 } ) );
233 };
234
235 function LPArchiveCourseInit() {
236 elArchive = document.querySelector( '.lp-archive-courses' );
237 lpArchiveCourse();
238 lpArchiveGridListCourseHandle();
239 lpArchiveGridListCourse();
240 }
241
242 document.addEventListener( 'DOMContentLoaded', function( event ) {
243 LPArchiveCourseInit();
244 } );
245