feat(alarmas): simplify alarm cards and add vacation summary row

Restyle the Alarmas root per the functional redesign: alarm cards drop
the always-visible edit/skip/delete button row for a minimal giant
time + station + switch layout. Tap opens the editor, swipe deletes
(with an AlertDialog confirmation), and the hero banner gains an
inline "Saltar" pill for the featured (soonest-firing) alarm's skip
action. No capability from the old button row is lost, only the
trigger location moved; estado_alarmas.dart and its scheduling/
snooze/dismiss-guard tests are untouched.

The vacation inline panel becomes a tappable summary row (range count
+ next-range countdown, computed over the existing estado.vacaciones)
that pushes a Vacaciones manager screen. That destination is a
placeholder for now (_PantallaVacacionesTemporal, holding the old
panel's body verbatim so add/delete-range capability is preserved) --
WU9 replaces it with the real PantallaVacaciones per design ADR-6.

New ARB keys (en/es only; other 11 locales are WU18's job):
alarmHeroSkipAction, alarmDeleteConfirmTitle/Message,
vacationRangesCount, vacationSummary{Active,Upcoming}Countdown.
This commit is contained in:
2026-07-29 10:20:25 +02:00
parent 6653e044c7
commit 9a2eb57a0e
19 changed files with 876 additions and 237 deletions
+27
View File
@@ -422,6 +422,9 @@
"editAction": "Edit",
"skipNextAction": "Skip next",
"deleteTooltip": "Delete",
"alarmHeroSkipAction": "Skip",
"alarmDeleteConfirmTitle": "Delete alarm?",
"alarmDeleteConfirmMessage": "This can't be undone.",
"alarmSkippedNoNextSnackbar": "Alarm skipped. There is no next occurrence left.",
"alarmSkippedReturnsSnackbar": "Alarm skipped. It will return on {date}.",
"@alarmSkippedReturnsSnackbar": {
@@ -508,6 +511,30 @@
"vacationRangesHint": "If an alarm is set to \"Paused during vacations\", it automatically skips these ranges.",
"noVacationRangesLoaded": "No ranges loaded.",
"deleteRangeTooltip": "Delete range",
"vacationRangesCount": "{count} ranges",
"@vacationRangesCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"vacationSummaryActiveCountdown": "Active now · {days} days left",
"@vacationSummaryActiveCountdown": {
"placeholders": {
"days": {
"type": "int"
}
}
},
"vacationSummaryUpcomingCountdown": "Next range in {days} days",
"@vacationSummaryUpcomingCountdown": {
"placeholders": {
"days": {
"type": "int"
}
}
},
"vacationsDefaultName": "Vacation",
"newVacationRangeTitle": "New vacation range",
"startField": "Start",
+27
View File
@@ -422,6 +422,9 @@
"editAction": "Editar",
"skipNextAction": "Omitir siguiente",
"deleteTooltip": "Eliminar",
"alarmHeroSkipAction": "Saltar",
"alarmDeleteConfirmTitle": "¿Eliminar alarma?",
"alarmDeleteConfirmMessage": "Esta acción no se puede deshacer.",
"alarmSkippedNoNextSnackbar": "Alarma omitida. No queda próxima ejecución.",
"alarmSkippedReturnsSnackbar": "Alarma omitida. Volverá el {date}.",
"@alarmSkippedReturnsSnackbar": {
@@ -508,6 +511,30 @@
"vacationRangesHint": "Si una alarma tiene \"Pausa en vacaciones\", se salta automáticamente estos rangos.",
"noVacationRangesLoaded": "Sin rangos cargados.",
"deleteRangeTooltip": "Eliminar rango",
"vacationRangesCount": "{count} rangos",
"@vacationRangesCount": {
"placeholders": {
"count": {
"type": "int"
}
}
},
"vacationSummaryActiveCountdown": "En curso · quedan {days} días",
"@vacationSummaryActiveCountdown": {
"placeholders": {
"days": {
"type": "int"
}
}
},
"vacationSummaryUpcomingCountdown": "Próximo rango en {days} días",
"@vacationSummaryUpcomingCountdown": {
"placeholders": {
"days": {
"type": "int"
}
}
},
"vacationsDefaultName": "Vacaciones",
"newVacationRangeTitle": "Nuevo rango de vacaciones",
"startField": "Inicio",
+36
View File
@@ -1570,6 +1570,24 @@ abstract class AppLocalizations {
/// **'Eliminar'**
String get deleteTooltip;
/// No description provided for @alarmHeroSkipAction.
///
/// In es, this message translates to:
/// **'Saltar'**
String get alarmHeroSkipAction;
/// No description provided for @alarmDeleteConfirmTitle.
///
/// In es, this message translates to:
/// **'¿Eliminar alarma?'**
String get alarmDeleteConfirmTitle;
/// No description provided for @alarmDeleteConfirmMessage.
///
/// In es, this message translates to:
/// **'Esta acción no se puede deshacer.'**
String get alarmDeleteConfirmMessage;
/// No description provided for @alarmSkippedNoNextSnackbar.
///
/// In es, this message translates to:
@@ -1838,6 +1856,24 @@ abstract class AppLocalizations {
/// **'Eliminar rango'**
String get deleteRangeTooltip;
/// No description provided for @vacationRangesCount.
///
/// In es, this message translates to:
/// **'{count} rangos'**
String vacationRangesCount(int count);
/// No description provided for @vacationSummaryActiveCountdown.
///
/// In es, this message translates to:
/// **'En curso · quedan {days} días'**
String vacationSummaryActiveCountdown(int days);
/// No description provided for @vacationSummaryUpcomingCountdown.
///
/// In es, this message translates to:
/// **'Próximo rango en {days} días'**
String vacationSummaryUpcomingCountdown(int days);
/// No description provided for @vacationsDefaultName.
///
/// In es, this message translates to:
+24
View File
@@ -840,6 +840,15 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get deleteTooltip => 'حذف';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'تم تخطي المنبه. لا يوجد تشغيل قادم.';
@@ -994,6 +1003,21 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get deleteRangeTooltip => 'حذف النطاق';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'إجازات';
+24
View File
@@ -845,6 +845,15 @@ class AppLocalizationsBn extends AppLocalizations {
@override
String get deleteTooltip => 'মুছুন';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'অ্যালার্ম এড়ানো হয়েছে। আর কোনো পরবর্তী চালনা নেই।';
@@ -1001,6 +1010,21 @@ class AppLocalizationsBn extends AppLocalizations {
@override
String get deleteRangeTooltip => 'পরিসর মুছুন';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'ছুটি';
+24
View File
@@ -848,6 +848,15 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get deleteTooltip => 'Löschen';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Alarm ausgelassen. Es bleibt keine nächste Ausführung.';
@@ -1002,6 +1011,21 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Zeitraum löschen';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Ferien';
+24
View File
@@ -842,6 +842,15 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get deleteTooltip => 'Delete';
@override
String get alarmHeroSkipAction => 'Skip';
@override
String get alarmDeleteConfirmTitle => 'Delete alarm?';
@override
String get alarmDeleteConfirmMessage => 'This can\'t be undone.';
@override
String get alarmSkippedNoNextSnackbar =>
'Alarm skipped. There is no next occurrence left.';
@@ -996,6 +1005,21 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Delete range';
@override
String vacationRangesCount(int count) {
return '$count ranges';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'Active now · $days days left';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Next range in $days days';
}
@override
String get vacationsDefaultName => 'Vacation';
+24
View File
@@ -846,6 +846,15 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get deleteTooltip => 'Eliminar';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Alarma omitida. No queda próxima ejecución.';
@@ -1000,6 +1009,21 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Eliminar rango';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Vacaciones';
+24
View File
@@ -850,6 +850,15 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get deleteTooltip => 'Supprimer';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Alarme ignorée. Il ne reste aucune prochaine exécution.';
@@ -1006,6 +1015,21 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Supprimer la période';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Vacances';
+24
View File
@@ -842,6 +842,15 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get deleteTooltip => 'हटाएँ';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'अलार्म छोड़ा गया। कोई अगली चाल बाकी नहीं।';
@@ -997,6 +1006,21 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get deleteRangeTooltip => 'अवधि हटाएँ';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'छुट्टियाँ';
+24
View File
@@ -845,6 +845,15 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get deleteTooltip => 'Hapus';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Alarm dilewati. Tidak ada eksekusi berikutnya.';
@@ -1001,6 +1010,21 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Hapus rentang';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Liburan';
+24
View File
@@ -846,6 +846,15 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get deleteTooltip => 'Elimina';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Sveglia saltata. Non resta alcuna prossima esecuzione.';
@@ -1002,6 +1011,21 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Elimina periodo';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Vacanze';
+24
View File
@@ -820,6 +820,15 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get deleteTooltip => '削除';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar => 'アラームをスキップしました。次回実行は残っていません。';
@@ -970,6 +979,21 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get deleteRangeTooltip => '期間を削除';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => '休暇';
+24
View File
@@ -845,6 +845,15 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get deleteTooltip => 'Excluir';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Alarme ignorado. Não resta próxima execução.';
@@ -999,6 +1008,21 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Excluir período';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Férias';
+24
View File
@@ -846,6 +846,15 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get deleteTooltip => 'Удалить';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar =>
'Будильник пропущен. Следующего запуска нет.';
@@ -1001,6 +1010,21 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get deleteRangeTooltip => 'Удалить период';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => 'Отпуск';
+24
View File
@@ -816,6 +816,15 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get deleteTooltip => '删除';
@override
String get alarmHeroSkipAction => 'Saltar';
@override
String get alarmDeleteConfirmTitle => '¿Eliminar alarma?';
@override
String get alarmDeleteConfirmMessage => 'Esta acción no se puede deshacer.';
@override
String get alarmSkippedNoNextSnackbar => '已跳过闹钟。没有剩余的下次执行。';
@@ -966,6 +975,21 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get deleteRangeTooltip => '删除范围';
@override
String vacationRangesCount(int count) {
return '$count rangos';
}
@override
String vacationSummaryActiveCountdown(int days) {
return 'En curso · quedan $days días';
}
@override
String vacationSummaryUpcomingCountdown(int days) {
return 'Próximo rango en $days días';
}
@override
String get vacationsDefaultName => '假期';