Advertisement
artemsemkin

Asli: custom toggle for descriptions

Jun 14th, 2024 (edited)
603
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (function () {
  2.     function triggerResize() {
  3.         app.componentsManager.instances.disposable.filter(instance => instance && instance.name === 'Grid').forEach(instance => {
  4.             if (instance && typeof instance._updateGrid) {
  5.                 instance._updateGrid();
  6.             }
  7.         });
  8.  
  9.         app.refresher.run();
  10.     }
  11.  
  12.     function toggleHeight(el, show = true, duration = 0.3) {
  13.         if (duration === 0) {
  14.             gsap.set(el, {
  15.                 height: show ? 'auto' : 0,
  16.                 onComplete: triggerResize.bind(triggerResize)
  17.             });
  18.         } else {
  19.             gsap.to(el, {
  20.                 height: show ? 'auto' : 0,
  21.                 duration,
  22.                 onComplete: triggerResize.bind(triggerResize),
  23.                 onUpdate: triggerResize.bind(triggerResize),
  24.             });
  25.         }
  26.     }
  27.  
  28.     function initToggleMore(scope) {
  29.     if (!scope) {
  30.         return;
  31.     }
  32.  
  33.     [...scope.querySelectorAll('.typography-description')].forEach((el) => {
  34.         const toggleEllement = el.closest('[data-post-id]'); // select element to toggle more on click
  35.         const parentEl = el.parentElement;
  36.         const checkboxEl = document.createElement('input');
  37.         const labelEl = document.createElement('label');
  38.         const textEl = document.createElement('span');
  39.  
  40.         el.classList.add('toggle-more__target', 'overflow-hidden', 'd-block');
  41.  
  42.         // Set initial state checked or unchecked
  43.         // checkboxEl.setAttribute('checked', 'checked'); // checked
  44.         checkboxEl.removeAttribute('checked'); // unchecked
  45.  
  46.         checkboxEl.setAttribute('type', 'checkbox');
  47.         checkboxEl.classList.add('toggle-more__checkbox');
  48.  
  49.         labelEl.classList.add('toggle-more__label');
  50.  
  51.         // textEl.textContent = 'Read more';
  52.         textEl.classList.add('toggle-more__text');
  53.  
  54.         labelEl.appendChild(textEl);
  55.         labelEl.appendChild(checkboxEl);
  56.         labelEl.appendChild(el);
  57.  
  58.         parentEl.appendChild(labelEl);
  59.  
  60.         checkboxEl.addEventListener('change', (event) => {
  61.             toggleHeight(el, checkboxEl.checked);
  62.         });
  63.  
  64.         if (toggleEllement) {
  65.             toggleEllement.classList.add('toggle-more', 'no-ajax', 'cursor-highlight');
  66.             toggleEllement.addEventListener('click', (event) => {
  67.                 // Exclude inner links and buttons
  68.                 if (!event.target.closest('a') && !event.target.closest('button') ) {
  69.                     event.preventDefault();
  70.                     checkboxEl.checked = !checkboxEl.checked;
  71.                     checkboxEl.dispatchEvent(new Event('change'));
  72.                 }
  73.             });
  74.         } else {
  75.             labelEl.classList.add('cursor-highlight', 'pointer-events-inner-none');
  76.         }
  77.  
  78.         // Set initial state
  79.         toggleHeight(el, checkboxEl.checked, 0);
  80.     });
  81. }
  82.  
  83.  
  84.     if (!!app?.options?.isElementorEditor) {
  85.         console.log('Loading Elementor editor...');
  86.         window.addEventListener('elementor/frontend/init', () => {
  87.             console.log('Elementor editor loaded.');
  88.  
  89.             const masonryGridSkins = [
  90.                 'no-filter',
  91.                 'filter-top',
  92.                 'filter-sidebar',
  93.             ];
  94.  
  95.             masonryGridSkins.forEach((skin) => {
  96.                 elementorFrontend.hooks.addAction(`frontend/element_ready/asli-widget-masonry-grid.${skin}`, ($scope) => {
  97.                     const scope = $scope.get(0);
  98.  
  99.                     initToggleMore(scope);
  100.                 });
  101.             });
  102.         });
  103.     } else {
  104.         initToggleMore(app?.elements?.content);
  105.     }
  106. })();
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement