dolibarr  18.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  *
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', '', (empty($conf->global->AGENDA_USE_EVENT_TYPE) ? 1 : 0), '', 1);
190 
191  $num = count($listofactions);
192  if ($num || $forceshowtitle) {
193  if ($typeelement == 'invoice') {
194  $title = $langs->trans('ActionsOnBill');
195  } elseif ($typeelement == 'invoice_supplier' || $typeelement == 'supplier_invoice') {
196  $title = $langs->trans('ActionsOnBill');
197  } elseif ($typeelement == 'propal') {
198  $title = $langs->trans('ActionsOnPropal');
199  } elseif ($typeelement == 'supplier_proposal') {
200  $title = $langs->trans('ActionsOnSupplierProposal');
201  } elseif ($typeelement == 'order') {
202  $title = $langs->trans('ActionsOnOrder');
203  } elseif ($typeelement == 'order_supplier' || $typeelement == 'supplier_order') {
204  $title = $langs->trans('ActionsOnOrder');
205  } elseif ($typeelement == 'shipping') {
206  $title = $langs->trans('ActionsOnShipping');
207  } elseif ($typeelement == 'fichinter') {
208  $title = $langs->trans('ActionsOnFicheInter');
209  } elseif ($typeelement == 'project') {
210  $title = $langs->trans('LatestLinkedEvents', $max ? $max : '');
211  } elseif ($typeelement == 'task') {
212  $title = $langs->trans('LatestLinkedEvents', $max ? $max : '');
213  } elseif ($typeelement == 'member') {
214  $title = $langs->trans('LatestLinkedEvents', $max ? $max : '');
215  } else {
216  $title = $langs->trans("LatestLinkedEvents", $max ? $max : '');
217  }
218 
219  $urlbacktopage = $_SERVER['PHP_SELF'].'?id='.$object->id.($moreparambacktopage ? '&'.$moreparambacktopage : '');
220 
221  $projectid = $object->fk_project;
222  if ($typeelement == 'project') {
223  $projectid = $object->id;
224  }
225  $taskid = 0;
226  if ($typeelement == 'task') {
227  $taskid = $object->id;
228  }
229 
230  $usercanaddaction = 0;
231  if (empty($assignedtouser) || $assignedtouser == $user->id) {
232  $usercanaddaction = $user->hasRight('agenda', 'myactions', 'create');
233  $assignedtouser = 0;
234  } else {
235  $usercanaddaction = $user->hasRight('agenda', 'allactions', 'create');
236  }
237 
238  $newcardbutton = '';
239  if (isModEnabled('agenda') && $usercanaddaction) {
240  $url = DOL_URL_ROOT.'/comm/action/card.php?action=create&token='.newToken().'&datep='.urlencode(dol_print_date(dol_now(), 'dayhourlog', 'tzuser'));
241  $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) : ''));
242  $url .= ($projectid > 0 ? '&projectid='.((int) $projectid) : '').($taskid > 0 ? '&taskid='.((int) $taskid) : '');
243  $url .= ($assignedtouser > 0 ? '&assignedtouser='.$assignedtouser : '');
244  $url .= '&backtopage='.urlencode($urlbacktopage);
245  $newcardbutton .= dolGetButtonTitle($langs->trans("AddEvent"), '', 'fa fa-plus-circle', $url);
246  }
247 
248  print '<!-- formactions->showactions -->'."\n";
249  print load_fiche_titre($title, $newcardbutton, '', 0, 0, '', $morehtmlcenter);
250 
251  $page = 0;
252  $param = '';
253 
254  print '<div class="div-table-responsive-no-min">';
255  print '<table class="centpercent noborder'.($morecss ? ' '.$morecss : '').'">';
256  print '<tr class="liste_titre">';
257  print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
258  print getTitleFieldOfList('By', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
259  print getTitleFieldOfList('Type', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
260  print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, '', 1);
261  print getTitleFieldOfList('Date', 0, $_SERVER["PHP_SELF"], 'a.datep', $page, $param, '', $sortfield, $sortorder, 'center ', 1);
262  print getTitleFieldOfList('', 0, $_SERVER["PHP_SELF"], '', $page, $param, '', $sortfield, $sortorder, 'right ', 1);
263  print '</tr>';
264  print "\n";
265 
266  if (is_array($listofactions) && count($listofactions)) {
267  $cacheusers = array();
268 
269  $cursorevent = 0;
270  foreach ($listofactions as $actioncomm) {
271  if ($max && $cursorevent >= $max) {
272  break;
273  }
274 
275  print '<tr class="oddeven">';
276 
277  // Ref
278  print '<td class="nowraponall">'.$actioncomm->getNomUrl(1, -1).'</td>';
279 
280  // Onwer
281  print '<td class="nowraponall tdoverflowmax125">';
282  if (!empty($actioncomm->userownerid)) {
283  if (isset($cacheusers[$actioncomm->userownerid]) && is_object($cacheusers[$actioncomm->userownerid])) {
284  $tmpuser = $cacheusers[$actioncomm->userownerid];
285  } else {
286  $tmpuser = new User($this->db);
287  $tmpuser->fetch($actioncomm->userownerid);
288  $cacheusers[$actioncomm->userownerid] = $tmpuser;
289  }
290  if ($tmpuser->id > 0) {
291  print $tmpuser->getNomUrl(-1, '', 0, 0, 16, 0, 'firstelselast', '');
292  }
293  }
294  print '</td>';
295 
296  $actionstatic = $actioncomm;
297 
298  // Example: Email sent from invoice card
299  //$actionstatic->code = 'AC_BILL_SENTBYMAIL
300  //$actionstatic->type_code = 'AC_OTHER_AUTO'
301 
302  // Type
303  $labeltype = $actionstatic->type_code;
304  if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && empty($arraylist[$labeltype])) {
305  $labeltype = 'AC_OTH';
306  }
307  if (preg_match('/^TICKET_MSG/', $actionstatic->code)) {
308  $labeltype = $langs->trans("Message");
309  } else {
310  if (!empty($arraylist[$labeltype])) {
311  $labeltype = $arraylist[$labeltype];
312  }
313  if ($actionstatic->type_code == 'AC_OTH_AUTO' && ($actionstatic->type_code != $actionstatic->code) && $labeltype && !empty($arraylist[$actionstatic->code])) {
314  $labeltype .= ' - '.$arraylist[$actionstatic->code]; // Use code in priority on type_code
315  }
316  }
317  print '<td class="tdoverflowmax100" title="'.dol_escape_htmltag($labeltype).'">';
318  print $actioncomm->getTypePicto();
319  print $labeltype;
320  print '</td>';
321 
322  // Label
323  print '<td class="tdoverflowmax200" title="'.dol_escape_htmltag($actioncomm->label).'">'.$actioncomm->getNomUrl(0, 36).'</td>';
324 
325  // Date
326  print '<td class="center nowraponall">'.dol_print_date($actioncomm->datep, 'dayhour', 'tzuserrel');
327  if ($actioncomm->datef) {
328  $tmpa = dol_getdate($actioncomm->datep);
329  $tmpb = dol_getdate($actioncomm->datef);
330  if ($tmpa['mday'] == $tmpb['mday'] && $tmpa['mon'] == $tmpb['mon'] && $tmpa['year'] == $tmpb['year']) {
331  if ($tmpa['hours'] != $tmpb['hours'] || $tmpa['minutes'] != $tmpb['minutes']) {
332  print '-'.dol_print_date($actioncomm->datef, 'hour', 'tzuserrel');
333  }
334  } else {
335  print '-'.dol_print_date($actioncomm->datef, 'dayhour', 'tzuserrel');
336  }
337  }
338  print '</td>';
339  print '<td class="right">';
340  print $actioncomm->getLibStatut(3);
341  print '</td>';
342  print '</tr>';
343 
344  $cursorevent++;
345  }
346  } else {
347  print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("None").'</span></td></tr>';
348  }
349 
350  if ($max && $num > $max) {
351  print '<tr class="oddeven"><td colspan="6"><span class="opacitymedium">'.$langs->trans("More").'...</span></td></tr>';
352  }
353 
354  print '</table>';
355  print '</div>';
356  }
357 
358  return $num;
359  }
360 
361 
362  // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
376  public function select_type_actions($selected = '', $htmlname = 'actioncode', $excludetype = '', $onlyautoornot = 0, $hideinfohelp = 0, $multiselect = 0, $nooutput = 0, $morecss = 'minwidth300')
377  {
378  // phpcs:enable
379  global $langs, $user, $form, $conf;
380 
381  if (!is_object($form)) {
382  $form = new Form($this->db);
383  }
384 
385  require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
386  require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
387  $caction = new CActionComm($this->db);
388 
389  // Suggest a list with manual events or all auto events
390  $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.
391  if (empty($multiselect)) {
392  // Add empty line at start only if no multiselect
393  array_unshift($arraylist, '&nbsp;');
394  }
395  //asort($arraylist);
396 
397  if ($selected == 'manual') {
398  $selected = 'AC_OTH';
399  }
400  if ($selected == 'auto') {
401  $selected = 'AC_OTH_AUTO';
402  }
403 
404  if (!empty($conf->global->AGENDA_ALWAYS_HIDE_AUTO)) {
405  unset($arraylist['AC_OTH_AUTO']);
406  }
407 
408  $out = '';
409 
410  if (!empty($multiselect)) {
411  if (!is_array($selected) && !empty($selected)) {
412  $selected = explode(',', $selected);
413  }
414  $out .= $form->multiselectarray($htmlname, $arraylist, $selected, 0, 0, 'centpercent', 0, 0);
415  } else {
416  $out .= $form->selectarray($htmlname, $arraylist, $selected, 0, 0, 0, '', 0, 0, 0, '', $morecss, 1);
417  }
418 
419  if ($user->admin && empty($onlyautoornot) && $hideinfohelp <= 0) {
420  $out .= info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup").($hideinfohelp == -1 ? ". ".$langs->trans("YouCanSetDefaultValueInModuleSetup") : ''), 1);
421  }
422 
423  if ($nooutput) {
424  return $out;
425  } else {
426  print $out;
427  }
428  return '';
429  }
430 }
dol_getdate
dol_getdate($timestamp, $fast=false, $forcetimezone='')
Return an array with locale date info.
Definition: functions.lib.php:2816
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:5204
load_fiche_titre
load_fiche_titre($titre, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
Definition: functions.lib.php:5363
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:4994
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:2566
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:1455
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:172
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:11044
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:4950
newToken
newToken()
Return the value of token currently saved into session with name 'newtoken'.
Definition: functions.lib.php:11317
isModEnabled
isModEnabled($module)
Is Dolibarr module enabled.
Definition: functions.lib.php:147
User
Class to manage Dolibarr users.
Definition: user.class.php:44
Form
Class to manage generation of HTML components Only common components must be here.
Definition: html.form.class.php:52
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:376
dol_now
dol_now($mode='auto')
Return date for now.
Definition: functions.lib.php:2947
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