woocommerce/assets/js/frontend/country-select.js

158 lines
5.3 KiB
JavaScript
Raw Normal View History

/*global wc_country_select_params */
jQuery( function( $ ) {
2013-06-11 12:31:41 +00:00
// wc_country_select_params is required to continue, ensure the object exists
if ( typeof wc_country_select_params === 'undefined' ) {
return false;
}
2015-01-19 19:31:22 +00:00
function getEnhancedSelectFormatString() {
2017-03-17 11:25:53 +00:00
return {
'language': {
errorLoading: function() {
2017-04-04 10:13:43 +00:00
// Workaround for https://github.com/select2/select2/issues/4355 instead of i18n_ajax_error.
return wc_country_select_params.i18n_searching;
2017-03-17 11:25:53 +00:00
},
inputTooLong: function( args ) {
var overChars = args.input.length - args.maximum;
2015-01-19 19:31:22 +00:00
2017-03-17 11:25:53 +00:00
if ( 1 === overChars ) {
return wc_country_select_params.i18n_input_too_long_1;
}
2015-01-19 19:31:22 +00:00
2017-03-17 11:25:53 +00:00
return wc_country_select_params.i18n_input_too_long_n.replace( '%qty%', overChars );
},
inputTooShort: function( args ) {
var remainingChars = args.minimum - args.input.length;
2015-01-19 19:31:22 +00:00
2017-03-17 11:25:53 +00:00
if ( 1 === remainingChars ) {
return wc_country_select_params.i18n_input_too_short_1;
}
2015-01-19 19:31:22 +00:00
2017-03-17 11:25:53 +00:00
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;
}
2015-01-19 19:31:22 +00:00
2017-03-17 11:25:53 +00:00
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;
}
2015-01-19 19:31:22 +00:00
}
};
}
2015-01-12 16:16:10 +00:00
// Select2 Enhancement if it exists
2017-06-26 19:44:33 +00:00
if ( $().selectWoo ) {
2015-01-12 16:16:10 +00:00
var wc_country_select_select2 = function() {
2015-01-19 19:31:22 +00:00
$( 'select.country_select:visible, select.state_select:visible' ).each( function() {
var select2_args = $.extend({
placeholderOption: 'first',
width: '100%'
2015-01-19 19:31:22 +00:00
}, getEnhancedSelectFormatString() );
2017-06-26 19:44:33 +00:00
$( this ).selectWoo( select2_args );
// Maintain focus after select https://github.com/select2/select2/issues/4384
$( this ).on( 'select2:select', function() {
$( this ).focus();
} );
2015-01-12 16:16:10 +00:00
});
};
2015-01-12 16:16:10 +00:00
wc_country_select_select2();
2015-04-13 15:37:22 +00:00
$( document.body ).bind( 'country_to_state_changed', function() {
2015-01-12 16:16:10 +00:00
wc_country_select_select2();
});
}
2015-01-12 15:43:13 +00:00
2013-06-11 12:31:41 +00:00
/* State/Country select boxes */
var states_json = wc_country_select_params.countries.replace( /"/g, '"' ),
states = $.parseJSON( states_json );
2013-06-11 12:31:41 +00:00
2015-04-13 15:37:22 +00:00
$( document.body ).on( 'change', 'select.country_to_state, input.country_to_state', function() {
// Grab wrapping element to target only stateboxes in same 'group'
var $wrapper = $( this ).closest('.woocommerce-billing-fields, .woocommerce-shipping-fields, .woocommerce-shipping-calculator');
2016-03-01 13:08:25 +00:00
if ( ! $wrapper.length ) {
$wrapper = $( this ).closest('.form-row').parent();
}
2013-06-11 12:31:41 +00:00
var country = $( this ).val(),
$statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' ),
$parent = $statebox.closest( 'p.form-row' ),
input_name = $statebox.attr( 'name' ),
input_id = $statebox.attr( 'id' ),
value = $statebox.val(),
placeholder = $statebox.attr( 'placeholder' ) || $statebox.attr( 'data-placeholder' ) || '';
2013-06-11 12:31:41 +00:00
if ( states[ country ] ) {
if ( $.isEmptyObject( states[ country ] ) ) {
2013-06-11 12:31:41 +00:00
$statebox.closest( 'p.form-row' ).hide().find( '.select2-container' ).remove();
$statebox.replaceWith( '<input type="hidden" class="hidden" name="' + input_name + '" id="' + input_id + '" value="" placeholder="' + placeholder + '" />' );
2013-06-11 12:31:41 +00:00
$( document.body ).trigger( 'country_to_state_changed', [ country, $wrapper ] );
2013-06-11 12:31:41 +00:00
} else {
var options = '',
state = states[ country ];
for( var index in state ) {
if ( state.hasOwnProperty( index ) ) {
options = options + '<option value="' + index + '">' + state[ index ] + '</option>';
}
2013-06-11 12:31:41 +00:00
}
$statebox.closest( 'p.form-row' ).show();
if ( $statebox.is( 'input' ) ) {
2013-06-11 12:31:41 +00:00
// Change for select
$statebox.replaceWith( '<select name="' + input_name + '" id="' + input_id + '" class="state_select" data-placeholder="' + placeholder + '"></select>' );
$statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' );
2013-06-11 12:31:41 +00:00
}
$statebox.html( '<option value="">' + wc_country_select_params.i18n_select_state_text + '</option>' + options );
$statebox.val( value ).change();
2013-06-11 12:31:41 +00:00
$( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
2013-06-11 12:31:41 +00:00
}
} else {
if ( $statebox.is( 'select' ) ) {
2013-06-11 12:31:41 +00:00
2015-01-12 16:16:10 +00:00
$parent.show().find( '.select2-container' ).remove();
$statebox.replaceWith( '<input type="text" class="input-text" name="' + input_name + '" id="' + input_id + '" placeholder="' + placeholder + '" />' );
2013-06-11 12:31:41 +00:00
$( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
2013-06-11 12:31:41 +00:00
} else if ( $statebox.is( 'input[type="hidden"]' ) ) {
2013-06-11 12:31:41 +00:00
2015-01-12 16:16:10 +00:00
$parent.show().find( '.select2-container' ).remove();
$statebox.replaceWith( '<input type="text" class="input-text" name="' + input_name + '" id="' + input_id + '" placeholder="' + placeholder + '" />' );
2013-06-11 12:31:41 +00:00
$( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
2013-06-11 12:31:41 +00:00
}
}
$( document.body ).trigger( 'country_to_state_changing', [country, $wrapper ] );
2013-06-11 12:31:41 +00:00
});
$(function() {
$( ':input.country_to_state' ).change();
});
2013-06-11 12:31:41 +00:00
});