PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.1
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 / lpPopupSelectItemToAdd.js

lpPopupSelectItemToAdd.js in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.1, at assets/src/js/lpPopupSelectItemToAdd.js

476 lines 13.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * LearnPress Popup Select Item
3 *
4 * Handles load(search) item from API, show in popup and select item.
5 */
6
7 import * as lpUtils from 'lpAssetsJsPath/utils.js';
8 import * as lpToastify from 'lpAssetsJsPath/lpToastify.js';
9 import SweetAlert from 'sweetalert2';
10
11 let itemsSelectedData = [];
12 let elPopup;
13 let timeSearchTitleItem;
14
15 export class LpPopupSelectItemToAdd {
16 constructor() {
17 this.init();
18 }
19
20 static selectors = {
21 elBtnShowPopupItemsToSelect: '.lp-btn-show-popup-items-to-select',
22 elBtnAddItemsSelected: '.lp-btn-add-items-selected',
23 elBtnCountItemsSelected: '.lp-btn-count-items-selected',
24 elHeaderCountItemSelected: '.header-count-items-selected',
25 elSelectItem: '.lp-select-item',
26 elListItems: '.list-items',
27 elPopupItemsToSelect: '.lp-popup-items-to-select',
28 elSearchTitleItem: '.lp-search-title-item',
29 elBtnBackListItems: '.lp-btn-back-to-select-items',
30 elListItemsWrap: '.list-items-wrap',
31 elListItemsSelected: '.list-items-selected',
32 elItemSelectedClone: '.li-item-selected.clone',
33 elItemSelected: '.li-item-selected',
34 LPTarget: '.lp-target',
35 };
36
37 init() {
38 this.events();
39 }
40
41 events = () => {
42 if ( LpPopupSelectItemToAdd._loadedEvents ) {
43 return;
44 }
45 LpPopupSelectItemToAdd._loadedEvents = true;
46
47 lpUtils.eventHandlers( 'click', [
48 {
49 selector:
50 LpPopupSelectItemToAdd.selectors
51 .elBtnShowPopupItemsToSelect,
52 callBack: this.showPopupItemsToSelect.name,
53 class: this,
54 },
55 {
56 selector: LpPopupSelectItemToAdd.selectors.elSelectItem,
57 callBack: this.selectItemsFromList.name,
58 class: this,
59 },
60 {
61 selector:
62 LpPopupSelectItemToAdd.selectors.elBtnCountItemsSelected,
63 callBack: this.showItemsSelected.name,
64 class: this,
65 },
66 {
67 selector: LpPopupSelectItemToAdd.selectors.elBtnBackListItems,
68 callBack: this.backToSelectItems.name,
69 class: this,
70 },
71 {
72 selector: LpPopupSelectItemToAdd.selectors.elItemSelected,
73 callBack: this.removeItemSelected.name,
74 class: this,
75 },
76 {
77 selector: '.tabs .tab',
78 callBack: this.chooseTabItemsType.name,
79 class: this,
80 },
81 ] );
82
83 lpUtils.eventHandlers( 'keyup', [
84 {
85 selector: LpPopupSelectItemToAdd.selectors.elSearchTitleItem,
86 callBack: this.searchTitleItemToSelect.name,
87 class: this,
88 },
89 ] );
90 };
91
92 // Show popup items to select
93 showPopupItemsToSelect = ( args ) => {
94 const { e, target = false, callBack } = args;
95 const elBtnShowPopupItemsToSelect = target.closest(
96 `${ LpPopupSelectItemToAdd.selectors.elBtnShowPopupItemsToSelect }`
97 );
98 if ( ! elBtnShowPopupItemsToSelect ) {
99 return;
100 }
101
102 // Reset items selected data when opening popup
103 itemsSelectedData = [];
104
105 const templateId = target.dataset.template || '';
106 const modalTemplate = document.querySelector( templateId );
107
108 SweetAlert.fire( {
109 html: modalTemplate.innerHTML,
110 showConfirmButton: false,
111 showCloseButton: true,
112 width: '60%',
113 customClass: {
114 popup: 'lp-select-items-popup',
115 htmlContainer: 'lp-select-items-html-container',
116 container: 'lp-select-items-container',
117 },
118 willOpen: () => {
119 elPopup = SweetAlert.getPopup();
120
121 const elLPTarget = elPopup.querySelector(
122 `${ LpPopupSelectItemToAdd.selectors.LPTarget }`
123 );
124 if ( elLPTarget ) {
125 const dataSend =
126 window.lpAJAXG.getDataSetCurrent( elLPTarget );
127 dataSend.args.paged = 1;
128 dataSend.args.item_selecting = itemsSelectedData || [];
129 window.lpAJAXG.setDataSetCurrent( elLPTarget, dataSend );
130
131 window.lpAJAXG.fetchAJAX( dataSend, {
132 success: ( response ) => {
133 const { data } = response;
134 const elSkeleton = elPopup.querySelector(
135 '.lp-skeleton-animation'
136 );
137 elSkeleton.remove();
138 elLPTarget.innerHTML = data.content || '';
139
140 this.watchItemsSelectedDataChange();
141 },
142 } );
143 }
144 },
145 } ).then( ( result ) => {
146 if ( result.isDismissed ) {
147 }
148 } );
149 };
150
151 // Choose tab items type
152 chooseTabItemsType = ( args ) => {
153 const { e, target, callBack } = args;
154 const elTabType = target.closest( '.tab' );
155 if ( ! elTabType ) {
156 return;
157 }
158 e.preventDefault();
159
160 const elTabs = elTabType.closest( '.tabs' );
161 if ( ! elTabs ) {
162 return;
163 }
164
165 const elSelectItemsToAdd = elTabs.closest(
166 `${ LpPopupSelectItemToAdd.selectors.elPopupItemsToSelect }`
167 );
168 const elInputSearch = elSelectItemsToAdd.querySelector(
169 `${ LpPopupSelectItemToAdd.selectors.elSearchTitleItem }`
170 );
171
172 const itemType = elTabType.dataset.type;
173 const elTabLis = elTabs.querySelectorAll( '.tab' );
174 elTabLis.forEach( ( elTabLi ) => {
175 if ( elTabLi.classList.contains( 'active' ) ) {
176 elTabLi.classList.remove( 'active' );
177 }
178 } );
179 elTabType.classList.add( 'active' );
180 // Reset search input
181 elInputSearch.value = '';
182
183 const elLPTarget = elSelectItemsToAdd.querySelector(
184 `${ LpPopupSelectItemToAdd.selectors.LPTarget }`
185 );
186
187 const dataSend = window.lpAJAXG.getDataSetCurrent( elLPTarget );
188 dataSend.args.item_type = itemType;
189 dataSend.args.paged = 1;
190 dataSend.args.item_selecting = itemsSelectedData || [];
191 window.lpAJAXG.setDataSetCurrent( elLPTarget, dataSend );
192
193 window.lpAJAXG.showHideLoading( elLPTarget, 1 );
194
195 window.lpAJAXG.fetchAJAX( dataSend, {
196 success: ( response ) => {
197 const { data } = response;
198 elLPTarget.innerHTML = data.content || '';
199 },
200 error: ( error ) => {
201 lpToastify.show( error, 'error' );
202 },
203 completed: () => {
204 window.lpAJAXG.showHideLoading( elLPTarget, 0 );
205 this.watchItemsSelectedDataChange();
206 },
207 } );
208 };
209
210 // Choice items to add list items selected before adding to section
211 selectItemsFromList = ( args ) => {
212 const { e, target } = args;
213 const elItemAttend = target.closest(
214 `${ LpPopupSelectItemToAdd.selectors.elSelectItem }`
215 );
216 if ( ! elItemAttend ) {
217 return;
218 }
219
220 const elInput = elItemAttend.querySelector( 'input[type="checkbox"]' );
221 if ( target.tagName !== 'INPUT' ) {
222 elInput.click();
223 return;
224 }
225
226 const elUl = elItemAttend.closest(
227 `${ LpPopupSelectItemToAdd.selectors.elListItems }`
228 );
229 if ( ! elUl ) {
230 return;
231 }
232
233 const itemSelected = { ...elInput.dataset };
234 //console.log( 'itemSelected', itemSelected );
235
236 if ( elInput.checked ) {
237 const exists = itemsSelectedData.some(
238 ( item ) => item.id === itemSelected.id
239 );
240 if ( ! exists ) {
241 itemsSelectedData.push( itemSelected );
242 }
243 } else {
244 const index = itemsSelectedData.findIndex(
245 ( item ) => item.id === itemSelected.id
246 );
247 if ( index !== -1 ) {
248 itemsSelectedData.splice( index, 1 );
249 }
250 }
251
252 this.watchItemsSelectedDataChange();
253 };
254
255 // Search title item
256 searchTitleItemToSelect = ( args ) => {
257 const { e, target } = args;
258 const elInputSearch = target.closest(
259 LpPopupSelectItemToAdd.selectors.elSearchTitleItem
260 );
261 if ( ! elInputSearch ) {
262 return;
263 }
264
265 const elLPTarget = elPopup.querySelector(
266 `${ LpPopupSelectItemToAdd.selectors.LPTarget }`
267 );
268
269 clearTimeout( timeSearchTitleItem );
270
271 timeSearchTitleItem = setTimeout( () => {
272 const dataSet = window.lpAJAXG.getDataSetCurrent( elLPTarget );
273 dataSet.args.search_title = elInputSearch.value.trim();
274 dataSet.args.item_selecting = itemsSelectedData;
275 dataSet.args.paged = 1;
276 window.lpAJAXG.setDataSetCurrent( elLPTarget, dataSet );
277
278 // Show loading
279 window.lpAJAXG.showHideLoading( elLPTarget, 1 );
280
281 window.lpAJAXG.fetchAJAX( dataSet, {
282 success: ( response ) => {
283 const { data } = response;
284 elLPTarget.innerHTML = data.content || '';
285 },
286 error: ( error ) => {
287 lpToastify.show( error, 'error' );
288 },
289 completed: () => {
290 window.lpAJAXG.showHideLoading( elLPTarget, 0 );
291 },
292 } );
293 }, 800 );
294 };
295
296 // Show list of items, to choose items to add to section
297 showItemsSelected = ( args ) => {
298 const { e, target } = args;
299 const elBtnCountItemsSelected = target.closest(
300 `${ LpPopupSelectItemToAdd.selectors.elBtnCountItemsSelected }`
301 );
302 if ( ! elBtnCountItemsSelected ) {
303 return;
304 }
305
306 const elBtnBack = elPopup.querySelector(
307 `${ LpPopupSelectItemToAdd.selectors.elBtnBackListItems }`
308 );
309 const elTabs = elPopup.querySelector( '.tabs' );
310 const elListItemsWrap = elPopup.querySelector(
311 `${ LpPopupSelectItemToAdd.selectors.elListItemsWrap }`
312 );
313 const elHeaderItemsSelected = elPopup.querySelector(
314 `${ LpPopupSelectItemToAdd.selectors.elHeaderCountItemSelected }`
315 );
316 const elListItemsSelected = elPopup.querySelector(
317 `${ LpPopupSelectItemToAdd.selectors.elListItemsSelected }`
318 );
319 const elItemClone = elListItemsSelected.querySelector(
320 `${ LpPopupSelectItemToAdd.selectors.elItemSelectedClone }`
321 );
322 elHeaderItemsSelected.innerHTML = elBtnCountItemsSelected.innerHTML;
323
324 lpUtils.lpShowHideEl( elListItemsWrap, 0 );
325 lpUtils.lpShowHideEl( elBtnCountItemsSelected, 0 );
326 lpUtils.lpShowHideEl( elTabs, 0 );
327 lpUtils.lpShowHideEl( elBtnBack, 1 );
328 lpUtils.lpShowHideEl( elHeaderItemsSelected, 1 );
329 lpUtils.lpShowHideEl( elListItemsSelected, 1 );
330
331 elListItemsSelected
332 .querySelectorAll(
333 `${ LpPopupSelectItemToAdd.selectors.elItemSelected }:not(.clone)`
334 )
335 .forEach( ( elItem ) => {
336 elItem.remove();
337 } );
338 itemsSelectedData.forEach( ( item ) => {
339 const elItemSelected = elItemClone.cloneNode( true );
340 elItemSelected.classList.remove( 'clone' );
341 Object.entries( item ).forEach( ( [ key, value ] ) => {
342 elItemSelected.dataset[ key ] = value;
343 } );
344 const elTitleDisplay =
345 elItemSelected.querySelector( '.title-display' );
346 elTitleDisplay.innerHTML = item.title;
347
348 lpUtils.lpShowHideEl( elItemSelected, 1 );
349
350 elItemClone.insertAdjacentElement( 'beforebegin', elItemSelected );
351 } );
352 };
353
354 // Back to list of items
355 backToSelectItems = ( args ) => {
356 const { e, target } = args;
357 const elBtnBack = target.closest(
358 `${ LpPopupSelectItemToAdd.selectors.elBtnBackListItems }`
359 );
360 if ( ! elBtnBack ) {
361 return;
362 }
363
364 const elBtnCountItemsSelected = elPopup.querySelector(
365 `${ LpPopupSelectItemToAdd.selectors.elBtnCountItemsSelected }`
366 );
367 const elTabs = elPopup.querySelector( '.tabs' );
368 const elListItemsWrap = elPopup.querySelector(
369 `${ LpPopupSelectItemToAdd.selectors.elListItemsWrap }`
370 );
371 const elHeaderCountItemSelected = elPopup.querySelector(
372 `${ LpPopupSelectItemToAdd.selectors.elHeaderCountItemSelected }`
373 );
374 const elListItemsSelected = elPopup.querySelector(
375 `${ LpPopupSelectItemToAdd.selectors.elListItemsSelected }`
376 );
377 lpUtils.lpShowHideEl( elBtnCountItemsSelected, 1 );
378 lpUtils.lpShowHideEl( elListItemsWrap, 1 );
379 lpUtils.lpShowHideEl( elTabs, 1 );
380 lpUtils.lpShowHideEl( elBtnBack, 0 );
381 lpUtils.lpShowHideEl( elHeaderCountItemSelected, 0 );
382 lpUtils.lpShowHideEl( elListItemsSelected, 0 );
383 };
384
385 // Remove item selected from list items selected
386 removeItemSelected = ( args ) => {
387 const { e, target } = args;
388 const elRemoveItemSelected = target.closest(
389 `${ LpPopupSelectItemToAdd.selectors.elItemSelected }`
390 );
391 if ( ! elRemoveItemSelected ) {
392 return;
393 }
394
395 const itemRemove = elRemoveItemSelected.dataset;
396 const index = itemsSelectedData.findIndex(
397 ( item ) => item.id === itemRemove.id
398 );
399 if ( index !== -1 ) {
400 itemsSelectedData.splice( index, 1 );
401 }
402
403 elRemoveItemSelected.remove();
404
405 this.watchItemsSelectedDataChange();
406 };
407
408 // Watch items selected when data change
409 watchItemsSelectedDataChange = () => {
410 // Update count items selected, disable/enable buttons
411 const elBtnAddItemsSelected = elPopup.querySelector(
412 `${ LpPopupSelectItemToAdd.selectors.elBtnAddItemsSelected }`
413 );
414 const elBtnCountItemsSelected = elPopup.querySelector(
415 `${ LpPopupSelectItemToAdd.selectors.elBtnCountItemsSelected }`
416 );
417 const elSpanCount = elBtnCountItemsSelected.querySelector( 'span' );
418 const elHeaderCount = elPopup.querySelector(
419 `${ LpPopupSelectItemToAdd.selectors.elHeaderCountItemSelected }`
420 );
421 const elTarget = elPopup.querySelector(
422 `${ LpPopupSelectItemToAdd.selectors.LPTarget }`
423 );
424
425 if ( itemsSelectedData.length !== 0 ) {
426 elBtnCountItemsSelected.disabled = false;
427 elBtnAddItemsSelected.disabled = false;
428 elBtnAddItemsSelected.classList.add( 'active' );
429 elSpanCount.textContent = `(${ itemsSelectedData.length })`;
430 elHeaderCount.innerHTML = elBtnCountItemsSelected.innerHTML;
431 } else {
432 elBtnCountItemsSelected.disabled = true;
433 elBtnAddItemsSelected.disabled = true;
434 elBtnAddItemsSelected.classList.remove( 'active' );
435 elSpanCount.textContent = '';
436 elHeaderCount.textContent = '';
437 }
438
439 // Update list input checked, when items removed, or change tab type
440 const elListItems = elPopup.querySelector(
441 `${ LpPopupSelectItemToAdd.selectors.elListItems }`
442 );
443 const elInputs = elListItems.querySelectorAll(
444 'input[type="checkbox"]'
445 );
446 elInputs.forEach( ( elInputItem ) => {
447 const itemSelected = elInputItem.dataset;
448 const exists = itemsSelectedData.some(
449 ( item ) => item.id === itemSelected.id
450 );
451 elInputItem.checked = exists;
452 } );
453
454 // Set item selecting data to dataset for query.
455 const dataSet = window.lpAJAXG.getDataSetCurrent( elTarget );
456 dataSet.args.item_selecting = itemsSelectedData;
457 window.lpAJAXG.setDataSetCurrent( elTarget, dataSet );
458 };
459
460 // Add items selected to section
461 addItemsSelectedToSection = ( args ) => {
462 const { e, target, callBackHandle } = args;
463
464 if ( ! elPopup ) {
465 return;
466 }
467
468 SweetAlert.close();
469
470 if ( typeof callBackHandle === 'function' ) {
471 callBackHandle( itemsSelectedData );
472 itemsSelectedData = [];
473 }
474 };
475 }
476