generated from tpl/obsidian-sample-plugin
Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
|
ae4b924616 | |
|
649b35f16c | |
|
25e980eff1 | |
|
45d80517a5 |
|
@ -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",
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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(() => {
|
||||
|
|
|
@ -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"
|
||||
}
|
Loading…
Reference in New Issue