feat(mobile): UI-03 forms and collaboration pages (09-12)

- Page 09 create: grouped form (Event details / Description & languages),
  required default-language selector, zh-CN/en tabs with per-locale
  title/description/venue/address, explicit timezone field, bottom save
  button kept keyboard-reachable, create mode has no Access tab
- Page 10 edit: Details/Access tabs sharing one draft; Access has four
  switches with explanations; original downloads constrained by downloads
  (disabled + forced off in PATCH); unsaved-changes PopScope confirm;
  save commits all changes in one minimal PATCH
- Page 11 members: Owner group + Collaborators list with initial avatars
  and per-row remove; full-width Invite colleague opens account-search
  bottom sheet (debounced prefix search, race guard, already-added state);
  remove confirm names the member
- Page 12 categories: extracted to standalone page with per-row edit/
  delete menu and New category sheet (language tabs + name + sort order);
  delete confirm mentions photo impact; collaborator browse-only; old
  inline section removed from album detail
- l10n: new form/members/categories keys both locales; regenerated
- tests: form 14, members 6, categories 7, detail nav 1; full suite green

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-22 01:23:02 +08:00
parent 5715c608d8
commit 8bd09eefb9
13 changed files with 2322 additions and 1184 deletions
+111 -48
View File
@@ -211,18 +211,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get albumCreate => 'Create album';
@override
String get albumEdit => 'Edit album';
@override
String get albumSectionEventInfo => 'Event info';
@override
String get albumSectionContent => 'Multilingual content';
@override
String get albumSectionAccess => 'Access settings';
@override
String get albumTitle => 'Title';
@@ -235,9 +223,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get albumAddress => 'Address';
@override
String get albumDefaultLocale => 'Default locale';
@override
String get albumStartAt => 'Start time';
@@ -253,18 +238,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get albumTimezoneInvalid => 'Invalid IANA timezone name';
@override
String get switchUpload => 'Allow uploads';
@override
String get switchPublic => 'Publicly visible';
@override
String get switchDownload => 'Allow downloads';
@override
String get switchOriginalDownload => 'Allow original downloads';
@override
String get formStartAtRequired => 'Pick a start time';
@@ -278,6 +251,73 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get formEndAtNotAfterStartAt => 'End time must be after start time';
@override
String get formEventDetails => 'Event details';
@override
String get formDescriptionLanguages => 'Description & languages';
@override
String get formDefaultLanguage => 'Default language';
@override
String get formDetailsTab => 'Details';
@override
String get formAccessTab => 'Access';
@override
String get formAllowUploads => 'Allow uploads';
@override
String get formAllowUploadsDesc =>
'Allow staff to upload photos to this album';
@override
String get formPublicAccess => 'Public access';
@override
String get formPublicAccessDesc => 'Anyone with the link can view photos';
@override
String get formAllowDownloads => 'Allow downloads';
@override
String get formAllowDownloadsDesc =>
'Viewers can download browse-quality photos';
@override
String get formOriginalDownloads => 'Original downloads';
@override
String get formOriginalDownloadsDesc =>
'Viewers can download original photos';
@override
String get createAlbumTitle => 'Create album';
@override
String get createAlbumSubmit => 'Create album';
@override
String get editAlbumTitle => 'Edit album';
@override
String get saveChanges => 'Save changes';
@override
String get unsavedChangesTitle => 'Discard changes?';
@override
String get unsavedChangesBody =>
'Your edits are not saved yet. Leaving now will discard them.';
@override
String get discardChanges => 'Discard';
@override
String get keepEditing => 'Keep editing';
@override
String get create => 'Create';
@@ -309,7 +349,47 @@ class AppLocalizationsEn extends AppLocalizations {
String get actionEdit => 'Edit';
@override
String get albumMembers => 'Members';
String get membersTitle => 'Members';
@override
String membersTitleCount(int count) {
return 'Members ($count)';
}
@override
String get ownerGroup => 'Owner';
@override
String get collaboratorsGroup => 'Collaborators';
@override
String get noCollaborators => 'No collaborators yet';
@override
String get inviteColleague => 'Invite colleague';
@override
String get alreadyAdded => 'Already added';
@override
String get add => 'Add';
@override
String get categoriesTitle => 'Categories';
@override
String get newCategory => 'New category';
@override
String get editCategory => 'Edit category';
@override
String deleteCategoryConfirm(String name) {
return 'Delete \"$name\"? Its photos will become uncategorized.';
}
@override
String get noCategories => 'No categories yet';
@override
String get albumCategories => 'Categories';
@@ -323,19 +403,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get delete => 'Delete';
@override
String get deleteConfirmCategory =>
'Delete this category? Its photos will become uncategorized.';
@override
String get categoryEmpty => 'No categories yet. Tap + to add one';
@override
String get categoryAdd => 'Add category';
@override
String get categoryEdit => 'Edit category';
@override
String get categoryNameZh => 'Chinese name';
@@ -351,9 +418,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get categorySortOrderInvalid => 'Sort order must be an integer';
@override
String get albumMembersEmpty => 'No members yet';
@override
String get inviteSearchHint =>
'Search by account prefix to invite (at least 2 characters)';
@@ -361,9 +425,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get inviteNoResults => 'No matching users';
@override
String get invite => 'Invite';
@override
String get memberInvited => 'Invited';
@@ -371,7 +432,9 @@ class AppLocalizationsEn extends AppLocalizations {
String get removeMember => 'Remove member';
@override
String get removeMemberConfirm => 'Remove this member?';
String removeMemberConfirm(String name) {
return 'Remove $name from this album?';
}
@override
String get roleOwner => 'Owner';