Skip to content

Commit f973ab6

Browse files
committed
feat(task): add timetracking of tasks
1 parent 416bb16 commit f973ab6

File tree

5 files changed

+95
-13
lines changed

5 files changed

+95
-13
lines changed

cli.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { UpdateNotifier } from 'update-notifier';
66
// END SNAPCRAFT IGNORE
77

88
import { Taskline } from './src/taskline';
9+
import { Localization } from './src/localization';
910
import logger from './src/utils/logger';
1011
import pkg = require('./package.json');
1112
const taskline = new Taskline();

src/item.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
const now: Date = new Date();
2-
31
export interface ItemProperties {
42
id: number;
53
date?: string;
@@ -19,6 +17,8 @@ export abstract class Item {
1917
protected _boards: Array<string>;
2018

2119
public constructor(kwArgs: ItemProperties) {
20+
const now: Date = new Date();
21+
2222
this.id = kwArgs.id;
2323
this.date = kwArgs.date || now.toDateString();
2424
this.timestamp = kwArgs.timestamp || now.getTime();

src/renderer.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,14 @@ export class Renderer {
191191
return this.printColor('pale', text);
192192
}
193193

194+
private getPassedTime(passedTime: number): string {
195+
const seconds = passedTime / 1000;
196+
const minutes = Math.floor((seconds / 60) % 60);
197+
const hours = Math.floor(seconds / 3600);
198+
199+
return `${hours + Math.round(minutes/60 * 100) / 100} hours`;
200+
}
201+
194202
private getCorrelation(items: Array<Item>): string {
195203
const { tasks, complete } = this.getItemStats(items);
196204
return this.printColor('pale', `[${complete}/${tasks}]`);
@@ -281,6 +289,7 @@ export class Renderer {
281289
message.push(this.printColor('task.priority.high', '(!!)'));
282290
}
283291

292+
debugger;
284293
return message.join(' ');
285294
}
286295

@@ -305,6 +314,11 @@ export class Renderer {
305314
dueDate = this.getDueDate(item.dueDate);
306315
}
307316

317+
let passedTime;
318+
if (item instanceof Task && item.passedTime > 0) {
319+
passedTime = this.getPassedTime(item.passedTime);
320+
}
321+
308322
const star = this.getStar(item);
309323

310324
const prefix = this.buildPrefix(item);
@@ -316,6 +330,10 @@ export class Renderer {
316330
suffix = age.length === 0 ? star : `${age} ${star}`;
317331
}
318332

333+
if (passedTime) {
334+
suffix += suffix == '' ? `(${passedTime})` : ` (${passedTime})`;
335+
}
336+
319337
const msgObj = {
320338
prefix,
321339
message,

src/task.ts

Lines changed: 50 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ export interface TaskProperties extends ItemProperties {
1212
isCanceled?: boolean;
1313
isComplete?: boolean;
1414
dueDate?: number;
15+
passedTime?: number;
16+
lastStartTime?: number;
1517
}
1618

1719
export class Task extends Item {
@@ -21,6 +23,8 @@ export class Task extends Item {
2123
private _isCanceled: boolean;
2224
private _isComplete: boolean;
2325
private _dueDate: number;
26+
private _passedTime: number; //milliseconds
27+
private _lastStartTime: number;
2428

2529
public constructor(kwArgs: TaskProperties) {
2630
super(kwArgs);
@@ -30,6 +34,8 @@ export class Task extends Item {
3034
this.isCanceled = kwArgs.isCanceled || false;
3135
this.isComplete = kwArgs.isComplete || false;
3236
this.dueDate = kwArgs.dueDate || 0;
37+
this._passedTime = kwArgs.passedTime || 0;
38+
this._lastStartTime = kwArgs.lastStartTime || 0;
3339
}
3440

3541
public get priority(): TaskPriority {
@@ -72,21 +78,56 @@ export class Task extends Item {
7278
this._dueDate = dueDate;
7379
}
7480

81+
public get passedTime(): number {
82+
if(this._lastStartTime != 0) {
83+
return this._passedTime + (new Date().getTime() - this._lastStartTime);
84+
}
85+
return this._passedTime;
86+
}
87+
88+
public get lastStartTime(): number {
89+
return this._lastStartTime;
90+
}
91+
7592
public begin(): void {
76-
this._inProgress = !this._inProgress;
77-
this._isComplete = false;
78-
this._isCanceled = false;
93+
const now: Date = new Date();
94+
95+
// check if task is started or paused
96+
if(this.inProgress == true) {
97+
this._passedTime += now.getTime() - this._lastStartTime;
98+
this._lastStartTime = 0;
99+
} else {
100+
this._lastStartTime = now.getTime();
101+
}
102+
103+
this.inProgress = !this._inProgress;
104+
this.isComplete = false;
105+
this.isCanceled = false;
79106
}
80107

81108
public check(): void {
82-
this._isComplete = !this._isComplete;
83-
this._inProgress = false;
84-
this._isCanceled = false;
109+
const now: Date = new Date();
110+
111+
if(this.inProgress == true) {
112+
this._passedTime += now.getTime() - this._lastStartTime;
113+
this._lastStartTime = 0;
114+
}
115+
116+
this.isComplete = !this._isComplete;
117+
this.inProgress = false;
118+
this.isCanceled = false;
85119
}
86120

87121
public cancel(): void {
88-
this._isCanceled = !this._isCanceled;
89-
this._inProgress = false;
90-
this._isComplete = false;
122+
const now: Date = new Date();
123+
124+
if(this.inProgress == true) {
125+
this._passedTime += now.getTime() - this._lastStartTime;
126+
this._lastStartTime = 0;
127+
}
128+
129+
this.isCanceled = !this._isCanceled;
130+
this.inProgress = false;
131+
this.isComplete = false;
91132
}
92133
}

test/begin.spec.ts

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,16 +57,38 @@ describe('Test begin functionality', () => {
5757
});
5858

5959
it('should begin one task', async() => {
60+
const now = new Date();
6061
await taskline.beginTasks('2');
6162
const data: Array<Item> = await helper.getData([2]);
6263
expect((data[0] as Task).inProgress).toBe(true);
6364
expect((data[0] as Task).isCanceled).toBe(false);
6465
expect((data[0] as Task).isComplete).toBe(false);
66+
expect((data[0] as Task).lastStartTime).toBeGreaterThan(now.getTime());
67+
});
68+
69+
it('should pause one task', async() => {
70+
await taskline.beginTasks('2');
71+
const data: Array<Item> = await helper.getData([2]);
72+
expect((data[0] as Task).inProgress).toBe(false);
73+
expect((data[0] as Task).isCanceled).toBe(false);
74+
expect((data[0] as Task).isComplete).toBe(false);
75+
expect((data[0] as Task).passedTime).toBeGreaterThan(0);
76+
});
77+
78+
it('should continue one task', async() => {
79+
const now = new Date();
80+
await taskline.beginTasks('2');
81+
const data: Array<Item> = await helper.getData([2]);
82+
expect((data[0] as Task).inProgress).toBe(true);
83+
expect((data[0] as Task).isCanceled).toBe(false);
84+
expect((data[0] as Task).isComplete).toBe(false);
85+
expect((data[0] as Task).passedTime).toBeGreaterThan(0);
86+
expect((data[0] as Task).lastStartTime).toBeGreaterThan(now.getTime());
6587
});
6688

6789
it('should begin multiple tasks', () => {
6890
return taskline.beginTasks('2,3').then(() => {
69-
return helper.getData([2,3]).then((data: any) => {
91+
return helper.getData([2, 3]).then((data: any) => {
7092
expect((data[0] as Task).inProgress).toBe(false);
7193
expect((data[0] as Task).isCanceled).toBe(false);
7294
expect((data[0] as Task).isComplete).toBe(false);
@@ -79,7 +101,7 @@ describe('Test begin functionality', () => {
79101

80102
it('should begin multiple tasks by id range', () => {
81103
return taskline.beginTasks('2-3').then(() => {
82-
return helper.getData([2,3]).then((data: any) => {
104+
return helper.getData([2, 3]).then((data: any) => {
83105
expect((data[0] as Task).inProgress).toBe(true);
84106
expect((data[0] as Task).isComplete).toBe(false);
85107
expect((data[1] as Task).inProgress).toBe(false);

0 commit comments

Comments
 (0)