dolibarr 24.0.0-beta
html.formactions.class.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 2008-2012 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2010-2012 Regis Houssin <regis.houssin@inodbox.com>
4 * Copyright (C) 2010-2018 Juanjo Menent <jmenent@2byte.es>
5 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
6 * Copyright (C) 2024-2026 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
33{
37 public $db;
38
42 public $error = '';
43
44
50 public function __construct($db)
51 {
52 $this->db = $db;
53 }
54
55
56 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
71 public function form_select_status_action($formname, $selected, $canedit = 1, $htmlname = 'complete', $showempty = 0, $onlyselect = 0, $morecss = 'maxwidth100', $nooutput = 0)
72 {
73 // phpcs:enable
74 global $langs, $conf;
75
76 $listofstatus = [
77 'na' => $langs->trans("ActionNotApplicable"),
78 '0' => $langs->trans("ActionsToDoShort"),
79 '50' => $langs->trans("ActionRunningShort"),
80 '100' => $langs->trans("ActionDoneShort")
81 ];
82 // +ActionUncomplete
83
84 $out = '';
85
86 if (!empty($conf->use_javascript_ajax) || $onlyselect) {
87 //var_dump($selected);
88 if ($selected == 'done') {
89 $selected = '100';
90 }
91 $out .= '<select '.($canedit ? '' : 'disabled ').'name="'.$htmlname.'" id="select'.$htmlname.'" class="flat'.($morecss ? ' '.$morecss : '').'">';
92 if ($showempty) {
93 $out .= '<option value="-1"'.($selected == '' ? ' selected' : '').'>&nbsp;</option>';
94 }
95 foreach ($listofstatus as $key => $val) {
96 $out .= '<option value="'.$key.'"'.(($selected == $key && strlen($selected) == strlen($key)) || (($selected > 0 && $selected < 100) && $key == '50') ? ' selected' : '').'>';
97 $out .= $val;
98 $out .= '</option>';
99 // Add a choice "Incomplete" at second position
100 if ($key === 'na' && $onlyselect == 2) {
101 $out .= '<option value="todo"'.($selected == 'todo' ? ' selected' : '').'>'.$langs->trans("ActionUncomplete").' ('.$langs->trans("ActionsToDoShort")." + ".$langs->trans("ActionRunningShort").')</option>';
102 }
103 }
104 $out .= '</select>';
105 if ($selected == 0 || $selected == 100) {
106 $canedit = 0;
107 }
108
109 $out .= ajax_combobox('select'.$htmlname, array(), 0, 0, 'resolve', '-1', $morecss);
110
111 if (empty($onlyselect)) {
112 $out .= ' <input type="text" id="val'.$htmlname.'" name="percentage" class="flat hideifna heightofcombo" value="'.($selected >= 0 ? $selected : '').'" size="2"'.($canedit && ($selected >= 0) ? '' : ' disabled').'>';
113 $out .= '<span class="hideonsmartphone hideifna">%</span>';
114 }
115 } else {
116 $out .= ' <input type="text" id="val'.$htmlname.'" name="percentage" class="flat" value="'.($selected >= 0 ? $selected : '').'" size="2"'.($canedit ? '' : ' disabled').'>%';
117 }
118
119 if (!empty($conf->use_javascript_ajax)) {
120 $out .= "\n";
121 $out .= '<script nonce="'.getNonce().'" type="text/javascript">';
122 $out .= "
123 var htmlname = '".dol_escape_js($htmlname)."';
124
125 $(document).ready(function () {
126 select_status();
127
128 $('#select' + htmlname).change(function() {
129 console.log('We change field select '+htmlname);
130 select_status();
131 });
132 });
133
134 function select_status() {
135 var defaultvalue = $('#select' + htmlname).val();
136 console.log('val='+defaultvalue);
137 var percentage = $('input[name=percentage]');
138 var selected = '".(isset($selected) ? dol_escape_js($selected) : '')."';
139 var value = (selected>0?selected:(defaultvalue>=0?defaultvalue:''));
140
141 percentage.val(value);
142
143 if (defaultvalue == 'na' || defaultvalue == -1) {
144 percentage.prop('disabled', true);
145 $('.hideifna').hide();
146 }
147 else if (defaultvalue == 0) {
148 percentage.val(0);
149 percentage.removeAttr('disabled'); /* Not disabled, we want to change it to higher value */
150 $('.hideifna').show();
151 }
152 else if (defaultvalue == 100) {
153 percentage.val(100);
154 percentage.prop('disabled', true);
155 $('.hideifna').show();
156 }
157 else {
158 if (defaultvalue == 50 && (percentage.val() == 0 || percentage.val() == 100)) { percentage.val(50); }
159 percentage.removeAttr('disabled');
160 $('.hideifna').show();
161 }
162 }
163 </script>\n";
164 }
165
166 if ($nooutput) {
167 return $out;
168 } else {
169 print $out;
170 }
171 }
172
173
188 public function showactions($object, $typeelement, $socid = 0, $forceshowtitle = 0, $morecss = 'listactions', $max = 0, $moreparambacktopage = '', $morehtmlcenter = '', $assignedtouser = 0)
189 {
190 global $langs, $user, $hookmanager;
191
192 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
193
194 $sortfield = 'a.datep,a.id';
195 $sortorder = 'DESC,DESC';
196
197 $actioncomm = new ActionComm($this->db);
198 $listofactions = $actioncomm->getActions($socid, $object->id, $typeelement, '', $sortfield, $sortorder, ($max ? ($max + 1) : 0));
199 if (!is_array($listofactions)) {
200 dol_print_error($this->db, 'FailedToGetActions');
201 }
202
203 $num = count($listofactions);
204 if ($num || $forceshowtitle) {
205 $title = $langs->trans("LatestLinkedEvents", $max ? $max : '');
206
207 $urlbacktopage = $_SERVER['PHP_SELF'].'?id='.$object->id.($moreparambacktopage ? '&'.$moreparambacktopage : '');
208
209 $projectid = $object->fk_project;
210 if ($typeelement == 'project') {
211 $projectid = $object->id;
212 }
213 $taskid = 0;
214 if ($typeelement == 'project_task') {
215 $taskid = $object->id;
216 }
217
218 $usercanaddaction = 0;
219 if (empty($assignedtouser) || $assignedtouser == $user->id) {
220 $usercanaddaction = $user->hasRight('agenda', 'myactions', 'create');
221 $assignedtouser = 0;
222 } else {
223 $usercanaddaction = $user->hasRight('agenda', 'allactions', 'create');
224 }
225
226 $url = '';
227 $morehtmlright = '';
228 if (isModEnabled('agenda') && $usercanaddaction) {
229 $url = DOL_URL_ROOT.'/comm/action/card.php?action=create&token='.newToken().'&datep='.urlencode(dol_print_date(dol_now(), 'dayhourlog', 'tzuser'));
230 $url .= '&origin='.urlencode($typeelement).'&originid='.((int) $object->id).((!empty($object->socid) && $object->socid > 0) ? '&socid='.((int) $object->socid) : ((!empty($socid) && $socid > 0) ? '&socid='.((int) $socid) : ''));
231 $url .= ($projectid > 0 ? '&projectid='.((int) $projectid) : '').($taskid > 0 ? '&taskid='.((int) $taskid) : '');
232 $url .= ($assignedtouser > 0 ? '&assignedtouser='.((int) $assignedtouser) : '');
233 $url .= '&backtopage='.urlencode($urlbacktopage);
234
235 if ($typeelement == 'invoice_supplier') {
236 $messagingUrl = DOL_URL_ROOT.'/fourn/facture/messaging.php?id='.$object->id;
237 $morehtmlright .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 1);
238 $messagingUrl = DOL_URL_ROOT.'/fourn/facture/agenda.php?id='.$object->id;
239 $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 2);
240 }
241
242 $morehtmlright .= dolGetButtonTitle($langs->trans("AddEvent"), '', 'fa fa-plus-circle', $url);
243 }
244
245 $parameters = array(
246 'title' => &$title,
247 'morehtmlright' => &$morehtmlright,
248 'morehtmlcenter' => &$morehtmlcenter,
249 'usercanaddaction' => $usercanaddaction,
250 'url' => &$url,
251 'typeelement' => $typeelement,
252 'projectid' => $projectid,
253 'assignedtouser' => $assignedtouser,
254 'taskid' => $taskid,
255 'urlbacktopage' => $urlbacktopage
256 );
257
258 $reshook = $hookmanager->executeHooks('showActionsLoadFicheTitre', $parameters, $object);
259
260 if ($reshook < 0) {
261 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
262 }
263
264 if (empty($reshook)) {
265 print '<!-- formactions->showactions -->' . "\n";
266 print load_fiche_titre($title, $morehtmlright, '', 0, '', '', $morehtmlcenter);
267 }
268
269 $page = 0;
270 $param = '';
271
272 print '<div class="div-table-responsive-no-min">';
273 print '<table class="centpercent noborder'.($morecss ? ' '.$morecss : '').'">';
274 print '<tr class="liste_titre">';
275 print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
276 print getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', (string) $page, $param, '', $sortfield, $sortorder, 'center ', 1);
277 print getTitleFieldOfList('By', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
278 print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, 'center ', 1);
279 print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
280 print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, 'right ', 1);
281 print '</tr>';
282 print "\n";
283
284 if (is_array($listofactions) && count($listofactions)) {
285 $cacheusers = array();
286
287 $cursorevent = 0;
288 foreach ($listofactions as $actioncomm) {
289 if ($max && $cursorevent >= $max) {
290 break;
291 }
292
293 print '<tr class="oddeven">';
294
295 // Ref
296 print '<td class="nowraponall nopaddingrightimp">'.$actioncomm->getNomUrl(1, -1).'</td>';
297
298 // Date
299 print '<td class="center nowraponall celldateheight">';
300 print dolOutputDates($actioncomm->datep, $actioncomm->datef, $actioncomm->fulldayevent, 0, '', 'tzuserrel', 1);
301 print '</td>';
302
303 // Owner
304 print '<td class="nowraponall tdoverflowmax100">';
305 if (!empty($actioncomm->userownerid)) {
306 if (isset($cacheusers[$actioncomm->userownerid]) && is_object($cacheusers[$actioncomm->userownerid])) {
307 $tmpuser = $cacheusers[$actioncomm->userownerid];
308 } else {
309 $tmpuser = new User($this->db);
310 $tmpuser->fetch($actioncomm->userownerid);
311 $cacheusers[$actioncomm->userownerid] = $tmpuser;
312 }
313 if ($tmpuser->id > 0) {
314 print $tmpuser->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
315 }
316 }
317 print '</td>';
318
319 // Example: Email sent from invoice card
320 //$actionstatic->code = 'AC_BILL_SENTBYMAIL
321 //$actionstatic->type_code = 'AC_OTHER_AUTO'
322
323 // Type
324 $labeltypelong = $actioncomm->getTypeLabel(2);
325 print '<td class="tdoverflowmax100 center valignmiddle" title="'.dolPrintHTML($labeltypelong).'">';
326 print $actioncomm->getTypePicto('valignmiddle');
327 if (preg_match('/PRIVATE/', $actioncomm->code)) {
328 print ' '.img_picto($langs->transnoentitiesnoconv("Private"), 'lock', 'class="valignmiddle"');
329 }
330 //$labeltype = $actioncomm->getTypeLabel(0);
331 //print $labeltype;
332 print '</td>';
333
334 // Label / Title
335 print '<td class="tdoverflowmax250">';
336 print $actioncomm->getNomUrl(0);
337 print '</td>';
338
339 // Status
340 print '<td class="right">';
341 print $actioncomm->getLibStatut(3);
342 print '</td>';
343 print '</tr>';
344
345 $cursorevent++;
346 }
347 } else {
348 print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
349 }
350
351 if ($max && $num > $max) {
352 print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("More").'...</span></td></tr>';
353 }
354
355 print '</table>';
356 print '</div>';
357 }
358
359 return $num;
360 }
361
362
363 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
378 public function select_type_actions($selected = '', $htmlname = 'actioncode', $excludetype = '', $onlyautoornot = 0, $hideinfohelp = 0, $multiselect = 0, $nooutput = 0, $morecss = 'minwidth300', $showempty = 0)
379 {
380 // phpcs:enable
381 global $langs, $user, $form;
382
383 if (!is_object($form)) {
384 $form = new Form($this->db);
385 }
386
387 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
388 require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
389 $caction = new CActionComm($this->db);
390
391 // Suggest a list with manual events or all auto events
392 $arraylist = $caction->liste_array(1, 'code', $excludetype, $onlyautoornot, '', 0); // If we use param 'all' instead of 'code', there is no group by include in answer but the key 'type' of answer array contains the key for the group by.
393
394 if ($selected == 'manual') {
395 $selected = 'AC_OTH';
396 }
397 if ($selected == 'auto') {
398 $selected = 'AC_OTH_AUTO';
399 }
400
401 if (array_key_exists('AC_OTH_AUTO', $arraylist) && getDolGlobalString('AGENDA_ALWAYS_HIDE_AUTO')) {
402 unset($arraylist['AC_OTH_AUTO']);
403 }
404
405 $out = '';
406
407 // Reformat the array
408 $newarraylist = array();
409 foreach ($arraylist as $key => $value) {
410 $disabled = '';
411 if (strpos($key, 'AC_ALL_') !== false && strpos($key, 'AC_ALL_AUTO') === false) {
412 $disabled = 'disabled';
413 }
414
415 $newarraylist[$key] = array('id' => $key, 'label' => $value, 'disabled' => $disabled);
416 }
417
418 if (!empty($multiselect)) {
419 if (!is_array($selected) && !empty($selected)) {
420 $selected = explode(',', $selected);
421 }
422 $out .= $form->multiselectarray($htmlname, $newarraylist, $selected, 0, 0, 'centpercent', 0, 0, '', '', (is_numeric($showempty) ? '' : $showempty));
423 } else {
424 $out .= $form->selectarray($htmlname, $newarraylist, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1);
425 }
426
427 if ($user->admin && empty($onlyautoornot) && $hideinfohelp <= 0) {
428 $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup").($hideinfohelp == -1 ? ". ".$langs->trans("YouCanSetDefaultValueInModuleSetup") : ''), 1);
429 }
430
431 if ($nooutput) {
432 return $out;
433 } else {
434 print $out;
435 }
436 return '';
437 }
438}
if(! $sortfield) if(! $sortorder) $object
Definition account.php:100
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:476
Class to manage agenda events (actions)
Class to manage different types of events.
Class to manage building of HTML components.
select_type_actions($selected='', $htmlname='actioncode', $excludetype='', $onlyautoornot=0, $hideinfohelp=0, $multiselect=0, $nooutput=0, $morecss='minwidth300', $showempty=0)
Output html select list of type of event.
showactions($object, $typeelement, $socid=0, $forceshowtitle=0, $morecss='listactions', $max=0, $moreparambacktopage='', $morehtmlcenter='', $assignedtouser=0)
Show list of actions for element.
__construct($db)
Constructor.
form_select_status_action($formname, $selected, $canedit=1, $htmlname='complete', $showempty=0, $onlyselect=0, $morecss='maxwidth100', $nooutput=0)
Show list of action status.
Class to manage generation of HTML components Only common components must be here.
Class to manage Dolibarr users.
$cacheusers
Definition index.php:1598
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
dol_now($mode='gmt')
Return date for now.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
dolOutputDates($datep, $datef=null, $fullday=0, $addseconds=0, $pictotoadd='', $tzoutput='tzuserrel', $reduceformat=0)
Print decorated date-hour.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into JavaScript code.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.