some more work!

This commit is contained in:
Ell 2022-09-27 17:03:44 +02:00
parent 93ecd63a73
commit e1c0a3cd17
4 changed files with 146 additions and 118 deletions

View file

@ -1,7 +1,7 @@
import { ButtonComponent, MarkdownView, Plugin, TextComponent } from "obsidian"; import { ButtonComponent, Plugin, TextComponent } from "obsidian";
import { defaultSettings, SimpleTimeTrackerSettings } from "./settings"; import { defaultSettings, SimpleTimeTrackerSettings } from "./settings";
import { SimpleTimeTrackerSettingsTab } from "./settings-tab"; import { SimpleTimeTrackerSettingsTab } from "./settings-tab";
import { Tracker } from "./tracker"; import { displayTracker, endEntry, isRunning, loadTracker, saveTracker, startEntry, Tracker } from "./tracker";
export default class SimpleTimeTrackerPlugin extends Plugin { export default class SimpleTimeTrackerPlugin extends Plugin {
@ -16,18 +16,23 @@ export default class SimpleTimeTrackerPlugin extends Plugin {
e.empty(); e.empty();
e.addClass("simple-time-tracker"); e.addClass("simple-time-tracker");
let tracker = Tracker.load(s); let tracker = loadTracker(s);
let name = new TextComponent(e) let name = new TextComponent(e)
.setPlaceholder("Name this segment"); .setPlaceholder("Name this segment");
new ButtonComponent(e) new ButtonComponent(e)
.setButtonText("Start") .setButtonText("Start")
.onClick(() => { .onClick(async () => {
tracker.start(name.getValue()); if (isRunning(tracker)) {
endEntry(tracker);
// TODO how do we save to the code block?? } else {
tracker.save(); startEntry(tracker, name.getValue());
}
name.setValue("");
await saveTracker(tracker, this.app, i.getSectionInfo(e));
}); });
displayTracker(tracker, e);
}); });
} }

View file

@ -1,32 +1,46 @@
import { MarkdownSectionInformation } from "obsidian"; import { App, MarkdownSectionInformation } from "obsidian";
export class Tracker { export class Tracker {
entries: Entry[];
entries: Entry[] = [];
display(element: HTMLElement): void {
let list = element.createEl("ul");
for (let entry of this.entries)
list.createEl("li", { text: entry.toString() });
} }
export interface Entry {
name: string;
startTime: number;
endTime: number;
}
start(name: string): void { export function startEntry(tracker: Tracker, name: string): void {
// date constructor returns the current date // date constructor returns the current date
let entry = new Entry(name, new Date()); let entry: Entry = { name: name, startTime: Date.now(), endTime: null };
this.entries.push(entry); tracker.entries.push(entry);
};
export function endEntry(tracker: Tracker): void {
let last = tracker.entries.last();
last.endTime = Date.now();
} }
end(): void { export function isRunning(tracker: Tracker): boolean {
let last = tracker.entries.last();
return last != null && !last.endTime;
} }
save(): void { export async function saveTracker(tracker: Tracker, app: App, section: MarkdownSectionInformation): Promise<void> {
// TODO save let file = app.workspace.getActiveFile();
JSON.stringify(this); let content = await app.vault.cachedRead(file);
// figure out what part of the content we have to edit
let lines = content.split("\n");
let prev = lines.filter((_, i) => i <= section.lineStart).join("\n");
let next = lines.filter((_, i) => i >= section.lineEnd).join("\n");
// edit only the code block content, leave the rest untouched
content = `${prev}\n${JSON.stringify(tracker)}\n${next}`;
await app.vault.modify(file, content);
} }
static load(json: string): Tracker { export function loadTracker(json: string): Tracker {
if (json) { if (json) {
try { try {
return JSON.parse(json); return JSON.parse(json);
@ -34,32 +48,28 @@ export class Tracker {
console.log(`Failed to parse Tracker from ${json}`); console.log(`Failed to parse Tracker from ${json}`);
} }
} }
return new Tracker(); return { entries: [] };
}
} }
export class Entry { export function displayTracker(tracker: Tracker, element: HTMLElement): void {
let list = element.createEl("ul");
for (let entry of tracker.entries)
list.createEl("li", { text: displayEntry(entry) });
};
private name: string; export function displayEntry(entry: Entry): string {
private startTime: Date; // TODO add an option to display this as an interval rather than a from - to string
private endTime: Date;
constructor(name: string, startTime: Date) {
this.name = name;
this.startTime = startTime;
}
toString(): string {
let ret = ""; let ret = "";
if (this.name) if (entry.name)
ret += `${this.name}: `; ret += `${entry.name}: `;
// if the days or months are different, we want to add the full date let start = new Date(entry.startTime);
if (this.startTime.getDay() != this.endTime.getDay() || this.startTime.getMonth() != this.endTime.getMonth()) { ret += `${start.toLocaleString()} - `;
ret += `${this.startTime.toLocaleString()} - ${this.endTime.toLocaleString()}`;
} else { if (entry.endTime) {
ret += `${this.startTime.toLocaleTimeString()} - ${this.endTime.toLocaleTimeString()}`; let end = new Date(entry.endTime);
ret += `${end.toLocaleString()}`;
} }
return ret; return ret;
} }
}

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,7 @@
This is a time tracker: This is a time tracker:
```simple-time-tracker ```simple-time-tracker
{"entries":[{"name":"","startTime":1664290639233,"endTime":1664290642003},{"name":"","startTime":1664290643788,"endTime":1664290647600},{"name":"","startTime":1664290650678,"endTime":1664290653168},{"name":"Another segment","startTime":1664290658822,"endTime":1664290662444},{"name":"","startTime":1664290690793,"endTime":1664290692366},{"name":"","startTime":1664290695119,"endTime":1664290696140}]}
``` ```