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",
"name": "Book Tracker",
"version": "1.4.2",
"version": "1.5.0",
"minAppVersion": "0.15.0",
"description": "Simplifies tracking your reading progress and managing your book collection in Obsidian.",
"author": "FiFiTiDo",

View File

@ -1,6 +1,6 @@
{
"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.",
"main": "main.js",
"scripts": {

View File

@ -1,5 +1,5 @@
<script lang="ts">
import { Star, StarHalf } from "lucide-svelte";
import { Star, StarHalf, X } from "lucide-svelte";
import type { Snippet } from "svelte";
interface Props {
@ -125,11 +125,26 @@
</div>
{/each}
</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>
<style lang="scss">
$clear-btn-size: 32px;
.rating-input {
cursor: pointer;
display: flex;
align-items: center;
gap: var(--size-4-2);
padding-left: calc($clear-btn-size + var(--size-4-2));
.ctrl {
position: absolute;
@ -140,16 +155,37 @@
display: flex;
}
:global(svg) {
position: absolute;
width: var(--icon-size);
height: var(--icon-size);
}
.rating-item {
position: relative;
width: 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>

View File

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

View File

@ -7,5 +7,6 @@
"1.3.2": "0.15.0",
"1.4.0": "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"
}