mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-11-28 19:03:14 +01:00
WIP timesheet timers: fix overwrite and display overwritten time and time of recording
This commit is contained in:
parent
0a745299ce
commit
ccee240055
@ -74,13 +74,14 @@ egw.extend('timer', egw.MODULE_GLOBAL, function()
|
||||
/**
|
||||
* Get state of timer
|
||||
* @param string _action last action
|
||||
* @param string|Date|undefined _time time to report
|
||||
* @returns {{action: string, overall: {}, specific: {}, ts: Date}}
|
||||
*/
|
||||
function getState(_action)
|
||||
function getState(_action, _time)
|
||||
{
|
||||
return {
|
||||
action: _action,
|
||||
ts: new Date(),
|
||||
ts: new Date(_time || new Date),
|
||||
overall: overall,
|
||||
specific: specific
|
||||
}
|
||||
@ -124,7 +125,7 @@ egw.extend('timer', egw.MODULE_GLOBAL, function()
|
||||
break;
|
||||
}
|
||||
// persist state
|
||||
egw.request('timesheet.EGroupware\\Timesheet\\Events.ajax_event', [getState(_action)]).then(() => {
|
||||
egw.request('timesheet.EGroupware\\Timesheet\\Events.ajax_event', [getState(_action, _time)]).then(() => {
|
||||
if (_action === 'specific-stop')
|
||||
{
|
||||
egw.open(null, 'timesheet', 'add', {events: 'specific'});
|
||||
@ -336,6 +337,7 @@ egw.extend('timer', egw.MODULE_GLOBAL, function()
|
||||
timerAction(button_id.replace(/_([a-z]+)\[([a-z]+)\]/, '$1-$2'),
|
||||
// eT2 operates in user-time, while timers here always operate in UTC
|
||||
value.time ? new Date((new Date(value.time)).valueOf() + egw.getTimezoneOffset() * 60000) : undefined);
|
||||
dialog._overlayContentNode.querySelector('et2-date-time').value = '';
|
||||
setButtonState();
|
||||
return false;
|
||||
}
|
||||
@ -360,9 +362,6 @@ egw.extend('timer', egw.MODULE_GLOBAL, function()
|
||||
setButtonState();
|
||||
// update timers in dialog
|
||||
update();
|
||||
// set current time for overwrite time input (eT2 operates in user-time!)
|
||||
//let now = new Date((new Date).valueOf() - egw.getTimezoneOffset() * 60000);
|
||||
//dialog._overlayContentNode.querySelector('et2-date-time').value = now;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -97,7 +97,7 @@ only admin admin de nur Administratoren
|
||||
only admin can edit this status admin de nur Administratoren dürfen Stundenzettel mit diesen Status bearbeiten
|
||||
or endtime timesheet de oder Endzeit
|
||||
order timesheet de Reihenfolge
|
||||
overwrite common de Überschreiben
|
||||
overwrite time common de Zeit überschreiben
|
||||
overwriting start or stop time timesheet de Überschreiben der Start- oder Stop-Zeit
|
||||
parent admin de Übergeordnet
|
||||
pause common de Pause
|
||||
@ -108,6 +108,7 @@ price timesheet de Preis
|
||||
project fields timesheet de Felder Projektmanager
|
||||
projectmanager integration admin de Integration des Projektmanagers
|
||||
quantity timesheet de Menge
|
||||
recorded timesheet de Aufgenommen
|
||||
recovered timesheet de wiederhergestellt
|
||||
replacements for inserting entries into documents timesheet de Platzhalter für das Einfügen in Dokumente
|
||||
restore this entry timesheet de Diesen Eintrag wiederherstellen
|
||||
@ -134,6 +135,7 @@ status deleted. timesheet de Status gelöscht
|
||||
status of created timesheets timesheet de Status für neue Stundenzettel
|
||||
status updated. timesheet de Status geändert
|
||||
stop common de Stop
|
||||
sum timesheet de Summe
|
||||
sum %1: timesheet de Summe %1:
|
||||
tag to mark positions for address labels timesheet de Platzhalter, um die Position der Adresslabels festzulegen
|
||||
the document can contain placeholder like {{%3}}, to be replaced with the data (%1full list of placeholder names%2). timesheet de Das Dokument kann Platzhalter wie {{%3}} beinhalten, die mit den entsprechenden Inhalten ersetzt werden (%1Liste der Platzhalter%2).
|
||||
|
@ -97,7 +97,7 @@ only admin admin en Only admin
|
||||
only admin can edit this status admin en Only admins can edit timesheets with this status
|
||||
or endtime timesheet en or end time
|
||||
order timesheet en Order
|
||||
overwrite common en Overwrite
|
||||
overwrite time common en Overwrite time
|
||||
overwriting start or stop time timesheet en Overwriting start or stop time
|
||||
parent admin en Parent
|
||||
pause common en Pause
|
||||
@ -108,6 +108,7 @@ price timesheet en Price
|
||||
project fields timesheet en Project fields
|
||||
projectmanager integration admin en Project Manager integration
|
||||
quantity timesheet en Quantity
|
||||
recorded timesheet en Recorded
|
||||
recovered timesheet en recovered
|
||||
replacements for inserting entries into documents timesheet en Replacements for inserting entries into documents
|
||||
restore this entry timesheet en Restore this entry
|
||||
@ -134,6 +135,7 @@ status deleted. timesheet en Status deleted.
|
||||
status of created timesheets timesheet en Status of created timesheets
|
||||
status updated. timesheet en Status updated.
|
||||
stop common en Stop
|
||||
sum timesheet en Sum
|
||||
sum %1: timesheet en Sum %1:
|
||||
tag to mark positions for address labels timesheet en Tag to mark positions for address labels
|
||||
the document can contain placeholder like {{%3}}, to be replaced with the data (%1full list of placeholder names%2). timesheet en The document can contain placeholder like {{%3}}, to be replaced with the data (%1full list of placeholder names%2).
|
||||
|
@ -210,7 +210,7 @@ class Events extends Api\Storage\Base
|
||||
*
|
||||
* @param array& $timer array with keys 'start', 'offset' and 'paused'
|
||||
* @param array $row
|
||||
* @return void
|
||||
* @return int? time in ms for stop or pause events, null for start
|
||||
*/
|
||||
protected static function evaluate(array &$timer, array $row)
|
||||
{
|
||||
@ -221,7 +221,7 @@ class Events extends Api\Storage\Base
|
||||
}
|
||||
elseif ($timer['start'])
|
||||
{
|
||||
$timer['offset'] += 1000 * ($row['tse_time']->getTimestamp() - $timer['start']->getTimestamp());
|
||||
$timer['offset'] += $time = 1000 * ($row['tse_time']->getTimestamp() - $timer['start']->getTimestamp());
|
||||
$timer['start'] = null;
|
||||
$timer['paused'] = ($row['tse_type'] & self::PAUSE) === self::PAUSE;
|
||||
}
|
||||
@ -229,6 +229,7 @@ class Events extends Api\Storage\Base
|
||||
{
|
||||
$timer['paused'] = ($row['tse_type'] & self::PAUSE) === self::PAUSE;
|
||||
}
|
||||
return $time ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -237,10 +238,10 @@ class Events extends Api\Storage\Base
|
||||
* Not stopped events-sequences are NOT returned (stopped sequences end with a stop event).
|
||||
*
|
||||
* @param int|array $filter
|
||||
* @param int &$time=null on return time in seconds
|
||||
* @param int &$total=null on return time in seconds
|
||||
* @return array[] tse_id => array pairs plus extra key sum (time-sum in seconds)
|
||||
*/
|
||||
public static function get($filter, int &$time=null)
|
||||
public static function get($filter, int &$total=null)
|
||||
{
|
||||
if (!is_array($filter))
|
||||
{
|
||||
@ -251,24 +252,25 @@ class Events extends Api\Storage\Base
|
||||
'offset' => 0,
|
||||
'paused' => false,
|
||||
];
|
||||
$time = $open = 0;
|
||||
$total = $open = 0;
|
||||
$events = [];
|
||||
foreach(self::getInstance()->search('', false, 'tse_id', '', '',
|
||||
false, 'AND', false, $filter) as $row)
|
||||
{
|
||||
self::evaluate($timer, $row);
|
||||
$time = self::evaluate($timer, $row);
|
||||
++$open;
|
||||
|
||||
if ($row['tse_type'] & self::STOP)
|
||||
{
|
||||
$row['total'] = $time += $timer['offset'] / 1000;
|
||||
$row['total'] = $total += $timer['offset'] / 1000;
|
||||
$timer = $init_timer;
|
||||
$open = 0;
|
||||
}
|
||||
elseif ($row['tse_type'] & self::PAUSE)
|
||||
{
|
||||
$row['total'] = $time + $timer['offset'] / 1000;
|
||||
$row['total'] = $total + $timer['offset'] / 1000;
|
||||
}
|
||||
$row['time'] = $time / 1000;
|
||||
$events[$row['tse_id']] = $row;
|
||||
}
|
||||
// remove open / unstopped timer events
|
||||
|
@ -88,16 +88,22 @@
|
||||
<column/>
|
||||
<column/>
|
||||
<column/>
|
||||
<column/>
|
||||
<column/>
|
||||
</columns>
|
||||
<rows>
|
||||
<row class="th">
|
||||
<description value="Time"/>
|
||||
<description value="Recorded"/>
|
||||
<description value="Type"/>
|
||||
<description value="Duration"/>
|
||||
<description value="Sum"/>
|
||||
</row>
|
||||
<row>
|
||||
<date-time id="${row}[tse_time]" readonly="true"/>
|
||||
<date-time id="${row}[tse_timestamp]" readonly="true"/>
|
||||
<select id="${row}[tse_type]" readonly="true"/>
|
||||
<date-timeonly id="${row}[time]" readonly="true"/>
|
||||
<date-timeonly id="${row}[total]" readonly="true"/>
|
||||
</row>
|
||||
</rows>
|
||||
|
@ -12,8 +12,9 @@
|
||||
</columns>
|
||||
<rows>
|
||||
<row disabled="@disable=/overwrite/">
|
||||
<description value="Overwrite" span="2"/>
|
||||
<et2-date-time id="time" span="all"/>
|
||||
<description value="Overwrite time" span="2"/>
|
||||
<et2-date-time id="time" span="all" placeholder="now"
|
||||
onclick="if (!this.value) this.value = new Date((new Date).valueOf() - egw.getTimezoneOffset() * 60000)"/>
|
||||
</row>
|
||||
<row disabled="@disable=/specific/">
|
||||
<description value="Timer"/>
|
||||
|
Loading…
Reference in New Issue
Block a user