diff --git a/modules.local/ppcp-button/assets/js/button.js b/modules.local/ppcp-button/assets/js/button.js index f92b498ed..aa90ab1a6 100644 --- a/modules.local/ppcp-button/assets/js/button.js +++ b/modules.local/ppcp-button/assets/js/button.js @@ -1,600 +1,2 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./resources/js/button.js"); -/******/ }) -/************************************************************************/ -/******/ ({ - -/***/ "./resources/js/button.js": -/*!********************************!*\ - !*** ./resources/js/button.js ***! - \********************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _modules_Renderer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/Renderer */ "./resources/js/modules/Renderer.js"); -/* harmony import */ var _modules_SingleProductConfig__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/SingleProductConfig */ "./resources/js/modules/SingleProductConfig.js"); -/* harmony import */ var _modules_UpdateCart__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/UpdateCart */ "./resources/js/modules/UpdateCart.js"); -/* harmony import */ var _modules_ErrorHandler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/ErrorHandler */ "./resources/js/modules/ErrorHandler.js"); -/* harmony import */ var _modules_CartConfig__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/CartConfig */ "./resources/js/modules/CartConfig.js"); - - - - - - -const bootstrap = () => { - const context = PayPalCommerceGateway.context; - const errorHandler = new _modules_ErrorHandler__WEBPACK_IMPORTED_MODULE_3__["default"](); - const defaultConfigurator = new _modules_CartConfig__WEBPACK_IMPORTED_MODULE_4__["default"](PayPalCommerceGateway, errorHandler); - // Configure mini cart buttons - if (document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) { - - const renderer = new _modules_Renderer__WEBPACK_IMPORTED_MODULE_0__["default"](PayPalCommerceGateway.button.mini_cart_wrapper); - renderer.render(defaultConfigurator.configuration()); - } - jQuery(document.body).on('wc_fragments_loaded wc_fragments_refreshed', () => { - if (!document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) { - return; - } - const renderer = new _modules_Renderer__WEBPACK_IMPORTED_MODULE_0__["default"](PayPalCommerceGateway.button.mini_cart_wrapper); - renderer.render(defaultConfigurator.configuration()); - }); - - // Configure checkout buttons - jQuery(document.body).on('updated_checkout', () => { - if (document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) { - return; - } - - const renderer = new _modules_Renderer__WEBPACK_IMPORTED_MODULE_0__["default"](PayPalCommerceGateway.button.wrapper); - renderer.render(defaultConfigurator.configuration()); - - jQuery(document.body).trigger('payment_method_selected'); - }); - jQuery(document.body).on('payment_method_selected', () => { - // TODO: replace this dirty check, possible create a separate context config - const currentPaymentMethod = jQuery('input[name="payment_method"]:checked').val(); - - if (currentPaymentMethod !== 'ppcp-gateway') { - jQuery(PayPalCommerceGateway.button.wrapper).hide(); - jQuery('#place_order').show(); - } else { - jQuery(PayPalCommerceGateway.button.wrapper).show(); - jQuery('#place_order').hide(); - } - }); - - // Configure context buttons - if (!document.querySelector(PayPalCommerceGateway.button.wrapper)) { - return; - } - const renderer = new _modules_Renderer__WEBPACK_IMPORTED_MODULE_0__["default"](PayPalCommerceGateway.button.wrapper); - let configurator = null; - if (context === 'product') { - if (!document.querySelector('form.cart')) { - return; - } - const updateCart = new _modules_UpdateCart__WEBPACK_IMPORTED_MODULE_2__["default"](PayPalCommerceGateway.ajax.change_cart.endpoint, PayPalCommerceGateway.ajax.change_cart.nonce); - configurator = new _modules_SingleProductConfig__WEBPACK_IMPORTED_MODULE_1__["default"](PayPalCommerceGateway, updateCart, renderer.showButtons.bind(renderer), renderer.hideButtons.bind(renderer), document.querySelector('form.cart'), errorHandler); - } - if (context === 'cart') { - configurator = defaultConfigurator; - - jQuery(document.body).on('updated_cart_totals updated_checkout', () => { - renderer.render(configurator.configuration()); - }); - } - if (!configurator) { - console.error('No context for button found.'); - return; - } - - renderer.render(configurator.configuration()); -}; -document.addEventListener('DOMContentLoaded', () => { - - if (!typeof PayPalCommerceGateway) { - console.error('PayPal button could not be configured.'); - return; - } - - const script = document.createElement('script'); - script.setAttribute('src', PayPalCommerceGateway.button.url); - script.addEventListener('load', event => { - bootstrap(); - }); - document.body.append(script); -}); - -/***/ }), - -/***/ "./resources/js/modules/ButtonsToggleListener.js": -/*!*******************************************************!*\ - !*** ./resources/js/modules/ButtonsToggleListener.js ***! - \*******************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/** - * When you can't add something to the cart, the PayPal buttons should not show. - * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly. - */ - -class ButtonsToggleListener { - constructor(element, showCallback, hideCallback) { - this.element = element; - this.showCallback = showCallback; - this.hideCallback = hideCallback; - this.observer = null; - } - - init() { - const config = { attributes: true }; - const callback = () => { - if (this.element.classList.contains('disabled')) { - this.hideCallback(); - return; - } - this.showCallback(); - }; - this.observer = new MutationObserver(callback); - this.observer.observe(this.element, config); - } - - disconnect() { - this.observer.disconnect(); - } -} - -/* harmony default export */ __webpack_exports__["default"] = (ButtonsToggleListener); - -/***/ }), - -/***/ "./resources/js/modules/CartConfig.js": -/*!********************************************!*\ - !*** ./resources/js/modules/CartConfig.js ***! - \********************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _onApprove__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./onApprove */ "./resources/js/modules/onApprove.js"); - - -class CartConfig { - - constructor(config, errorHandler) { - this.config = config; - this.errorHandler = errorHandler; - } - - configuration() { - - const createOrder = (data, actions) => { - return fetch(this.config.ajax.create_order.endpoint, { - method: 'POST', - body: JSON.stringify({ - nonce: this.config.ajax.create_order.nonce, - purchase_units: [] - }) - }).then(function (res) { - return res.json(); - }).then(function (data) { - if (!data.success) { - //Todo: Error handling - return; - } - return data.data.id; - }); - }; - return { - createOrder, - onApprove: Object(_onApprove__WEBPACK_IMPORTED_MODULE_0__["default"])(this), - onError: error => { - this.errorHandler.message(error); - } - }; - } -} - -/* harmony default export */ __webpack_exports__["default"] = (CartConfig); - -/***/ }), - -/***/ "./resources/js/modules/ErrorHandler.js": -/*!**********************************************!*\ - !*** ./resources/js/modules/ErrorHandler.js ***! - \**********************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -class ErrorHandler { - - constructor() { - this.wrapper = document.querySelector('.woocommerce-notices-wrapper'); - } - - message(text) { - this.wrapper.classList.add('woocommerce-error'); - this.wrapper.innerText = this.sanitize(text); - } - - sanitize(text) { - const textarea = document.createElement('textarea'); - textarea.innerHTML = text; - return textarea.value; - } - - clear() { - if (!this.wrapper.classList.contains('woocommerce-error')) { - return; - } - this.wrapper.classList.remove('woocommerce-error'); - this.wrapper.innerText = ''; - } -} - -/* harmony default export */ __webpack_exports__["default"] = (ErrorHandler); - -/***/ }), - -/***/ "./resources/js/modules/Product.js": -/*!*****************************************!*\ - !*** ./resources/js/modules/Product.js ***! - \*****************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -class Product { - - constructor(id, quantity, variations) { - this.id = id; - this.quantity = quantity; - this.variations = variations; - } - - data() { - return { - id: this.id, - quantity: this.quantity, - variations: this.variations - }; - } -} - -/* harmony default export */ __webpack_exports__["default"] = (Product); - -/***/ }), - -/***/ "./resources/js/modules/Renderer.js": -/*!******************************************!*\ - !*** ./resources/js/modules/Renderer.js ***! - \******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -class Renderer { - - constructor(wrapper) { - this.wrapper = wrapper; - } - - render(buttonConfig) { - - paypal.Buttons(buttonConfig).render(this.wrapper); - } - - hideButtons() { - document.querySelector(this.wrapper).style.display = 'none'; - } - - showButtons() { - document.querySelector(this.wrapper).style.display = 'block'; - } -} - -/* harmony default export */ __webpack_exports__["default"] = (Renderer); - -/***/ }), - -/***/ "./resources/js/modules/SingleProductConfig.js": -/*!*****************************************************!*\ - !*** ./resources/js/modules/SingleProductConfig.js ***! - \*****************************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _ButtonsToggleListener__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ButtonsToggleListener */ "./resources/js/modules/ButtonsToggleListener.js"); -/* harmony import */ var _Product__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Product */ "./resources/js/modules/Product.js"); -/* harmony import */ var _onApprove__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./onApprove */ "./resources/js/modules/onApprove.js"); - - - -class SingleProductConfig { - - constructor(config, updateCart, showButtonCallback, hideButtonCallback, formElement, errorHandler) { - this.config = config; - this.updateCart = updateCart; - this.showButtonCallback = showButtonCallback; - this.hideButtonCallback = hideButtonCallback; - this.formElement = formElement; - this.errorHandler = errorHandler; - } - - configuration() { - - if (this.hasVariations()) { - const observer = new _ButtonsToggleListener__WEBPACK_IMPORTED_MODULE_0__["default"](this.formElement.querySelector('.single_add_to_cart_button'), this.showButtonCallback, this.hideButtonCallback); - observer.init(); - } - - return { - createOrder: this.createOrder(), - onApprove: Object(_onApprove__WEBPACK_IMPORTED_MODULE_2__["default"])(this), - onError: error => { - this.errorHandler.message(error); - } - }; - } - - createOrder() { - var getProducts = null; - if (!this.isGroupedProduct()) { - getProducts = () => { - const id = document.querySelector('[name="add-to-cart"]').value; - const qty = document.querySelector('[name="quantity"]').value; - const variations = this.variations(); - return [new _Product__WEBPACK_IMPORTED_MODULE_1__["default"](id, qty, variations)]; - }; - } else { - getProducts = () => { - const products = []; - this.formElement.querySelectorAll('input[type="number"]').forEach(element => { - if (!element.value) { - return; - } - const elementName = element.getAttribute('name').match(/quantity\[([\d]*)\]/); - if (elementName.length !== 2) { - return; - } - const id = parseInt(elementName[1]); - const quantity = parseInt(element.value); - products.push(new _Product__WEBPACK_IMPORTED_MODULE_1__["default"](id, quantity, null)); - }); - return products; - }; - } - const createOrder = (data, actions) => { - this.errorHandler.clear(); - - const onResolve = purchase_units => { - return fetch(this.config.ajax.create_order.endpoint, { - method: 'POST', - body: JSON.stringify({ - nonce: this.config.ajax.create_order.nonce, - purchase_units - }) - }).then(function (res) { - return res.json(); - }).then(function (data) { - if (!data.success) { - //Todo: Error handling - return; - } - return data.data.id; - }); - }; - - const promise = this.updateCart.update(onResolve, getProducts()); - return promise; - }; - return createOrder; - } - - variations() { - - if (!this.hasVariations()) { - return null; - } - const attributes = [...this.formElement.querySelectorAll("[name^='attribute_']")].map(element => { - return { - value: element.value, - name: element.name - }; - }); - return attributes; - } - - hasVariations() { - return this.formElement.classList.contains('variations_form'); - } - - isGroupedProduct() { - return this.formElement.classList.contains('grouped_form'); - } -} -/* harmony default export */ __webpack_exports__["default"] = (SingleProductConfig); - -/***/ }), - -/***/ "./resources/js/modules/UpdateCart.js": -/*!********************************************!*\ - !*** ./resources/js/modules/UpdateCart.js ***! - \********************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _Product__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Product */ "./resources/js/modules/Product.js"); - -class UpdateCart { - - constructor(endpoint, nonce) { - this.endpoint = endpoint; - this.nonce = nonce; - } - - /** - * - * @param onResolve - * @param {Product[]} products - * @returns {Promise} - */ - update(onResolve, products) { - return new Promise((resolve, reject) => { - fetch(this.endpoint, { - method: 'POST', - body: JSON.stringify({ - nonce: this.nonce, - products - }) - }).then(result => { - return result.json(); - }).then(result => { - if (!result.success) { - reject(result.data); - return; - } - - const resolved = onResolve(result.data); - resolve(resolved); - }); - }); - } -} - -/* harmony default export */ __webpack_exports__["default"] = (UpdateCart); - -/***/ }), - -/***/ "./resources/js/modules/onApprove.js": -/*!*******************************************!*\ - !*** ./resources/js/modules/onApprove.js ***! - \*******************************************/ -/*! exports provided: default */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -const onApprove = context => { - return (data, actions) => { - return fetch(context.config.ajax.approve_order.endpoint, { - method: 'POST', - body: JSON.stringify({ - nonce: context.config.ajax.approve_order.nonce, - order_id: data.orderID - }) - }).then(res => { - return res.json(); - }).then(data => { - if (!data.success) { - //Todo: Error handling - return; - } - location.href = context.config.redirect; - }); - }; -}; - -/* harmony default export */ __webpack_exports__["default"] = (onApprove); - -/***/ }) - -/******/ }); +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=0)}([function(e,t,r){"use strict";r.r(t);var n=class{constructor(e){this.wrapper=e}render(e){paypal.Buttons(e).render(this.wrapper)}hideButtons(){document.querySelector(this.wrapper).style.display="none"}showButtons(){document.querySelector(this.wrapper).style.display="block"}};var o=class{constructor(e,t,r){this.element=e,this.showCallback=t,this.hideCallback=r,this.observer=null}init(){this.observer=new MutationObserver(()=>{this.element.classList.contains("disabled")?this.hideCallback():this.showCallback()}),this.observer.observe(this.element,{attributes:!0})}disconnect(){this.observer.disconnect()}};var a=class{constructor(e,t,r){this.id=e,this.quantity=t,this.variations=r}data(){return{id:this.id,quantity:this.quantity,variations:this.variations}}};var i=e=>(t,r)=>fetch(e.config.ajax.approve_order.endpoint,{method:"POST",body:JSON.stringify({nonce:e.config.ajax.approve_order.nonce,order_id:t.orderID})}).then(e=>e.json()).then(t=>{t.success&&(location.href=e.config.redirect)});var c=class{constructor(e,t,r,n,o,a){this.config=e,this.updateCart=t,this.showButtonCallback=r,this.hideButtonCallback=n,this.formElement=o,this.errorHandler=a}configuration(){if(this.hasVariations()){new o(this.formElement.querySelector(".single_add_to_cart_button"),this.showButtonCallback,this.hideButtonCallback).init()}return{createOrder:this.createOrder(),onApprove:i(this),onError:e=>{this.errorHandler.message(e)}}}createOrder(){var e=null;e=this.isGroupedProduct()?()=>{const e=[];return this.formElement.querySelectorAll('input[type="number"]').forEach(t=>{if(!t.value)return;const r=t.getAttribute("name").match(/quantity\[([\d]*)\]/);if(2!==r.length)return;const n=parseInt(r[1]),o=parseInt(t.value);e.push(new a(n,o,null))}),e}:()=>{const e=document.querySelector('[name="add-to-cart"]').value,t=document.querySelector('[name="quantity"]').value,r=this.variations();return[new a(e,t,r)]};return(t,r)=>{this.errorHandler.clear();return this.updateCart.update(e=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:e})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),e())}}variations(){if(!this.hasVariations())return null;return[...this.formElement.querySelectorAll("[name^='attribute_']")].map(e=>({value:e.value,name:e.name}))}hasVariations(){return this.formElement.classList.contains("variations_form")}isGroupedProduct(){return this.formElement.classList.contains("grouped_form")}};var s=class{constructor(e,t){this.endpoint=e,this.nonce=t}update(e,t){return new Promise((r,n)=>{fetch(this.endpoint,{method:"POST",body:JSON.stringify({nonce:this.nonce,products:t})}).then(e=>e.json()).then(t=>{if(!t.success)return void n(t.data);const o=e(t.data);r(o)})})}};var u=class{constructor(){this.wrapper=document.querySelector(".woocommerce-notices-wrapper")}message(e){this.wrapper.classList.add("woocommerce-error"),this.wrapper.innerText=this.sanitize(e)}sanitize(e){const t=document.createElement("textarea");return t.innerHTML=e,t.value}clear(){this.wrapper.classList.contains("woocommerce-error")&&(this.wrapper.classList.remove("woocommerce-error"),this.wrapper.innerText="")}};var d=class{constructor(e,t){this.config=e,this.errorHandler=t}configuration(){return{createOrder:(e,t)=>fetch(this.config.ajax.create_order.endpoint,{method:"POST",body:JSON.stringify({nonce:this.config.ajax.create_order.nonce,purchase_units:[]})}).then((function(e){return e.json()})).then((function(e){if(e.success)return e.data.id})),onApprove:i(this),onError:e=>{this.errorHandler.message(e)}}}};document.addEventListener("DOMContentLoaded",()=>{const e=document.createElement("script");e.setAttribute("src",PayPalCommerceGateway.button.url),e.addEventListener("load",e=>{(()=>{const e=PayPalCommerceGateway.context,t=new u,r=new d(PayPalCommerceGateway,t);if(document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)){new n(PayPalCommerceGateway.button.mini_cart_wrapper).render(r.configuration())}if(jQuery(document.body).on("wc_fragments_loaded wc_fragments_refreshed",()=>{if(!document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper))return;new n(PayPalCommerceGateway.button.mini_cart_wrapper).render(r.configuration())}),!document.querySelector(PayPalCommerceGateway.button.wrapper))return;const o=new n(PayPalCommerceGateway.button.wrapper);let a=null;if("product"===e){if(!document.querySelector("form.cart"))return;const e=new s(PayPalCommerceGateway.ajax.change_cart.endpoint,PayPalCommerceGateway.ajax.change_cart.nonce);a=new c(PayPalCommerceGateway,e,o.showButtons.bind(o),o.hideButtons.bind(o),document.querySelector("form.cart"),t)}if("cart"===e&&(a=r,jQuery(document.body).on("updated_cart_totals updated_checkout",()=>{o.render(a.configuration())})),"checkout"===e&&(a=r,!document.querySelector(PayPalCommerceGateway.button.cancel_wrapper))){const e=()=>{"ppcp-gateway"!==jQuery('input[name="payment_method"]:checked').val()?(o.hideButtons(),jQuery("#place_order").show()):(o.showButtons(),jQuery("#place_order").hide())};jQuery(document.body).on("updated_checkout",()=>{o.render(r.configuration()),jQuery(document.body).trigger("payment_method_selected")}),jQuery(document.body).on("payment_method_selected",e),e()}a?o.render(a.configuration()):console.error("No context for button found.")})()}),document.body.append(e)})}]); //# sourceMappingURL=button.js.map \ No newline at end of file diff --git a/modules.local/ppcp-button/assets/js/button.js.map b/modules.local/ppcp-button/assets/js/button.js.map index c8cf19204..eca872866 100644 --- a/modules.local/ppcp-button/assets/js/button.js.map +++ b/modules.local/ppcp-button/assets/js/button.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/js/button.js","webpack:///./resources/js/modules/ButtonsToggleListener.js","webpack:///./resources/js/modules/CartConfig.js","webpack:///./resources/js/modules/ErrorHandler.js","webpack:///./resources/js/modules/Product.js","webpack:///./resources/js/modules/Renderer.js","webpack:///./resources/js/modules/SingleProductConfig.js","webpack:///./resources/js/modules/UpdateCart.js","webpack:///./resources/js/modules/onApprove.js"],"names":["bootstrap","context","PayPalCommerceGateway","errorHandler","ErrorHandler","defaultConfigurator","CartConfig","document","querySelector","button","mini_cart_wrapper","renderer","Renderer","render","configuration","jQuery","body","on","cancel_wrapper","wrapper","trigger","currentPaymentMethod","val","hide","show","configurator","updateCart","UpdateCart","ajax","change_cart","endpoint","nonce","SingleProductConfig","showButtons","bind","hideButtons","console","error","addEventListener","script","createElement","setAttribute","url","event","append","ButtonsToggleListener","constructor","element","showCallback","hideCallback","observer","init","config","attributes","callback","classList","contains","MutationObserver","observe","disconnect","createOrder","data","actions","fetch","create_order","method","JSON","stringify","purchase_units","then","res","json","success","id","onApprove","onError","message","text","add","innerText","sanitize","textarea","innerHTML","value","clear","remove","Product","quantity","variations","buttonConfig","paypal","Buttons","style","display","showButtonCallback","hideButtonCallback","formElement","hasVariations","getProducts","isGroupedProduct","qty","products","querySelectorAll","forEach","elementName","getAttribute","match","length","parseInt","push","onResolve","promise","update","map","name","Promise","resolve","reject","result","resolved","approve_order","order_id","orderID","location","href","redirect"],"mappings":"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","file":"js/button.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./resources/js/button.js\");\n","import Renderer from './modules/Renderer';\nimport SingleProductConfig from './modules/SingleProductConfig';\nimport UpdateCart from './modules/UpdateCart';\nimport ErrorHandler from './modules/ErrorHandler';\nimport CartConfig from './modules/CartConfig';\n\nconst bootstrap = ()=> {\n const context = PayPalCommerceGateway.context;\n const errorHandler = new ErrorHandler();\n const defaultConfigurator = new CartConfig(\n PayPalCommerceGateway,\n errorHandler\n );\n // Configure mini cart buttons\n if (document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) {\n\n const renderer = new Renderer(\n PayPalCommerceGateway.button.mini_cart_wrapper\n );\n renderer.render(defaultConfigurator.configuration())\n }\n jQuery( document.body ).on( 'wc_fragments_loaded wc_fragments_refreshed', () => {\n if (! document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) {\n return;\n }\n const renderer = new Renderer(\n PayPalCommerceGateway.button.mini_cart_wrapper\n );\n renderer.render(defaultConfigurator.configuration())\n } );\n\n // Configure checkout buttons\n jQuery( document.body ).on( 'updated_checkout', () => {\n if (document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) {\n return;\n }\n\n const renderer = new Renderer(\n PayPalCommerceGateway.button.wrapper\n );\n renderer.render(defaultConfigurator.configuration());\n\n jQuery( document.body ).trigger( 'payment_method_selected' )\n } );\n jQuery( document.body ).on( 'payment_method_selected', () => {\n // TODO: replace this dirty check, possible create a separate context config\n const currentPaymentMethod = jQuery('input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway') {\n jQuery(PayPalCommerceGateway.button.wrapper).hide();\n jQuery('#place_order').show();\n } else {\n jQuery(PayPalCommerceGateway.button.wrapper).show();\n jQuery('#place_order').hide();\n }\n } );\n\n // Configure context buttons\n if (! document.querySelector(PayPalCommerceGateway.button.wrapper)) {\n return;\n }\n const renderer = new Renderer(\n PayPalCommerceGateway.button.wrapper\n );\n let configurator = null;\n if (context === 'product') {\n if (! document.querySelector('form.cart')) {\n return;\n }\n const updateCart = new UpdateCart(\n PayPalCommerceGateway.ajax.change_cart.endpoint,\n PayPalCommerceGateway.ajax.change_cart.nonce\n );\n configurator = new SingleProductConfig(\n PayPalCommerceGateway,\n updateCart,\n renderer.showButtons.bind(renderer),\n renderer.hideButtons.bind(renderer),\n document.querySelector('form.cart'),\n errorHandler\n );\n }\n if (context === 'cart') {\n configurator = defaultConfigurator;\n\n jQuery( document.body ).on( 'updated_cart_totals updated_checkout', () => {\n renderer.render(configurator.configuration())\n });\n }\n if (! configurator) {\n console.error('No context for button found.');\n return;\n }\n\n renderer.render(configurator.configuration());\n}\ndocument.addEventListener(\n 'DOMContentLoaded',\n () => {\n\n if (! typeof(PayPalCommerceGateway)) {\n console.error('PayPal button could not be configured.');\n return;\n }\n\n const script = document.createElement('script');\n script.setAttribute('src', PayPalCommerceGateway.button.url);\n script.addEventListener('load', (event) => {\n bootstrap();\n })\n document.body.append(script);\n\n\n }\n);","/**\n * When you can't add something to the cart, the PayPal buttons should not show.\n * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly.\n */\n\nclass ButtonsToggleListener {\n constructor(element, showCallback, hideCallback)\n {\n this.element = element;\n this.showCallback = showCallback;\n this.hideCallback = hideCallback;\n this.observer = null;\n }\n\n init()\n {\n const config = { attributes : true };\n const callback = () => {\n if (this.element.classList.contains('disabled')) {\n this.hideCallback();\n return;\n }\n this.showCallback();\n }\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, config);\n }\n\n disconnect()\n {\n this.observer.disconnect();\n }\n}\n\nexport default ButtonsToggleListener;","import onApprove from \"./onApprove\";\n\nclass CartConfig {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n\n const createOrder = (data, actions) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units:[]\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n}\n\nexport default CartConfig;","class ErrorHandler {\n\n constructor()\n {\n this.wrapper = document.querySelector('.woocommerce-notices-wrapper');\n }\n\n message(text)\n {\n this.wrapper.classList.add('woocommerce-error');\n this.wrapper.innerText = this.sanitize(text);\n }\n\n sanitize(text)\n {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = text;\n return textarea.value;\n }\n\n clear()\n {\n if (! this.wrapper.classList.contains('woocommerce-error')) {\n return;\n }\n this.wrapper.classList.remove('woocommerce-error');\n this.wrapper.innerText = '';\n }\n}\n\nexport default ErrorHandler;","class Product {\n\n constructor(id, quantity, variations) {\n this.id = id;\n this.quantity = quantity;\n this.variations = variations;\n }\n\n data() {\n return {\n id:this.id,\n quantity:this.quantity,\n variations:this.variations\n }\n }\n}\n\nexport default Product;","class Renderer {\n\n constructor(wrapper)\n {\n this.wrapper = wrapper;\n }\n\n render(buttonConfig)\n {\n\n paypal.Buttons(\n buttonConfig\n ).render(this.wrapper);\n }\n\n hideButtons()\n {\n document.querySelector(this.wrapper).style.display = 'none';\n }\n\n showButtons()\n {\n document.querySelector(this.wrapper).style.display = 'block';\n }\n}\n\nexport default Renderer;","import ButtonsToggleListener from \"./ButtonsToggleListener\";\nimport Product from \"./Product\";\nimport onApprove from \"./onApprove\";\nclass SingleProductConfig {\n\n constructor(\n config,\n updateCart,\n showButtonCallback,\n hideButtonCallback,\n formElement,\n errorHandler\n ) {\n this.config = config;\n this.updateCart = updateCart;\n this.showButtonCallback = showButtonCallback;\n this.hideButtonCallback = hideButtonCallback;\n this.formElement = formElement;\n this.errorHandler = errorHandler;\n }\n\n configuration()\n {\n\n if ( this.hasVariations() ) {\n const observer = new ButtonsToggleListener(\n this.formElement.querySelector('.single_add_to_cart_button'),\n this.showButtonCallback,\n this.hideButtonCallback\n );\n observer.init();\n }\n\n return {\n createOrder: this.createOrder(),\n onApprove: onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n\n createOrder()\n {\n var getProducts = null;\n if (! this.isGroupedProduct() ) {\n getProducts = () => {\n const id = document.querySelector('[name=\"add-to-cart\"]').value;\n const qty = document.querySelector('[name=\"quantity\"]').value;\n const variations = this.variations();\n return [new Product(id, qty, variations)];\n }\n } else {\n getProducts = () => {\n const products = [];\n this.formElement.querySelectorAll('input[type=\"number\"]').forEach((element) => {\n if (! element.value) {\n return;\n }\n const elementName = element.getAttribute('name').match(/quantity\\[([\\d]*)\\]/);\n if (elementName.length !== 2) {\n return;\n }\n const id = parseInt(elementName[1]);\n const quantity = parseInt(element.value);\n products.push(new Product(id, quantity, null));\n })\n return products;\n }\n }\n const createOrder = (data, actions) => {\n this.errorHandler.clear();\n\n const onResolve = (purchase_units) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n };\n\n const promise = this.updateCart.update(onResolve, getProducts());\n return promise;\n };\n return createOrder;\n }\n\n variations()\n {\n\n if (! this.hasVariations()) {\n return null;\n }\n const attributes = [...this.formElement.querySelectorAll(\"[name^='attribute_']\")].map(\n (element) => {\n return {\n value:element.value,\n name:element.name\n }\n }\n );\n return attributes;\n }\n\n hasVariations()\n {\n return this.formElement.classList.contains('variations_form');\n }\n\n isGroupedProduct()\n {\n return this.formElement.classList.contains('grouped_form');\n }\n}\nexport default SingleProductConfig;","import Product from \"./Product\";\nclass UpdateCart {\n\n constructor(endpoint, nonce)\n {\n this.endpoint = endpoint;\n this.nonce = nonce;\n }\n\n /**\n *\n * @param onResolve\n * @param {Product[]} products\n * @returns {Promise}\n */\n update(onResolve, products)\n {\n return new Promise((resolve, reject) => {\n fetch(\n this.endpoint,\n {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.nonce,\n products,\n })\n }\n ).then(\n (result) => {\n return result.json();\n }\n ).then((result) => {\n if (! result.success) {\n reject(result.data);\n return;\n }\n\n const resolved = onResolve(result.data);\n resolve(resolved);\n })\n });\n }\n}\n\nexport default UpdateCart;","const onApprove = (context) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n location.href = context.config.redirect;\n });\n\n }\n}\n\nexport default onApprove;\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./resources/js/modules/Renderer.js","webpack:///./resources/js/modules/ButtonsToggleListener.js","webpack:///./resources/js/modules/Product.js","webpack:///./resources/js/modules/onApprove.js","webpack:///./resources/js/modules/SingleProductConfig.js","webpack:///./resources/js/modules/UpdateCart.js","webpack:///./resources/js/modules/ErrorHandler.js","webpack:///./resources/js/modules/CartConfig.js","webpack:///./resources/js/button.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Renderer","constructor","wrapper","this","render","buttonConfig","paypal","Buttons","hideButtons","document","querySelector","style","display","showButtons","ButtonsToggleListener","element","showCallback","hideCallback","observer","init","MutationObserver","classList","contains","observe","attributes","disconnect","Product","id","quantity","variations","data","onApprove","context","actions","fetch","config","ajax","approve_order","endpoint","method","body","JSON","stringify","nonce","order_id","orderID","then","res","json","success","location","href","redirect","SingleProductConfig","updateCart","showButtonCallback","hideButtonCallback","formElement","errorHandler","configuration","hasVariations","createOrder","onError","error","message","getProducts","isGroupedProduct","products","querySelectorAll","forEach","elementName","getAttribute","match","length","parseInt","push","qty","clear","update","purchase_units","create_order","map","UpdateCart","onResolve","Promise","resolve","reject","result","resolved","ErrorHandler","text","add","innerText","sanitize","textarea","createElement","innerHTML","remove","CartConfig","addEventListener","script","setAttribute","PayPalCommerceGateway","button","url","event","defaultConfigurator","mini_cart_wrapper","jQuery","on","renderer","configurator","change_cart","cancel_wrapper","toggleButtons","val","show","hide","trigger","console","bootstrap","append"],"mappings":"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","file":"js/button.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","class Renderer {\n\n constructor(wrapper)\n {\n this.wrapper = wrapper;\n }\n\n render(buttonConfig)\n {\n\n paypal.Buttons(\n buttonConfig\n ).render(this.wrapper);\n }\n\n hideButtons()\n {\n document.querySelector(this.wrapper).style.display = 'none';\n }\n\n showButtons()\n {\n document.querySelector(this.wrapper).style.display = 'block';\n }\n}\n\nexport default Renderer;","/**\n * When you can't add something to the cart, the PayPal buttons should not show.\n * Therefore we listen for changes on the add to cart button and show/hide the buttons accordingly.\n */\n\nclass ButtonsToggleListener {\n constructor(element, showCallback, hideCallback)\n {\n this.element = element;\n this.showCallback = showCallback;\n this.hideCallback = hideCallback;\n this.observer = null;\n }\n\n init()\n {\n const config = { attributes : true };\n const callback = () => {\n if (this.element.classList.contains('disabled')) {\n this.hideCallback();\n return;\n }\n this.showCallback();\n }\n this.observer = new MutationObserver(callback);\n this.observer.observe(this.element, config);\n }\n\n disconnect()\n {\n this.observer.disconnect();\n }\n}\n\nexport default ButtonsToggleListener;","class Product {\n\n constructor(id, quantity, variations) {\n this.id = id;\n this.quantity = quantity;\n this.variations = variations;\n }\n\n data() {\n return {\n id:this.id,\n quantity:this.quantity,\n variations:this.variations\n }\n }\n}\n\nexport default Product;","const onApprove = (context) => {\n return (data, actions) => {\n return fetch(context.config.ajax.approve_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: context.config.ajax.approve_order.nonce,\n order_id:data.orderID\n })\n }).then((res)=>{\n return res.json();\n }).then((data)=>{\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n location.href = context.config.redirect;\n });\n\n }\n}\n\nexport default onApprove;\n","import ButtonsToggleListener from \"./ButtonsToggleListener\";\nimport Product from \"./Product\";\nimport onApprove from \"./onApprove\";\nclass SingleProductConfig {\n\n constructor(\n config,\n updateCart,\n showButtonCallback,\n hideButtonCallback,\n formElement,\n errorHandler\n ) {\n this.config = config;\n this.updateCart = updateCart;\n this.showButtonCallback = showButtonCallback;\n this.hideButtonCallback = hideButtonCallback;\n this.formElement = formElement;\n this.errorHandler = errorHandler;\n }\n\n configuration()\n {\n\n if ( this.hasVariations() ) {\n const observer = new ButtonsToggleListener(\n this.formElement.querySelector('.single_add_to_cart_button'),\n this.showButtonCallback,\n this.hideButtonCallback\n );\n observer.init();\n }\n\n return {\n createOrder: this.createOrder(),\n onApprove: onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n\n createOrder()\n {\n var getProducts = null;\n if (! this.isGroupedProduct() ) {\n getProducts = () => {\n const id = document.querySelector('[name=\"add-to-cart\"]').value;\n const qty = document.querySelector('[name=\"quantity\"]').value;\n const variations = this.variations();\n return [new Product(id, qty, variations)];\n }\n } else {\n getProducts = () => {\n const products = [];\n this.formElement.querySelectorAll('input[type=\"number\"]').forEach((element) => {\n if (! element.value) {\n return;\n }\n const elementName = element.getAttribute('name').match(/quantity\\[([\\d]*)\\]/);\n if (elementName.length !== 2) {\n return;\n }\n const id = parseInt(elementName[1]);\n const quantity = parseInt(element.value);\n products.push(new Product(id, quantity, null));\n })\n return products;\n }\n }\n const createOrder = (data, actions) => {\n this.errorHandler.clear();\n\n const onResolve = (purchase_units) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n };\n\n const promise = this.updateCart.update(onResolve, getProducts());\n return promise;\n };\n return createOrder;\n }\n\n variations()\n {\n\n if (! this.hasVariations()) {\n return null;\n }\n const attributes = [...this.formElement.querySelectorAll(\"[name^='attribute_']\")].map(\n (element) => {\n return {\n value:element.value,\n name:element.name\n }\n }\n );\n return attributes;\n }\n\n hasVariations()\n {\n return this.formElement.classList.contains('variations_form');\n }\n\n isGroupedProduct()\n {\n return this.formElement.classList.contains('grouped_form');\n }\n}\nexport default SingleProductConfig;","import Product from \"./Product\";\nclass UpdateCart {\n\n constructor(endpoint, nonce)\n {\n this.endpoint = endpoint;\n this.nonce = nonce;\n }\n\n /**\n *\n * @param onResolve\n * @param {Product[]} products\n * @returns {Promise}\n */\n update(onResolve, products)\n {\n return new Promise((resolve, reject) => {\n fetch(\n this.endpoint,\n {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.nonce,\n products,\n })\n }\n ).then(\n (result) => {\n return result.json();\n }\n ).then((result) => {\n if (! result.success) {\n reject(result.data);\n return;\n }\n\n const resolved = onResolve(result.data);\n resolve(resolved);\n })\n });\n }\n}\n\nexport default UpdateCart;","class ErrorHandler {\n\n constructor()\n {\n this.wrapper = document.querySelector('.woocommerce-notices-wrapper');\n }\n\n message(text)\n {\n this.wrapper.classList.add('woocommerce-error');\n this.wrapper.innerText = this.sanitize(text);\n }\n\n sanitize(text)\n {\n const textarea = document.createElement('textarea');\n textarea.innerHTML = text;\n return textarea.value;\n }\n\n clear()\n {\n if (! this.wrapper.classList.contains('woocommerce-error')) {\n return;\n }\n this.wrapper.classList.remove('woocommerce-error');\n this.wrapper.innerText = '';\n }\n}\n\nexport default ErrorHandler;","import onApprove from \"./onApprove\";\n\nclass CartConfig {\n\n constructor(config, errorHandler) {\n this.config = config;\n this.errorHandler = errorHandler;\n }\n\n configuration() {\n\n const createOrder = (data, actions) => {\n return fetch(this.config.ajax.create_order.endpoint, {\n method: 'POST',\n body: JSON.stringify({\n nonce: this.config.ajax.create_order.nonce,\n purchase_units:[]\n })\n }).then(function (res) {\n return res.json();\n }).then(function (data) {\n if (!data.success) {\n //Todo: Error handling\n return;\n }\n return data.data.id;\n });\n }\n return {\n createOrder,\n onApprove:onApprove(this),\n onError: (error) => {\n this.errorHandler.message(error);\n }\n }\n }\n}\n\nexport default CartConfig;","import Renderer from './modules/Renderer';\nimport SingleProductConfig from './modules/SingleProductConfig';\nimport UpdateCart from './modules/UpdateCart';\nimport ErrorHandler from './modules/ErrorHandler';\nimport CartConfig from './modules/CartConfig';\n\nconst bootstrap = ()=> {\n const context = PayPalCommerceGateway.context;\n const errorHandler = new ErrorHandler();\n const defaultConfigurator = new CartConfig(\n PayPalCommerceGateway,\n errorHandler\n );\n // Configure mini cart buttons\n if (document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) {\n\n const renderer = new Renderer(\n PayPalCommerceGateway.button.mini_cart_wrapper\n );\n renderer.render(defaultConfigurator.configuration())\n }\n jQuery( document.body ).on( 'wc_fragments_loaded wc_fragments_refreshed', () => {\n if (! document.querySelector(PayPalCommerceGateway.button.mini_cart_wrapper)) {\n return;\n }\n const renderer = new Renderer(\n PayPalCommerceGateway.button.mini_cart_wrapper\n );\n renderer.render(defaultConfigurator.configuration())\n } );\n\n // Configure context buttons\n if (! document.querySelector(PayPalCommerceGateway.button.wrapper)) {\n return;\n }\n const renderer = new Renderer(\n PayPalCommerceGateway.button.wrapper\n );\n let configurator = null;\n if (context === 'product') {\n if (! document.querySelector('form.cart')) {\n return;\n }\n const updateCart = new UpdateCart(\n PayPalCommerceGateway.ajax.change_cart.endpoint,\n PayPalCommerceGateway.ajax.change_cart.nonce\n );\n configurator = new SingleProductConfig(\n PayPalCommerceGateway,\n updateCart,\n renderer.showButtons.bind(renderer),\n renderer.hideButtons.bind(renderer),\n document.querySelector('form.cart'),\n errorHandler\n );\n }\n if (context === 'cart') {\n configurator = defaultConfigurator;\n\n jQuery( document.body ).on( 'updated_cart_totals updated_checkout', () => {\n renderer.render(configurator.configuration())\n });\n }\n if (context === 'checkout' ) {\n configurator = defaultConfigurator;\n\n if (!document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) {\n\n const toggleButtons = () => {\n const currentPaymentMethod = jQuery('input[name=\"payment_method\"]:checked').val();\n\n if (currentPaymentMethod !== 'ppcp-gateway') {\n renderer.hideButtons();\n jQuery('#place_order').show();\n } else {\n renderer.showButtons();\n jQuery('#place_order').hide();\n }\n }\n jQuery(document.body).on('updated_checkout', () => {\n renderer.render(defaultConfigurator.configuration());\n jQuery(document.body).trigger('payment_method_selected')\n });\n jQuery(document.body).on('payment_method_selected', toggleButtons );\n toggleButtons();\n }\n }\n if (! configurator) {\n console.error('No context for button found.');\n return;\n }\n\n renderer.render(configurator.configuration());\n}\ndocument.addEventListener(\n 'DOMContentLoaded',\n () => {\n\n if (! typeof(PayPalCommerceGateway)) {\n console.error('PayPal button could not be configured.');\n return;\n }\n\n const script = document.createElement('script');\n script.setAttribute('src', PayPalCommerceGateway.button.url);\n script.addEventListener('load', (event) => {\n bootstrap();\n })\n document.body.append(script);\n\n\n }\n);"],"sourceRoot":""} \ No newline at end of file diff --git a/modules.local/ppcp-button/resources/js/button.js b/modules.local/ppcp-button/resources/js/button.js index bca3970f6..125c96c7a 100644 --- a/modules.local/ppcp-button/resources/js/button.js +++ b/modules.local/ppcp-button/resources/js/button.js @@ -29,32 +29,6 @@ const bootstrap = ()=> { renderer.render(defaultConfigurator.configuration()) } ); - // Configure checkout buttons - jQuery( document.body ).on( 'updated_checkout', () => { - if (document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) { - return; - } - - const renderer = new Renderer( - PayPalCommerceGateway.button.wrapper - ); - renderer.render(defaultConfigurator.configuration()); - - jQuery( document.body ).trigger( 'payment_method_selected' ) - } ); - jQuery( document.body ).on( 'payment_method_selected', () => { - // TODO: replace this dirty check, possible create a separate context config - const currentPaymentMethod = jQuery('input[name="payment_method"]:checked').val(); - - if (currentPaymentMethod !== 'ppcp-gateway') { - jQuery(PayPalCommerceGateway.button.wrapper).hide(); - jQuery('#place_order').show(); - } else { - jQuery(PayPalCommerceGateway.button.wrapper).show(); - jQuery('#place_order').hide(); - } - } ); - // Configure context buttons if (! document.querySelector(PayPalCommerceGateway.button.wrapper)) { return; @@ -87,6 +61,30 @@ const bootstrap = ()=> { renderer.render(configurator.configuration()) }); } + if (context === 'checkout' ) { + configurator = defaultConfigurator; + + if (!document.querySelector(PayPalCommerceGateway.button.cancel_wrapper)) { + + const toggleButtons = () => { + const currentPaymentMethod = jQuery('input[name="payment_method"]:checked').val(); + + if (currentPaymentMethod !== 'ppcp-gateway') { + renderer.hideButtons(); + jQuery('#place_order').show(); + } else { + renderer.showButtons(); + jQuery('#place_order').hide(); + } + } + jQuery(document.body).on('updated_checkout', () => { + renderer.render(defaultConfigurator.configuration()); + jQuery(document.body).trigger('payment_method_selected') + }); + jQuery(document.body).on('payment_method_selected', toggleButtons ); + toggleButtons(); + } + } if (! configurator) { console.error('No context for button found.'); return;