Use defaults_for_adding()

This commit is contained in:
Abdo 2025-08-16 20:39:21 +03:00
parent 9d1ecc3ed9
commit 829da5a84a
7 changed files with 72 additions and 7 deletions

View file

@ -427,7 +427,7 @@ require("anki/ui").loaded.then(() => require("anki/NoteEditor").instances[0].too
gui_hooks.editor_did_load_note(self) gui_hooks.editor_did_load_note(self)
assert self.mw.pm.profile is not None assert self.mw.pm.profile is not None
js = f"loadNote({json.dumps(self.nid)}, {mid}, {json.dumps(focus_to)}, {json.dumps(original_note_id)});" js = f"loadNote({json.dumps(self.nid)}, {mid}, {json.dumps(focus_to)}, {json.dumps(original_note_id)}, {json.dumps(self.mw.reviewer.card.id if self.mw.reviewer.card else None)});"
self.web.evalWithCallback( self.web.evalWithCallback(
f'require("anki/ui").loaded.then(() => {{ {js} }})', oncallback f'require("anki/ui").loaded.then(() => {{ {js} }})', oncallback
) )

View file

@ -973,6 +973,7 @@ exposed_backend_list = [
"get_note", "get_note",
"new_note", "new_note",
"note_fields_check", "note_fields_check",
"defaults_for_adding",
# NotetypesService # NotetypesService
"get_notetype", "get_notetype",
"get_notetype_names", "get_notetype_names",

View file

@ -15,6 +15,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
let { selectedDeck = $bindable(null), onChange }: Props = $props(); let { selectedDeck = $bindable(null), onChange }: Props = $props();
let decks: DeckNameId[] = $state([]); let decks: DeckNameId[] = $state([]);
let itemChooser: ItemChooser<DeckNameId> | null = $state(null);
export function select(notetypeId: bigint) {
itemChooser?.select(notetypeId);
}
$effect(() => { $effect(() => {
getDeckNames({ skipEmptyDefault: true, includeFiltered: false }).then( getDeckNames({ skipEmptyDefault: true, includeFiltered: false }).then(
@ -26,6 +31,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<ItemChooser <ItemChooser
bind:this={itemChooser}
title={tr.qtMiscChooseDeck()} title={tr.qtMiscChooseDeck()}
bind:selectedItem={selectedDeck} bind:selectedItem={selectedDeck}
{onChange} {onChange}

View file

@ -53,6 +53,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
modal?.show(); modal?.show();
} }
export function select(itemId: bigint) {
const item = items.find((item) => item.id === itemId);
selectedItem = item ? item : null;
}
$effect(() => { $effect(() => {
if (!selectedItem && items.length > 0) { if (!selectedItem && items.length > 0) {
selectedItem = items[0]; selectedItem = items[0];

View file

@ -16,6 +16,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
} }
let { selectedNotetype = $bindable(null), onChange }: Props = $props(); let { selectedNotetype = $bindable(null), onChange }: Props = $props();
let notetypes: NotetypeNameId[] = $state([]); let notetypes: NotetypeNameId[] = $state([]);
let itemChooser: ItemChooser<NotetypeNameId> | null = $state(null);
export function select(notetypeId: bigint) {
itemChooser?.select(notetypeId);
}
$effect(() => { $effect(() => {
getNotetypeNames({}).then((response) => { getNotetypeNames({}).then((response) => {
@ -25,6 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script> </script>
<ItemChooser <ItemChooser
bind:this={itemChooser}
title={tr.qtMiscChooseNoteType()} title={tr.qtMiscChooseNoteType()}
bind:selectedItem={selectedNotetype} bind:selectedItem={selectedNotetype}
{onChange} {onChange}

View file

@ -297,11 +297,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
clearCodeMirrorHistory(); clearCodeMirrorHistory();
} }
let reviewerCard: Card | null = null;
export let notetypeChooser: NotetypeChooser;
export let selectedNotetype: NotetypeNameId | null = null; export let selectedNotetype: NotetypeNameId | null = null;
export let deckChooser: DeckChooser;
export let selectedDeck: DeckNameId | null = null; export let selectedDeck: DeckNameId | null = null;
function onNotetypeChange(notetype: NotetypeNameId) { function onNotetypeChange(notetype: NotetypeNameId) {
loadNote(0n, notetype.id, 0, null); loadNote(0n, notetype.id, 0, null, null);
// TODO default_deck_for_notetype
} }
let notetypeMeta: NotetypeIdAndModTime; let notetypeMeta: NotetypeIdAndModTime;
@ -700,6 +705,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
htmlToTextLine, htmlToTextLine,
askUser, askUser,
showMessageBox, showMessageBox,
getCard,
defaultsForAdding,
} from "@generated/backend"; } from "@generated/backend";
import { wrapInternal } from "@tslib/wrap"; import { wrapInternal } from "@tslib/wrap";
import { getProfileConfig, getMeta, setMeta, getColConfig } from "@tslib/profile"; import { getProfileConfig, getMeta, setMeta, getColConfig } from "@tslib/profile";
@ -729,6 +736,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import { MessageBoxType } from "@generated/anki/frontend_pb"; import { MessageBoxType } from "@generated/anki/frontend_pb";
import type Modal from "$lib/components/Modal.svelte"; import type Modal from "$lib/components/Modal.svelte";
import EditorChoosers from "./editor-toolbar/EditorChoosers.svelte"; import EditorChoosers from "./editor-toolbar/EditorChoosers.svelte";
import type { Card } from "@generated/anki/cards_pb";
import NotetypeChooser from "$lib/components/NotetypeChooser.svelte";
import DeckChooser from "$lib/components/DeckChooser.svelte";
$: isIOImageLoaded = false; $: isIOImageLoaded = false;
$: ioImageLoadedStore.set(isIOImageLoaded); $: ioImageLoadedStore.set(isIOImageLoaded);
@ -932,6 +942,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
notetypeId: bigint, notetypeId: bigint,
focusTo: number, focusTo: number,
originalNoteId: bigint | null, originalNoteId: bigint | null,
reviewerCardId: bigint | null,
) { ) {
const notetype = await getNotetype({ const notetype = await getNotetype({
ntid: notetypeId, ntid: notetypeId,
@ -961,6 +972,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
note!.fields = originalNote.fields; note!.fields = originalNote.fields;
note!.tags = originalNote.tags; note!.tags = originalNote.tags;
} }
let homeDeckId = 0n;
if (reviewerCardId) {
reviewerCard = await getCard({ cid: reviewerCardId });
homeDeckId = reviewerCard.originalDeckId || reviewerCard.deckId;
}
const chooserDefaults = await defaultsForAdding({
homeDeckOfCurrentReviewCard: homeDeckId,
});
notetypeChooser.select(chooserDefaults.notetypeId);
deckChooser.select(chooserDefaults.deckId);
const fieldValues = ( const fieldValues = (
await Promise.all( await Promise.all(
note!.fields.map((field) => encodeIriPaths({ val: field })), note!.fields.map((field) => encodeIriPaths({ val: field })),
@ -1040,9 +1062,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
notetypeId: bigint, notetypeId: bigint,
focusTo: number, focusTo: number,
originalNoteId: bigint | null, originalNoteId: bigint | null,
reviewerCardId: bigint | null,
) { ) {
loadDebouncer.schedule(async () => { loadDebouncer.schedule(async () => {
await loadNoteInner(nid, notetypeId, focusTo, originalNoteId); await loadNoteInner(
nid,
notetypeId,
focusTo,
originalNoteId,
reviewerCardId,
);
}); });
} }
@ -1205,7 +1234,13 @@ components and functionality for general note editing.
on:drop={checkNonLegacy(handlePickerDrop)} on:drop={checkNonLegacy(handlePickerDrop)}
> >
{#if mode === "add" && !isLegacy} {#if mode === "add" && !isLegacy}
<EditorChoosers bind:selectedNotetype bind:selectedDeck {onNotetypeChange} /> <EditorChoosers
bind:notetypeChooser
bind:deckChooser
bind:selectedNotetype
bind:selectedDeck
{onNotetypeChange}
/>
{/if} {/if}
<EditorToolbar {size} {wrap} api={toolbar}> <EditorToolbar {size} {wrap} api={toolbar}>

View file

@ -12,13 +12,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
interface Props { interface Props {
selectedNotetype: NotetypeNameId | null; selectedNotetype: NotetypeNameId | null;
selectedDeck: DeckNameId | null; selectedDeck?: DeckNameId | null;
notetypeChooser?: NotetypeChooser;
deckChooser?: DeckChooser;
onNotetypeChange?: (notetype: NotetypeNameId) => void; onNotetypeChange?: (notetype: NotetypeNameId) => void;
onDeckChange?: (deck: DeckNameId) => void; onDeckChange?: (deck: DeckNameId) => void;
} }
let { let {
selectedNotetype = $bindable(null), selectedNotetype = $bindable(null),
selectedDeck = $bindable(null), selectedDeck = $bindable(null),
notetypeChooser = $bindable(),
deckChooser = $bindable(),
onNotetypeChange, onNotetypeChange,
onDeckChange, onDeckChange,
}: Props = $props(); }: Props = $props();
@ -27,11 +31,19 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<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 bind:selectedNotetype onChange={onNotetypeChange} /> <NotetypeChooser
bind:this={notetypeChooser}
bind:selectedNotetype
onChange={onNotetypeChange}
/>
</div> </div>
<p>{tr.decksDeck()}</p> <p>{tr.decksDeck()}</p>
<div class="deck-chooser"> <div class="deck-chooser">
<DeckChooser bind:selectedDeck onChange={onDeckChange} /> <DeckChooser
bind:this={deckChooser}
bind:selectedDeck
onChange={onDeckChange}
/>
</div> </div>
</div> </div>