diff --git a/lib/new_views/pages/new_gas_refill_request_page.dart b/lib/new_views/pages/new_gas_refill_request_page.dart index b5f5d0fb..162afa91 100644 --- a/lib/new_views/pages/new_gas_refill_request_page.dart +++ b/lib/new_views/pages/new_gas_refill_request_page.dart @@ -14,16 +14,13 @@ import 'package:test_sa/models/new_models/gas_refill_model.dart'; import 'package:test_sa/models/new_models/site.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/cylinder_size_provider.dart'; import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart'; import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart'; import 'package:test_sa/providers/gas_request_providers/site_provider.dart'; import 'package:test_sa/providers/loading_list_notifier.dart'; - import '../../controllers/providers/api/gas_refill_provider.dart'; -import '../../controllers/validator/validator.dart'; import '../common_widgets/default_app_bar.dart'; class NewGasRefillRequestPage extends StatefulWidget { diff --git a/lib/views/pages/user/tasks_request/task_request_item_view.dart b/lib/views/pages/user/tasks_request/task_request_item_view.dart index bbe5a32d..b67d0626 100644 --- a/lib/views/pages/user/tasks_request/task_request_item_view.dart +++ b/lib/views/pages/user/tasks_request/task_request_item_view.dart @@ -5,9 +5,12 @@ 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/all_requests_and_count_model.dart'; +import 'package:test_sa/models/device/asset_transfer.dart'; import 'package:test_sa/models/new_models/dashboard_detail.dart'; +import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/views/pages/user/ppm/ppm_work_order/recurrent_wo/recurrent_work_order_view.dart'; +import 'package:test_sa/views/pages/user/tasks_request/task_request_view.dart'; import 'package:test_sa/views/widgets/requests/request_status.dart'; class TaskRequestItemView extends StatelessWidget { @@ -67,7 +70,7 @@ class TaskRequestItemView extends StatelessWidget { ), ], ).toShadowContainer(context, withShadow: showShadow).onPress(() async { - Navigator.of(context).push(MaterialPageRoute(builder: (_) => RecurrentWorkOrderView(taskId: requestDetails!.id))); + Navigator.of(context).push(MaterialPageRoute(builder: (_) => TaskRequestForm(model: AssetTransfer()))); }); } } diff --git a/lib/views/pages/user/tasks_request/task_request_view.dart b/lib/views/pages/user/tasks_request/task_request_view.dart index e69de29b..fe176acf 100644 --- a/lib/views/pages/user/tasks_request/task_request_view.dart +++ b/lib/views/pages/user/tasks_request/task_request_view.dart @@ -0,0 +1,422 @@ + +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/models/new_models/department.dart'; +import 'package:test_sa/extensions/text_extensions.dart'; +import 'package:test_sa/extensions/widget_extensions.dart'; +import 'package:test_sa/models/device/asset_transfer.dart'; +import 'package:test_sa/models/lookup.dart'; +import 'package:test_sa/models/new_models/work_order_detail_model.dart'; +import 'package:test_sa/models/timer_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/default_app_bar.dart'; +import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart'; +import 'package:test_sa/providers/loading_list_notifier.dart'; +import 'package:test_sa/providers/service_request_providers/last_situation_provider.dart'; +import 'package:test_sa/service_request_latest/service_request_detail_provider.dart'; +import 'package:test_sa/service_request_latest/utilities/service_request_utils.dart'; +import 'package:test_sa/service_request_latest/views/components/action_button/footer_action_button.dart'; +import 'package:test_sa/views/app_style/sizing.dart'; +import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; +import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; +import 'package:test_sa/views/widgets/status/report/service_report_assistant_employee_menu.dart'; +import 'package:test_sa/views/widgets/timer/app_timer.dart'; + +class TaskRequestForm extends StatefulWidget { + final AssetTransfer model; + + const TaskRequestForm({Key? key, required this.model}) : super(key: key); + + @override + State createState() => _TaskRequestFormState(); +} + +class _TaskRequestFormState extends State { + final bool _isLoading = false; + final TextEditingController _requestedQuantityController = TextEditingController(); + final AssetTransfer _formModel = AssetTransfer(); + final GlobalKey _formKey = GlobalKey(); + final GlobalKey _scaffoldKey = GlobalKey(); + List _files = []; + @override + void initState() { + _formModel.fromDetails(widget.model); + _files = widget.model.receiverAttachments?.map((e) => File(e.attachmentName!)).toList() ?? []; + super.initState(); + } + + @override + void dispose() { + _requestedQuantityController.dispose(); + super.dispose(); + } + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: DefaultAppBar(title: context.translation.taskRequest), + key: _scaffoldKey, + body: SafeArea( + child: LoadingManager( + isLoading: _isLoading, + isFailedLoading: false, + stateCode: 200, + onRefresh: () async {}, + child: Form( + key: _formKey, + child: Column( + children: [ + SingleChildScrollView( + padding: EdgeInsets.all(12 * AppStyle.getScaleFactor(context)), + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _timerWidget(context, 0, true), + 12.height, + ADatePicker( + label: context.translation.installationDate, + hideShadow: true, + backgroundColor: AppColor.neutral90, + date: DateTime.now(), + formatDateWithTime: false, + onDatePicker: (selectedDate) { + + // Handle the selected date and time here. + DateTime selectedDateTime = DateTime( + selectedDate.year, + selectedDate.month, + selectedDate.day, + ); + + }, + ), + 12.height, + //TODO replace with provided lookup.. + SingleItemDropDownMenu( + context: context, + height: 56.toScreenHeight, + title: context.translation.serialNo, + showShadow: false, + backgroundColor: AppColor.neutral90, + showAsBottomSheet: true, + initialValue: null, + onSelect: (status) { + if (status != null) { + setState(() {}); + } + }, + ), + 12.height, + //TODO replace with provided lookup.. + SingleItemDropDownMenu( + context: context, + title: context.translation.department, + initialValue: Department(), + enabled: true, + backgroundColor: AppColor.neutral90, + showShadow: false, + staticData: [], + showAsBottomSheet: true, + onSelect: (value) { + + }, + ), + 12.height, + AppTextFormField( + initialValue: _formModel.receiverComment ?? "", + labelText: context.translation.technicalComment, + textInputType: TextInputType.multiline, + backgroundColor: AppColor.neutral90, + showShadow: false, + alignLabelWithHint: true, + onSaved: (value) { + _formModel.receiverComment = value; + }, + ), + 20.height, + MultiFilesPicker( + label: context.translation.attachFiles, + files: _files, + buttonColor: AppColor.black10, + onlyImages: false, + buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), + ), + ], + ).toShadowContainer(context), + 16.height, + const AssistantEmployeeCard().toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16)), + ], + ), + ).expanded, + FooterActionButton.footerContainer( + child: AppFilledButton( + buttonColor: AppColor.green70, + label: context.translation.markAsCompleted, + onPressed: (){}, + // buttonColor: AppColor.primary10, + ), + ), + ], + ), + ), + ), + ), + ); + } + + void updateTimer({TimerModel? timer}) { + _formModel.tbsTimer = timer; + // if (timer?.startAt != null && timer?.endAt != null) { + // _formModel.timerModelList = _formModel.timerModelList ?? []; + // _formModel.timerModelList!.add(timer!); + // } + // notifyListeners(); + } + + Widget _timerWidget(BuildContext context, double totalWorkingHours, bool isTimerEnable) { + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + AppTimer( + label: context.translation.workingHours, + timer: _formModel.tbsTimer, + width: double.infinity, + enabled: isTimerEnable, + decoration: BoxDecoration( + color: AppColor.neutral90, + borderRadius: BorderRadius.circular(10), + ), + timerProgress: (isRunning) {}, + onChange: (timer) async { + updateTimer(timer: timer); + return true; + }, + ), + if (totalWorkingHours > 0.0) ...[ + 12.height, + Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + 'Total Working Time:'.bodyText2(context).custom(color: AppColor.neutral90), + 8.width, + Text( + ServiceRequestUtils.formatTimerDuration(totalWorkingHours.round()), + style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral50, fontWeight: FontWeight.w600), + ), + ], + ), + ], + ], + ); + } + +} + +class AssistantEmployeeCard extends StatefulWidget { + const AssistantEmployeeCard({super.key}); + + @override + State createState() => _AssistantEmployeeCardState(); +} + +class _AssistantEmployeeCardState extends State { + bool status = false; + final TextEditingController _workingHoursController = TextEditingController(text: ''); + bool isCurrentUserIsAssistantEmp = false; + bool isExpanded = false; + + @override + void initState() { + // TODO: implement initState + WidgetsBinding.instance.addPostFrameCallback((_) { + getInitialData(); + }); + super.initState(); + } + + Future getInitialData() async { + final user = Provider.of(context, listen: false).user!; + ServiceRequestDetailProvider requestDetailProvider = Provider.of(context, listen: false); + isCurrentUserIsAssistantEmp = (user.userID != requestDetailProvider.currentWorkOrder?.data?.assignedEmployee?.userId); + + // if (isCurrentUserIsAssistantEmp) { + // // _subWorkOrders.assistantEmployees = [widget.workOrder.assistantEmployees?.first?.copyWith(id: 0)]; + // } + } + + @override + void dispose() { + // TODO: implement dispose + _workingHoursController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, requestDetailProvider, child) { + return Column( + children: [ + SizedBox( + height: 56.toScreenHeight, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + context.translation.assistantEmployee.heading6(context).custom(color: AppColor.black10), + Icon(isExpanded ? Icons.keyboard_arrow_up_rounded : Icons.keyboard_arrow_down_rounded), + ], + ), + ).onPress(() { + setState(() { + isExpanded = !isExpanded; + }); + }), + isExpanded + ? Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ServiceReportAssistantEmployeeMenu( + title: context.translation.select, + backgroundColor: AppColor.neutral100, + + initialValue: null, + assetId: 23, + //TODO add check... + // enable: !isCurrentUserIsAssistantEmp, + onSelect: (employee) { + if (employee == null) { + requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployees = []; + } else { + requestDetailProvider.activityMaintenanceHelperModel?.assistantEmployees = [employee.copyWith(id: 0)]; + requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.user = AssignedEmployee(userId: employee.user?.id, userName: employee.user?.name); + } + }, + ), + 12.height, + Row( + mainAxisSize: MainAxisSize.min, + children: [ + ADatePicker( + label: context.translation.startTime, + hideShadow: true, + backgroundColor: AppColor.neutral100, + date: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate, + 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, + ); + requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate = selectedDateTime; + requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); + ServiceRequestUtils.calculateAndAssignWorkingHours( + startTime: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate, + endTime: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate, + workingHoursController: _workingHoursController, + updateModel: (hours) { + requestDetailProvider.activityMaintenanceHelperModel!.modelAssistantEmployees!.workingHours = hours; + }); + } + }); + }, + ).expanded, + 8.width, + ADatePicker( + label: context.translation.endTime, + hideShadow: true, + backgroundColor: AppColor.neutral100, + date: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.endDate, + 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, + ); + //TODO need to replace with model attributes.. + // if (requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate != null && + // selectedDateTime.isBefore(requestDetailProvider.activityMaintenanceHelperModel!.modelAssistantEmployees!.startDate!)) { + // "End Date time must be greater then start date".showToast; + // return; + // } + // requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.endDate = selectedDateTime; + // requestDetailProvider.updateActivityMaintenanceHelperModel(requestDetailProvider.activityMaintenanceHelperModel); + // ServiceRequestUtils.calculateAndAssignWorkingHours( + // startTime: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.startDate, + // endTime: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.endDate, + // workingHoursController: _workingHoursController, + // updateModel: (hours) { + // requestDetailProvider.activityMaintenanceHelperModel!.modelAssistantEmployees!.workingHours = hours; + // }); + } + }); + }, + ).expanded, + ], + ), + 12.height, + AppTextFormField( + labelText: context.translation.workingHours, + backgroundColor: AppColor.neutral80, + controller: _workingHoursController, + suffixIcon: "clock".toSvgAsset(width: 20, color: context.isDark ? AppColor.neutral10 : null).paddingOnly(end: 16), + initialValue: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.workingHours != null + ? requestDetailProvider.activityMaintenanceHelperModel!.modelAssistantEmployees!.workingHours.toString() + : '', + textAlign: TextAlign.center, + labelStyle: AppTextStyles.textFieldLabelStyle, + enable: false, + showShadow: false, + style: Theme.of(context).textTheme.titleMedium, + ), + 12.height, + AppTextFormField( + initialValue: requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.technicalComment, + labelText: context.translation.technicalComment, + backgroundColor: AppColor.neutral100, + showShadow: false, + labelStyle: AppTextStyles.textFieldLabelStyle, + alignLabelWithHint: true, + textInputType: TextInputType.multiline, + onChange: (value) { + requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.technicalComment = value; + }, + onSaved: (value) { + requestDetailProvider.activityMaintenanceHelperModel?.modelAssistantEmployees?.technicalComment = value; + }, + ), + 16.height, + ], + ) + : const SizedBox(), + ], + ); + }); + } + +}