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