/** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved * * This source code is licensed under the license found in the * LICENSE file in the root directory of this source tree. * * @package FacebookCommerce */ jQuery( document ).ready( function( $ ) { /** * Gets any new excluded categories being added. * * @return {string[]} */ function getExcludedCategoriesAdded() { const newCategoryIDs = $( '#wc_facebook_excluded_product_category_ids' ).val(); let oldCategoryIDs = []; if ( window.facebook_for_woocommerce_settings_sync && window.facebook_for_woocommerce_settings_sync.excluded_category_ids ) { oldCategoryIDs = window.facebook_for_woocommerce_settings_sync.excluded_category_ids; } // return IDs that are in the new value that were not in the saved value return $( newCategoryIDs ).not( oldCategoryIDs ).get(); } /** * Gets any new excluded tags being added. * * @return {string[]} */ function getExcludedTagsAdded() { const newTagIDs = $( '#wc_facebook_excluded_product_tag_ids' ).val(); let oldTagIDs = []; if ( window.facebook_for_woocommerce_settings_sync && window.facebook_for_woocommerce_settings_sync.excluded_tag_ids ) { oldTagIDs = window.facebook_for_woocommerce_settings_sync.excluded_tag_ids; } // return IDs that are in the new value that were not in the saved value return $( newTagIDs ).not( oldTagIDs ).get(); } /** * Toggles availability of input in setting groups. * * @param {boolean} enable whether fields in this group should be enabled or not */ function toggleSettingOptions( enable ) { $( '.product-sync-field' ).each( function() { let $element = $( this ); if ( $( this ).hasClass( 'wc-enhanced-select' ) ) { $element = $( this ).next( 'span.select2-container' ); } if ( enable ) { $element.css( 'pointer-events', 'all' ).css( 'opacity', '1.0' ); } else { $element.css( 'pointer-events', 'none' ).css( 'opacity', '0.4' ); } } ); } $( '.woocommerce-help-tip' ).tipTip( { 'attribute': 'data-tip', 'fadeIn': 50, 'fadeOut': 50, 'delay': 200 } ); if ( $( 'form.wc-facebook-settings' ).hasClass( 'disconnected' ) ) { toggleSettingOptions( false ); } // toggle availability of options within field groups $( 'input#wc_facebook_enable_product_sync' ).on( 'change', function ( e ) { if ( $( 'form.wc-facebook-settings' ).hasClass( 'disconnected' ) ) { $( this ).css( 'pointer-events', 'none' ).css( 'opacity', '0.4' ); return; } toggleSettingOptions( $( this ).is( ':checked' ) ); } ).trigger( 'change' ); let submitSettingsSave = false; $( 'input[name="save_product_sync_settings"]' ).on( 'click', function ( e ) { if ( ! submitSettingsSave ) { e.preventDefault(); } else { return true; } const $submitButton = $( this ), categoriesAdded = getExcludedCategoriesAdded(), tagsAdded = getExcludedTagsAdded(); if ( categoriesAdded.length > 0 || tagsAdded.length > 0 ) { $.post( facebook_for_woocommerce_settings_sync.ajax_url, { action: 'facebook_for_woocommerce_set_excluded_terms_prompt', security: facebook_for_woocommerce_settings_sync.set_excluded_terms_prompt_nonce, categories: categoriesAdded, tags: tagsAdded, }, function ( response ) { if ( response && ! response.success ) { // close existing modals $( '#wc-backbone-modal-dialog .modal-close' ).trigger( 'click' ); // open new modal, populate template with AJAX response data new $.WCBackboneModal.View( { target: 'facebook-for-woocommerce-modal', string: response.data, } ); // exclude products: submit form as normal $( '.facebook-for-woocommerce-confirm-settings-change' ).on( 'click', function () { blockModal(); submitSettingsSave = true; $submitButton.trigger( 'click' ); } ); } else { // no modal displayed: submit form as normal submitSettingsSave = true; $submitButton.trigger( 'click' ); } } ); } else { // no terms added: submit form as normal submitSettingsSave = true; $submitButton.trigger( 'click' ); } } ); // mark as in-progress if syncing when the page is loaded if ( facebook_for_woocommerce_settings_sync.sync_in_progress ) { syncInProgress(); } // handle the sync button click $( '#woocommerce-facebook-settings-sync-products' ).click( function( event ) { event.preventDefault(); if ( confirm( facebook_for_woocommerce_settings_sync.i18n.confirm_sync ) ) { setProductSyncStatus(); let startTime = Date.now(); $.post( facebook_for_woocommerce_settings_sync.ajax_url, { action: 'wc_facebook_sync_products', nonce: facebook_for_woocommerce_settings_sync.sync_products_nonce, }, function ( response ) { console.log( response ); if ( ! response.success ) { let error = facebook_for_woocommerce_settings_sync.i18n.general_error; if ( response.data && response.data.length > 0 ) { error = response.data; } clearSyncInProgress( error ); } else { // get the current sync status after a successful response but make sure to wait at least 10 seconds since the button was pressed setTimeout( getSyncStatus, Math.max( 0, 10000 - ( Date.now() - startTime ) ) ); } } ).fail( function() { clearSyncInProgress( facebook_for_woocommerce_settings_sync.i18n.general_error ); } ); } } ); /** * Sets the UI as sync in progress and starts an interval to check the background sync status. * * @since 2.0.0 * * @param count number of items remaining */ function syncInProgress( count = null ) { setProductSyncStatus( count ); if ( ! window.syncStatusInterval ) { window.syncStatusInterval = setInterval( getSyncStatus, 10000 ); } } /** * Sets the UI as sync in progress. * * @since 2.0.0 * * @param count number of items remaining */ function setProductSyncStatus( count = null ) { toggleSettingOptions( false ); $( 'input#wc_facebook_enable_product_sync, input[name="save_product_sync_settings"]' ).css( 'pointer-events', 'none' ).css( 'opacity', '0.4' ); let message = facebook_for_woocommerce_settings_sync.i18n.sync_in_progress; if ( count ) { if ( count > 1 ) { message = message + facebook_for_woocommerce_settings_sync.i18n.sync_remaining_items_plural; } else { message = message + facebook_for_woocommerce_settings_sync.i18n.sync_remaining_items_singular } message = message.replace( '{count}', count ); } // set products sync status $( '#sync_progress' ).show().html( message ).css( 'color', 'inherit' ); facebook_for_woocommerce_settings_sync.sync_in_progress = true; } /** * Clears any UI for sync in progress. * * @since 2.0.0 * * @param error message to display */ function clearSyncInProgress( error = '' ) { facebook_for_woocommerce_settings_sync.sync_in_progress = false; clearInterval( window.syncStatusInterval ); window.syncStatusInterval = null; toggleSettingOptions( true ); $( 'input#wc_facebook_enable_product_sync, input[name="save_product_sync_settings"]' ).css( 'pointer-events', 'all' ).css( 'opacity', '1' ); if ( error ) { $( '#sync_progress' ).show().html( error ).css( 'color', '#DC3232' ); } else { $( '#sync_progress' ).hide(); } } /** * Gets the current sync status. * * @since 2.0.0 */ function getSyncStatus() { if ( ! facebook_for_woocommerce_settings_sync.sync_in_progress ) { return; } $.post( facebook_for_woocommerce_settings_sync.ajax_url, { action: 'wc_facebook_get_sync_status', nonce: facebook_for_woocommerce_settings_sync.sync_status_nonce, }, function ( response ) { console.log( response ); if ( response.success ) { // the returned data represents the number of products remaining if ( response.data > 0 ) { syncInProgress( response.data ); } else { clearSyncInProgress(); } } } ); } } );