PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.83
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.83
51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 51.1.45 51.1.46 All 39 releases
king-addons / includes / widgets / Woo_Checkout_Payment / script.js

script.js in King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder 51.1.83, at includes/widgets/Woo_Checkout_Payment/script.js

142 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 * Woo Checkout Payment widget behavior.
3 *
4 * Enhances payment methods UI and can optionally behave like an accordion.
5 */
6 (function ($) {
7 "use strict";
8
9 const INIT_FLAG = "kaCheckoutPaymentInit";
10
11 const safeParseJson = (value) => {
12 if (!value) return {};
13 try {
14 const parsed = JSON.parse(value);
15 return parsed && typeof parsed === "object" ? parsed : {};
16 } catch (e) {
17 return {};
18 }
19 };
20
21 const relocateIntoCheckoutForm = (root) => {
22 if (!root) return;
23 if (window.elementorFrontend && elementorFrontend.isEditMode && elementorFrontend.isEditMode()) {
24 return;
25 }
26 const form = document.querySelector("form.woocommerce-checkout, form.checkout");
27 if (!form) return;
28 const widget = root.closest(".elementor-widget-woo_checkout_payment") || root;
29 if (form.contains(widget)) return;
30 const review = form.querySelector("#order_review") || form;
31 review.appendChild(widget);
32 };
33
34 const initAccordion = (root) => {
35 if (!root || !root.dataset) return;
36 relocateIntoCheckoutForm(root);
37 if (root.dataset[INIT_FLAG] === "1") return;
38 root.dataset[INIT_FLAG] = "1";
39
40 const isAccordion = root.dataset.kaAccordion === "true";
41 const iconMap = safeParseJson(root.dataset.kaIcons);
42 const buttonMap = safeParseJson(root.dataset.kaPlaceorder);
43 const descMap = safeParseJson(root.dataset.kaDescriptions);
44
45 const methods = root.querySelectorAll('.wc_payment_method');
46 // Scope to this widget first: the payment template renders its own
47 // #place_order, so a document-wide lookup renamed the button belonging to
48 // another payment widget on the page instead of this one.
49 const placeOrder = root.querySelector('#place_order, button[name="woocommerce_checkout_place_order"]')
50 || document.querySelector('#place_order');
51 // Remember the stock label so switching to a gateway without a custom one
52 // puts it back - otherwise the first custom text stuck for every gateway.
53 const placeOrderDefault = placeOrder ? placeOrder.textContent : '';
54
55 methods.forEach((method) => {
56 const input = method.querySelector('input.input-radio');
57 const label = method.querySelector('label');
58 const desc = method.querySelector('.payment_box');
59
60 if (label && input) {
61 const gid = input.value;
62 if (iconMap && iconMap[gid]) {
63 const icon = document.createElement('img');
64 icon.src = iconMap[gid];
65 icon.alt = '';
66 icon.className = 'ka-wc-payment__icon';
67 label.prepend(icon);
68 }
69 if (descMap && descMap[gid]) {
70 let custom = method.querySelector('.ka-wc-payment__custom-desc');
71 if (!custom) {
72 custom = document.createElement('div');
73 custom.className = 'ka-wc-payment__custom-desc';
74 label.appendChild(custom);
75 }
76 custom.innerHTML = descMap[gid];
77 }
78 }
79
80 if (!isAccordion || !input || !desc) return;
81
82 const toggle = () => {
83 methods.forEach((m) => {
84 const box = m.querySelector('.payment_box');
85 if (box) {
86 box.style.display = 'none';
87 }
88 m.classList.remove('is-active');
89 });
90 desc.style.display = 'block';
91 method.classList.add('is-active');
92 if (placeOrder) {
93 placeOrder.textContent = (buttonMap && buttonMap[input.value])
94 ? buttonMap[input.value]
95 : placeOrderDefault;
96 }
97 };
98
99 input.addEventListener('change', toggle);
100 if (input.checked) {
101 toggle();
102 } else {
103 desc.style.display = 'none';
104 }
105 });
106 };
107
108 const init = () => {
109 document.querySelectorAll('.ka-woo-checkout-payment').forEach(initAccordion);
110 };
111
112 const initInScope = ($scope) => {
113 const root = $scope && $scope[0] ? $scope[0] : document;
114 root.querySelectorAll(".ka-woo-checkout-payment").forEach(initAccordion);
115 };
116
117 document.addEventListener("DOMContentLoaded", init);
118
119 $(document.body).on("updated_checkout", function () {
120 // Allow re-init after WooCommerce updates.
121 document.querySelectorAll(".ka-woo-checkout-payment").forEach((wrap) => {
122 if (wrap && wrap.dataset) {
123 delete wrap.dataset[INIT_FLAG];
124 }
125 });
126 init();
127 });
128
129 $(window).on("elementor/frontend/init", function () {
130 elementorFrontend.hooks.addAction(
131 "frontend/element_ready/woo_checkout_payment.default",
132 function ($scope) {
133 initInScope($scope);
134 }
135 );
136 });
137 })(jQuery);
138
139
140
141
142