@@ -296,4 +296,185 @@ public static function canValidate() : bool {
296
296
return Session::haveRight ('ticketvalidation ' , TicketValidation::VALIDATEINCIDENT )
297
297
|| Session::haveRight ('ticketvalidation ' , TicketValidation::VALIDATEREQUEST );
298
298
}
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
+ }
299
480
}
0 commit comments