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)
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(
f'require("anki/ui").loaded.then(() => {{ {js} }})', oncallback
)

View file

@ -973,6 +973,7 @@ exposed_backend_list = [
"get_note",
"new_note",
"note_fields_check",
"defaults_for_adding",
# NotetypesService
"get_notetype",
"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 decks: DeckNameId[] = $state([]);
let itemChooser: ItemChooser<DeckNameId> | null = $state(null);
export function select(notetypeId: bigint) {
itemChooser?.select(notetypeId);
}
$effect(() => {
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>
<ItemChooser
bind:this={itemChooser}
title={tr.qtMiscChooseDeck()}
bind:selectedItem={selectedDeck}
{onChange}

View file

@ -53,6 +53,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
modal?.show();
}
export function select(itemId: bigint) {
const item = items.find((item) => item.id === itemId);
selectedItem = item ? item : null;
}
$effect(() => {
if (!selectedItem && items.length > 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 notetypes: NotetypeNameId[] = $state([]);
let itemChooser: ItemChooser<NotetypeNameId> | null = $state(null);
export function select(notetypeId: bigint) {
itemChooser?.select(notetypeId);
}
$effect(() => {
getNotetypeNames({}).then((response) => {
@ -25,6 +30,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
</script>
<ItemChooser
bind:this={itemChooser}
title={tr.qtMiscChooseNoteType()}
bind:selectedItem={selectedNotetype}
{onChange}

View file

@ -297,11 +297,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
clearCodeMirrorHistory();
}
let reviewerCard: Card | null = null;
export let notetypeChooser: NotetypeChooser;
export let selectedNotetype: NotetypeNameId | null = null;
export let deckChooser: DeckChooser;
export let selectedDeck: DeckNameId | null = null;
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;
@ -700,6 +705,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
htmlToTextLine,
askUser,
showMessageBox,
getCard,
defaultsForAdding,
} from "@generated/backend";
import { wrapInternal } from "@tslib/wrap";
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 type Modal from "$lib/components/Modal.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;
$: ioImageLoadedStore.set(isIOImageLoaded);
@ -932,6 +942,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
notetypeId: bigint,
focusTo: number,
originalNoteId: bigint | null,
reviewerCardId: bigint | null,
) {
const notetype = await getNotetype({
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!.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 = (
await Promise.all(
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,
focusTo: number,
originalNoteId: bigint | null,
reviewerCardId: bigint | null,
) {
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)}
>
{#if mode === "add" && !isLegacy}
<EditorChoosers bind:selectedNotetype bind:selectedDeck {onNotetypeChange} />
<EditorChoosers
bind:notetypeChooser
bind:deckChooser
bind:selectedNotetype
bind:selectedDeck
{onNotetypeChange}
/>
{/if}
<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 {
selectedNotetype: NotetypeNameId | null;
selectedDeck: DeckNameId | null;
selectedDeck?: DeckNameId | null;
notetypeChooser?: NotetypeChooser;
deckChooser?: DeckChooser;
onNotetypeChange?: (notetype: NotetypeNameId) => void;
onDeckChange?: (deck: DeckNameId) => void;
}
let {
selectedNotetype = $bindable(null),
selectedDeck = $bindable(null),
notetypeChooser = $bindable(),
deckChooser = $bindable(),
onNotetypeChange,
onDeckChange,
}: Props = $props();
@ -27,11 +31,19 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
<div class="top-bar">
<p>{tr.notetypesType()}</p>
<div class="notetype-chooser">
<NotetypeChooser bind:selectedNotetype onChange={onNotetypeChange} />
<NotetypeChooser
bind:this={notetypeChooser}
bind:selectedNotetype
onChange={onNotetypeChange}
/>
</div>
<p>{tr.decksDeck()}</p>
<div class="deck-chooser">
<DeckChooser bind:selectedDeck onChange={onDeckChange} />
<DeckChooser
bind:this={deckChooser}
bind:selectedDeck
onChange={onDeckChange}
/>
</div>
</div>