Changeset 3412215
- Timestamp:
- 12/05/2025 01:12:54 PM (3 months ago)
- Location:
- wp-ulike/trunk
- Files:
-
- 5 edited
-
assets/js/wp-ulike.js (modified) (21 diffs)
-
assets/js/wp-ulike.min.js (modified) (1 diff)
-
includes/functions/counter.php (modified) (1 diff)
-
readme.txt (modified) (2 diffs)
-
wp-ulike.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
wp-ulike/trunk/assets/js/wp-ulike.js
r3406278 r3412215 1 /*! WP ULike - v4.8. 11 /*! WP ULike - v4.8.2 2 2 * https://wpulike.com 3 3 * TechnoWich 2025; … … 9 9 10 10 /** 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 13 17 */ 14 18 (function (window, document, undefined) { … … 178 182 let scrollHandler = null; 179 183 let scrollHandlerOptions = null; 184 let outsideHandler = null; // Store for cleanup 180 185 let isHovering = false; // Track if user is currently hovering 181 186 … … 443 448 // Click outside handler 444 449 if (options.close_on_outside_click !== false) { 445 constoutsideHandler = (e) => {450 outsideHandler = (e) => { 446 451 if ( 447 452 tooltip && … … 473 478 scrollHandler = null; 474 479 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; 475 492 } 476 493 tooltipInstances.delete(element); … … 583 600 584 601 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 */ 586 610 (function (window, document, undefined) { 587 611 "use strict"; … … 623 647 * Optimized: use requestAnimationFrame for better timing 624 648 */ 625 const fadeOut = (element, callback ) => {649 const fadeOut = (element, callback, instance) => { 626 650 if (!element) return; 627 651 … … 631 655 632 656 // Remove element after transition completes 633 setTimeout(() => { 657 const timeoutId = setTimeout(() => { 658 if (instance) instance.fadeTimeoutId = null; 634 659 if (callback) { 635 660 callback(); 636 661 } 637 662 }, FADE_OUT_DURATION); 663 if (instance) instance.fadeTimeoutId = timeoutId; 638 664 }); 639 665 }; … … 675 701 this._name = pluginName; 676 702 this.timeoutId = null; 703 this.fadeTimeoutId = null; // Track fade timeout 677 704 this.isRemoving = false; 678 705 // Cache className to avoid template literal on each access … … 769 796 this.isRemoving = true; 770 797 771 // Clear timeout if still pending798 // Clear timeouts if still pending 772 799 if (this.timeoutId) { 773 800 clearTimeout(this.timeoutId); 774 801 this.timeoutId = null; 775 802 } 803 if (this.fadeTimeoutId) { 804 clearTimeout(this.fadeTimeoutId); 805 this.fadeTimeoutId = null; 806 } 776 807 777 808 // Remove message with fade out 778 809 fadeOut(this.messageElement, () => { 779 810 this._cleanup(); 780 } );811 }, this); 781 812 }, 782 813 … … 837 868 838 869 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 */ 839 878 (function (window, document, undefined) { 840 879 "use strict"; … … 979 1018 this._defaults = defaults; 980 1019 this._name = pluginName; 1020 // Store handlers and timeouts for cleanup 1021 this._boundHandlers = []; 1022 this._timeouts = []; 1023 // Initialize fetching flag 1024 this._isFetchingLikers = false; 981 1025 982 1026 // Create main selectors (like jQuery .find()) … … 1032 1076 // Attach click listeners to ALL buttons 1033 1077 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 }); 1034 1080 forEachElement(this.buttonElement, (button) => { 1035 1081 if (button) { 1036 button.addEventListener("click", this._initLike.bind(this));1082 button.addEventListener("click", boundHandler); 1037 1083 } 1038 1084 }); … … 1044 1090 this._updateLikers(event); 1045 1091 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); 1046 1095 }; 1096 this._boundHandlers.push({ element: firstGeneralEl, event: 'mouseenter', handler: mouseenterHandler }); 1047 1097 firstGeneralEl.addEventListener("mouseenter", mouseenterHandler); 1048 1098 } … … 1183 1233 1184 1234 if (this.settings.appendTimeout && appendedElements.length > 0) { 1185 setTimeout(() => {1235 const timeoutId = setTimeout(() => { 1186 1236 appendedElements.forEach((el) => { 1187 1237 if (el && el.parentNode) { … … 1190 1240 }); 1191 1241 }, this.settings.appendTimeout); 1242 this._timeouts.push(timeoutId); 1192 1243 } 1193 1244 } … … 1326 1377 /** 1327 1378 * Fetch likers data via AJAX 1379 * Prevents duplicate requests 1328 1380 */ 1329 1381 _fetchLikersData() { … … 1332 1384 return; 1333 1385 } 1386 1387 // Prevent duplicate requests 1388 if (this._isFetchingLikers) { 1389 return; 1390 } 1391 1392 this._isFetchingLikers = true; 1334 1393 1335 1394 const generalEl = getSingleElement(this.generalElement); … … 1421 1480 trigger: "hover", 1422 1481 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 1427 1484 this._fetchLikersData(); 1428 1485 } … … 1637 1694 } 1638 1695 }, 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 }, 1639 1722 }; 1640 1723 … … 1661 1744 1662 1745 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 */ 1663 1754 (function (window, document) { 1664 1755 "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||" "),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||" ";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||" "),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||" ";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 89 89 $table = isset( $table_info['table'] ) ? $table_info['table'] : ''; 90 90 $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 value94 $allowed_statuses = array( 'like', 'dislike', 'unlike', 'undislike', 'all' );95 $status = in_array( $status, $allowed_statuses, true ) ? $status : 'all';96 91 97 92 $status_condition = $status !== 'all' ? $wpdb->prepare( "`status` = %s", $status ) : "`status` NOT LIKE 'un%'"; -
wp-ulike/trunk/readme.txt
r3406278 r3412215 6 6 Requires PHP: 7.2.5 7 7 Requires at least: 6.0 8 Tested up to: 6. 89 Stable tag: 4.8. 18 Tested up to: 6.9 9 Stable tag: 4.8.2 10 10 License: GPLv2 or later 11 11 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 181 181 182 182 == Changelog == 183 184 = 4.8.2 = 185 * Improved: Fixed memory leaks and optimized JavaScript performance. 186 * Fixed: Various minor bug fixes and improvements. 183 187 184 188 = 4.8.1 = -
wp-ulike/trunk/wp-ulike.php
r3406278 r3412215 4 4 * Plugin URI: https://wpulike.com/?utm_source=wp-plugins&utm_campaign=plugin-uri&utm_medium=wp-dash 5 5 * 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. 16 * Version: 4.8.2 7 7 * Author: TechnoWich 8 8 * Author URI: https://technowich.com/?utm_source=wp-plugins&utm_campaign=author-uri&utm_medium=wp-dash 9 9 * Text Domain: wp-ulike 10 10 * Domain Path: /languages 11 * Tested up to: 6. 811 * Tested up to: 6.9 12 12 * License: GPL-2.0+ 13 13 * License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 31 31 // Do not change these values 32 32 define( 'WP_ULIKE_PLUGIN_URI' , 'https://wpulike.com/' ); 33 define( 'WP_ULIKE_VERSION' , '4.8. 1' );33 define( 'WP_ULIKE_VERSION' , '4.8.2' ); 34 34 define( 'WP_ULIKE_DB_VERSION' , '2.4' ); 35 35 define( 'WP_ULIKE_SLUG' , 'wp-ulike' );
Note: See TracChangeset
for help on using the changeset viewer.