mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-03 23:37:33 -05:00 
			
		
		
		
	Working on time tracker
This commit is contained in:
		
							parent
							
								
									b8ecfbf5c2
								
							
						
					
					
						commit
						9fba49009c
					
				@ -2467,7 +2467,7 @@ $LANG = array(
 | 
				
			|||||||
    'stopped' => 'Stopped',
 | 
					    'stopped' => 'Stopped',
 | 
				
			||||||
    'ascending' => 'Ascending',
 | 
					    'ascending' => 'Ascending',
 | 
				
			||||||
    'descending' => 'Descending',
 | 
					    'descending' => 'Descending',
 | 
				
			||||||
    'direction' => 'Direction',
 | 
					    'sort_direction' => 'Direction',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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>
 | 
				
			||||||
 | 
				
			|||||||
@ -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");
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user