import 'dart:developer'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/incident_module/incident_attachment_model.dart'; import 'package:test_sa/modules/incident_module/incident_data_model.dart'; import 'package:test_sa/modules/incident_module/incident_provider.dart'; import 'package:test_sa/modules/internal_audit_module/models/internal_audit_attachment_model.dart'; import 'package:test_sa/modules/internal_audit_module/models/system_internal_audit_data_model.dart'; import 'package:test_sa/modules/internal_audit_module/pages/equipment_internal_audit/update_equipment_internal_audit_page.dart'; import 'package:test_sa/modules/internal_audit_module/pages/system_internal_audit/update_system_internal_audit_page.dart'; import 'package:test_sa/modules/internal_audit_module/provider/internal_audit_provider.dart'; import 'package:test_sa/modules/loan_module/models/loan_attachment_model.dart'; import 'package:test_sa/modules/loan_module/models/loan_request_model.dart'; import 'package:test_sa/modules/loan_module/provider/loan_provider.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/views/widgets/images/files_list.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; class IncidentDetailPage extends StatelessWidget { static const String id = "/incident-detail-page"; final int incidentId; IncidentDetailPage({Key? key, required this.incidentId}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: const DefaultAppBar(title: "Request Details"), body: SafeArea( child: FutureBuilder( future: Provider.of(context, listen: false).getIncidentById(97), builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center; if (snapshot.data == null) return const NoDataFound().center; List allAttachments = snapshot.data!.incidentAttachments!; return ListView( padding: const EdgeInsets.all(16), children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ StatusLabel( label: snapshot.data!.incidentStatusName!, textColor: AppColor.getRequestStatusTextColorByName(context, snapshot.data!.incidentStatusName!), backgroundColor: AppColor.getRequestStatusColorByName(context, snapshot.data!.incidentStatusName!), ), 1.width.expanded, Text( snapshot.data!.createdDate?.toServiceRequestCardFormat ?? "-", textAlign: TextAlign.end, style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral50), ), ], ), 12.height, ...requesterDetails(context, snapshot.data!), const Divider().defaultStyle(context), ...requestDetails(context, snapshot.data!), const Divider().defaultStyle(context), ...assetDetails(context, snapshot.data!), const Divider().defaultStyle(context), ...personInvolvedDetails(context, snapshot.data!), if (allAttachments.isNotEmpty) ...[ const Divider().defaultStyle(context), Text( "Attachments".addTranslation, style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []), ], ], ).toShadowContainer(context, padding: 12), ], ); }), )); } List requestDetails(BuildContext context, IncidentDataModel incidentData) { return [ Text("Request Details", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), 'Incident No: ${incidentData.reqCode ?? "-"}'.bodyText(context), 'Incident Type: ${incidentData.incidentClassificationName ?? "-"}'.bodyText(context), 'Incident Title: ${incidentData.incidentTitle ?? "-"}'.bodyText(context), 'Incident Description: ${incidentData.incidentDescription ?? "-"}'.bodyText(context), 'Exist OVR: ${incidentData.existingOvrTicketName ?? "-"}'.bodyText(context), 'Site: ${incidentData.siteName ?? "-"}'.bodyText(context), 'Building: ${incidentData.buildingName ?? "-"}'.bodyText(context), 'Floor: ${incidentData.floorName ?? "-"}'.bodyText(context), 'Department: ${incidentData.departmentName ?? "-"}'.bodyText(context), 'Occurrence Date: ${incidentData.occurrenceDate?.toServiceRequestDetailsFormat ?? "-"}'.bodyText(context), 'Root Cause: ${incidentData.rootCauseName ?? "-"}'.bodyText(context), if (incidentData.rootCauseValue == 5) 'Root reason: ${incidentData.otherRootCause ?? "-"}'.bodyText(context), 'Comments: ${incidentData.comments ?? "-"}'.bodyText(context), ]; } List personInvolvedDetails(BuildContext context, IncidentDataModel incidentData) { return [ Text("Person Involved Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), 'Person Involved: ${incidentData.personInvolvedName ?? "-"}'.bodyText(context), 'Gender: ${incidentData.genderName ?? "-"}'.bodyText(context), 'Person Involved ID: ${incidentData.personInvolvedEmployeeId ?? "-"}'.bodyText(context), 'Person Involved Name: ${incidentData.personInvolvedEmployeeName ?? "-"}'.bodyText(context), ]; } List assetDetails(BuildContext context, IncidentDataModel loanData) { return [ Text("Asset Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), '${context.translation.assetName}: ${loanData.assetOrigin ?? "-"}'.bodyText(context), '${context.translation.assetNo}: ${loanData.assetNumber ?? "-"}'.bodyText(context), // '${context.translation.serialNumber}: ${loanData.assetSerialNumber ?? "-"}'.bodyText(context), '${context.translation.manufacture}: ${loanData.manufacturer ?? "-"}'.bodyText(context), '${context.translation.model}: ${loanData.model ?? "-"}'.bodyText(context), ]; } List requesterDetails(BuildContext context, IncidentDataModel incidentData) { return [ Text("Requester Information", style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50)), 'Name: ${incidentData.requesterEmployeeName ?? "-"}'.bodyText(context), 'Email: ${incidentData.requesterEmployeeEmail ?? "-"}'.bodyText(context), 'Contact: ${incidentData.requesterContactNo ?? "-"}'.bodyText(context), 'Extension: ${incidentData.requesterExtensionNo ?? "-"}'.bodyText(context), 'Site: ${incidentData.requestorSiteName ?? "-"}'.bodyText(context), 'Department: ${incidentData.requestorFlowDepartmentName ?? "-"}'.bodyText(context), ]; } Widget labelValueText(BuildContext context, String label, String? value) { if (value == null || value.isEmpty) return const SizedBox.shrink(); return Padding( padding: const EdgeInsets.only(bottom: 4), child: Text( '$label: $value', style: AppTextStyles.bodyText.copyWith( color: context.isDark ? AppColor.neutral30 : AppColor.neutral120, ), ), ); } Widget checklistWidget(BuildContext context, {required String value}) { return Row( mainAxisSize: MainAxisSize.min, children: [ Checkbox( value: true, activeColor: AppColor.neutral120, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, visualDensity: const VisualDensity(horizontal: -4, vertical: -3), onChanged: (value) {}, ), value.bodyText(context), ], ); } }