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/views/pages/device_transfer/device_transfer_details.dart

316 lines
16 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/device_transfer_provider.dart';
import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/controllers/providers/api/user_provider.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/widget_extensions.dart';
import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/views/pages/device_transfer/update_device_transfer.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/loading_manager.dart';
import '../../../extensions/text_extensions.dart';
import '../../../models/enums/user_types.dart';
import '../../../new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/default_app_bar.dart';
import '../../widgets/requests/request_status.dart';
class DeviceTransferDetails extends StatefulWidget {
final DeviceTransfer model;
const DeviceTransferDetails({Key? key, required this.model}) : super(key: key);
@override
State<DeviceTransferDetails> createState() => _DeviceTransferDetailsState();
}
class _DeviceTransferDetailsState extends State<DeviceTransferDetails> {
UserProvider? _userProvider;
DeviceTransfer? _model;
final bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
List<File> _attachments = [];
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
_userProvider ??= Provider.of<UserProvider>(context);
return Scaffold(
appBar: DefaultAppBar(title: context.translation.deviceTransferDetails),
key: _scaffoldKey,
body: SafeArea(
child: FutureBuilder(
future: Provider.of<DeviceTransferProvider>(context).getRequestById(assetTransferId: widget.model.id?.toInt()),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const ALoading();
} else {
_model = snapshot.data as DeviceTransfer?;
_attachments = _model?.assetTransferAttachments?.map((e) => File(e.attachmentName ?? '')).toList() ?? [];
return Form(
key: _formKey,
child: LoadingManager(
isLoading: _isLoading,
isFailedLoading: false,
stateCode: 200,
onRefresh: () async {},
child: SingleChildScrollView(
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
"Transfer Details".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
_buildTextWidget('${context.translation.requestNo} : ${_model?.transferCode ?? ""}'),
_buildTextWidget('${context.translation.transferType} : ${_model?.transferType?.name ?? ""}'),
const Divider().defaultStyle(context),
Text(
"Asset Info".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
_buildTextWidget('${context.translation.assetName} : ${_model?.assetName?.cleanupWhitespace.capitalizeFirstOfEach ?? ""}'),
_buildTextWidget('${context.translation.assetNumber} : ${_model?.assetNumber ?? ""}'),
_buildTextWidget('${context.translation.model} : ${_model?.modelName ?? ""}'),
_buildTextWidget('${context.translation.sn} : ${_model?.assetSerialNo ?? ""}'),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Divider().defaultStyle(context),
Text(
"Contact Info".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
if (_model?.receiverEndUserName != null) _buildTextWidget('${context.translation.receiverName} : ${_model?.receiverEndUserName ?? ""}'),
infoText(label: context.translation.employeeId, value: _model?.employeeId),
infoText(label: context.translation.name, value: _model?.name),
// infoText(label: context.translation.telephone, value: _model?.te),
if ((_model?.comment ?? "").isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Comments".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
8.height,
_buildTextWidget(_model!.comment!),
],
if (_attachments.isNotEmpty) ...[
const Divider().defaultStyle(context),
Text(
"Attachments".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
8.height,
FilesList(images: _model?.assetTransferAttachments?.map((e) => URLs.getFileUrl(e.attachmentName ?? '') ?? '').toList() ?? []),
//attachmentWidget(),
]
],
),
],
).expanded,
Column(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
1.width,
Text(
_model?.createdOn != null ? _model!.createdOn!.toServiceRequestCardFormat : "",
textAlign: TextAlign.end,
style: AppTextStyles.tinyFont.copyWith(color: context.isDark ? AppColor.neutral10 : AppColor.neutral20),
),
],
),
],
).toShadowContainer(context),
8.height,
if (_model?.transferType?.value == 1) ...[
_internalRequestDetailsCard(
statusLabel: _model?.senderMachineStatusName != null
? StatusLabel(
label: _model!.senderMachineStatusName!,
id: _model!.senderMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model!.senderMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.senderMachineStatusName!),
)
: null,
)
] else ...[
// sender card
_buildCard(
isSender: true,
site: _model?.senderSiteName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
dept: _model?.senderDepartmentName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
building: _model?.senderBuildingName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
floor: _model?.senderFloorName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
comment: _model?.senderComment ?? "",
statusLabel: _model?.senderMachineStatusName != null
? StatusLabel(
label: _model!.senderMachineStatusName!,
id: _model!.senderMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model!.senderMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.senderMachineStatusName!),
)
: null,
),
8.height,
// receiver card
_buildCard(
isSender: false,
site: _model?.destSiteName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
dept: _model?.destDepartmentName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
building: _model?.destBuildingName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
floor: _model?.destFloorName?.cleanupWhitespace.capitalizeFirstOfEach ?? "",
comment: _model?.receiverComment ?? "",
statusLabel: _model?.receiverMachineStatusName != null
? StatusLabel(
label: _model!.receiverMachineStatusName ?? "",
id: _model!.receiverMachineStatusId!.toInt(),
textColor: AppColor.getRequestStatusTextColorByName(context, _model!.receiverMachineStatusName!),
backgroundColor: AppColor.getRequestStatusColorByName(context, _model!.receiverMachineStatusName!))
: null,
),
],
],
).paddingAll(16),
),
),
);
}
},
),
),
);
}
_buildTextWidget(String text) {
return text.bodyText(context);
}
_internalRequestDetailsCard({StatusLabel? statusLabel}) {
bool isCurrentEngineerEligibleForEdit = _model?.senderAssignedEmployeeId == _userProvider!.user?.userID;
bool isCurrentRequestEditAble = (!(_model?.senderMachineStatusValue==3));
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
statusLabel ?? Container(),
if (statusLabel != null) 8.height,
],
),
if ((_userProvider!.user?.type == UsersTypes.engineer))
if (isCurrentEngineerEligibleForEdit && isCurrentRequestEditAble)
"edit".toSvgAsset(height: 40, width: 40).onPress(() async {
bool isReload = (await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeviceTransfer(model: _model!, isSender: true)))) as bool;
if (isReload ?? false) {
setState(() {});
}
}),
],
),
context.translation.details.heading5(context),
infoText(label: context.translation.site, value: _model?.senderSiteName),
infoText(label: "Sender Building".addTranslation, value: _model?.senderBuildingName),
infoText(label: "Sender Floor".addTranslation, value: _model?.senderFloorName),
infoText(label: "Sender Department".addTranslation, value: _model?.senderDepartmentName),
infoText(label: "Receiver Building".addTranslation, value: _model?.destBuildingName),
infoText(label: "Receiver Floor".addTranslation, value: _model?.destFloorName),
infoText(label: "Receiver Department".addTranslation, value: _model?.destDepartmentName),
if (_model!.comment != null && _model!.comment!.isNotEmpty) ...[
8.height,
const Divider().defaultStyle(context),
Text(
"Technical Comments".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
_buildTextWidget(_model?.comment ?? ''),
]
],
).toShadowContainer(context);
}
_buildCard({required String site, String? building, String? dept, String? floor, required String comment, required bool isSender, StatusLabel? statusLabel}) {
bool isCurrentEngineerEligibleForEdit = isSender ? _model?.senderAssignedEmployeeId == _userProvider!.user?.userID : _model?.receiverAssignedEmployeeId == _userProvider!.user?.userID;
bool isCurrentRequestClosed =
isSender ? ((_model?.senderMachineStatusValue==3)) : ((_model?.receiverMachineStatusValue==3));
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
statusLabel ?? Container(),
if (statusLabel != null) 8.height,
isSender ? context.translation.senderDetails.heading5(context) : context.translation.receiverDetails.heading5(context),
],
),
if ((_userProvider!.user?.type == UsersTypes.engineer))
if (isCurrentEngineerEligibleForEdit && !isCurrentRequestClosed)
// if (isSender
// ? (!(_model?.senderMachineStatusName?.toLowerCase()?.contains("close") ?? false) && !(_model?.senderMachineStatusName?.toLowerCase()?.contains("complete") ?? false))
// : (!(_model?.receiverMachineStatusName?.toLowerCase()?.contains("close") ?? false) && !(_model?.receiverMachineStatusName?.toLowerCase()?.contains("complete") ?? false)))
//
"edit".toSvgAsset(height: 48, width: 48).onPress(() async {
bool isReload = (await Navigator.of(context).push(MaterialPageRoute(builder: (_) => UpdateDeviceTransfer(model: _model!, isSender: isSender)))) as bool;
if (isReload ?? false) {
setState(() {});
}
}),
],
),
infoText(label: context.translation.site, value: site),
infoText(label: context.translation.building, value: building),
infoText(label: context.translation.floor, value: floor),
infoText(label: context.translation.department, value: dept),
if (comment.isNotEmpty) ...[
8.height,
const Divider().defaultStyle(context),
Text(
"Technical Comments".addTranslation,
style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
),
_buildTextWidget(comment),
]
],
).toShadowContainer(context);
}
Widget infoText({
String? label,
String? value,
}) {
if (value == null || value.isEmpty) {
return const SizedBox();
} else {
return '$label: $value'.bodyText(context);
}
}
}