feat(app): choose, manage and filter by tags
The card editor offers its tags: a picker that searches by the start of a name, creates a tag (name and colour) and chooses it, and saves the choice with the card. A sheet lists every tag with its count, to add, rename (merging into a tag of that name), recolour and delete them, with an undo. The card list shows each card's tags and narrows to one tag. The editor closed twice once tags changed after saving; it now closes on becoming done only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
c2d4dfc8b6
commit
9dc9b6a5ed
1 changed files with 2076 additions and 63 deletions
|
|
@ -712,6 +712,228 @@ abstract class AppLocalizations {
|
|||
/// **'About Halkyon Learn'**
|
||||
String get settingsAbout;
|
||||
|
||||
/// No description provided for @tagsReadFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Couldn\'t read the tags.'**
|
||||
String get tagsReadFailed;
|
||||
|
||||
/// No description provided for @tagPickerTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Tags'**
|
||||
String get tagPickerTitle;
|
||||
|
||||
/// No description provided for @tagPickerManage.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Manage tags'**
|
||||
String get tagPickerManage;
|
||||
|
||||
/// No description provided for @tagPickerSearchLabel.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Search or create a tag'**
|
||||
String get tagPickerSearchLabel;
|
||||
|
||||
/// No description provided for @tagPickerCreate.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create \"{name}\"'**
|
||||
String tagPickerCreate(String name);
|
||||
|
||||
/// No description provided for @tagSheetCreateTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create tag'**
|
||||
String get tagSheetCreateTitle;
|
||||
|
||||
/// No description provided for @tagSheetEditTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Edit tag'**
|
||||
String get tagSheetEditTitle;
|
||||
|
||||
/// No description provided for @tagSheetNameLabel.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Name'**
|
||||
String get tagSheetNameLabel;
|
||||
|
||||
/// No description provided for @tagSheetNameHelper.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Stored and displayed in lowercase.'**
|
||||
String get tagSheetNameHelper;
|
||||
|
||||
/// No description provided for @tagSheetNameExists.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'The tag \'{name}\' exists already.'**
|
||||
String tagSheetNameExists(String name);
|
||||
|
||||
/// No description provided for @tagSheetNameMerges.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'There is a tag \'{name}\' already: saving merges this one into it.'**
|
||||
String tagSheetNameMerges(String name);
|
||||
|
||||
/// No description provided for @tagSheetColor.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Color'**
|
||||
String get tagSheetColor;
|
||||
|
||||
/// No description provided for @tagSheetCreate.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Create'**
|
||||
String get tagSheetCreate;
|
||||
|
||||
/// No description provided for @tagSheetSave.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Save'**
|
||||
String get tagSheetSave;
|
||||
|
||||
/// No description provided for @tagManageTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Manage tags'**
|
||||
String get tagManageTitle;
|
||||
|
||||
/// No description provided for @tagManageEmpty.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'No tags yet. Add one below.'**
|
||||
String get tagManageEmpty;
|
||||
|
||||
/// No description provided for @tagManageAdd.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add tag'**
|
||||
String get tagManageAdd;
|
||||
|
||||
/// A tag in the list of tags, with how many flashcards have it.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{name} ({count})'**
|
||||
String tagManageRow(String name, int count);
|
||||
|
||||
/// No description provided for @tagManageEdit.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Edit tag'**
|
||||
String get tagManageEdit;
|
||||
|
||||
/// No description provided for @tagManageDelete.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Delete tag'**
|
||||
String get tagManageDelete;
|
||||
|
||||
/// No description provided for @tagDeleteTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Delete the tag \'{name}\'?'**
|
||||
String tagDeleteTitle(String name);
|
||||
|
||||
/// No description provided for @tagDeleteMessage.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{count, plural, =0{It isn\'t on any flashcards.} =1{It is removed from 1 flashcard, on all your devices.} other{It is removed from {count} flashcards, on all your devices.}}'**
|
||||
String tagDeleteMessage(int count);
|
||||
|
||||
/// No description provided for @tagDeleteConfirm.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Delete'**
|
||||
String get tagDeleteConfirm;
|
||||
|
||||
/// No description provided for @tagDeleted.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Deleted the tag \'{name}\''**
|
||||
String tagDeleted(String name);
|
||||
|
||||
/// No description provided for @cardTagsLabel.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Tags'**
|
||||
String get cardTagsLabel;
|
||||
|
||||
/// No description provided for @cardTagsAdd.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Add tags'**
|
||||
String get cardTagsAdd;
|
||||
|
||||
/// No description provided for @cardTagsEdit.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Edit tags'**
|
||||
String get cardTagsEdit;
|
||||
|
||||
/// No description provided for @cardFilterTooltip.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Filter'**
|
||||
String get cardFilterTooltip;
|
||||
|
||||
/// No description provided for @cardFilterTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Filter'**
|
||||
String get cardFilterTitle;
|
||||
|
||||
/// No description provided for @cardFilterTag.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Tag'**
|
||||
String get cardFilterTag;
|
||||
|
||||
/// No description provided for @cardFilterAllTags.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'All tags'**
|
||||
String get cardFilterAllTags;
|
||||
|
||||
/// No description provided for @cardFilterNoTags.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'None of these flashcards has a tag yet.'**
|
||||
String get cardFilterNoTags;
|
||||
|
||||
/// No description provided for @cardFilterClear.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Clear all'**
|
||||
String get cardFilterClear;
|
||||
|
||||
/// No description provided for @cardFilterApply.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Apply'**
|
||||
String get cardFilterApply;
|
||||
|
||||
/// No description provided for @cardFilterNothing.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'No flashcards have this tag.'**
|
||||
String get cardFilterNothing;
|
||||
|
||||
/// No description provided for @cardListMore.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'More'**
|
||||
String get cardListMore;
|
||||
|
||||
/// No description provided for @cardListManageTags.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Manage tags'**
|
||||
String get cardListManageTags;
|
||||
|
||||
/// No description provided for @commonCancel.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
Loading…
Reference in a new issue