Fixed Leave rejection and approvals

This commit is contained in:
2026-03-11 18:59:28 +08:00
parent 21e6d68910
commit f8c79acbbc
4 changed files with 41 additions and 9 deletions
+17 -2
View File
@@ -16,6 +16,7 @@ import '../../models/profile.dart';
import '../../providers/attendance_provider.dart';
import '../../providers/debug_settings_provider.dart';
import '../../providers/leave_provider.dart';
import '../../screens/dashboard/dashboard_screen.dart';
import '../../providers/pass_slip_provider.dart';
import '../../providers/profile_provider.dart';
import '../../providers/reports_provider.dart';
@@ -3796,6 +3797,8 @@ class _LeaveTabState extends ConsumerState<_LeaveTab> {
setState(() => _submitting = true);
try {
await ref.read(leaveControllerProvider).approveLeave(leaveId);
ref.invalidate(leavesProvider);
ref.invalidate(dashboardMetricsProvider);
if (mounted) {
showSuccessSnackBar(context, 'Leave approved.');
}
@@ -3812,6 +3815,8 @@ class _LeaveTabState extends ConsumerState<_LeaveTab> {
setState(() => _submitting = true);
try {
await ref.read(leaveControllerProvider).rejectLeave(leaveId);
ref.invalidate(leavesProvider);
ref.invalidate(dashboardMetricsProvider);
if (mounted) {
showSuccessSnackBar(context, 'Leave rejected.');
}
@@ -3828,6 +3833,8 @@ class _LeaveTabState extends ConsumerState<_LeaveTab> {
setState(() => _submitting = true);
try {
await ref.read(leaveControllerProvider).cancelLeave(leaveId);
ref.invalidate(leavesProvider);
ref.invalidate(dashboardMetricsProvider);
if (mounted) {
showSuccessSnackBar(context, 'Leave cancelled.');
}
@@ -4112,14 +4119,14 @@ class _FileLeaveDialogState extends ConsumerState<_FileLeaveDialog> {
return;
}
final startDt = DateTime(
var startDt = DateTime(
_startDate!.year,
_startDate!.month,
_startDate!.day,
_startTime!.hour,
_startTime!.minute,
);
final endDt = DateTime(
var endDt = DateTime(
_startDate!.year,
_startDate!.month,
_startDate!.day,
@@ -4132,6 +4139,10 @@ class _FileLeaveDialogState extends ConsumerState<_FileLeaveDialog> {
return;
}
// convert to app timezone to avoid device-local mismatches
startDt = AppTime.toAppTime(startDt);
endDt = AppTime.toAppTime(endDt);
setState(() => _submitting = true);
try {
await ref
@@ -4143,6 +4154,10 @@ class _FileLeaveDialogState extends ConsumerState<_FileLeaveDialog> {
endTime: endDt,
autoApprove: widget.isAdmin,
);
// ensure UI and dashboard will refresh promptly even if realtime is
// delayed or temporarily disconnected
ref.invalidate(leavesProvider);
ref.invalidate(dashboardMetricsProvider);
if (mounted) {
Navigator.of(context).pop();
widget.onSubmitted();