diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 4008783..2c75f96 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -12,6 +12,30 @@ { "groupName": "fonts", "elementNamePattern": ["@/fonts/**"] + }, + { + "groupName": "modals", + "elementNamePattern": ["@/modals/**"] + }, + { + "groupName": "service", + "elementNamePattern": ["@/service/**"] + }, + { + "groupName": "timekeep", + "elementNamePattern": ["@/timekeep/**"] + }, + { + "groupName": "views", + "elementNamePattern": ["@/views/**"] + }, + { + "groupName": "components", + "elementNamePattern": ["@/components/**"] + }, + { + "groupName": "commands", + "elementNamePattern": ["@/commands/**"] } ], "groups": [ @@ -21,6 +45,12 @@ "value-internal", ["type-parent", "type-sibling", "type-index"], ["value-parent", "value-sibling", "value-index"], + "components", + "modals", + "views", + "timekeep", + "service", + "commands", "fonts", "unknown" ] diff --git a/src/commands/createMerged.ts b/src/commands/createMerged.ts index 49ebf38..a08fc63 100644 --- a/src/commands/createMerged.ts +++ b/src/commands/createMerged.ts @@ -1,10 +1,12 @@ import { App, Command } from "obsidian"; -import { TimekeepMergerModal } from "@/modals/TimekeepMergerModal"; -import { TimekeepRegistry } from "@/service/registry"; import { TimekeepSettings } from "@/settings"; import { Store } from "@/store"; +import { TimekeepMergerModal } from "@/modals/TimekeepMergerModal"; + +import { TimekeepRegistry } from "@/service/registry"; + export default function ( app: App, registry: TimekeepRegistry, diff --git a/src/commands/exportMergedPdf.ts b/src/commands/exportMergedPdf.ts index ac349b5..447a24d 100644 --- a/src/commands/exportMergedPdf.ts +++ b/src/commands/exportMergedPdf.ts @@ -1,10 +1,12 @@ import { App, Command } from "obsidian"; -import { TimekeepMergerModal } from "@/modals/TimekeepMergerModal"; -import { TimekeepRegistry } from "@/service/registry"; import { TimekeepSettings } from "@/settings"; import { Store } from "@/store"; +import { TimekeepMergerModal } from "@/modals/TimekeepMergerModal"; + +import { TimekeepRegistry } from "@/service/registry"; + export default function ( app: App, registry: TimekeepRegistry, diff --git a/src/commands/findRunningTrackers.ts b/src/commands/findRunningTrackers.ts index 23716a9..d237bad 100644 --- a/src/commands/findRunningTrackers.ts +++ b/src/commands/findRunningTrackers.ts @@ -1,10 +1,12 @@ import { App, Command } from "obsidian"; -import { TimekeepLocatorModal } from "@/modals/TimekeepLocatorModal"; -import { TimekeepRegistry } from "@/service/registry"; import { TimekeepSettings } from "@/settings"; import { Store } from "@/store"; +import { TimekeepLocatorModal } from "@/modals/TimekeepLocatorModal"; + +import { TimekeepRegistry } from "@/service/registry"; + export default function ( app: App, registry: TimekeepRegistry, diff --git a/src/commands/stopAllTimekeeps.ts b/src/commands/stopAllTimekeeps.ts index a64c2f9..3de77b1 100644 --- a/src/commands/stopAllTimekeeps.ts +++ b/src/commands/stopAllTimekeeps.ts @@ -3,9 +3,10 @@ import type { App, Command } from "obsidian"; import moment from "moment"; import { Notice } from "obsidian"; -import { stopAllTimekeeps } from "@/timekeep/stopAllTimekeeps"; import { getErrorMessage } from "@/utils/error"; +import { stopAllTimekeeps } from "@/timekeep/stopAllTimekeeps"; + async function asyncCallback(app: App) { const currentTime = moment(); diff --git a/src/commands/stopFileTimekeeps.ts b/src/commands/stopFileTimekeeps.ts index f8beb02..67a5614 100644 --- a/src/commands/stopFileTimekeeps.ts +++ b/src/commands/stopFileTimekeeps.ts @@ -3,9 +3,10 @@ import type { App, Command } from "obsidian"; import moment from "moment"; import { Notice } from "obsidian"; -import { stopFileTimekeeps } from "@/timekeep/stopFileTimekeeps"; import { getErrorMessage } from "@/utils/error"; +import { stopFileTimekeeps } from "@/timekeep/stopFileTimekeeps"; + async function asyncCallback(app: App) { const currentTime = moment(); const currentFile = app.workspace.activeEditor?.file ?? null; diff --git a/src/components/ContentComponent/ContentComponent.test.ts b/src/components/ContentComponent/ContentComponent.test.ts index 4ef8e0f..3f87fc1 100644 --- a/src/components/ContentComponent/ContentComponent.test.ts +++ b/src/components/ContentComponent/ContentComponent.test.ts @@ -3,11 +3,12 @@ import { describe, it, expect, beforeEach } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; -import { DomComponent } from "@/components/DomComponent"; -import { ReplaceableComponent } from "@/components/ReplaceableComponent"; import { ContentComponent } from "./ContentComponent"; +import { DomComponent } from "@/components/DomComponent"; +import { ReplaceableComponent } from "@/components/ReplaceableComponent"; + describe("ContentComponent", () => { let container: HTMLElement; diff --git a/src/components/ReplaceableComponent/ReplaceableComponent.test.ts b/src/components/ReplaceableComponent/ReplaceableComponent.test.ts index 1d76669..1af860b 100644 --- a/src/components/ReplaceableComponent/ReplaceableComponent.test.ts +++ b/src/components/ReplaceableComponent/ReplaceableComponent.test.ts @@ -3,11 +3,12 @@ import { describe, expect, it, vi } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; -import { ContentComponent } from "@/components/ContentComponent"; -import { DomComponent } from "@/components/DomComponent"; import { ReplaceableComponent } from "./ReplaceableComponent"; +import { ContentComponent } from "@/components/ContentComponent"; +import { DomComponent } from "@/components/DomComponent"; + describe("ReplaceableComponent", () => { it("load in without a previous element should cause a normal append", () => { const container = createMockContainer(); diff --git a/src/components/Timesheet/Timesheet.test.ts b/src/components/Timesheet/Timesheet.test.ts index 4ca2f19..11fa6de 100644 --- a/src/components/Timesheet/Timesheet.test.ts +++ b/src/components/Timesheet/Timesheet.test.ts @@ -5,18 +5,21 @@ import type { App } from "obsidian"; import { beforeEach, describe, expect, it, Mock, vi } from "vitest"; import type { CustomOutputFormat } from "@/output"; -import type { Timekeep } from "@/timekeep/schema"; import { createMockContainer, MockVault } from "@/__mocks__/obsidian"; -import { TimesheetApp } from "@/components/TimesheetApp"; -import { TimesheetSaveError } from "@/components/TimesheetSaveError"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { TimekeepRegistry } from "@/service/registry"; import { defaultSettings, type TimekeepSettings } from "@/settings"; import { createStore, type Store } from "@/store"; import { Timesheet } from "./Timesheet"; +import { TimesheetApp } from "@/components/TimesheetApp"; +import { TimesheetSaveError } from "@/components/TimesheetSaveError"; + +import type { Timekeep } from "@/timekeep/schema"; + +import { TimekeepAutocomplete } from "@/service/autocomplete"; +import { TimekeepRegistry } from "@/service/registry"; + describe("Timesheet", () => { let containerEl: HTMLElement; let vault: MockVault; diff --git a/src/components/Timesheet/Timesheet.ts b/src/components/Timesheet/Timesheet.ts index 1de8aaf..42604f7 100644 --- a/src/components/Timesheet/Timesheet.ts +++ b/src/components/Timesheet/Timesheet.ts @@ -3,11 +3,13 @@ import type { App } from "obsidian"; import type { CustomOutputFormat } from "@/output"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; import { ContentComponent } from "@/components/ContentComponent"; import { TimesheetApp } from "@/components/TimesheetApp"; import { TimesheetSaveError } from "@/components/TimesheetSaveError"; + +import type { Timekeep } from "@/timekeep/schema"; + import { TimekeepAutocomplete } from "@/service/autocomplete"; /** diff --git a/src/components/TimesheetApp/TimesheetApp.test.ts b/src/components/TimesheetApp/TimesheetApp.test.ts index 8b1f25f..98d9c7e 100644 --- a/src/components/TimesheetApp/TimesheetApp.test.ts +++ b/src/components/TimesheetApp/TimesheetApp.test.ts @@ -5,16 +5,18 @@ import type { App } from "obsidian"; import { beforeEach, describe, expect, it } from "vitest"; import type { CustomOutputFormat } from "@/output"; -import type { Timekeep } from "@/timekeep/schema"; import { createMockContainer, MockVault } from "@/__mocks__/obsidian"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { TimekeepRegistry } from "@/service/registry"; import { defaultSettings, type TimekeepSettings } from "@/settings"; import { createStore, type Store } from "@/store"; import { TimesheetApp } from "./TimesheetApp"; +import type { Timekeep } from "@/timekeep/schema"; + +import { TimekeepAutocomplete } from "@/service/autocomplete"; +import { TimekeepRegistry } from "@/service/registry"; + describe("TimesheetApp", () => { let containerEl: HTMLElement; let vault: MockVault; diff --git a/src/components/TimesheetApp/TimesheetApp.ts b/src/components/TimesheetApp/TimesheetApp.ts index a23aff3..9429078 100644 --- a/src/components/TimesheetApp/TimesheetApp.ts +++ b/src/components/TimesheetApp/TimesheetApp.ts @@ -1,17 +1,20 @@ import { App } from "obsidian"; +import { CustomOutputFormat } from "@/output"; +import { TimekeepSettings } from "@/settings"; +import { Store } from "@/store"; + import { DomComponent } from "@/components/DomComponent"; import { TimesheetCounters } from "@/components/TimesheetCounters"; import { TimesheetExportActions } from "@/components/TimesheetExportActions"; import { TimesheetRunningEntry } from "@/components/TimesheetRunningEntry"; import { TimesheetStartForm } from "@/components/TimesheetStartForm"; import { TimesheetTable } from "@/components/TimesheetTable"; -import { CustomOutputFormat } from "@/output"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { TimekeepSettings } from "@/settings"; -import { Store } from "@/store"; + import { Timekeep } from "@/timekeep/schema"; +import { TimekeepAutocomplete } from "@/service/autocomplete"; + /** * View component for the timesheet app as a whole */ diff --git a/src/components/TimesheetCounters/TimesheetCounters.test.ts b/src/components/TimesheetCounters/TimesheetCounters.test.ts index 8e00d7d..3f89bd1 100644 --- a/src/components/TimesheetCounters/TimesheetCounters.test.ts +++ b/src/components/TimesheetCounters/TimesheetCounters.test.ts @@ -7,12 +7,13 @@ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings, TimekeepSettings } from "@/settings"; import { createStore, Store } from "@/store"; -import * as queries from "@/timekeep/queries"; -import { Timekeep } from "@/timekeep/schema"; import { TimesheetCounters } from "./TimesheetCounters"; import { TimesheetTimer } from "./TimesheetTimer"; +import * as queries from "@/timekeep/queries"; +import { Timekeep } from "@/timekeep/schema"; + describe("TimesheetCounters", () => { let container: HTMLElement; let settingsStore: Store; diff --git a/src/components/TimesheetCounters/TimesheetCounters.ts b/src/components/TimesheetCounters/TimesheetCounters.ts index b9af828..0c34c02 100644 --- a/src/components/TimesheetCounters/TimesheetCounters.ts +++ b/src/components/TimesheetCounters/TimesheetCounters.ts @@ -2,18 +2,20 @@ import moment from "moment"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; + +import { formatDuration } from "@/utils/time"; + +import { TimesheetTimer } from "./TimesheetTimer"; import { DomComponent } from "@/components/DomComponent"; + import { getEntryDuration, getRunningEntry, getTotalDuration, isKeepRunning, } from "@/timekeep/queries"; -import { formatDuration } from "@/utils/time"; - -import { TimesheetTimer } from "./TimesheetTimer"; +import type { Timekeep } from "@/timekeep/schema"; /** * Component for rendering the two live updating timers at the top of the diff --git a/src/components/TimesheetEntryDuration/TimesheetEntryDuration.test.ts b/src/components/TimesheetEntryDuration/TimesheetEntryDuration.test.ts index 2b25145..28865e3 100644 --- a/src/components/TimesheetEntryDuration/TimesheetEntryDuration.test.ts +++ b/src/components/TimesheetEntryDuration/TimesheetEntryDuration.test.ts @@ -4,11 +4,12 @@ import moment from "moment"; import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; -import * as queries from "@/timekeep/queries"; import * as timeUtils from "@/utils/time"; import { TimesheetEntryDuration } from "./TimesheetEntryDuration"; +import * as queries from "@/timekeep/queries"; + describe("TimesheetEntryDuration", () => { let container: HTMLElement; let entry: any; diff --git a/src/components/TimesheetEntryDuration/TimesheetEntryDuration.ts b/src/components/TimesheetEntryDuration/TimesheetEntryDuration.ts index c8a5500..0c6c6ea 100644 --- a/src/components/TimesheetEntryDuration/TimesheetEntryDuration.ts +++ b/src/components/TimesheetEntryDuration/TimesheetEntryDuration.ts @@ -1,11 +1,13 @@ import moment from "moment"; -import { DomComponent } from "@/components/DomComponent"; -import { getEntryDuration, isEntryRunning } from "@/timekeep/queries"; -import { TimeEntry } from "@/timekeep/schema"; import { assert } from "@/utils/assert"; import { formatDurationLong } from "@/utils/time"; +import { DomComponent } from "@/components/DomComponent"; + +import { getEntryDuration, isEntryRunning } from "@/timekeep/queries"; +import { TimeEntry } from "@/timekeep/schema"; + /** * Component for rendering the live-updating duration on * an entry diff --git a/src/components/TimesheetEntryName/TimesheetEntryName.ts b/src/components/TimesheetEntryName/TimesheetEntryName.ts index 1f19388..7e7bf9a 100644 --- a/src/components/TimesheetEntryName/TimesheetEntryName.ts +++ b/src/components/TimesheetEntryName/TimesheetEntryName.ts @@ -1,6 +1,5 @@ import type { App } from "obsidian"; -import { DomComponent } from "@/components/DomComponent"; import { NameSegment, NameSegmentLink, @@ -9,6 +8,8 @@ import { parseNameSegments, } from "@/utils/name"; +import { DomComponent } from "@/components/DomComponent"; + /** * Component for rendering the name of a timekeep entry, this * handles segmenting the name into parts to allow links within diff --git a/src/components/TimesheetExportActions/TimesheetExportActions.test.ts b/src/components/TimesheetExportActions/TimesheetExportActions.test.ts index 4b0b7fb..7390d47 100644 --- a/src/components/TimesheetExportActions/TimesheetExportActions.test.ts +++ b/src/components/TimesheetExportActions/TimesheetExportActions.test.ts @@ -11,10 +11,11 @@ import * as exportPdf from "@/export/pdf"; import { CustomOutputFormat } from "@/output"; import { defaultSettings, TimekeepSettings } from "@/settings"; import { createStore, Store } from "@/store"; -import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; import { TimesheetExportActions } from "./TimesheetExportActions"; +import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; + describe("TimesheetExportActions", () => { let container: HTMLElement; let app: App; diff --git a/src/components/TimesheetExportActions/TimesheetExportActions.ts b/src/components/TimesheetExportActions/TimesheetExportActions.ts index b5d8e24..bc79d1f 100644 --- a/src/components/TimesheetExportActions/TimesheetExportActions.ts +++ b/src/components/TimesheetExportActions/TimesheetExportActions.ts @@ -5,12 +5,14 @@ import type { CustomOutputFormat } from "@/output"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import { DomComponent } from "@/components/DomComponent"; import { createCSV, createMarkdownTable } from "@/export"; import { exportPdf } from "@/export/pdf"; -import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; import { assert } from "@/utils/assert"; +import { DomComponent } from "@/components/DomComponent"; + +import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; + /** * Export actions section component */ diff --git a/src/components/TimesheetNameInput/TimesheetNameInput.test.ts b/src/components/TimesheetNameInput/TimesheetNameInput.test.ts index 569fce3..745e2a9 100644 --- a/src/components/TimesheetNameInput/TimesheetNameInput.test.ts +++ b/src/components/TimesheetNameInput/TimesheetNameInput.test.ts @@ -5,14 +5,15 @@ import { beforeEach, describe, expect, it, Mock, vi } from "vitest"; import type { Store } from "@/store"; import { createMockContainer, MockVault } from "@/__mocks__/obsidian"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { TimekeepRegistry } from "@/service/registry"; import { defaultSettings, type TimekeepSettings } from "@/settings"; import { createStore } from "@/store"; import * as debounceUtil from "@/utils/debounce"; import { TimesheetNameInput } from "./TimesheetNameInput"; +import { TimekeepAutocomplete } from "@/service/autocomplete"; +import { TimekeepRegistry } from "@/service/registry"; + describe("TimesheetNameInput", () => { let containerEl: HTMLElement; let vault: MockVault; diff --git a/src/components/TimesheetNameInput/TimesheetNameInput.ts b/src/components/TimesheetNameInput/TimesheetNameInput.ts index cfd85a4..cfc926b 100644 --- a/src/components/TimesheetNameInput/TimesheetNameInput.ts +++ b/src/components/TimesheetNameInput/TimesheetNameInput.ts @@ -1,10 +1,12 @@ import Fuse, { FuseResult } from "fuse.js"; -import { DomComponent } from "@/components/DomComponent"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; import { assert } from "@/utils/assert"; import { debounced } from "@/utils/debounce"; +import { DomComponent } from "@/components/DomComponent"; + +import { TimekeepAutocomplete } from "@/service/autocomplete"; + export class TimesheetNameInput extends DomComponent { /** Access to autocomplete */ autocomplete: TimekeepAutocomplete; diff --git a/src/components/TimesheetRow/TimesheetRow.test.ts b/src/components/TimesheetRow/TimesheetRow.test.ts index b9f989d..7534770 100644 --- a/src/components/TimesheetRow/TimesheetRow.test.ts +++ b/src/components/TimesheetRow/TimesheetRow.test.ts @@ -6,8 +6,6 @@ import moment from "moment"; import { v4 } from "uuid"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; - import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings, TimekeepSettings } from "@/settings"; import { createStore, type Store } from "@/store"; @@ -16,6 +14,8 @@ import { TimesheetRow } from "./TimesheetRow"; import { TimesheetRowContent } from "./TimesheetRowContent"; import { TimesheetRowContentEditing } from "./TimesheetRowContentEditing"; +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + describe("TimesheetRowContainer", () => { let containerEl: HTMLElement; let app: App; diff --git a/src/components/TimesheetRow/TimesheetRow.ts b/src/components/TimesheetRow/TimesheetRow.ts index 445b9e7..62a5f30 100644 --- a/src/components/TimesheetRow/TimesheetRow.ts +++ b/src/components/TimesheetRow/TimesheetRow.ts @@ -2,13 +2,14 @@ import type { App } from "obsidian"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; - -import { ContentComponent } from "@/components/ContentComponent"; import { TimesheetRowContent } from "./TimesheetRowContent"; import { TimesheetRowContentEditing } from "./TimesheetRowContentEditing"; +import { ContentComponent } from "@/components/ContentComponent"; + +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + /** * This container allows a entry to switch between the default and * editable views without re-rendering the entire table or having a diff --git a/src/components/TimesheetRow/TimesheetRowContent.test.ts b/src/components/TimesheetRow/TimesheetRowContent.test.ts index cb84401..02816db 100644 --- a/src/components/TimesheetRow/TimesheetRowContent.test.ts +++ b/src/components/TimesheetRow/TimesheetRowContent.test.ts @@ -8,10 +8,11 @@ import { beforeEach, describe, expect, it, Mock, vi } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings, TimekeepSettings } from "@/settings"; import { createStore, Store } from "@/store"; -import { TimeEntry, Timekeep } from "@/timekeep/schema"; import { TimesheetRowContent } from "./TimesheetRowContent"; +import { TimeEntry, Timekeep } from "@/timekeep/schema"; + describe("TimesheetRowContent", () => { const start = moment(); diff --git a/src/components/TimesheetRow/TimesheetRowContent.ts b/src/components/TimesheetRow/TimesheetRowContent.ts index cf37e6b..f173deb 100644 --- a/src/components/TimesheetRow/TimesheetRowContent.ts +++ b/src/components/TimesheetRow/TimesheetRowContent.ts @@ -4,17 +4,19 @@ import moment from "moment"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + +import { assert } from "@/utils/assert"; +import { formatTimestamp } from "@/utils/time"; import { createObsidianIcon } from "@/components/obsidianIcon"; import { ReplaceableComponent } from "@/components/ReplaceableComponent"; import { TimesheetEntryDuration } from "@/components/TimesheetEntryDuration"; import { TimesheetEntryName } from "@/components/TimesheetEntryName"; + import { getRunningEntry, isEntryRunning } from "@/timekeep/queries"; +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; import { startNewNestedEntry } from "@/timekeep/start"; import { setEntryCollapsed, updateEntry } from "@/timekeep/update"; -import { assert } from "@/utils/assert"; -import { formatTimestamp } from "@/utils/time"; /** * Component for the contents of a timesheet row diff --git a/src/components/TimesheetRow/TimesheetRowContentEditing.test.ts b/src/components/TimesheetRow/TimesheetRowContentEditing.test.ts index 2613f7a..5904761 100644 --- a/src/components/TimesheetRow/TimesheetRowContentEditing.test.ts +++ b/src/components/TimesheetRow/TimesheetRowContentEditing.test.ts @@ -8,7 +8,6 @@ import { beforeEach, it, describe, Mock, vi, expect, afterEach } from "vitest"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings } from "@/settings"; @@ -16,6 +15,8 @@ import { createStore } from "@/store"; import { TimesheetRowContentEditing } from "./TimesheetRowContentEditing"; +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + describe("TimesheetRowContentEditing", () => { let containerEl: HTMLElement; let app: App; diff --git a/src/components/TimesheetRow/TimesheetRowContentEditing.ts b/src/components/TimesheetRow/TimesheetRowContentEditing.ts index 66a52d5..0a289e2 100644 --- a/src/components/TimesheetRow/TimesheetRowContentEditing.ts +++ b/src/components/TimesheetRow/TimesheetRowContentEditing.ts @@ -4,13 +4,16 @@ import { assert } from "vitest"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + +import { formatEditableTimestamp, parseEditableTimestamp } from "@/utils/time"; import { createObsidianIcon } from "@/components/obsidianIcon"; import { ReplaceableComponent } from "@/components/ReplaceableComponent"; + import { ConfirmModal } from "@/modals/ConfirmModal"; + +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; import { removeEntry, updateEntry } from "@/timekeep/update"; -import { formatEditableTimestamp, parseEditableTimestamp } from "@/utils/time"; /** * Component for a timesheet row entry that is currently diff --git a/src/components/TimesheetRunningEntry/TimesheetRunningEntry.test.ts b/src/components/TimesheetRunningEntry/TimesheetRunningEntry.test.ts index 7b79d16..3565f5e 100644 --- a/src/components/TimesheetRunningEntry/TimesheetRunningEntry.test.ts +++ b/src/components/TimesheetRunningEntry/TimesheetRunningEntry.test.ts @@ -6,7 +6,6 @@ import { beforeEach, it, describe, expect, afterEach } from "vitest"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings } from "@/settings"; @@ -16,6 +15,8 @@ import { TimesheetRunningEntry } from "./TimesheetRunningEntry"; import { TimesheetRunningEntryEditing } from "./TimesheetRunningEntryEditing"; import { TimesheetRunningEntryViewing } from "./TimesheetRunningEntryViewing"; +import type { Timekeep } from "@/timekeep/schema"; + describe("TimesheetRunningEntry", () => { let containerEl: HTMLElement; let timekeep: Store; diff --git a/src/components/TimesheetRunningEntry/TimesheetRunningEntry.ts b/src/components/TimesheetRunningEntry/TimesheetRunningEntry.ts index a1befd3..39fc469 100644 --- a/src/components/TimesheetRunningEntry/TimesheetRunningEntry.ts +++ b/src/components/TimesheetRunningEntry/TimesheetRunningEntry.ts @@ -1,14 +1,16 @@ import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; -import { ContentComponent } from "@/components/ContentComponent"; -import { getRunningEntry } from "@/timekeep/queries"; import { assert } from "@/utils/assert"; import { TimesheetRunningEntryEditing } from "./TimesheetRunningEntryEditing"; import { TimesheetRunningEntryViewing } from "./TimesheetRunningEntryViewing"; +import { ContentComponent } from "@/components/ContentComponent"; + +import { getRunningEntry } from "@/timekeep/queries"; +import type { Timekeep } from "@/timekeep/schema"; + export class TimesheetRunningEntry extends ContentComponent< TimesheetRunningEntryViewing | TimesheetRunningEntryEditing > { diff --git a/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.test.ts b/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.test.ts index c4e6302..73668d7 100644 --- a/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.test.ts +++ b/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.test.ts @@ -6,7 +6,6 @@ import { beforeEach, it, describe, vi, expect } from "vitest"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings } from "@/settings"; @@ -14,6 +13,8 @@ import { createStore } from "@/store"; import { TimesheetRunningEntryEditing } from "./TimesheetRunningEntryEditing"; +import type { Timekeep } from "@/timekeep/schema"; + describe("TimesheetRunningEntryEditing", () => { let containerEl: HTMLElement; let timekeep: Store; diff --git a/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.ts b/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.ts index 9eacdcf..63bcb7e 100644 --- a/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.ts +++ b/src/components/TimesheetRunningEntry/TimesheetRunningEntryEditing.ts @@ -1,12 +1,14 @@ import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; + +import { assert } from "@/utils/assert"; import { DomComponent } from "@/components/DomComponent"; import { createObsidianIcon } from "@/components/obsidianIcon"; + import { getRunningEntry } from "@/timekeep/queries"; +import type { Timekeep } from "@/timekeep/schema"; import { updateEntry } from "@/timekeep/update"; -import { assert } from "@/utils/assert"; /** * The editing section for editing the currently diff --git a/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.test.ts b/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.test.ts index 33a95ff..8af7a9b 100644 --- a/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.test.ts +++ b/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.test.ts @@ -4,14 +4,14 @@ import moment from "moment"; import { v4 } from "uuid"; import { describe, it, vi, beforeEach, afterEach, expect } from "vitest"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; - import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings, type TimekeepSettings } from "@/settings"; import { createStore, type Store } from "@/store"; import { TimesheetRunningEntryViewing } from "./TimesheetRunningEntryViewing"; +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + describe("TimesheetRunningEntry", () => { let containerEl: HTMLElement; let timekeep: Store; diff --git a/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.ts b/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.ts index ae0bb9e..ada3cab 100644 --- a/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.ts +++ b/src/components/TimesheetRunningEntry/TimesheetRunningEntryViewing.ts @@ -2,14 +2,16 @@ import moment from "moment"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + +import { assert } from "@/utils/assert"; +import { formatTimestamp } from "@/utils/time"; import { DomComponent } from "@/components/DomComponent"; import { createObsidianIcon } from "@/components/obsidianIcon"; + import { getPathToEntry } from "@/timekeep/queries"; +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; import { stopTimekeep } from "@/timekeep/update"; -import { assert } from "@/utils/assert"; -import { formatTimestamp } from "@/utils/time"; /** * The "Running" timer section of the timesheet start are diff --git a/src/components/TimesheetSaveError/TimesheetSaveError.test.ts b/src/components/TimesheetSaveError/TimesheetSaveError.test.ts index cb016e0..eae4f2d 100644 --- a/src/components/TimesheetSaveError/TimesheetSaveError.test.ts +++ b/src/components/TimesheetSaveError/TimesheetSaveError.test.ts @@ -4,10 +4,11 @@ import { describe, it, expect, vi, beforeEach, Mock } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; import { createStore, Store } from "@/store"; -import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; import { TimesheetSaveError } from "./TimesheetSaveError"; +import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; + describe("TimesheetSaveError", () => { let container: HTMLElement; let timekeepStore: Store; diff --git a/src/components/TimesheetSaveError/TimesheetSaveError.ts b/src/components/TimesheetSaveError/TimesheetSaveError.ts index 770508b..46689a4 100644 --- a/src/components/TimesheetSaveError/TimesheetSaveError.ts +++ b/src/components/TimesheetSaveError/TimesheetSaveError.ts @@ -1,6 +1,7 @@ import type { Store } from "@/store"; import { DomComponent } from "@/components/DomComponent"; + import { stripTimekeepRuntimeData, type Timekeep } from "@/timekeep/schema"; type HandleSaveTimekeep = (value: Timekeep) => Promise; diff --git a/src/components/TimesheetStartForm/TimesheetStartForm.test.ts b/src/components/TimesheetStartForm/TimesheetStartForm.test.ts index 324f66f..1a5f479 100644 --- a/src/components/TimesheetStartForm/TimesheetStartForm.test.ts +++ b/src/components/TimesheetStartForm/TimesheetStartForm.test.ts @@ -5,16 +5,18 @@ import { beforeEach, it, describe, afterEach, vi, expect } from "vitest"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; import { createMockContainer, MockVault } from "@/__mocks__/obsidian"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { TimekeepRegistry } from "@/service/registry"; import { defaultSettings } from "@/settings"; import { createStore } from "@/store"; import { TimesheetStartForm } from "./TimesheetStartForm"; +import type { Timekeep } from "@/timekeep/schema"; + +import { TimekeepAutocomplete } from "@/service/autocomplete"; +import { TimekeepRegistry } from "@/service/registry"; + vi.mock(import("uuid"), async (importOriginal) => { return { ...(await importOriginal()), diff --git a/src/components/TimesheetStartForm/TimesheetStartForm.ts b/src/components/TimesheetStartForm/TimesheetStartForm.ts index d52ac56..5a0a6c7 100644 --- a/src/components/TimesheetStartForm/TimesheetStartForm.ts +++ b/src/components/TimesheetStartForm/TimesheetStartForm.ts @@ -2,15 +2,18 @@ import moment from "moment"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; + +import { assert } from "@/utils/assert"; import { DomComponent } from "@/components/DomComponent"; import { createObsidianIcon } from "@/components/obsidianIcon"; import { TimesheetNameInput } from "@/components/TimesheetNameInput"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; + import { getRunningEntry } from "@/timekeep/queries"; +import type { Timekeep } from "@/timekeep/schema"; import { startNewEntry } from "@/timekeep/start"; -import { assert } from "@/utils/assert"; + +import { TimekeepAutocomplete } from "@/service/autocomplete"; /** * The start section above the timesheet table diff --git a/src/components/TimesheetStatusBar/TimesheetStatusBar.test.ts b/src/components/TimesheetStatusBar/TimesheetStatusBar.test.ts index ab2622a..ae5c5a1 100644 --- a/src/components/TimesheetStatusBar/TimesheetStatusBar.test.ts +++ b/src/components/TimesheetStatusBar/TimesheetStatusBar.test.ts @@ -5,12 +5,13 @@ import type { App } from "obsidian"; import { beforeEach, describe, expect, it } from "vitest"; import { createMockContainer, MockVault } from "@/__mocks__/obsidian"; -import { TimekeepRegistry } from "@/service/registry"; import { defaultSettings, type TimekeepSettings } from "@/settings"; import { createStore, type Store } from "@/store"; import { TimesheetStatusBar } from "./TimesheetStatusBar"; +import { TimekeepRegistry } from "@/service/registry"; + describe("TimesheetStatusBar", () => { let containerEl: HTMLElement; let vault: MockVault; diff --git a/src/components/TimesheetStatusBar/TimesheetStatusBar.ts b/src/components/TimesheetStatusBar/TimesheetStatusBar.ts index ed04de5..f9a9371 100644 --- a/src/components/TimesheetStatusBar/TimesheetStatusBar.ts +++ b/src/components/TimesheetStatusBar/TimesheetStatusBar.ts @@ -1,15 +1,16 @@ import { type App } from "obsidian"; import { Component } from "obsidian"; +import { TimesheetStatusBarItem } from "./TimesheetStatusBarItem"; + +import { getRunningEntry } from "@/timekeep/queries"; +import { Timekeep } from "@/timekeep/schema"; + import { TimekeepEntryItemType, TimekeepRegistry, TimekeepRegistryItemRef, } from "@/service/registry"; -import { getRunningEntry } from "@/timekeep/queries"; -import { Timekeep } from "@/timekeep/schema"; - -import { TimesheetStatusBarItem } from "./TimesheetStatusBarItem"; export class TimesheetStatusBar extends Component { /** Parent container element */ diff --git a/src/components/TimesheetStatusBar/TimesheetStatusBarItem.test.ts b/src/components/TimesheetStatusBar/TimesheetStatusBarItem.test.ts index 56e70d7..fb7260f 100644 --- a/src/components/TimesheetStatusBar/TimesheetStatusBarItem.test.ts +++ b/src/components/TimesheetStatusBar/TimesheetStatusBarItem.test.ts @@ -5,10 +5,11 @@ import { v4 } from "uuid"; import { describe, beforeEach, it, expect, vi, afterEach } from "vitest"; import { createMockContainer } from "@/__mocks__/obsidian"; -import { TimeEntry } from "@/timekeep/schema"; import { TimesheetStatusBarItem } from "./TimesheetStatusBarItem"; +import { TimeEntry } from "@/timekeep/schema"; + describe("TimesheetStatusBarItem", () => { const start = moment(); const oneHourLater = start.add(1, "hour"); diff --git a/src/components/TimesheetStatusBar/TimesheetStatusBarItem.ts b/src/components/TimesheetStatusBar/TimesheetStatusBarItem.ts index 7221721..24c0b8f 100644 --- a/src/components/TimesheetStatusBar/TimesheetStatusBarItem.ts +++ b/src/components/TimesheetStatusBar/TimesheetStatusBarItem.ts @@ -1,6 +1,7 @@ import { DomComponent } from "@/components/DomComponent"; import { createObsidianIcon } from "@/components/obsidianIcon"; import { TimesheetEntryDuration } from "@/components/TimesheetEntryDuration"; + import { TimeEntry } from "@/timekeep/schema"; export class TimesheetStatusBarItem extends DomComponent { diff --git a/src/components/TimesheetTable/TimesheetTable.test.ts b/src/components/TimesheetTable/TimesheetTable.test.ts index 32c028f..f9aafe1 100644 --- a/src/components/TimesheetTable/TimesheetTable.test.ts +++ b/src/components/TimesheetTable/TimesheetTable.test.ts @@ -5,8 +5,6 @@ import { type App } from "obsidian"; import { v4 } from "uuid"; import { beforeEach, describe, expect, it, vi } from "vitest"; -import type { Timekeep } from "@/timekeep/schema"; - import { createMockContainer } from "@/__mocks__/obsidian"; import { defaultSettings, type TimekeepSettings } from "@/settings"; import { createStore, type Store } from "@/store"; @@ -14,6 +12,8 @@ import { assert } from "@/utils/assert"; import { TimesheetTable } from "./TimesheetTable"; +import type { Timekeep } from "@/timekeep/schema"; + describe("TimesheetTable", () => { let containerEl: HTMLElement; let app: App; diff --git a/src/components/TimesheetTable/TimesheetTable.ts b/src/components/TimesheetTable/TimesheetTable.ts index be60230..aa746a3 100644 --- a/src/components/TimesheetTable/TimesheetTable.ts +++ b/src/components/TimesheetTable/TimesheetTable.ts @@ -2,12 +2,14 @@ import type { App } from "obsidian"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; -import type { Timekeep } from "@/timekeep/schema"; + +import { assert } from "@/utils/assert"; import { DomComponent } from "@/components/DomComponent"; import { TimesheetRow } from "@/components/TimesheetRow"; + +import type { Timekeep } from "@/timekeep/schema"; import { getEntriesSorted } from "@/timekeep/sort"; -import { assert } from "@/utils/assert"; /** * Table component for rendering the contents of the timekeep diff --git a/src/export/csv.ts b/src/export/csv.ts index 7508778..33b7f73 100644 --- a/src/export/csv.ts +++ b/src/export/csv.ts @@ -2,6 +2,7 @@ import type { Moment } from "moment"; import { RawTableRow, createRawTable } from "@/export"; import { TimekeepSettings } from "@/settings"; + import { Timekeep } from "@/timekeep/schema"; /** diff --git a/src/export/index.ts b/src/export/index.ts index 808c3e4..ca7b76c 100644 --- a/src/export/index.ts +++ b/src/export/index.ts @@ -1,10 +1,11 @@ import type { Moment } from "moment"; import { TimekeepSettings } from "@/settings"; +import { formatDuration, formatTimestamp } from "@/utils/time"; + import { getEntryDuration } from "@/timekeep/queries"; import { TimeEntry } from "@/timekeep/schema"; import { getEntriesSorted } from "@/timekeep/sort"; -import { formatDuration, formatTimestamp } from "@/utils/time"; export { createCSV } from "./csv"; export { createMarkdownTable } from "./markdown-table"; diff --git a/src/export/markdown-table.ts b/src/export/markdown-table.ts index ed3fcd4..693fa33 100644 --- a/src/export/markdown-table.ts +++ b/src/export/markdown-table.ts @@ -2,9 +2,10 @@ import type { Moment } from "moment"; import { RawTableRow, TOTAL_COLUMNS, createRawTable } from "@/export"; import { DurationFormat, TimekeepSettings } from "@/settings"; +import { formatDuration } from "@/utils/time"; + import { getTotalDuration } from "@/timekeep/queries"; import { Timekeep, TimeEntry } from "@/timekeep/schema"; -import { formatDuration } from "@/utils/time"; /** * Creates the table header row diff --git a/src/export/pdf.ts b/src/export/pdf.ts index 105ad48..2787267 100644 --- a/src/export/pdf.ts +++ b/src/export/pdf.ts @@ -11,11 +11,8 @@ import { App, Notice, Platform } from "obsidian"; import pdfMake from "pdfmake"; import type { TimekeepSettings } from "@/settings"; -import type { TimeEntry, Timekeep } from "@/timekeep/schema"; -import { FileNamePromptModal } from "@/modals/FileNamePromptModal"; import { PdfExportBehavior } from "@/settings"; -import { getEntryDuration, getTotalDuration } from "@/timekeep/queries"; import { formatDurationLong, formatDurationShort, @@ -23,6 +20,11 @@ import { formatPdfRowDate, } from "@/utils/time"; +import { FileNamePromptModal } from "@/modals/FileNamePromptModal"; + +import { getEntryDuration, getTotalDuration } from "@/timekeep/queries"; +import type { TimeEntry, Timekeep } from "@/timekeep/schema"; + // Embedded fonts import RobotoBold from "@/fonts/Roboto-Bold.ttf"; import RobotoRegular from "@/fonts/Roboto-Regular.ttf"; diff --git a/src/main.ts b/src/main.ts index 6c50e87..81872ec 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,21 +5,18 @@ import { Plugin, TFolder } from "obsidian"; import type { CustomOutputFormat } from "@/output"; import type { Store } from "@/store"; -import type { Timekeep, TimeEntry } from "@/timekeep/schema"; -import createMerged from "@/commands/createMerged"; -import exportMergedPdf from "@/commands/exportMergedPdf"; -import findRunningTrackers from "@/commands/findRunningTrackers"; -import insertTracker from "@/commands/insertTracker"; -import newTimekeepFile from "@/commands/newTimekeepFile"; -import stopAllTimekeepsCommand from "@/commands/stopAllTimekeeps"; -import stopFileTimekeepsCommand from "@/commands/stopFileTimekeeps"; -import { TimesheetStatusBar } from "@/components/TimesheetStatusBar"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { TimekeepRegistry } from "@/service/registry"; import { defaultSettings, TimekeepSettings, legacySettingsCompatibility } from "@/settings"; import { TimekeepSettingsTab } from "@/settings-tab"; import { createStore } from "@/store"; + +import { createNewTimekeepFile } from "./timekeep/createNewTimekeepFile"; + +import { TimesheetStatusBar } from "@/components/TimesheetStatusBar"; + +import TimekeepFileView from "@/views/TimekeepFileView"; +import TimekeepMarkdownView from "@/views/TimekeepMarkdownView"; + import { replaceTimekeepCodeblock, extractTimekeepCodeblocks } from "@/timekeep/parser"; import { isKeepRunning, @@ -28,12 +25,20 @@ import { getEntryDuration, getTotalDuration, } from "@/timekeep/queries"; +import type { Timekeep, TimeEntry } from "@/timekeep/schema"; import { stopAllTimekeeps } from "@/timekeep/stopAllTimekeeps"; import { stopFileTimekeeps } from "@/timekeep/stopFileTimekeeps"; -import TimekeepFileView from "@/views/TimekeepFileView"; -import TimekeepMarkdownView from "@/views/TimekeepMarkdownView"; -import { createNewTimekeepFile } from "./timekeep/createNewTimekeepFile"; +import { TimekeepAutocomplete } from "@/service/autocomplete"; +import { TimekeepRegistry } from "@/service/registry"; + +import createMerged from "@/commands/createMerged"; +import exportMergedPdf from "@/commands/exportMergedPdf"; +import findRunningTrackers from "@/commands/findRunningTrackers"; +import insertTracker from "@/commands/insertTracker"; +import newTimekeepFile from "@/commands/newTimekeepFile"; +import stopAllTimekeepsCommand from "@/commands/stopAllTimekeeps"; +import stopFileTimekeepsCommand from "@/commands/stopFileTimekeeps"; export default class TimekeepPlugin extends Plugin { /** Store containing the plugin settings */ diff --git a/src/modals/TimekeepLocatorModal.ts b/src/modals/TimekeepLocatorModal.ts index 3bf1048..97c9557 100644 --- a/src/modals/TimekeepLocatorModal.ts +++ b/src/modals/TimekeepLocatorModal.ts @@ -4,6 +4,8 @@ import { SuggestModal } from "obsidian"; import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; + +import { getRunningEntry } from "@/timekeep/queries"; import type { TimeEntry } from "@/timekeep/schema"; import { @@ -12,7 +14,6 @@ import { TimekeepRegistryEntry, TimekeepRegistryItemRef, } from "@/service/registry"; -import { getRunningEntry } from "@/timekeep/queries"; interface TimekeepResult { ref: TimekeepRegistryItemRef; diff --git a/src/modals/TimekeepMergerModal.ts b/src/modals/TimekeepMergerModal.ts index 458b3ad..4bbbb65 100644 --- a/src/modals/TimekeepMergerModal.ts +++ b/src/modals/TimekeepMergerModal.ts @@ -2,11 +2,13 @@ import { App, TFile, Modal, TextComponent, ButtonComponent } from "obsidian"; import { v4 as uuid } from "uuid"; import { exportPdf } from "@/export/pdf"; -import { TimekeepEntryItemType, TimekeepRegistry, TimekeepRegistryEntry } from "@/service/registry"; import { TimekeepSettings } from "@/settings"; import { Store } from "@/store"; + import { Timekeep, stripTimekeepRuntimeData } from "@/timekeep/schema"; +import { TimekeepEntryItemType, TimekeepRegistry, TimekeepRegistryEntry } from "@/service/registry"; + interface TimekeepResult { timekeep: Timekeep; file: TFile; diff --git a/src/service/autocomplete.test.ts b/src/service/autocomplete.test.ts index bb56cf5..b216da3 100644 --- a/src/service/autocomplete.test.ts +++ b/src/service/autocomplete.test.ts @@ -5,12 +5,13 @@ import { describe, expect, it, vi } from "vitest"; import { MockVault } from "@/__mocks__/obsidian"; import { defaultSettings } from "@/settings"; import { createStore } from "@/store"; -import { Timekeep } from "@/timekeep/schema"; import { createCodeBlock } from "@/utils/codeblock"; import { TimekeepAutocomplete } from "./autocomplete"; import { TimekeepRegistry } from "./registry"; +import { Timekeep } from "@/timekeep/schema"; + describe("TimekeepAutocomplete", () => { describe("autocomplete enabled", () => { it("empty vault should have no names", async () => { diff --git a/src/service/autocomplete.ts b/src/service/autocomplete.ts index d4a927a..9f0bef6 100644 --- a/src/service/autocomplete.ts +++ b/src/service/autocomplete.ts @@ -2,11 +2,12 @@ import { Component } from "obsidian"; import { TimekeepSettings } from "@/settings"; import { createStore, Store } from "@/store"; -import { getEntriesNames } from "@/timekeep/queries"; import { isNumberText } from "@/utils/number"; import { TimekeepEntryItemType, TimekeepRegistry } from "./registry"; +import { getEntriesNames } from "@/timekeep/queries"; + /** * Autocomplete registry to provide entry name autocomplete based * on all the existing tasks within the vault diff --git a/src/service/registry.test.ts b/src/service/registry.test.ts index 27a3d8d..cc9ed8c 100644 --- a/src/service/registry.test.ts +++ b/src/service/registry.test.ts @@ -7,7 +7,6 @@ import { describe, vi, it, expect } from "vitest"; import { MockMarkdownView, MockVault } from "@/__mocks__/obsidian"; import { defaultSettings } from "@/settings"; import { createStore } from "@/store"; -import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; import { createCodeBlock } from "@/utils/codeblock"; import { @@ -17,6 +16,8 @@ import { TimekeepRegistryItemRef, } from "./registry"; +import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; + describe("TimekeepRegistry", () => { describe("getFileRegistryEntry", () => { it("returns null for markdown without timekeeps", async () => { diff --git a/src/service/registry.ts b/src/service/registry.ts index 79102bd..bde89a6 100644 --- a/src/service/registry.ts +++ b/src/service/registry.ts @@ -8,6 +8,7 @@ import type { TimekeepSettings } from "@/settings"; import type { Store } from "@/store"; import { createStore } from "@/store"; + import { extractTimekeepCodeblocksWithPosition, load, diff --git a/src/timekeep/__fixtures__/extracting/codeblockContents.ts b/src/timekeep/__fixtures__/extracting/codeblockContents.ts index 344cb26..b259dfb 100644 --- a/src/timekeep/__fixtures__/extracting/codeblockContents.ts +++ b/src/timekeep/__fixtures__/extracting/codeblockContents.ts @@ -1,8 +1,9 @@ import moment from "moment"; -import { Timekeep } from "@/timekeep/schema"; import { createCodeBlock } from "@/utils/codeblock"; +import { Timekeep } from "@/timekeep/schema"; + // Input data to find export const input1 = createCodeBlock( `{"entries":[{"name":"Block 1","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`, diff --git a/src/timekeep/__fixtures__/extracting/unclosedCodeBlock.ts b/src/timekeep/__fixtures__/extracting/unclosedCodeBlock.ts index ce00770..c4c7ab2 100644 --- a/src/timekeep/__fixtures__/extracting/unclosedCodeBlock.ts +++ b/src/timekeep/__fixtures__/extracting/unclosedCodeBlock.ts @@ -1,8 +1,9 @@ import moment from "moment"; -import { Timekeep } from "@/timekeep/schema"; import { createCodeBlock } from "@/utils/codeblock"; +import { Timekeep } from "@/timekeep/schema"; + // Input data to find export const input1 = createCodeBlock( `{"entries":[{"name":"Block 1","startTime":"2024-03-17T01:33:51.630Z","endTime":"2024-03-17T01:33:55.151Z","subEntries":null}]}`, diff --git a/src/timekeep/create.ts b/src/timekeep/create.ts index 7d75cea..8fcce65 100644 --- a/src/timekeep/create.ts +++ b/src/timekeep/create.ts @@ -2,9 +2,10 @@ import type { Moment } from "moment"; import { v4 as uuid } from "uuid"; -import { TimeEntry, TimeEntryGroup } from "@/timekeep/schema"; import { isEmptyString } from "@/utils/text"; +import { TimeEntry, TimeEntryGroup } from "@/timekeep/schema"; + /** * Creates a new entry that has just started * diff --git a/src/timekeep/parser.ts b/src/timekeep/parser.ts index 3fe45c1..5007e0b 100644 --- a/src/timekeep/parser.ts +++ b/src/timekeep/parser.ts @@ -1,6 +1,7 @@ -import { TIMEKEEP, Timekeep, stripTimekeepRuntimeData } from "@/timekeep/schema"; import { isEmptyString } from "@/utils/text"; +import { TIMEKEEP, Timekeep, stripTimekeepRuntimeData } from "@/timekeep/schema"; + export type LoadResult = LoadSuccess | LoadError; export type LoadSuccess = { success: true; timekeep: Timekeep }; diff --git a/src/timekeep/sort.ts b/src/timekeep/sort.ts index 9f1b671..32cfe53 100644 --- a/src/timekeep/sort.ts +++ b/src/timekeep/sort.ts @@ -1,8 +1,9 @@ import { SortOrder, UnstartedOrder, TimekeepSettings } from "@/settings"; -import { TimeEntry } from "@/timekeep/schema"; import { getStartTime } from "./queries"; +import { TimeEntry } from "@/timekeep/schema"; + type TimeEntryWithIndex = TimeEntry & { index: number }; type EntriesComparator = (a: TimeEntryWithIndex, b: TimeEntryWithIndex) => number; diff --git a/src/timekeep/start.ts b/src/timekeep/start.ts index 4f445b3..73b2ccf 100644 --- a/src/timekeep/start.ts +++ b/src/timekeep/start.ts @@ -1,11 +1,11 @@ import type { Moment } from "moment"; -import { TimeEntry } from "@/timekeep/schema"; - import { withEntry, createEntry, withSubEntry } from "./create"; import { getEntryById } from "./queries"; import { updateEntry, stopRunningEntries } from "./update"; +import { TimeEntry } from "@/timekeep/schema"; + /** * Start a new entry in the provided set of entries * diff --git a/src/timekeep/stopFileTimekeeps.ts b/src/timekeep/stopFileTimekeeps.ts index 01f2922..b810db1 100644 --- a/src/timekeep/stopFileTimekeeps.ts +++ b/src/timekeep/stopFileTimekeeps.ts @@ -1,10 +1,9 @@ import type { Moment } from "moment"; import type { TFile, Vault } from "obsidian"; -import type { Timekeep } from "@/timekeep/schema"; - import { replaceTimekeepCodeblock, extractTimekeepCodeblocksWithPosition } from "@/timekeep/parser"; import { getRunningEntry } from "@/timekeep/queries"; +import type { Timekeep } from "@/timekeep/schema"; import { stopTimekeep } from "@/timekeep/update"; /** diff --git a/src/views/TimekeepFileView.ts b/src/views/TimekeepFileView.ts index e95763d..df3f823 100644 --- a/src/views/TimekeepFileView.ts +++ b/src/views/TimekeepFileView.ts @@ -1,15 +1,18 @@ import moment from "moment"; import { EditableFileView, TFile, WorkspaceLeaf } from "obsidian"; -import { Timesheet } from "@/components/Timesheet"; -import { TimesheetLoadError } from "@/components/TimesheetLoadError"; import { CustomOutputFormat } from "@/output"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; import { TimekeepSettings } from "@/settings"; import { createStore, Store } from "@/store"; + +import { Timesheet } from "@/components/Timesheet"; +import { TimesheetLoadError } from "@/components/TimesheetLoadError"; + import { load, LoadResult } from "@/timekeep/parser"; import { stripTimekeepRuntimeData, Timekeep } from "@/timekeep/schema"; +import { TimekeepAutocomplete } from "@/service/autocomplete"; + export default class TimekeepFileView extends EditableFileView { /** Access to the timekeep settings */ settings: Store; diff --git a/src/views/TimekeepMarkdownView.ts b/src/views/TimekeepMarkdownView.ts index f245b80..f87dba3 100644 --- a/src/views/TimekeepMarkdownView.ts +++ b/src/views/TimekeepMarkdownView.ts @@ -7,13 +7,16 @@ import { TFile, MarkdownRenderChild } from "obsidian"; import type { CustomOutputFormat } from "@/output"; import type { TimekeepSettings } from "@/settings"; +import { type Store, createStore } from "@/store"; + import { Timesheet } from "@/components/Timesheet"; import { TimesheetLoadError } from "@/components/TimesheetLoadError"; -import { TimekeepAutocomplete } from "@/service/autocomplete"; -import { type Store, createStore } from "@/store"; + import { type LoadResult, load, replaceTimekeepCodeblock } from "@/timekeep/parser"; import { type Timekeep, stripTimekeepRuntimeData } from "@/timekeep/schema"; +import { TimekeepAutocomplete } from "@/service/autocomplete"; + export default class TimekeepMarkdownView extends MarkdownRenderChild { // Obsidian app instance app: App;