49function ajax_autocompleter($selected, $htmlname, $url, $urloption =
'', $minLength = 2, $autoselect = 0, $ajaxoptions = array(), $moreparams =
'')
51 if (empty($minLength)) {
55 $dataforrenderITem =
'ui-autocomplete';
56 $dataforitem =
'ui-autocomplete-item';
58 if (defined(
'JS_QUERY_AUTOCOMPLETE_RENDERITEM')) {
59 $dataforrenderITem = constant(
'JS_QUERY_AUTOCOMPLETE_RENDERITEM');
61 if (defined(
'JS_QUERY_AUTOCOMPLETE_ITEM')) {
62 $dataforitem = constant(
'JS_QUERY_AUTOCOMPLETE_ITEM');
65 $htmlnamejquery = str_replace(
'.',
'\\\\.', $htmlname);
69 $script =
'<input type="hidden" name="'.$htmlname.
'" id="'.$htmlname.
'" value="'.$selected.
'" '.($moreparams ? $moreparams :
'').
' />';
71 $script .=
'<!-- Javascript code for autocomplete of field '.$htmlname.
' -->'.
"\n";
72 $script .=
'<script>'.
"\n";
73 $script .=
'$(document).ready(function() {
74 var autoselect = '.((int) $autoselect).
';
75 var options = '.json_encode($ajaxoptions).
'; /* Option of actions to do after keyup, or after select */
77 /* Remove selected id as soon as we type or delete a char (it means old selection is wrong). Use keyup/down instead of change to avoid losing the product id. This is needed only for select of predefined product */
78 $("input#search_'.$htmlnamejquery.
'").keydown(function(e) {
79 if (e.keyCode != 9) /* If not "Tab" key */
81 if (e.keyCode == 13) { return false; } /* disable "ENTER" key useful for barcode readers */
82 console.log("Clear id previously selected for field '.$htmlname.
'");
83 $("#'.$htmlnamejquery.
'").val("");
87 // Check options for secondary actions when keyup
88 $("input#search_'.$htmlnamejquery.
'").keyup(function() {
89 if ($(this).val().length == 0)
91 $("#search_'.$htmlnamejquery.
'").val("");
92 $("#'.$htmlnamejquery.
'").val("").trigger("change");
93 if (options.option_disabled) {
94 $("#" + options.option_disabled).removeAttr("disabled");
96 if (options.disabled) {
97 $.each(options.disabled, function(key, value) {
98 $("#" + value).removeAttr("disabled");
101 if (options.update) {
102 $.each(options.update, function(key, value) {
103 $("#" + key).val("").trigger("change");
107 $.each(options.show, function(key, value) {
108 $("#" + value).hide().trigger("hide");
111 if (options.update_textarea) {
112 $.each(options.update_textarea, function(key, value) {
113 if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
114 CKEDITOR.instances[key].setData("");
116 $("#" + key).html("");
123 // Activate the autocomplete to execute the GET
124 $("input#search_'.$htmlnamejquery.
'").autocomplete({
125 source: function( request, response ) {
126 $.get("'.$url.($urloption ?
'?'.$urloption :
'').
'", { "'.str_replace(
'.',
'_', $htmlname).
'": request.term }, function(data){
129 response($.map( data, function(item) {
130 console.log("Received answer from ajax GET, we populate array to return to the jquery autocomplete");
131 if (autoselect == 1 && data.length == 1) {
132 $("#search_'.$htmlnamejquery.
'").val(item.value);
133 $("#'.$htmlnamejquery.
'").val(item.key).trigger("change");
136 if (item.labelhtml != null) {
137 label = item.labelhtml.toString();
138 } else if (item.label != null) {
139 label = item.label.toString();
142 if (options.update) {
143 $.each(options.update, function(key, value) {
144 update[key] = item[value];
148 if (options.update_textarea) {
149 $.each(options.update_textarea, function(key, value) {
150 textarea[key] = item[value];
154 return { label: label,
157 disabled: item.disabled,
163 discount: item.discount,
164 pricebasetype: item.pricebasetype,
165 price_ht: item.price_ht,
166 price_ttc: item.price_ttc,
167 price_unit_ht: item.price_unit_ht,
168 price_unit_ht_locale: item.price_unit_ht_locale,
169 multicurrency_code: item.multicurrency_code,
170 multicurrency_unitprice: item.multicurrency_unitprice,
171 description : item.description,
172 ref_customer: item.ref_customer,
174 default_vat_code: item.default_vat_code,
175 supplier_ref: item.supplier_ref
179 console.error("Error: Ajax url '.$url.($urloption ?
'?'.$urloption :
'').
' has returned an empty page. Should be an empty json array.");
184 minLength: '.((
int) $minLength).
',
185 select: function( event, ui ) { // Function ran once a new value has been selected into the javascript combo
186 console.log("We will trigger change on input '.$htmlname.
' because of the select definition of autocomplete code for input#search_'.$htmlname.
'");
187 console.log("Selected id = "+ui.item.id+" - If this value is null, it means you select a record with key that is null so selection is not effective");
189 console.log("Before, we propagate some properties, retrieved by the ajax of the get, into the data-xxx properties of the component #'.$htmlnamejquery.
'");
190 //console.log(ui.item);
192 // For supplier price and customer when price by quantity is off
193 $("#'.$htmlnamejquery.
'").attr("data-up", ui.item.price_ht);
194 $("#'.$htmlnamejquery.
'").attr("data-up-locale", ui.item.price_unit_ht_locale);
195 $("#'.$htmlnamejquery.
'").attr("data-base", ui.item.pricebasetype);
196 $("#'.$htmlnamejquery.
'").attr("data-qty", ui.item.qty);
197 $("#'.$htmlnamejquery.
'").attr("data-discount", ui.item.discount);
198 $("#'.$htmlnamejquery.
'").attr("data-description", ui.item.description);
199 $("#'.$htmlnamejquery.
'").attr("data-ref-customer", ui.item.ref_customer);
200 $("#'.$htmlnamejquery.
'").attr("data-tvatx", ui.item.tva_tx);
201 $("#'.$htmlnamejquery.
'").attr("data-default-vat-code", ui.item.default_vat_code);
202 $("#'.$htmlnamejquery.
'").attr("data-supplier-ref", ui.item.supplier_ref); // supplier_ref of price
204 // For multi-currency values
205 $("#'.$htmlnamejquery.
'").attr("data-multicurrency-code", ui.item.multicurrency_code);
206 $("#'.$htmlnamejquery.
'").attr("data-multicurrency-unitprice", ui.item.multicurrency_unitprice);
210 // For customer price when PRODUIT_CUSTOMER_PRICES_BY_QTY is on
211 console.log("PRODUIT_CUSTOMER_PRICES_BY_QTY is on, so we propagate also prices by quantity into data-pbqxxx properties");
212 $("#'.$htmlnamejquery.
'").attr("data-pbq", ui.item.pbq);
213 $("#'.$htmlnamejquery.
'").attr("data-pbqup", ui.item.price_ht);
214 $("#'.$htmlnamejquery.
'").attr("data-pbqbase", ui.item.pricebasetype);
215 $("#'.$htmlnamejquery.
'").attr("data-pbqqty", ui.item.qty);
216 $("#'.$htmlnamejquery.
'").attr("data-pbqpercent", ui.item.discount);
220 // A new value has been selected, we trigger the handlers on #htmlnamejquery
221 console.log("Now, we trigger changes on #'.$htmlnamejquery.
'");
222 $("#'.$htmlnamejquery.
'").val(ui.item.id).trigger("change"); // Select new value
224 // Complementary actions
226 // Disable an element
227 if (options.option_disabled) {
228 console.log("Make action option_disabled on #"+options.option_disabled+" with disabled="+ui.item.disabled)
229 if (ui.item.disabled) {
230 $("#" + options.option_disabled).prop("disabled", true);
232 $.jnotify(options.error, "error", true); // Output with jnotify the error message
234 if (options.warning) {
235 $.jnotify(options.warning, "warning", false); // Output with jnotify the warning message
238 $("#" + options.option_disabled).removeAttr("disabled");
242 if (options.disabled) {
243 console.log("Make action \'disabled\' on each "+options.option_disabled)
244 $.each(options.disabled, function(key, value) {
245 $("#" + value).prop("disabled", true);
249 console.log("Make action \'show\' on each "+options.show)
250 $.each(options.show, function(key, value) {
251 $("#" + value).show().trigger("show");
256 if (ui.item.update) {
257 console.log("Make action \'update\' on each ui.item.update (if there is)")
258 // loop on each "update" fields
259 $.each(ui.item.update, function(key, value) {
260 console.log("Set value "+value+" into #"+key);
261 $("#" + key).val(value).trigger("change");
264 if (ui.item.textarea) {
265 console.log("Make action \'textarea\' on each ui.item.textarea (if there is)")
266 $.each(ui.item.textarea, function(key, value) {
267 if (typeof CKEDITOR == "object" && typeof CKEDITOR.instances != "undefined" && CKEDITOR.instances[key] != "undefined") {
268 CKEDITOR.instances[key].setData(value);
269 CKEDITOR.instances[key].focus();
271 $("#" + key).html(value);
272 $("#" + key).focus();
276 console.log("ajax_autocompleter new value selected, we trigger change also on original component so on field #search_'.$htmlname.
'");
278 $("#search_'.$htmlnamejquery.
'").trigger("change"); // We have changed value of the combo select, we must be sure to trigger all js hook binded on this event. This is required to trigger other javascript change method binded on original field by other code.
281 }).data("'.$dataforrenderITem.
'")._renderItem = function( ul, item ) {
283 .data( "'.$dataforitem.
'", item ) // jQuery UI > 1.10.0
284 .append( \'<a><span class="tag">\' + item.label + "</span></a>" )
289 $script .=
'</script>';
459function ajax_combobox($htmlname, $events = array(), $minLengthToAutocomplete = 0, $forcefocus = 0, $widthTypeOfAutocomplete =
'resolve', $idforemptyvalue =
'-1', $morecss =
'')
464 if (!empty(
$conf->browser->layout) &&
$conf->browser->layout ==
'phone' &&
getDolGlobalString(
'MAIN_DISALLOW_SELECT2_WITH_SMARTPHONE')) {
471 if (empty(
$conf->use_javascript_ajax)) {
474 if (!
getDolGlobalString(
'MAIN_USE_JQUERY_MULTISELECT') && !defined(
'REQUIRE_JQUERY_MULTISELECT')) {
481 if (empty($minLengthToAutocomplete)) {
482 $minLengthToAutocomplete = 0;
485 $moreselect2theme = ($morecss ?
dol_escape_js(
' '.$morecss) :
'');
486 $moreselect2theme = preg_replace(
'/widthcentpercentminus[^\s]*/',
'', $moreselect2theme);
488 $tmpplugin =
'select2';
489 $msg =
"\n".
'<!-- JS CODE TO ENABLE '.$tmpplugin.
' for id = '.$htmlname.
' -->
491 $(document).ready(function () {
492 $(\''.(preg_match(
'/^\./', $htmlname) ? $htmlname :
'#'.$htmlname).
'\').
'.$tmpplugin.'({
494 if (preg_match(
'/onrightofpage/', $morecss)) {
495 $msg .=
' dropdownAutoWidth: true, dropdownParent: $(\'#'.$htmlname.
'\').parent(),
'."\n";
497 $msg .= ' width: \
''.dol_escape_js($widthTypeOfAutocomplete).
'\',
498 minimumInputLength:
'.((int) $minLengthToAutocomplete).',
499 language: select2arrayoflanguage,
500 matcher:
function (params, data) {
501 if ($.trim(params.term) ===
"") {
504 keywords = (params.term).split(
" ");
505 for (var i = 0; i < keywords.length; i++) {
506 if (((data.text).toUpperCase()).indexOf((keywords[i]).toUpperCase()) == -1) {
512 theme: \
'default'.$moreselect2theme.
'\',
513 containerCssClass: \
':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag */
514 selectionCssClass: \':all:\', /* Line to add class of origin SELECT propagated to the new <span class="select2-selection...> tag */
515 dropdownCssClass: \'ui-dialog\',
516 templateResult: function (data, container) { /* Format visible output into combo list */
517 /* Code to add class of origin OPTION propagated to the new select2 <li> tag */
518 if (data.element) { $(container).addClass($(data.element).attr("class")); }
519 //console.log("data html is "+$(data.element).attr("data-html"));
520 if (data.id == '.((int) $idforemptyvalue).
' && $(data.element).attr("data-html") == undefined) {
523 if ($(data.element).attr("data-html") != undefined) {
524 /* If property html set, we decode html entities and use this. */
525 /* Note that HTML content must have been sanitized from js with dol_escape_htmltag(xxx, 0, 0, \'\', 0, 1) when building the select option. */
526 if (typeof htmlEntityDecodeJs === "function") {
527 return htmlEntityDecodeJs($(data.element).attr("data-html"));
532 templateSelection: function (selection) { /* Format visible output of selected value */
533 if (selection.id == '.((int) $idforemptyvalue).
') return \'<span class="placeholder">\'+selection.text+\'</span>\';
534 return selection.text;
536 escapeMarkup: function(markup) {
541 $msg .=
'.select2(\'focus\')';
546 $msg .=
"</script>\n";
647function ajax_constantonoff($code, $input = array(), $entity =
null, $revertonoff = 0, $strict = 0, $forcereload = 0, $marginleftonlyshort = 2, $forcenoajax = 0, $setzeroinsteadofdel = 0, $suffix =
'', $mode =
'', $morecss =
'inline-block', $userconst = 0, $showwarning =
'')
649 global
$conf, $langs, $user, $db;
651 $entity = ((isset($entity) && is_numeric($entity) && $entity >= 0) ? $entity :
$conf->entity);
652 if (!isset($input)) {
656 if (empty(
$conf->use_javascript_ajax) || $forcenoajax) {
658 $out =
'<a '.($morecss ?
'class="'.$morecss.
'" ' :
'').
'href="'.$_SERVER[
'PHP_SELF'].
'?action=set_'.$code.
'&token='.
newToken().
'&entity='.$entity.($mode ?
'&mode='.$mode :
'').($forcereload ?
'&dol_resetcache=1' :
'').
'">'.
img_picto($langs->trans(
"Disabled"),
'off').
'</a>';
660 $out =
'<a '.($morecss ?
'class="'.$morecss.
'" ' :
'').
' href="'.$_SERVER[
'PHP_SELF'].
'?action=del_'.$code.
'&token='.
newToken().
'&entity='.$entity.($mode ?
'&mode='.$mode :
'').($forcereload ?
'&dol_resetcache=1' :
'').
'">'.
img_picto($langs->trans(
"Enabled"),
'on').
'</a>';
664 if (is_object($userconst)) {
665 $userconstid = $userconst->id;
666 } elseif (is_numeric($userconst) && $userconst > 0) {
667 $userconstid = $userconst;
668 $userconst =
new User($db);
669 $userconst->fetch($userconstid);
672 $out =
"\n<!-- Ajax code to switch constant ".$code.
" -->".
'
674 $(document).ready(function() {
675 var input = '.json_encode($input).
';
676 var url = \''.DOL_URL_ROOT.
'/core/ajax/constantonoff.php\';
678 var entity = \
''.dol_escape_js($entity).
'\';
679 var strict = \
''.dol_escape_js((
string) $strict).
'\';
680 var userid = \
''.dol_escape_js((
string) $user->id).
'\';
681 var userconst =
'.((int) $userconstid).';
682 var yesButton = \
''.dol_escape_js($langs->transnoentities(
"Yes")).
'\';
683 var noButton = \
''.dol_escape_js($langs->transnoentities(
"No")).
'\';
684 var token = \
''.currentToken().
'\';
685 var warning = \
''.dol_escape_js($showwarning).
'\';
688 $(
"#set_" + code).click(
function() {
693 if (input.alert && input.alert.set) {
694 if (input.alert.set.yesButton) yesButton = input.alert.set.yesButton;
695 if (input.alert.set.noButton) noButton = input.alert.set.noButton;
696 confirmConstantAction(
"set", url, code, input, input.alert.set, entity, yesButton, noButton, strict, userid, token);
698 setConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, 1, userconst);
703 $(
"#del_" + code).click(
function() {
704 if (input.alert && input.alert.del) {
705 if (input.alert.del.yesButton) yesButton = input.alert.del.yesButton;
706 if (input.alert.del.noButton) noButton = input.alert.del.noButton;
707 confirmConstantAction(
"del", url, code, input, input.alert.del, entity, yesButton, noButton, strict, userid, token);
709 if (empty($setzeroinsteadofdel)) {
710 $out .= ' delConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, userconst);
';
712 $out .= ' setConstant(url, code, input, entity, 0,
'.((int) $forcereload).', userid, token, 0, userconst);
';
719 if (!empty($userconst) && $userconst instanceof User) {
720 $value = getDolUserString($code, '', $userconst);
722 $value = getDolGlobalString($code);
724 $out .= '<div
id=
"confirm_'.$code.'" title=
"" style=
"display: none;"></div>
';
725 $out .= '<span
id=
"set_'.$code.'" class=
"valignmiddle inline-block linkobject '.($value ? 'hideobject' : '').($morecss ? ' '.$morecss : '').'">
'.($revertonoff ? img_picto($langs->trans("Enabled"), 'switch_on
', '', 0, 0, 0, '', '', $marginleftonlyshort) : img_picto($langs->trans("Disabled"), 'switch_off
', '', 0, 0, 0, '', '', $marginleftonlyshort)).'</span>
';
726 $out .= '<span
id=
"del_'.$code.'" class=
"valignmiddle inline-block linkobject '.($value ? '' : 'hideobject').($morecss ? ' '.$morecss : '').'">
'.($revertonoff ? img_picto($langs->trans("Disabled"), 'switch_off
'.$suffix, '', 0, 0, 0, '', '', $marginleftonlyshort) : img_picto($langs->trans("Enabled"), 'switch_on
'.$suffix, '', 0, 0, 0, '', '', $marginleftonlyshort)).'</span>
';
750function ajax_object_onoff($object, $code, $field, $text_on, $text_off, $input = array(), $morecss = '
', $htmlname = '', $forcenojs = 0, $moreparam = '')
752 global $conf, $langs;
754 if (empty($htmlname)) {
760 if (!empty($conf->use_javascript_ajax) && empty($forcenojs)) {
763 var input =
'.json_encode($input).';
766 $(
"#set_'.$htmlname.'_'.$object->id.'").click(
function() {
767 console.log(
"Click managed by ajax_object_onoff");
768 $.get(
"'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
770 field: \''.dol_escape_js($field).
'\',
773 id: \
''.((int)
$object->id).
'\',
774 token: \
''.currentToken().
'\'
777 $(
"#set_'.$htmlname.'_'.$object->id.'").hide();
778 $(
"#del_'.$htmlname.'_'.$object->id.'").show();
780 if (input.disabled && input.disabled.length > 0) {
781 $.each(input.disabled,
function(key,value) {
782 $(
"#" + value).removeAttr(
"disabled");
783 if ($(
"#" + value).hasClass(
"butActionRefused") == true) {
784 $(
"#" + value).removeClass(
"butActionRefused");
785 $(
"#" + value).addClass(
"butAction");
789 }
else if (input.showhide && input.showhide.length > 0) {
790 $.each(input.showhide,
function(key,value) {
791 $(
"#" + value).show();
798 $(
"#del_'.$htmlname.'_'.$object->id.'").click(
function() {
799 console.log(
"Click managed by ajax_object_onoff");
800 $.get(
"'.DOL_URL_ROOT.'/core/ajax/objectonoff.php", {
802 field: \''.dol_escape_js($field).
'\',
805 id: \''.((int)
$object->id).
'\',
809 $("#del_'.$htmlname.
'_'.
$object->id.
'").hide();
810 $("#set_'.$htmlname.
'_'.
$object->id.
'").show();
811 // Disable another element
812 if (input.disabled && input.disabled.length > 0) {
813 $.each(input.disabled, function(key,value) {
814 $("#" + value).prop("disabled", true);
815 if ($("#" + value).hasClass("butAction") == true) {
816 $("#" + value).removeClass("butAction");
817 $("#" + value).addClass("butActionRefused");
820 // Hide another element
821 } else if (input.showhide && input.showhide.length > 0) {
822 $.each(input.showhide, function(key,value) {
823 $("#" + value).hide();
832 $switchon =
'switch_on';
833 $switchoff =
'switch_off';
836 $tmparray = explode(
':', $text_on);
837 if (!empty($tmparray[1])) {
838 $text_on = $tmparray[0];
839 $switchon = $tmparray[1];
840 if (!empty($tmparray[2])) {
841 $cssswitchon = $tmparray[2];
844 $tmparray = explode(
':', $text_off);
845 if (!empty($tmparray[1])) {
846 $text_off = $tmparray[0];
847 $switchoff = $tmparray[1];
848 if (!empty($tmparray[2])) {
849 $cssswitchoff = $tmparray[2];
853 if (empty(
$conf->use_javascript_ajax) || $forcenojs) {
854 $out .=
'<a id="set_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'hideobject' :
'').($morecss ?
' '.$morecss :
'').
'" href="'.DOL_URL_ROOT.
'/core/ajax/objectonoff.php?action=set&token='.
newToken().
'&id='.((int)
$object->id).
'&element='.urlencode(
$object->element).
'&field='.urlencode($field).
'&value=1&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.($moreparam ?
'&'.$moreparam :
'')).
'">'.
img_picto($langs->trans($text_off), $switchoff,
'', 0, 0, 0,
'', $cssswitchoff).
'</a>';
855 $out .=
'<a id="del_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'' :
'hideobject').($morecss ?
' '.$morecss :
'').
'" href="'.DOL_URL_ROOT.
'/core/ajax/objectonoff.php?action=set&token='.
newToken().
'&id='.((int)
$object->id).
'&element='.urlencode(
$object->element).
'&field='.urlencode($field).
'&value=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.($moreparam ?
'&'.$moreparam :
'')).
'">'.
img_picto($langs->trans($text_on), $switchon,
'', 0, 0, 0,
'', $cssswitchon).
'</a>';
857 $out .=
'<span id="set_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'hideobject' :
'').($morecss ?
' '.$morecss :
'').
'">'.
img_picto($langs->trans($text_off), $switchoff,
'', 0, 0, 0,
'', $cssswitchoff).
'</span>';
858 $out .=
'<span id="del_'.$htmlname.
'_'.
$object->id.
'" class="linkobject '.(
$object->$code == 1 ?
'' :
'hideobject').($morecss ?
' '.$morecss :
'').
'">'.
img_picto($langs->trans($text_on), $switchon,
'', 0, 0, 0,
'', $cssswitchon).
'</span>';
ajax_autocompleter($selected, $htmlname, $url, $urloption='', $minLength=2, $autoselect=0, $ajaxoptions=array(), $moreparams='')
Generic function that return javascript to add to transform a common input text or select field into ...
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
ajax_multiautocompleter($htmlname, $fields, $url, $option='', $minLength=2, $autoselect=0)
Generic function that return javascript to add to a page to transform a common input text field into ...
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)