Compare commits

...

4 Commits
v1.4.2 ... main

5 changed files with 70 additions and 14 deletions

View File

@ -1,7 +1,7 @@
{ {
"id": "obsidian-book-tracker", "id": "obsidian-book-tracker",
"name": "Book Tracker", "name": "Book Tracker",
"version": "1.4.2", "version": "1.5.0",
"minAppVersion": "0.15.0", "minAppVersion": "0.15.0",
"description": "Simplifies tracking your reading progress and managing your book collection in Obsidian.", "description": "Simplifies tracking your reading progress and managing your book collection in Obsidian.",
"author": "FiFiTiDo", "author": "FiFiTiDo",

View File

@ -1,6 +1,6 @@
{ {
"name": "obsidian-book-tracker", "name": "obsidian-book-tracker",
"version": "1.4.2", "version": "1.5.0",
"description": "Simplifies tracking your reading progress and managing your book collection in Obsidian.", "description": "Simplifies tracking your reading progress and managing your book collection in Obsidian.",
"main": "main.js", "main": "main.js",
"scripts": { "scripts": {

View File

@ -1,5 +1,5 @@
<script lang="ts"> <script lang="ts">
import { Star, StarHalf } from "lucide-svelte"; import { Star, StarHalf, X } from "lucide-svelte";
import type { Snippet } from "svelte"; import type { Snippet } from "svelte";
interface Props { interface Props {
@ -125,11 +125,26 @@
</div> </div>
{/each} {/each}
</div> </div>
<button
class="clear-rating"
type="button"
aria-label="Clear rating"
class:hidden={value === 0}
onclick={() => (value = 0)}
>
<X color="var(--text-muted)" />
</button>
</div> </div>
<style lang="scss"> <style lang="scss">
$clear-btn-size: 32px;
.rating-input { .rating-input {
cursor: pointer; cursor: pointer;
display: flex;
align-items: center;
gap: var(--size-4-2);
padding-left: calc($clear-btn-size + var(--size-4-2));
.ctrl { .ctrl {
position: absolute; position: absolute;
@ -140,16 +155,37 @@
display: flex; display: flex;
} }
:global(svg) {
position: absolute;
width: var(--icon-size);
height: var(--icon-size);
}
.rating-item { .rating-item {
position: relative; position: relative;
width: var(--icon-size); width: var(--icon-size);
height: var(--icon-size); height: var(--icon-size);
:global(svg) {
position: absolute;
width: var(--icon-size);
height: var(--icon-size);
}
}
.clear-rating {
all: unset;
box-sizing: border-box;
cursor: pointer;
height: $clear-btn-size;
width: $clear-btn-size;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
&:active,
&:hover {
background-color: var(--background-modifier-hover);
}
&.hidden {
visibility: hidden;
}
} }
} }
</style> </style>

View File

@ -11,6 +11,10 @@
} from "@ui/stores/settings.svelte"; } from "@ui/stores/settings.svelte";
import moment from "@external/moment"; import moment from "@external/moment";
import { setAppContext } from "@ui/stores/app"; import { setAppContext } from "@ui/stores/app";
import {
createReadingLog,
setReadingLogContext,
} from "@ui/stores/reading-log.svelte";
const INPUT_DATETIME_FORMAT = "YYYY-MM-DDTHH:mm"; const INPUT_DATETIME_FORMAT = "YYYY-MM-DDTHH:mm";
@ -26,17 +30,28 @@
const settingsStore = createSettings(plugin); const settingsStore = createSettings(plugin);
setSettingsContext(settingsStore); setSettingsContext(settingsStore);
const readingLogStore = createReadingLog(plugin.readingLog);
setReadingLogContext(readingLogStore);
const metadataStore = createMetadata(plugin, { const metadataStore = createMetadata(plugin, {
statusFilter: null, statusFilter: null,
}); });
let editMode = $derived(entry !== undefined); const editMode = $derived(entry !== undefined);
let book = $state(entry?.book ?? ""); let book = $state(entry?.book ?? "");
let bookMetadata = $derived( const bookMetadata = $derived(
metadataStore.metadata.find((m) => m.file.basename === book), metadataStore.metadata.find((m) => m.file.basename === book),
); );
const lastEntryIndex = $derived(
readingLogStore.entries.findLastIndex((e) => e.book === book),
);
const lastEntry = $derived(
lastEntryIndex !== -1 ? readingLogStore.entries[lastEntryIndex] : null,
);
const pageCount = $derived(bookMetadata?.book.pageCount ?? 0);
let pagesRead = $state(entry?.pagesRead ?? 0); let pagesRead = $state(entry?.pagesRead ?? 0);
let pagesReadPrev = createPrevious(() => pagesRead); const pagesReadPrev = createPrevious(() => pagesRead);
let pagesReadTotal = $state(entry?.pagesReadTotal ?? 0); let pagesReadTotal = $state(entry?.pagesReadTotal ?? 0);
let pagesRemaining = $state(entry?.pagesRemaining ?? 0); let pagesRemaining = $state(entry?.pagesRemaining ?? 0);
let createdAt = $state( let createdAt = $state(
@ -44,6 +59,10 @@
moment().format(INPUT_DATETIME_FORMAT), moment().format(INPUT_DATETIME_FORMAT),
); );
$effect(() => {
pagesReadTotal = (lastEntry?.pagesReadTotal ?? 0) + pagesRead;
});
$effect(() => { $effect(() => {
const diff = pagesRead - (pagesReadPrev.value ?? 0); const diff = pagesRead - (pagesReadPrev.value ?? 0);
pagesRead = pagesRead; pagesRead = pagesRead;
@ -51,7 +70,7 @@
}); });
$effect(() => { $effect(() => {
pagesRemaining = bookMetadata?.book.pageCount ?? 0 - pagesReadTotal; pagesRemaining = pageCount - pagesReadTotal;
}); });
$effect(() => { $effect(() => {

View File

@ -7,5 +7,6 @@
"1.3.2": "0.15.0", "1.3.2": "0.15.0",
"1.4.0": "0.15.0", "1.4.0": "0.15.0",
"1.4.1": "0.15.0", "1.4.1": "0.15.0",
"1.4.2": "0.15.0" "1.4.2": "0.15.0",
"1.5.0": "0.15.0"
} }