| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- /*global wc_enhanced_select_params */
- jQuery( function( $ ) {
- function getEnhancedSelectFormatString() {
- return {
- 'language': {
- errorLoading: function() {
- // Workaround for https://github.com/select2/select2/issues/4355 instead of i18n_ajax_error.
- return wc_enhanced_select_params.i18n_searching;
- },
- inputTooLong: function( args ) {
- var overChars = args.input.length - args.maximum;
- if ( 1 === overChars ) {
- return wc_enhanced_select_params.i18n_input_too_long_1;
- }
- return wc_enhanced_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_enhanced_select_params.i18n_input_too_short_1;
- }
- return wc_enhanced_select_params.i18n_input_too_short_n.replace( '%qty%', remainingChars );
- },
- loadingMore: function() {
- return wc_enhanced_select_params.i18n_load_more;
- },
- maximumSelected: function( args ) {
- if ( args.maximum === 1 ) {
- return wc_enhanced_select_params.i18n_selection_too_long_1;
- }
- return wc_enhanced_select_params.i18n_selection_too_long_n.replace( '%qty%', args.maximum );
- },
- noResults: function() {
- return wc_enhanced_select_params.i18n_no_matches;
- },
- searching: function() {
- return wc_enhanced_select_params.i18n_searching;
- }
- }
- };
- }
- try {
- $( document.body )
- .on( 'wc-enhanced-select-init', function() {
- // Regular select boxes
- $( ':input.wc-enhanced-select, :input.chosen_select' ).filter( ':not(.enhanced)' ).each( function() {
- var select2_args = $.extend({
- minimumResultsForSearch: 10,
- allowClear: $( this ).data( 'allow_clear' ) ? true : false,
- placeholder: $( this ).data( 'placeholder' )
- }, getEnhancedSelectFormatString() );
- $( this ).selectWoo( select2_args ).addClass( 'enhanced' );
- });
- $( ':input.wc-enhanced-select-nostd, :input.chosen_select_nostd' ).filter( ':not(.enhanced)' ).each( function() {
- var select2_args = $.extend({
- minimumResultsForSearch: 10,
- allowClear: true,
- placeholder: $( this ).data( 'placeholder' )
- }, getEnhancedSelectFormatString() );
- $( this ).selectWoo( select2_args ).addClass( 'enhanced' );
- });
- // Ajax product search box
- $( ':input.wc-product-search' ).filter( ':not(.enhanced)' ).each( function() {
- var select2_args = {
- allowClear: $( this ).data( 'allow_clear' ) ? true : false,
- placeholder: $( this ).data( 'placeholder' ),
- minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3',
- escapeMarkup: function( m ) {
- return m;
- },
- ajax: {
- url: wc_enhanced_select_params.ajax_url,
- dataType: 'json',
- delay: 250,
- data: function( params ) {
- return {
- term: params.term,
- action: $( this ).data( 'action' ) || 'woocommerce_json_search_products_and_variations',
- security: wc_enhanced_select_params.search_products_nonce,
- exclude: $( this ).data( 'exclude' ),
- include: $( this ).data( 'include' ),
- limit: $( this ).data( 'limit' )
- };
- },
- processResults: function( data ) {
- var terms = [];
- if ( data ) {
- $.each( data, function( id, text ) {
- terms.push( { id: id, text: text } );
- });
- }
- return {
- results: terms
- };
- },
- cache: true
- }
- };
- select2_args = $.extend( select2_args, getEnhancedSelectFormatString() );
- $( this ).selectWoo( select2_args ).addClass( 'enhanced' );
- if ( $( this ).data( 'sortable' ) ) {
- var $select = $(this);
- var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
- $list.sortable({
- placeholder : 'ui-state-highlight select2-selection__choice',
- forcePlaceholderSize: true,
- items : 'li:not(.select2-search__field)',
- tolerance : 'pointer',
- stop: function() {
- $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function() {
- var id = $( this ).data( 'data' ).id;
- var option = $select.find( 'option[value="' + id + '"]' )[0];
- $select.prepend( option );
- } );
- }
- });
- // Keep multiselects ordered alphabetically if they are not sortable.
- } else if ( $( this ).prop( 'multiple' ) ) {
- $( this ).on( 'change', function(){
- var $children = $( this ).children();
- $children.sort(function(a, b){
- var atext = a.text.toLowerCase();
- var btext = b.text.toLowerCase();
- if ( atext > btext ) {
- return 1;
- }
- if ( atext < btext ) {
- return -1;
- }
- return 0;
- });
- $( this ).html( $children );
- });
- }
- });
- // Ajax customer search boxes
- $( ':input.wc-customer-search' ).filter( ':not(.enhanced)' ).each( function() {
- var select2_args = {
- allowClear: $( this ).data( 'allow_clear' ) ? true : false,
- placeholder: $( this ).data( 'placeholder' ),
- minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '1',
- escapeMarkup: function( m ) {
- return m;
- },
- ajax: {
- url: wc_enhanced_select_params.ajax_url,
- dataType: 'json',
- delay: 1000,
- data: function( params ) {
- return {
- term: params.term,
- action: 'woocommerce_json_search_customers',
- security: wc_enhanced_select_params.search_customers_nonce,
- exclude: $( this ).data( 'exclude' )
- };
- },
- processResults: function( data ) {
- var terms = [];
- if ( data ) {
- $.each( data, function( id, text ) {
- terms.push({
- id: id,
- text: text
- });
- });
- }
- return {
- results: terms
- };
- },
- cache: true
- }
- };
- select2_args = $.extend( select2_args, getEnhancedSelectFormatString() );
- $( this ).selectWoo( select2_args ).addClass( 'enhanced' );
- if ( $( this ).data( 'sortable' ) ) {
- var $select = $(this);
- var $list = $( this ).next( '.select2-container' ).find( 'ul.select2-selection__rendered' );
- $list.sortable({
- placeholder : 'ui-state-highlight select2-selection__choice',
- forcePlaceholderSize: true,
- items : 'li:not(.select2-search__field)',
- tolerance : 'pointer',
- stop: function() {
- $( $list.find( '.select2-selection__choice' ).get().reverse() ).each( function() {
- var id = $( this ).data( 'data' ).id;
- var option = $select.find( 'option[value="' + id + '"]' )[0];
- $select.prepend( option );
- } );
- }
- });
- }
- });
- // Ajax category search boxes
- $( ':input.wc-category-search' ).filter( ':not(.enhanced)' ).each( function() {
- var select2_args = $.extend( {
- allowClear : $( this ).data( 'allow_clear' ) ? true : false,
- placeholder : $( this ).data( 'placeholder' ),
- minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : 3,
- escapeMarkup : function( m ) {
- return m;
- },
- ajax: {
- url: wc_enhanced_select_params.ajax_url,
- dataType: 'json',
- delay: 250,
- data: function( params ) {
- return {
- term: params.term,
- action: 'woocommerce_json_search_categories',
- security: wc_enhanced_select_params.search_categories_nonce
- };
- },
- processResults: function( data ) {
- var terms = [];
- if ( data ) {
- $.each( data, function( id, term ) {
- terms.push({
- id: term.slug,
- text: term.formatted_name
- });
- });
- }
- return {
- results: terms
- };
- },
- cache: true
- }
- }, getEnhancedSelectFormatString() );
- $( this ).selectWoo( select2_args ).addClass( 'enhanced' );
- });
- })
- // WooCommerce Backbone Modal
- .on( 'wc_backbone_modal_before_remove', function() {
- $( '.wc-enhanced-select, :input.wc-product-search, :input.wc-customer-search' ).filter( '.select2-hidden-accessible' ).selectWoo( 'close' );
- })
- .trigger( 'wc-enhanced-select-init' );
- $( 'html' ).on( 'click', function( event ) {
- if ( this === event.target ) {
- $( '.wc-enhanced-select, :input.wc-product-search, :input.wc-customer-search' ).filter( '.select2-hidden-accessible' ).selectWoo( 'close' );
- }
- } );
- } catch( err ) {
- // If select2 failed (conflict?) log the error but don't stop other scripts breaking.
- window.console.log( err );
- }
- });
|