diff --git a/modules/ppcp-button/resources/css/hosted-fields.scss b/modules/ppcp-button/resources/css/hosted-fields.scss
index e69de29bb..7d6480c12 100644
--- a/modules/ppcp-button/resources/css/hosted-fields.scss
+++ b/modules/ppcp-button/resources/css/hosted-fields.scss
@@ -0,0 +1,5 @@
+#payment ul.payment_methods li img.ppcp-card-icon {
+ padding: 0 0 3px 3px;
+ max-height: 25px;
+ display: inline-block;
+}
diff --git a/modules/ppcp-button/src/Assets/class-smartbutton.php b/modules/ppcp-button/src/Assets/class-smartbutton.php
index 524b4e1d8..9e6ca8e99 100644
--- a/modules/ppcp-button/src/Assets/class-smartbutton.php
+++ b/modules/ppcp-button/src/Assets/class-smartbutton.php
@@ -321,6 +321,14 @@ class SmartButton implements SmartButtonInterface {
$load_script = true;
}
+ if ( is_checkout() && $this->can_render_dcc() ) {
+ wp_enqueue_style(
+ 'ppcp-hosted-fields',
+ $this->module_url . '/assets/css/hosted-fields.css',
+ array(),
+ 1
+ );
+ }
if ( $load_script ) {
wp_enqueue_script(
'ppcp-smart-button',
@@ -459,17 +467,23 @@ class SmartButton implements SmartButtonInterface {
}
/**
- * Renders the HTML for the DCC fields.
+ * Whether DCC fields can be rendered.
*
- * @throws \WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException When a setting hasnt been found.
+ * @return bool
+ * @throws \WooCommerce\PayPalCommerce\WcGateway\Exception\NotFoundException When a setting was not found.
+ */
+ private function can_render_dcc() : bool {
+
+ return $this->settings->has( 'dcc_enabled' ) && $this->settings->get( 'dcc_enabled' ) && $this->settings->has( 'client_id' ) && $this->settings->get( 'client_id' ) && $this->dcc_applies->for_country_currency();
+ }
+
+ /**
+ * Renders the HTML for the DCC fields.
*/
public function dcc_renderer() {
- $id = 'ppcp-hosted-fields';
- $can_render_dcc = $this->dcc_applies->for_country_currency()
- && $this->settings->has( 'client_id' )
- && $this->settings->get( 'client_id' );
- if ( ! $can_render_dcc ) {
+ $id = 'ppcp-hosted-fields';
+ if ( ! $this->can_render_dcc() ) {
return;
}
@@ -489,7 +503,7 @@ class SmartButton implements SmartButtonInterface {
) : '';
printf(
- '
+ '
',
esc_attr( $id ),
diff --git a/modules/ppcp-button/webpack.config.js b/modules/ppcp-button/webpack.config.js
index 7ebdb3bc1..98f493573 100644
--- a/modules/ppcp-button/webpack.config.js
+++ b/modules/ppcp-button/webpack.config.js
@@ -6,7 +6,8 @@ module.exports = {
mode: isProduction ? 'production' : 'development',
target: 'web',
entry: {
- button: path.resolve('./resources/js/button.js')
+ button: path.resolve('./resources/js/button.js'),
+ "hosted-fields": path.resolve('./resources/css/hosted-fields.scss')
},
output: {
path: path.resolve(__dirname, 'assets/'),
diff --git a/modules/ppcp-onboarding/assets/js/settings.js b/modules/ppcp-onboarding/assets/js/settings.js
index 4fdb5203b..603fd832a 100644
--- a/modules/ppcp-onboarding/assets/js/settings.js
+++ b/modules/ppcp-onboarding/assets/js/settings.js
@@ -59,17 +59,55 @@ const groupToggleSelect = (selector, group) => {
);
}
+const disableOptions = (sourceSelector, targetSelector) => {
+
+ const source = jQuery(sourceSelector);
+ const target = document.querySelector(targetSelector);
+ if (! target) {
+ return;
+ }
+ const allOptions = Array.from(document.querySelectorAll('select[name="ppcp[disable_cards][]"] option'));
+ const replace = () => {
+ const validOptions = allOptions.filter(
+ (option) => {
+
+ return ! option.selected
+ }
+ );
+ const selectedValidOptions = validOptions.map(
+ (option) => {
+ option = option.cloneNode(true);
+ option.selected = target.querySelector('option[value="' + option.value + '"]') && target.querySelector('option[value="' + option.value + '"]').selected;
+ return option;
+ }
+ );
+ target.innerHTML = '';
+ selectedValidOptions.forEach(
+ (option) => {
+ target.append(option);
+ }
+ );
+ }
+
+ source.on('change',replace);
+ replace();
+}
+
(() => {
- document.querySelector('#field-toggle_manual_input').addEventListener(
- 'click',
- (event) => {
- event.preventDefault();
- document.querySelector('#field-toggle_manual_input').classList.toggle('show');
- document.querySelector('#field-merchant_id').classList.toggle('show');
- document.querySelector('#field-client_id').classList.toggle('show');
- document.querySelector('#field-client_secret').classList.toggle('show');
- }
- )
+ const manualInputToggle = document.querySelector('#field-toggle_manual_input');
+ if (manualInputToggle) {
+ manualInputToggle.addEventListener(
+ 'click',
+ (event) => {
+ event.preventDefault();
+ document.querySelector('#field-toggle_manual_input').classList.toggle('show');
+ document.querySelector('#field-merchant_id').classList.toggle('show');
+ document.querySelector('#field-client_id').classList.toggle('show');
+ document.querySelector('#field-client_secret').classList.toggle('show');
+ }
+ )
+ }
+ disableOptions('select[name="ppcp[disable_cards][]"]', 'select[name="ppcp[card_icons][]"]');
groupToggle(
'#ppcp-button_enabled',
diff --git a/modules/ppcp-wc-gateway/src/Gateway/class-creditcardgateway.php b/modules/ppcp-wc-gateway/src/Gateway/class-creditcardgateway.php
index e2888a2e1..abfaa1700 100644
--- a/modules/ppcp-wc-gateway/src/Gateway/class-creditcardgateway.php
+++ b/modules/ppcp-wc-gateway/src/Gateway/class-creditcardgateway.php
@@ -133,9 +133,11 @@ class CreditCardGateway extends \WC_Payment_Gateway_CC {
*/
public function get_title() {
- if ( is_admin() ) {
+ //phpcs:disable WordPress.Security.NonceVerification.Recommended
+ if ( ! is_checkout() || ( is_ajax() && isset( $_GET['wc-ajax'] ) && 'update_order_review' !== $_GET['wc-ajax'] ) ) {
return parent::get_title();
}
+ //phpcs:enable WordPress.Security.NonceVerification.Recommended
$title = parent::get_title();
$icons = $this->config->has( 'card_icons' ) ? (array) $this->config->get( 'card_icons' ) : array();
if ( empty( $icons ) ) {