dolibarr 21.0.0-alpha
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 Frédéric France <frederic.france@free.fr>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
32{
36 public $db;
37
41 public $error = '';
42
43
49 public function __construct($db)
50 {
51 $this->db = $db;
52 }
53
54
55 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
68 public function form_select_status_action($formname, $selected, $canedit = 1, $htmlname = 'complete', $showempty = 0, $onlyselect = 0, $morecss = 'maxwidth100')
69 {
70 // phpcs:enable
71 global $langs, $conf;
72
73 $listofstatus = array(
74 'na' => $langs->trans("ActionNotApplicable"),
75 '0' => $langs->trans("ActionsToDoShort"),
76 '50' => $langs->trans("ActionRunningShort"),
77 '100' => $langs->trans("ActionDoneShort")
78 );
79 // +ActionUncomplete
80
81 if (!empty($conf->use_javascript_ajax) || $onlyselect) {
82 //var_dump($selected);
83 if ($selected == 'done') {
84 $selected = '100';
85 }
86 print '<select '.($canedit ? '' : 'disabled ').'name="'.$htmlname.'" id="select'.$htmlname.'" class="flat'.($morecss ? ' '.$morecss : '').'">';
87 if ($showempty) {
88 print '<option value="-1"'.($selected == '' ? ' selected' : '').'>&nbsp;</option>';
89 }
90 foreach ($listofstatus as $key => $val) {
91 print '<option value="'.$key.'"'.(($selected == $key && strlen($selected) == strlen($key)) || (($selected > 0 && $selected < 100) && $key == '50') ? ' selected' : '').'>'.$val.'</option>';
92 if ($key == '50' && $onlyselect == 2) {
93 print '<option value="todo"'.($selected == 'todo' ? ' selected' : '').'>'.$langs->trans("ActionUncomplete").' ('.$langs->trans("ActionsToDoShort")."+".$langs->trans("ActionRunningShort").')</option>';
94 }
95 }
96 print '</select>';
97 if ($selected == 0 || $selected == 100) {
98 $canedit = 0;
99 }
100
101 print ajax_combobox('select'.$htmlname, array(), 0, 0, 'resolve', '-1', $morecss);
102
103 if (empty($onlyselect)) {
104 print ' <input type="text" id="val'.$htmlname.'" name="percentage" class="flat hideifna" value="'.($selected >= 0 ? $selected : '').'" size="2"'.($canedit && ($selected >= 0) ? '' : ' disabled').'>';
105 print '<span class="hideonsmartphone hideifna">%</span>';
106 }
107 } else {
108 print ' <input type="text" id="val'.$htmlname.'" name="percentage" class="flat" value="'.($selected >= 0 ? $selected : '').'" size="2"'.($canedit ? '' : ' disabled').'>%';
109 }
110
111 if (!empty($conf->use_javascript_ajax)) {
112 print "\n";
113 print '<script nonce="'.getNonce().'" type="text/javascript">';
114 print "
115 var htmlname = '".dol_escape_js($htmlname)."';
116
117 $(document).ready(function () {
118 select_status();
119
120 $('#select' + htmlname).change(function() {
121 console.log('We change field select '+htmlname);
122 select_status();
123 });
124 });
125
126 function select_status() {
127 var defaultvalue = $('#select' + htmlname).val();
128 console.log('val='+defaultvalue);
129 var percentage = $('input[name=percentage]');
130 var selected = '".(isset($selected) ? dol_escape_js($selected) : '')."';
131 var value = (selected>0?selected:(defaultvalue>=0?defaultvalue:''));
132
133 percentage.val(value);
134
135 if (defaultvalue == 'na' || defaultvalue == -1) {
136 percentage.prop('disabled', true);
137 $('.hideifna').hide();
138 }
139 else if (defaultvalue == 0) {
140 percentage.val(0);
141 percentage.removeAttr('disabled'); /* Not disabled, we want to change it to higher value */
142 $('.hideifna').show();
143 }
144 else if (defaultvalue == 100) {
145 percentage.val(100);
146 percentage.prop('disabled', true);
147 $('.hideifna').show();
148 }
149 else {
150 if (defaultvalue == 50 && (percentage.val() == 0 || percentage.val() == 100)) { percentage.val(50); }
151 percentage.removeAttr('disabled');
152 $('.hideifna').show();
153 }
154 }
155 </script>\n";
156 }
157 }
158
159
174 public function showactions($object, $typeelement, $socid = 0, $forceshowtitle = 0, $morecss = 'listactions', $max = 0, $moreparambacktopage = '', $morehtmlcenter = '', $assignedtouser = 0)
175 {
176 global $langs, $user, $hookmanager;
177
178 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
179
180 $sortfield = 'a.datep,a.id';
181 $sortorder = 'DESC,DESC';
182
183 $actioncomm = new ActionComm($this->db);
184 $listofactions = $actioncomm->getActions($socid, $object->id, $typeelement, '', $sortfield, $sortorder, ($max ? ($max + 1) : 0));
185 if (!is_array($listofactions)) {
186 dol_print_error($this->db, 'FailedToGetActions');
187 }
188
189 $num = count($listofactions);
190 if ($num || $forceshowtitle) {
191 $title = $langs->trans("LatestLinkedEvents", $max ? $max : '');
192
193 $urlbacktopage = $_SERVER['PHP_SELF'].'?id='.$object->id.($moreparambacktopage ? '&'.$moreparambacktopage : '');
194
195 $projectid = $object->fk_project;
196 if ($typeelement == 'project') {
197 $projectid = $object->id;
198 }
199 $taskid = 0;
200 if ($typeelement == 'task') {
201 $taskid = $object->id;
202 }
203
204 $usercanaddaction = 0;
205 if (empty($assignedtouser) || $assignedtouser == $user->id) {
206 $usercanaddaction = $user->hasRight('agenda', 'myactions', 'create');
207 $assignedtouser = 0;
208 } else {
209 $usercanaddaction = $user->hasRight('agenda', 'allactions', 'create');
210 }
211
212 $url = '';
213 $morehtmlright = '';
214 if (isModEnabled('agenda') && $usercanaddaction) {
215 $url = DOL_URL_ROOT.'/comm/action/card.php?action=create&token='.newToken().'&datep='.urlencode(dol_print_date(dol_now(), 'dayhourlog', 'tzuser'));
216 $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) : ''));
217 $url .= ($projectid > 0 ? '&projectid='.((int) $projectid) : '').($taskid > 0 ? '&taskid='.((int) $taskid) : '');
218 $url .= ($assignedtouser > 0 ? '&assignedtouser='.((int) $assignedtouser) : '');
219 $url .= '&backtopage='.urlencode($urlbacktopage);
220
221 if ($typeelement == 'invoice_supplier') {
222 $messagingUrl = DOL_URL_ROOT.'/fourn/facture/messaging.php?id='.$object->id;
223 $morehtmlright .= dolGetButtonTitle($langs->trans('ShowAsConversation'), '', 'fa fa-comments imgforviewmode', $messagingUrl, '', 1);
224 $messagingUrl = DOL_URL_ROOT.'/fourn/facture/agenda.php?id='.$object->id;
225 $morehtmlright .= dolGetButtonTitle($langs->trans('MessageListViewType'), '', 'fa fa-bars imgforviewmode', $messagingUrl, '', 2);
226 }
227
228 $morehtmlright .= dolGetButtonTitle($langs->trans("AddEvent"), '', 'fa fa-plus-circle', $url);
229 }
230
231 $parameters = array(
232 'title' => &$title,
233 'morehtmlright' => &$morehtmlright,
234 'morehtmlcenter' => &$morehtmlcenter,
235 'usercanaddaction' => $usercanaddaction,
236 'url' => &$url,
237 'typeelement' => $typeelement,
238 'projectid' => $projectid,
239 'assignedtouser' => $assignedtouser,
240 'taskid' => $taskid,
241 'urlbacktopage' => $urlbacktopage
242 );
243
244 $reshook = $hookmanager->executeHooks('showActionsLoadFicheTitre', $parameters, $object);
245
246 if ($reshook < 0) {
247 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
248 }
249
250 $error = 0;
251 if (empty($reshook)) {
252 print '<!-- formactions->showactions -->' . "\n";
253 print load_fiche_titre($title, $morehtmlright, '', 0, '', '', $morehtmlcenter);
254 }
255
256 $page = 0;
257 $param = '';
258
259 print '<div class="div-table-responsive-no-min">';
260 print '<table class="centpercent noborder'.($morecss ? ' '.$morecss : '').'">';
261 print '<tr class="liste_titre">';
262 print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
263 print getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', (string) $page, $param, '', $sortfield, $sortorder, 'center ', 1);
264 print getTitleFieldOfList('By', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
265 print getTitleFieldOfList('Type', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
266 print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, '', 1);
267 print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', (string) $page, $param, '', $sortfield, $sortorder, 'right ', 1);
268 print '</tr>';
269 print "\n";
270
271 if (is_array($listofactions) && count($listofactions)) {
272 $cacheusers = array();
273
274 $cursorevent = 0;
275 foreach ($listofactions as $actioncomm) {
276 if ($max && $cursorevent >= $max) {
277 break;
278 }
279
280 print '<tr class="oddeven">';
281
282 // Ref
283 print '<td class="nowraponall nopaddingrightimp">'.$actioncomm->getNomUrl(1, -1).'</td>';
284
285 // Date
286 print '<td class="center nowraponall">'.dol_print_date($actioncomm->datep, 'dayhourreduceformat', 'tzuserrel');
287 if ($actioncomm->datef) {
288 $tmpa = dol_getdate($actioncomm->datep);
289 $tmpb = dol_getdate($actioncomm->datef);
290 if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
291 if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes']) {
292 print '-'.dol_print_date($actioncomm->datef, 'hour', 'tzuserrel');
293 }
294 } else {
295 print '-'.dol_print_date($actioncomm->datef, 'dayhourreduceformat', 'tzuserrel');
296 }
297 }
298 print '</td>';
299
300 // Owner
301 print '<td class="nowraponall tdoverflowmax100">';
302 if (!empty($actioncomm->userownerid)) {
303 if (isset($cacheusers[$actioncomm->userownerid]) && is_object($cacheusers[$actioncomm->userownerid])) {
304 $tmpuser = $cacheusers[$actioncomm->userownerid];
305 } else {
306 $tmpuser = new User($this->db);
307 $tmpuser->fetch($actioncomm->userownerid);
308 $cacheusers[$actioncomm->userownerid] = $tmpuser;
309 }
310 if ($tmpuser->id > 0) {
311 print $tmpuser->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
312 }
313 }
314 print '</td>';
315
316 // Example: Email sent from invoice card
317 //$actionstatic->code = 'AC_BILL_SENTBYMAIL
318 //$actionstatic->type_code = 'AC_OTHER_AUTO'
319
320 // Type
321 $labeltype = $actioncomm->getTypeLabel(0);
322 print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltype).'">';
323 print $actioncomm->getTypePicto();
324 print $labeltype;
325 print '</td>';
326
327 // Label
328 print '<td class="tdoverflowmax250">';
329 print $actioncomm->getNomUrl(0);
330 print '</td>';
331
332 // Status
333 print '<td class="right">';
334 print $actioncomm->getLibStatut(3);
335 print '</td>';
336 print '</tr>';
337
338 $cursorevent++;
339 }
340 } else {
341 print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
342 }
343
344 if ($max && $num > $max) {
345 print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("More").'...</span></td></tr>';
346 }
347
348 print '</table>';
349 print '</div>';
350 }
351
352 return $num;
353 }
354
355
356 // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
371 public function select_type_actions($selected = '', $htmlname = 'actioncode', $excludetype = '', $onlyautoornot = 0, $hideinfohelp = 0, $multiselect = 0, $nooutput = 0, $morecss = 'minwidth300', $showempty = 0)
372 {
373 // phpcs:enable
374 global $langs, $user, $form;
375
376 if (!is_object($form)) {
377 $form = new Form($this->db);
378 }
379
380 require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
381 require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
382 $caction = new CActionComm($this->db);
383
384 // Suggest a list with manual events or all auto events
385 $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.
386 /* Removed. The empty line must now be managed with param showempty
387 if (empty($multiselect)) {
388 // Add empty line at start only if no multiselect
389 array_unshift($arraylist, '&nbsp;');
390 }
391 */
392 //asort($arraylist);
393
394 if ($selected == 'manual') {
395 $selected = 'AC_OTH';
396 }
397 if ($selected == 'auto') {
398 $selected = 'AC_OTH_AUTO';
399 }
400
401 if (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 $newarraylist[$key] = array('id' => $key, 'label' => $value, 'disabled' => $disabled);
415 }
416
417 if (!empty($multiselect)) {
418 if (!is_array($selected) && !empty($selected)) {
419 $selected = explode(',', $selected);
420 }
421 $out .= $form->multiselectarray($htmlname, $newarraylist, $selected, 0, 0, 'centpercent', 0, 0, '', '', (is_numeric($showempty) ? '' : $showempty));
422 } else {
423 $out .= $form->selectarray($htmlname, $newarraylist, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1);
424 }
425
426 if ($user->admin && empty($onlyautoornot) && $hideinfohelp <= 0) {
427 $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup").($hideinfohelp == -1 ? ". ".$langs->trans("YouCanSetDefaultValueInModuleSetup") : ''), 1);
428 }
429
430 if ($nooutput) {
431 return $out;
432 } else {
433 print $out;
434 }
435 return '';
436 }
437}
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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:457
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.
form_select_status_action($formname, $selected, $canedit=1, $htmlname='complete', $showempty=0, $onlyselect=0, $morecss='maxwidth100')
Show list of action status.
showactions($object, $typeelement, $socid=0, $forceshowtitle=0, $morecss='listactions', $max=0, $moreparambacktopage='', $morehtmlcenter='', $assignedtouser=0)
Show list of actions for element.
__construct($db)
Constructor.
Class to manage generation of HTML components Only common components must be here.
Class to manage Dolibarr users.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_now($mode='auto')
Return date for now.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
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_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.