feat(learn): an archive's import shows its steps, counts and percent, with Abort

Importing a Halkyon archive showed one bar. It now says which of its three
steps it is in (copying files; writing studysets, flashcards and notes;
bringing over the progress), how many of the step's items are done and the
percent of all of it, and offers Abort (decided 9 Nov 2026).

The copier checks between items, never leaving one half written, and
keeps a trail of what it wrote: the top studyset once made, and the files'
rows it made (not those the person had, found before each file is added).
Aborted, the importer deletes the top studyset for good with everything
inside it, as Delete now does (the reviews, answers and pages read going
with their cards, steps and PDFs), and those rows; the tags it made stay,
as names the person may well use anyway. Once all of it is written, Abort
no longer undoes it.

WorkProgress, WorkStages and AbortSignal (core/work/) and
WorkProgressView (core/widget/) are shared with the Anki import and the
exports, which follow.

Whats-New: Importing an archive shows its steps and how far it has come, and Abort stops it, keeping nothing of it.
Whats-New-De: Der Import eines Archivs zeigt seine Schritte und wie weit er ist, und „Abbrechen“ beendet ihn, ohne etwas davon zu behalten.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-10 15:53:31 +01:00
commit 5f7cb70c3c
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -2518,5 +2518,39 @@
"assistantAddPhotos": "Photos",
"@assistantAddPhotos": {"description": "Tile in +'s sheet: picks photos from the device."},
"assistantAddFiles": "Files",
"@assistantAddFiles": {"description": "Tile in +'s sheet: picks files (PDFs, texts, images)."}
"@assistantAddFiles": {"description": "Tile in +'s sheet: picks files (PDFs, texts, images)."},
"workStep": "Step {step} of {steps}: {name}",
"@workStep": {"description": "An import's or export's progress: the step it is in, of all, and its name (decided 9 Nov 2026).", "placeholders": {"step": {"type": "int"}, "steps": {"type": "int"}, "name": {"type": "String"}}},
"workCount": "{done} of {total}",
"@workCount": {"description": "An import's or export's progress: how many of the step's items are done, the numbers formatted.", "placeholders": {"done": {"type": "String"}, "total": {"type": "String"}}},
"workPercent": "{percent}%",
"@workPercent": {"description": "An import's or export's progress: how much of all of it is done.", "placeholders": {"percent": {"type": "int"}}},
"workAbort": "Abort",
"@workAbort": {"description": "Stops an import or an export under way; an import's Abort deletes what it made."},
"workAborting": "Aborting…",
"@workAborting": {"description": "An import or export stopping after Abort, an import deleting what it made."},
"workStageFiles": "Copying files",
"@workStageFiles": {"description": "An import's step: the files its content names."},
"workStageContent": "Writing studysets, flashcards and notes",
"@workStageContent": {"description": "An archive import's step: its content."},
"workStageProgress": "Bringing over your progress",
"@workStageProgress": {"description": "An archive import's step: reviews, answers and pages read."},
"workStageCards": "Writing flashcards",
"@workStageCards": {"description": "An Anki import's step: its notes as flashcards."},
"workStageTags": "Tagging",
"@workStageTags": {"description": "An Anki import's step: the flashcards' tags."},
"workStageReviews": "Bringing over the review history",
"@workStageReviews": {"description": "An Anki import's step: its reviews."},
"workStageReading": "Reading the content",
"@workStageReading": {"description": "An export's step: the studysets and what is in them."},
"workStageGathering": "Gathering files",
"@workStageGathering": {"description": "An export's step: the files its content names."},
"workStagePacking": "Packing",
"@workStagePacking": {"description": "An export's step: the zip file made."},
"importAborted": "Import aborted: nothing of it was kept.",
"@importAborted": {"description": "Snack bar after an import's Abort, which deleted what it had made."},
"exportAborted": "Export aborted.",
"@exportAborted": {"description": "Snack bar after an export's Abort."},
"exportProgressTitle": "Exporting",
"@exportProgressTitle": {"description": "The sheet showing an export's progress."}
}