feat(explore): take a later release into a copy, at a tap

A copy's top studyset says when a newer release of what it came from is
out, and what it would bring: changed, new and withdrawn items, counted
against the release the copy last took. Update takes it, never by
itself (ADR 0005, rule 4): cards, notes and steps take the release as a
revision on the one where they last took a release and merge per side,
as a dictionary's corrections do, so what the learner changed stays and
a side both changed is a conflict to settle; studysets, paths and PDFs
take each field the learner left as it was. New items come in where
they belong, unless the learner deleted that part; what the author
withdrew stays, marked, and the card browser filters for it; what the
learner deleted stays deleted; progress is never touched.

The instance gives out any release by its version, for the app to
compare the two. UpdateTaken moves into the shared revision merge, now
that notes and steps take updates too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-09 23:47:41 +02:00
commit 5613530f82
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -4051,7 +4051,7 @@ abstract class AppLocalizations {
/// No description provided for @composerConflict.
///
/// In en, this message translates to:
/// **'This flashcard was changed in two ways at once: on two of your devices, or by you and by a correction from the dictionary. Choose the version to keep of each part below.'**
/// **'This flashcard was changed in two ways at once: on two of your devices, or by you and by a correction from the dictionary or a new release of what it was copied from. Choose the version to keep of each part below.'**
String get composerConflict;
/// No description provided for @composerKeepThis.
@ -8498,6 +8498,66 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Taken off Explore.'**
String get publishWithdrawnDone;
/// No description provided for @copyUpdateOut.
///
/// In en, this message translates to:
/// **'v{version} is out: {summary}.'**
String copyUpdateOut(int version, String summary);
/// No description provided for @copyUpdateChanged.
///
/// In en, this message translates to:
/// **'{count} changed'**
String copyUpdateChanged(int count);
/// No description provided for @copyUpdateAdded.
///
/// In en, this message translates to:
/// **'{count} new'**
String copyUpdateAdded(int count);
/// No description provided for @copyUpdateWithdrawn.
///
/// In en, this message translates to:
/// **'{count} withdrawn'**
String copyUpdateWithdrawn(int count);
/// No description provided for @copyUpdateNothing.
///
/// In en, this message translates to:
/// **'nothing in your copy changes'**
String get copyUpdateNothing;
/// No description provided for @copyUpdate.
///
/// In en, this message translates to:
/// **'Update'**
String get copyUpdate;
/// No description provided for @copyUpdated.
///
/// In en, this message translates to:
/// **'Updated to v{version}.'**
String copyUpdated(int version);
/// No description provided for @copyUpdatedToSettle.
///
/// In en, this message translates to:
/// **'{count, plural, =1{One has a change of yours there too: open it to choose.} other{{count} have a change of yours there too: open them to choose.}}'**
String copyUpdatedToSettle(int count);
/// No description provided for @copyUpdateFailed.
///
/// In en, this message translates to:
/// **'Couldn\'t reach your instance. Try again.'**
String get copyUpdateFailed;
/// No description provided for @cardBrowserStatusWithdrawn.
///
/// In en, this message translates to:
/// **'Withdrawn by the author'**
String get cardBrowserStatusWithdrawn;
}
class _AppLocalizationsDelegate