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.
cloudsolutions-atoms/lib/modules/incident_module/incident_detail_page.dart

183 lines
9.3 KiB
Dart

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/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/new_views/app_style/app_color.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/item_views/info_date_widget.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/item_views/info_text_widget.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: FutureBuilder<IncidentDataModel?>(
future: Provider.of<IncidentProvider>(context, listen: false).getIncidentById(incidentId),
builder: (BuildContext context, AsyncSnapshot<IncidentDataModel?> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).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,
InfoDateWidget(snapshot.data!.createdDate?.toString() ?? ""),
],
),
12.height,
...requesterDetails(context, snapshot.data!),
const Divider().defaultStyle(context),
...requestDetails(context, snapshot.data!),
if (snapshot.data!.ovrTicketNumber?.isNotEmpty ?? false) ovrInformation(context, snapshot.data!.ovrTicketNumber!),
const Divider().defaultStyle(context),
...assetDetails(context, snapshot.data!),
const Divider().defaultStyle(context),
...personInvolvedDetails(context, snapshot.data!),
if (allAttachments.isNotEmpty) ...[
const Divider().defaultStyle(context),
InfoHeader16Widget("Attachments".addTranslation),
FilesList(images: allAttachments.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
],
],
).toShadowContainer(context, padding: 16),
],
);
}));
}
List<Widget> requestDetails(BuildContext context, IncidentDataModel incidentData) {
return [
InfoHeader16Widget("Request Details"),
InfoTextWidget(label: 'Incident No', value: incidentData.reqCode ?? "-"),
InfoTextWidget(label: 'Incident Type', value: incidentData.incidentClassificationName ?? "-"),
InfoTextWidget(label: 'Incident Title', value: incidentData.incidentTitle ?? "-"),
InfoTextWidget(label: 'Incident Description', value: incidentData.incidentDescription ?? "-"),
InfoTextWidget(label: 'Exist OVR', value: incidentData.existingOvrTicketName ?? "-"),
InfoTextWidget(label: 'Site', value: incidentData.siteName ?? "-"),
InfoTextWidget(label: 'Building', value: incidentData.buildingName ?? "-"),
InfoTextWidget(label: 'Floor', value: incidentData.floorName ?? "-"),
InfoTextWidget(label: 'Department', value: incidentData.departmentName ?? "-"),
InfoTextWidget(label: 'Occurrence Date', value: incidentData.occurrenceDate?.toServiceRequestDetailsFormat ?? "-"),
InfoTextWidget(label: 'Root Cause', value: incidentData.rootCauseName ?? "-"),
if (incidentData.rootCauseValue == 5) InfoTextWidget(label: 'Root reason', value: incidentData.otherRootCause ?? "-"),
InfoTextWidget(label: 'Comments', value: incidentData.comments ?? "-"),
];
}
Widget ovrInformation(BuildContext context, String ovrNumber) {
return FutureBuilder<Map<String, dynamic>?>(
future: Provider.of<IncidentProvider>(context, listen: false).getOvrTicketDetails(ovrNumber),
builder: (BuildContext context, AsyncSnapshot<Map<String, dynamic>?> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) return CircularProgressIndicator(color: AppColor.loadingColor(context)).center;
if (snapshot.data == null) return const NoDataFound().center;
Map<String, dynamic>? data = snapshot.data;
if (data == null) return const SizedBox();
List<String> keysList = data.keys.toList();
return Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Divider().defaultStyle(context),
InfoHeader16Widget("OVR Ticket Information"),
InfoTextWidget(label: 'OVR Ticket Number', value: ovrNumber),
for (int i = 0; i < keysList.length; i++) InfoTextWidget(label: keysList[i], value: data[keysList[i]]?.toString() ?? "-"),
],
);
});
}
List<Widget> personInvolvedDetails(BuildContext context, IncidentDataModel incidentData) {
return [
InfoHeader16Widget("Person Involved Information"),
InfoTextWidget(label: 'Person Involved', value: incidentData.personInvolvedName ?? "-"),
InfoTextWidget(label: 'Gender', value: incidentData.genderName ?? "-"),
InfoTextWidget(label: 'Person Involved ID', value: incidentData.personInvolvedEmployeeId?.toString() ?? "-"),
InfoTextWidget(label: 'Person Involved Name', value: incidentData.personInvolvedEmployeeName ?? "-"),
];
}
List<Widget> assetDetails(BuildContext context, IncidentDataModel loanData) {
return [
InfoHeader16Widget("Asset Information"),
InfoTextWidget(label: context.translation.assetName, value: loanData.assetOrigin ?? "-"),
InfoTextWidget(label: context.translation.assetNo, value: loanData.assetNumber ?? "-"),
// '${context.translation.serialNumber}: ${loanData.assetSerialNumber ?? "-"}'.bodyText(context),
InfoTextWidget(label: context.translation.manufacture, value: loanData.manufacturer ?? "-"),
InfoTextWidget(label: context.translation.model, value: loanData.model ?? "-"),
];
}
List<Widget> requesterDetails(BuildContext context, IncidentDataModel incidentData) {
return [
InfoHeader16Widget("Requester Information"),
InfoTextWidget(label: 'Name', value: incidentData.requesterEmployeeName ?? "-"),
InfoTextWidget(label: 'Email', value: incidentData.requesterEmployeeEmail ?? "-"),
InfoTextWidget(label: 'Contact', value: incidentData.requesterContactNo ?? "-"),
InfoTextWidget(label: 'Extension', value: incidentData.requesterExtensionNo ?? "-"),
InfoTextWidget(label: 'Site', value: incidentData.requestorSiteName ?? "-"),
InfoTextWidget(label: 'Department', value: incidentData.requestorFlowDepartmentName ?? "-"),
];
}
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),
],
);
}
}