feat(albums): date-only pickers for start/end (create & edit, admin + app)
- 管理后台:DatePicker type=datetime → date;提交归一(开始=当天 00:00、 结束=当天 23:59 整天活动语义;契约仍 datetime 仅交互粒度) - App:去掉时间选择步骤(选日期即定;同上归一);表单显示只显 yyyy/M/d - e2e 日期填入改 '2026-10-01'(date 格式);widget 断言日期粒度 - admin 87/87 + build、app 397/397 全绿 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -355,17 +355,14 @@ class _AlbumFormPageState extends ConsumerState<AlbumFormPage>
|
||||
lastDate: DateTime(2100),
|
||||
);
|
||||
if (pickedDate == null || !mounted) return;
|
||||
final pickedTime = await showTimePicker(
|
||||
context: context,
|
||||
initialTime: TimeOfDay(hour: wall.hour, minute: wall.minute),
|
||||
);
|
||||
if (pickedTime == null || !mounted) return;
|
||||
// UI06(用户需求 2026-09-23):只选日期不带时间——开始=当天 00:00,
|
||||
// 结束=当天 23:59(活动整天语义;契约仍为 datetime,仅交互粒度变化)。
|
||||
final naive = DateTime(
|
||||
pickedDate.year,
|
||||
pickedDate.month,
|
||||
pickedDate.day,
|
||||
pickedTime.hour,
|
||||
pickedTime.minute,
|
||||
isStart ? 0 : 23,
|
||||
isStart ? 0 : 59,
|
||||
);
|
||||
final utc = albumWallClockToUtc(naive, tzName);
|
||||
setState(() {
|
||||
@@ -764,9 +761,13 @@ class _AlbumFormPageState extends ConsumerState<AlbumFormPage>
|
||||
final l10n = AppLocalizations.of(context);
|
||||
final theme = Theme.of(context);
|
||||
final value = isStart ? _startAt : _endAt;
|
||||
final formatted = value == null
|
||||
// 只显日期(选择粒度为日期;时间由开始/结束日的 00:00/23:59 语义承载)。
|
||||
final wallShown = value == null
|
||||
? null
|
||||
: formatAlbumDateTime(value, _timezone.text, l10n.localeName);
|
||||
: (tryToAlbumZone(value, _timezone.text.trim()) ?? value.toUtc());
|
||||
final formatted = wallShown == null
|
||||
? null
|
||||
: '${wallShown.year}/${wallShown.month}/${wallShown.day}';
|
||||
return Padding(
|
||||
padding: const EdgeInsets.only(bottom: 12),
|
||||
child: InkWell(
|
||||
|
||||
@@ -258,8 +258,8 @@ void main() {
|
||||
);
|
||||
expect(titleField.controller!.text, '开幕晚宴');
|
||||
// 时间回显按相册时区。
|
||||
expect(find.text('2026/9/18 14:30'), findsOneWidget);
|
||||
expect(find.text('2026/9/19 18:00'), findsOneWidget);
|
||||
expect(find.text('2026/9/18'), findsOneWidget); // UI06:日期粒度显示
|
||||
expect(find.text('2026/9/19'), findsOneWidget); // UI06:日期粒度显示
|
||||
// 无任何变更 → 保存禁用(PATCH minProperties 1)。
|
||||
expect(
|
||||
tester.widget<FilledButton>(find.byType(FilledButton)).onPressed,
|
||||
|
||||
Reference in New Issue
Block a user