mirror of
https://github.com/ankitects/anki.git
synced 2025-09-21 15:32:23 -04:00
Use defaults_for_adding()
This commit is contained in:
parent
9d1ecc3ed9
commit
829da5a84a
7 changed files with 72 additions and 7 deletions
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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}>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue