dolibarr  17.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 type=\"text/javascript\">
83  var htmlname = '".$htmlname."';
84 
85  $(document).ready(function () {
86  select_status();
87 
88  $('#select' + htmlname).change(function() {
89  console.log('We change field select '+htmlname);
90  select_status();
91  });
92  });
93 
94  function select_status() {
95  var defaultvalue = $('#select' + htmlname).val();
96  console.log('val='+defaultvalue);
97  var percentage = $('input[name=percentage]');
98  var selected = '".(isset($selected) ? dol_escape_js($selected) : '')."';
99  var value = (selected>0?selected:(defaultvalue>=0?defaultvalue:''));
100 
101  percentage.val(value);
102 
103  if (defaultvalue == 'na' || defaultvalue == -1) {
104  percentage.prop('disabled', true);
105  $('.hideifna').hide();
106  }
107  else if (defaultvalue == 0) {
108  percentage.val(0);
109  percentage.removeAttr('disabled'); /* Not disabled, we want to change it to higher value */
110  $('.hideifna').show();
111  }
112  else if (defaultvalue == 100) {
113  percentage.val(100);
114  percentage.prop('disabled', true);
115  $('.hideifna').show();
116  }
117  else {
118  if (defaultvalue == 50 && (percentage.val() == 0 || percentage.val() == 100)) { percentage.val(50) };
119  percentage.removeAttr('disabled');
120  $('.hideifna').show();
121  }
122  }
123  </script>\n";
124  }
125  if (!empty($conf->use_javascript_ajax) || $onlyselect) {
126  //var_dump($selected);
127  if ($selected == 'done') {
128  $selected = '100';
129  }
130  print '<select '.($canedit ? '' : 'disabled ').'name="'.$htmlname.'" id="select'.$htmlname.'" class="flat'.($morecss ? ' '.$morecss : '').'">';
131  if ($showempty) {
132  print '<option value="-1"'.($selected == '' ? ' selected' : '').'>&nbsp;</option>';
133  }
134  foreach ($listofstatus as $key => $val) {
135  print '<option value="'.$key.'"'.(($selected == $key && strlen($selected) == strlen($key)) || (($selected > 0 && $selected < 100) && $key == '50') ? ' selected' : '').'>'.$val.'</option>';
136  if ($key == '50' && $onlyselect == 2) {
137  print '<option value="todo"'.($selected == 'todo' ? ' selected' : '').'>'.$langs->trans("ActionUncomplete").' ('.$langs->trans("ActionsToDoShort")."+".$langs->trans("ActionRunningShort").')</option>';
138  }
139  }
140  print '</select>';
141  if ($selected == 0 || $selected == 100) {
142  $canedit = 0;
143  }
144 
145  print ajax_combobox('select'.$htmlname, array(), 0, 0, 'resolve', '-1', $morecss);
146 
147  if (empty($onlyselect)) {
148  print ' <input type="text" id="val'.$htmlname.'" name="percentage" class="flat hideifna" value="'.($selected >= 0 ? $selected : '').'" size="2"'.($canedit && ($selected >= 0) ? '' : ' disabled').'>';
149  print '<span class="hideonsmartphone hideifna">%</span>';
150  }
151  } else {
152  print ' <input type="text" id="val'.$htmlname.'" name="percentage" class="flat" value="'.($selected >= 0 ? $selected : '').'" size="2"'.($canedit ? '' : ' disabled').'>%';
153  }
154  }
155 
156 
171  public function showactions($object, $typeelement, $socid = 0, $forceshowtitle = 0, $morecss = 'listactions', $max = 0, $moreparambacktopage = '', $morehtmlcenter = '', $assignedtouser = 0)
172  {
173  global $langs, $conf, $user;
174 
175  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
176 
177  $sortfield = 'a.datep,a.id';
178  $sortorder = 'DESC,DESC';
179 
180  $actioncomm = new ActionComm($this->db);
181  $listofactions = $actioncomm->getActions($socid, $object->id, $typeelement, '', $sortfield, $sortorder, ($max ? ($max + 1) : 0));
182  if (!is_array($listofactions)) {
183  dol_print_error($this->db, 'FailedToGetActions');
184  }
185 
186  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
187  $caction = new CActionComm($this->db);
188  $arraylist = $caction->liste_array(1, 'code', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : 0), '', 1);
189 
190  $num = count($listofactions);
191  if ($num || $forceshowtitle) {
192  if ($typeelement == 'invoice') {
193  $title = $langs->trans('ActionsOnBill');
194  } elseif ($typeelement == 'invoice_supplier' || $typeelement == 'supplier_invoice') {
195  $title = $langs->trans('ActionsOnBill');
196  } elseif ($typeelement == 'propal') {
197  $title = $langs->trans('ActionsOnPropal');
198  } elseif ($typeelement == 'supplier_proposal') {
199  $title = $langs->trans('ActionsOnSupplierProposal');
200  } elseif ($typeelement == 'order') {
201  $title = $langs->trans('ActionsOnOrder');
202  } elseif ($typeelement == 'order_supplier' || $typeelement == 'supplier_order') {
203  $title = $langs->trans('ActionsOnOrder');
204  } elseif ($typeelement == 'shipping') {
205  $title = $langs->trans('ActionsOnShipping');
206  } elseif ($typeelement == 'fichinter') {
207  $title = $langs->trans('ActionsOnFicheInter');
208  } elseif ($typeelement == 'project') {
209  $title = $langs->trans('LatestLinkedEvents', $max ? $max : '');
210  } elseif ($typeelement == 'task') {
211  $title = $langs->trans('LatestLinkedEvents', $max ? $max : '');
212  } elseif ($typeelement == 'member') {
213  $title = $langs->trans('LatestLinkedEvents', $max ? $max : '');
214  } else {
215  $title = $langs->trans("LatestLinkedEvents", $max ? $max : '');
216  }
217 
218  $urlbacktopage = $_SERVER['PHP_SELF'].'?id='.$object->id.($moreparambacktopage ? '&'.$moreparambacktopage : '');
219 
220  $projectid = $object->fk_project;
221  if ($typeelement == 'project') {
222  $projectid = $object->id;
223  }
224  $taskid = 0;
225  if ($typeelement == 'task') {
226  $taskid = $object->id;
227  }
228 
229  $usercanaddaction = 0;
230  if (empty($assignedtouser) || $assignedtouser == $user->id) {
231  $usercanaddaction = $user->hasRight('agenda', 'myactions', 'create');
232  $assignedtouser = 0;
233  } else {
234  $usercanaddaction = $user->hasRight('agenda', 'allactions', 'create');
235  }
236 
237  $newcardbutton = '';
238  if (isModEnabled('agenda') && $usercanaddaction) {
239  $url = DOL_URL_ROOT.'/comm/action/card.php?action=create&token='.newToken().'&datep='.urlencode(dol_print_date(dol_now(), 'dayhourlog', 'tzuser'));
240  $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) : ''));
241  $url .= ($projectid > 0 ? '&projectid='.((int) $projectid) : '').($taskid > 0 ? '&taskid='.((int) $taskid) : '');
242  $url .= ($assignedtouser > 0 ? '&assignedtouser='.$assignedtouser : '');
243  $url .= '&backtopage='.urlencode($urlbacktopage);
244  $newcardbutton .= dolGetButtonTitle($langs->trans("AddEvent"), '', 'fa fa-plus-circle', $url);
245  }
246 
247  print '<!-- formactions->showactions -->'."\n";
248  print load_fiche_titre($title, $newcardbutton, '', 0, 0, '', $morehtmlcenter);
249 
250  $page = 0;
251  $param = '';
252 
253  print '<div class="div-table-responsive-no-min">';
254  print '<table class="centpercent noborder'.($morecss ? ' '.$morecss : '').'">';
255  print '<tr class="liste_titre">';
256  print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
257  print getTitleFieldOfList('By', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
258  print getTitleFieldOfList('Type', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
259  print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
260  print getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', $page, $param, '', $sortfield, $sortorder, 'center ', 1);
261  print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, 'right ', 1);
262  print '</tr>';
263  print "\n";
264 
265  if (is_array($listofactions) && count($listofactions)) {
266  $cacheusers = array();
267 
268  $cursorevent = 0;
269  foreach ($listofactions as $actioncomm) {
270  if ($max && $cursorevent >= $max) {
271  break;
272  }
273 
274  print '<tr class="oddeven">';
275 
276  // Ref
277  print '<td class="nowraponall">'.$actioncomm->getNomUrl(1, -1).'</td>';
278 
279  // Onwer
280  print '<td class="nowraponall tdoverflowmax125">';
281  if (!empty($actioncomm->userownerid)) {
282  if (isset($cacheusers[$actioncomm->userownerid]) && is_object($cacheusers[$actioncomm->userownerid])) {
283  $tmpuser = $cacheusers[$actioncomm->userownerid];
284  } else {
285  $tmpuser = new User($this->db);
286  $tmpuser->fetch($actioncomm->userownerid);
287  $cacheusers[$actioncomm->userownerid] = $tmpuser;
288  }
289  if ($tmpuser->id > 0) {
290  print $tmpuser->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
291  }
292  }
293  print '</td>';
294 
295  $actionstatic = $actioncomm;
296 
297  // Example: Email sent from invoice card
298  //$actionstatic->code = 'AC_BILL_SENTBYMAIL
299  //$actionstatic->type_code = 'AC_OTHER_AUTO'
300 
301  // Type
302  $labeltype = $actionstatic->type_code;
303  if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) {
304  $labeltype = 'AC_OTH';
305  }
306  if (preg_match('/^TICKET_MSG/', $actionstatic->code)) {
307  $labeltype = $langs->trans("Message");
308  } else {
309  if (!empty($arraylist[$labeltype])) {
310  $labeltype = $arraylist[$labeltype];
311  }
312  if ($actionstatic->type_code == 'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
313  $labeltype .= ' - '.$arraylist[$actionstatic->code]; // Use code in priority on type_code
314  }
315  }
316  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltype).'">';
317  print $actioncomm->getTypePicto();
318  print $labeltype;
319  print '</td>';
320 
321  // Label
322  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($actioncomm->label).'">'.$actioncomm->getNomUrl(0, 36).'</td>';
323 
324  // Date
325  print '<td class="center nowraponall">'.dol_print_date($actioncomm->datep, 'dayhour', 'tzuserrel');
326  if ($actioncomm->datef) {
327  $tmpa = dol_getdate($actioncomm->datep);
328  $tmpb = dol_getdate($actioncomm->datef);
329  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
330  if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes']) {
331  print '-'.dol_print_date($actioncomm->datef, 'hour', 'tzuserrel');
332  }
333  } else {
334  print '-'.dol_print_date($actioncomm->datef, 'dayhour', 'tzuserrel');
335  }
336  }
337  print '</td>';
338  print '<td class="right">';
339  print $actioncomm->getLibStatut(3);
340  print '</td>';
341  print '</tr>';
342 
343  $cursorevent++;
344  }
345  } else {
346  print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
347  }
348 
349  if ($max && $num > $max) {
350  print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("More").'...</span></td></tr>';
351  }
352 
353  print '</table>';
354  print '</div>';
355  }
356 
357  return $num;
358  }
359 
360 
361  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
375  public function select_type_actions($selected = '', $htmlname = 'actioncode', $excludetype = '', $onlyautoornot = 0, $hideinfohelp = 0, $multiselect = 0, $nooutput = 0, $morecss = 'minwidth300')
376  {
377  // phpcs:enable
378  global $langs, $user, $form, $conf;
379 
380  if (!is_object($form)) {
381  $form = new Form($this->db);
382  }
383 
384  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
385  require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
386  $caction = new CActionComm($this->db);
387 
388  // Suggest a list with manual events or all auto events
389  $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.
390  if (empty($multiselect)) {
391  // Add empty line at start only if no multiselect
392  array_unshift($arraylist, '&nbsp;');
393  }
394  //asort($arraylist);
395 
396  if ($selected == 'manual') {
397  $selected = 'AC_OTH';
398  }
399  if ($selected == 'auto') {
400  $selected = 'AC_OTH_AUTO';
401  }
402 
403  if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO)) {
404  unset($arraylist['AC_OTH_AUTO']);
405  }
406 
407  $out = '';
408 
409  if (!empty($multiselect)) {
410  if (!is_array($selected) && !empty($selected)) {
411  $selected = explode(',', $selected);
412  }
413  $out .= $form->multiselectarray($htmlname, $arraylist, $selected, 0, 0, 'centpercent', 0, 0);
414  } else {
415  $out .= $form->selectarray($htmlname, $arraylist, $selected, 0, 0, 0, '', 0, 0, 0, '', $morecss, 1);
416  }
417 
418  if ($user->admin && empty($onlyautoornot) && $hideinfohelp <= 0) {
419  $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup").($hideinfohelp == -1 ? ". ".$langs->trans("YouCanSetDefaultValueInModuleSetup") : ''), 1);
420  }
421 
422  if ($nooutput) {
423  return $out;
424  } else {
425  print $out;
426  }
427  return '';
428  }
429 }
dol_getdate
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
Definition: functions.lib.php:2820
db
$conf db
API class for accounts.
Definition: inc.php:41
ActionComm
Class to manage agenda events (actions)
Definition: actioncomm.class.php:38
getTitleFieldOfList
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
Definition: functions.lib.php:5201
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5360
dol_print_error
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
Definition: functions.lib.php:4993
FormActions
Class to manage building of HTML components.
Definition: html.formactions.class.php:30
$form
if($cancel &&! $id) if($action=='add' &&! $cancel) if($action=='delete') if($id) $form
Actions.
Definition: card.php:143
FormActions\form_select_status_action
form_select_status_action($formname, $selected, $canedit=1, $htmlname='complete', $showempty=0, $onlyselect=0, $morecss='maxwidth100')
Show list of action status.
Definition: html.formactions.class.php:67
dol_print_date
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
Definition: functions.lib.php:2550
CActionComm
Class to manage different types of events.
Definition: cactioncomm.class.php:29
dol_escape_js
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
Definition: functions.lib.php:1444
FormActions\showactions
showactions($object, $typeelement, $socid=0, $forceshowtitle=0, $morecss='listactions', $max=0, $moreparambacktopage='', $morehtmlcenter='', $assignedtouser=0)
Show list of actions for element.
Definition: html.formactions.class.php:171
dolGetButtonTitle
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.
Definition: functions.lib.php:11017
FormActions\__construct
__construct($db)
Constructor.
Definition: html.formactions.class.php:48
info_admin
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='')
Show information for admin users or standard users.
Definition: functions.lib.php:4949
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11290
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:137
User
Class to manage Dolibarr users.
Definition: user.class.php:46
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:53
FormActions\select_type_actions
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.
Definition: html.formactions.class.php:375
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2951
ajax_combobox
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:449