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
+38 -17
View File
@@ -66,28 +66,40 @@
"albumsEmpty": "No albums yet. Tap \"Create album\" to get started",
"loadMoreFailed": "Failed to load more. Tap to retry",
"albumCreate": "Create album",
"albumEdit": "Edit album",
"albumSectionEventInfo": "Event info",
"albumSectionContent": "Multilingual content",
"albumSectionAccess": "Access settings",
"albumTitle": "Title",
"albumDescription": "Description",
"albumVenue": "Venue",
"albumAddress": "Address",
"albumDefaultLocale": "Default locale",
"albumStartAt": "Start time",
"albumEndAtOptional": "End time (optional)",
"clearEndAt": "Clear end time",
"albumTimezone": "Timezone",
"albumTimezoneInvalid": "Invalid IANA timezone name",
"switchUpload": "Allow uploads",
"switchPublic": "Publicly visible",
"switchDownload": "Allow downloads",
"switchOriginalDownload": "Allow original downloads",
"formStartAtRequired": "Pick a start time",
"formDefaultLocaleMissing": "Default locale must have a title",
"formTitleRequiredWithFields": "Title is required when description, venue or address is filled",
"formEndAtNotAfterStartAt": "End time must be after start time",
"formEventDetails": "Event details",
"formDescriptionLanguages": "Description & languages",
"formDefaultLanguage": "Default language",
"formDetailsTab": "Details",
"formAccessTab": "Access",
"formAllowUploads": "Allow uploads",
"formAllowUploadsDesc": "Allow staff to upload photos to this album",
"formPublicAccess": "Public access",
"formPublicAccessDesc": "Anyone with the link can view photos",
"formAllowDownloads": "Allow downloads",
"formAllowDownloadsDesc": "Viewers can download browse-quality photos",
"formOriginalDownloads": "Original downloads",
"formOriginalDownloadsDesc": "Viewers can download original photos",
"createAlbumTitle": "Create album",
"createAlbumSubmit": "Create album",
"editAlbumTitle": "Edit album",
"saveChanges": "Save changes",
"unsavedChangesTitle": "Discard changes?",
"unsavedChangesBody": "Your edits are not saved yet. Leaving now will discard them.",
"discardChanges": "Discard",
"keepEditing": "Keep editing",
"create": "Create",
"save": "Save",
"albumStatusActive": "Active",
@@ -98,27 +110,36 @@
"tagOriginal": "Original",
"notSet": "Not set",
"actionEdit": "Edit",
"albumMembers": "Members",
"membersTitle": "Members",
"membersTitleCount": "Members ({count})",
"@membersTitleCount": { "placeholders": { "count": { "type": "int" } } },
"ownerGroup": "Owner",
"collaboratorsGroup": "Collaborators",
"noCollaborators": "No collaborators yet",
"inviteColleague": "Invite colleague",
"alreadyAdded": "Already added",
"add": "Add",
"categoriesTitle": "Categories",
"newCategory": "New category",
"editCategory": "Edit category",
"deleteCategoryConfirm": "Delete \"{name}\"? Its photos will become uncategorized.",
"@deleteCategoryConfirm": { "placeholders": { "name": { "type": "String" } } },
"noCategories": "No categories yet",
"albumCategories": "Categories",
"shareQrTitle": "Share QR code",
"albumPhotos": "Photos",
"delete": "Delete",
"deleteConfirmCategory": "Delete this category? Its photos will become uncategorized.",
"categoryEmpty": "No categories yet. Tap + to add one",
"categoryAdd": "Add category",
"categoryEdit": "Edit category",
"categoryNameZh": "Chinese name",
"categoryNameEn": "English name",
"categorySortOrder": "Sort order",
"categoryNameRequired": "At least one language name is required",
"categorySortOrderInvalid": "Sort order must be an integer",
"albumMembersEmpty": "No members yet",
"inviteSearchHint": "Search by account prefix to invite (at least 2 characters)",
"inviteNoResults": "No matching users",
"invite": "Invite",
"memberInvited": "Invited",
"removeMember": "Remove member",
"removeMemberConfirm": "Remove this member?",
"removeMemberConfirm": "Remove {name} from this album?",
"@removeMemberConfirm": { "placeholders": { "name": { "type": "String" } } },
"roleOwner": "Owner",
"roleCollaborator": "Collaborator",
"selfMarker": " (you)",