add total today (#64)

* add total today

* not change format semicolons

* Add settings for show total today
This commit is contained in:
hen 2024-11-15 11:57:01 -03:00 committed by GitHub
parent 3dc0857ef1
commit 1831b25dee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 57 additions and 11 deletions

View file

@ -1,13 +1,13 @@
import { MarkdownRenderChild, Plugin, TFile } from "obsidian";
import { defaultSettings, SimpleTimeTrackerSettings } from "./settings";
import { SimpleTimeTrackerSettingsTab } from "./settings-tab";
import { displayTracker, Entry, formatDuration, formatTimestamp, getDuration, getRunningEntry, getTotalDuration, isRunning, loadAllTrackers, loadTracker, orderedEntries } from "./tracker";
import { displayTracker, Entry, formatDuration, formatTimestamp, getDuration, getDurationToday, getRunningEntry, getTotalDuration, getTotalDurationToday, isRunning, loadAllTrackers, loadTracker, orderedEntries } from "./tracker";
export default class SimpleTimeTrackerPlugin extends Plugin {
public api = {
// verbatim versions of the functions found in tracker.ts with the same parameters
loadTracker, loadAllTrackers, getDuration, getTotalDuration, getRunningEntry, isRunning,
loadTracker, loadAllTrackers, getDuration, getTotalDuration, getDurationToday, getTotalDurationToday, getRunningEntry, isRunning,
// modified versions of the functions found in tracker.ts, with the number of required arguments reduced
formatTimestamp: (timestamp: string) => formatTimestamp(timestamp, this.settings),

View file

@ -1,6 +1,6 @@
import {App, PluginSettingTab, Setting} from "obsidian";
import { App, PluginSettingTab, Setting } from "obsidian";
import SimpleTimeTrackerPlugin from "./main";
import {defaultSettings} from "./settings";
import { defaultSettings } from "./settings";
export class SimpleTimeTrackerSettingsTab extends PluginSettingTab {
@ -13,14 +13,14 @@ export class SimpleTimeTrackerSettingsTab extends PluginSettingTab {
display(): void {
this.containerEl.empty();
this.containerEl.createEl("h2", {text: "Super Simple Time Tracker Settings"});
this.containerEl.createEl("h2", { text: "Super Simple Time Tracker Settings" });
new Setting(this.containerEl)
.setName("Timestamp Display Format")
.setDesc(createFragment(f => {
f.createSpan({text: "The way that timestamps in time tracker tables should be displayed. Uses "});
f.createEl("a", {text: "moment.js", href: "https://momentjs.com/docs/#/parsing/string-format/"});
f.createSpan({text: " syntax."});
f.createSpan({ text: "The way that timestamps in time tracker tables should be displayed. Uses " });
f.createEl("a", { text: "moment.js", href: "https://momentjs.com/docs/#/parsing/string-format/" });
f.createSpan({ text: " syntax." });
}))
.addText(t => {
t.setValue(String(this.plugin.settings.timestampFormat));
@ -74,6 +74,17 @@ export class SimpleTimeTrackerSettingsTab extends PluginSettingTab {
});
});
new Setting(this.containerEl)
.setName('Show Total Today')
.setDesc('Whether the total time spent today should be displayed in the tracker table.')
.addToggle(t => {
t.setValue(this.plugin.settings.showToday);
t.onChange(async v => {
this.plugin.settings.showToday = v;
await this.plugin.saveSettings();
});
});
this.containerEl.createEl("hr");
this.containerEl.createEl("p", { text: "Need help using the plugin? Feel free to join the Discord server!" });
this.containerEl.createEl("a", { href: "https://link.ellpeck.de/discordweb" }).createEl("img", {

View file

@ -4,7 +4,8 @@ export const defaultSettings: SimpleTimeTrackerSettings = {
csvDelimiter: ",",
fineGrainedDurations: true,
reverseSegmentOrder: false,
timestampDurations: false
timestampDurations: false,
showToday: false,
};
export interface SimpleTimeTrackerSettings {
@ -15,5 +16,5 @@ export interface SimpleTimeTrackerSettings {
fineGrainedDurations: boolean;
reverseSegmentOrder: boolean;
timestampDurations: boolean;
showToday: boolean;
}

View file

@ -101,6 +101,12 @@ export function displayTracker(tracker: Tracker, element: HTMLElement, getFile:
let total = totalDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "0s" });
totalDiv.createEl("span", { text: "Total" });
if (settings.showToday) {
let totalTodayDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" })
let totalToday = totalTodayDiv.createEl("span", { cls: "simple-time-tracker-timer-time", text: "0s" })
totalTodayDiv.createEl("span", { text: "Today" })
}
if (tracker.entries.length > 0) {
// add table
let table = element.createEl("table", { cls: "simple-time-tracker-table" });
@ -145,6 +151,26 @@ export function getDuration(entry: Entry): number {
}
}
export function getDurationToday(entry: Entry): number {
if (entry.subEntries) {
return getTotalDurationToday(entry.subEntries)
} else {
let today = moment().startOf('day')
let endTime = entry.endTime ? moment(entry.endTime) : moment()
let startTime = moment(entry.startTime)
if (endTime.isBefore(today)) {
return 0
}
if (startTime.isBefore(today)) {
startTime = today
}
return endTime.diff(startTime)
}
}
export function getTotalDuration(entries: Entry[]): number {
let ret = 0;
for (let entry of entries)
@ -152,6 +178,13 @@ export function getTotalDuration(entries: Entry[]): number {
return ret;
}
export function getTotalDurationToday(entries: Entry[]): number {
let ret = 0
for (let entry of entries)
ret += getDurationToday(entry)
return ret
}
export function isRunning(tracker: Tracker): boolean {
return !!getRunningEntry(tracker.entries);
}

View file

@ -4,5 +4,6 @@
"csvDelimiter": ",",
"fineGrainedDurations": true,
"reverseSegmentOrder": false,
"timestampDurations": true
"timestampDurations": true,
"showToday": true
}