diff --git a/lib/controller/finance/payment_request_controller.dart b/lib/controller/finance/payment_request_controller.dart index 14b9e56..0c50ea8 100644 --- a/lib/controller/finance/payment_request_controller.dart +++ b/lib/controller/finance/payment_request_controller.dart @@ -33,13 +33,13 @@ class PaymentRequestController extends GetxController { try { final response = await ApiService.getExpensePaymentRequestFilterApi(); - if (response != null && response.data != null) { - projects.assignAll(response.data!.projects ?? []); - payees.assignAll(response.data!.payees ?? []); - categories.assignAll(response.data!.expenseCategory ?? []); - currencies.assignAll(response.data!.currency ?? []); - statuses.assignAll(response.data!.status ?? []); - createdBy.assignAll(response.data!.createdBy ?? []); + if (response != null) { + projects.assignAll(response.data.projects); + payees.assignAll(response.data.payees); + categories.assignAll(response.data.expenseCategory); + currencies.assignAll(response.data.currency); + statuses.assignAll(response.data.status); + createdBy.assignAll(response.data.createdBy); } else { logSafe("Payment request filter API returned null", level: LogLevel.warning); diff --git a/lib/helpers/widgets/custom_app_bar.dart b/lib/helpers/widgets/custom_app_bar.dart index 994d823..cd9f929 100644 --- a/lib/helpers/widgets/custom_app_bar.dart +++ b/lib/helpers/widgets/custom_app_bar.dart @@ -5,11 +5,9 @@ import 'package:on_field_work/helpers/widgets/my_spacing.dart'; import 'package:on_field_work/helpers/widgets/my_text.dart'; import 'package:on_field_work/helpers/utils/mixins/ui_mixin.dart'; -class CustomAppBar extends StatefulWidget - with UIMixin - implements PreferredSizeWidget { +class CustomAppBar extends StatefulWidget implements PreferredSizeWidget { final String title; - final String? projectName; // If passed, show static text + final String? projectName; final VoidCallback? onBackPressed; final Color? backgroundColor; @@ -51,13 +49,13 @@ class _CustomAppBarState extends State with UIMixin { return OverlayEntry( builder: (context) => GestureDetector( onTap: () { - _toggleDropdown(); + _toggleDropdown(); }, behavior: HitTestBehavior.translucent, child: Stack( children: [ Positioned( - left: offset.dx + 16, + left: offset.dx + 16, top: offset.dy + size.height, width: size.width - 32, child: Material( diff --git a/lib/model/expense/reimbursement_bottom_sheet.dart b/lib/model/expense/reimbursement_bottom_sheet.dart index 75db7b1..c1d0e13 100644 --- a/lib/model/expense/reimbursement_bottom_sheet.dart +++ b/lib/model/expense/reimbursement_bottom_sheet.dart @@ -197,7 +197,7 @@ class _ReimbursementBottomSheetState extends State { return; } - if (expenseTransactionDate != null && selectedDate != null) { + if (expenseTransactionDate != null) { final normalizedSelected = DateTime( selectedDate.year, selectedDate.month, diff --git a/lib/view/employees/employee_detail_screen.dart b/lib/view/employees/employee_detail_screen.dart index a65d6bc..7a8b185 100644 --- a/lib/view/employees/employee_detail_screen.dart +++ b/lib/view/employees/employee_detail_screen.dart @@ -538,7 +538,7 @@ class _EmployeeDetailPageState extends State with UIMixin { if (managers.isEmpty) return '—'; return managers .map((m) => - '${(m.firstName ?? '').trim()} ${(m.lastName ?? '').trim()}'.trim()) + '${(m.firstName ).trim()} ${(m.lastName ).trim()}'.trim()) .where((name) => name.isNotEmpty) .join(', '); } diff --git a/lib/view/finance/payment_request_detail_screen.dart b/lib/view/finance/payment_request_detail_screen.dart index e53ac85..1f17f53 100644 --- a/lib/view/finance/payment_request_detail_screen.dart +++ b/lib/view/finance/payment_request_detail_screen.dart @@ -217,7 +217,7 @@ class _PaymentRequestDetailScreenState extends State return const SizedBox.shrink(); } - if (!_checkedPermission && request != null && employeeInfo != null) { + if (!_checkedPermission && employeeInfo != null) { _checkedPermission = true; _checkPermissionToSubmit(request); } diff --git a/lib/view/tenant/tenant_selection_screen.dart b/lib/view/tenant/tenant_selection_screen.dart index 21c8283..0249f44 100644 --- a/lib/view/tenant/tenant_selection_screen.dart +++ b/lib/view/tenant/tenant_selection_screen.dart @@ -50,13 +50,12 @@ class _TenantSelectionScreenState extends State } Future _onTenantSelected(String tenantId) async { - await _controller.onTenantSelected(tenantId); + return _controller.onTenantSelected(tenantId); } @override Widget build(BuildContext context) { return Obx(() { - // Splash screen for auto-selection if (_controller.isAutoSelecting.value) { return const SplashScreen(); } @@ -91,6 +90,7 @@ class _TenantSelectionScreenState extends State controller: _controller, isLoading: _controller.isLoading.value, onTenantSelected: _onTenantSelected, + primaryColor: contentTheme.primary, ), ], ), @@ -109,7 +109,6 @@ class _TenantSelectionScreenState extends State } } -/// Animated Logo Widget class _AnimatedLogo extends StatelessWidget { final Animation animation; const _AnimatedLogo({required this.animation}); @@ -139,7 +138,6 @@ class _AnimatedLogo extends StatelessWidget { } } -/// Welcome Texts class _WelcomeTexts extends StatelessWidget { const _WelcomeTexts(); @@ -166,7 +164,6 @@ class _WelcomeTexts extends StatelessWidget { } } -/// Beta Badge class _BetaBadge extends StatelessWidget { const _BetaBadge(); @@ -188,16 +185,18 @@ class _BetaBadge extends StatelessWidget { } } -/// Tenant Card List -class TenantCardList extends StatelessWidget with UIMixin { +class TenantCardList extends StatelessWidget { final TenantSelectionController controller; final bool isLoading; final Function(String tenantId) onTenantSelected; + final Color primaryColor; - TenantCardList({ + const TenantCardList({ + super.key, required this.controller, required this.isLoading, required this.onTenantSelected, + required this.primaryColor, }); @override @@ -226,18 +225,16 @@ class TenantCardList extends StatelessWidget with UIMixin { (tenant) => _TenantCard( tenant: tenant, onTap: () => onTenantSelected(tenant.id), + primaryColor: primaryColor, ), ), const SizedBox(height: 16), TextButton.icon( - onPressed: () async { - await LocalStorage.logout(); - }, - icon: - Icon(Icons.arrow_back, size: 20, color: contentTheme.primary,), + onPressed: LocalStorage.logout, + icon: Icon(Icons.arrow_back, size: 20, color: primaryColor), label: MyText( 'Back to Login', - color: contentTheme.primary, + color: primaryColor, fontWeight: 600, fontSize: 14, ), @@ -248,11 +245,16 @@ class TenantCardList extends StatelessWidget with UIMixin { } } -/// Single Tenant Card -class _TenantCard extends StatelessWidget with UIMixin { +class _TenantCard extends StatelessWidget { final dynamic tenant; final VoidCallback onTap; - _TenantCard({required this.tenant, required this.onTap}); + final Color primaryColor; + + const _TenantCard({ + required this.tenant, + required this.onTap, + required this.primaryColor, + }); @override Widget build(BuildContext context) { @@ -297,7 +299,7 @@ class _TenantCard extends StatelessWidget with UIMixin { ], ), ), - Icon(Icons.arrow_forward_ios, size: 24, color: contentTheme.primary,), + Icon(Icons.arrow_forward_ios, size: 24, color: primaryColor), ], ), ), @@ -306,7 +308,6 @@ class _TenantCard extends StatelessWidget with UIMixin { } } -/// Tenant Logo (supports base64 and URL) class TenantLogo extends StatelessWidget { final String? logoImage; const TenantLogo({required this.logoImage}); @@ -324,14 +325,13 @@ class TenantLogo extends StatelessWidget { } catch (_) { return Center(child: Icon(Icons.business, color: Colors.grey.shade600)); } - } else { - return Image.network( - logoImage!, - fit: BoxFit.cover, - errorBuilder: (_, __, ___) => Center( - child: Icon(Icons.business, color: Colors.grey.shade600), - ), - ); } + + return Image.network( + logoImage!, + fit: BoxFit.cover, + errorBuilder: (_, __, ___) => + Center(child: Icon(Icons.business, color: Colors.grey.shade600)), + ); } }