Pass selected notetype/deck to editor

This commit is contained in:
Abdo 2025-08-14 08:50:38 +03:00
parent d054e0f078
commit b17bfb2658
5 changed files with 40 additions and 12 deletions

View file

@ -9,8 +9,12 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import type { DeckNameId } from "@generated/anki/decks_pb"; import type { DeckNameId } from "@generated/anki/decks_pb";
import * as tr from "@generated/ftl"; import * as tr from "@generated/ftl";
interface Props {
selectedDeck: DeckNameId | null;
onChange?: (deck: DeckNameId) => void;
}
let {selectedDeck = $bindable(null), onChange}: Props = $props();
let decks: DeckNameId[] = $state([]); let decks: DeckNameId[] = $state([]);
let selectedDeck: DeckNameId | null = $state(null);
$effect(() => { $effect(() => {
getDeckNames({ skipEmptyDefault: true, includeFiltered: false }).then( getDeckNames({ skipEmptyDefault: true, includeFiltered: false }).then(
@ -24,6 +28,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<ItemChooser <ItemChooser
title={tr.qtMiscChooseDeck()} title={tr.qtMiscChooseDeck()}
bind:selectedItem={selectedDeck} bind:selectedItem={selectedDeck}
{onChange}
items={decks} items={decks}
icon={mdiBookOutline} icon={mdiBookOutline}
/> />

View file

@ -2,7 +2,7 @@
Copyright: Ankitects Pty Ltd and contributors Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
--> -->
<script lang="ts"> <script lang="ts" generics="Item extends { id: bigint, name: string }">
import { magnifyIcon, mdiClose } from "./icons"; import { magnifyIcon, mdiClose } from "./icons";
import Icon from "./Icon.svelte"; import Icon from "./Icon.svelte";
import IconConstrain from "./IconConstrain.svelte"; import IconConstrain from "./IconConstrain.svelte";
@ -10,10 +10,6 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import Modal from "./Modal.svelte"; import Modal from "./Modal.svelte";
import type { IconData } from "./types"; import type { IconData } from "./types";
import * as tr from "@generated/ftl"; import * as tr from "@generated/ftl";
interface Item {
id: bigint;
name: string;
}
interface Props { interface Props {
title: string; title: string;

View file

@ -10,8 +10,12 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import ItemChooser from "./ItemChooser.svelte"; import ItemChooser from "./ItemChooser.svelte";
import * as tr from "@generated/ftl"; import * as tr from "@generated/ftl";
interface Props {
selectedNotetype: NotetypeNameId | null;
onChange?: (notetype: NotetypeNameId) => void;
}
let {selectedNotetype = $bindable(null), onChange}: Props = $props();
let notetypes: NotetypeNameId[] = $state([]); let notetypes: NotetypeNameId[] = $state([]);
let selectedNotetype: NotetypeNameId | null = $state(null);
$effect(() => { $effect(() => {
getNotetypeNames({}).then((response) => { getNotetypeNames({}).then((response) => {
@ -23,6 +27,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<ItemChooser <ItemChooser
title={tr.qtMiscChooseNoteType()} title={tr.qtMiscChooseNoteType()}
bind:selectedItem={selectedNotetype} bind:selectedItem={selectedNotetype}
{onChange}
items={notetypes} items={notetypes}
icon={mdiNewspaper} icon={mdiNewspaper}
/> />

View file

@ -15,6 +15,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import LabelName from "./LabelName.svelte"; import LabelName from "./LabelName.svelte";
import { EditorState, type EditorMode } from "./types"; import { EditorState, type EditorMode } from "./types";
import { ContextMenu, Item } from "$lib/context-menu"; import { ContextMenu, Item } from "$lib/context-menu";
import type { NotetypeNameId } from "@generated/anki/notetypes_pb";
import type { DeckNameId } from "@generated/anki/decks_pb";
export interface NoteEditorAPI { export interface NoteEditorAPI {
fields: EditorFieldAPI[]; fields: EditorFieldAPI[];
@ -295,6 +297,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
clearCodeMirrorHistory(); clearCodeMirrorHistory();
} }
export let selectedNotetype: NotetypeNameId | null = null;
export let selectedDeck: DeckNameId | null = null;
function onNotetypeChange(notetype: NotetypeNameId) {
loadNote(0n, notetype.id, 0, null);
}
function onDeckChange(deck: DeckNameId) {
selectedDeck = deck;
}
let notetypeMeta: NotetypeIdAndModTime; let notetypeMeta: NotetypeIdAndModTime;
function setNotetypeMeta(notetype: Notetype): void { function setNotetypeMeta(notetype: Notetype): void {
notetypeMeta = { id: notetype.id, modTime: notetype.mtimeSecs }; notetypeMeta = { id: notetype.id, modTime: notetype.mtimeSecs };
@ -444,8 +457,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
async function onAdd() { async function onAdd() {
// TODO get selected deck await addCurrentNote(selectedDeck!.id);
await addCurrentNote(1n);
} }
let historyModal: Modal; let historyModal: Modal;
@ -1196,7 +1208,7 @@ components and functionality for general note editing.
on:dragover={preventDefaultIfNonLegacy} on:dragover={preventDefaultIfNonLegacy}
on:drop={checkNonLegacy(handlePickerDrop)} on:drop={checkNonLegacy(handlePickerDrop)}
> >
<EditorChoosers /> <EditorChoosers bind:selectedNotetype bind:selectedDeck onNotetypeChange={onNotetypeChange} />
<EditorToolbar {size} {wrap} api={toolbar}> <EditorToolbar {size} {wrap} api={toolbar}>
<svelte:fragment slot="notetypeButtons"> <svelte:fragment slot="notetypeButtons">

View file

@ -6,18 +6,28 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<script lang="ts"> <script lang="ts">
import NotetypeChooser from "$lib/components/NotetypeChooser.svelte"; import NotetypeChooser from "$lib/components/NotetypeChooser.svelte";
import DeckChooser from "$lib/components/DeckChooser.svelte"; import DeckChooser from "$lib/components/DeckChooser.svelte";
import type { NotetypeNameId } from "@generated/anki/notetypes_pb";
import type { DeckNameId } from "@generated/anki/decks_pb";
import * as tr from "@generated/ftl"; import * as tr from "@generated/ftl";
interface Props {
selectedNotetype: NotetypeNameId | null;
selectedDeck: DeckNameId | null;
onNotetypeChange?: (notetype: NotetypeNameId) => void;
onDeckChange?: (deck: DeckNameId) => void;
}
let {selectedNotetype = $bindable(null), selectedDeck = $bindable(null), onNotetypeChange, onDeckChange}: Props = $props();
</script> </script>
<div class="top-bar"> <div class="top-bar">
<p>{tr.notetypesType()}</p> <p>{tr.notetypesType()}</p>
<div class="notetype-chooser"> <div class="notetype-chooser">
<NotetypeChooser/> <NotetypeChooser bind:selectedNotetype onChange={onNotetypeChange} />
</div> </div>
<p>{tr.decksDeck()}</p> <p>{tr.decksDeck()}</p>
<div class="deck-chooser"> <div class="deck-chooser">
<DeckChooser/> <DeckChooser bind:selectedDeck onChange={onDeckChange} />
</div> </div>
</div> </div>