mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-01 07:02:48 +08:00
429 lines
17 KiB
JavaScript
429 lines
17 KiB
JavaScript
document.addEventListener(
|
|
'DOMContentLoaded',
|
|
() => {
|
|
const payLaterMessagingSelectableLocations = ['product', 'cart', 'checkout', 'shop', 'home'];
|
|
const payLaterMessagingAllLocations = payLaterMessagingSelectableLocations.concat('general');
|
|
const payLaterMessagingLocationsSelector = '#field-pay_later_messaging_locations';
|
|
const payLaterMessagingLocationsSelect = payLaterMessagingLocationsSelector + ' select';
|
|
const payLaterMessagingEnabledSelector = '#ppcp-pay_later_messaging_enabled';
|
|
|
|
const smartButtonLocationsSelector = '#field-smart_button_locations';
|
|
const smartButtonLocationsSelect = smartButtonLocationsSelector + ' select';
|
|
const smartButtonSelectableLocations = ['product', 'cart', 'checkout', 'mini-cart', 'cart-block', 'checkout-block-express'];
|
|
|
|
const groupToggle = (selector, group) => {
|
|
const toggleElement = document.querySelector(selector);
|
|
if (! toggleElement) {
|
|
return;
|
|
}
|
|
|
|
if (! toggleElement.checked) {
|
|
group.forEach( (elementToHide) => {
|
|
const element = document.querySelector(elementToHide);
|
|
if (element) {
|
|
element.style.display = 'none';
|
|
}
|
|
})
|
|
}
|
|
toggleElement.addEventListener(
|
|
'change',
|
|
(event) => {
|
|
if (! event.target.checked) {
|
|
group.forEach( (elementToHide) => {
|
|
const element = document.querySelector(elementToHide);
|
|
if (element) {
|
|
element.style.display = 'none';
|
|
}
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
group.forEach( (elementToShow) => {
|
|
document.querySelector(elementToShow).style.display = '';
|
|
})
|
|
|
|
togglePayLaterMessageFields();
|
|
}
|
|
);
|
|
};
|
|
|
|
const groupToggleSelect = (selector, group) => {
|
|
const toggleElement = document.querySelector(selector);
|
|
if (! toggleElement) {
|
|
return;
|
|
}
|
|
const value = toggleElement.value;
|
|
group.forEach( (elementToToggle) => {
|
|
const domElement = document.querySelector(elementToToggle.selector);
|
|
if (! domElement) {
|
|
return;
|
|
}
|
|
if (value === elementToToggle.value && domElement.style.display !== 'none') {
|
|
domElement.style.display = '';
|
|
return;
|
|
}
|
|
domElement.style.display = 'none';
|
|
});
|
|
|
|
// We need to use jQuery here as the select might be a select2 element, which doesn't use native events.
|
|
jQuery(toggleElement).on(
|
|
'change',
|
|
(event) => {
|
|
const value = event.target.value;
|
|
group.forEach( (elementToToggle) => {
|
|
if (value === elementToToggle.value) {
|
|
document.querySelector(elementToToggle.selector).style.display = '';
|
|
return;
|
|
}
|
|
document.querySelector(elementToToggle.selector).style.display = 'none';
|
|
})
|
|
}
|
|
);
|
|
};
|
|
|
|
const togglePayLaterMessageFields = () => {
|
|
payLaterMessagingAllLocations.forEach( (location) => {
|
|
groupToggleSelect(
|
|
'#ppcp-pay_later_' + location + '_message_layout',
|
|
[
|
|
{
|
|
value:'text',
|
|
selector:'#field-pay_later_' + location + '_message_logo'
|
|
},
|
|
{
|
|
value:'text',
|
|
selector:'#field-pay_later_' + location + '_message_position'
|
|
},
|
|
{
|
|
value:'text',
|
|
selector:'#field-pay_later_' + location + '_message_color'
|
|
},
|
|
{
|
|
value:'flex',
|
|
selector:'#field-pay_later_' + location + '_message_flex_ratio'
|
|
},
|
|
{
|
|
value:'flex',
|
|
selector:'#field-pay_later_' + location + '_message_flex_color'
|
|
}
|
|
]
|
|
);
|
|
})
|
|
}
|
|
|
|
const removeDisabledCardIcons = (disabledCardsSelectSelector, iconsSelectSelector) => {
|
|
const iconsSelect = document.querySelector(iconsSelectSelector);
|
|
if (! iconsSelect) {
|
|
return;
|
|
}
|
|
const allOptions = Array.from(document.querySelectorAll(disabledCardsSelectSelector + ' option'));
|
|
const iconVersions = {
|
|
'visa': {
|
|
'light': {'label': 'Visa (light)'},
|
|
'dark' : {'label': 'Visa (dark)', 'value': 'visa-dark'}
|
|
},
|
|
'mastercard': {
|
|
'light': {'label': 'Mastercard (light)'},
|
|
'dark' : {'label': 'Mastercard (dark)', 'value': 'mastercard-dark'}
|
|
}
|
|
}
|
|
const replace = () => {
|
|
const validOptions = allOptions.filter(option => ! option.selected);
|
|
const selectedValidOptions = validOptions.map(
|
|
(option) => {
|
|
option = option.cloneNode(true);
|
|
let value = option.value;
|
|
option.selected = iconsSelect.querySelector('option[value="' + value + '"]') && iconsSelect.querySelector('option[value="' + value + '"]').selected;
|
|
if(value === 'visa' || value === 'mastercard') {
|
|
let darkOption = option.cloneNode(true);
|
|
let currentVersion = iconVersions[value];
|
|
let darkValue = iconVersions[value].dark.value;
|
|
|
|
option.text = currentVersion.light.label;
|
|
darkOption.text = currentVersion.dark.label;
|
|
darkOption.value = darkValue;
|
|
darkOption.selected = iconsSelect.querySelector('option[value="' + darkValue + '"]') && iconsSelect.querySelector('option[value="' + darkValue + '"]').selected;
|
|
|
|
return [option, darkOption];
|
|
}
|
|
return option;
|
|
}
|
|
).flat();
|
|
|
|
iconsSelect.innerHTML = '';
|
|
selectedValidOptions.forEach(
|
|
(option) => {
|
|
if(Array.isArray(option)){
|
|
option.forEach(
|
|
(option) => {
|
|
iconsSelect.appendChild(option);
|
|
}
|
|
)
|
|
}
|
|
|
|
iconsSelect.appendChild(option);
|
|
}
|
|
);
|
|
};
|
|
|
|
const disabledCardsSelect = jQuery(disabledCardsSelectSelector);
|
|
disabledCardsSelect.on('change', replace);
|
|
replace();
|
|
};
|
|
|
|
const toggleInputsBySelectedLocations = (
|
|
stylingPerSelector,
|
|
locationsSelector,
|
|
groupToShowOnChecked,
|
|
groupToHideOnChecked,
|
|
inputType
|
|
) => {
|
|
|
|
const payLaterMessagingEnabled = document.querySelector(payLaterMessagingEnabledSelector);
|
|
const stylingPerElement = document.querySelector(stylingPerSelector);
|
|
const locationsElement = document.querySelector(locationsSelector);
|
|
const stylingPerElementWrapper = stylingPerElement?.closest('tr');
|
|
const stylingPerElementWrapperSelector = '#'+ stylingPerElementWrapper?.getAttribute('id');
|
|
|
|
if (! stylingPerElement) {
|
|
return;
|
|
}
|
|
|
|
const toggleElementsBySelectedLocations = () => {
|
|
stylingPerElementWrapper.style.display = '';
|
|
let selectedLocations = getSelectedLocations(locationsSelector);
|
|
let emptySmartButtonLocationMessage = jQuery('.ppcp-empty-smart-button-location');
|
|
|
|
if(selectedLocations.length === 0) {
|
|
hideElements(groupToHideOnChecked.concat(stylingPerElementWrapperSelector));
|
|
if (emptySmartButtonLocationMessage.length === 0) {
|
|
jQuery(PayPalCommerceSettings.empty_smart_button_location_message).insertAfter(jQuery(smartButtonLocationsSelector).find('.description'));
|
|
}
|
|
}
|
|
|
|
if (! stylingPerElement.checked) {
|
|
return;
|
|
}
|
|
|
|
if (inputType === 'messages' && ! payLaterMessagingEnabled.checked) {
|
|
return;
|
|
}
|
|
|
|
const inputSelectors = inputSelectorsByLocations(selectedLocations, inputType);
|
|
|
|
groupToShowOnChecked.forEach( (element) => {
|
|
if ( inputSelectors.includes(element) ) {
|
|
document.querySelector(element).style.display = '';
|
|
return;
|
|
}
|
|
document.querySelector(element).style.display = 'none';
|
|
})
|
|
|
|
if (inputType === 'messages') {
|
|
togglePayLaterMessageFields();
|
|
}
|
|
}
|
|
|
|
const hideElements = (selectroGroup) => {
|
|
selectroGroup.forEach( (elementToHide) => {
|
|
document.querySelector(elementToHide).style.display = 'none';
|
|
})
|
|
}
|
|
|
|
const showElements = (selectroGroup) => {
|
|
selectroGroup.forEach( (elementToShow) => {
|
|
document.querySelector(elementToShow).style.display = '';
|
|
})
|
|
}
|
|
|
|
groupToggle(stylingPerSelector, groupToShowOnChecked);
|
|
toggleElementsBySelectedLocations();
|
|
|
|
if (stylingPerElement.checked) {
|
|
hideElements(groupToHideOnChecked);
|
|
}
|
|
|
|
stylingPerElement.addEventListener(
|
|
'change',
|
|
(event) => {
|
|
toggleElementsBySelectedLocations();
|
|
|
|
if (event.target.checked) {
|
|
hideElements(groupToHideOnChecked);
|
|
return;
|
|
}
|
|
|
|
let selectedLocations = getSelectedLocations(locationsSelector);
|
|
if(selectedLocations.length > 0) {
|
|
showElements(groupToHideOnChecked);
|
|
}
|
|
|
|
if (inputType === 'messages') {
|
|
togglePayLaterMessageFields();
|
|
}
|
|
}
|
|
);
|
|
|
|
// We need to use jQuery here as the select might be a select2 element, which doesn't use native events.
|
|
jQuery(locationsElement).on('change', function (){
|
|
let emptySmartButtonLocationMessage = jQuery('.ppcp-empty-smart-button-location');
|
|
emptySmartButtonLocationMessage?.remove();
|
|
toggleElementsBySelectedLocations()
|
|
stylingPerElement.dispatchEvent(new Event('change'))
|
|
});
|
|
}
|
|
|
|
const getSelectedLocations = (selector) => {
|
|
let checkedLocations = document.querySelectorAll(selector + ' :checked');
|
|
return [...checkedLocations].map(option => option.value);
|
|
}
|
|
|
|
const inputSelectorsByLocations = (locations, inputType = 'messages') => {
|
|
let inputSelectros = [];
|
|
|
|
locations.forEach( (location) => {
|
|
inputSelectros = inputType === 'messages'
|
|
? inputSelectros.concat(payLaterMessagingInputSelectorByLocation(location))
|
|
: inputSelectros.concat(butttonInputSelectorByLocation(location));
|
|
})
|
|
|
|
return inputSelectros
|
|
}
|
|
|
|
const payLaterMessagingInputSelectorByLocation = (location) => {
|
|
const inputSelectors = [
|
|
'#field-pay_later_' + location + '_message_layout',
|
|
'#field-pay_later_' + location + '_message_logo',
|
|
'#field-pay_later_' + location + '_message_position',
|
|
'#field-pay_later_' + location + '_message_color',
|
|
'#field-pay_later_' + location + '_message_flex_color',
|
|
'#field-pay_later_' + location + '_message_flex_ratio',
|
|
'#field-pay_later_' + location + '_message_preview',
|
|
]
|
|
|
|
if (location !== 'general') {
|
|
inputSelectors.push('#field-pay_later_' + location + '_messaging_heading');
|
|
}
|
|
|
|
return inputSelectors
|
|
}
|
|
|
|
const butttonInputSelectorByLocation = (location) => {
|
|
const locationPrefix = location === 'checkout' ? '' : '_' + location;
|
|
const inputSelectors = [
|
|
'#field-button' + locationPrefix + '_layout',
|
|
'#field-button' + locationPrefix + '_tagline',
|
|
'#field-button' + locationPrefix + '_label',
|
|
'#field-button' + locationPrefix + '_color',
|
|
'#field-button' + locationPrefix + '_shape',
|
|
'#field-button' + locationPrefix + '_height',
|
|
'#field-button' + locationPrefix + '_preview',
|
|
]
|
|
|
|
if (location !== 'general') {
|
|
inputSelectors.push('#field-button_' + location + '_heading');
|
|
}
|
|
|
|
return inputSelectors.filter(selector => document.querySelector(selector));
|
|
}
|
|
|
|
const allPayLaterMessaginginputSelectors = () => {
|
|
let stylingInputSelectors = inputSelectorsByLocations(payLaterMessagingAllLocations);
|
|
|
|
return stylingInputSelectors.concat(payLaterMessagingLocationsSelector, '#field-pay_later_enable_styling_per_messaging_location');
|
|
}
|
|
|
|
const toggleMessagingEnabled = () => {
|
|
const payLaterMessagingEnabled = document.querySelector(payLaterMessagingEnabledSelector);
|
|
const stylingPerMessagingElement = document.querySelector('#ppcp-pay_later_enable_styling_per_messaging_location');
|
|
|
|
groupToggle(
|
|
payLaterMessagingEnabledSelector,
|
|
allPayLaterMessaginginputSelectors()
|
|
);
|
|
|
|
if (! payLaterMessagingEnabled) {
|
|
return;
|
|
|
|
}
|
|
|
|
payLaterMessagingEnabled.addEventListener(
|
|
'change',
|
|
(event) => {
|
|
if (! event.target.checked) {
|
|
return;
|
|
}
|
|
stylingPerMessagingElement.dispatchEvent(new Event('change'))
|
|
}
|
|
);
|
|
}
|
|
|
|
const referenceTransactionsCheck = () => {
|
|
if (
|
|
typeof PayPalCommerceGatewaySettings !== 'undefined'
|
|
&& PayPalCommerceGatewaySettings.reference_transaction_enabled !== '1'
|
|
) {
|
|
document.getElementById('ppcp-vault_enabled')?.setAttribute('disabled', 'disabled');
|
|
|
|
const description = document.getElementById('field-vault_enabled')?.getElementsByClassName('description')[0];
|
|
if (description) {
|
|
description.innerHTML = PayPalCommerceGatewaySettings.vaulting_must_enable_advanced_wallet_message;
|
|
}
|
|
}
|
|
}
|
|
|
|
(() => {
|
|
removeDisabledCardIcons('select[name="ppcp[disable_cards][]"]', 'select[name="ppcp[card_icons][]"]');
|
|
|
|
groupToggle(
|
|
'#ppcp-pay_later_button_enabled',
|
|
['#field-pay_later_button_locations']
|
|
);
|
|
|
|
toggleInputsBySelectedLocations(
|
|
'#ppcp-pay_later_enable_styling_per_messaging_location',
|
|
payLaterMessagingLocationsSelect,
|
|
inputSelectorsByLocations(payLaterMessagingSelectableLocations),
|
|
inputSelectorsByLocations(['general']),
|
|
'messages'
|
|
);
|
|
|
|
toggleInputsBySelectedLocations(
|
|
'#ppcp-smart_button_enable_styling_per_location',
|
|
smartButtonLocationsSelect,
|
|
inputSelectorsByLocations(smartButtonSelectableLocations, 'buttons'),
|
|
inputSelectorsByLocations(['general'], 'buttons'),
|
|
'buttons'
|
|
);
|
|
|
|
toggleMessagingEnabled();
|
|
|
|
|
|
groupToggle(
|
|
'#ppcp-vault_enabled',
|
|
[
|
|
'#field-subscription_behavior_when_vault_fails',
|
|
]
|
|
);
|
|
|
|
groupToggleSelect(
|
|
'#ppcp-intent',
|
|
[
|
|
{
|
|
value:'authorize',
|
|
selector:'#field-capture_for_virtual_only'
|
|
},
|
|
{
|
|
value:'authorize',
|
|
selector:'#field-capture_on_status_change'
|
|
}
|
|
]
|
|
);
|
|
|
|
togglePayLaterMessageFields();
|
|
|
|
referenceTransactionsCheck()
|
|
})();
|
|
}
|
|
)
|