added ability to add timesheets to infolog entries

This commit is contained in:
Ralf Becker 2006-03-21 13:52:49 +00:00
parent 2362499507
commit 6c4cda6bfc
12 changed files with 104 additions and 38 deletions

View File

@ -134,19 +134,34 @@
$readonlys["sp[$id]"] = !$this->bo->check_access($info,EGW_ACL_ADD); $readonlys["sp[$id]"] = !$this->bo->check_access($info,EGW_ACL_ADD);
$readonlys["view[$id]"] = $info['info_anz_subs'] < 1; $readonlys["view[$id]"] = $info['info_anz_subs'] < 1;
$readonlys['view[0]'] = True; // no parent $readonlys['view[0]'] = True; // no parent
$readonlys["timesheet[$id]"] = !$this->prefs['show_times'] || !isset($GLOBALS['egw_info']['user']['apps']['timesheet']);
if (!$show_links) $show_links = $this->prefs['show_links']; if (!$show_links) $show_links = $this->prefs['show_links'];
if ($show_links != 'none' && $show_links != 'no_describtion' && ($links = $this->link->get_links('infolog',$info['info_id']))) if (($show_links != 'none' && $show_links != 'no_describtion' ||
$this->prefs['show_times'] && isset($GLOBALS['egw_info']['user']['apps']['timesheet'])) &&
($links = $this->link->get_links('infolog',$info['info_id'])))
{ {
$timesheets = array();
foreach ($links as $link) foreach ($links as $link)
{ {
if ($link['link_id'] != $info['info_link_id'] && if ($show_links != 'none' && $show_links != 'no_describtion' &&
$link['link_id'] != $info['info_link_id'] &&
($link['app'] != $action || $link['id'] != $action_id) && ($link['app'] != $action || $link['id'] != $action_id) &&
($show_links == 'all' || ($show_links == 'links') === ($link['app'] != $this->link->vfs_appname))) ($show_links == 'all' || ($show_links == 'links') === ($link['app'] != $this->link->vfs_appname)))
{ {
$info['filelinks'][] = $link; $info['filelinks'][] = $link;
} }
if (!$info['pm_id'] && $link['app'] == 'projectmanager')
{
$info['pm_id'] = $link['id'];
}
if ($link['app'] == 'timesheet') $timesheets[] = $link['id'];
}
if ($this->prefs['show_times'] && isset($GLOBALS['egw_info']['user']['apps']['timesheet']) && $timesheets)
{
$sum = ExecMethod('timesheet.botimesheet.sum',$timesheets);
$info['info_sum_timesheets'] = $sum['duration'];
} }
} }
$info['info_type_label'] = $this->bo->enums['type'][$info['info_type']]; $info['info_type_label'] = $this->bo->enums['type'][$info['info_type']];
@ -210,7 +225,8 @@
$rows[] = $info; $rows[] = $info;
} }
if ($query['no_actions']) $rows['no_actions'] = true; if ($query['no_actions']) $rows['no_actions'] = true;
if ($query['no_times']) $rows['no_times'] = true; $rows['no_times'] = !$this->prefs['show_times'];
$rows['no_timesheet'] = !isset($GLOBALS['egw_info']['user']['apps']['timesheet']);
//echo "<p>readonlys = "; _debug_array($readonlys); //echo "<p>readonlys = "; _debug_array($readonlys);
//echo "rows=<pre>".print_r($rows,True)."</pre>\n"; //echo "rows=<pre>".print_r($rows,True)."</pre>\n";
@ -361,7 +377,6 @@
$values['nm']['bottom_too'] = True; $values['nm']['bottom_too'] = True;
$values['nm']['never_hide'] = isset($this->prefs['never_hide']) ? $values['nm']['never_hide'] = isset($this->prefs['never_hide']) ?
$this->prefs['never_hide'] : $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'] > 15; $this->prefs['never_hide'] : $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs'] > 15;
$values['nm']['no_times'] = !$this->prefs['show_times'];
$values['action'] = $persist['action'] = $values['nm']['action'] = $action; $values['action'] = $persist['action'] = $values['nm']['action'] = $action;
$values['action_id'] = $persist['action_id'] = $values['nm']['action_id'] = $action_id; $values['action_id'] = $persist['action_id'] = $values['nm']['action_id'] = $action_id;
$persist['called_as'] = $called_as; $persist['called_as'] = $called_as;

File diff suppressed because one or more lines are too long

View File

