You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
9.5 KiB
Dart
179 lines
9.5 KiB
Dart
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<IncidentDataModel?>(
|
|
future: Provider.of<IncidentProvider>(context, listen: false).getIncidentById(97),
|
|
builder: (BuildContext context, AsyncSnapshot<IncidentDataModel?> snapshot) {
|
|
if (snapshot.connectionState == ConnectionState.waiting) return const CircularProgressIndicator(color: AppColor.primary10).center;
|
|
if (snapshot.data == null) return const NoDataFound().center;
|
|
|
|
List<IncidentAttachments> 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<Widget> 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<Widget> 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<Widget> 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<Widget> 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),
|
|
],
|
|
);
|
|
}
|
|
}
|