dolibarr 18.0.6
html.formother.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 2002-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
5 * Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
6 * Copyright (C) 2004 Eric Seigne <eric.seigne@ryxeo.com>
7 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
8 * Copyright (C) 2006 Andre Cianfarani <acianfa@free.fr>
9 * Copyright (C) 2006 Marc Barilley/Ocebo <marc@ocebo.com>
10 * Copyright (C) 2007 Franky Van Liedekerke <franky.van.liedekerker@telenet.be>
11 * Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
12 * Copyright (C) 2019 Thibault FOUCART <support@ptibogxiv.net>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
40{
41 private $db;
42
46 public $error;
47
48
54 public function __construct($db)
55 {
56 $this->db = $db;
57 }
58
67 public function getHTMLScannerForm($jstoexecuteonadd = 'barcodescannerjs', $mode = 'all')
68 {
69 global $langs;
70
71 $out = '';
72
73 $out .= '<!-- Popup for mass barcode scanning -->'."\n";
74 $out .= '<div class="div-for-modal-topright" style="padding: 15px">';
75 $out .= '<center>'.img_picto('', 'barcode', 'class="pictofixedwidth"').'<strong>Barcode scanner tool...</strong></center><br>';
76
77 if ($mode == 'product') {
78 $out .= '<input type="hidden" name="barcodemode" value="barcodeforproduct" id="barcodeforproduct">';
79 } elseif ($mode == 'lot') {
80 $out .= '<input type="hidden" name="barcodemode" value="barcodeforlotserial" id="barcodeforlotserial">';
81 } else { // $mode = 'all'
82 $out .= '<input type="radio" name="barcodemode" value="barcodeforautodetect" id="barcodeforautodetect" checked="checked"> <label for="barcodeforautodetect">Autodetect if we scan a product barcode or a lot/serial barcode</label><br>';
83 $out .= '<input type="radio" name="barcodemode" value="barcodeforproduct" id="barcodeforproduct"> <label for="barcodeforproduct">Scan a product barcode</label><br>';
84 $out .= '<input type="radio" name="barcodemode" value="barcodeforlotserial" id="barcodeforlotserial"> <label for="barcodeforlotserial">Scan a product lot or serial number</label><br>';
85 }
86 $stringaddbarcode = $langs->trans("QtyToAddAfterBarcodeScan", "tmphtml");
87 $htmltoreplaceby = '<select name="selectaddorreplace"><option selected value="add">'.$langs->trans("Add").'</option><option value="replace">'.$langs->trans("ToReplace").'</option></select>';
88 $stringaddbarcode = str_replace("tmphtml", $htmltoreplaceby, $stringaddbarcode);
89 $out .= $stringaddbarcode.' <input type="text" name="barcodeproductqty" class="width50 right" value="1"><br>';
90 $out .= '<br>';
91 $out .= '<textarea type="text" name="barcodelist" class="centpercent" autofocus rows="'.ROWS_3.'" placeholder="'.dol_escape_htmltag($langs->trans("ScanOrTypeOrCopyPasteYourBarCodes")).'"></textarea>';
92
93 /*print '<br>'.$langs->trans("or").'<br>';
94
95 print '<br>';
96
97 print '<input type="text" name="barcodelotserial" class="width200"> &nbsp; &nbsp; Qty <input type="text" name="barcodelotserialqty" class="width50 right" value="1"><br>';
98 */
99 $out .= '<br>';
100 $out .= '<center>';
101 $out .= '<input type="submit" class="button marginleftonly marginrightonly" id ="exec'.dol_escape_js($jstoexecuteonadd).'" name="addscan" value="'.dol_escape_htmltag($langs->trans("Add")).'">';
102 $out .= '<input type="submit" class="button marginleftonly marginrightonly" name="cancel" value="'.dol_escape_htmltag($langs->trans("CloseWindow")).'">';
103 $out .= '</center>';
104 $out .= '<br>';
105 $out .= '<div type="text" id="scantoolmessage" class="scantoolmessage ok nopadding"></div>';
106
107 $out .= '<script nonce="'.getNonce().'">';
108 $out .= 'jQuery("#barcodeforautodetect, #barcodeforproduct, #barcodeforlotserial").click(function(){';
109 $out .= 'console.log("select choice");';
110 $out .= 'jQuery("#scantoolmessage").text("");';
111 $out .= '});'."\n";
112 $out .= '$("#exec'.dol_escape_js($jstoexecuteonadd).'").click(function(){
113 console.log("We call js to execute \''.dol_escape_js($jstoexecuteonadd).'\'");
114 '.dol_escape_js($jstoexecuteonadd).'();
115 return false; /* We want to stay on the scan tool */
116 })';
117 $out .= '</script>';
118
119 $out .= '</center>';
120 $out .= '</div>';
121
122 return $out;
123 }
124
125 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
136 public function select_export_model($selected = '', $htmlname = 'exportmodelid', $type = '', $useempty = 0, $fk_user = null)
137 {
138 // phpcs:enable
139 global $conf, $langs, $user;
140
141 $sql = "SELECT rowid, label, fk_user";
142 $sql .= " FROM ".$this->db->prefix()."export_model";
143 $sql .= " WHERE type = '".$this->db->escape($type)."'";
144 if (empty($conf->global->EXPORTS_SHARE_MODELS)) { // EXPORTS_SHARE_MODELS means all templates are visible, whatever is owner.
145 $sql .= " AND fk_user IN (0, ".((int) $fk_user).")";
146 }
147 $sql .= " ORDER BY label";
148 $result = $this->db->query($sql);
149 if ($result) {
150 print '<select class="flat minwidth200" name="'.$htmlname.'" id="'.$htmlname.'">';
151 if ($useempty) {
152 print '<option value="-1">&nbsp;</option>';
153 }
154
155 $tmpuser = new User($this->db);
156
157 $num = $this->db->num_rows($result);
158 $i = 0;
159 while ($i < $num) {
160 $obj = $this->db->fetch_object($result);
161
162 $label = $obj->label;
163 if ($obj->fk_user == 0) {
164 $label .= ' <span class="opacitymedium">('.$langs->trans("Everybody").')</span>';
165 } elseif ($obj->fk_user > 0) {
166 $tmpuser->fetch($obj->fk_user);
167 $label .= ' <span class="opacitymedium">('.$tmpuser->getFullName($langs).')</span>';
168 }
169
170 if ($selected == $obj->rowid) {
171 print '<option value="'.$obj->rowid.'" selected data-html="'.dol_escape_htmltag($label).'">';
172 } else {
173 print '<option value="'.$obj->rowid.'" data-html="'.dol_escape_htmltag($label).'">';
174 }
175 print $label;
176 print '</option>';
177 $i++;
178 }
179 print "</select>";
180 print ajax_combobox($htmlname);
181 } else {
182 dol_print_error($this->db);
183 }
184 }
185
186
187 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
198 public function select_import_model($selected = '', $htmlname = 'importmodelid', $type = '', $useempty = 0, $fk_user = null)
199 {
200 // phpcs:enable
201 global $conf, $langs, $user;
202
203 $sql = "SELECT rowid, label, fk_user";
204 $sql .= " FROM ".$this->db->prefix()."import_model";
205 $sql .= " WHERE type = '".$this->db->escape($type)."'";
206 if (empty($conf->global->EXPORTS_SHARE_MODELS)) { // EXPORTS_SHARE_MODELS means all templates are visible, whatever is owner.
207 $sql .= " AND fk_user IN (0, ".((int) $fk_user).")";
208 }
209 $sql .= " ORDER BY label";
210 $result = $this->db->query($sql);
211 if ($result) {
212 print '<select class="flat minwidth200" name="'.$htmlname.'" id="'.$htmlname.'">';
213 if ($useempty) {
214 print '<option value="-1">&nbsp;</option>';
215 }
216
217 $tmpuser = new User($this->db);
218
219 $num = $this->db->num_rows($result);
220 $i = 0;
221 while ($i < $num) {
222 $obj = $this->db->fetch_object($result);
223
224 $label = $obj->label;
225 if ($obj->fk_user == 0) {
226 $label .= ' <span class="opacitymedium">('.$langs->trans("Everybody").')</span>';
227 } elseif ($obj->fk_user > 0) {
228 $tmpuser->fetch($obj->fk_user);
229 $label .= ' <span class="opacitymedium">('.$tmpuser->getFullName($langs).')</span>';
230 }
231
232 if ($selected == $obj->rowid) {
233 print '<option value="'.$obj->rowid.'" selected data-html="'.dol_escape_htmltag($label).'">';
234 } else {
235 print '<option value="'.$obj->rowid.'" data-html="'.dol_escape_htmltag($label).'">';
236 }
237 print $label;
238 print '</option>';
239 $i++;
240 }
241 print "</select>";
242 print ajax_combobox($htmlname);
243 } else {
244 dol_print_error($this->db);
245 }
246 }
247
248
249 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
257 public function select_ecotaxes($selected = '', $htmlname = 'ecotaxe_id')
258 {
259 // phpcs:enable
260 global $langs;
261
262 $sql = "SELECT e.rowid, e.code, e.label, e.price, e.organization,";
263 $sql .= " c.label as country";
264 $sql .= " FROM ".$this->db->prefix()."c_ecotaxe as e,".$this->db->prefix()."c_country as c";
265 $sql .= " WHERE e.active = 1 AND e.fk_pays = c.rowid";
266 $sql .= " ORDER BY country, e.organization ASC, e.code ASC";
267
268 dol_syslog(get_class($this).'::select_ecotaxes', LOG_DEBUG);
269 $resql = $this->db->query($sql);
270 if ($resql) {
271 print '<select class="flat" name="'.$htmlname.'">';
272 $num = $this->db->num_rows($resql);
273 $i = 0;
274 print '<option value="-1">&nbsp;</option>'."\n";
275 if ($num) {
276 while ($i < $num) {
277 $obj = $this->db->fetch_object($resql);
278 if ($selected && $selected == $obj->rowid) {
279 print '<option value="'.$obj->rowid.'" selected>';
280 } else {
281 print '<option value="'.$obj->rowid.'">';
282 //print '<option onmouseover="showtip(\''.$obj->label.'\')" onMouseout="hidetip()" value="'.$obj->rowid.'">';
283 }
284 $selectOptionValue = $obj->code.' - '.$obj->label.' : '.price($obj->price).' '.$langs->trans("HT").' ('.$obj->organization.')';
285 print $selectOptionValue;
286 print '</option>';
287 $i++;
288 }
289 }
290 print '</select>';
291 return 0;
292 } else {
293 dol_print_error($this->db);
294 return 1;
295 }
296 }
297
298
299 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
308 public function select_revenue_stamp($selected = '', $htmlname = 'revenuestamp', $country_code = '')
309 {
310 // phpcs:enable
311 global $langs;
312
313 $out = '';
314
315 $sql = "SELECT r.taux, r.revenuestamp_type";
316 $sql .= " FROM ".$this->db->prefix()."c_revenuestamp as r,".$this->db->prefix()."c_country as c";
317 $sql .= " WHERE r.active = 1 AND r.fk_pays = c.rowid";
318 $sql .= " AND c.code = '".$this->db->escape($country_code)."'";
319
320 dol_syslog(get_class($this).'::select_revenue_stamp', LOG_DEBUG);
321 $resql = $this->db->query($sql);
322 if ($resql) {
323 $out .= '<select class="flat" name="'.$htmlname.'">';
324 $num = $this->db->num_rows($resql);
325 $i = 0;
326 $out .= '<option value="0">&nbsp;</option>'."\n";
327 if ($num) {
328 while ($i < $num) {
329 $obj = $this->db->fetch_object($resql);
330 if (($selected && $selected == $obj->taux) || $num == 1) {
331 $out .= '<option value="'.$obj->taux.($obj->revenuestamp_type == 'percent' ? '%' : '').'"'.($obj->revenuestamp_type == 'percent' ? ' data-type="percent"' : '').' selected>';
332 } else {
333 $out .= '<option value="'.$obj->taux.($obj->revenuestamp_type == 'percent' ? '%' : '').'"'.($obj->revenuestamp_type == 'percent' ? ' data-type="percent"' : '').'>';
334 //print '<option onmouseover="showtip(\''.$obj->libelle.'\')" onMouseout="hidetip()" value="'.$obj->rowid.'">';
335 }
336 $out .= $obj->taux.($obj->revenuestamp_type == 'percent' ? '%' : '');
337 $out .= '</option>';
338 $i++;
339 }
340 }
341 $out .= '</select>';
342 return $out;
343 } else {
344 dol_print_error($this->db);
345 return '';
346 }
347 }
348
349
350 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
363 public function select_percent($selected = 0, $htmlname = 'percent', $disabled = 0, $increment = 5, $start = 0, $end = 100, $showempty = 0)
364 {
365 // phpcs:enable
366 $return = '<select class="flat maxwidth75" name="'.$htmlname.'" '.($disabled ? 'disabled' : '').'>';
367 if ($showempty) {
368 $return .= '<option value="-1"'.(($selected == -1 || $selected == '') ? ' selected' : '').'>&nbsp;</option>';
369 }
370
371 for ($i = $start; $i <= $end; $i += $increment) {
372 if ($selected != '' && (int) $selected == $i) {
373 $return .= '<option value="'.$i.'" selected>';
374 } else {
375 $return .= '<option value="'.$i.'">';
376 }
377 $return .= $i.' % ';
378 $return .= '</option>';
379 }
380
381 $return .= '</select>';
382
383 return $return;
384 }
385
386 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
399 public function select_categories($type, $selected = 0, $htmlname = 'search_categ', $nocateg = 0, $showempty = 1, $morecss = '')
400 {
401 // phpcs:enable
402 global $conf, $langs;
403 require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
404
405 // For backward compatibility
406 if (is_numeric($type)) {
407 dol_syslog(__METHOD__.': using numeric value for parameter type is deprecated. Use string code instead.', LOG_WARNING);
408 }
409
410 // Load list of "categories"
411 $static_categs = new Categorie($this->db);
412 $tab_categs = $static_categs->get_full_arbo($type);
413
414 $moreforfilter = '';
415
416 // Print a select with each of them
417 $moreforfilter .= '<select class="flat minwidth100'.($morecss ? ' '.$morecss : '').'" id="select_categ_'.$htmlname.'" name="'.$htmlname.'">';
418 if ($showempty) {
419 $textforempty = ' ';
420 if (!empty($conf->use_javascript_ajax)) {
421 $textforempty = '&nbsp;'; // If we use ajaxcombo, we need &nbsp; here to avoid to have an empty element that is too small.
422 }
423 if (!is_numeric($showempty)) {
424 $textforempty = $showempty;
425 }
426 $moreforfilter .= '<option class="optiongrey" value="'.($showempty < 0 ? $showempty : -1).'"'.($selected == $showempty ? ' selected' : '');
427 //$moreforfilter .= ' data-html="'.dol_escape_htmltag($textforempty).'"';
428 $moreforfilter .= '>'.dol_escape_htmltag($textforempty).'</option>'."\n";
429 }
430
431 if (is_array($tab_categs)) {
432 foreach ($tab_categs as $categ) {
433 $moreforfilter .= '<option value="'.$categ['id'].'"';
434 if ($categ['id'] == $selected) {
435 $moreforfilter .= ' selected';
436 }
437 $moreforfilter .= ' data-html="'.dol_escape_htmltag(img_picto('', 'category', 'class="pictofixedwidth" style="color: #'.$categ['color'].'"').dol_trunc($categ['fulllabel'], 50, 'middle')).'"';
438 $moreforfilter .= '>'.dol_trunc($categ['fulllabel'], 50, 'middle').'</option>';
439 }
440 }
441 if ($nocateg) {
442 $langs->load("categories");
443 $moreforfilter .= '<option value="-2"'.($selected == -2 ? ' selected' : '').'>- '.$langs->trans("NotCategorized").' -</option>';
444 }
445 $moreforfilter .= '</select>';
446
447 // Enhance with select2
448 if ($conf->use_javascript_ajax) {
449 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
450 $comboenhancement = ajax_combobox('select_categ_'.$htmlname);
451 $moreforfilter .= $comboenhancement;
452 }
453
454 return $moreforfilter;
455 }
456
457
458 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
471 public function select_salesrepresentatives($selected, $htmlname, $user, $showstatus = 0, $showempty = 1, $morecss = '', $norepresentative = 0)
472 {
473 // phpcs:enable
474 global $conf, $langs, $hookmanager;
475
476 $langs->load('users');
477
478 $out = '';
479
480 $reshook = $hookmanager->executeHooks('addSQLWhereFilterOnSelectSalesRep', array(), $this, $action);
481
482 // Select each sales and print them in a select input
483 $out .= '<select class="flat'.($morecss ? ' '.$morecss : '').'" id="'.$htmlname.'" name="'.$htmlname.'">';
484 if ($showempty) {
485 $textforempty = ' ';
486 if (!is_numeric($showempty)) {
487 $textforempty = $showempty;
488 }
489 if (!empty($conf->use_javascript_ajax) && $textforempty == ' ') {
490 $textforempty = '&nbsp;'; // If we use ajaxcombo, we need &nbsp; here to avoid to have an empty element that is too small.
491 }
492 $out .= '<option class="optiongrey" value="'.($showempty < 0 ? $showempty : -1).'"'.($selected == $showempty ? ' selected' : '').'>'.$textforempty.'</option>'."\n";
493 }
494
495 // Get list of users allowed to be viewed
496 $sql_usr = "SELECT u.rowid, u.lastname, u.firstname, u.statut as status, u.login, u.photo, u.gender, u.entity, u.admin";
497 $sql_usr .= " FROM ".$this->db->prefix()."user as u";
498
499 if (!empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
500 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
501 $sql_usr .= " WHERE u.entity IS NOT NULL"; // Show all users
502 } else {
503 $sql_usr .= " WHERE EXISTS (SELECT ug.fk_user FROM ".$this->db->prefix()."usergroup_user as ug WHERE u.rowid = ug.fk_user AND ug.entity IN (".getEntity('usergroup')."))";
504 $sql_usr .= " OR u.entity = 0"; // Show always superadmin
505 }
506 } else {
507 $sql_usr .= " WHERE u.entity IN (".getEntity('user').")";
508 }
509
510 if (empty($user->rights->user->user->lire)) {
511 $sql_usr .= " AND u.rowid = ".((int) $user->id);
512 }
513 if (!empty($user->socid)) {
514 $sql_usr .= " AND u.fk_soc = ".((int) $user->socid);
515 }
516
517 //Add hook to filter on user (for exemple on usergroup define in custom modules)
518 if (!empty($reshook)) {
519 $sql_usr .= $hookmanager->resArray[0];
520 }
521
522 // Add existing sales representatives of thirdparty of external user
523 if (empty($user->rights->user->user->lire) && $user->socid) {
524 $sql_usr .= " UNION ";
525 $sql_usr .= "SELECT u2.rowid, u2.lastname, u2.firstname, u2.statut as status, u2.login, u2.photo, u2.gender, u2.entity, u2.admin";
526 $sql_usr .= " FROM ".$this->db->prefix()."user as u2, ".$this->db->prefix()."societe_commerciaux as sc";
527
528 if (!empty($conf->global->MULTICOMPANY_TRANSVERSE_MODE)) {
529 if (!empty($user->admin) && empty($user->entity) && $conf->entity == 1) {
530 $sql_usr .= " WHERE u2.entity IS NOT NULL"; // Show all users
531 } else {
532 $sql_usr .= " WHERE EXISTS (SELECT ug2.fk_user FROM ".$this->db->prefix()."usergroup_user as ug2 WHERE u2.rowid = ug2.fk_user AND ug2.entity IN (".getEntity('usergroup')."))";
533 }
534 } else {
535 $sql_usr .= " WHERE u2.entity IN (".getEntity('user').")";
536 }
537
538 $sql_usr .= " AND u2.rowid = sc.fk_user AND sc.fk_soc = ".((int) $user->socid);
539
540 //Add hook to filter on user (for exemple on usergroup define in custom modules)
541 if (!empty($reshook)) {
542 $sql_usr .= $hookmanager->resArray[1];
543 }
544 }
545
546 if (empty($conf->global->MAIN_FIRSTNAME_NAME_POSITION)) { // MAIN_FIRSTNAME_NAME_POSITION is 0 means firstname+lastname
547 $sql_usr .= " ORDER BY status DESC, firstname ASC, lastname ASC";
548 } else {
549 $sql_usr .= " ORDER BY status DESC, lastname ASC, firstname ASC";
550 }
551 //print $sql_usr;exit;
552
553 $resql_usr = $this->db->query($sql_usr);
554 if ($resql_usr) {
555 $userstatic = new User($this->db);
556
557 while ($obj_usr = $this->db->fetch_object($resql_usr)) {
558 $userstatic->id = $obj_usr->rowid;
559 $userstatic->lastname = $obj_usr->lastname;
560 $userstatic->firstname = $obj_usr->firstname;
561 $userstatic->photo = $obj_usr->photo;
562 $userstatic->statut = $obj_usr->status;
563 $userstatic->entity = $obj_usr->entity;
564 $userstatic->admin = $obj_usr->admin;
565
566 $labeltoshow = dolGetFirstLastname($obj_usr->firstname, $obj_usr->lastname);
567 if (empty($obj_usr->firstname) && empty($obj_usr->lastname)) {
568 $labeltoshow = $obj_usr->login;
569 }
570
571 $out .= '<option value="'.$obj_usr->rowid.'"';
572 if ($obj_usr->rowid == $selected) {
573 $out .= ' selected';
574 }
575 $out .= ' data-html="';
576 $outhtml = $userstatic->getNomUrl(-3, '', 0, 1, 24, 1, 'login', '', 1).' ';
577 if ($showstatus >= 0 && $obj_usr->status == 0) {
578 $outhtml .= '<strike class="opacitymediumxxx">';
579 }
580 $outhtml .= $labeltoshow;
581 if ($showstatus >= 0 && $obj_usr->status == 0) {
582 $outhtml .= '</strike>';
583 }
584 $out .= dol_escape_htmltag($outhtml);
585 $out .= '">';
586
587 $out .= $labeltoshow;
588 // Complete name with more info
589 $moreinfo = 0;
590 if (!empty($conf->global->MAIN_SHOW_LOGIN)) {
591 $out .= ($moreinfo ? ' - ' : ' (').$obj_usr->login;
592 $moreinfo++;
593 }
594 if ($showstatus >= 0) {
595 if ($obj_usr->status == 1 && $showstatus == 1) {
596 $out .= ($moreinfo ? ' - ' : ' (').$langs->trans('Enabled');
597 $moreinfo++;
598 }
599 if ($obj_usr->status == 0) {
600 $out .= ($moreinfo ? ' - ' : ' (').$langs->trans('Disabled');
601 $moreinfo++;
602 }
603 }
604 $out .= ($moreinfo ? ')' : '');
605 $out .= '</option>';
606 }
607 $this->db->free($resql_usr);
608 } else {
609 dol_print_error($this->db);
610 }
611
612 if ($norepresentative) {
613 $langs->load("companies");
614 $out .= '<option value="-2"'.($selected == -2 ? ' selected' : '').'>- '.$langs->trans("NoSalesRepresentativeAffected").' -</option>';
615 }
616
617 $out .= '</select>';
618
619 // Enhance with select2
620 if ($conf->use_javascript_ajax) {
621 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
622
623 $comboenhancement = ajax_combobox($htmlname);
624 if ($comboenhancement) {
625 $out .= $comboenhancement;
626 }
627 }
628
629 return $out;
630 }
631
647 public function selectProjectTasks($selectedtask = '', $projectid = 0, $htmlname = 'task_parent', $modeproject = 0, $modetask = 0, $mode = 0, $useempty = 0, $disablechildoftaskid = 0, $filteronprojstatus = '', $morecss = '')
648 {
649 global $user, $langs;
650
651 require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
652
653 //print $modeproject.'-'.$modetask;
654 $task = new Task($this->db);
655 $tasksarray = $task->getTasksArray($modetask ? $user : 0, $modeproject ? $user : 0, $projectid, 0, $mode, '', $filteronprojstatus);
656 if ($tasksarray) {
657 print '<select class="flat'.($morecss ? ' '.$morecss : '').'" name="'.$htmlname.'" id="'.$htmlname.'">';
658 if ($useempty) {
659 print '<option value="0">&nbsp;</option>';
660 }
661 $j = 0;
662 $level = 0;
663 $this->_pLineSelect($j, 0, $tasksarray, $level, $selectedtask, $projectid, $disablechildoftaskid);
664 print '</select>';
665
666 print ajax_combobox($htmlname);
667 } else {
668 print '<div class="warning">'.$langs->trans("NoProject").'</div>';
669 }
670 }
671
684 private function _pLineSelect(&$inc, $parent, $lines, $level = 0, $selectedtask = 0, $selectedproject = 0, $disablechildoftaskid = 0)
685 {
686 global $langs, $user, $conf;
687
688 $lastprojectid = 0;
689
690 $numlines = count($lines);
691 for ($i = 0; $i < $numlines; $i++) {
692 if ($lines[$i]->fk_task_parent == $parent) {
693 //var_dump($selectedproject."--".$selectedtask."--".$lines[$i]->fk_project."_".$lines[$i]->id); // $lines[$i]->id may be empty if project has no lines
694
695 // Break on a new project
696 if ($parent == 0) { // We are on a task at first level
697 if ($lines[$i]->fk_project != $lastprojectid) { // Break found on project
698 if ($i > 0) {
699 print '<option value="0" disabled>----------</option>';
700 }
701 print '<option value="'.$lines[$i]->fk_project.'_0"';
702 if ($selectedproject == $lines[$i]->fk_project) {
703 print ' selected';
704 }
705
706 $labeltoshow = $lines[$i]->projectref;
707 //$labeltoshow .= ' '.$lines[$i]->projectlabel;
708 if (empty($lines[$i]->public)) {
709 //$labeltoshow .= ' <span class="opacitymedium">('.$langs->trans("Visibility").': '.$langs->trans("PrivateProject").')</span>';
710 $labeltoshow = img_picto($lines[$i]->projectlabel, 'project', 'class="pictofixedwidth"').$labeltoshow;
711 } else {
712 //$labeltoshow .= ' <span class="opacitymedium">('.$langs->trans("Visibility").': '.$langs->trans("SharedProject").')</span>';
713 $labeltoshow = img_picto($lines[$i]->projectlabel, 'projectpub', 'class="pictofixedwidth"').$labeltoshow;
714 }
715
716 print ' data-html="'.dol_escape_htmltag($labeltoshow).'"';
717 print '>'; // Project -> Task
718 print $labeltoshow;
719 print "</option>\n";
720
721 $lastprojectid = $lines[$i]->fk_project;
722 $inc++;
723 }
724 }
725
726 $newdisablechildoftaskid = $disablechildoftaskid;
727
728 // Print task
729 if (isset($lines[$i]->id)) { // We use isset because $lines[$i]->id may be null if project has no task and are on root project (tasks may be caught by a left join). We enter here only if '0' or >0
730 // Check if we must disable entry
731 $disabled = 0;
732 if ($disablechildoftaskid && (($lines[$i]->id == $disablechildoftaskid || $lines[$i]->fk_task_parent == $disablechildoftaskid))) {
733 $disabled++;
734 if ($lines[$i]->fk_task_parent == $disablechildoftaskid) {
735 $newdisablechildoftaskid = $lines[$i]->id; // If task is child of a disabled parent, we will propagate id to disable next child too
736 }
737 }
738
739 print '<option value="'.$lines[$i]->fk_project.'_'.$lines[$i]->id.'"';
740 if (($lines[$i]->id == $selectedtask) || ($lines[$i]->fk_project.'_'.$lines[$i]->id == $selectedtask)) {
741 print ' selected';
742 }
743 if ($disabled) {
744 print ' disabled';
745 }
746
747 $labeltoshow = $lines[$i]->projectref;
748 //$labeltoshow .= ' '.$lines[$i]->projectlabel;
749 if (empty($lines[$i]->public)) {
750 //$labeltoshow .= ' <span class="opacitymedium">('.$langs->trans("Visibility").': '.$langs->trans("PrivateProject").')</span>';
751 $labeltoshow = img_picto($lines[$i]->projectlabel, 'project', 'class="pictofixedwidth"').$labeltoshow;
752 } else {
753 //$labeltoshow .= ' <span class="opacitymedium">('.$langs->trans("Visibility").': '.$langs->trans("SharedProject").')</span>';
754 $labeltoshow = img_picto($lines[$i]->projectlabel, 'projectpub', 'class="pictofixedwidth"').$labeltoshow;
755 }
756 if ($lines[$i]->id) {
757 $labeltoshow .= ' > ';
758 }
759 for ($k = 0; $k < $level; $k++) {
760 $labeltoshow .= "&nbsp;&nbsp;&nbsp;";
761 }
762 $labeltoshow .= $lines[$i]->ref.' '.$lines[$i]->label;
763
764 print ' data-html="'.dol_escape_htmltag($labeltoshow).'"';
765 print '>';
766 print $labeltoshow;
767 print "</option>\n";
768 $inc++;
769 }
770
771 $level++;
772 if ($lines[$i]->id) {
773 $this->_pLineSelect($inc, $lines[$i]->id, $lines, $level, $selectedtask, $selectedproject, $newdisablechildoftaskid);
774 }
775 $level--;
776 }
777 }
778 }
779
780
789 public static function showColor($color, $textifnotdefined = '')
790 {
791 $textcolor = 'FFF';
792 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
793 if (colorIsLight($color)) {
794 $textcolor = '000';
795 }
796
797 $color = colorArrayToHex(colorStringToArray($color, array()), '');
798
799 if ($color) {
800 return '<input type="text" class="colorthumb" disabled style="padding: 1px; margin-top: 0; margin-bottom: 0; color: #'.$textcolor.'; background-color: #'.$color.'" value="'.$color.'">';
801 } else {
802 return $textifnotdefined;
803 }
804 }
805
806 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
819 public function select_color($set_color = '', $prefix = 'f_color', $form_name = '', $showcolorbox = 1, $arrayofcolors = '')
820 {
821 // phpcs:enable
822 print $this->selectColor($set_color, $prefix, $form_name, $showcolorbox, $arrayofcolors);
823 }
824
838 public static function selectColor($set_color = '', $prefix = 'f_color', $form_name = '', $showcolorbox = 1, $arrayofcolors = '', $morecss = '', $setpropertyonselect = '')
839 {
840 // Deprecation warning
841 if ($form_name) {
842 dol_syslog(__METHOD__.": form_name parameter is deprecated", LOG_WARNING);
843 }
844
845 global $langs, $conf;
846
847 $out = '';
848
849 if (!is_array($arrayofcolors) || count($arrayofcolors) < 1) {
850 $langs->load("other");
851 if (empty($conf->dol_use_jmobile) && !empty($conf->use_javascript_ajax)) {
852 $out .= '<link rel="stylesheet" media="screen" type="text/css" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/jpicker/css/jPicker-1.1.6.css" />';
853 $out .= '<script nonce="'.getNonce().'" type="text/javascript" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/jpicker/jpicker-1.1.6.js"></script>';
854 $out .= '<script nonce="'.getNonce().'" type="text/javascript">
855 jQuery(document).ready(function(){
856 var originalhex = null;
857 $(\'#colorpicker'.$prefix.'\').jPicker( {
858 window: {
859 title: \''.dol_escape_js($langs->trans("SelectAColor")).'\', /* any title for the jPicker window itself - displays "Drag Markers To Pick A Color" if left null */
860 effects:
861 {
862 type: \'show\', /* effect used to show/hide an expandable picker. Acceptable values "slide", "show", "fade" */
863 speed:
864 {
865 show: \'fast\', /* duration of "show" effect. Acceptable values are "fast", "slow", or time in ms */
866 hide: \'fast\' /* duration of "hide" effect. Acceptable values are "fast", "slow", or time in ms */
867 }
868 },
869 position:
870 {
871 x: \'screenCenter\', /* acceptable values "left", "center", "right", "screenCenter", or relative px value */
872 y: \'center\' /* acceptable values "top", "bottom", "center", or relative px value */
873 },
874 },
875 images: {
876 clientPath: \''.DOL_URL_ROOT.'/includes/jquery/plugins/jpicker/images/\',
877 picker: { file: \'../../../../../theme/common/colorpicker.png\', width: 14, height: 14 }
878 },
879 localization: // alter these to change the text presented by the picker (e.g. different language)
880 {
881 text:
882 {
883 title: \''.dol_escape_js($langs->trans("SelectAColor")).'\',
884 newColor: \''.dol_escape_js($langs->trans("New")).'\',
885 currentColor: \''.dol_escape_js($langs->trans("Current")).'\',
886 ok: \''.dol_escape_js($langs->trans("Validate")).'\',
887 cancel: \''.dol_escape_js($langs->trans("Cancel")).'\'
888 }
889 }
890 },
891 function(color, context) { console.log("close color selector"); },
892 function(color, context) { var hex = color.val(\'hex\'); console.log("new color selected in jpicker "+hex+" setpropertyonselect='.dol_escape_js($setpropertyonselect).'");';
893 if ($setpropertyonselect) {
894 $out .= 'if (originalhex == null) {';
895 $out .= ' originalhex = getComputedStyle(document.querySelector(":root")).getPropertyValue(\'--'.dol_escape_js($setpropertyonselect).'\');';
896 $out .= ' console.log("original color is saved into originalhex = "+originalhex);';
897 $out .= '}';
898 $out .= 'if (hex != null) {';
899 $out .= ' document.documentElement.style.setProperty(\'--'.dol_escape_js($setpropertyonselect).'\', \'#\'+hex);';
900 $out .= '}';
901 }
902 $out .= '},
903 function(color, context) {
904 console.log("cancel selection of color");';
905 if ($setpropertyonselect) {
906 $out .= 'if (originalhex != null) {
907 console.log("Restore old color "+originalhex);
908 document.documentElement.style.setProperty(\'--'.dol_escape_js($setpropertyonselect).'\', originalhex);
909 }';
910 }
911 $out .= '
912 }
913 );
914 });
915 </script>';
916 }
917 $out .= '<input id="colorpicker'.$prefix.'" name="'.$prefix.'" size="6" maxlength="7" class="flat'.($morecss ? ' '.$morecss : '').'" type="text" value="'.dol_escape_htmltag($set_color).'" />';
918 } else { // In most cases, this is not used. We used instead function with no specific list of colors
919 if (empty($conf->dol_use_jmobile) && !empty($conf->use_javascript_ajax)) {
920 $out .= '<link rel="stylesheet" href="'.DOL_URL_ROOT.'/includes/jquery/plugins/colorpicker/jquery.colorpicker.css" type="text/css" media="screen" />';
921 $out .= '<script nonce="'.getNonce().'" src="'.DOL_URL_ROOT.'/includes/jquery/plugins/colorpicker/jquery.colorpicker.js" type="text/javascript"></script>';
922 $out .= '<script nonce="'.getNonce().'" type="text/javascript">
923 jQuery(document).ready(function(){
924 jQuery(\'#colorpicker'.$prefix.'\').colorpicker({
925 size: 14,
926 label: \'\',
927 hide: true
928 });
929 });
930 </script>';
931 }
932 $out .= '<select id="colorpicker'.$prefix.'" class="flat'.($morecss ? ' '.$morecss : '').'" name="'.$prefix.'">';
933 //print '<option value="-1">&nbsp;</option>';
934 foreach ($arrayofcolors as $val) {
935 $out .= '<option value="'.$val.'"';
936 if ($set_color == $val) {
937 $out .= ' selected';
938 }
939 $out .= '>'.$val.'</option>';
940 }
941 $out .= '</select>';
942 }
943
944 return $out;
945 }
946
947 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
958 public function CreateColorIcon($color, $module, $name, $x = '12', $y = '12')
959 {
960 // phpcs:enable
961 global $conf;
962
963 $file = $conf->$module->dir_temp.'/'.$name.'.png';
964
965 // On cree le repertoire contenant les icones
966 if (!file_exists($conf->$module->dir_temp)) {
967 dol_mkdir($conf->$module->dir_temp);
968 }
969
970 // On cree l'image en vraies couleurs
971 $image = imagecreatetruecolor($x, $y);
972
973 $color = substr($color, 1, 6);
974
975 $rouge = hexdec(substr($color, 0, 2)); //conversion du canal rouge
976 $vert = hexdec(substr($color, 2, 2)); //conversion du canal vert
977 $bleu = hexdec(substr($color, 4, 2)); //conversion du canal bleu
978
979 $couleur = imagecolorallocate($image, $rouge, $vert, $bleu);
980 //print $rouge.$vert.$bleu;
981 imagefill($image, 0, 0, $couleur); //on remplit l'image
982 // On cree la couleur et on l'attribue a une variable pour ne pas la perdre
983 ImagePng($image, $file); //renvoie une image sous format png
984 ImageDestroy($image);
985 }
986
987 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
996 public function select_dayofweek($selected = '', $htmlname = 'weekid', $useempty = 0)
997 {
998 // phpcs:enable
999 global $langs;
1000
1001 $week = array(
1002 0=>$langs->trans("Day0"),
1003 1=>$langs->trans("Day1"),
1004 2=>$langs->trans("Day2"),
1005 3=>$langs->trans("Day3"),
1006 4=>$langs->trans("Day4"),
1007 5=>$langs->trans("Day5"),
1008 6=>$langs->trans("Day6")
1009 );
1010
1011 $select_week = '<select class="flat" name="'.$htmlname.'" id="'.$htmlname.'">';
1012 if ($useempty) {
1013 $select_week .= '<option value="-1">&nbsp;</option>';
1014 }
1015 foreach ($week as $key => $val) {
1016 if ($selected == $key) {
1017 $select_week .= '<option value="'.$key.'" selected>';
1018 } else {
1019 $select_week .= '<option value="'.$key.'">';
1020 }
1021 $select_week .= $val;
1022 $select_week .= '</option>';
1023 }
1024 $select_week .= '</select>';
1025
1026 $select_week .= ajax_combobox($htmlname);
1027
1028 return $select_week;
1029 }
1030
1031 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1043 public function select_month($selected = '', $htmlname = 'monthid', $useempty = 0, $longlabel = 0, $morecss = 'minwidth50 maxwidth75imp valignmiddle', $addjscombo = false)
1044 {
1045 // phpcs:enable
1046 global $langs;
1047
1048 require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
1049
1050 if ($longlabel) {
1051 $montharray = monthArray($langs, 0); // Get array
1052 } else {
1053 $montharray = monthArray($langs, 1);
1054 }
1055
1056 $select_month = '<select class="flat'.($morecss ? ' '.$morecss : '').'" name="'.$htmlname.'" id="'.$htmlname.'">';
1057 if ($useempty) {
1058 $select_month .= '<option value="0">&nbsp;</option>';
1059 }
1060 foreach ($montharray as $key => $val) {
1061 if ($selected == $key) {
1062 $select_month .= '<option value="'.$key.'" selected>';
1063 } else {
1064 $select_month .= '<option value="'.$key.'">';
1065 }
1066 $select_month .= $val;
1067 $select_month .= '</option>';
1068 }
1069 $select_month .= '</select>';
1070
1071 // Add code for jquery to use multiselect
1072 if ($addjscombo) {
1073 // Enhance with select2
1074 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
1075 $select_month .= ajax_combobox($htmlname);
1076 }
1077
1078 return $select_month;
1079 }
1080
1081 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1098 public function select_year($selected = '', $htmlname = 'yearid', $useempty = 0, $min_year = 10, $max_year = 5, $offset = 0, $invert = 0, $option = '', $morecss = 'valignmiddle maxwidth75imp', $addjscombo = false)
1099 {
1100 // phpcs:enable
1101 print $this->selectyear($selected, $htmlname, $useempty, $min_year, $max_year, $offset, $invert, $option, $morecss, $addjscombo);
1102 }
1103
1119 public function selectyear($selected = '', $htmlname = 'yearid', $useempty = 0, $min_year = 10, $max_year = 5, $offset = 0, $invert = 0, $option = '', $morecss = 'valignmiddle width75', $addjscombo = false)
1120 {
1121 $out = '';
1122
1123 $currentyear = date("Y") + $offset;
1124 $max_year = $currentyear + $max_year;
1125 $min_year = $currentyear - $min_year;
1126 if (empty($selected) && empty($useempty)) {
1127 $selected = $currentyear;
1128 }
1129
1130 $out .= '<select class="flat'.($morecss ? ' '.$morecss : '').'" id="'.$htmlname.'" name="'.$htmlname.'"'.$option.' >';
1131 if ($useempty) {
1132 $selected_html = '';
1133 if ($selected == '') {
1134 $selected_html = ' selected';
1135 }
1136 $out .= '<option value=""'.$selected_html.'>&nbsp;</option>';
1137 }
1138 if (!$invert) {
1139 for ($y = $max_year; $y >= $min_year; $y--) {
1140 $selected_html = '';
1141 if ($selected > 0 && $y == $selected) {
1142 $selected_html = ' selected';
1143 }
1144 $out .= '<option value="'.$y.'"'.$selected_html.' >'.$y.'</option>';
1145 }
1146 } else {
1147 for ($y = $min_year; $y <= $max_year; $y++) {
1148 $selected_html = '';
1149 if ($selected > 0 && $y == $selected) {
1150 $selected_html = ' selected';
1151 }
1152 $out .= '<option value="'.$y.'"'.$selected_html.' >'.$y.'</option>';
1153 }
1154 }
1155 $out .= "</select>\n";
1156
1157 // Add code for jquery to use multiselect
1158 if ($addjscombo) {
1159 // Enhance with select2
1160 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
1161 $out .= ajax_combobox($htmlname);
1162 }
1163
1164 return $out;
1165 }
1166
1167
1176 public static function getBoxesArea($user, $areacode)
1177 {
1178 global $conf, $langs, $db;
1179
1180 include_once DOL_DOCUMENT_ROOT.'/core/class/infobox.class.php';
1181
1182 $confuserzone = 'MAIN_BOXES_'.$areacode;
1183
1184 // $boxactivated will be array of boxes enabled into global setup
1185 // $boxidactivatedforuser will be array of boxes choosed by user
1186
1187 $selectboxlist = '';
1188 $boxactivated = InfoBox::listBoxes($db, 'activated', $areacode, (empty($user->conf->$confuserzone) ?null:$user), array(), 0); // Search boxes of common+user (or common only if user has no specific setup)
1189
1190 $boxidactivatedforuser = array();
1191 foreach ($boxactivated as $box) {
1192 if (empty($user->conf->$confuserzone) || $box->fk_user == $user->id) {
1193 $boxidactivatedforuser[$box->id] = $box->id; // We keep only boxes to show for user
1194 }
1195 }
1196
1197 // Define selectboxlist
1198 $arrayboxtoactivatelabel = array();
1199 if (!empty($user->conf->$confuserzone)) {
1200 $boxorder = '';
1201 $langs->load("boxes"); // Load label of boxes
1202 foreach ($boxactivated as $box) {
1203 if (!empty($boxidactivatedforuser[$box->id])) {
1204 continue; // Already visible for user
1205 }
1206 $label = $langs->transnoentitiesnoconv($box->boxlabel);
1207 //if (preg_match('/graph/',$box->class)) $label.=' ('.$langs->trans("Graph").')';
1208 if (preg_match('/graph/', $box->class) && $conf->browser->layout != 'phone') {
1209 $label = $label.' <span class="fa fa-bar-chart"></span>';
1210 }
1211 $arrayboxtoactivatelabel[$box->id] = array('label'=>$label, 'data-html'=>img_picto('', $box->boximg, 'class="pictofixedwidth"').$langs->trans($label)); // We keep only boxes not shown for user, to show into combo list
1212 }
1213 foreach ($boxidactivatedforuser as $boxid) {
1214 if (empty($boxorder)) {
1215 $boxorder .= 'A:';
1216 }
1217 $boxorder .= $boxid.',';
1218 }
1219
1220 //var_dump($boxidactivatedforuser);
1221
1222 // Class Form must have been already loaded
1223 $selectboxlist .= '<!-- Form with select box list -->'."\n";
1224 $selectboxlist .= '<form id="addbox" name="addbox" method="POST" action="'.$_SERVER["PHP_SELF"].'">';
1225 $selectboxlist .= '<input type="hidden" name="token" value="'.newToken().'">';
1226 $selectboxlist .= '<input type="hidden" name="addbox" value="addbox">';
1227 $selectboxlist .= '<input type="hidden" name="userid" value="'.$user->id.'">';
1228 $selectboxlist .= '<input type="hidden" name="areacode" value="'.$areacode.'">';
1229 $selectboxlist .= '<input type="hidden" name="boxorder" value="'.$boxorder.'">';
1230 $selectboxlist .= Form::selectarray('boxcombo', $arrayboxtoactivatelabel, -1, $langs->trans("ChooseBoxToAdd").'...', 0, 0, '', 0, 0, 0, 'ASC', 'maxwidth150onsmartphone hideonprint', 0, 'hidden selected', 0, 0);
1231 if (empty($conf->use_javascript_ajax)) {
1232 $selectboxlist .= ' <input type="submit" class="button" value="'.$langs->trans("AddBox").'">';
1233 }
1234 $selectboxlist .= '</form>';
1235 if (!empty($conf->use_javascript_ajax)) {
1236 include_once DOL_DOCUMENT_ROOT.'/core/lib/ajax.lib.php';
1237 $selectboxlist .= ajax_combobox("boxcombo");
1238 }
1239 }
1240
1241 // Javascript code for dynamic actions
1242 if (!empty($conf->use_javascript_ajax)) {
1243 $selectboxlist .= '<script nonce="'.getNonce().'" type="text/javascript">
1244
1245 // To update list of activated boxes
1246 function updateBoxOrder(closing) {
1247 var left_list = cleanSerialize(jQuery("#boxhalfleft").sortable("serialize"));
1248 var right_list = cleanSerialize(jQuery("#boxhalfright").sortable("serialize"));
1249 var boxorder = \'A:\' + left_list + \'-B:\' + right_list;
1250 if (boxorder==\'A:A-B:B\' && closing == 1) // There is no more boxes on screen, and we are after a delete of a box so we must hide title
1251 {
1252 jQuery.ajax({
1253 url: \''.DOL_URL_ROOT.'/core/ajax/box.php?closing=1&boxorder=\'+boxorder+\'&zone='.$areacode.'&userid=\'+'.$user->id.',
1254 async: false
1255 });
1256 // We force reload to be sure to get all boxes into list
1257 window.location.search=\'mainmenu='.GETPOST("mainmenu", "aZ09").'&leftmenu='.GETPOST('leftmenu', "aZ09").'&action=delbox&token='.newToken().'\';
1258 }
1259 else
1260 {
1261 jQuery.ajax({
1262 url: \''.DOL_URL_ROOT.'/core/ajax/box.php?closing=\'+closing+\'&boxorder=\'+boxorder+\'&zone='.$areacode.'&userid=\'+'.$user->id.',
1263 async: true
1264 });
1265 }
1266 }
1267
1268 jQuery(document).ready(function() {
1269 jQuery("#boxcombo").change(function() {
1270 var boxid=jQuery("#boxcombo").val();
1271 if (boxid > 0) {
1272 console.log("A box widget has been selected for addition, we call ajax page to add it.")
1273 var left_list = cleanSerialize(jQuery("#boxhalfleft").sortable("serialize"));
1274 var right_list = cleanSerialize(jQuery("#boxhalfright").sortable("serialize"));
1275 var boxorder = \'A:\' + left_list + \'-B:\' + right_list;
1276 jQuery.ajax({
1277 url: \''.DOL_URL_ROOT.'/core/ajax/box.php?boxorder=\'+boxorder+\'&boxid=\'+boxid+\'&zone='.$areacode.'&userid='.$user->id.'\'
1278 }).done(function() {
1279 window.location.search=\'mainmenu='.GETPOST("mainmenu", "aZ09").'&leftmenu='.GETPOST('leftmenu', "aZ09").'\';
1280 });
1281 }
1282 });';
1283 if (!count($arrayboxtoactivatelabel)) {
1284 $selectboxlist .= 'jQuery("#boxcombo").hide();';
1285 }
1286 $selectboxlist .= '
1287
1288 jQuery("#boxhalfleft, #boxhalfright").sortable({
1289 handle: \'.boxhandle\',
1290 revert: \'invalid\',
1291 items: \'.boxdraggable\',
1292 containment: \'document\',
1293 connectWith: \'#boxhalfleft, #boxhalfright\',
1294 stop: function(event, ui) {
1295 console.log("We moved box so we call updateBoxOrder with ajax actions");
1296 updateBoxOrder(1); /* 1 to avoid message after a move */
1297 }
1298 });
1299
1300 jQuery(".boxclose").click(function() {
1301 var self = this; // because JQuery can modify this
1302 var boxid = self.id.substring(8);
1303 if (boxid > 0) {
1304 var label = jQuery(\'#boxlabelentry\'+boxid).val();
1305 console.log("We close box "+boxid);
1306 jQuery(\'#boxto_\'+boxid).remove();
1307 jQuery(\'#boxcombo\').append(new Option(label, boxid));
1308 updateBoxOrder(1); /* 1 to avoid message after a remove */
1309 }
1310 });
1311
1312 });'."\n";
1313
1314 $selectboxlist .= '</script>'."\n";
1315 }
1316
1317 // Define boxlista and boxlistb
1318 $boxlista = '';
1319 $boxlistb = '';
1320 $nbboxactivated = count($boxidactivatedforuser);
1321
1322 if ($nbboxactivated) {
1323 // Load translation files required by the page
1324 $langs->loadLangs(array("boxes", "projects"));
1325
1326 $emptybox = new ModeleBoxes($db);
1327
1328 $boxlista .= "\n<!-- Box left container -->\n";
1329
1330 // Define $box_max_lines
1331 $box_max_lines = 5;
1332 if (!empty($conf->global->MAIN_BOXES_MAXLINES)) {
1333 $box_max_lines = $conf->global->MAIN_BOXES_MAXLINES;
1334 }
1335
1336 $ii = 0;
1337 foreach ($boxactivated as $key => $box) {
1338 if ((!empty($user->conf->$confuserzone) && $box->fk_user == 0) || (empty($user->conf->$confuserzone) && $box->fk_user != 0)) {
1339 continue;
1340 }
1341 if (empty($box->box_order) && $ii < ($nbboxactivated / 2)) {
1342 $box->box_order = 'A'.sprintf("%02d", ($ii + 1)); // When box_order was not yet set to Axx or Bxx and is still 0
1343 }
1344 if (preg_match('/^A/i', $box->box_order)) { // column A
1345 $ii++;
1346 //print 'box_id '.$boxactivated[$ii]->box_id.' ';
1347 //print 'box_order '.$boxactivated[$ii]->box_order.'<br>';
1348 // Show box
1349 $box->loadBox($box_max_lines);
1350 $boxlista .= $box->showBox(null, null, 1);
1351 }
1352 }
1353
1354 if ($conf->browser->layout != 'phone') {
1355 $emptybox->box_id = 'A';
1356 $emptybox->info_box_head = array();
1357 $emptybox->info_box_contents = array();
1358 $boxlista .= $emptybox->showBox(array(), array(), 1);
1359 }
1360 $boxlista .= "<!-- End box left container -->\n";
1361
1362 $boxlistb .= "\n<!-- Box right container -->\n";
1363
1364 $ii = 0;
1365 foreach ($boxactivated as $key => $box) {
1366 if ((!empty($user->conf->$confuserzone) && $box->fk_user == 0) || (empty($user->conf->$confuserzone) && $box->fk_user != 0)) {
1367 continue;
1368 }
1369 if (empty($box->box_order) && $ii < ($nbboxactivated / 2)) {
1370 $box->box_order = 'B'.sprintf("%02d", ($ii + 1)); // When box_order was not yet set to Axx or Bxx and is still 0
1371 }
1372 if (preg_match('/^B/i', $box->box_order)) { // colonne B
1373 $ii++;
1374 //print 'box_id '.$boxactivated[$ii]->box_id.' ';
1375 //print 'box_order '.$boxactivated[$ii]->box_order.'<br>';
1376 // Show box
1377 $box->loadBox($box_max_lines);
1378 $boxlistb .= $box->showBox(null, null, 1);
1379 }
1380 }
1381
1382 if ($conf->browser->layout != 'phone') {
1383 $emptybox->box_id = 'B';
1384 $emptybox->info_box_head = array();
1385 $emptybox->info_box_contents = array();
1386 $boxlistb .= $emptybox->showBox(array(), array(), 1);
1387 }
1388
1389 $boxlistb .= "<!-- End box right container -->\n";
1390 }
1391
1392 return array('selectboxlist'=>count($boxactivated) ? $selectboxlist : '', 'boxactivated'=>$boxactivated, 'boxlista'=>$boxlista, 'boxlistb'=>$boxlistb);
1393 }
1394
1395
1396 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
1409 public function select_dictionary($htmlname, $dictionarytable, $keyfield = 'code', $labelfield = 'label', $selected = '', $useempty = 0, $moreattrib = '')
1410 {
1411 // phpcs:enable
1412 global $langs, $conf;
1413
1414 $langs->load("admin");
1415
1416 $sql = "SELECT rowid, ".$keyfield.", ".$labelfield;
1417 $sql .= " FROM ".$this->db->prefix().$dictionarytable;
1418 $sql .= " ORDER BY ".$labelfield;
1419
1420 dol_syslog(get_class($this)."::select_dictionary", LOG_DEBUG);
1421 $result = $this->db->query($sql);
1422 if ($result) {
1423 $num = $this->db->num_rows($result);
1424 $i = 0;
1425 if ($num) {
1426 print '<select id="select'.$htmlname.'" class="flat selectdictionary" name="'.$htmlname.'"'.($moreattrib ? ' '.$moreattrib : '').'>';
1427 if ($useempty == 1 || ($useempty == 2 && $num > 1)) {
1428 print '<option value="-1">&nbsp;</option>';
1429 }
1430
1431 while ($i < $num) {
1432 $obj = $this->db->fetch_object($result);
1433 if ($selected == $obj->rowid || $selected == $obj->{$keyfield}) {
1434 print '<option value="'.$obj->{$keyfield}.'" selected>';
1435 } else {
1436 print '<option value="'.$obj->{$keyfield}.'">';
1437 }
1438 $label = ($langs->trans($dictionarytable.$obj->{$keyfield}) != ($dictionarytable.$obj->{$labelfield}) ? $langs->trans($dictionarytable.$obj->{$keyfield}) : $obj->{$labelfield});
1439 print $label;
1440 print '</option>';
1441 $i++;
1442 }
1443 print "</select>";
1444 } else {
1445 print $langs->trans("DictionaryEmpty");
1446 }
1447 } else {
1448 dol_print_error($this->db);
1449 }
1450 }
1451
1462 public function selectAutoManual($htmlname, $value = '', $option = 0, $disabled = false, $useempty = 0)
1463 {
1464 global $langs;
1465
1466 $automatic = "automatic";
1467 $manual = "manual";
1468 if ($option) {
1469 $automatic = "1";
1470 $manual = "0";
1471 }
1472
1473 $disabled = ($disabled ? ' disabled' : '');
1474
1475 $resultautomanual = '<select class="flat width100" id="'.$htmlname.'" name="'.$htmlname.'"'.$disabled.'>'."\n";
1476 if ($useempty) {
1477 $resultautomanual .= '<option value="-1"'.(($value < 0) ? ' selected' : '').'>&nbsp;</option>'."\n";
1478 }
1479 if (("$value" == 'automatic') || ($value == 1)) {
1480 $resultautomanual .= '<option value="'.$automatic.'" selected>'.$langs->trans("Automatic").'</option>'."\n";
1481 $resultautomanual .= '<option value="'.$manual.'">'.$langs->trans("Manual").'</option>'."\n";
1482 } else {
1483 $selected = (($useempty && $value != '0' && $value != 'manual') ? '' : ' selected');
1484 $resultautomanual .= '<option value="'.$automatic.'">'.$langs->trans("Automatic").'</option>'."\n";
1485 $resultautomanual .= '<option value="'.$manual.'"'.$selected.'>'.$langs->trans("Manual").'</option>'."\n";
1486 }
1487 $resultautomanual .= '</select>'."\n";
1488 return $resultautomanual;
1489 }
1490
1491
1502 public function selectGroupByField($object, $search_groupby, &$arrayofgroupby, $morecss = 'minwidth200 maxwidth250', $showempty = '1')
1503 {
1504 global $langs, $extrafields, $form;
1505
1506 $arrayofgroupbylabel = array();
1507 foreach ($arrayofgroupby as $key => $val) {
1508 $arrayofgroupbylabel[$key] = $val['label'];
1509 }
1510 $result = $form->selectarray('search_groupby', $arrayofgroupbylabel, $search_groupby, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1);
1511
1512 return $result;
1513 }
1514
1525 public function selectXAxisField($object, $search_xaxis, &$arrayofxaxis, $showempty = '1', $morecss = 'minwidth250 maxwidth500')
1526 {
1527 global $form;
1528
1529 $arrayofxaxislabel = array();
1530 foreach ($arrayofxaxis as $key => $val) {
1531 $arrayofxaxislabel[$key] = $val['label'];
1532 }
1533 $result = $form->selectarray('search_xaxis', $arrayofxaxislabel, $search_xaxis, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1);
1534
1535 return $result;
1536 }
1537}
Classe permettant la generation de composants html autre Only common components are here.
__construct($db)
Constructor.
select_dictionary($htmlname, $dictionarytable, $keyfield='code', $labelfield='label', $selected='', $useempty=0, $moreattrib='')
Return a HTML select list of a dictionary.
getHTMLScannerForm($jstoexecuteonadd='barcodescannerjs', $mode='all')
Return the HTML code for scanner tool.
Class toolbox to validate values.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
Definition invoice.php:1632
ui dialog ui datepicker calendar ui widget content ui state ui datepicker calendar ui widget header ui state ui datepicker calendar ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
$conf db user
Definition repair.php:124
if(preg_match('/crypted:/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
Definition repair.php:120