Working on time tracker

This commit is contained in:
Hillel Coren 2017-09-28 11:42:20 +03:00
parent b8ecfbf5c2
commit 9fba49009c
3 changed files with 52 additions and 30 deletions

View File

@ -2467,7 +2467,7 @@ $LANG = array(
'stopped' => 'Stopped', 'stopped' => 'Stopped',
'ascending' => 'Ascending', 'ascending' => 'Ascending',
'descending' => 'Descending', 'descending' => 'Descending',
'direction' => 'Direction', 'sort_direction' => 'Direction',
); );

View File

@ -235,18 +235,18 @@
<div class="row"> <div class="row">
<div class="col-md-6" style="padding-top:24px;"> <div class="col-md-6" style="padding-top:24px;">
{!! Former::select('sort_by') {!! Former::select('sort_by')
->addOption(trans('texts.date'), 'date') ->addOption(trans('texts.date'), 'createdAt')
->addOption(trans('texts.duration'), 'duration') ->addOption(trans('texts.duration'), 'duration')
->addOption(trans('texts.client'), 'client') ->addOption(trans('texts.client'), 'client')
->addOption(trans('texts.project'), 'project') ->addOption(trans('texts.project'), 'project')
->addOption(trans('texts.description'), 'description') ->addOption(trans('texts.description'), 'description')
->data_bind('value: sortBy') !!} ->data_bind('value: sortBy, event: {change: onSortChange}') !!}
</div> </div>
<div class="col-md-6" style="padding-top:24px;"> <div class="col-md-6" style="padding-top:24px;">
{!! Former::select('direction') {!! Former::select('sort_direction')
->addOption(trans('texts.ascending'), 'asc') ->addOption(trans('texts.ascending'), 'ascending')
->addOption(trans('texts.descending'), 'desc') ->addOption(trans('texts.descending'), 'descending')
->data_bind('value: sortDirection') !!} ->data_bind('value: sortDirection, event: {change: onSortChange}') !!}
</div> </div>
</div> </div>
</div> </div>

View File

@ -14,8 +14,8 @@
self.selectedProject = ko.observable(false); self.selectedProject = ko.observable(false);
self.filterState = ko.observable('all'); self.filterState = ko.observable('all');
self.sortBy = ko.observable('date'); self.sortBy = ko.observable('createdAt');
self.sortDirection = ko.observable('desc'); self.sortDirection = ko.observable('descending');
self.isDesktop = function() { self.isDesktop = function() {
return navigator.userAgent == 'Time Tracker'; return navigator.userAgent == 'Time Tracker';
@ -31,6 +31,10 @@
task.save(data, true); task.save(data, true);
} }
self.onSortChange = function() {
console.log('sort change...');
}
self.onFilterClick = function(event) { self.onFilterClick = function(event) {
$('#filterPanel').toggle(); $('#filterPanel').toggle();
} }
@ -323,14 +327,10 @@
} }
self.filteredTasks = ko.computed(function() { self.filteredTasks = ko.computed(function() {
var tasks = self.tasks(); var tasks = self.tasks();
// bind to fields
self.filterState();
var filtered = ko.utils.arrayFilter(tasks, function(task) { var filtered = ko.utils.arrayFilter(tasks, function(task) {
return task.matchesFilter(); return task.matchesFilter(self.filter(), self.filterState());
}); });
if (! self.filter() || filtered.length > 0) { if (! self.filter() || filtered.length > 0) {
@ -339,12 +339,21 @@
// sort the data // sort the data
tasks.sort(function (left, right) { tasks.sort(function (left, right) {
return right.createdAt() - left.createdAt(); var leftSortValue = left.sortValue(self.sortBy());
/* var rightSortValue = right.sortValue(self.sortBy());
right = right.firstTime() ? right.firstTime().order() : right.createdAt(); if (self.sortBy() == 'createdAt' || self.sortBy() == 'duration') {
left = left.firstTime() ? left.firstTime().order() : left.createdAt(); if (self.sortDirection() == 'descending') {
return right - left; return rightSortValue - leftSortValue
*/ } else {
return leftSortValue - rightSortValue;
}
} else {
if (self.sortDirection() == 'ascending') {
return leftSortValue.localeCompare(rightSortValue);
} else {
return rightSortValue.localeCompare(leftSortValue);
}
}
}); });
return tasks; return tasks;
@ -560,6 +569,18 @@
self.update(data); self.update(data);
} }
self.sortValue = function(field) {
if (field == 'client') {
return self.client() && self.client().displayName() ? self.client().displayName().toLowerCase() : '';
} else if (field == 'project') {
return self.project() && self.project().name() ? self.project().name().toLowerCase() : '';
} else if (field == 'duration') {
return self.seconds(true);
} else {
return self[field]();
}
}
self.isNew = ko.computed(function() { self.isNew = ko.computed(function() {
return ! self.public_id(); return ! self.public_id();
}); });
@ -595,8 +616,8 @@
return times; return times;
} }
self.matchesFilter = function() { self.matchesFilter = function(filter, filterState) {
if (model.filter()) { if (filter) {
filter = model.filter().toLowerCase(); filter = model.filter().toLowerCase();
var parts = filter.split(' '); var parts = filter.split(' ');
for (var i=0; i<parts.length; i++) { for (var i=0; i<parts.length; i++) {
@ -625,9 +646,9 @@
} }
} }
if (model.filterState() == 'stopped' && self.isRunning()) { if (filterState == 'stopped' && self.isRunning()) {
return false; return false;
} else if (model.filterState() == 'running' && ! self.isRunning()) { } else if (filterState == 'running' && ! self.isRunning()) {
return false; return false;
} }
@ -740,9 +761,9 @@
return time.age(); return time.age();
}); });
self.calcDuration = function(total) { self.seconds = function(total) {
if (! self.time_log().length) { if (! self.time_log().length) {
return '0:00:00'; return moment.duration(0);
} }
var time = self.lastTime(); var time = self.lastTime();
var now = new Date().getTime(); var now = new Date().getTime();
@ -756,18 +777,19 @@
}); });
} }
var duration = moment.duration(duration * 1000); return moment.duration(duration * 1000);
return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
} }
self.totalDuration = ko.computed(function() { self.totalDuration = ko.computed(function() {
model.clock(); // bind to the clock model.clock(); // bind to the clock
return self.calcDuration(true); var duration = self.seconds(true);
return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
}); });
self.duration = ko.computed(function() { self.duration = ko.computed(function() {
model.clock(); // bind to the clock model.clock(); // bind to the clock
return self.calcDuration(false); var duration = self.seconds(false);
return Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss");
}); });
} }