Plugin Directory

Changeset 3412215


Ignore:
Timestamp:
12/05/2025 01:12:54 PM (3 months ago)
Author:
alimir
Message:

Committing 4.8.2 to trunk

Location:
wp-ulike/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • wp-ulike/trunk/assets/js/wp-ulike.js

    r3406278 r3412215  
    1 /*! WP ULike - v4.8.1
     1/*! WP ULike - v4.8.2
    22 *  https://wpulike.com
    33 *  TechnoWich 2025;
     
    99
    1010/**
    11  * WP ULike Tooltip - Lightweight modern tooltip solution
    12  * Pure vanilla JavaScript, no dependencies
     11 * WP ULike Tooltip Plugin
     12 *
     13 * @fileoverview Lightweight tooltip solution with dynamic content loading
     14 * @requires ES7 (ES2016) compatible browser
     15 * @author WP ULike Team
     16 * @see https://github.com/alimir/wp-ulike
    1317 */
    1418(function (window, document, undefined) {
     
    178182    let scrollHandler = null;
    179183    let scrollHandlerOptions = null;
     184    let outsideHandler = null; // Store for cleanup
    180185    let isHovering = false; // Track if user is currently hovering
    181186
     
    443448    // Click outside handler
    444449    if (options.close_on_outside_click !== false) {
    445       const outsideHandler = (e) => {
     450      outsideHandler = (e) => {
    446451        if (
    447452          tooltip &&
     
    473478          scrollHandler = null;
    474479          scrollHandlerOptions = null;
     480        }
     481        if (outsideHandler) {
     482          document.removeEventListener("mousedown", outsideHandler);
     483          outsideHandler = null;
     484        }
     485        if (showTimeout) {
     486          clearTimeout(showTimeout);
     487          showTimeout = null;
     488        }
     489        if (hideTimeout) {
     490          clearTimeout(hideTimeout);
     491          hideTimeout = null;
    475492        }
    476493        tooltipInstances.delete(element);
     
    583600
    584601
    585 /* 'WordpressUlikeNotifications' plugin : https://github.com/alimir/wp-ulike */
     602/**
     603 * WP ULike Notifications Plugin
     604 *
     605 * @fileoverview Toast notification system for user feedback
     606 * @requires ES7 (ES2016) compatible browser
     607 * @author WP ULike Team
     608 * @see https://github.com/alimir/wp-ulike
     609 */
    586610(function (window, document, undefined) {
    587611  "use strict";
     
    623647   * Optimized: use requestAnimationFrame for better timing
    624648   */
    625   const fadeOut = (element, callback) => {
     649  const fadeOut = (element, callback, instance) => {
    626650    if (!element) return;
    627651
     
    631655
    632656      // Remove element after transition completes
    633       setTimeout(() => {
     657      const timeoutId = setTimeout(() => {
     658        if (instance) instance.fadeTimeoutId = null;
    634659        if (callback) {
    635660          callback();
    636661        }
    637662      }, FADE_OUT_DURATION);
     663      if (instance) instance.fadeTimeoutId = timeoutId;
    638664    });
    639665  };
     
    675701    this._name = pluginName;
    676702    this.timeoutId = null;
     703    this.fadeTimeoutId = null; // Track fade timeout
    677704    this.isRemoving = false;
    678705    // Cache className to avoid template literal on each access
     
    769796      this.isRemoving = true;
    770797
    771       // Clear timeout if still pending
     798      // Clear timeouts if still pending
    772799      if (this.timeoutId) {
    773800        clearTimeout(this.timeoutId);
    774801        this.timeoutId = null;
    775802      }
     803      if (this.fadeTimeoutId) {
     804        clearTimeout(this.fadeTimeoutId);
     805        this.fadeTimeoutId = null;
     806      }
    776807
    777808      // Remove message with fade out
    778809      fadeOut(this.messageElement, () => {
    779810        this._cleanup();
    780       });
     811      }, this);
    781812    },
    782813
     
    837868
    838869
     870/**
     871 * WP ULike - Main Plugin
     872 *
     873 * @fileoverview Core like/unlike functionality with AJAX support
     874 * @requires ES7 (ES2016) compatible browser
     875 * @author WP ULike Team
     876 * @see https://github.com/alimir/wp-ulike
     877 */
    839878(function (window, document, undefined) {
    840879  "use strict";
     
    9791018    this._defaults = defaults;
    9801019    this._name = pluginName;
     1020    // Store handlers and timeouts for cleanup
     1021    this._boundHandlers = [];
     1022    this._timeouts = [];
     1023    // Initialize fetching flag
     1024    this._isFetchingLikers = false;
    9811025
    9821026    // Create main selectors (like jQuery .find())
     
    10321076      // Attach click listeners to ALL buttons
    10331077      if (this.buttonElement && this.buttonElement.length > 0) {
     1078        const boundHandler = this._initLike.bind(this);
     1079        this._boundHandlers.push({ element: this.buttonElement, event: 'click', handler: boundHandler });
    10341080        forEachElement(this.buttonElement, (button) => {
    10351081          if (button) {
    1036             button.addEventListener("click", this._initLike.bind(this));
     1082            button.addEventListener("click", boundHandler);
    10371083          }
    10381084        });
     
    10441090          this._updateLikers(event);
    10451091          firstGeneralEl.removeEventListener("mouseenter", mouseenterHandler);
     1092          // Remove from tracking since it removes itself
     1093          const index = this._boundHandlers.findIndex(h => h.handler === mouseenterHandler);
     1094          if (index > -1) this._boundHandlers.splice(index, 1);
    10461095        };
     1096        this._boundHandlers.push({ element: firstGeneralEl, event: 'mouseenter', handler: mouseenterHandler });
    10471097        firstGeneralEl.addEventListener("mouseenter", mouseenterHandler);
    10481098      }
     
    11831233
    11841234          if (this.settings.appendTimeout && appendedElements.length > 0) {
    1185             setTimeout(() => {
     1235            const timeoutId = setTimeout(() => {
    11861236              appendedElements.forEach((el) => {
    11871237                if (el && el.parentNode) {
     
    11901240              });
    11911241            }, this.settings.appendTimeout);
     1242            this._timeouts.push(timeoutId);
    11921243          }
    11931244        }
     
    13261377    /**
    13271378     * Fetch likers data via AJAX
     1379     * Prevents duplicate requests
    13281380     */
    13291381    _fetchLikersData() {
     
    13321384        return;
    13331385      }
     1386
     1387      // Prevent duplicate requests
     1388      if (this._isFetchingLikers) {
     1389        return;
     1390      }
     1391
     1392      this._isFetchingLikers = true;
    13341393
    13351394      const generalEl = getSingleElement(this.generalElement);
     
    14211480                trigger: "hover",
    14221481                dataFetcher: (element, tooltipId) => {
    1423                   if (this._isFetchingLikers) {
    1424                     return;
    1425                   }
    1426                   this._isFetchingLikers = true;
     1482                  // Don't set flag here - let _fetchLikersData handle it
     1483                  // This prevents the flag from blocking the AJAX request
    14271484                  this._fetchLikersData();
    14281485                }
     
    16371694      }
    16381695    },
     1696
     1697    /**
     1698     * Cleanup method to prevent memory leaks
     1699     */
     1700    destroy() {
     1701      // Remove all event listeners
     1702      this._boundHandlers.forEach(({ element, event, handler }) => {
     1703        if (element && element.length !== undefined) {
     1704          forEachElement(element, (el) => {
     1705            if (el) el.removeEventListener(event, handler);
     1706          });
     1707        } else if (element) {
     1708          element.removeEventListener(event, handler);
     1709        }
     1710      });
     1711      this._boundHandlers = [];
     1712
     1713      // Clear all timeouts
     1714      this._timeouts.forEach((timeoutId) => {
     1715        clearTimeout(timeoutId);
     1716      });
     1717      this._timeouts = [];
     1718
     1719      // Reset flags
     1720      this._isFetchingLikers = false;
     1721    },
    16391722  };
    16401723
     
    16611744
    16621745
     1746/**
     1747 * WP ULike Scripts - Initialization
     1748 *
     1749 * @fileoverview Auto-initializes WP ULike plugin on page load and dynamic content
     1750 * @requires ES7 (ES2016) compatible browser
     1751 * @author WP ULike Team
     1752 * @see https://github.com/alimir/wp-ulike
     1753 */
    16631754(function (window, document) {
    16641755  "use strict";
  • wp-ulike/trunk/assets/js/wp-ulike.min.js

    r3406278 r3412215  
    1 !function(e,t){"use strict";const s=new WeakMap,i={},n=[],l={id:Date.now(),title:"",trigger:"hover",position:"top",class:"",theme:"light",size:"small",singleton:!0,close_on_outside_click:!0},o=(t,s,i)=>{t.offsetHeight;const n=(e=>{const t=e.getBoundingClientRect();return{top:t.top,left:t.left,width:t.width,height:t.height}})(s),l=t.getBoundingClientRect(),o=t.querySelector(".ulf-arrow"),r=e.innerWidth,a=e.innerHeight,h={top:{top:n.top-l.height-13,left:n.left+n.width/2-l.width/2,arrow:"bottom"},bottom:{top:n.top+n.height+13,left:n.left+n.width/2-l.width/2,arrow:"top"},left:{top:n.top+n.height/2-l.height/2,left:n.left-l.width-13,arrow:"right"},right:{top:n.top+n.height/2-l.height/2,left:n.left+n.width+13,arrow:"left"}},u=h[i]||h.top;u.left<10&&(u.left=10),u.left+l.width>r-10&&(u.left=r-l.width-10),u.top<10&&(u.top=10),u.top+l.height>a-10&&(u.top=a-l.height-10),t.style.position="fixed",t.style.left=`${u.left}px`,t.style.top=`${u.top}px`,o&&(o.className=`ulf-arrow ulf-arrow-${u.arrow}`),t.setAttribute("data-positioned","true")},r=Array.from||(e=>Array.prototype.slice.call(e));function a(h,u){if(undefined!==h.length&&h.length>1)return r(h).forEach(e=>{new a(e,u)}),h;if(!h)return!1;if(!(u=Object.assign({},l,u||{})).title){const e=h.querySelector("[data-tooltip-content]");if(e){"ready"===e.getAttribute("data-tooltip-state")&&(u.title=e.innerHTML.trim())}if(!u.title){const e=h.getAttribute("title");e&&(u.title=e,h.removeAttribute("title"))}}const d=s.get(h);d&&d.destroy();let c=null,p=null,m=null,g=!1,f=null,k=null,E=!1;const _=s=>{if(c&&c.parentNode&&!s)return;!1!==u.singleton&&n.forEach(e=>{e&&e.hide&&e.element!==h&&e.hide()});let i=`ulf-${u.theme||"light"}-theme ulf-${u.size||"small"}`;u.class&&(i+=` ${u.class}`);let l=h;if(u.child){const e=h.querySelector(u.child);e&&(l=e)}if(c&&c.parentNode&&!s){const e=c.querySelector(".ulf-content");e&&(g=!0===s,e.innerHTML=g?'<div class="ulf-loading-spinner"><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div></div>':u.title||"&nbsp;"),requestAnimationFrame(()=>{c&&c.parentNode&&o(c,l,u.position||"top")})}else c&&c.parentNode&&c.remove(),g=!0===s,c=((e,s,i)=>{const n=t.createElement("div");n.className=`ulf-tooltip ${s||""}`,n.setAttribute("role","tooltip");const l=i?'<div class="ulf-loading-spinner"><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div></div>':e||"&nbsp;";return n.innerHTML=`<div class="ulf-arrow"></div><div class="ulf-content">${l}</div>`,n})(u.title||"",i,g),t.body.appendChild(c),requestAnimationFrame(()=>{c&&c.parentNode&&o(c,l,u.position||"top")});"hover"!==u.trigger&&u.trigger||(c.addEventListener("mouseenter",()=>{clearTimeout(m)}),c.addEventListener("mouseleave",S)),f||(f=()=>{c&&c.parentNode&&w()},k={capture:!0,passive:!0},e.addEventListener("scroll",f,k));n.some(e=>e.element===h)||n.push({element:h,hide:w});const r=`ulp-dom-${u.id}`;c.setAttribute("id",r),h.setAttribute("aria-describedby",r);const a=new CustomEvent("ulf-show",{bubbles:!0,detail:{tooltip:c}});h.dispatchEvent(a)},y=()=>{let e=h.querySelector("[data-tooltip-content]");return e||(e=t.createElement("div"),e.setAttribute("data-tooltip-content",""),e.style.display="none",h.appendChild(e)),e},b=e=>{y().setAttribute("data-tooltip-state",e)},v=()=>{const e=h.querySelector("[data-tooltip-content]");return e?e.getAttribute("data-tooltip-state"):null},L=e=>{u.title=e||"";y().innerHTML=e||"";const t=e&&e.trim().length>0;if(b(t?"ready":"empty"),t)if(c&&c.parentNode){const t=c.querySelector(".ulf-content");if(t){t.innerHTML=e,g=!1;const s=u.child&&h.querySelector(u.child)||h;requestAnimationFrame(()=>{c&&c.parentNode&&o(c,s,u.position||"top")})}}else E&&_(!1);else c&&c.parentNode&&w()},w=()=>{if(!c||!c.parentNode)return;f&&k&&(e.removeEventListener("scroll",f,k),f=null,k=null),c.remove(),c=null,g=!1;const t=n.findIndex(e=>e.element===h);t>-1&&n.splice(t,1),h.removeAttribute("aria-describedby");const s=new CustomEvent("ulf-hide",{bubbles:!0});h.dispatchEvent(s)},T=()=>{const e=h.querySelector("[data-tooltip-content]");return e?e.innerHTML.trim():""},A=()=>{clearTimeout(m),E=!0;const e=v();if("empty"!==e){if("ready"===e){const e=T();return void(e?(u.title=e,p=setTimeout(_,100)):b("empty"))}if("loading"!==e)return e&&""!==e?void(u.showLoadingImmediately?_(!0):p=setTimeout(_,100)):(C.requestData&&C.requestData()||b("loading"),void _(!0));_(!0)}},S=()=>{clearTimeout(p),E=!1,m=setTimeout(w,100)};if("hover"!==u.trigger&&u.trigger?"click"===u.trigger&&h.addEventListener("click",e=>{e.preventDefault(),c&&c.parentNode?w():_()}):(h.addEventListener("mouseenter",A),h.addEventListener("mouseleave",S)),!1!==u.close_on_outside_click){const e=e=>{c&&c.parentNode&&!c.contains(e.target)&&!h.contains(e.target)&&w()};t.addEventListener("mousedown",e)}const C={show:_,showLoading:()=>_(!0),updateContent:L,hide:w,destroy:()=>{w(),h.removeEventListener("mouseenter",A),h.removeEventListener("mouseleave",S),C.contentUpdateHandler&&h.removeEventListener("tooltip-content-updated",C.contentUpdateHandler),f&&k&&(e.removeEventListener("scroll",f,k),f=null,k=null),s.delete(h),u.id&&delete i[u.id]}};s.set(h,C),u.id&&(i[u.id]=C),C.setLoadingState=()=>{b("loading")},u.trigger&&"hover"!==u.trigger||setTimeout(()=>{const e=v();if(e&&""!==e){if("loading"===e)_(!0);else if("ready"===e){const e=T();e&&(u.title=e,p=setTimeout(_,100))}}else A()},0),C.requestData=()=>{const e=v();return"ready"!==e&&"empty"!==e&&("loading"!==e&&(b("loading"),"function"==typeof u.dataFetcher?(u.dataFetcher(h,u.id),!0):(setTimeout(()=>{const e=new CustomEvent("tooltip-request-data",{bubbles:!0,detail:{element:h,tooltipId:u.id}});h.dispatchEvent(e),t.dispatchEvent(e)},0),!0)))};const N=e=>{const t=e.detail||{};(t.element===h||t.target&&h.contains(t.target))&&L(t.content||"")};return h.addEventListener("tooltip-content-updated",N),C.contentUpdateHandler=N,h}e.WordpressUlikeTooltipPlugin=a,e.WordpressUlikeTooltip={visible:n,defaults:l,getInstanceById:e=>i[e],getInstanceByElement:e=>s.get(e)},"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&(jQuery.fn.WordpressUlikeTooltip=function(e){return this.each(function(){new a(this,e)})})}(window,document),function(e,t){"use strict";const s="WordpressUlikeNotifications",i={messageType:"success",messageText:"Hello World!",timeout:8e3,messageElement:"wpulike-message",notifContainer:"wpulike-notification",fadeOutClass:"wpulike-message-fadeout"},n=new WeakMap,l=(e,t,s)=>{if(!e)return;const i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:s||null});e.dispatchEvent(i)};function o(e,t){e?(this.element=e,this.settings=Object.assign({},i,t),this._defaults=i,this._name=s,this.timeoutId=null,this.isRemoving=!1,this._messageClassName=null,this.init()):console.warn("WordpressUlikeNotifications: element is required")}o.prototype={init(){this._createMessage(),this._getContainer(),this._append(),this._setupRemoval()},_createMessage(){this.messageElement=t.createElement("div"),this._messageClassName||(this._messageClassName=`${this.settings.messageElement} wpulike-${this.settings.messageType}`),this.messageElement.className=this._messageClassName,this.messageElement.textContent=this.settings.messageText,this.messageElement.setAttribute("role","alert"),this.messageElement.setAttribute("aria-live","polite")},_getContainer(){this.notifContainer=((e,s)=>{let i=n.get(e);return i&&i.parentNode||(i=e.querySelector(`.${s}`),i||(i=t.createElement("div"),i.className=s,e.appendChild(i)),n.set(e,i)),i})(this.element,this.settings.notifContainer)},_append(){this.notifContainer&&this.messageElement&&(this.notifContainer.appendChild(this.messageElement),requestAnimationFrame(()=>{l(this.notifContainer,"WordpressUlikeNotificationAppend",{messageElement:this.messageElement})}))},_setupRemoval(){this.messageElement&&(this.messageElement.addEventListener("click",()=>{this.remove()},{once:!0,passive:!0}),this.settings.timeout&&this.settings.timeout>0&&(this.timeoutId=setTimeout(()=>{this.remove()},this.settings.timeout)))},remove(){var e,t;!this.isRemoving&&this.messageElement&&(this.isRemoving=!0,this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),e=this.messageElement,t=()=>{this._cleanup()},e&&requestAnimationFrame(()=>{e.classList.add(i.fadeOutClass),setTimeout(()=>{t&&t()},300)}))},_cleanup(){if(!this.messageElement)return;const e=this.messageElement,t=this.notifContainer;e.parentNode&&e.remove(),t&&0===t.children.length&&t.parentNode&&(t.remove(),n.delete(this.element)),l(this.element,"WordpressUlikeRemoveNotification",{messageElement:e}),this.messageElement=null,this.notifContainer=null,this.isRemoving=!1,this._messageClassName=null}},e[s]=o,"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&(jQuery.fn[s]=function(e){return this.each(function(){new o(this,e)})})}(window,document),function(e,t,s){"use strict";const i="WordpressUlike",n={ID:0,nonce:0,type:"",append:"",appendTimeout:2e3,displayLikers:!1,likersTemplate:"default",disablePophover:!0,isTotal:!1,factor:"",template:"",counterSelector:".count-box",generalSelector:".wp_ulike_general_class",buttonSelector:".wp_ulike_btn",likersSelector:".wp_ulike_likers_wrapper"},l={"ulike-id":"ID","ulike-nonce":"nonce","ulike-type":"type","ulike-append":"append","ulike-is-total":"isTotal","ulike-display-likers":"displayLikers","ulike-likers-style":"likersTemplate","ulike-disable-pophover":"disablePophover","ulike-append-timeout":"appendTimeout","ulike-factor":"factor","ulike-template":"template"},o=(e,t)=>{const i=t.replace(/-([a-z])/g,e=>e[1].toUpperCase());if(e.dataset&&e.dataset[i]!==s)return e.dataset[i];const n=e.getAttribute(`data-${t}`);return null===n?s:"true"===n||"false"!==n&&(""===n||"null"===n?null:isNaN(n)||""===n?n:Number(n))},r=(e,t,s)=>{const i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:s});if(e.dispatchEvent(i),"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&jQuery.fn.on){jQuery(e).trigger(t,s)}},a=e=>Array.from?Array.from(e):Array.prototype.slice.call(e),h=(e,t)=>{e&&(e.length===s?t(e,0):a(e).forEach(t))},u=(e,t)=>{const s=[],i=e.parentNode;if(!i)return s;const n=i.children;for(let i=0;i<n.length;i++)n[i]!==e&&(t&&!n[i].matches(t)||s.push(n[i]));return s},d=(e,t)=>{const s=[],i=new Set;return h(e,e=>{u(e,t).forEach(e=>{i.has(e)||(i.add(e),s.push(e))})}),s},c=e=>Array.isArray(e)||e.length!==s?e[0]:e,p=(e,t)=>{for(const s in t)"boolean"==typeof t[s]&&null!=e[s]&&(e[s]=0!=e[s]&&"0"!==e[s]&&!1!==e[s])};function m(e,t){this.element=e,this.settings=Object.assign({},n,t),p(this.settings,n),this._defaults=n,this._name=i,this.buttonElement=this.element.querySelectorAll(this.settings.buttonSelector);const r=this.buttonElement.length>0?this.buttonElement[0]:null;if(r){for(const e in l)if(l.hasOwnProperty(e)){const t=o(r,e);t!==s&&(this.settings[l[e]]=t)}p(this.settings,n)}this.generalElement=this.element.querySelectorAll(this.settings.generalSelector),this.counterElement=[],this.generalElement.length>0&&h(this.generalElement,e=>{const t=e.querySelectorAll(this.settings.counterSelector);h(t,e=>{this.counterElement.push(e)})}),this.counterElement.length>0&&h(this.counterElement,e=>{const t=o(e,"ulike-counter-value");t!==s&&(e.innerHTML=t)}),this.likersElement=this.element.querySelector(this.settings.likersSelector),this.init()}m.prototype={init(){this.buttonElement&&this.buttonElement.length>0&&h(this.buttonElement,e=>{e&&e.addEventListener("click",this._initLike.bind(this))});const e=this.generalElement.length>0?this.generalElement[0]:null;if(e){const t=s=>{this._updateLikers(s),e.removeEventListener("mouseenter",t)};e.addEventListener("mouseenter",t)}},_ajax(e,t){const s=new FormData;for(const t in e)e.hasOwnProperty(t)&&s.append(t,e[t]);fetch(wp_ulike_params.ajax_url,{method:"POST",body:s}).then(e=>e.json()).then(t).catch(e=>{console.error("WP Ulike AJAX error:",e)})},_initLike(e){e.stopPropagation(),this._maybeUpdateElements(e),this._updateSameButtons(),this._updateSameLikers(),this.buttonElement&&h(this.buttonElement,e=>{e.disabled=!0}),r(t,"WordpressUlikeLoading",this.element),this.generalElement&&h(this.generalElement,e=>{e.classList.add("wp_ulike_is_loading")}),this._ajax({action:"wp_ulike_process",id:this.settings.ID,nonce:this.settings.nonce,factor:this.settings.factor,type:this.settings.type,template:this.settings.template,displayLikers:this.settings.displayLikers,likersTemplate:this.settings.likersTemplate},e=>{this.generalElement&&h(this.generalElement,e=>{e.classList.remove("wp_ulike_is_loading")}),e.success?(this._updateMarkup(e),this._appendChild()):e.data&&e.data.hasToast&&this._sendNotification("error",e.data.message),this.buttonElement&&h(this.buttonElement,e=>{e.disabled=!1}),r(t,"WordpressUlikeUpdated",this.element)})},_maybeUpdateElements(e){this.buttonElement=e.currentTarget,this.generalElement=this.buttonElement.closest(this.settings.generalSelector),this.generalElement?this.counterElement=this.generalElement.querySelectorAll(this.settings.counterSelector):this.counterElement=[],this.settings.factor=o(this.buttonElement,"ulike-factor")},_appendChild(){if(""!==this.settings.append&&this.buttonElement){let e=[];if(this.settings.append.trim().startsWith("<")){const s=t.createElement("div");for(s.innerHTML=this.settings.append;s.firstChild;)e.push(s.removeChild(s.firstChild))}else{const s=t.querySelector(this.settings.append);s&&e.push(s)}if(e.length>0){const t=[];h(this.buttonElement,s=>{s&&e.forEach(e=>{const i=e.cloneNode(!0);s.appendChild(i),t.push(i)})}),this.settings.appendTimeout&&t.length>0&&setTimeout(()=>{t.forEach(e=>{e&&e.parentNode&&e.remove()})},this.settings.appendTimeout)}}},_updateMarkup(e){this._setSbilingElement(),this._setSbilingButtons(),this._updateGeneralClassNames(e.data.status),null!==e.data.data&&(5!==e.data.status&&(this.__updateCounter(e.data.data),this.settings.displayLikers&&void 0!==e.data.likers&&this._updateLikersMarkup(e.data.likers)),this._updateButton(e.data.btnText,e.data.status)),e.data.hasToast&&this._sendNotification(e.data.messageType,e.data.message)},_updateGeneralClassNames(e){const t="wp_ulike_is_not_liked",s="wp_ulike_is_liked",i="wp_ulike_is_unliked",n="wp_ulike_click_is_disabled";this.siblingElement&&this.siblingElement.length&&h(this.siblingElement,e=>{e.classList.remove(s,i)}),h(this.generalElement,l=>{if(l)switch(e){case 1:l.classList.add(s),l.classList.remove(t);const e=l.firstElementChild;e&&e.classList.add(n);break;case 2:l.classList.add(i),l.classList.remove(s);break;case 3:l.classList.add(s),l.classList.remove(i);break;case 0:case 5:l.classList.add(n)}}),(0===e||5===e)&&this.siblingElement&&this.siblingElement.length&&h(this.siblingElement,e=>{e.classList.add(n)})},_arrayToString:e=>e.join(" "),_setSbilingElement(){if(this.generalElement.length!==s&&this.generalElement.length>1)this.siblingElement=d(this.generalElement);else{const e=c(this.generalElement);this.siblingElement=e?u(e):[]}},_setSbilingButtons(){if(this.buttonElement.length!==s&&this.buttonElement.length>1)this.siblingButton=d(this.buttonElement,this.settings.buttonSelector);else{const e=c(this.buttonElement);this.siblingButton=e?u(e,this.settings.buttonSelector):[]}},__updateCounter(e){h(this.counterElement,t=>{t.setAttribute("data-ulike-counter-value",e),t.innerHTML=e});const s=c(this.buttonElement);r(t,"WordpressUlikeCounterUpdated",[s])},_fetchLikersData(){if(!this.settings.displayLikers)return void(this._isFetchingLikers=!1);const e=c(this.generalElement);e&&e.classList.add("wp_ulike_is_getting_likers_list"),this._ajax({action:"wp_ulike_get_likers",id:this.settings.ID,nonce:this.settings.nonce,type:this.settings.type,displayLikers:this.settings.displayLikers,likersTemplate:this.settings.likersTemplate},t=>{e&&e.classList.remove("wp_ulike_is_getting_likers_list"),this._isFetchingLikers=!1,t.success?this._updateLikersMarkup(t.data):this._updateLikersMarkup("")})},_getAllTooltipElements(){const e=void 0!==this.settings.factor&&this.settings.factor?`_${this.settings.factor}`:"",s=`.wp_${this.settings.type.toLowerCase()}${e}_btn_${this.settings.ID}`,i=t.querySelectorAll(s),n=[];return h(i,e=>{const t=e.closest(".wpulike");t&&!n.includes(t)&&n.push(t)}),n.length>0?n:[this.element]},_updateLikers(t){if(this.settings.displayLikers){if("popover"===this.settings.likersTemplate&&o(this.element,"ulike-tooltip"))return;if("default"===this.settings.likersTemplate&&this.likersElement&&(this.likersElement.length===s||this.likersElement.length>0))return;if("popover"===this.settings.likersTemplate){if("undefined"!=typeof WordpressUlikeTooltipPlugin){const t=`${this.settings.type.toLowerCase()}-${this.settings.ID}`;(e.WordpressUlikeTooltip&&e.WordpressUlikeTooltip.getInstanceByElement?e.WordpressUlikeTooltip.getInstanceByElement(this.element):null)||new WordpressUlikeTooltipPlugin(this.element,{id:t,position:"top",child:this.settings.generalSelector,theme:"white",size:"tiny",trigger:"hover",dataFetcher:(e,t)=>{this._isFetchingLikers||(this._isFetchingLikers=!0,this._fetchLikersData())}})}}else this._fetchLikersData();return t&&t.stopImmediatePropagation(),!1}},_updateLikersMarkup(e){if("popover"===this.settings.likersTemplate){this.likersElement=this.element;this.settings.type.toLowerCase(),this.settings.ID;const s=(e&&"object"==typeof e?e.template:e)||"",i=this._getAllTooltipElements();h(i,e=>{const i=new CustomEvent("tooltip-content-updated",{bubbles:!0,detail:{element:e,content:s}});e.dispatchEvent(i),t.dispatchEvent(i);let n=e.querySelector("[data-tooltip-content]");n||(n=t.createElement("div"),n.setAttribute("data-tooltip-content",""),n.setAttribute("data-tooltip-state","ready"),n.style.display="none",e.appendChild(n)),n.innerHTML=s,n.setAttribute("data-tooltip-state","ready")})}else{if(!(this.likersElement&&(this.likersElement.length===s||this.likersElement.length>0))&&e&&e.template){const s=t.createElement("div");s.innerHTML=e.template;const i=s.firstElementChild;i&&(this.element.appendChild(i),this.likersElement=i)}if(this.likersElement){const t=this.likersElement.length!==s?a(this.likersElement):[this.likersElement],i=e&&"object"==typeof e&&e.template?e.template:"string"==typeof e?e:"";h(t,e=>{e&&(i?(e.style.display="",e.innerHTML=i):(e.style.display="none",e.innerHTML=""))})}}const i=e&&"object"==typeof e?e.template:e;r(t,"WordpressUlikeLikersMarkupUpdated",[this.likersElement,this.settings.likersTemplate,i])},_updateSameButtons(){const e=void 0!==this.settings.factor&&this.settings.factor?`_${this.settings.factor}`:"",s=`.wp_${this.settings.type.toLowerCase()}${e}_btn_${this.settings.ID}`;if(this.sameButtons=t.querySelectorAll(s),this.sameButtons.length>1){this.buttonElement=this.sameButtons;const e=[];h(this.sameButtons,t=>{const s=t.closest(this.settings.generalSelector);s&&e.push(s)}),this.generalElement=1===e.length?e[0]:e;const t=[];h(e,e=>{const s=e.querySelectorAll(this.settings.counterSelector);h(s,e=>{t.push(e)})}),this.counterElement=t}},_updateSameLikers(){const e=`.wp_${this.settings.type.toLowerCase()}_likers_${this.settings.ID}`;this.sameLikers=t.querySelectorAll(e),this.sameLikers.length>1&&(this.likersElement=this.sameLikers)},_getLikersElement(){return this.likersElement},_updateButton(e,t){h(this.buttonElement,s=>{if(s)if(s.classList.contains("wp_ulike_put_image"))4===t?s.classList.add("image-unlike","wp_ulike_btn_is_active"):(s.classList.toggle("image-unlike"),s.classList.toggle("wp_ulike_btn_is_active"));else if(s.classList.contains("wp_ulike_put_text")&&null!==e){const t=s.querySelector("span");t&&(t.innerHTML=e)}}),this.siblingElement&&this.siblingElement.length&&h(this.siblingElement,e=>{const t=e.querySelector(this.settings.buttonSelector);t&&t.classList.remove("image-unlike","wp_ulike_btn_is_active")}),this.siblingButton&&this.siblingButton.length&&h(this.siblingButton,e=>{e.classList.remove("image-unlike","wp_ulike_btn_is_active")})},_sendNotification(e,s){"undefined"!=typeof WordpressUlikeNotifications&&new WordpressUlikeNotifications(t.body,{messageType:e,messageText:s})}},e[i]=m,"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&(jQuery.fn[i]=function(e){return this.each(function(){this.hasAttribute&&this.hasAttribute("data-ulike-initialized")||(new m(this,e),this.setAttribute&&this.setAttribute("data-ulike-initialized","true"))})})}(window,document),function(e,t){"use strict";const s=e=>Array.from?Array.from(e):Array.prototype.slice.call(e),i=e=>{if(!e)return;(void 0!==e.length?s(e):[e]).forEach(e=>{e&&"undefined"!=typeof WordpressUlike&&(e.hasAttribute("data-ulike-initialized")||(new WordpressUlike(e),e.setAttribute("data-ulike-initialized","true")))})},n=t.querySelectorAll(".wpulike");i(n);((i,n,l)=>{const o=e=>{e.forEach(e=>{e.addedNodes.length&&e.addedNodes.forEach(e=>{if(1===e.nodeType&&e.matches&&e.matches(n)&&l(e),1===e.nodeType&&e.querySelectorAll){const t=e.querySelectorAll(n);s(t).forEach(e=>l(e))}})})},r=t.querySelector(i);if(!r)return;const a={childList:!0,subtree:!0},h=e.MutationObserver||e.WebKitMutationObserver;if(h){new h(o).observe(r,a)}})("body",".wpulike",e=>{i(e)})}(window,document);
     1!function(e,t){"use strict";const s=new WeakMap,i={},n=[],l={id:Date.now(),title:"",trigger:"hover",position:"top",class:"",theme:"light",size:"small",singleton:!0,close_on_outside_click:!0},o=(t,s,i)=>{t.offsetHeight;const n=(e=>{const t=e.getBoundingClientRect();return{top:t.top,left:t.left,width:t.width,height:t.height}})(s),l=t.getBoundingClientRect(),o=t.querySelector(".ulf-arrow"),r=e.innerWidth,a=e.innerHeight,u={top:{top:n.top-l.height-13,left:n.left+n.width/2-l.width/2,arrow:"bottom"},bottom:{top:n.top+n.height+13,left:n.left+n.width/2-l.width/2,arrow:"top"},left:{top:n.top+n.height/2-l.height/2,left:n.left-l.width-13,arrow:"right"},right:{top:n.top+n.height/2-l.height/2,left:n.left+n.width+13,arrow:"left"}},h=u[i]||u.top;h.left<10&&(h.left=10),h.left+l.width>r-10&&(h.left=r-l.width-10),h.top<10&&(h.top=10),h.top+l.height>a-10&&(h.top=a-l.height-10),t.style.position="fixed",t.style.left=`${h.left}px`,t.style.top=`${h.top}px`,o&&(o.className=`ulf-arrow ulf-arrow-${h.arrow}`),t.setAttribute("data-positioned","true")},r=Array.from||(e=>Array.prototype.slice.call(e));function a(u,h){if(undefined!==u.length&&u.length>1)return r(u).forEach(e=>{new a(e,h)}),u;if(!u)return!1;if(!(h=Object.assign({},l,h||{})).title){const e=u.querySelector("[data-tooltip-content]");if(e){"ready"===e.getAttribute("data-tooltip-state")&&(h.title=e.innerHTML.trim())}if(!h.title){const e=u.getAttribute("title");e&&(h.title=e,u.removeAttribute("title"))}}const d=s.get(u);d&&d.destroy();let c=null,m=null,p=null,g=!1,f=null,k=null,_=null,E=!1;const b=s=>{if(c&&c.parentNode&&!s)return;!1!==h.singleton&&n.forEach(e=>{e&&e.hide&&e.element!==u&&e.hide()});let i=`ulf-${h.theme||"light"}-theme ulf-${h.size||"small"}`;h.class&&(i+=` ${h.class}`);let l=u;if(h.child){const e=u.querySelector(h.child);e&&(l=e)}if(c&&c.parentNode&&!s){const e=c.querySelector(".ulf-content");e&&(g=!0===s,e.innerHTML=g?'<div class="ulf-loading-spinner"><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div></div>':h.title||"&nbsp;"),requestAnimationFrame(()=>{c&&c.parentNode&&o(c,l,h.position||"top")})}else c&&c.parentNode&&c.remove(),g=!0===s,c=((e,s,i)=>{const n=t.createElement("div");n.className=`ulf-tooltip ${s||""}`,n.setAttribute("role","tooltip");const l=i?'<div class="ulf-loading-spinner"><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div><div class="ulf-spinner-circle"></div></div>':e||"&nbsp;";return n.innerHTML=`<div class="ulf-arrow"></div><div class="ulf-content">${l}</div>`,n})(h.title||"",i,g),t.body.appendChild(c),requestAnimationFrame(()=>{c&&c.parentNode&&o(c,l,h.position||"top")});"hover"!==h.trigger&&h.trigger||(c.addEventListener("mouseenter",()=>{clearTimeout(p)}),c.addEventListener("mouseleave",C)),f||(f=()=>{c&&c.parentNode&&T()},k={capture:!0,passive:!0},e.addEventListener("scroll",f,k));n.some(e=>e.element===u)||n.push({element:u,hide:T});const r=`ulp-dom-${h.id}`;c.setAttribute("id",r),u.setAttribute("aria-describedby",r);const a=new CustomEvent("ulf-show",{bubbles:!0,detail:{tooltip:c}});u.dispatchEvent(a)},y=()=>{let e=u.querySelector("[data-tooltip-content]");return e||(e=t.createElement("div"),e.setAttribute("data-tooltip-content",""),e.style.display="none",u.appendChild(e)),e},v=e=>{y().setAttribute("data-tooltip-state",e)},L=()=>{const e=u.querySelector("[data-tooltip-content]");return e?e.getAttribute("data-tooltip-state"):null},w=e=>{h.title=e||"";y().innerHTML=e||"";const t=e&&e.trim().length>0;if(v(t?"ready":"empty"),t)if(c&&c.parentNode){const t=c.querySelector(".ulf-content");if(t){t.innerHTML=e,g=!1;const s=h.child&&u.querySelector(h.child)||u;requestAnimationFrame(()=>{c&&c.parentNode&&o(c,s,h.position||"top")})}}else E&&b(!1);else c&&c.parentNode&&T()},T=()=>{if(!c||!c.parentNode)return;f&&k&&(e.removeEventListener("scroll",f,k),f=null,k=null),c.remove(),c=null,g=!1;const t=n.findIndex(e=>e.element===u);t>-1&&n.splice(t,1),u.removeAttribute("aria-describedby");const s=new CustomEvent("ulf-hide",{bubbles:!0});u.dispatchEvent(s)},A=()=>{const e=u.querySelector("[data-tooltip-content]");return e?e.innerHTML.trim():""},S=()=>{clearTimeout(p),E=!0;const e=L();if("empty"!==e){if("ready"===e){const e=A();return void(e?(h.title=e,m=setTimeout(b,100)):v("empty"))}if("loading"!==e)return e&&""!==e?void(h.showLoadingImmediately?b(!0):m=setTimeout(b,100)):(N.requestData&&N.requestData()||v("loading"),void b(!0));b(!0)}},C=()=>{clearTimeout(m),E=!1,p=setTimeout(T,100)};"hover"!==h.trigger&&h.trigger?"click"===h.trigger&&u.addEventListener("click",e=>{e.preventDefault(),c&&c.parentNode?T():b()}):(u.addEventListener("mouseenter",S),u.addEventListener("mouseleave",C)),!1!==h.close_on_outside_click&&(_=e=>{c&&c.parentNode&&!c.contains(e.target)&&!u.contains(e.target)&&T()},t.addEventListener("mousedown",_));const N={show:b,showLoading:()=>b(!0),updateContent:w,hide:T,destroy:()=>{T(),u.removeEventListener("mouseenter",S),u.removeEventListener("mouseleave",C),N.contentUpdateHandler&&u.removeEventListener("tooltip-content-updated",N.contentUpdateHandler),f&&k&&(e.removeEventListener("scroll",f,k),f=null,k=null),_&&(t.removeEventListener("mousedown",_),_=null),m&&(clearTimeout(m),m=null),p&&(clearTimeout(p),p=null),s.delete(u),h.id&&delete i[h.id]}};s.set(u,N),h.id&&(i[h.id]=N),N.setLoadingState=()=>{v("loading")},h.trigger&&"hover"!==h.trigger||setTimeout(()=>{const e=L();if(e&&""!==e){if("loading"===e)b(!0);else if("ready"===e){const e=A();e&&(h.title=e,m=setTimeout(b,100))}}else S()},0),N.requestData=()=>{const e=L();return"ready"!==e&&"empty"!==e&&("loading"!==e&&(v("loading"),"function"==typeof h.dataFetcher?(h.dataFetcher(u,h.id),!0):(setTimeout(()=>{const e=new CustomEvent("tooltip-request-data",{bubbles:!0,detail:{element:u,tooltipId:h.id}});u.dispatchEvent(e),t.dispatchEvent(e)},0),!0)))};const q=e=>{const t=e.detail||{};(t.element===u||t.target&&u.contains(t.target))&&w(t.content||"")};return u.addEventListener("tooltip-content-updated",q),N.contentUpdateHandler=q,u}e.WordpressUlikeTooltipPlugin=a,e.WordpressUlikeTooltip={visible:n,defaults:l,getInstanceById:e=>i[e],getInstanceByElement:e=>s.get(e)},"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&(jQuery.fn.WordpressUlikeTooltip=function(e){return this.each(function(){new a(this,e)})})}(window,document),function(e,t){"use strict";const s="WordpressUlikeNotifications",i={messageType:"success",messageText:"Hello World!",timeout:8e3,messageElement:"wpulike-message",notifContainer:"wpulike-notification",fadeOutClass:"wpulike-message-fadeout"},n=new WeakMap,l=(e,t,s)=>{if(!e)return;const i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:s||null});e.dispatchEvent(i)};function o(e,t){e?(this.element=e,this.settings=Object.assign({},i,t),this._defaults=i,this._name=s,this.timeoutId=null,this.fadeTimeoutId=null,this.isRemoving=!1,this._messageClassName=null,this.init()):console.warn("WordpressUlikeNotifications: element is required")}o.prototype={init(){this._createMessage(),this._getContainer(),this._append(),this._setupRemoval()},_createMessage(){this.messageElement=t.createElement("div"),this._messageClassName||(this._messageClassName=`${this.settings.messageElement} wpulike-${this.settings.messageType}`),this.messageElement.className=this._messageClassName,this.messageElement.textContent=this.settings.messageText,this.messageElement.setAttribute("role","alert"),this.messageElement.setAttribute("aria-live","polite")},_getContainer(){this.notifContainer=((e,s)=>{let i=n.get(e);return i&&i.parentNode||(i=e.querySelector(`.${s}`),i||(i=t.createElement("div"),i.className=s,e.appendChild(i)),n.set(e,i)),i})(this.element,this.settings.notifContainer)},_append(){this.notifContainer&&this.messageElement&&(this.notifContainer.appendChild(this.messageElement),requestAnimationFrame(()=>{l(this.notifContainer,"WordpressUlikeNotificationAppend",{messageElement:this.messageElement})}))},_setupRemoval(){this.messageElement&&(this.messageElement.addEventListener("click",()=>{this.remove()},{once:!0,passive:!0}),this.settings.timeout&&this.settings.timeout>0&&(this.timeoutId=setTimeout(()=>{this.remove()},this.settings.timeout)))},remove(){var e,t,s;!this.isRemoving&&this.messageElement&&(this.isRemoving=!0,this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.fadeTimeoutId&&(clearTimeout(this.fadeTimeoutId),this.fadeTimeoutId=null),e=this.messageElement,t=()=>{this._cleanup()},s=this,e&&requestAnimationFrame(()=>{e.classList.add(i.fadeOutClass);const n=setTimeout(()=>{s&&(s.fadeTimeoutId=null),t&&t()},300);s&&(s.fadeTimeoutId=n)}))},_cleanup(){if(!this.messageElement)return;const e=this.messageElement,t=this.notifContainer;e.parentNode&&e.remove(),t&&0===t.children.length&&t.parentNode&&(t.remove(),n.delete(this.element)),l(this.element,"WordpressUlikeRemoveNotification",{messageElement:e}),this.messageElement=null,this.notifContainer=null,this.isRemoving=!1,this._messageClassName=null}},e[s]=o,"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&(jQuery.fn[s]=function(e){return this.each(function(){new o(this,e)})})}(window,document),function(e,t,s){"use strict";const i="WordpressUlike",n={ID:0,nonce:0,type:"",append:"",appendTimeout:2e3,displayLikers:!1,likersTemplate:"default",disablePophover:!0,isTotal:!1,factor:"",template:"",counterSelector:".count-box",generalSelector:".wp_ulike_general_class",buttonSelector:".wp_ulike_btn",likersSelector:".wp_ulike_likers_wrapper"},l={"ulike-id":"ID","ulike-nonce":"nonce","ulike-type":"type","ulike-append":"append","ulike-is-total":"isTotal","ulike-display-likers":"displayLikers","ulike-likers-style":"likersTemplate","ulike-disable-pophover":"disablePophover","ulike-append-timeout":"appendTimeout","ulike-factor":"factor","ulike-template":"template"},o=(e,t)=>{const i=t.replace(/-([a-z])/g,e=>e[1].toUpperCase());if(e.dataset&&e.dataset[i]!==s)return e.dataset[i];const n=e.getAttribute(`data-${t}`);return null===n?s:"true"===n||"false"!==n&&(""===n||"null"===n?null:isNaN(n)||""===n?n:Number(n))},r=(e,t,s)=>{const i=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:s});if(e.dispatchEvent(i),"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&jQuery.fn.on){jQuery(e).trigger(t,s)}},a=e=>Array.from?Array.from(e):Array.prototype.slice.call(e),u=(e,t)=>{e&&(e.length===s?t(e,0):a(e).forEach(t))},h=(e,t)=>{const s=[],i=e.parentNode;if(!i)return s;const n=i.children;for(let i=0;i<n.length;i++)n[i]!==e&&(t&&!n[i].matches(t)||s.push(n[i]));return s},d=(e,t)=>{const s=[],i=new Set;return u(e,e=>{h(e,t).forEach(e=>{i.has(e)||(i.add(e),s.push(e))})}),s},c=e=>Array.isArray(e)||e.length!==s?e[0]:e,m=(e,t)=>{for(const s in t)"boolean"==typeof t[s]&&null!=e[s]&&(e[s]=0!=e[s]&&"0"!==e[s]&&!1!==e[s])};function p(e,t){this.element=e,this.settings=Object.assign({},n,t),m(this.settings,n),this._defaults=n,this._name=i,this._boundHandlers=[],this._timeouts=[],this._isFetchingLikers=!1,this.buttonElement=this.element.querySelectorAll(this.settings.buttonSelector);const r=this.buttonElement.length>0?this.buttonElement[0]:null;if(r){for(const e in l)if(l.hasOwnProperty(e)){const t=o(r,e);t!==s&&(this.settings[l[e]]=t)}m(this.settings,n)}this.generalElement=this.element.querySelectorAll(this.settings.generalSelector),this.counterElement=[],this.generalElement.length>0&&u(this.generalElement,e=>{const t=e.querySelectorAll(this.settings.counterSelector);u(t,e=>{this.counterElement.push(e)})}),this.counterElement.length>0&&u(this.counterElement,e=>{const t=o(e,"ulike-counter-value");t!==s&&(e.innerHTML=t)}),this.likersElement=this.element.querySelector(this.settings.likersSelector),this.init()}p.prototype={init(){if(this.buttonElement&&this.buttonElement.length>0){const e=this._initLike.bind(this);this._boundHandlers.push({element:this.buttonElement,event:"click",handler:e}),u(this.buttonElement,t=>{t&&t.addEventListener("click",e)})}const e=this.generalElement.length>0?this.generalElement[0]:null;if(e){const t=s=>{this._updateLikers(s),e.removeEventListener("mouseenter",t);const i=this._boundHandlers.findIndex(e=>e.handler===t);i>-1&&this._boundHandlers.splice(i,1)};this._boundHandlers.push({element:e,event:"mouseenter",handler:t}),e.addEventListener("mouseenter",t)}},_ajax(e,t){const s=new FormData;for(const t in e)e.hasOwnProperty(t)&&s.append(t,e[t]);fetch(wp_ulike_params.ajax_url,{method:"POST",body:s}).then(e=>e.json()).then(t).catch(e=>{console.error("WP Ulike AJAX error:",e)})},_initLike(e){e.stopPropagation(),this._maybeUpdateElements(e),this._updateSameButtons(),this._updateSameLikers(),this.buttonElement&&u(this.buttonElement,e=>{e.disabled=!0}),r(t,"WordpressUlikeLoading",this.element),this.generalElement&&u(this.generalElement,e=>{e.classList.add("wp_ulike_is_loading")}),this._ajax({action:"wp_ulike_process",id:this.settings.ID,nonce:this.settings.nonce,factor:this.settings.factor,type:this.settings.type,template:this.settings.template,displayLikers:this.settings.displayLikers,likersTemplate:this.settings.likersTemplate},e=>{this.generalElement&&u(this.generalElement,e=>{e.classList.remove("wp_ulike_is_loading")}),e.success?(this._updateMarkup(e),this._appendChild()):e.data&&e.data.hasToast&&this._sendNotification("error",e.data.message),this.buttonElement&&u(this.buttonElement,e=>{e.disabled=!1}),r(t,"WordpressUlikeUpdated",this.element)})},_maybeUpdateElements(e){this.buttonElement=e.currentTarget,this.generalElement=this.buttonElement.closest(this.settings.generalSelector),this.generalElement?this.counterElement=this.generalElement.querySelectorAll(this.settings.counterSelector):this.counterElement=[],this.settings.factor=o(this.buttonElement,"ulike-factor")},_appendChild(){if(""!==this.settings.append&&this.buttonElement){let e=[];if(this.settings.append.trim().startsWith("<")){const s=t.createElement("div");for(s.innerHTML=this.settings.append;s.firstChild;)e.push(s.removeChild(s.firstChild))}else{const s=t.querySelector(this.settings.append);s&&e.push(s)}if(e.length>0){const t=[];if(u(this.buttonElement,s=>{s&&e.forEach(e=>{const i=e.cloneNode(!0);s.appendChild(i),t.push(i)})}),this.settings.appendTimeout&&t.length>0){const e=setTimeout(()=>{t.forEach(e=>{e&&e.parentNode&&e.remove()})},this.settings.appendTimeout);this._timeouts.push(e)}}}},_updateMarkup(e){this._setSbilingElement(),this._setSbilingButtons(),this._updateGeneralClassNames(e.data.status),null!==e.data.data&&(5!==e.data.status&&(this.__updateCounter(e.data.data),this.settings.displayLikers&&void 0!==e.data.likers&&this._updateLikersMarkup(e.data.likers)),this._updateButton(e.data.btnText,e.data.status)),e.data.hasToast&&this._sendNotification(e.data.messageType,e.data.message)},_updateGeneralClassNames(e){const t="wp_ulike_is_not_liked",s="wp_ulike_is_liked",i="wp_ulike_is_unliked",n="wp_ulike_click_is_disabled";this.siblingElement&&this.siblingElement.length&&u(this.siblingElement,e=>{e.classList.remove(s,i)}),u(this.generalElement,l=>{if(l)switch(e){case 1:l.classList.add(s),l.classList.remove(t);const e=l.firstElementChild;e&&e.classList.add(n);break;case 2:l.classList.add(i),l.classList.remove(s);break;case 3:l.classList.add(s),l.classList.remove(i);break;case 0:case 5:l.classList.add(n)}}),(0===e||5===e)&&this.siblingElement&&this.siblingElement.length&&u(this.siblingElement,e=>{e.classList.add(n)})},_arrayToString:e=>e.join(" "),_setSbilingElement(){if(this.generalElement.length!==s&&this.generalElement.length>1)this.siblingElement=d(this.generalElement);else{const e=c(this.generalElement);this.siblingElement=e?h(e):[]}},_setSbilingButtons(){if(this.buttonElement.length!==s&&this.buttonElement.length>1)this.siblingButton=d(this.buttonElement,this.settings.buttonSelector);else{const e=c(this.buttonElement);this.siblingButton=e?h(e,this.settings.buttonSelector):[]}},__updateCounter(e){u(this.counterElement,t=>{t.setAttribute("data-ulike-counter-value",e),t.innerHTML=e});const s=c(this.buttonElement);r(t,"WordpressUlikeCounterUpdated",[s])},_fetchLikersData(){if(!this.settings.displayLikers)return void(this._isFetchingLikers=!1);if(this._isFetchingLikers)return;this._isFetchingLikers=!0;const e=c(this.generalElement);e&&e.classList.add("wp_ulike_is_getting_likers_list"),this._ajax({action:"wp_ulike_get_likers",id:this.settings.ID,nonce:this.settings.nonce,type:this.settings.type,displayLikers:this.settings.displayLikers,likersTemplate:this.settings.likersTemplate},t=>{e&&e.classList.remove("wp_ulike_is_getting_likers_list"),this._isFetchingLikers=!1,t.success?this._updateLikersMarkup(t.data):this._updateLikersMarkup("")})},_getAllTooltipElements(){const e=void 0!==this.settings.factor&&this.settings.factor?`_${this.settings.factor}`:"",s=`.wp_${this.settings.type.toLowerCase()}${e}_btn_${this.settings.ID}`,i=t.querySelectorAll(s),n=[];return u(i,e=>{const t=e.closest(".wpulike");t&&!n.includes(t)&&n.push(t)}),n.length>0?n:[this.element]},_updateLikers(t){if(this.settings.displayLikers){if("popover"===this.settings.likersTemplate&&o(this.element,"ulike-tooltip"))return;if("default"===this.settings.likersTemplate&&this.likersElement&&(this.likersElement.length===s||this.likersElement.length>0))return;if("popover"===this.settings.likersTemplate){if("undefined"!=typeof WordpressUlikeTooltipPlugin){const t=`${this.settings.type.toLowerCase()}-${this.settings.ID}`;(e.WordpressUlikeTooltip&&e.WordpressUlikeTooltip.getInstanceByElement?e.WordpressUlikeTooltip.getInstanceByElement(this.element):null)||new WordpressUlikeTooltipPlugin(this.element,{id:t,position:"top",child:this.settings.generalSelector,theme:"white",size:"tiny",trigger:"hover",dataFetcher:(e,t)=>{this._fetchLikersData()}})}}else this._fetchLikersData();return t&&t.stopImmediatePropagation(),!1}},_updateLikersMarkup(e){if("popover"===this.settings.likersTemplate){this.likersElement=this.element;this.settings.type.toLowerCase(),this.settings.ID;const s=(e&&"object"==typeof e?e.template:e)||"",i=this._getAllTooltipElements();u(i,e=>{const i=new CustomEvent("tooltip-content-updated",{bubbles:!0,detail:{element:e,content:s}});e.dispatchEvent(i),t.dispatchEvent(i);let n=e.querySelector("[data-tooltip-content]");n||(n=t.createElement("div"),n.setAttribute("data-tooltip-content",""),n.setAttribute("data-tooltip-state","ready"),n.style.display="none",e.appendChild(n)),n.innerHTML=s,n.setAttribute("data-tooltip-state","ready")})}else{if(!(this.likersElement&&(this.likersElement.length===s||this.likersElement.length>0))&&e&&e.template){const s=t.createElement("div");s.innerHTML=e.template;const i=s.firstElementChild;i&&(this.element.appendChild(i),this.likersElement=i)}if(this.likersElement){const t=this.likersElement.length!==s?a(this.likersElement):[this.likersElement],i=e&&"object"==typeof e&&e.template?e.template:"string"==typeof e?e:"";u(t,e=>{e&&(i?(e.style.display="",e.innerHTML=i):(e.style.display="none",e.innerHTML=""))})}}const i=e&&"object"==typeof e?e.template:e;r(t,"WordpressUlikeLikersMarkupUpdated",[this.likersElement,this.settings.likersTemplate,i])},_updateSameButtons(){const e=void 0!==this.settings.factor&&this.settings.factor?`_${this.settings.factor}`:"",s=`.wp_${this.settings.type.toLowerCase()}${e}_btn_${this.settings.ID}`;if(this.sameButtons=t.querySelectorAll(s),this.sameButtons.length>1){this.buttonElement=this.sameButtons;const e=[];u(this.sameButtons,t=>{const s=t.closest(this.settings.generalSelector);s&&e.push(s)}),this.generalElement=1===e.length?e[0]:e;const t=[];u(e,e=>{const s=e.querySelectorAll(this.settings.counterSelector);u(s,e=>{t.push(e)})}),this.counterElement=t}},_updateSameLikers(){const e=`.wp_${this.settings.type.toLowerCase()}_likers_${this.settings.ID}`;this.sameLikers=t.querySelectorAll(e),this.sameLikers.length>1&&(this.likersElement=this.sameLikers)},_getLikersElement(){return this.likersElement},_updateButton(e,t){u(this.buttonElement,s=>{if(s)if(s.classList.contains("wp_ulike_put_image"))4===t?s.classList.add("image-unlike","wp_ulike_btn_is_active"):(s.classList.toggle("image-unlike"),s.classList.toggle("wp_ulike_btn_is_active"));else if(s.classList.contains("wp_ulike_put_text")&&null!==e){const t=s.querySelector("span");t&&(t.innerHTML=e)}}),this.siblingElement&&this.siblingElement.length&&u(this.siblingElement,e=>{const t=e.querySelector(this.settings.buttonSelector);t&&t.classList.remove("image-unlike","wp_ulike_btn_is_active")}),this.siblingButton&&this.siblingButton.length&&u(this.siblingButton,e=>{e.classList.remove("image-unlike","wp_ulike_btn_is_active")})},_sendNotification(e,s){"undefined"!=typeof WordpressUlikeNotifications&&new WordpressUlikeNotifications(t.body,{messageType:e,messageText:s})},destroy(){this._boundHandlers.forEach(({element:e,event:t,handler:i})=>{e&&e.length!==s?u(e,e=>{e&&e.removeEventListener(t,i)}):e&&e.removeEventListener(t,i)}),this._boundHandlers=[],this._timeouts.forEach(e=>{clearTimeout(e)}),this._timeouts=[],this._isFetchingLikers=!1}},e[i]=p,"undefined"!=typeof jQuery&&jQuery&&jQuery.fn&&(jQuery.fn[i]=function(e){return this.each(function(){this.hasAttribute&&this.hasAttribute("data-ulike-initialized")||(new p(this,e),this.setAttribute&&this.setAttribute("data-ulike-initialized","true"))})})}(window,document),function(e,t){"use strict";const s=e=>Array.from?Array.from(e):Array.prototype.slice.call(e),i=e=>{if(!e)return;(void 0!==e.length?s(e):[e]).forEach(e=>{e&&"undefined"!=typeof WordpressUlike&&(e.hasAttribute("data-ulike-initialized")||(new WordpressUlike(e),e.setAttribute("data-ulike-initialized","true")))})},n=t.querySelectorAll(".wpulike");i(n);((i,n,l)=>{const o=e=>{e.forEach(e=>{e.addedNodes.length&&e.addedNodes.forEach(e=>{if(1===e.nodeType&&e.matches&&e.matches(n)&&l(e),1===e.nodeType&&e.querySelectorAll){const t=e.querySelectorAll(n);s(t).forEach(e=>l(e))}})})},r=t.querySelector(i);if(!r)return;const a={childList:!0,subtree:!0},u=e.MutationObserver||e.WebKitMutationObserver;if(u){new u(o).observe(r,a)}})("body",".wpulike",e=>{i(e)})}(window,document);
  • wp-ulike/trunk/includes/functions/counter.php

    r3406278 r3412215  
    8989            $table = isset( $table_info['table'] ) ? $table_info['table'] : '';
    9090            $column = isset( $table_info['column'] ) ? $table_info['column'] : '';
    91             $is_distinct = isset( $table_info['is_distinct'] ) ? $table_info['is_distinct'] : false;
    92 
    93             // Sanitize status value
    94             $allowed_statuses = array( 'like', 'dislike', 'unlike', 'undislike', 'all' );
    95             $status = in_array( $status, $allowed_statuses, true ) ? $status : 'all';
    9691
    9792            $status_condition = $status !== 'all' ? $wpdb->prepare( "`status` = %s", $status ) : "`status` NOT LIKE 'un%'";
  • wp-ulike/trunk/readme.txt

    r3406278 r3412215  
    66Requires PHP: 7.2.5
    77Requires at least: 6.0
    8 Tested up to: 6.8
    9 Stable tag: 4.8.1
     8Tested up to: 6.9
     9Stable tag: 4.8.2
    1010License: GPLv2 or later
    1111License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    181181
    182182== Changelog ==
     183
     184= 4.8.2 =
     185* Improved: Fixed memory leaks and optimized JavaScript performance.
     186* Fixed: Various minor bug fixes and improvements.
    183187
    184188= 4.8.1 =
  • wp-ulike/trunk/wp-ulike.php

    r3406278 r3412215  
    44 * Plugin URI:        https://wpulike.com/?utm_source=wp-plugins&utm_campaign=plugin-uri&utm_medium=wp-dash
    55 * Description:       Looking to increase user engagement on your WordPress site? WP ULike plugin lets you easily add voting buttons to your content. With customizable settings and detailed analytics, you can track user engagement, optimize your content, and build a loyal following.
    6  * Version:           4.8.1
     6 * Version:           4.8.2
    77 * Author:            TechnoWich
    88 * Author URI:        https://technowich.com/?utm_source=wp-plugins&utm_campaign=author-uri&utm_medium=wp-dash
    99 * Text Domain:       wp-ulike
    1010 * Domain Path:       /languages
    11  * Tested up to:      6.8
     11 * Tested up to:      6.9
    1212 * License: GPL-2.0+
    1313 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    3131// Do not change these values
    3232define( 'WP_ULIKE_PLUGIN_URI'   , 'https://wpulike.com/'                    );
    33 define( 'WP_ULIKE_VERSION'      , '4.8.1'                                   );
     33define( 'WP_ULIKE_VERSION'      , '4.8.2'                                   );
    3434define( 'WP_ULIKE_DB_VERSION'   , '2.4'                                     );
    3535define( 'WP_ULIKE_SLUG'         , 'wp-ulike'                                );
Note: See TracChangeset for help on using the changeset viewer.