2017-06-01 14:26:57 +00:00
|
|
|
(function( document, $ ) {
|
|
|
|
function init_ajax_search() {
|
|
|
|
$('.cmb-ajax-search:not([data-ajax-search="true"])').each(function () {
|
|
|
|
$(this).attr('data-ajax-search', true);
|
|
|
|
|
2019-03-27 16:42:46 +00:00
|
|
|
var field_id = $(this).attr('id').replace( new RegExp('_input$'), '' ).replace(/[\[\]']+/g, '_'); // Field id, the true one field
|
2017-06-01 14:26:57 +00:00
|
|
|
var object_type = $(this).attr('data-object-type');
|
|
|
|
var query_args = $(this).attr('data-query-args');
|
|
|
|
|
2019-02-09 03:29:15 +00:00
|
|
|
$(this).devbridgeAutocomplete(Object.assign({
|
2017-06-01 14:26:57 +00:00
|
|
|
serviceUrl: cmb_ajax_search.ajaxurl,
|
|
|
|
type: 'POST',
|
|
|
|
triggerSelectOnValidInput: false,
|
|
|
|
showNoSuggestionNotice: true,
|
|
|
|
params: {
|
|
|
|
action : 'cmb_ajax_search_get_results',
|
|
|
|
nonce : cmb_ajax_search.nonce, // nonce
|
|
|
|
field_id : field_id, // Field id for hook purposes
|
|
|
|
object_type : object_type, // post, user or term
|
|
|
|
query_args : query_args, // Query args passed to field
|
|
|
|
},
|
|
|
|
transformResult: function( results ) {
|
|
|
|
var suggestions = $.parseJSON( results );
|
|
|
|
|
|
|
|
if( $('#' + field_id + '_results li').length ) {
|
|
|
|
var selected_vals = [];
|
|
|
|
var d = 0;
|
|
|
|
|
|
|
|
$('#' + field_id + '_results input').each(function( index, element ) {
|
|
|
|
selected_vals.push( $(this).val() );
|
|
|
|
});
|
|
|
|
|
|
|
|
// Remove already picked suggestions
|
|
|
|
$(suggestions).each(function( index, suggestion ) {
|
|
|
|
if( $.inArray( ( suggestion.id ).toString(), selected_vals ) > -1 ) {
|
|
|
|
suggestions.splice( index - d, 1 );
|
|
|
|
d++;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return { suggestions: suggestions };
|
|
|
|
},
|
|
|
|
onSearchStart: function(){
|
|
|
|
$(this).next('img.cmb-ajax-search-spinner').css( 'display', 'inline-block' );
|
|
|
|
},
|
|
|
|
onSearchComplete: function(){
|
|
|
|
$(this).next('img.cmb-ajax-search-spinner').hide();
|
|
|
|
},
|
|
|
|
onSelect: function ( suggestion ) {
|
|
|
|
$(this).devbridgeAutocomplete('clearCache');
|
2019-03-27 16:42:46 +00:00
|
|
|
|
|
|
|
var field_name = $(this).attr('name').replace( new RegExp('_input$'), '' );
|
2017-06-01 14:26:57 +00:00
|
|
|
var multiple = $(this).attr('data-multiple');
|
|
|
|
var limit = parseInt( $(this).attr('data-limit') );
|
|
|
|
var sortable = $(this).attr('data-sortable');
|
2019-03-27 16:42:46 +00:00
|
|
|
var field_name_temp = field_name.replace( /[\[\]']+/g, '_' );
|
|
|
|
|
2017-06-01 14:26:57 +00:00
|
|
|
if( multiple == 1 ) {
|
|
|
|
// Multiple
|
2019-03-27 16:42:46 +00:00
|
|
|
$('#' + field_name_temp + '_results' ).append( '<li>' +
|
2017-06-01 14:26:57 +00:00
|
|
|
( ( sortable == 1 ) ? '<span class="hndl"></span>' : '' ) +
|
|
|
|
'<input type="hidden" name="' + field_name + '[]" value="' + suggestion.id + '">' +
|
|
|
|
'<a href="' + suggestion.link + '" target="_blank" class="edit-link">' + suggestion.value + '</a>' +
|
|
|
|
'<a class="remover"><span class="dashicons dashicons-no"></span><span class="dashicons dashicons-dismiss"></span></a>' +
|
|
|
|
'</li>' );
|
2017-03-14 19:07:56 +00:00
|
|
|
|
2017-06-01 14:26:57 +00:00
|
|
|
$(this).val( '' );
|
|
|
|
|
|
|
|
// Checks if there is the max allowed results, limit < 0 means unlimited
|
2019-03-27 16:42:46 +00:00
|
|
|
if( limit > 0 && limit == $('#' + field_name_temp + '_results li').length ) {
|
2017-06-01 14:26:57 +00:00
|
|
|
$(this).prop( 'disabled', 'disabled' );
|
|
|
|
} else {
|
|
|
|
$(this).focus();
|
|
|
|
}
|
2017-03-14 19:07:56 +00:00
|
|
|
} else {
|
2017-06-01 14:26:57 +00:00
|
|
|
// Singular
|
2019-03-27 18:37:30 +00:00
|
|
|
$('input[name="' + field_name + '"]').val( suggestion.id ).change();
|
2017-03-14 19:07:56 +00:00
|
|
|
}
|
|
|
|
}
|
2019-02-09 03:29:15 +00:00
|
|
|
},
|
|
|
|
cmb_ajax_search.options));
|
2017-06-01 14:26:57 +00:00
|
|
|
|
|
|
|
if( $(this).attr('data-sortable') == 1 ){
|
|
|
|
$('#' + field_id + '_results').sortable({
|
|
|
|
handle : '.hndl',
|
|
|
|
placeholder : 'ui-state-highlight',
|
|
|
|
forcePlaceholderSize : true
|
|
|
|
});
|
2017-03-14 19:07:56 +00:00
|
|
|
}
|
|
|
|
});
|
2017-06-01 14:26:57 +00:00
|
|
|
}
|
2017-03-14 19:07:56 +00:00
|
|
|
|
2017-06-01 14:26:57 +00:00
|
|
|
// Initialize ajax search
|
|
|
|
init_ajax_search();
|
|
|
|
|
|
|
|
// Initialize on group fields add row
|
|
|
|
$( document ).on( 'cmb2_add_row', function( evt, $row ) {
|
|
|
|
$row.find('.cmb-ajax-search').attr('data-ajax-search', false);
|
|
|
|
|
|
|
|
init_ajax_search();
|
2017-03-14 19:07:56 +00:00
|
|
|
});
|
2017-06-01 14:26:57 +00:00
|
|
|
|
|
|
|
// Initialize on widgets area
|
|
|
|
$(document).on('widget-updated widget-added', function() {
|
|
|
|
init_ajax_search();
|
|
|
|
});
|
|
|
|
|
|
|
|
// On click remover listener
|
|
|
|
$('body').on( 'click', '.cmb-ajax-search-results a.remover', function() {
|
2017-03-14 19:07:56 +00:00
|
|
|
$(this).parent('li').fadeOut( 400, function(){
|
|
|
|
var field_id = $(this).parents('ul').attr('id').replace('_results', '');
|
|
|
|
|
|
|
|
$('#' + field_id).removeProp( 'disabled' );
|
2017-06-01 14:26:57 +00:00
|
|
|
$('#' + field_id).devbridgeAutocomplete('clearCache');
|
2017-03-14 19:07:56 +00:00
|
|
|
|
|
|
|
$(this).remove();
|
|
|
|
});
|
|
|
|
});
|
2019-02-09 03:29:15 +00:00
|
|
|
})(document, jQuery);
|