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",
|
"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",
|
||||||
|
|
|
@ -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": {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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(() => {
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
Loading…
Reference in New Issue