@ -27,6 +27,7 @@ add a new sub-task, -note, -call to this entry infolog de einen neuen Unterauftr
add a new todo infolog de einen neuen Auftrag anlegen add a new todo infolog de einen neuen Auftrag anlegen
add file infolog de Datei zufügen add file infolog de Datei zufügen
add sub infolog de neuen Untereintrag anlegen add sub infolog de neuen Untereintrag anlegen
add timesheet entry infolog de Stundenzettel Eintrag hinzfügen
add: infolog de Hinzufügen: add: infolog de Hinzufügen:
all infolog de alle all infolog de alle
all links and attachments infolog de alle Verknüpfungen und Anhänge all links and attachments infolog de alle Verknüpfungen und Anhänge
@ -101,8 +102,8 @@ edit status infolog de Status
edit the entry infolog de Eintrag bearbeiten edit the entry infolog de Eintrag bearbeiten
edit this entry infolog de diesen Eintrag bearbeiten edit this entry infolog de diesen Eintrag bearbeiten
empty for all infolog de leer für alle empty for all infolog de leer für alle
enddate infolog de Enddatum enddate infolog de Fällig am
enddate can not be before startdate infolog de Das Enddatum kann nicht vor dem Startdatum liegen enddate can not be before startdate infolog de Das Fälligkeitsdatum kann nicht vor dem Startdatum liegen
enter a custom contact, leave empty if linked entry should be used infolog de benutzerdefinierter Kontakt, leer lassen um die Daten der Verknüpfung zu verwenden enter a custom contact, leave empty if linked entry should be used infolog de benutzerdefinierter Kontakt, leer lassen um die Daten der Verknüpfung zu verwenden
enter a custom phone/email, leave empty if linked entry should be used infolog de benutzerdefinierte Telefonnumer/Emailadresse, leer lassen um die Daten der Verknüpfung zu verwenden enter a custom phone/email, leave empty if linked entry should be used infolog de benutzerdefinierte Telefonnumer/Emailadresse, leer lassen um die Daten der Verknüpfung zu verwenden
enter a textual description of the log-entry infolog de geben Sie eine textliche Beschreibung des Eintrags ein enter a textual description of the log-entry infolog de geben Sie eine textliche Beschreibung des Eintrags ein
@ -243,7 +244,7 @@ show times infolog de Zeiten anzeigen
small view infolog de schmale Ansicht small view infolog de schmale Ansicht
start a new search, cancel this link infolog de eine neue Suche starten, diese Verknüpfung abbrechen start a new search, cancel this link infolog de eine neue Suche starten, diese Verknüpfung abbrechen
startdate infolog de Startdatum startdate infolog de Startdatum
startdate enddate infolog de Startdatum Endedatum startdate enddate infolog de Startdatum Fälligkeitsdatum
startdate for new entries infolog de Startdatum für neue Einträge startdate for new entries infolog de Startdatum für neue Einträge
startrecord infolog de Startdatensatz startrecord infolog de Startdatensatz
status infolog de Status status infolog de Status
@ -289,7 +290,7 @@ write (add or update) a record by passing its fields. infolog de Schreiben (zuf
yes - delete infolog de Ja - Löschen yes - delete infolog de Ja - Löschen
yes - delete including sub-entries infolog de Ja - Löschen einschließlich Untereinträge yes - delete including sub-entries infolog de Ja - Löschen einschließlich Untereinträge
you can't delete one of the stock types !!! infolog de Sie können keinen der Standardtypen löschen!!! you can't delete one of the stock types !!! infolog de Sie können keinen der Standardtypen löschen!!!
you have entered an invalid ending date infolog de Sie haben ein ungültiges Enddatum eingegeben you have entered an invalid ending date infolog de Sie haben ein ungültiges Fälligkeitsdatum eingegeben
you have entered an invalid starting date infolog de Sie haben ein ungültiges Startdatum eingegeben you have entered an invalid starting date infolog de Sie haben ein ungültiges Startdatum eingegeben
you have to enter a name, to create a new typ!!! infolog de Sie müssen einen Namen angeben, um einen neuen Typ zu erzeugen!!! you have to enter a name, to create a new typ!!! infolog de Sie müssen einen Namen angeben, um einen neuen Typ zu erzeugen!!!
you must enter a subject or a description infolog de Sie müssen einen Titel oder eine Beschreibung eingeben you must enter a subject or a description infolog de Sie müssen einen Titel oder eine Beschreibung eingeben

View File

@ -27,6 +27,7 @@ add a new sub-task, -note, -call to this entry infolog en Add a new sub-task, -n
add a new todo infolog en Add a new ToDo add a new todo infolog en Add a new ToDo
add file infolog en Add file add file infolog en Add file
add sub infolog en add Sub add sub infolog en add Sub
add timesheet entry infolog en Add timesheet entry
add: infolog en Add: add: infolog en Add:
all infolog en All all infolog en All
all links and attachments infolog en all links and attachments all links and attachments infolog en all links and attachments
@ -97,12 +98,12 @@ duration infolog en Duration
each value is a line like <id>[=<label>] infolog en each value is a line like <id>[=<label>] each value is a line like <id>[=<label>] infolog en each value is a line like <id>[=<label>]
edit infolog en Edit edit infolog en Edit
edit or create categories for ingolog infolog en Edit or create categories for IngoLog edit or create categories for ingolog infolog en Edit or create categories for IngoLog
edit status infolog en Edit Status edit status infolog en Edit status
edit the entry infolog en Edit the entry edit the entry infolog en Edit the entry
edit this entry infolog en Edit this entry edit this entry infolog en Edit this entry
empty for all infolog en empty for all empty for all infolog en empty for all
enddate infolog en End Date enddate infolog en Due date
enddate can not be before startdate infolog en End date can not be before start date enddate can not be before startdate infolog en Due date can not be before start date
enter a custom contact, leave empty if linked entry should be used infolog en enter a custom contact, leave empty if linked entry should be used enter a custom contact, leave empty if linked entry should be used infolog en enter a custom contact, leave empty if linked entry should be used
enter a custom phone/email, leave empty if linked entry should be used infolog en enter a custom phone/email, leave empty if linked entry should be used enter a custom phone/email, leave empty if linked entry should be used infolog en enter a custom phone/email, leave empty if linked entry should be used
enter a textual description of the log-entry infolog en enter a textual description of the log-entry enter a textual description of the log-entry infolog en enter a textual description of the log-entry
@ -243,7 +244,7 @@ show times infolog en Show times
small view infolog en small view small view infolog en small view
start a new search, cancel this link infolog en start a new search, cancel this link start a new search, cancel this link infolog en start a new search, cancel this link
startdate infolog en Start Date startdate infolog en Start Date
startdate enddate infolog en Start Date End Date startdate enddate infolog en Start Date Due Date
startdate for new entries infolog en Startdate for new entries startdate for new entries infolog en Startdate for new entries
startrecord infolog en Startrecord startrecord infolog en Startrecord
status infolog en Status status infolog en Status
@ -289,7 +290,7 @@ write (add or update) a record by passing its fields. infolog en Write (add or u
yes - delete infolog en Yes - Delete yes - delete infolog en Yes - Delete
yes - delete including sub-entries infolog en Yes - Delete including sub-entries yes - delete including sub-entries infolog en Yes - Delete including sub-entries
you can't delete one of the stock types !!! infolog en You can't delete one of the stock types !!! you can't delete one of the stock types !!! infolog en You can't delete one of the stock types !!!
you have entered an invalid ending date infolog en You have entered an invalid ending date you have entered an invalid ending date infolog en You have entered an invalid due date
you have entered an invalid starting date infolog en You have entered an invalid starting date you have entered an invalid starting date infolog en You have entered an invalid starting date
you have to enter a name, to create a new typ!!! infolog en You have to enter a name, to create a new type!!! you have to enter a name, to create a new typ!!! infolog en You have to enter a name, to create a new type!!!
you must enter a subject or a description infolog en You must enter a subject or a description you must enter a subject or a description infolog en You must enter a subject or a description

View File

@ -11,4 +11,4 @@
.urgent_done { color:#800080; } .urgent_done { color:#800080; }
.overdue { color:#cc0000; font-weight:bold; } .overdue { color:#cc0000; font-weight:bold; }
.private { font-style:italic; } .private { font-style:italic; }
.planned { font-style:italic; } .planned { font-style:italic; }

View File

@ -198,7 +198,7 @@
</menulist> </menulist>
</row> </row>
<row class="row"> <row class="row">
<description options=",,,info_datecompleted" value="Completed"/> <description options=",,,info_datecompleted" value="Date completed"/>
<date-time id="info_datecompleted" statustext="Date completed (leave it empty to have it automatic set if status is done or billed)"/> <date-time id="info_datecompleted" statustext="Date completed (leave it empty to have it automatic set if status is done or billed)"/>
<description value="Private" options=",,,info_access"/> <description value="Private" options=",,,info_access"/>
<checkbox options="private,public" id="info_access" statustext="should this entry only be visible to you and people you grant privat access via the ACL"/> <checkbox options="private,public" id="info_access" statustext="should this entry only be visible to you and people you grant privat access via the ACL"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 875 B

View File

@ -13,7 +13,7 @@
<button image="note" label="Note" id="add[note]" statustext="Add a new Note" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;type=note&amp;action=$cont[action]&amp;action_id=$cont[action_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/> <button image="note" label="Note" id="add[note]" statustext="Add a new Note" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;type=note&amp;action=$cont[action]&amp;action_id=$cont[action_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
</hbox> </hbox>
</template> </template>
<template id="infolog.index.rows-noheader" template="" lang="" group="0" version="1.2.002"> <template id="infolog.index.rows-noheader" template="" lang="" group="0" version="1.2.003">
<grid> <grid>
<columns> <columns>
<column width="2%"/> <column width="2%"/>
@ -70,9 +70,10 @@
<date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/> <date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/>
<date-time id="${row}[info_datecompleted]" readonly="true"/> <date-time id="${row}[info_datecompleted]" readonly="true"/>
</vbox> </vbox>
<vbox> <vbox data="" rows="3" cols="1">
<date-duration id="${row}[info_used_time]" readonly="true" options=",,,,1"/> <date-duration id="${row}[info_used_time]" readonly="true" options=",,,,1"/>
<date-duration id="${row}[info_planned_time]" class="planned" 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"/>
</vbox> </vbox>
<vbox orient="0,0"> <vbox orient="0,0">
<menulist> <menulist>
@ -90,6 +91,7 @@
<button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/> <button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/> <button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/> <button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
<button image="timesheet" label="Add timesheet entry" id="timesheet[$row_cont[info_id]]" onclick="window.open(egw::link('/index.php','menuaction=timesheet.uitimesheet.edit&amp;link_app[0]=infolog&amp;link_id[0]=$row_cont[info_id]&amp;link_app[1]=projectmanager&amp;link_id[1]=$row_cont[pm_id]'),'_blank','dependent=yes,width=600,height=400,scrollbars=yes,status=yes'); return false;" align="center"/>
</vbox> </vbox>
<hbox> <hbox>
<button image="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" 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="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" 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;"/>
@ -100,7 +102,7 @@
</rows> </rows>
</grid> </grid>
</template> </template>
<template id="infolog.index.rows" template="" lang="" group="0" version="1.2.002"> <template id="infolog.index.rows" template="" lang="" group="0" version="1.2.003">
<grid> <grid>
<columns> <columns>
<column width="2%"/> <column width="2%"/>
@ -140,7 +142,7 @@
<nextmatch-sortheader label="Enddate" id="info_enddate"/> <nextmatch-sortheader label="Enddate" id="info_enddate"/>
<nextmatch-sortheader id="info_datecompleted" label="Date completed"/> <nextmatch-sortheader id="info_datecompleted" label="Date completed"/>
</vbox> </vbox>
<vbox> <vbox data="" rows="2" cols="1" options="2">
<nextmatch-sortheader label="Times" id="info_used_time"/> <nextmatch-sortheader label="Times" id="info_used_time"/>
<nextmatch-sortheader id="info_planned_time" class="planned" label="planned"/> <nextmatch-sortheader id="info_planned_time" class="planned" label="planned"/>
</vbox> </vbox>
@ -169,9 +171,10 @@
<date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/> <date class="$row_cont[end_class]" id="${row}[info_enddate]" readonly="true"/>
<date-time id="${row}[info_datecompleted]" readonly="true"/> <date-time id="${row}[info_datecompleted]" readonly="true"/>
</vbox> </vbox>
<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_used_time]" readonly="true" options=",,,,1"/>
<date-duration id="${row}[info_planned_time]" class="planned" 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"/>
</vbox> </vbox>
<vbox orient="0,0"> <vbox orient="0,0">
<menulist> <menulist>
@ -189,6 +192,7 @@
<button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/> <button image="new" label="Add sub" align="center" id="sp[$row_cont[info_id]]" statustext="Add a new sub-task, -note, -call to this entry" onclick="window.open(egw::link('/index.php','menuaction=infolog.uiinfolog.edit&amp;action=sp&amp;action_id=$row_cont[info_id]'),'_blank','dependent=yes,width=750,height=600,scrollbars=yes,status=yes'); return false;"/>
<button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/> <button image="view.gif" label="View subs" align="center" id="view[$row_cont[info_id]]" statustext="View all subs of this entry"/>
<button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/> <button image="parent.gif" label="View parent" align="center" id="view[$row_cont[info_id_parent]]" statustext="View the parent of this entry and all his subs"/>
<button image="timesheet" label="Add timesheet entry" id="timesheet[$row_cont[info_id]]" onclick="window.open(egw::link('/index.php','menuaction=timesheet.uitimesheet.edit&amp;link_app[0]=infolog&amp;link_id[0]=$row_cont[info_id]&amp;link_app[1]=projectmanager&amp;link_id[1]=$row_cont[pm_id]'),'_blank','dependent=yes,width=600,height=400,scrollbars=yes,status=yes'); return false;" align="center"/>
</vbox> </vbox>
<hbox> <hbox>
<button image="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" 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="edit" label="Edit" id="edit[$row_cont[info_id]]" statustext="Edit this entry" 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;"/>

View File

@ -76,7 +76,12 @@ class botimesheet extends so_sql
var $link; var $link;
/** /**
* @var array $grants * @var array $grants
*/ */
var $grants;
/**
* @var array $summary array sums of the last search in keys duration and price
*/
var $summary;
function botimesheet() function botimesheet()
{ {
@ -229,9 +234,10 @@ class botimesheet extends so_sql
* @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or * @param string $join='' sql to do a join, added as is after the table-name, eg. ", table2 WHERE x=y" or
* "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join! * "LEFT JOIN table2 ON (x=y)", Note: there's no quoting done on $join!
* @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false * @param boolean $need_full_no_count=false If true an unlimited query is run to determine the total number of rows, default false
* @param boolean $only_summary=false If true only return the sums as array with keys duration and price, default false
* @return array of matching rows (the row is an array of the cols) or False * @return array of matching rows (the row is an array of the cols) or False
*/ */
function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false) function &search($criteria,$only_keys=True,$order_by='',$extra_cols='',$wildcard='',$empty=False,$op='AND',$start=false,$filter=null,$join='',$need_full_no_count=false,$only_summary=false)
{ {
if (!$extra_cols) $extra_cols = 'ts_quantity*ts_unitprice AS ts_total'; if (!$extra_cols) $extra_cols = 'ts_quantity*ts_unitprice AS ts_total';
@ -254,11 +260,14 @@ class botimesheet extends so_sql
if (!count($filter['ts_owner'])) if (!count($filter['ts_owner']))
{ {
$this->total = 0; $this->total = 0;
$this->summary = array();
return array(); return array();
} }
$this->summary = parent::search($criteria,'SUM(ts_duration) AS duration,SUM(ts_quantity*ts_unitprice) AS price', $this->summary = parent::search($criteria,'SUM(ts_duration) AS duration,SUM(ts_quantity*ts_unitprice) AS price',
'','',$wildcard,$empty,$op,false,$filter,$join); '','',$wildcard,$empty,$op,false,$filter,$join);
$this->summary = $this->summary[0]; $this->summary = $this->summary[0];
if ($only_summary) return $this->summary;
return parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join,$need_full_no_count); return parent::search($criteria,$only_keys,$order_by,$extra_cols,$wildcard,$empty,$op,$start,$filter,$join,$need_full_no_count);
} }
@ -382,6 +391,17 @@ class botimesheet extends so_sql
return $data; return $data;
} }
/**
* Get the time- and pricesum for the given timesheet entries
*
* @param array $ids array of timesheet id's
* @return array with keys time and price
*/
function sum($ids)
{
return $this->search(array('ts_id'=>$ids),true,'','','',false,'AND',false,null,'',false,true);
}
/** /**
* get title for an timesheet entry identified by $entry * get title for an timesheet entry identified by $entry
* *

View File

@ -68,7 +68,8 @@ class uitimesheet extends botimesheet
'cat_id' => (int) $_REQUEST['cat_id'], 'cat_id' => (int) $_REQUEST['cat_id'],
); );
} }
$referer = preg_match('/menuaction=([^&]+)/',$_SERVER['HTTP_REFERER'],$matches) ? $matches[1] : TIMESHEET_APP.'.uitimesheet.index'; $referer = preg_match('/menuaction=([^&]+)/',$_SERVER['HTTP_REFERER'],$matches) ? $matches[1] :
(strstr($_SERVER['HTTP_REFERER'],'/infolog/index.php') ? 'infolog.uiinfolog.index' : TIMESHEET_APP.'.uitimesheet.index');
} }
else else
{ {
@ -94,6 +95,7 @@ class uitimesheet extends botimesheet
$this->data['ts_quantity'] = $this->data['ts_duration'] / 60.0; $this->data['ts_quantity'] = $this->data['ts_duration'] / 60.0;
} }
if (!$this->data['ts_project']) $this->data['ts_project'] = $this->data['ts_project_blur']; if (!$this->data['ts_project']) $this->data['ts_project'] = $this->data['ts_project_blur'];
if (!$this->data['ts_title']) $this->data['ts_title'] = $this->data['ts_title_blur'];
if ($this->save() != 0) if ($this->save() != 0)
{ {
@ -162,6 +164,7 @@ class uitimesheet extends botimesheet
$preserv = $this->data + array( $preserv = $this->data + array(
'view' => $view, 'view' => $view,
'referer' => $referer, 'referer' => $referer,
'ts_title_blur' => $content['ts_title_blur'],
); );
$content = array_merge($this->data,array( $content = array_merge($this->data,array(
'msg' => $msg, 'msg' => $msg,
@ -175,14 +178,26 @@ class uitimesheet extends botimesheet
'ts_quantity_blur' => $this->data['ts_duration'] ? $this->data['ts_duration'] / 60.0 : '', 'ts_quantity_blur' => $this->data['ts_duration'] ? $this->data['ts_duration'] / 60.0 : '',
)); ));
$links = array(); $links = array();
if (!$this->data['ts_id'] && isset($_GET['link_app']) && isset($_GET['link_id']) && // create links specified in the REQUEST (URL)
preg_match('/^[a-z_0-9-]+:[:a-z_0-9-]+$/i',$_GET['link_app'].':'.$_GET['link_id']) && // gard against XSS if (!$this->data['ts_id'] && isset($_REQUEST['link_app']) && isset($_REQUEST['link_id']) && !is_array($content['link_to']['to_id']))
!is_array($content['link_to']['to_id']))
{ {
$this->link->link(TIMESHEET_APP,$content['link_to']['to_id'],$_GET['link_app'],$_GET['link_id']); $link_ids = is_array($_REQUEST['link_id']) ? $_REQUEST['link_id'] : array($_REQUEST['link_id']);
if ($_GET['link_app'] == 'projectmanager') foreach(is_array($_REQUEST['link_app']) ? $_REQUEST['link_app'] : array($_REQUEST['link_app']) as $n => $link_app)
{ {
$links = array($_GET['link_id']); $link_id = $link_ids[$n];
if (preg_match('/^[a-z_0-9-]+:[:a-z_0-9-]+$/i',$link_app.':'.$link_id)) // gard against XSS
{
$this->link->link(TIMESHEET_APP,$content['link_to']['to_id'],$link_app,$link_id);
switch ($link_app)
{
case 'projectmanager':
$links[] = $link_id;
break;
case 'infolog':
$preserv['ts_title_blur'] = $this->link->title('infolog',$link_id);
break;
}
}
} }
} }
elseif ($this->data['ts_id']) elseif ($this->data['ts_id'])
@ -196,6 +211,8 @@ class uitimesheet extends botimesheet
{ {
$preserv['ts_project_blur'] = $content['ts_project_blur'] = $this->link->title('projectmanager',$content['pm_id']); $preserv['ts_project_blur'] = $content['ts_project_blur'] = $this->link->title('projectmanager',$content['pm_id']);
} }
$content['ts_title_blur'] = $preserv['ts_title_blur'] = $preserv['ts_title_blur'] ? $preserv['ts_title_blur'] : $preserv['ts_project_blur'];
$readonlys = array( $readonlys = array(
'button[delete]' => !$this->data['ts_id'] || !$this->check_acl(EGW_ACL_DELETE), 'button[delete]' => !$this->data['ts_id'] || !$this->check_acl(EGW_ACL_DELETE),
'button[edit]' => !$view || !$this->check_acl(EGW_ACL_EDIT), 'button[edit]' => !$view || !$this->check_acl(EGW_ACL_EDIT),

View File

@ -1,5 +1,5 @@
<?php <?php
// eTemplates for Application 'timesheet', generated by soetemplate::dump4setup() 2006-01-10 23:59 // eTemplates for Application 'timesheet', generated by soetemplate::dump4setup() 2006-03-21 14:49
/* $Id$ */ /* $Id$ */
@ -9,7 +9,11 @@ $templ_data[] = array('name' => 'timesheet.edit','template' => '','lang' => '','
$templ_data[] = array('name' => 'timesheet.edit','template' => '','lang' => '','group' => '0','version' => '0.2.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:8:{s:2:"c2";s:2:"th";s:2:"c3";s:3:"row";s:1:"A";s:3:"100";s:2:"c6";s:3:"row";s:2:"h6";s:14:",!@ts_modified";s:2:"c4";s:3:"row";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";}i:1;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_owner";s:5:"label";s:4:"User";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:8:"ts_owner";s:4:"span";s:3:"all";s:7:"no_lang";s:1:"1";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,ts_project";s:5:"label";s:7:"Project";}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";s:4:"span";s:3:"all";i:1;a:6:{s:4:"type";s:21:"projectmanager-select";s:4:"size";s:4:"None";s:4:"name";s:5:"pm_id";s:4:"span";s:3:"all";s:4:"help";s:16:"Select a project";s:8:"onchange";s:1:"1";}i:2;a:4:{s:4:"type";s:4:"text";s:4:"name";s:10:"ts_project";s:4:"blur";s:16:"@ts_project_blur";s:4:"size";s:5:"65,80";}}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,ts_unitprice";s:5:"label";s:9:"Unitprice";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:24:"projectmanager-pricelist";s:4:"name";s:5:"pl_id";s:4:"size";s:4:"None";s:8:"onchange";s:209:"this.form[\'exec[ts_unitprice]\'].value=this.options[this.selectedIndex].text.lastIndexOf(\'(\') < 0 ? \'\' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf(\'(\')+1,-1);";}i:2;a:3:{s:4:"type";s:5:"float";s:4:"name";s:12:"ts_unitprice";s:4:"span";s:3:"all";}}}i:5;a:2:{s:1:"A";a:4:{s:4:"type";s:3:"tab";s:5:"label";s:19:"General|Notes|Links";s:4:"name";s:19:"general|notes|links";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:6;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"ts_modified";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:11:"ts_modifier";s:5:"label";s:2:"by";s:8:"readonly";s:1:"1";}}}i:7;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";s:4:"span";s:1:"2";i:1;a:8:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"6";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Edit";s:4:"name";s:12:"button[edit]";s:4:"help";s:15:"Edit this entry";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:16:"button[save_new]";s:5:"label";s:10:"Save & New";s:4:"help";s:34:"Saves this entry and add a new one";}i:3;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[save]";s:5:"label";s:4:"Save";s:4:"help";s:22:"Saves the changes made";}i:4;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:24:"Applies the changes made";}i:5;a:5:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:4:"help";s:44:"closes the window without saving the changes";s:7:"onclick";s:15:"window.close();";}i:6;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}i:2;a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"Delete this entry";s:7:"onclick";s:36:"return confirm(\'Delete this entry\');";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:7;s:4:"cols";i:2;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.width100 { width: 100%; }','modified' => '1136861594',); $templ_data[] = array('name' => 'timesheet.edit','template' => '','lang' => '','group' => '0','version' => '0.2.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:8:{s:2:"c2";s:2:"th";s:2:"c3";s:3:"row";s:1:"A";s:3:"100";s:2:"c6";s:3:"row";s:2:"h6";s:14:",!@ts_modified";s:2:"c4";s:3:"row";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";}i:1;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_owner";s:5:"label";s:4:"User";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:8:"ts_owner";s:4:"span";s:3:"all";s:7:"no_lang";s:1:"1";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,ts_project";s:5:"label";s:7:"Project";}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";s:4:"span";s:3:"all";i:1;a:6:{s:4:"type";s:21:"projectmanager-select";s:4:"size";s:4:"None";s:4:"name";s:5:"pm_id";s:4:"span";s:3:"all";s:4:"help";s:16:"Select a project";s:8:"onchange";s:1:"1";}i:2;a:4:{s:4:"type";s:4:"text";s:4:"name";s:10:"ts_project";s:4:"blur";s:16:"@ts_project_blur";s:4:"size";s:5:"65,80";}}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,ts_unitprice";s:5:"label";s:9:"Unitprice";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:24:"projectmanager-pricelist";s:4:"name";s:5:"pl_id";s:4:"size";s:4:"None";s:8:"onchange";s:209:"this.form[\'exec[ts_unitprice]\'].value=this.options[this.selectedIndex].text.lastIndexOf(\'(\') < 0 ? \'\' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf(\'(\')+1,-1);";}i:2;a:3:{s:4:"type";s:5:"float";s:4:"name";s:12:"ts_unitprice";s:4:"span";s:3:"all";}}}i:5;a:2:{s:1:"A";a:4:{s:4:"type";s:3:"tab";s:5:"label";s:19:"General|Notes|Links";s:4:"name";s:19:"general|notes|links";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:6;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"ts_modified";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:11:"ts_modifier";s:5:"label";s:2:"by";s:8:"readonly";s:1:"1";}}}i:7;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";s:4:"span";s:1:"2";i:1;a:8:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"6";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Edit";s:4:"name";s:12:"button[edit]";s:4:"help";s:15:"Edit this entry";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:16:"button[save_new]";s:5:"label";s:10:"Save & New";s:4:"help";s:34:"Saves this entry and add a new one";}i:3;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[save]";s:5:"label";s:4:"Save";s:4:"help";s:22:"Saves the changes made";}i:4;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:24:"Applies the changes made";}i:5;a:5:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:4:"help";s:44:"closes the window without saving the changes";s:7:"onclick";s:15:"window.close();";}i:6;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}i:2;a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"Delete this entry";s:7:"onclick";s:36:"return confirm(\'Delete this entry\');";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:7;s:4:"cols";i:2;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.width100 { width: 100%; }','modified' => '1136861594',);
$templ_data[] = array('name' => 'timesheet.edit.general','template' => '','lang' => '','group' => '0','version' => '0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:5:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"c2";s:3:"row";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_title";s:5:"label";s:5:"Title";}s:1:"B";a:4:{s:4:"type";s:4:"text";s:4:"size";s:5:"65,80";s:4:"name";s:8:"ts_title";s:6:"needed";s:1:"1";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,cat_id";s:5:"label";s:8:"Category";}s:1:"B";a:3:{s:4:"type";s:10:"select-cat";s:4:"name";s:6:"cat_id";s:4:"size";s:4:"None";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_start";s:5:"label";s:4:"Date";}s:1:"B";a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:8:"ts_start";s:6:"needed";s:1:"1";s:4:"size";s:2:",8";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,ts_duration";s:5:"label";s:8:"Duration";}s:1:"B";a:3:{s:4:"type";s:13:"date-duration";s:4:"name";s:11:"ts_duration";s:4:"size";s:2:",h";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,ts_quantity";s:5:"label";s:8:"Quantity";}s:1:"B";a:4:{s:4:"type";s:5:"float";s:4:"name";s:11:"ts_quantity";s:4:"help";s:30:"empty if identical to duration";s:4:"blur";s:17:"@ts_quantity_blur";}}}s:4:"rows";i:5;s:4:"cols";i:2;s:4:"size";s:8:"100%,150";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"150";}}}','size' => '100%,150','style' => '','modified' => '1134773043',); $templ_data[] = array('name' => 'timesheet.edit','template' => '','lang' => '','group' => '0','version' => '1.0.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:8:{s:2:"c2";s:2:"th";s:2:"c3";s:3:"row";s:1:"A";s:3:"100";s:2:"c6";s:3:"row";s:2:"h6";s:14:",!@ts_modified";s:2:"c4";s:3:"row";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";}i:1;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_owner";s:5:"label";s:4:"User";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:8:"ts_owner";s:4:"span";s:3:"all";s:7:"no_lang";s:1:"1";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,ts_project";s:5:"label";s:7:"Project";}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";s:4:"span";s:3:"all";i:1;a:6:{s:4:"type";s:21:"projectmanager-select";s:4:"size";s:4:"None";s:4:"name";s:5:"pm_id";s:4:"span";s:3:"all";s:4:"help";s:16:"Select a project";s:8:"onchange";i:1;}i:2;a:4:{s:4:"type";s:4:"text";s:4:"name";s:10:"ts_project";s:4:"blur";s:16:"@ts_project_blur";s:4:"size";s:5:"65,80";}}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,ts_unitprice";s:5:"label";s:9:"Unitprice";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:24:"projectmanager-pricelist";s:4:"name";s:5:"pl_id";s:4:"size";s:4:"None";s:8:"onchange";s:209:"this.form[\'exec[ts_unitprice]\'].value=this.options[this.selectedIndex].text.lastIndexOf(\'(\') < 0 ? \'\' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf(\'(\')+1,-1);";}i:2;a:3:{s:4:"type";s:5:"float";s:4:"name";s:12:"ts_unitprice";s:4:"span";s:3:"all";}}}i:5;a:2:{s:1:"A";a:4:{s:4:"type";s:3:"tab";s:5:"label";s:19:"General|Notes|Links";s:4:"name";s:19:"general|notes|links";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:6;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"ts_modified";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:11:"ts_modifier";s:5:"label";s:2:"by";s:8:"readonly";s:1:"1";}}}i:7;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";s:4:"span";s:1:"2";i:1;a:8:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"6";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Edit";s:4:"name";s:12:"button[edit]";s:4:"help";s:15:"Edit this entry";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:16:"button[save_new]";s:5:"label";s:10:"Save & New";s:4:"help";s:34:"Saves this entry and add a new one";}i:3;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[save]";s:5:"label";s:4:"Save";s:4:"help";s:22:"Saves the changes made";}i:4;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:24:"Applies the changes made";}i:5;a:5:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:4:"help";s:44:"closes the window without saving the changes";s:7:"onclick";s:15:"window.close();";}i:6;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}i:2;a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"Delete this entry";s:7:"onclick";s:36:"return confirm(\'Delete this entry\');";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:7;s:4:"cols";i:2;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.width100 { width: 100%; }','modified' => '1136861594',);
$templ_data[] = array('name' => 'timesheet.edit','template' => '','lang' => '','group' => '0','version' => '1.2.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:8:{s:2:"c2";s:2:"th";s:2:"c3";s:3:"row";s:1:"A";s:3:"100";s:2:"c6";s:3:"row";s:2:"h6";s:14:",!@ts_modified";s:2:"c4";s:3:"row";s:2:"h2";s:2:"28";s:2:"h1";s:6:",!@msg";}i:1;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_owner";s:5:"label";s:4:"User";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:8:"ts_owner";s:4:"span";s:3:"all";s:7:"no_lang";s:1:"1";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,ts_project";s:5:"label";s:7:"Project";}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";s:4:"span";s:3:"all";i:1;a:6:{s:4:"type";s:21:"projectmanager-select";s:4:"size";s:4:"None";s:4:"name";s:5:"pm_id";s:4:"span";s:3:"all";s:4:"help";s:16:"Select a project";s:8:"onchange";i:1;}i:2;a:4:{s:4:"type";s:4:"text";s:4:"name";s:10:"ts_project";s:4:"blur";s:16:"@ts_project_blur";s:4:"size";s:5:"65,80";}}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,ts_unitprice";s:5:"label";s:9:"Unitprice";}s:1:"B";a:5:{s:4:"type";s:4:"hbox";s:4:"span";s:3:"all";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:24:"projectmanager-pricelist";s:4:"name";s:5:"pl_id";s:4:"size";s:4:"None";s:8:"onchange";s:209:"this.form[\'exec[ts_unitprice]\'].value=this.options[this.selectedIndex].text.lastIndexOf(\'(\') < 0 ? \'\' : this.options[this.selectedIndex].text.slice(this.options[this.selectedIndex].text.lastIndexOf(\'(\')+1,-1);";}i:2;a:3:{s:4:"type";s:5:"float";s:4:"name";s:12:"ts_unitprice";s:4:"span";s:3:"all";}}}i:5;a:2:{s:1:"A";a:4:{s:4:"type";s:3:"tab";s:5:"label";s:19:"General|Notes|Links";s:4:"name";s:19:"general|notes|links";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:6;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Last modified";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:11:"ts_modified";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:11:"ts_modifier";s:5:"label";s:2:"by";s:8:"readonly";s:1:"1";}}}i:7;a:2:{s:1:"A";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:5:"2,0,0";s:4:"span";s:1:"2";i:1;a:8:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"6";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:4:"Edit";s:4:"name";s:12:"button[edit]";s:4:"help";s:15:"Edit this entry";}i:2;a:4:{s:4:"type";s:6:"button";s:4:"name";s:16:"button[save_new]";s:5:"label";s:10:"Save & New";s:4:"help";s:34:"Saves this entry and add a new one";}i:3;a:4:{s:4:"type";s:6:"button";s:4:"name";s:12:"button[save]";s:5:"label";s:4:"Save";s:4:"help";s:22:"Saves the changes made";}i:4;a:4:{s:4:"type";s:6:"button";s:4:"name";s:13:"button[apply]";s:5:"label";s:5:"Apply";s:4:"help";s:24:"Applies the changes made";}i:5;a:5:{s:4:"type";s:6:"button";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:4:"help";s:44:"closes the window without saving the changes";s:7:"onclick";s:15:"window.close();";}i:6;a:2:{s:4:"type";s:4:"html";s:4:"name";s:2:"js";}}i:2;a:6:{s:4:"type";s:6:"button";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:17:"Delete this entry";s:7:"onclick";s:36:"return confirm(\'Delete this entry\');";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:7;s:4:"cols";i:2;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.width100 { width: 100%; }','modified' => '1142930663',);
$templ_data[] = array('name' => 'timesheet.edit.general','template' => '','lang' => '','group' => '0','version' => '0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:6:{i:0;a:5:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"c2";s:3:"row";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_title";s:5:"label";s:5:"Title";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"size";s:5:"65,80";s:4:"name";s:8:"ts_title";s:6:"needed";s:1:"1";s:4:"blur";s:14:"@ts_title_blur";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,cat_id";s:5:"label";s:8:"Category";}s:1:"B";a:3:{s:4:"type";s:10:"select-cat";s:4:"name";s:6:"cat_id";s:4:"size";s:4:"None";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:11:",,,ts_start";s:5:"label";s:4:"Date";}s:1:"B";a:4:{s:4:"type";s:9:"date-time";s:4:"name";s:8:"ts_start";s:6:"needed";s:1:"1";s:4:"size";s:2:",8";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,ts_duration";s:5:"label";s:8:"Duration";}s:1:"B";a:3:{s:4:"type";s:13:"date-duration";s:4:"name";s:11:"ts_duration";s:4:"size";s:2:",h";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,ts_quantity";s:5:"label";s:8:"Quantity";}s:1:"B";a:4:{s:4:"type";s:5:"float";s:4:"name";s:11:"ts_quantity";s:4:"help";s:30:"empty if identical to duration";s:4:"blur";s:17:"@ts_quantity_blur";}}}s:4:"rows";i:5;s:4:"cols";i:2;s:4:"size";s:8:"100%,150";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"150";}}}','size' => '100%,150','style' => '','modified' => '1134773043',);
$templ_data[] = array('name' => 'timesheet.edit.links','template' => '','lang' => '','group' => '0','version' => '0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:7:{s:1:"A";s:3:"100";s:2:"h1";s:6:",@view";s:2:"h2";s:13:",@status_only";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:17:"100%,150,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"150";i:6;s:4:"auto";}}}','size' => '100%,150,,,,,auto','style' => '','modified' => '1134775301',); $templ_data[] = array('name' => 'timesheet.edit.links','template' => '','lang' => '','group' => '0','version' => '0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:7:{s:1:"A";s:3:"100";s:2:"h1";s:6:",@view";s:2:"h2";s:13:",@status_only";s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:7:"link-to";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:9:"link-list";s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:4:"size";s:17:"100%,150,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"150";i:6;s:4:"auto";}}}','size' => '100%,150,,,,,auto','style' => '','modified' => '1134775301',);

View File

@ -10,7 +10,7 @@
<rows> <rows>
<row class="row"> <row class="row">
<description options=",,,ts_title" value="Title"/> <description options=",,,ts_title" value="Title"/>
<textbox size="65" maxlength="80" id="ts_title" needed="1"/> <textbox size="65" maxlength="80" id="ts_title" needed="1" blur="@ts_title_blur"/>
</row> </row>
<row class="row"> <row class="row">
<description options=",,,cat_id" value="Category"/> <description options=",,,cat_id" value="Category"/>
@ -67,7 +67,7 @@
</rows> </rows>
</grid> </grid>
</template> </template>
<template id="timesheet.edit" template="" lang="" group="0" version="0.2.001"> <template id="timesheet.edit" template="" lang="" group="0" version="1.2.001">
<grid width="100%"> <grid width="100%">
<columns> <columns>
<column width="100"/> <column width="100"/>