anki/ts/import-page/lib.ts

130 lines
4.1 KiB
TypeScript
Raw Normal View History

Improve presentation of importing results (#2568) * Implement import log screen in Svelte * Show filename in import log screen title * Remove unused NoteRow property * Show number of imported notes * Use a single nid expression * Use 'count' as variable name for consistency * Import from @tslib/backend instead * Fix summary_template typing * Fix clippy warning * Apply suggestions from code review * Fix imports * Contents -> Fields * Increase max length of browser search bar https://github.com/ankitects/anki/pull/2568/files#r1255227035 * Fix race condition in Bootstrap tooltip destruction https://github.com/twbs/bootstrap/issues/37474 * summary_template -> summaryTemplate * Make show link a button * Run import ops on Svelte side * Fix geometry not being restored in CSV Import page * Make VirtualTable fill available height * Keep CSV dialog modal * Reword importing-existing-notes-skipped * Avoid mentioning matching based on first field * Change tick and cross icons * List skipped notes last * Pure CSS spinner * Move set_wants_abort() call to relevant dialogs * Show number of imported cards * Remove bold from first sentence and indent summaries * Update UI after import operations * Add close button to import log page Also make virtual table react to resize event. * Fix typing * Make CSV dialog non-modal again Otherwise user can't interact with browser window. * Update window modality after import * Commit DB and update undo actions after import op * Split frontend proto into separate file, so backend can ignore it Currently the automatically-generated frontend RPC methods get placed in 'backend.js' with all the backend methods; we could optionally split them into a separate 'frontend.js' file in the future. * Migrate import_done from a bridgecmd to a HTTP request * Update plural form of importing-notes-added * Move import response handling to mediasrv * Move task callback to script section * Avoid unnecessary :global() * .log cannot be missing if result exists * Move import log search handling to mediasrv * Type common params of ImportLogDialog * Use else if * Remove console.log() * Add way to test apkg imports in new log screen * Remove unused import * Get actual card count for CSV imports * Use import type * Fix typing error * Ignore import log when checking for changes in Python layer * Apply suggestions from code review * Remove imported card count for now * Avoid non-null assertion in assignment * Change showInBrowser to take an array of notes * Use dataclasses for import log args * Simplify ResultWithChanges in TS * Only abort import when window is modal * Fix ResultWithChanges typing * Fix Rust warnings * Only log one duplicate per incoming note * Update wording about note updates * Remove caveat about found_notes * Reduce font size * Remove redundant map * Give credit to loading.io * Remove unused line --------- Co-authored-by: RumovZ <gp5glkw78@relay.firefox.com>
2023-08-02 12:29:44 +02:00
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import type { ImportResponse_Log, ImportResponse_Note } from "@tslib/anki/import_export_pb";
import { CsvMetadata_DupeResolution } from "@tslib/anki/import_export_pb";
import { searchInBrowser } from "@tslib/backend";
import * as tr from "@tslib/ftl";
import { checkCircle, closeBox, newBox, updateIcon } from "./icons";
import type { LogQueue, NoteRow, SummarizedLogQueues } from "./types";
function getFirstFieldQueue(log: ImportResponse_Log): {
action: string;
queue: LogQueue;
} {
let reason: string;
let action: string;
if (log.dupeResolution === CsvMetadata_DupeResolution.DUPLICATE) {
reason = tr.importingDuplicateNoteAdded();
action = tr.addingAdded();
} else if (log.dupeResolution === CsvMetadata_DupeResolution.PRESERVE) {
reason = tr.importingExistingNoteSkipped();
action = tr.importingSkipped();
} else {
reason = tr.importingNoteUpdatedAsFileHadNewer();
action = tr.importingUpdated();
}
const queue: LogQueue = {
reason,
notes: log.firstFieldMatch,
};
return { action, queue };
}
export function getSummaries(log: ImportResponse_Log): SummarizedLogQueues[] {
const summarizedQueues = [
{
queues: [
{
notes: log.new,
reason: tr.importingAddedNewNote(),
},
],
action: tr.addingAdded(),
summaryTemplate: tr.importingNotesAdded,
canBrowse: true,
icon: newBox,
},
{
queues: [
{
notes: log.duplicate,
reason: tr.importingExistingNoteSkipped(),
},
],
action: tr.importingSkipped(),
summaryTemplate: tr.importingExistingNotesSkipped,
canBrowse: true,
icon: checkCircle,
},
{
queues: [
{
notes: log.updated,
reason: tr.importingNoteUpdatedAsFileHadNewer(),
},
],
action: tr.importingUpdated(),
summaryTemplate: tr.importingNotesUpdated,
canBrowse: true,
icon: updateIcon,
},
{
queues: [
{
notes: log.conflicting,
reason: tr.importingNoteSkippedUpdateDueToNotetype(),
},
{
notes: log.missingNotetype,
reason: tr.importingNoteSkippedDueToMissingNotetype(),
},
{
notes: log.missingDeck,
reason: tr.importingNoteSkippedDueToMissingDeck(),
},
{
notes: log.emptyFirstField,
reason: tr.importingNoteSkippedDueToEmptyFirstField(),
},
],
action: tr.importingSkipped(),
Merging Notetypes on Import (#2612) * Remember original id when importing notetype * Reuse notetypes with matching original id * Add field and template ids * Enable merging imported notetypes * Fix test Note should be updated if the incoming note's notetype is remapped to the existing note's notetype. On the other hand, it should be skipped if its notetype id is mapped to some new notetype. * Change field and template ids to i32 * Add merge notetypes flag to proto message * Add dialog for apkg import * Move HelpModal into components * Generalize import dialog * Move SettingTitle into components * Add help modal to ImportAnkiPackagePage * Move SwitchRow into components * Fix backend method import * Make testable in browser * Fix broken modal * Wrap in container and fix margins * Update commented Anki version of new proto fields * Check ids when comparing notetype schemas * Add tooltip for merging notetypes. * Allow updating notes regardless of mtime * Gitignore yarn-error.log * Allow updating notetypes regardless of mtime * Fix apkg help carousel * Use i64s for template and field ids * Add option to omit importing scheduling info * Restore last settings in apkg import dialog * Display error when getting metadata in webview * Update manual links for apkg importing * Apply suggestions from code review Co-authored-by: Damien Elmes <dae@users.noreply.github.com> * Omit schduling -> Import all cards as new cards * Tweak importing-update-notes-help * UpdateCondition → ImportAnkiPackageUpdateCondition * Load keyboard.ftl * Skip updating dupes in 'update alwyas' case * Explain more when merging notetypes is required * "omit scheduling" → "with scheduling" * Skip updating notetype dupes if 'update always' * Merge duplicated notetypes from previous imports * Fix rebase aftermath * Fix panic when merging * Clarify 'update notetypes' help * Mention 'merge notetypes' in the log * Add a test which covers the previously panicking path * Use nested ftl messages to ensure consistency * Make order of merged fields deterministic * Rewrite test to trigger panic * Update version comment on new fields
2023-09-09 01:00:55 +02:00
summaryTemplate: tr.importingConflictingNotesSkipped2,
Improve presentation of importing results (#2568) * Implement import log screen in Svelte * Show filename in import log screen title * Remove unused NoteRow property * Show number of imported notes * Use a single nid expression * Use 'count' as variable name for consistency * Import from @tslib/backend instead * Fix summary_template typing * Fix clippy warning * Apply suggestions from code review * Fix imports * Contents -> Fields * Increase max length of browser search bar https://github.com/ankitects/anki/pull/2568/files#r1255227035 * Fix race condition in Bootstrap tooltip destruction https://github.com/twbs/bootstrap/issues/37474 * summary_template -> summaryTemplate * Make show link a button * Run import ops on Svelte side * Fix geometry not being restored in CSV Import page * Make VirtualTable fill available height * Keep CSV dialog modal * Reword importing-existing-notes-skipped * Avoid mentioning matching based on first field * Change tick and cross icons * List skipped notes last * Pure CSS spinner * Move set_wants_abort() call to relevant dialogs * Show number of imported cards * Remove bold from first sentence and indent summaries * Update UI after import operations * Add close button to import log page Also make virtual table react to resize event. * Fix typing * Make CSV dialog non-modal again Otherwise user can't interact with browser window. * Update window modality after import * Commit DB and update undo actions after import op * Split frontend proto into separate file, so backend can ignore it Currently the automatically-generated frontend RPC methods get placed in 'backend.js' with all the backend methods; we could optionally split them into a separate 'frontend.js' file in the future. * Migrate import_done from a bridgecmd to a HTTP request * Update plural form of importing-notes-added * Move import response handling to mediasrv * Move task callback to script section * Avoid unnecessary :global() * .log cannot be missing if result exists * Move import log search handling to mediasrv * Type common params of ImportLogDialog * Use else if * Remove console.log() * Add way to test apkg imports in new log screen * Remove unused import * Get actual card count for CSV imports * Use import type * Fix typing error * Ignore import log when checking for changes in Python layer * Apply suggestions from code review * Remove imported card count for now * Avoid non-null assertion in assignment * Change showInBrowser to take an array of notes * Use dataclasses for import log args * Simplify ResultWithChanges in TS * Only abort import when window is modal * Fix ResultWithChanges typing * Fix Rust warnings * Only log one duplicate per incoming note * Update wording about note updates * Remove caveat about found_notes * Reduce font size * Remove redundant map * Give credit to loading.io * Remove unused line --------- Co-authored-by: RumovZ <gp5glkw78@relay.firefox.com>
2023-08-02 12:29:44 +02:00
canBrowse: false,
icon: closeBox,
},
];
const firstFieldQueue = getFirstFieldQueue(log);
for (const summary of summarizedQueues) {
if (summary.action === firstFieldQueue.action) {
summary.queues.push(firstFieldQueue.queue);
break;
}
}
return summarizedQueues;
}
export function getRows(summaries: SummarizedLogQueues[]): NoteRow[] {
const rows: NoteRow[] = [];
for (const summary of summaries) {
for (const queue of summary.queues) {
if (queue.notes) {
for (const note of queue.notes) {
rows.push({ summary, queue, note });
}
}
}
}
return rows;
}
export function showInBrowser(notes: ImportResponse_Note[]): void {
searchInBrowser({
filter: {
case: "nids",
value: { ids: notes.map((note) => note.id!.nid) },
},
});
}