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
+203 -95
View File
@@ -488,30 +488,6 @@ abstract class AppLocalizations {
/// **'新建相册'**
String get albumCreate;
/// No description provided for @albumEdit.
///
/// In zh, this message translates to:
/// **'编辑相册'**
String get albumEdit;
/// No description provided for @albumSectionEventInfo.
///
/// In zh, this message translates to:
/// **'活动信息'**
String get albumSectionEventInfo;
/// No description provided for @albumSectionContent.
///
/// In zh, this message translates to:
/// **'多语言内容'**
String get albumSectionContent;
/// No description provided for @albumSectionAccess.
///
/// In zh, this message translates to:
/// **'访问设置'**
String get albumSectionAccess;
/// No description provided for @albumTitle.
///
/// In zh, this message translates to:
@@ -536,12 +512,6 @@ abstract class AppLocalizations {
/// **'地址'**
String get albumAddress;
/// No description provided for @albumDefaultLocale.
///
/// In zh, this message translates to:
/// **'默认语言'**
String get albumDefaultLocale;
/// No description provided for @albumStartAt.
///
/// In zh, this message translates to:
@@ -572,30 +542,6 @@ abstract class AppLocalizations {
/// **'无效的 IANA 时区名称'**
String get albumTimezoneInvalid;
/// No description provided for @switchUpload.
///
/// In zh, this message translates to:
/// **'允许上传'**
String get switchUpload;
/// No description provided for @switchPublic.
///
/// In zh, this message translates to:
/// **'公开可见'**
String get switchPublic;
/// No description provided for @switchDownload.
///
/// In zh, this message translates to:
/// **'允许下载'**
String get switchDownload;
/// No description provided for @switchOriginalDownload.
///
/// In zh, this message translates to:
/// **'允许下载原图'**
String get switchOriginalDownload;
/// No description provided for @formStartAtRequired.
///
/// In zh, this message translates to:
@@ -620,6 +566,132 @@ abstract class AppLocalizations {
/// **'结束时间必须晚于开始时间'**
String get formEndAtNotAfterStartAt;
/// No description provided for @formEventDetails.
///
/// In zh, this message translates to:
/// **'活动信息'**
String get formEventDetails;
/// No description provided for @formDescriptionLanguages.
///
/// In zh, this message translates to:
/// **'描述与语言'**
String get formDescriptionLanguages;
/// No description provided for @formDefaultLanguage.
///
/// In zh, this message translates to:
/// **'默认语言'**
String get formDefaultLanguage;
/// No description provided for @formDetailsTab.
///
/// In zh, this message translates to:
/// **'详情'**
String get formDetailsTab;
/// No description provided for @formAccessTab.
///
/// In zh, this message translates to:
/// **'访问'**
String get formAccessTab;
/// No description provided for @formAllowUploads.
///
/// In zh, this message translates to:
/// **'允许上传'**
String get formAllowUploads;
/// No description provided for @formAllowUploadsDesc.
///
/// In zh, this message translates to:
/// **'允许工作人员向该相册上传照片'**
String get formAllowUploadsDesc;
/// No description provided for @formPublicAccess.
///
/// In zh, this message translates to:
/// **'公开访问'**
String get formPublicAccess;
/// No description provided for @formPublicAccessDesc.
///
/// In zh, this message translates to:
/// **'任何获得链接的人都可以查看照片'**
String get formPublicAccessDesc;
/// No description provided for @formAllowDownloads.
///
/// In zh, this message translates to:
/// **'允许下载'**
String get formAllowDownloads;
/// No description provided for @formAllowDownloadsDesc.
///
/// In zh, this message translates to:
/// **'观众可以下载浏览质量的照片'**
String get formAllowDownloadsDesc;
/// No description provided for @formOriginalDownloads.
///
/// In zh, this message translates to:
/// **'下载原图'**
String get formOriginalDownloads;
/// No description provided for @formOriginalDownloadsDesc.
///
/// In zh, this message translates to:
/// **'观众可以下载原图照片'**
String get formOriginalDownloadsDesc;
/// No description provided for @createAlbumTitle.
///
/// In zh, this message translates to:
/// **'新建相册'**
String get createAlbumTitle;
/// No description provided for @createAlbumSubmit.
///
/// In zh, this message translates to:
/// **'新建相册'**
String get createAlbumSubmit;
/// No description provided for @editAlbumTitle.
///
/// In zh, this message translates to:
/// **'编辑相册'**
String get editAlbumTitle;
/// No description provided for @saveChanges.
///
/// In zh, this message translates to:
/// **'保存修改'**
String get saveChanges;
/// No description provided for @unsavedChangesTitle.
///
/// In zh, this message translates to:
/// **'放弃修改?'**
String get unsavedChangesTitle;
/// No description provided for @unsavedChangesBody.
///
/// In zh, this message translates to:
/// **'修改尚未保存,离开将丢失这些修改。'**
String get unsavedChangesBody;
/// No description provided for @discardChanges.
///
/// In zh, this message translates to:
/// **'放弃'**
String get discardChanges;
/// No description provided for @keepEditing.
///
/// In zh, this message translates to:
/// **'继续编辑'**
String get keepEditing;
/// No description provided for @create.
///
/// In zh, this message translates to:
@@ -680,11 +752,83 @@ abstract class AppLocalizations {
/// **'编辑'**
String get actionEdit;
/// No description provided for @albumMembers.
/// No description provided for @membersTitle.
///
/// In zh, this message translates to:
/// **'成员管理'**
String get albumMembers;
/// **'成员'**
String get membersTitle;
/// No description provided for @membersTitleCount.
///
/// In zh, this message translates to:
/// **'成员({count})'**
String membersTitleCount(int count);
/// No description provided for @ownerGroup.
///
/// In zh, this message translates to:
/// **'创建者'**
String get ownerGroup;
/// No description provided for @collaboratorsGroup.
///
/// In zh, this message translates to:
/// **'协作者'**
String get collaboratorsGroup;
/// No description provided for @noCollaborators.
///
/// In zh, this message translates to:
/// **'还没有协作者'**
String get noCollaborators;
/// No description provided for @inviteColleague.
///
/// In zh, this message translates to:
/// **'邀请同事'**
String get inviteColleague;
/// No description provided for @alreadyAdded.
///
/// In zh, this message translates to:
/// **'已添加'**
String get alreadyAdded;
/// No description provided for @add.
///
/// In zh, this message translates to:
/// **'添加'**
String get add;
/// No description provided for @categoriesTitle.
///
/// In zh, this message translates to:
/// **'分类'**
String get categoriesTitle;
/// No description provided for @newCategory.
///
/// In zh, this message translates to:
/// **'新增分类'**
String get newCategory;
/// No description provided for @editCategory.
///
/// In zh, this message translates to:
/// **'编辑分类'**
String get editCategory;
/// No description provided for @deleteCategoryConfirm.
///
/// In zh, this message translates to:
/// **'删除「{name}」?该分类下的照片将变为未分类。'**
String deleteCategoryConfirm(String name);
/// No description provided for @noCategories.
///
/// In zh, this message translates to:
/// **'暂无分类'**
String get noCategories;
/// No description provided for @albumCategories.
///
@@ -710,30 +854,6 @@ abstract class AppLocalizations {
/// **'删除'**
String get delete;
/// No description provided for @deleteConfirmCategory.
///
/// In zh, this message translates to:
/// **'确定删除该分类?该分类下的照片将变为未分类。'**
String get deleteConfirmCategory;
/// No description provided for @categoryEmpty.
///
/// In zh, this message translates to:
/// **'暂无分类,点击右上角新增'**
String get categoryEmpty;
/// No description provided for @categoryAdd.
///
/// In zh, this message translates to:
/// **'新增分类'**
String get categoryAdd;
/// No description provided for @categoryEdit.
///
/// In zh, this message translates to:
/// **'编辑分类'**
String get categoryEdit;
/// No description provided for @categoryNameZh.
///
/// In zh, this message translates to:
@@ -764,12 +884,6 @@ abstract class AppLocalizations {
/// **'排序序号必须是整数'**
String get categorySortOrderInvalid;
/// No description provided for @albumMembersEmpty.
///
/// In zh, this message translates to:
/// **'暂无成员'**
String get albumMembersEmpty;
/// No description provided for @inviteSearchHint.
///
/// In zh, this message translates to:
@@ -782,12 +896,6 @@ abstract class AppLocalizations {
/// **'未找到匹配用户'**
String get inviteNoResults;
/// No description provided for @invite.
///
/// In zh, this message translates to:
/// **'邀请'**
String get invite;
/// No description provided for @memberInvited.
///
/// In zh, this message translates to:
@@ -803,8 +911,8 @@ abstract class AppLocalizations {
/// No description provided for @removeMemberConfirm.
///
/// In zh, this message translates to:
/// **'确定移除该成员?'**
String get removeMemberConfirm;
/// **'确定将 {name} 从该相册移除?'**
String removeMemberConfirm(String name);
/// No description provided for @roleOwner.
///