bugfixes:

- search was not searching in id, phone/email, location
- setting status or percent&date completed was not working for the responsible under some conditions
- for the conversation of days to hours always 8h were used, now that's the default if nothing is configured in the PM
enhancements - some might call bug-fixes too ;-):
- configuration of the rights of the responsible:
  a) implicit edit rights (default is only read)
  b) additional fields to edit without edit rights: eg. description, used time, ...
- user preference to show status and percent again as one merged icon (default) or as two spearate ones
- user preference to show a numeric Id, can be used eg. as ticket number
This commit is contained in:
Ralf Becker 2006-03-24 16:10:09 +00:00
parent 8010dab588
commit 7254bef473
11 changed files with 204 additions and 65 deletions

View File

@ -73,6 +73,14 @@
* @var array $config infolog configuration
*/
var $config;
/**
* @var array $responsible_edit=array('info_status','info_percent','info_datecompleted') fields the responsible user can change
*/
var $responsible_edit=array('info_status','info_percent','info_datecompleted');
/**
* @var string $implicit_rights='read' implicit ACL rights of the responsible user: read or edit
*/
var $implicit_rights='read';
/**
* Constructor Infolog BO
@ -160,8 +168,16 @@
{
$this->customfields = $this->config->config_data['customfields'];
}
$this->user = $GLOBALS['egw_info']['user']['account_id'];
if (count(explode(',',$this->config->config_data['responsible_edit'])))
{
$this->responsible_edit = array_merge($this->responsible_edit,explode(',',$this->config->config_data['responsible_edit']));
}
if ($this->config->config_data['implicit_rights'] == 'edit')
{
$this->implicit_rights = 'edit';
}
}
$this->user = $GLOBALS['egw_info']['user']['account_id'];
/**
* @var int $tz_offset_s offset in secconds between user and server-time,
* it need to be add to a server-time to get the user-time or substracted from a user-time to get the server-time
@ -218,7 +234,7 @@
{
return $cache[$info_id][$required_rights];
}
return $cache[$info_id][$required_rights] = $this->so->check_access( $info,$required_rights );
return $cache[$info_id][$required_rights] = $this->so->check_access( $info,$required_rights,$this->implicit_rights == 'edit' );
}
/**
@ -431,11 +447,12 @@
$backup_values = $values; // to return the full values
$values = array(
'info_id' => $values['info_id'],
'info_status' => $values['info_status'],
'info_percent' => $values['info_percent'],
'info_owner' => $values['info_owner'],
'info_datemodified' => $values['info_datemodified'],
);
foreach($this->responsible_edit as $name)
{
if (isset($backup_values[$name])) $values[$name] = $backup_values[$name];
}
if ($set_completed)
{
$values['info_datecompleted'] = $this->user_time_now;

View File

@ -57,9 +57,10 @@
*
* @param array/int $info data or info_id of InfoLog entry
* @param int $required_rights EGW_ACL_xyz anded together
* @param boolean $implicit_edit=false
* @return boolean True if access is granted else False
*/
function check_access( $info,$required_rights )
function check_access( $info,$required_rights,$implicit_edit=false )
{
if (is_array($info))
{
@ -86,7 +87,7 @@
// ACL only on public entrys || $owner granted _PRIVATE
(!!($this->grants[$owner] & $required_rights) ||
// implicite read-rights for responsible user !!!
in_array($this->user, $info['info_responsible']) && $required_rights == EGW_ACL_READ) &&
in_array($this->user, $info['info_responsible']) && ($required_rights == EGW_ACL_READ || $implicit_edit && $required_rights == EGW_ACL_EDIT)) &&
//$info['info_responsible'] == $this->user && $required_rights == EGW_ACL_READ) &&
($info['info_access'] == 'public' ||
!!($this->grants[$owner] & EGW_ACL_PRIVATE));
@ -550,11 +551,12 @@
{
$pattern = $this->db->quote('%'.$query['search'].'%');
$columns = array('info_from','info_subject','info_extra_value');
$columns = array('info_from','info_addr','info_location','info_subject','info_extra_value');
// at the moment MaxDB 7.5 cant cast nor search text columns, it's suppost to change in 7.6
if ($this->db->capabilities['like_on_text']) $columns[] = 'info_des';
$sql_query = 'AND ('.implode(" LIKE $pattern OR ",$columns)." LIKE $pattern) ";
$sql_query = 'AND ('.(is_numeric($query['search']) ? 'main.info_id='.(int)$query['search'].' OR ' : '').
implode(" LIKE $pattern OR ",$columns)." LIKE $pattern) ";
$join = "LEFT JOIN $this->extra_table ON main.info_id=$this->extra_table.info_id";
// mssql and others cant use DISTICT if text columns (info_des) are involved
$distinct = $this->db->capabilities['distinct_on_text'] ? 'DISTINCT' : '';

View File

@ -45,6 +45,10 @@
* @var bolink-object $link reference to instance of the link-class of bo
*/
var $link;
/**
* @var string $duration_format allowed units and hours per day, can be overwritten by the projectmanager configuration, default all units, 8h
*/
var $duration_format = ','; // comma is necessary!
function uiinfolog( )
{
@ -107,6 +111,14 @@
$this->prefs =& $GLOBALS['egw_info']['user']['preferences']['infolog'];
// read the duration format from project-manager
if ($GLOBALS['egw_info']['apps']['projectmanager'])
{
$pm_config =& CreateObject('phpgwapi.config','projectmanager');
$pm_config->read_repository();
$this->duration_format = str_replace(',','',$pm_config->config_data['duration_units']).','.$pm_config->config_data['hours_per_workday'];
unset($pm_config);
}
$GLOBALS['uiinfolog'] =& $this; // make ourself availible for ExecMethod of get_rows function
}
@ -130,6 +142,8 @@
$readonlys["edit[$id]"] = !$this->bo->check_access($info,EGW_ACL_EDIT);
$readonlys["close[$id]"] = $done || ($readonlys["edit_status[$id]"] = !($this->bo->check_access($info,EGW_ACL_EDIT) ||
in_array($this->user, (array)$info['info_responsible'])));
$readonlys["edit_status[$id]"] = $readonlys["edit_percent[$id]"] =
!$this->bo->check_access($info,EGW_ACL_EDIT) && !in_array($this->user, (array)$info['info_responsible']);
$readonlys["delete[$id]"] = !$this->bo->check_access($info,EGW_ACL_DELETE);
$readonlys["sp[$id]"] = !$this->bo->check_access($info,EGW_ACL_ADD);
$readonlys["view[$id]"] = $info['info_anz_subs'] < 1;
@ -166,7 +180,23 @@
}
$info['info_type_label'] = $this->bo->enums['type'][$info['info_type']];
$info['info_status_label'] = $this->bo->status[$info['info_type']][$info['info_status']];
if (!$this->prefs['show_percent'] || $show_links == 'no_describtion')
{
if ($info['info_status'] == 'ongoing' && $info['info_type'] != 'phone')
{
$info['info_status'] = $info['info_status_label'] = $info['info_percent'];
}
$readonlys["edit_percent[$id]"] = true;
}
elseif($readonlys["edit_percent[$id]"]) // show percent, but button is switched off
{
$info['info_percent2'] = $info['info_percent'];
}
if ($this->prefs['show_id'] && !$show_links == 'no_describtion')
{
$info['info_number'] = $info['info_id'];
}
return $info;
}
@ -225,8 +255,10 @@
$rows[] = $info;
}
if ($query['no_actions']) $rows['no_actions'] = true;
$rows['no_times'] = !$this->prefs['show_times'];
$rows['no_details'] = $query['filter2'] == 'no_describtion';
$rows['no_times'] = !$this->prefs['show_times'] || $query['filter2'] == 'no_describtion';
$rows['no_timesheet'] = !isset($GLOBALS['egw_info']['user']['apps']['timesheet']);
$rows['duration_format'] = ','.$this->duration_format.',,1';
//echo "<p>readonlys = "; _debug_array($readonlys);
//echo "rows=<pre>".print_r($rows,True)."</pre>\n";
@ -407,6 +439,7 @@
'info_id' => $info_id,
'info_status' => 'done',
'info_percent'=> 100,
'info_datecompleted' => $this->bo->now_su,
);
$this->bo->write($values);
@ -532,6 +565,7 @@
$content['info_link_id'] = 0; // as field has to be int
}
}
$active_tab = $content[$tabs];
if (!($info_id = $this->bo->write($content)))
{
$content['msg'] = $info_id !== 0 || !$content['info_id'] ? lang('Error: saving the entry') :
@ -551,6 +585,7 @@
$content['msg'] = lang('InfoLog entry saved');
$content['js'] = "opener.location.href='".($link=$GLOBALS['egw']->link($referer,array('msg' => $content['msg'])))."';";
}
$content[$tabs] = $active_tab;
if ((int) $content['pm_id'] != (int) $content['old_pm_id'])
{
//echo "<p>pm_id changed: $content[old_pm_id] -> $content[pm_id]</p>\n";
@ -676,7 +711,7 @@
*/
$content['info_type'] = $parent['info_type'];
$content['info_status'] = $this->bo->status['defaults'][$content['info_type']];
$content['info_percent'] = '0%';
$content['info_percent'] = $content['info_status'] == 'done' ? '100%' : '0%';
$content['info_confirm'] = 'not';
$content['info_subject']=lang($this->messages['re']).' '.$parent['info_subject'];
$content['info_des'] = '';
@ -692,34 +727,18 @@
}
else
{
if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT))
if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT) && !in_array($this->user, (array)$content['info_responsible']))
{
if (in_array($this->user, (array)$content['info_responsible']))
if ($no_popup)
{
$content['status_only'] = True;
foreach($content as $name => $value)
{
$readonlys[$name] = $name != 'info_status';
}
// need to set all customfields extra, as they are not set if empty
foreach($this->bo->customfields as $name => $value)
{
$readonlys['#'.$name] = true;
}
}
else // Permission denied
{
if ($no_popup)
{
$GLOBALS['egw']->common->egw_header();
parse_navbar();
echo '<p class="redItalic" align="center">'.lang('Permission denied')."</p>\n";
$GLOBALS['egw']->common->egw_exit();
}
$js = "alert('".lang('Permission denied')."'); window.close();";
echo '<html><body onload="'.$js.'"></body></html>';
$GLOBALS['egw']->common->egw_header();
parse_navbar();
echo '<p class="redItalic" align="center">'.lang('Permission denied')."</p>\n";
$GLOBALS['egw']->common->egw_exit();
}
$js = "alert('".lang('Permission denied')."'); window.close();";
echo '<html><body onload="'.$js.'"></body></html>';
$GLOBALS['egw']->common->egw_exit();
}
}
$content['links'] = $content['link_to'] = array(
@ -768,7 +787,7 @@
$content['info_type'] = $type;
}
$content['info_status'] = $this->bo->status['defaults'][$content['info_type']];
$content['info_percent'] = '0%';
$content['info_percent'] = $content['info_status'] == 'done' ? '100%' : '0%';
break;
}
if (!isset($this->bo->enums['type'][$content['info_type']]))
@ -776,6 +795,20 @@
$content['info_type'] = 'note';
}
}
// for implizit edit of responsible user make all fields readonly, but status and percent
if ($info_id && !$this->bo->check_access($info_id,EGW_ACL_EDIT) && in_array($this->user, (array)$content['info_responsible']))
{
$content['status_only'] = !in_array('link_to',$this->bo->responsible_edit);
foreach(array_diff(array_merge(array_keys($content),array('pm_id')),$this->bo->responsible_edit) as $name)
{
$readonlys[$name] = true;
}
// need to set all customfields extra, as they are not set if empty
foreach($this->bo->customfields as $name => $value)
{
$readonlys['#'.$name] = true;
}
}
// we allways need to set a non-empty/-zero primary, to make the radiobutton appear
$content['link_to']['primary'] = $content['info_link_id'] ? $content['info_link_id'] : '#';
@ -799,6 +832,8 @@
{
$readonlys[$tabs]['project'] = true; // disable the project tab
}
$content['duration_format'] = $this->duration_format;
$old_pm_id = is_array($pm_links) ? array_shift($pm_links) : $content['old_pm_id'];
if (!isset($content['pm_id']) && $old_pm_id) $content['pm_id'] = $old_pm_id;
@ -860,12 +895,19 @@
function admin( )
{
if(get_var('cancel',Array('POST')))
{
$GLOBALS['egw']->redirect_link('/admin/index.php');
}
if(get_var('save',Array('POST')))
$fields = array(
'info_cat' => 'Category',
'info_from' => 'Contact',
'info_addr' => 'Phone/Email',
'info_subject' => 'Subject',
'info_des' => 'Description',
'link_to' => 'Links',
'info_priority' => 'Priority',
'info_location' => 'Location',
'info_planned_time' => 'Planned time',
'info_used_time' => 'Used time',
);
if($_POST['save'] || $_POST['apply'])
{
$this->link_pathes = $this->bo->send_file_ips = array();
@ -880,14 +922,26 @@
$this->bo->send_file_ips[$val] = stripslashes($ip[$key]);
}
}
$this->bo->responsible_edit = array('info_status','info_percent','info_datecompleted');
if ($_POST['responsible_edit'])
{
$extra = array_intersect($_POST['responsible_edit'],array_keys($fields));
$this->bo->responsible_edit = array_merge($this->bo->responsible_edit,$extra);
}
$this->bo->implicit_rights = $_POST['implicit_rights'] == 'edit' ? 'edit' : 'read';
$this->bo->config->config_data = array(
'link_pathes' => $this->link_pathes,
'send_file_ips' => $this->bo->send_file_ips
'send_file_ips' => $this->bo->send_file_ips,
'implicit_rights' => $this->bo->implicit_rights,
'responsible_edit' => implode(',',$extra),
);
$this->bo->config->save_repository(True);
}
if($_POST['cancel'] || $_POST['save'])
{
$GLOBALS['egw']->redirect_link('/admin/index.php');
}
$GLOBALS['egw_info']['flags']['css'] = $this->html->theme2css();
$GLOBALS['egw_info']['flags']['app_header'] = lang('InfoLog').' - '.lang('Configuration');
$GLOBALS['egw']->common->egw_header();
@ -896,10 +950,19 @@
$GLOBALS['egw']->template->set_block('info_admin_t', 'info_admin');
$GLOBALS['egw']->template->set_var(Array(
'lang_responsible_rights' => lang('Rights for the responsible'),
'lang_implicit_rights' => lang('Which implicit ACL rights should the responsible get?'),
'implicit_rights' => $this->html->select('implicit_rights',$this->bo->implicit_rights,array(
'read' => 'read rights (default)',
'edit' => 'edit rights (full edit rights incl. making someone else responsible!)',
)),
'lang_responsible_edit' => lang('Which additional fields should the responsible be allowed to edit without having edit rights?<br />Status, percent and date completed are always allowed.'),
'responsible_edit' => $this->html->checkbox_multiselect('responsible_edit',$this->bo->responsible_edit,$fields,false,'',11),
'text' => lang('<b>file-attachments via symlinks</b> instead of uploads and retrieval via file:/path for direct lan-clients'),
'action_url' => $this->html->link('/index.php',$this->menuaction('admin')),
'save_button' => $this->html->submit_button('save','Save'),
'done_button' => $this->html->submit_button('cancel','Cancel'),
'apply_button' => $this->html->submit_button('apply','Apply'),
'cancel_button' => $this->html->submit_button('cancel','Cancel'),
'lang_valid' => lang('valid path on clientside<br>eg. \\\\Server\\Share or e:\\'),
'lang_trans' => lang('path on (web-)serverside<br>eg. /var/samba/Share'),
'lang_ip' => lang('reg. expr. for local IP\'s<br>eg. ^192\\.168\\.1\\.')

View File

@ -32,7 +32,6 @@
'none' => lang('no links or attachments'),
'no_describtion' => lang('no describtion, links or attachments'),
);
/* Settings array for this app */
$GLOBALS['settings'] = array(
'homeShowEvents' => array(
@ -96,6 +95,22 @@
'xmlrpc' => True,
'admin' => False
),
'show_percent' => array(
'type' => 'check',
'label' => 'Show status and percent done separate',
'name' => 'show_percent',
'help' => 'Should the Infolog list show the percent done only for status ongoing or two separate icons.',
'xmlrpc' => True,
'admin' => False
),
'show_id' => array(
'type' => 'check',
'label' => 'Show ticket Id',
'name' => 'show_id',
'help' => 'Should the Infolog list show a unique numerical Id, which can be used eg. as ticket Id.',
'xmlrpc' => True,
'admin' => False
),
'set_start' => array(
'type' => 'select',
'label' => 'Startdate for new entries',

File diff suppressed because one or more lines are too long

View File

@ -98,6 +98,7 @@ duration infolog de Dauer
each value is a line like <id>[=<label>] infolog de jeder Wert ist eine Zeile im Format id=[angezeigter Wert]
edit infolog de Bearbeiten
edit or create categories for ingolog infolog de Kategorien für InfoLog bearbeiten oder neu anlegen
edit rights (full edit rights incl. making someone else responsible!) infolog de Bearbeitungsrechte (komplettes Bearbeiten einsch. jemand anderen dafür verantwortlich machen!)
edit status infolog de Status ändern
edit the entry infolog de Eintrag bearbeiten
edit this entry infolog de diesen Eintrag bearbeiten
@ -204,6 +205,7 @@ project infolog de Projekt
project settings: price, times infolog de Einstellungen zum Projekt: Preis, Zeiten
re: infolog de Re:
read one record by passing its id. infolog de Einen Datensatz spezifiziert durch seine id lesen.
read rights (default) infolog de Leserechte (Vorgabe)
reg. expr. for local ip's<br>eg. ^192\.168\.1\. infolog de reg. Ausdr. für lokale IP's<br>^192\.168\.1\.
remark infolog de Bemerkung
remove this link (not the entry itself) infolog de Diese Verknüpfung lösen (nicht den Eintrag selbst)
@ -213,6 +215,7 @@ responsible overdue infolog de verantwortlich
responsible upcoming infolog de verantwortlich zufünftig
responsible user, priority infolog de Verantwortlicher, Priorität
returns a list / search for records. infolog de Liefert eine Liste von / sucht nach Datensätzen.
rights for the responsible infolog de Rechte für den Verantwortlichen
save infolog de Speichern
saves the changes made and leaves infolog de speichert die Änderungen und beendet
saves this entry infolog de diesen Eintrag speichern
@ -234,12 +237,16 @@ should infolog display your open entries - not finished tasks, phonecalls or not
should infolog show subtasks, -calls or -notes in the normal view or not. you can always view the subs via there parent. infolog de Soll InfoLog Untereinträge in der normalen Ansicht anzeigen oder nicht. Sie können die Untereinträge immer über deren Haupteintrag anzeigen.
should infolog show the links to other applications and/or the file-attachments in the infolog list (normal view when you enter infolog). infolog de Soll InfoLog die Verknüpfungen zu anderen Anwendungen und/oder die Datei-Anhänge in der InfoLog Liste (normale Ansicht wenn InfoLog aufgerufen wird) anzeigen.
should infolog use full names (surname and familyname) or just the loginnames. infolog de Soll InfoLog den vollen Namen (Vor- und Familienname) oder nur die Benutzerkennung verwenden.
should the infolog list show a unique numerical id, which can be used eg. as ticket id. infolog de Soll die InfoLog Liste eine eindeutige Nummer anzeigen, die zB. als Ticketnummer verwendet werden kann.
should the infolog list show the percent done only for status ongoing or two separate icons. infolog de Soll die InfoLog Liste Prozent erledigt nur für den Status "in Arbeit" anzeigen oder zwei separate Icons.
should this entry only be visible to you and people you grant privat access via the acl infolog de soll dieser Eintrag nur sichtbar sein für Sie und Personen denen Sie privaten Zugriff über die ACL erlaubt haben
show a column for used and planned times in the list. infolog de Zeige eine Spalte für benutzte und geplante Zeiten in der List.
show full usernames infolog de Kompletten Benutzernamen anzeigen
show in the infolog list infolog de In der InfoLog Liste anzeigen
show list of upcoming entries infolog de Liste zukünftiger Einträge anzeigen
show open entries: tasks/calls/notes on main screen infolog de Nicht erledigte Einträge: Aufgaben/Anrufe/Notizen auf Startseite anzeigen
show status and percent done separate infolog de Status und Prozent erledigt separat anzeigen
show ticket id infolog de Ticketnummer anzeigen
show times infolog de Zeiten anzeigen
small view infolog de schmale Ansicht
start a new search, cancel this link infolog de eine neue Suche starten, diese Verknüpfung abbrechen
@ -285,6 +292,8 @@ view subs infolog de Untereintr
view the parent of this entry and all his subs infolog de übergeordneter Eintrag mit allen seinen Untereinträgen anzeigen
view this linked entry in its application infolog de diesen verknüpfen Eintrag in seiner Anwendung anzeigen
when should the todo or phonecall be started, it shows up from that date in the filter open or own open (startpage) infolog de wann soll mit dem Auftrag oder Anruf begonnen werden, ab diesem Datum wird er beim Filter offen oder eigene offen angezeigt (Startseite)
which additional fields should the responsible be allowed to edit without having edit rights?<br />status, percent and date completed are always allowed. infolog de Welche zusätzlichen Felder soll der Verantwortliche bearbeiten können ohne Bearbeitungsrechte zu haben?<br />Status, Prozent und Datum erledigt sind immer erlaubt.
which implicit acl rights should the responsible get? infolog de Welche impliziten Zugriffsrechte soll der Verantwortliche bekommen?
will-call infolog de ruft zurück
write (add or update) a record by passing its fields. infolog de Schreiben (zufügen oder aktualisieren) eines Datensatzes durch Angabe seiner Felder.
yes - delete infolog de Ja - Löschen

View File

@ -98,6 +98,7 @@ duration infolog en Duration
each value is a line like <id>[=<label>] infolog en each value is a line like <id>[=<label>]
edit infolog en Edit
edit or create categories for ingolog infolog en Edit or create categories for IngoLog
edit rights (full edit rights incl. making someone else responsible!) infolog en edit rights (full edit rights incl. making someone else responsible!)
edit status infolog en Edit status
edit the entry infolog en Edit the entry
edit this entry infolog en Edit this entry
@ -204,6 +205,7 @@ project infolog en Project
project settings: price, times infolog en Project settings: price, times
re: infolog en Re:
read one record by passing its id. infolog en Read one record by passing its id.
read rights (default) infolog en read rights (default)
reg. expr. for local ip's<br>eg. ^192\.168\.1\. infolog en reg. expr. for local IP's<br>eg. ^192\.168\.1\.
remark infolog en Remark
remove this link (not the entry itself) infolog en Remove this link (not the entry itself)
@ -213,6 +215,7 @@ responsible overdue infolog en responsible overdue
responsible upcoming infolog en responsible upcoming
responsible user, priority infolog en responsible user, priority
returns a list / search for records. infolog en Returns a list / search for records.
rights for the responsible infolog en Rights for the responsible
save infolog en Save
saves the changes made and leaves infolog en saves the changes made and leaves
saves this entry infolog en Saves this entry
@ -234,12 +237,16 @@ should infolog display your open entries - not finished tasks, phonecalls or not
should infolog show subtasks, -calls or -notes in the normal view or not. you can always view the subs via there parent. infolog en Should InfoLog show Subtasks, -calls or -notes in the normal view or not. You can always view the subs via their parent.
should infolog show the links to other applications and/or the file-attachments in the infolog list (normal view when you enter infolog). infolog en Should InfoLog show the links to other applications and/or the file-attachments in the InfoLog list (normal view when you enter InfoLog).
should infolog use full names (surname and familyname) or just the loginnames. infolog en Should InfoLog use full names (surname and familyname) or just the loginnames.
should the infolog list show a unique numerical id, which can be used eg. as ticket id. infolog en Should the Infolog list show a unique numerical Id, which can be used eg. as ticket Id.
should the infolog list show the percent done only for status ongoing or two separate icons. infolog en Should the Infolog list show the percent done only for status ongoing or two separate icons.
should this entry only be visible to you and people you grant privat access via the acl infolog en should this entry only be visible to you and people you grant privat access via the ACL
show a column for used and planned times in the list. infolog en Show a column for used and planned times in the list.
show full usernames infolog en Show full usernames
show in the infolog list infolog en Show in the InfoLog list
show list of upcoming entries infolog en show list of upcoming entries
show open entries: tasks/calls/notes on main screen infolog en Show open entries: Tasks/Calls/Notes on main screen
show status and percent done separate infolog en Show status and percent done separate
show ticket id infolog en Show ticket Id
show times infolog en Show times
small view infolog en small view
start a new search, cancel this link infolog en start a new search, cancel this link
@ -285,6 +292,8 @@ view subs infolog en view Subs
view the parent of this entry and all his subs infolog en View the parent of this entry and all his subs
view this linked entry in its application infolog en view this linked entry in its application
when should the todo or phonecall be started, it shows up from that date in the filter open or own open (startpage) infolog en when should the ToDo or Phone call be started, it shows up from that date in the filter open or own open (startpage)
which additional fields should the responsible be allowed to edit without having edit rights?<br />status, percent and date completed are always allowed. infolog en Which additional fields should the responsible be allowed to edit without having edit rights?<br />Status, percent and date completed are always allowed.
which implicit acl rights should the responsible get? infolog en Which implicit ACL rights should the responsible get?
will-call infolog en will call
write (add or update) a record by passing its fields. infolog en Write (add or update) a record by passing its fields.
yes - delete infolog en Yes - Delete

View File

@ -11,6 +11,20 @@
<br>
<form action="{action_url}" method="POST">
<table border="0">
<tr class="th">
<td colspan="4"><b>{lang_responsible_rights}</b></td>
</tr>
<tr class="row_off">
<td colspan="3">{lang_implicit_rights}</td>
<td>{implicit_rights}</td>
</tr>
<tr class="row_on">
<td colspan="3">{lang_responsible_edit}</td>
<td>{responsible_edit}</td>
</tr>
<tr class="row_off">
<td colspan="4">&nbsp;</td>
</tr>
<tr class="th">
<td colspan="4">{text}</td>
</tr>
@ -23,7 +37,7 @@
{admin_lines}
<tr>
<td colspan="4" align="left">
{save_button} &nbsp; {done_button}
{save_button} &nbsp; {apply_button} &nbsp; {cancel_button}
</td>
</tr>
</table>

View File

@ -12,3 +12,5 @@
.overdue { color:#cc0000; font-weight:bold; }
.private { font-style:italic; }
.planned { font-style:italic; }
.fullWidth table { width: 100%; }
.infoId:before { content:"#" }

View File

@ -99,7 +99,7 @@
</row>
<row class="row">
<description options=",,,info_planned_time" value="planned time"/>
<date-duration id="info_planned_time"/>
<date-duration id="info_planned_time" options=",$cont[duration_format]"/>
</row>
<row class="row" valign="top" height="60%">
<description options=",,,info_used_time" value="used time"/>

View File

@ -57,11 +57,15 @@
<hbox align="center" orient=",5">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status_label]" ro_image="$row_cont[info_status_label]" label="$row_cont[info_status_label]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<button image="$row_cont[info_percent]" ro_image="$row_cont[info_percent]" label="$row_cont[info_percent]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<button image="$row_cont[info_percent]" label="$row_cont[info_percent]" id="edit_percent[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<image label="$row_cont[info_percent2]" src="{$row}[info_percent2]" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox orient="0,0">
<vbox class="fullWidth" orient="0,0">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<hbox orient=",0,0">
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description no_lang="1" align="right" id="{$row}[info_number]" class="infoId"/>
</hbox>
<description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
</vbox>
@ -71,9 +75,9 @@
<date-time id="${row}[info_datecompleted]" readonly="true"/>
</vbox>
<vbox data="" rows="3" cols="1">
<date-duration id="${row}[info_used_time]" readonly="true" options=",,,,1"/>
<date-duration id="${row}[info_sum_timesheets]" readonly="true" options=",,,,1" class="timesheet"/>
<date-duration id="${row}[info_planned_time]" span="all" class="planned" readonly="true" options=",,,,1"/>
<date-duration id="${row}[info_used_time]" readonly="true" options="@duration_format"/>
<date-duration id="${row}[info_sum_timesheets]" readonly="true" options="@duration_format" class="timesheet"/>
<date-duration id="${row}[info_planned_time]" span="all" class="planned" readonly="true" options="@duration_format"/>
</vbox>
<vbox orient="0,0">
<menulist>
@ -158,11 +162,15 @@
<hbox align="center" orient=",5">
<image label="$row_cont[info_type]" src="${row}[info_type]"/>
<button image="$row_cont[info_status_label]" ro_image="$row_cont[info_status_label]" label="$row_cont[info_status_label]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<button image="$row_cont[info_percent]" ro_image="$row_cont[info_percent]" label="$row_cont[info_percent]" id="edit_status[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<button image="$row_cont[info_percent]" label="$row_cont[info_percent]" id="edit_percent[$row_cont[info_id]]" statustext="Change the status of an entry, eg. close it" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<image label="$row_cont[info_percent2]" src="{$row}[info_percent2]" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;info_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
</hbox>
<vbox orient="0,0">
<vbox class="fullWidth" orient="0,0">
<link label="%s $row_cont[info_addr]" id="${row}[info_link]" options="b"/>
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<hbox orient=",0,0">
<description class="$row_cont[sub_class]" no_lang="1" id="${row}[info_subject]"/>
<description no_lang="1" align="right" id="{$row}[info_number]" class="infoId"/>
</hbox>
<description options=",,1" no_lang="1" id="${row}[info_des]"/>
<link-string id="${row}[filelinks]"/>
</vbox>
@ -172,9 +180,9 @@
<date-time id="${row}[info_datecompleted]" readonly="true"/>
</vbox>
<vbox data="" rows="3" cols="1" options="3">
<date-duration id="${row}[info_used_time]" readonly="true" options=",,,,1"/>
<date-duration id="${row}[info_sum_timesheets]" readonly="true" options=",,,,1" class="timesheet"/>
<date-duration id="${row}[info_planned_time]" span="all" class="planned" readonly="true" options=",,,,1"/>
<date-duration id="${row}[info_used_time]" readonly="true" options="@duration_format"/>
<date-duration id="${row}[info_sum_timesheets]" readonly="true" options="@duration_format" class="timesheet"/>
<date-duration id="${row}[info_planned_time]" span="all" class="planned" readonly="true" options="@duration_format"/>
</vbox>
<vbox orient="0,0">
<menulist>