@@ -296,4 +296,185 @@ public static function canValidate() : bool {
296296 return Session::haveRight ('ticketvalidation ' , TicketValidation::VALIDATEINCIDENT )
297297 || Session::haveRight ('ticketvalidation ' , TicketValidation::VALIDATEREQUEST );
298298 }
299+
300+ /*
301+ * Create Ajax dropdown to clean JS
302+ * Code copied and modified from Html::jsAjaxDropdown to allow
303+ * item creation in dropdown
304+ *
305+ * @param $name
306+ * @param $field_id string id of the dom element
307+ * @param $url string URL to get datas
308+ * @param $params array of parameters
309+ * must contains :
310+ * if single select
311+ * - 'value' : default value selected
312+ * - 'valuename' : default name of selected value
313+ * if multiple select
314+ * - 'values' : default values selected
315+ * - 'valuesnames' : default names of selected values
316+ *
317+ * @since 0.85.
318+ *
319+ * @return String
320+ **/
321+ public static function jsAjaxDropdown ($ name , $ field_id , $ url , $ params = []) {
322+ global $ CFG_GLPI ;
323+
324+ if (!isset ($ params ['value ' ])) {
325+ $ value = 0 ;
326+ } else {
327+ $ value = $ params ['value ' ];
328+ }
329+ if (!isset ($ params ['value ' ])) {
330+ $ valuename = Dropdown::EMPTY_VALUE ;
331+ } else {
332+ $ valuename = $ params ['valuename ' ];
333+ }
334+ $ on_change = '' ;
335+ if (isset ($ params ["on_change " ])) {
336+ $ on_change = $ params ["on_change " ];
337+ unset($ params ["on_change " ]);
338+ }
339+ $ width = '80% ' ;
340+ if (isset ($ params ["width " ])) {
341+ $ width = $ params ["width " ];
342+ unset($ params ["width " ]);
343+ }
344+
345+ $ placeholder = isset ($ params ['placeholder ' ]) ? $ params ['placeholder ' ] : '' ;
346+ $ allowclear = "false " ;
347+ if (strlen ($ placeholder ) > 0 && !$ params ['display_emptychoice ' ]) {
348+ $ allowclear = "true " ;
349+ }
350+
351+ unset($ params ['placeholder ' ]);
352+ unset($ params ['value ' ]);
353+ unset($ params ['valuename ' ]);
354+
355+ $ options = [
356+ 'id ' => $ field_id ,
357+ 'selected ' => $ value
358+ ];
359+ if (!empty ($ params ['specific_tags ' ])) {
360+ foreach ($ params ['specific_tags ' ] as $ tag => $ val ) {
361+ if (is_array ($ val )) {
362+ $ val = implode (' ' , $ val );
363+ }
364+ $ options [$ tag ] = $ val ;
365+ }
366+ }
367+
368+ // manage multiple select (with multiple values)
369+ if (isset ($ params ['values ' ]) && count ($ params ['values ' ])) {
370+ $ values = array_combine ($ params ['values ' ], $ params ['valuesnames ' ]);
371+ $ options ['multiple ' ] = 'multiple ' ;
372+ $ options ['selected ' ] = $ params ['values ' ];
373+ } else {
374+ $ values = [];
375+
376+ // simple select (multiple = no)
377+ if ((isset ($ params ['display_emptychoice ' ]) && $ params ['display_emptychoice ' ])
378+ || isset ($ params ['toadd ' ][$ value ])
379+ || $ value > 0 ) {
380+ $ values = ["$ value " => $ valuename ];
381+ }
382+ }
383+
384+ // display select tag
385+ $ output = Html::select ($ name , $ values , $ options );
386+
387+ $ js = "
388+ var params_ $ field_id = { " ;
389+ foreach ($ params as $ key => $ val ) {
390+ // Specific boolean case
391+ if (is_bool ($ val )) {
392+ $ js .= "$ key: " .($ val ?1 :0 ).", \n" ;
393+ } else {
394+ $ js .= "$ key: " .json_encode ($ val ).", \n" ;
395+ }
396+ }
397+ $ js .= "};
398+
399+ $('# $ field_id').select2({
400+ width: ' $ width',
401+ placeholder: ' $ placeholder',
402+ allowClear: $ allowclear,
403+ minimumInputLength: 0,
404+ quietMillis: 100,
405+ dropdownAutoWidth: true,
406+ minimumResultsForSearch: " .$ CFG_GLPI ['ajax_limit_count ' ].",
407+ tokenSeparators: [',', ';'],
408+ tags: true,
409+ ajax: {
410+ url: ' $ url',
411+ dataType: 'json',
412+ type: 'POST',
413+ data: function (params) {
414+ query = params;
415+ return $.extend({}, params_ $ field_id, {
416+ searchText: params.term,
417+ page_limit: " .$ CFG_GLPI ['dropdown_max ' ].", // page size
418+ page: params.page || 1, // page number
419+ });
420+ },
421+ processResults: function (data, params) {
422+ params.page = params.page || 1;
423+ var more = (data.count >= " .$ CFG_GLPI ['dropdown_max ' ].");
424+
425+ return {
426+ results: data.results,
427+ pagination: {
428+ more: more
429+ }
430+ };
431+ }
432+ },
433+ templateResult: templateResult,
434+ templateSelection: templateSelection
435+ })
436+ .bind('setValue', function(e, value) {
437+ $.ajax(' $ url', {
438+ data: $.extend({}, params_ $ field_id, {
439+ _one_id: value,
440+ }),
441+ dataType: 'json',
442+ type: 'POST',
443+ }).done(function(data) {
444+
445+ var iterate_options = function(options, value) {
446+ var to_return = false;
447+ $.each(options, function(index, option) {
448+ if (option.hasOwnProperty('id')
449+ && option.id == value) {
450+ to_return = option;
451+ return false; // act as break;
452+ }
453+
454+ if (option.hasOwnProperty('children')) {
455+ to_return = iterate_options(option.children, value);
456+ }
457+ });
458+
459+ return to_return;
460+ };
461+
462+ var option = iterate_options(data.results, value);
463+ if (option !== false) {
464+ var newOption = new Option(option.text, option.id, true, true);
465+ $('# $ field_id').append(newOption).trigger('change');
466+ }
467+ });
468+ });
469+ " ;
470+ if (!empty ($ on_change )) {
471+ $ js .= " $('# $ field_id').on('change', function(e) { " .
472+ stripslashes ($ on_change )."}); " ;
473+ }
474+
475+ $ js .= " $('label[for= $ field_id]').on('click', function(){ $('# $ field_id').select2('open'); }); " ;
476+
477+ $ output .= Html::scriptBlock ('$(function() { ' . $ js . '}); ' );
478+ return $ output ;
479+ }
299480}
0 commit comments