feat(apps): refine login consent and calendar day/month UX

This commit is contained in:
qzl
2026-03-20 19:00:24 +08:00
parent 2e94908eaa
commit fcf98b1142
11 changed files with 359 additions and 58 deletions
@@ -36,6 +36,7 @@ class DayEventLayoutEngine {
required DayViewScale scale,
required double eventAreaLeft,
required double eventAreaWidth,
required DateTime viewDate,
double columnGap = DayTimelineMetrics.eventColumnGap,
}) {
if (events.isEmpty || eventAreaWidth <= 0) {
@@ -44,7 +45,8 @@ class DayEventLayoutEngine {
final sorted =
events
.map(_EventSpan.fromEvent)
.map((e) => _EventSpan.fromEvent(e, viewDate))
.expand((spans) => spans)
.where((span) => span.endMinutes > span.startMinutes)
.toList()
..sort((a, b) {
@@ -149,19 +151,73 @@ class _EventSpan {
required this.endMinutes,
});
factory _EventSpan.fromEvent(ScheduleItemModel event) {
final start = _minutesOfDay(event.startAt);
final end = event.endAt != null ? _minutesOfDay(event.endAt!) : start + 60;
final clampedStart = DayTimelineMetrics.clampMinuteOfDay(start);
var clampedEnd = DayTimelineMetrics.clampMinuteOfDay(end);
if (clampedEnd <= clampedStart) {
clampedEnd = DayTimelineMetrics.clampMinuteOfDay(clampedStart + 1);
static List<_EventSpan> fromEvent(
ScheduleItemModel event,
DateTime viewDate,
) {
final startAt = event.startAt;
final endAt = event.endAt;
final viewDateOnly = DateTime(viewDate.year, viewDate.month, viewDate.day);
final startDateOnly = DateTime(startAt.year, startAt.month, startAt.day);
final endDateOnly = endAt != null
? DateTime(endAt.year, endAt.month, endAt.day)
: startDateOnly;
final startMinOfDay = _minutesOfDay(startAt);
final endMinOfDay = endAt != null
? _minutesOfDay(endAt)
: startMinOfDay + 60;
if (endDateOnly.isAfter(startDateOnly)) {
if (viewDateOnly.isAtSameMomentAs(startDateOnly)) {
final clampedStart = DayTimelineMetrics.clampMinuteOfDay(startMinOfDay);
final clampedEnd = DayTimelineMetrics.minutesInDay;
if (clampedEnd > clampedStart) {
return [
_EventSpan(
event: event,
startMinutes: clampedStart,
endMinutes: clampedEnd,
),
];
}
} else if (viewDateOnly.isAtSameMomentAs(endDateOnly)) {
final clampedStart = 0;
final clampedEnd = DayTimelineMetrics.clampMinuteOfDay(endMinOfDay);
if (clampedEnd > clampedStart) {
return [
_EventSpan(
event: event,
startMinutes: clampedStart,
endMinutes: clampedEnd,
),
];
}
} else if (viewDateOnly.isAfter(startDateOnly) &&
viewDateOnly.isBefore(endDateOnly)) {
return [
_EventSpan(
event: event,
startMinutes: 0,
endMinutes: DayTimelineMetrics.minutesInDay,
),
];
}
return const [];
}
return _EventSpan(
event: event,
startMinutes: clampedStart,
endMinutes: clampedEnd,
);
final clampedStart = DayTimelineMetrics.clampMinuteOfDay(startMinOfDay);
var clampedEnd = DayTimelineMetrics.clampMinuteOfDay(endMinOfDay);
if (clampedEnd <= clampedStart) {
clampedEnd = clampedStart + 1;
}
return [
_EventSpan(
event: event,
startMinutes: clampedStart,
endMinutes: clampedEnd,
),
];
}
}
@@ -1,6 +1,6 @@
class DayViewScale {
static const double defaultHourHeight = 34.0;
static const double minHourHeight = 17.0;
static const double minHourHeight = 34.0;
static const double maxHourHeight = 68.0;
final double hourHeight;
@@ -8,7 +8,7 @@ class DayViewScale {
const DayViewScale({required this.hourHeight});
factory DayViewScale.defaultScale() {
return const DayViewScale(hourHeight: defaultHourHeight);
return const DayViewScale(hourHeight: minHourHeight);
}
DayViewScale copyWith({double? hourHeight}) {