mirror of
https://github.com/ankitects/anki.git
synced 2025-11-11 23:27:12 -05:00
Implement field copying on notetype change
This commit is contained in:
parent
52254d40ac
commit
6b5729ce18
1 changed files with 50 additions and 0 deletions
|
|
@ -955,6 +955,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
originalNoteId: bigint | null,
|
originalNoteId: bigint | null,
|
||||||
reviewerCardId: bigint | null,
|
reviewerCardId: bigint | null,
|
||||||
initial: boolean = false,
|
initial: boolean = false,
|
||||||
|
copyFromNote: Note | null = null,
|
||||||
) {
|
) {
|
||||||
let homeDeckId = 0n;
|
let homeDeckId = 0n;
|
||||||
if (reviewerCardId) {
|
if (reviewerCardId) {
|
||||||
|
|
@ -999,6 +1000,53 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
note!.tags = originalNote.tags;
|
note!.tags = originalNote.tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (copyFromNote) {
|
||||||
|
const oldFieldNames = (
|
||||||
|
await getFieldNames({
|
||||||
|
ntid: copyFromNote.notetypeId,
|
||||||
|
})
|
||||||
|
).vals;
|
||||||
|
const newFieldNames = fieldNames;
|
||||||
|
const copiedFieldNames = new Set<string>();
|
||||||
|
|
||||||
|
// Copy identical non-empty fields by name
|
||||||
|
for (const fieldName of newFieldNames) {
|
||||||
|
const oldFieldIndex = oldFieldNames.indexOf(fieldName);
|
||||||
|
const newFieldIndex = newFieldNames.indexOf(fieldName);
|
||||||
|
if (oldFieldIndex >= 0 && copyFromNote.fields[oldFieldIndex]) {
|
||||||
|
note!.fields[newFieldIndex] = copyFromNote.fields[oldFieldIndex];
|
||||||
|
copiedFieldNames.add(fieldName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy remaining non-empty fields by position
|
||||||
|
let newIdx = 0;
|
||||||
|
for (let oldIdx = 0; oldIdx < oldFieldNames.length; oldIdx++) {
|
||||||
|
const oldFieldName = oldFieldNames[oldIdx];
|
||||||
|
|
||||||
|
// Skip previously copied identical fields in new note
|
||||||
|
while (
|
||||||
|
newIdx < newFieldNames.length &&
|
||||||
|
copiedFieldNames.has(newFieldNames[newIdx])
|
||||||
|
) {
|
||||||
|
newIdx++;
|
||||||
|
}
|
||||||
|
if (newIdx >= newFieldNames.length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy non-empty old fields
|
||||||
|
if (
|
||||||
|
!copiedFieldNames.has(oldFieldName) &&
|
||||||
|
copyFromNote.fields[oldIdx]
|
||||||
|
) {
|
||||||
|
note!.fields[newIdx] = copyFromNote.fields[oldIdx];
|
||||||
|
newIdx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
note!.tags = copyFromNote.tags;
|
||||||
|
}
|
||||||
|
|
||||||
const fieldValues = (
|
const fieldValues = (
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
note!.fields.map((field) => encodeIriPaths({ val: field })),
|
note!.fields.map((field) => encodeIriPaths({ val: field })),
|
||||||
|
|
@ -1080,6 +1128,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
originalNoteId: bigint | null,
|
originalNoteId: bigint | null,
|
||||||
reviewerCardId: bigint | null,
|
reviewerCardId: bigint | null,
|
||||||
initial: boolean = false,
|
initial: boolean = false,
|
||||||
|
copyFromNote: Note | null = null,
|
||||||
) {
|
) {
|
||||||
loadDebouncer.schedule(async () => {
|
loadDebouncer.schedule(async () => {
|
||||||
await loadNoteInner(
|
await loadNoteInner(
|
||||||
|
|
@ -1089,6 +1138,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
|
||||||
originalNoteId,
|
originalNoteId,
|
||||||
reviewerCardId,
|
reviewerCardId,
|
||||||
initial,
|
initial,
|
||||||
|
copyFromNote,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue