| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- /*global wc_country_select_params */
- jQuery( function( $ ) {
- // wc_country_select_params is required to continue, ensure the object exists
- if ( typeof wc_country_select_params === 'undefined' ) {
- return false;
- }
- // Select2 Enhancement if it exists
- if ( $().selectWoo ) {
- var getEnhancedSelectFormatString = function() {
- return {
- 'language': {
- errorLoading: function() {
- // Workaround for https://github.com/select2/select2/issues/4355 instead of i18n_ajax_error.
- return wc_country_select_params.i18n_searching;
- },
- inputTooLong: function( args ) {
- var overChars = args.input.length - args.maximum;
- if ( 1 === overChars ) {
- return wc_country_select_params.i18n_input_too_long_1;
- }
- return wc_country_select_params.i18n_input_too_long_n.replace( '%qty%', overChars );
- },
- inputTooShort: function( args ) {
- var remainingChars = args.minimum - args.input.length;
- if ( 1 === remainingChars ) {
- return wc_country_select_params.i18n_input_too_short_1;
- }
- return wc_country_select_params.i18n_input_too_short_n.replace( '%qty%', remainingChars );
- },
- loadingMore: function() {
- return wc_country_select_params.i18n_load_more;
- },
- maximumSelected: function( args ) {
- if ( args.maximum === 1 ) {
- return wc_country_select_params.i18n_selection_too_long_1;
- }
- return wc_country_select_params.i18n_selection_too_long_n.replace( '%qty%', args.maximum );
- },
- noResults: function() {
- return wc_country_select_params.i18n_no_matches;
- },
- searching: function() {
- return wc_country_select_params.i18n_searching;
- }
- }
- };
- };
- var wc_country_select_select2 = function() {
- $( 'select.country_select:visible, select.state_select:visible' ).each( function() {
- var $this = $( this );
- var select2_args = $.extend({
- placeholder: $this.attr( 'data-placeholder' ) || $this.attr( 'placeholder' ) || '',
- label: $this.attr( 'data-label' ) || null,
- width: '100%'
- }, getEnhancedSelectFormatString() );
- $( this )
- .on( 'select2:select', function() {
- $( this ).trigger( 'focus' ); // Maintain focus after select https://github.com/select2/select2/issues/4384
- } )
- .selectWoo( select2_args );
- });
- };
- wc_country_select_select2();
- $( document.body ).on( 'country_to_state_changed', function() {
- wc_country_select_select2();
- });
- }
- /* State/Country select boxes */
- var states_json = wc_country_select_params.countries.replace( /"/g, '"' ),
- states = JSON.parse( states_json ),
- wrapper_selectors = '.woocommerce-billing-fields,' +
- '.woocommerce-shipping-fields,' +
- '.woocommerce-address-fields,' +
- '.woocommerce-shipping-calculator';
- $( document.body ).on( 'change refresh', 'select.country_to_state, input.country_to_state', function() {
- // Grab wrapping element to target only stateboxes in same 'group'
- var $wrapper = $( this ).closest( wrapper_selectors );
- if ( ! $wrapper.length ) {
- $wrapper = $( this ).closest('.form-row').parent();
- }
- var country = $( this ).val(),
- $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' ),
- $parent = $statebox.closest( '.form-row' ),
- input_name = $statebox.attr( 'name' ),
- input_id = $statebox.attr('id'),
- input_classes = $statebox.attr('data-input-classes'),
- value = $statebox.val(),
- placeholder = $statebox.attr( 'placeholder' ) || $statebox.attr( 'data-placeholder' ) || '',
- $newstate;
- if ( states[ country ] ) {
- if ( $.isEmptyObject( states[ country ] ) ) {
- $newstate = $( '<input type="hidden" />' )
- .prop( 'id', input_id )
- .prop( 'name', input_name )
- .prop( 'placeholder', placeholder )
- .attr( 'data-input-classes', input_classes )
- .addClass( 'hidden ' + input_classes );
- $parent.hide().find( '.select2-container' ).remove();
- $statebox.replaceWith( $newstate );
- $( document.body ).trigger( 'country_to_state_changed', [ country, $wrapper ] );
- } else {
- var state = states[ country ],
- $defaultOption = $( '<option value=""></option>' ).text( wc_country_select_params.i18n_select_state_text );
- if ( ! placeholder ) {
- placeholder = wc_country_select_params.i18n_select_state_text;
- }
- $parent.show();
- if ( $statebox.is( 'input' ) ) {
- $newstate = $( '<select></select>' )
- .prop( 'id', input_id )
- .prop( 'name', input_name )
- .data( 'placeholder', placeholder )
- .attr( 'data-input-classes', input_classes )
- .addClass( 'state_select ' + input_classes );
- $statebox.replaceWith( $newstate );
- $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' );
- }
- $statebox.empty().append( $defaultOption );
- $.each( state, function( index ) {
- var $option = $( '<option></option>' )
- .prop( 'value', index )
- .text( state[ index ] );
- $statebox.append( $option );
- } );
- $statebox.val( value ).trigger( 'change' );
- $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
- }
- } else {
- if ( $statebox.is( 'select, input[type="hidden"]' ) ) {
- $newstate = $( '<input type="text" />' )
- .prop( 'id', input_id )
- .prop( 'name', input_name )
- .prop('placeholder', placeholder)
- .attr('data-input-classes', input_classes )
- .addClass( 'input-text ' + input_classes );
- $parent.show().find( '.select2-container' ).remove();
- $statebox.replaceWith( $newstate );
- $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
- }
- }
- $( document.body ).trigger( 'country_to_state_changing', [country, $wrapper ] );
- });
- $( document.body ).on( 'wc_address_i18n_ready', function() {
- // Init country selects with their default value once the page loads.
- $( wrapper_selectors ).each( function() {
- var $country_input = $( this ).find( '#billing_country, #shipping_country, #calc_shipping_country' );
- if ( 0 === $country_input.length || 0 === $country_input.val().length ) {
- return;
- }
- $country_input.trigger( 'refresh' );
- });
- });
- });
|