import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/room_model.dart'; import 'package:test_sa/models/new_models/task_request/task_request_model.dart'; import 'package:test_sa/models/new_models/task_request/task_type_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.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/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; import 'package:test_sa/providers/task_request_provider/task_job_provider.dart'; import 'package:test_sa/providers/task_request_provider/task_request_provider.dart'; import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/views/pages/user/requests/pending_requests_screen.dart'; import 'package:test_sa/views/widgets/bottom_sheets/pending_request_bottom_sheet.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/equipment/asset_picker.dart'; import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import '../../../../../../new_views/common_widgets/default_app_bar.dart'; import '../../../../models/new_models/department.dart'; import '../../../../models/new_models/site.dart'; class CreateTaskView extends StatefulWidget { static const String id = "/create-task"; const CreateTaskView({Key? key}) : super(key: key); @override _CreateTaskViewState createState() => _CreateTaskViewState(); } class _CreateTaskViewState extends State with TickerProviderStateMixin { final List _deviceImages = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); //TODO need to replace with model attribute Asset? _device; PendingAssetServiceRequest? pendingAssetServiceRequest; TaskType? selectedType; AddTaskModel? _addTaskModel = AddTaskModel(id: 0); TextEditingController commentController = TextEditingController(); @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, appBar: DefaultAppBar(title: context.translation.createTaskRequest), body: SafeArea( child: Form( key: _formKey, child: Column( children: [ SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, title: context.translation.taskType, showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, initialValue: selectedType, onSelect: (type) { if (type != null) { selectedType = type; _addTaskModel = AddTaskModel(id: 0); commentController.clear(); _addTaskModel?.taskTypeId = selectedType?.id; setState(() {}); } }, ), 12.height, taskTypeWidget(selectedType?.relatedTo?.value), if (selectedType != null && selectedType!.isRecallAndAlert!) ...[ recallAndAlert(), ], AppTextFormField( initialValue: _addTaskModel?.callComment, controller: commentController, labelText: context.translation.callComments, backgroundColor: AppColor.neutral100, showShadow: false, labelStyle: AppTextStyles.textFieldLabelStyle, alignLabelWithHint: true, textInputType: TextInputType.multiline, onChange: (value) { _addTaskModel?.callComment = value; }, ), 23.height, MultiFilesPicker( label: context.translation.attachImage, files: _deviceImages, buttonColor: AppColor.black10, onlyImages: true, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), ), ], ).toShadowContainer(context).paddingAll(16), ).expanded, FooterActionButton.footerContainer( child: AppFilledButton( buttonColor: AppColor.primary10, label: context.translation.submitRequest, onPressed: checkPendingRequest ? null : _submit, // buttonColor: AppColor.primary10, ), ), ], ), ), ), ); } Widget taskTypeWidget(int? type) { switch (type) { case 1: return relatedToAsset(); case 2: return relatedToLocation(); default: return const SizedBox(); } } Widget relatedToLocation() { return Column( children: [ 8.height, SingleItemDropDownMenu( context: context, title: context.translation.destinationSite, initialValue: _addTaskModel?.site, showAsBottomSheet: true, backgroundColor: AppColor.neutral100, showShadow: false, onSelect: (value) { _addTaskModel?.site = value; _addTaskModel?.building = null; _addTaskModel?.floor = null; _addTaskModel?.department = null; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.building, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, showShadow: false, initialValue: _addTaskModel?.building, enabled: _addTaskModel?.site?.buildings?.isNotEmpty ?? false, staticData: _addTaskModel?.site?.buildings ?? [], onSelect: (value) { _addTaskModel?.building = value; _addTaskModel?.floor = null; _addTaskModel?.department = null; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, showAsBottomSheet: true, backgroundColor: AppColor.neutral100, showShadow: false, title: context.translation.floor, initialValue: _addTaskModel?.floor, enabled: _addTaskModel?.building?.floors?.isNotEmpty ?? false, staticData: _addTaskModel?.building?.floors ?? [], onSelect: (value) { _addTaskModel?.floor = value; _addTaskModel?.department = null; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.department, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, showShadow: false, initialValue: _addTaskModel?.department, enabled: _addTaskModel?.floor?.departments?.isNotEmpty ?? false, staticData: _addTaskModel?.floor?.departments ?? [], onSelect: (value) { _addTaskModel?.department = value; _addTaskModel?.room = null; setState(() {}); }, ), 8.height, SingleItemDropDownMenu( context: context, title: context.translation.room, backgroundColor: AppColor.neutral100, showShadow: false, showAsBottomSheet: true, initialValue: _addTaskModel?.room, enabled: _addTaskModel?.department?.rooms?.isNotEmpty ?? false, staticData: _addTaskModel?.department?.rooms ?? [], onSelect: (value) { _addTaskModel?.room = value; setState(() {}); }, ), 16.height, ], ); } Widget recallAndAlert() { return Column( children: [ SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, // title: context.translation.typeofAlert, title: 'Type Of Alert', showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, initialValue: _addTaskModel?.typeOfAlert, onSelect: (status) { if (status != null) { _addTaskModel?.typeOfAlert = status; setState(() {}); } }, ), 8.height, SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, // title: context.translation.typeofAlert, title: 'Risk Level', showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, initialValue: _addTaskModel?.riskLevel, onSelect: (status) { if (status != null) { _addTaskModel?.riskLevel = status; setState(() {}); } }, ), 8.height, SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, // title: context.translation.typeofAlert, title: 'Resources', showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, initialValue: _addTaskModel?.resource, onSelect: (status) { if (status != null) { _addTaskModel?.resource = status; setState(() {}); } }, ), 8.height, SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, // title: context.translation.typeofAlert, title: 'Task Job Action', showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, initialValue: _addTaskModel?.actionNeeded, onSelect: (status) { if (status != null) { _addTaskModel?.actionNeeded = status; setState(() {}); } }, ), 8.height, SingleItemDropDownMenu( context: context, height: 56.toScreenHeight, // title: context.translation.typeofAlert, title: 'Evaluator User', showShadow: false, backgroundColor: AppColor.neutral100, showAsBottomSheet: true, initialValue: _addTaskModel?.taskEvaluatorUser, onSelect: (status) { if (status != null) { _addTaskModel?.taskEvaluatorUser = status; setState(() {}); } }, ), 8.height, ADatePicker( label: "Estimated delivery date", // label: context.translation.returnToService, hideShadow: true, backgroundColor: AppColor.neutral100, date: DateTime.tryParse(_addTaskModel?.estimationDeliveryDate ?? ""), formatDateWithTime: true, onDatePicker: (selectedDate) { showTimePicker( context: context, initialTime: TimeOfDay.now(), ).then((selectedTime) { // Handle the selected date and time here. if (selectedTime != null) { DateTime? selectedDateTime = DateTime( selectedDate.year, selectedDate.month, selectedDate.day, selectedTime.hour, selectedTime.minute, ); setState(() { _addTaskModel?.estimationDeliveryDate = selectedDateTime.toIso8601String(); }); } }); }, ), 8.height, AppTextFormField( // labelText: context.translation.travelingHours, labelText: 'Reason Of FSCA', backgroundColor: AppColor.neutral100, showShadow: false, labelStyle: AppTextStyles.textFieldLabelStyle, initialValue: _addTaskModel?.reasonOfFSCA ?? '', textInputType: TextInputType.text, onChange: (value) { _addTaskModel?.reasonOfFSCA = value; }, ), 8.height, AppTextFormField( // labelText: context.translation.travelingHours, labelText: 'Corrective Action Description', backgroundColor: AppColor.neutral100, showShadow: false, labelStyle: AppTextStyles.textFieldLabelStyle, initialValue: _addTaskModel?.correctiveActionDescription ?? '', textInputType: TextInputType.text, onChange: (value) { _addTaskModel?.correctiveActionDescription = value; }, ), 8.height, AppTextFormField( // labelText: context.translation.travelingHours, labelText: 'Alert No', backgroundColor: AppColor.neutral100, showShadow: false, labelStyle: AppTextStyles.textFieldLabelStyle, initialValue: _addTaskModel?.alertNo ?? '', textInputType: TextInputType.text, onChange: (value) { _addTaskModel?.alertNo = value; }, ), 16.height ], ); } Widget relatedToAsset() { return Column( children: [ scanAssetButton(), if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) ...[ 8.height, Row( children: [ const Icon(Icons.warning, color: Color(0xffEE404C), size: 14), 8.width, Text( "This asset already have ${pendingAssetServiceRequest!.details!.length} request pending", style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w500, color: Color(0xff7D859A), decoration: TextDecoration.underline), ).expanded, ], ).onPress(() { showPendingRequests(); }), ], 16.height, ], ); } Widget scanAssetButton() { return AssetPicker( deviceList: _deviceList, showLoading: checkPendingRequest, borderColor: AppColor.black20, buttonColor: AppColor.white936, multiSelection: true, onAssetRemove: (itemId) { _deviceList.removeWhere((asset) => asset.id?.toInt() == itemId); setState(() {}); }, onMultiAssetPick: (assetList) { _deviceList.addAll(assetList); final seenIds = {}; _deviceList = _deviceList.where((item) => seenIds.add(item.id)).toList(); setState(() {}); }, ); } bool checkPendingRequest = false; Future checkAssetForPendingServiceRequest(int assetId) async { checkPendingRequest = true; setState(() {}); pendingAssetServiceRequest = await Provider.of(context, listen: false).checkAssetPendingRequest(assetId); await Future.delayed(const Duration(milliseconds: 250)); checkPendingRequest = false; setState(() {}); } Future _submit() async { if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); _addTaskModel?.attachments = []; for (var item in _deviceImages) { _addTaskModel?.attachments?.add(TaskJobAttachment(id: 0, name: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); } TaskRequestProvider taskRequestProvider = Provider.of(context,listen: false); taskRequestProvider.addTask(context: context, task: _addTaskModel!); } } }