import 'dart:developer'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.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/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/modules/traf_module/traf_request_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/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/loaders/no_data_found.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 '../../controllers/api_routes/urls.dart'; import 'asset_analytics_model.dart'; import 'traf_request_model.dart'; class TrafRequestDetailPage extends StatefulWidget { static const String id = "/details-TRAF"; final int trafId; TrafRequestDetailPage({Key? key, required this.trafId}) : super(key: key); @override _TrafRequestDetailPageState createState() { return _TrafRequestDetailPageState(); } } class _TrafRequestDetailPageState extends State { List _attachments = []; @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { Provider.of(context, listen: false).getTRAFById(widget.trafId); }); } @override void dispose() { super.dispose(); } @override Widget build(BuildContext context) { bool isEngineer = (Provider.of(context, listen: false).user?.type) == UsersTypes.engineer; return Scaffold( appBar: const DefaultAppBar(title: "Assessment of Need & Technology"), body: Selector( selector: (_, myModel) => myModel.isLoading, // Selects only the userName builder: (_, isLoading, __) { if (isLoading) return const ALoading(); TrafRequestProvider trafProvider = Provider.of(context, listen: false); if (trafProvider.trafRequestDataModel?.attachments != null) { _attachments = trafProvider.trafRequestDataModel!.attachments!.map((e) => File(URLs.getFileUrl(e.attachmentName ?? '') ?? '')).toList(); } return trafProvider.trafRequestDataModel == null ? const NoDataFound().center : Column( children: [ ListView( padding: const EdgeInsets.all(16), children: [ requesterInformation(trafProvider.trafRequestDataModel!), 12.height, requestInformation(trafProvider.trafRequestDataModel!), 12.height, assetInformation(trafProvider.trafRequestDataModel!), ], ).expanded, // // if (isEngineer) // FooterActionButton.footerContainer( // context: context, // child: AppFilledButton( // buttonColor: AppColor.primary10, // label: "Update", // onPressed: () { // Navigator.pushNamed(context, UpdateTrafRequestPage.id); // }), // ), ], ); }, )); } Widget requesterInformation(TrafRequestDataModel data) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ InfoHeader16Widget("Requester Information".addTranslation), InfoTextWidget(label: context.translation.employeeId, value: data.employeeIdForDisplay ?? '-'), InfoTextWidget(label: context.translation.name, value: data.employeeName ?? '-'), InfoTextWidget(label: context.translation.email, value: data.employeeEmail ?? '-'), InfoTextWidget(label: 'Position'.addTranslation, value: data.positionName ?? '-'), InfoTextWidget(label: context.translation.site, value: data.siteName ?? '-'), InfoTextWidget(label: context.translation.department, value: data.departmentName ?? '-'), InfoTextWidget(label: 'Number/Contact Information'.addTranslation, value: data.requesterContactNumber ?? '-'), InfoTextWidget(label: 'Extension'.addTranslation, value: data.requesterExtensionNumber ?? '-'), ], ).toShadowContainer(context); } Widget requestInformation(TrafRequestDataModel data) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ InfoHeader16Widget("Request Information"), InfoTextWidget(label: 'Request No', value: data.reqCode ?? '-'), InfoTextWidget(label: 'Request type', value: data.requestTypeName ?? '-'), if (data.requestTypeValue == 1) ...[ 4.height, 'Requested Quantity: ${data.qty ?? '-'}'.bodyText(context), //todo @waseem replace with infotext ], InfoTextWidget(label: 'How would the requested technology solve the current situation and/or serve the purpose?', value: data.purposeAnswer ?? '-'), InfoTextWidget(label: 'What is the current practice?', value: data.currentPractise ?? '-'), InfoTextWidget(label: 'Census Q1', value: data.censusQ1 ?? '-'), InfoTextWidget(label: 'Census Q2', value: data.censusQ2 ?? '-'), InfoTextWidget(label: 'Census Q3', value: data.censusQ3 ?? '-'), InfoTextWidget(label: 'Census Q4', value: data.censusQ4 ?? '-'), InfoTextWidget( label: 'List down names & contact information of users going to use the technology & specify if they are part-time or full time?', value: "\n${data.trafContacts?.map((item) => item.name).toList().toString() ?? '-'}"), InfoTextWidget(label: 'Is the requesting department going to use the technology solely or shared with other departments?', value: "\n${data.usingSolelyOrSharedName ?? '-'}"), if ((data.departments ?? []).isNotEmpty) ...[ InfoTextWidget(label: 'Technology used with other departments', value: data.departments?.map((item) => item.departmentName).toList().toString() ?? '-'), ], InfoTextWidget(label: 'Would other services be effected by acquiring the new equipment?', value: data.isEffectedName ?? '-'), if ((data.effectedServices ?? "").isNotEmpty) ...[ InfoTextWidget(label: 'List of services would it be effected', value: data.effectedServices ?? '-'), ], InfoTextWidget(label: 'Is the equipment going to be used with combination of other equipment to accomplish a specific procedure?', value: data.isCombinationName ?? '-'), if ((data.usedWithCombination ?? "").isNotEmpty) ...[ InfoTextWidget(label: 'Equipment going to be used with combination of other equipments', value: data.usedWithCombination ?? '-'), ], if (_attachments.isNotEmpty) ...[ 4.height, Text( // todo @waseem conver to header "Attachments".addTranslation, style: AppTextStyles.heading6.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), ), // 8.height, FilesList(images: _attachments.map((e) => URLs.getFileUrl(e.path ?? '') ?? '').toList() ?? []), ], ], ).toShadowContainer(context); } Widget assetInformation(TrafRequestDataModel data) { return Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ InfoHeader16Widget("Asset Information"), InfoTextWidget(label: context.translation.assetName, value: data.assetName ?? '-'), InfoTextWidget(label: context.translation.model, value: data.modelName ?? '-'), InfoTextWidget(label: context.translation.manufacture, value: data.manufacturerName ?? '-'), if (data.requestTypeId == 733) ...[ FutureBuilder( future: Provider.of(context, listen: false).getAssetAnalytics(data.assetId!), builder: (cxt, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const SizedBox.square(dimension: 24, child: CircularProgressIndicator()).center; } if (snapshot.hasData) { return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ InfoTextWidget(label: 'Last price', value: snapshot.data?.lastPrice?.toString() ?? '-'), InfoTextWidget(label: 'PO', value: snapshot.data?.lastPONo ?? '-'), InfoTextWidget(label: 'The quantity of the same asset', value: snapshot.data?.sameAssetQuantity?.toString() ?? '-'), InfoTextWidget(label: 'Existing asset under SLA', value: snapshot.data?.slaStatus ?? '-'), InfoTextWidget(label: 'Age of the asset', value: snapshot.data?.assetAgeDescription ?? '-'), InfoTextWidget(label: 'Total Maintenance Cost (TMC)', value: snapshot.data?.totalMaintenanceCost?.toString() ?? '-'), InfoTextWidget(label: 'Net Book Value (NBV)', value: snapshot.data?.netBookValue?.toString() ?? '-'), InfoTextWidget(label: 'Mean Time Between Failure (MTBF)', value: snapshot.data?.mtbfDescription ?? '-'), InfoTextWidget(label: 'Down Time (DT)', value: snapshot.data?.downTimeDescription ?? '-'), InfoTextWidget(label: 'Up Time (UT)', value: snapshot.data?.upTimeDescription ?? '-'), InfoTextWidget(label: 'Purchased Price', value: snapshot.data?.purchasedPrice?.toString() ?? '-'), ]); } return const SizedBox(); }) ], ], ).toShadowContainer(context); } }