From 14e55c63e705e48c4936fe23d31fa96ea532f785 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 Date: Sun, 20 Apr 2025 17:07:26 +0300 Subject: [PATCH] create task flow completed --- lib/controllers/api_routes/urls.dart | 10 + lib/main.dart | 11 + .../task_request/task_request_model.dart | 563 ++++++++++++++++++ .../task_request/task_type_model.dart | 77 +++ .../common_widgets/app_bottom_nav_bar.dart | 9 +- .../create_request-type_bottomsheet.dart | 101 ++-- lib/new_views/pages/land_page/land_page.dart | 9 +- .../task_job_provider.dart | 169 ++++++ .../task_request_provider.dart | 65 ++ .../user/tasks_request/create_task_view.dart | 482 +++++++++++---- 10 files changed, 1335 insertions(+), 161 deletions(-) create mode 100644 lib/models/new_models/task_request/task_request_model.dart create mode 100644 lib/models/new_models/task_request/task_type_model.dart create mode 100644 lib/providers/task_request_provider/task_job_provider.dart create mode 100644 lib/providers/task_request_provider/task_request_provider.dart diff --git a/lib/controllers/api_routes/urls.dart b/lib/controllers/api_routes/urls.dart index a31b4426..059e36ba 100644 --- a/lib/controllers/api_routes/urls.dart +++ b/lib/controllers/api_routes/urls.dart @@ -88,6 +88,15 @@ class URLs { static get getRecurrentPlanByIdUrl=> '$_baseUrl/PlanRecurrentTasks/GetPlanRecurrentTaskById'; static get updateRecurrentPlanUrl=> '$_baseUrl/PlanRecurrentTasks/UpdateTaskByEngineer'; + //Task request apis ... + static get getTaskTypeByUserUrl=> '$_baseUrl/TaskTypes/GetTaskTypesByUser'; + static get addTaskUrl=> '$_baseUrl/TaskJobs/AddTaskJob'; + static get taskJobTypeOfAlert => "$_baseUrl/Lookups/GetLookup?lookupEnum=1260"; + static get taskJobRiskLevel => "$_baseUrl/Lookups/GetLookup?lookupEnum=1261"; + static get taskJobResource => "$_baseUrl/Lookups/GetLookup?lookupEnum=1262"; + static get taskJobActionNeeded => "$_baseUrl/Lookups/GetLookup?lookupEnum=1263"; + + //service request..... static get getServiceRequests => "$_baseUrl/CallRequest/GetCallRequests"; // get @@ -184,6 +193,7 @@ class URLs { // employee static get getEmployees => "$_baseUrl/Lookups/GetLookup?lookupEnum=33"; // get static get getEngineers => "$_baseUrl/Account/GetUserByRoleValue?value=R-6"; // get + static get getTaskEvaluatorUser => "$_baseUrl/Account/GetUserByRoleValue?value=R-2"; // get static get getNurses => "$_baseUrl/Account/GetUserByRoleValue?value=R-7"; // get static get getNursesBySiteId => "$_baseUrl/Account/GetUserByRoleValueSiteAndAssetGroupBySiteId?value=R-7"; // get diff --git a/lib/main.dart b/lib/main.dart index c2082ad1..a340691b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -56,6 +56,8 @@ import 'package:test_sa/providers/service_request_providers/last_situation_provi import 'package:test_sa/providers/service_request_providers/priority_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/providers/service_request_providers/type_of_request_provider.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/providers/work_order/activity_status_provider.dart'; import 'package:test_sa/providers/work_order/fault_description_provider.dart'; import 'package:test_sa/providers/work_order/need_visit_reminder_time_provider.dart'; @@ -243,6 +245,15 @@ class MyApp extends StatelessWidget { ChangeNotifierProvider(create: (_) => ActivityStatusProvider()), ChangeNotifierProvider(create: (_) => NeedVisitReminderTimeProvider()), + //task request providers. + ChangeNotifierProvider(create: (_) => TaskRequestProvider()), + ChangeNotifierProvider(create: (_) => TaskTypeProvider()), + ChangeNotifierProvider(create: (_) => TaskJobTypeOfAlertProvider()), + ChangeNotifierProvider(create: (_) => TaskJobRiskLevelProvider()), + ChangeNotifierProvider(create: (_) => TaskJobResourceProvider()), + ChangeNotifierProvider(create: (_) => TaskJobActionNeededProvider()), + ChangeNotifierProvider(create: (_) => TaskEvaluatorUserProvider()), + ///todo deleted //ChangeNotifierProvider(create: (_) => AssetTypesProvider()), ChangeNotifierProvider(create: (_) => ServiceTypeProvider()), diff --git a/lib/models/new_models/task_request/task_request_model.dart b/lib/models/new_models/task_request/task_request_model.dart new file mode 100644 index 00000000..7493690b --- /dev/null +++ b/lib/models/new_models/task_request/task_request_model.dart @@ -0,0 +1,563 @@ +import 'package:test_sa/models/base.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/site.dart'; +import 'package:test_sa/models/new_models/department.dart'; +import 'package:test_sa/models/new_models/room_model.dart'; + +class TaskRequestModel { + final Data? data; + final String? message; + final String? title; + final String? innerMessage; + final int? responseCode; + final bool? isSuccess; + + TaskRequestModel({ + this.data, + this.message, + this.title, + this.innerMessage, + this.responseCode, + this.isSuccess, + }); + + factory TaskRequestModel.fromJson(Map json) => TaskRequestModel( + data: json['data'] != null ? Data.fromJson(json['data']) : null, + message: json['message'], + title: json['title'], + innerMessage: json['innerMessage'], + responseCode: json['responseCode'], + isSuccess: json['isSuccess'], + ); + + Map toJson() => { + 'data': data?.toJson(), + 'message': message, + 'title': title, + 'innerMessage': innerMessage, + 'responseCode': responseCode, + 'isSuccess': isSuccess, + }; +} + +class Data { + final int? id; + final String? taskJobNo; + final User? userCreated; + final List? taskJobContactPersons; + final TaskTypeModel? taskType; + final TaskJobStatus? taskJobStatus; + final dynamic asset; + final dynamic site; + final dynamic building; + final dynamic floor; + final dynamic department; + final dynamic room; + final String? callComment; + final List? taskJobAttachments; + final User? assignedEngineer; + final List? taskJobAssistantEmployees; + final List? taskJobActivityEngineerTimers; + final List? taskJobHistories; + final BuildingData? installationBuilding; + final dynamic installationFloor; + final dynamic installationDepartment; + final String? serialNo; + final String? installationDate; + final dynamic completedAction; + final dynamic impactStatus; + final bool? isUserAcknowledge; + final dynamic typeOfAlert; + final dynamic riskLevel; + final dynamic resource; + final dynamic actionNeeded; + final dynamic alertNo; + final String? estimationDeliveryDate; + final dynamic reasonOfFSCA; + final dynamic correctiveActionDescription; + final User? evaluatorUser; + + Data({ + this.id, + this.taskJobNo, + this.userCreated, + this.taskJobContactPersons, + this.taskType, + this.taskJobStatus, + this.asset, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.callComment, + this.taskJobAttachments, + this.assignedEngineer, + this.taskJobAssistantEmployees, + this.taskJobActivityEngineerTimers, + this.taskJobHistories, + this.installationBuilding, + this.installationFloor, + this.installationDepartment, + this.serialNo, + this.installationDate, + this.completedAction, + this.impactStatus, + this.isUserAcknowledge, + this.typeOfAlert, + this.riskLevel, + this.resource, + this.actionNeeded, + this.alertNo, + this.estimationDeliveryDate, + this.reasonOfFSCA, + this.correctiveActionDescription, + this.evaluatorUser, + }); + + factory Data.fromJson(Map json) => Data( + id: json['id'], + taskJobNo: json['taskJobNo'], + userCreated: json['userCreated'] != null ? User.fromJson(json['userCreated']) : null, + taskJobContactPersons: (json['taskJobContactPersons'] as List?)?.map((e) => TaskJobContactPerson.fromJson(e)).toList(), + taskType: json['taskType'] != null ? TaskTypeModel.fromJson(json['taskType']) : null, + taskJobStatus: json['taskJobStatus'] != null ? TaskJobStatus.fromJson(json['taskJobStatus']) : null, + asset: json['asset'], + site: json['site'], + building: json['building'], + floor: json['floor'], + department: json['department'], + room: json['room'], + callComment: json['callComment'], + taskJobAttachments: (json['taskJobAttachments'] as List?)?.map((e) => TaskJobAttachment.fromJson(e)).toList(), + assignedEngineer: json['assignedEngineer'] != null ? User.fromJson(json['assignedEngineer']) : null, + taskJobAssistantEmployees: json['taskJobAssistantEmployees'], + taskJobActivityEngineerTimers: json['taskJobActivityEngineerTimers'], + taskJobHistories: (json['taskJobHistories'] as List?)?.map((e) => TaskJobHistory.fromJson(e)).toList(), + installationBuilding: json['installationBuilding'] != null ? BuildingData.fromJson(json['installationBuilding']) : null, + installationFloor: json['installationFloor'], + installationDepartment: json['installationDepartment'], + serialNo: json['serialNo'], + installationDate: json['installationDate'], + completedAction: json['completedAction'], + impactStatus: json['impactStatus'], + isUserAcknowledge: json['isUserAcknowledge'], + typeOfAlert: json['typeOfAlert'], + riskLevel: json['riskLevel'], + resource: json['resource'], + actionNeeded: json['actionNeeded'], + alertNo: json['alertNo'], + estimationDeliveryDate: json['estimationDeliveryDate'], + reasonOfFSCA: json['reasonOfFSCA'], + correctiveActionDescription: json['correctiveActionDescription'], + evaluatorUser: json['evaluatorUser'] != null ? User.fromJson(json['evaluatorUser']) : null, + ); + + Map toJson() => { + 'id': id, + 'taskJobNo': taskJobNo, + 'userCreated': userCreated?.toJson(), + 'taskJobContactPersons': taskJobContactPersons?.map((e) => e.toJson()).toList(), + 'taskType': taskType?.toJson(), + 'taskJobStatus': taskJobStatus?.toJson(), + 'asset': asset, + 'site': site, + 'building': building, + 'floor': floor, + 'department': department, + 'room': room, + 'callComment': callComment, + 'taskJobAttachments': taskJobAttachments?.map((e) => e.toJson()).toList(), + 'assignedEngineer': assignedEngineer?.toJson(), + 'taskJobAssistantEmployees': taskJobAssistantEmployees, + 'taskJobActivityEngineerTimers': taskJobActivityEngineerTimers, + 'taskJobHistories': taskJobHistories?.map((e) => e.toJson()).toList(), + 'installationBuilding': installationBuilding?.toJson(), + 'installationFloor': installationFloor, + 'installationDepartment': installationDepartment, + 'serialNo': serialNo, + 'installationDate': installationDate, + 'completedAction': completedAction, + 'impactStatus': impactStatus, + 'isUserAcknowledge': isUserAcknowledge, + 'typeOfAlert': typeOfAlert, + 'riskLevel': riskLevel, + 'resource': resource, + 'actionNeeded': actionNeeded, + 'alertNo': alertNo, + 'estimationDeliveryDate': estimationDeliveryDate, + 'reasonOfFSCA': reasonOfFSCA, + 'correctiveActionDescription': correctiveActionDescription, + 'evaluatorUser': evaluatorUser?.toJson(), + }; + + Map createTaskJson() => { + 'id': id, + 'taskJobNo': taskJobNo, + 'userCreated': userCreated?.toJson(), + 'taskJobContactPersons': taskJobContactPersons?.map((e) => e.toJson()).toList(), + 'taskType': taskType?.toJson(), + 'taskJobStatus': taskJobStatus?.toJson(), + 'asset': asset, + 'site': site, + 'building': building, + 'floor': floor, + 'department': department, + 'room': room, + 'callComment': callComment, + 'taskJobAttachments': taskJobAttachments?.map((e) => e.toJson()).toList(), + 'assignedEngineer': assignedEngineer?.toJson(), + 'taskJobAssistantEmployees': taskJobAssistantEmployees, + 'taskJobActivityEngineerTimers': taskJobActivityEngineerTimers, + 'taskJobHistories': taskJobHistories?.map((e) => e.toJson()).toList(), + 'installationBuilding': installationBuilding?.toJson(), + 'installationFloor': installationFloor, + 'installationDepartment': installationDepartment, + 'serialNo': serialNo, + 'installationDate': installationDate, + 'completedAction': completedAction, + 'impactStatus': impactStatus, + 'isUserAcknowledge': isUserAcknowledge, + 'typeOfAlert': typeOfAlert, + 'riskLevel': riskLevel, + 'resource': resource, + 'actionNeeded': actionNeeded, + 'alertNo': alertNo, + 'estimationDeliveryDate': estimationDeliveryDate, + 'reasonOfFSCA': reasonOfFSCA, + 'correctiveActionDescription': correctiveActionDescription, + 'evaluatorUser': evaluatorUser?.toJson(), + }; +} + +class User { + final String? userId; + final String? userName; + final String? email; + final String? employeeId; + final int? languageId; + + User({this.userId, this.userName, this.email, this.employeeId, this.languageId}); + + factory User.fromJson(Map json) => User( + userId: json['userId'], + userName: json['userName'], + email: json['email'], + employeeId: json['employeeId'], + languageId: json['languageId'], + ); + + Map toJson() => { + 'userId': userId, + 'userName': userName, + 'email': email, + 'employeeId': employeeId, + 'languageId': languageId, + }; +} + +class TaskJobContactPerson { + final int? id; + final User? user; + + TaskJobContactPerson({this.id, this.user}); + + factory TaskJobContactPerson.fromJson(Map json) => TaskJobContactPerson( + id: json['id'], + user: json['user'] != null ? User.fromJson(json['user']) : null, + ); + + Map toJson() => { + 'id': id, + 'user': user?.toJson(), + }; +} + +class TaskTypeModel { + final int? id; + final String? typeName; + final RelatedTo? relatedTo; + final bool? linkWithMultiAssets; + final List? taskTypeRoles; + final bool? isInstallation; + final bool? isRecallAndAlert; + + TaskTypeModel({ + this.id, + this.typeName, + this.relatedTo, + this.linkWithMultiAssets, + this.taskTypeRoles, + this.isInstallation, + this.isRecallAndAlert, + }); + + factory TaskTypeModel.fromJson(Map json) => TaskTypeModel( + id: json['id'], + typeName: json['typeName'], + relatedTo: json['relatedTo'] != null ? RelatedTo.fromJson(json['relatedTo']) : null, + linkWithMultiAssets: json['linkWithMultiAssets'], + taskTypeRoles: json['taskTypeRoles'], + isInstallation: json['isInstallation'], + isRecallAndAlert: json['isRecallAndAlert'], + ); + + Map toJson() => { + 'id': id, + 'typeName': typeName, + 'relatedTo': relatedTo?.toJson(), + 'linkWithMultiAssets': linkWithMultiAssets, + 'taskTypeRoles': taskTypeRoles, + 'isInstallation': isInstallation, + 'isRecallAndAlert': isRecallAndAlert, + }; +} + +class RelatedTo { + final int? id; + final String? name; + final int? value; + + RelatedTo({this.id, this.name, this.value}); + + factory RelatedTo.fromJson(Map json) => RelatedTo( + id: json['id'], + name: json['name'], + value: json['value'], + ); + + Map toJson() => { + 'id': id, + 'name': name, + 'value': value, + }; +} + +class TaskJobStatus { + final int? id; + final String? name; + final int? value; + + TaskJobStatus({this.id, this.name, this.value}); + + factory TaskJobStatus.fromJson(Map json) => TaskJobStatus( + id: json['id'], + name: json['name'], + value: json['value'], + ); + + Map toJson() => { + 'id': id, + 'name': name, + 'value': value, + }; +} + +class TaskJobAttachment { + final int? id; + final String? name; + + TaskJobAttachment({this.id, this.name}); + + factory TaskJobAttachment.fromJson(Map json) => TaskJobAttachment( + id: json['id'], + name: json['name'], + ); + + Map toJson() => { + 'id': id, + 'name': name, + }; +} + +class TaskJobHistory { + final int? id; + final RelatedTo? action; + final TaskJobStatus? taskJobStatus; + final User? user; + final dynamic typeOfAlert; + final dynamic riskLevel; + final dynamic resource; + final dynamic actionNeeded; + final User? assignedEmployee; + final dynamic alertNo; + final String? estimationDeliveryDate; + final String? createdDate; + final BuildingData? installationBuilding; + final dynamic installationFloor; + final dynamic installationDepartment; + final String? installationDate; + final String? serialNo; + + TaskJobHistory({ + this.id, + this.action, + this.taskJobStatus, + this.user, + this.typeOfAlert, + this.riskLevel, + this.resource, + this.actionNeeded, + this.assignedEmployee, + this.alertNo, + this.estimationDeliveryDate, + this.createdDate, + this.installationBuilding, + this.installationFloor, + this.installationDepartment, + this.installationDate, + this.serialNo, + }); + + factory TaskJobHistory.fromJson(Map json) => TaskJobHistory( + id: json['id'], + action: json['action'] != null ? RelatedTo.fromJson(json['action']) : null, + taskJobStatus: json['taskJobStatus'] != null ? TaskJobStatus.fromJson(json['taskJobStatus']) : null, + user: json['user'] != null ? User.fromJson(json['user']) : null, + typeOfAlert: json['typeOfAlert'], + riskLevel: json['riskLevel'], + resource: json['resource'], + actionNeeded: json['actionNeeded'], + assignedEmployee: json['assignedEmployee'] != null ? User.fromJson(json['assignedEmployee']) : null, + alertNo: json['alertNo'], + estimationDeliveryDate: json['estimationDeliveryDate'], + createdDate: json['createdDate'], + installationBuilding: json['installationBuilding'] != null ? BuildingData.fromJson(json['installationBuilding']) : null, + installationFloor: json['installationFloor'], + installationDepartment: json['installationDepartment'], + installationDate: json['installationDate'], + serialNo: json['serialNo'], + ); + + Map toJson() => { + 'id': id, + 'action': action?.toJson(), + 'taskJobStatus': taskJobStatus?.toJson(), + 'user': user?.toJson(), + 'typeOfAlert': typeOfAlert, + 'riskLevel': riskLevel, + 'resource': resource, + 'actionNeeded': actionNeeded, + 'assignedEmployee': assignedEmployee?.toJson(), + 'alertNo': alertNo, + 'estimationDeliveryDate': estimationDeliveryDate, + 'createdDate': createdDate, + 'installationBuilding': installationBuilding?.toJson(), + 'installationFloor': installationFloor, + 'installationDepartment': installationDepartment, + 'installationDate': installationDate, + 'serialNo': serialNo, + }; +} + +class BuildingData { + final int? id; + final String? name; + final int? value; + + BuildingData({this.id, this.name, this.value}); + + factory BuildingData.fromJson(Map json) => BuildingData( + id: json['id'], + name: json['name'], + value: json['value'], + ); + + Map toJson() => { + 'id': id, + 'name': name, + 'value': value, + }; +} + +class AddTaskModel { + int? id; + int? taskTypeId; + List? assetIds = []; + Site? site; + Building? building; + Floor? floor; + Department? department; + Rooms? room; + String? callComment; + Lookup? typeOfAlert; + Lookup? riskLevel; + Lookup? resource; + Lookup? actionNeeded; + TaskEvaluatorUser? taskEvaluatorUser; + String? alertNo; + String? estimationDeliveryDate; + List? attachments; + String? reasonOfFSCA; + String? correctiveActionDescription; + + AddTaskModel({ + this.id, + this.taskTypeId, + this.assetIds, + this.site, + this.building, + this.floor, + this.department, + this.room, + this.callComment, + this.typeOfAlert, + this.riskLevel, + this.resource, + this.actionNeeded, + this.alertNo, + this.estimationDeliveryDate, + this.attachments, + this.reasonOfFSCA, + this.taskEvaluatorUser, + this.correctiveActionDescription, + }); + + Map toJson() => { + 'id': id, + 'taskTypeId': taskTypeId, + 'assetIds': assetIds ?? [], + 'siteId': site?.id, + 'buildingId': building?.id, + 'floorId': floor?.id, + 'departmentId': department?.id, + 'roomId': room?.id, + 'callComment': callComment, + 'typeOfAlertId': typeOfAlert?.id, + 'riskLevelId': riskLevel?.id, + 'resourceId': resource?.id, + 'actionNeededId': actionNeeded?.id, + 'alertNo': alertNo, + 'estimationDeliveryDate': estimationDeliveryDate, + 'reasonOfFSCA': reasonOfFSCA, + 'correctiveActionDescription': correctiveActionDescription, + 'evaluatorUserId': taskEvaluatorUser?.userId, + 'attachments': attachments?.map((x) => x.toJson()).toList(), + }; +} + +class TaskEvaluatorUser extends Base { + String? userId; + String? userName; + String? email; + String? employeeId; + int? languageId; + + TaskEvaluatorUser({this.userId, this.userName, this.email, this.employeeId, this.languageId}) : super(name: userName, identifier: userId?.toString()); + + factory TaskEvaluatorUser.fromJson(Map json) { + return TaskEvaluatorUser(userId: json['userId'], userName: json['userName'], email: json['email'], employeeId: json['employeeId'], languageId: json['languageId']); + } + + Map toJson() { + final Map data = {}; + data['userId'] = userId; + data['userName'] = userName; + data['email'] = email; + data['employeeId'] = employeeId; + data['languageId'] = languageId; + return data; + } +} diff --git a/lib/models/new_models/task_request/task_type_model.dart b/lib/models/new_models/task_request/task_type_model.dart new file mode 100644 index 00000000..4d20020c --- /dev/null +++ b/lib/models/new_models/task_request/task_type_model.dart @@ -0,0 +1,77 @@ +import 'package:test_sa/models/base.dart'; + +class TaskType extends Base{ + final int? id; + final String? typeName; + final RelatedTo? relatedTo; + final bool? linkWithMultiAssets; + final List? taskTypeRoles; + final bool? isInstallation; + final bool? isRecallAndAlert; + + TaskType({ + this.id, + this.typeName, + this.relatedTo, + this.linkWithMultiAssets, + this.taskTypeRoles, + this.isInstallation, + this.isRecallAndAlert, + }): super(name: typeName, identifier: id?.toString()); + + factory TaskType.fromJson(Map json) { + return TaskType( + id: json['id'] as int?, + typeName: json['typeName'] as String?, + relatedTo: json['relatedTo'] != null + ? RelatedTo.fromJson(json['relatedTo']) + : null, + linkWithMultiAssets: json['linkWithMultiAssets'] as bool?, + taskTypeRoles: (json['taskTypeRoles'] as List?) + ?.map((e) => TaskTypeRole.fromJson(e)) + .toList(), + isInstallation: json['isInstallation'] as bool?, + isRecallAndAlert: json['isRecallAndAlert'] as bool?, + ); + } +} + +class RelatedTo { + final int? id; + final String? name; + final int? value; + + RelatedTo({ + this.id, + this.name, + this.value, + }); + + factory RelatedTo.fromJson(Map json) { + return RelatedTo( + id: json['id'] as int?, + name: json['name'] as String?, + value: json['value'] as int?, + ); + } +} + +class TaskTypeRole { + final String? roleId; + final String? roleName; + final String? roleValue; + + TaskTypeRole({ + this.roleId, + this.roleName, + this.roleValue, + }); + + factory TaskTypeRole.fromJson(Map json) { + return TaskTypeRole( + roleId: json['roleId'] as String?, + roleName: json['roleName'] as String?, + roleValue: json['roleValue'] as String?, + ); + } +} diff --git a/lib/new_views/common_widgets/app_bottom_nav_bar.dart b/lib/new_views/common_widgets/app_bottom_nav_bar.dart index 19833129..f256478a 100644 --- a/lib/new_views/common_widgets/app_bottom_nav_bar.dart +++ b/lib/new_views/common_widgets/app_bottom_nav_bar.dart @@ -28,9 +28,12 @@ class AppBottomNavigationBar extends StatelessWidget { items: [ navBarItem(context, index: 0, iconName: "overview", label: context.translation.overview), navBarItem(context, index: 1, iconName: "request_icon", label: context.translation.workOrder), - if (!isEngineer) navBarItem(context, index: 2, iconName: "add_icon", label: context.translation.calendar, showLabel: false), - navBarItem(context, index: !isEngineer ? 3 : 2, iconName: "assets", label: context.translation.assets), - navBarItem(context, index: !isEngineer ? 4 : 3, iconName: "contact", label: context.translation.contact), + // if (!isEngineer) navBarItem(context, index: 2, iconName: "add_icon", label: context.translation.calendar, showLabel: false), + navBarItem(context, index: 2, iconName: "add_icon", label: context.translation.calendar, showLabel: false), + // navBarItem(context, index: !isEngineer ? 3 : 2, iconName: "assets", label: context.translation.assets), + navBarItem(context, index: 3, iconName: "assets", label: context.translation.assets), + // navBarItem(context, index: !isEngineer ? 4 : 3, iconName: "contact", label: context.translation.contact), + navBarItem(context, index: 4, iconName: "contact", label: context.translation.contact), ], currentIndex: selectedIndex, onTap: onPressed, diff --git a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart index f85cec84..6c405780 100644 --- a/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart +++ b/lib/new_views/pages/land_page/create_request-type_bottomsheet.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.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/models/enums/user_types.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/pages/new_gas_refill_request_page.dart'; import 'package:test_sa/service_request_latest/views/nurse/create_new_request_view.dart'; @@ -9,60 +10,74 @@ import 'package:test_sa/views/pages/device_transfer/request_device_transfer.dart import 'package:test_sa/views/pages/user/tasks_request/create_task_view.dart'; class CreateRequestTypeBottomSheet extends StatelessWidget { - const CreateRequestTypeBottomSheet({super.key}); + final bool isEngineer; + + const CreateRequestTypeBottomSheet({super.key, required this.isEngineer}); @override Widget build(BuildContext context) { -//TODO replace all the icons with new icons... return Container( padding: const EdgeInsets.all(16.0), + width: double.infinity, child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ context.translation.selectWorkOrder.heading4(context), 16.height, - GridView( - padding: EdgeInsets.all(0), - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1, crossAxisSpacing: 16, mainAxisSpacing: 16), - children: [ - listCard( - context: context, - icon: 'add_icon', - label: context.translation.correctiveMaintenance, - onTap: () { - Navigator.pushReplacementNamed(context, CreateNewRequest.id); - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: context.translation.gasRefill, - onTap: () { - //NewGasRefillRequestPage.routeName) - Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: context.translation.deviceTransfer, - onTap: () async { - Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); - }, - ), - listCard( - context: context, - icon: 'add_icon', - label: context.translation.task, - onTap: () async { - Navigator.pushReplacementNamed(context, CreateTaskView.id); - }, - ), - ], - ), + isEngineer + ? SizedBox( + // width: double.infinity, + child: listCard( + context: context, + icon: 'add_icon', + label: context.translation.task, + onTap: () async { + Navigator.pushReplacementNamed(context, CreateTaskView.id); + }, + ), + ) + : GridView( + padding: EdgeInsets.all(0), + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 1, crossAxisSpacing: 16, mainAxisSpacing: 16), + children: [ + listCard( + context: context, + icon: 'add_icon', + label: context.translation.correctiveMaintenance, + onTap: () { + Navigator.pushReplacementNamed(context, CreateNewRequest.id); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: context.translation.gasRefill, + onTap: () { + //NewGasRefillRequestPage.routeName) + Navigator.pushReplacementNamed(context, NewGasRefillRequestPage.routeName); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: context.translation.deviceTransfer, + onTap: () async { + Navigator.pushReplacementNamed(context, RequestDeviceTransfer.id); + }, + ), + listCard( + context: context, + icon: 'add_icon', + label: context.translation.task, + onTap: () async { + Navigator.pushReplacementNamed(context, CreateTaskView.id); + }, + ), + ], + ), 16.height, ], ), diff --git a/lib/new_views/pages/land_page/land_page.dart b/lib/new_views/pages/land_page/land_page.dart index 2f4b6921..d1b1b92f 100644 --- a/lib/new_views/pages/land_page/land_page.dart +++ b/lib/new_views/pages/land_page/land_page.dart @@ -115,7 +115,8 @@ class _LandPageState extends State { })), // const old_page.LandPage(), const MyRequestsPage(), - if (_userProvider!.user!.type != UsersTypes.engineer) const SizedBox(), + // if (_userProvider!.user!.type != UsersTypes.engineer) + const SizedBox(), // if (_userProvider!.user!.type != UsersTypes.engineer) const CalendarPage(), const MyAssetsPage(fromBottomBar: true), ]; @@ -155,14 +156,14 @@ class _LandPageState extends State { selectedIndex: currentPageIndex, onPressed: (index) { bool isEngineer = _userProvider!.user!.type == UsersTypes.engineer; - if (!isEngineer && index == 2) { + if (index == 2) { showModalBottomSheet( context: context, useSafeArea: true, backgroundColor: Colors.white, - builder: (context) => const CreateRequestTypeBottomSheet(), + builder: (context) => CreateRequestTypeBottomSheet(isEngineer:isEngineer), ); - } else if (index == (!isEngineer ? 4 : 3)) { + } else if (index == 4) { showModalBottomSheet( context: context, useSafeArea: true, diff --git a/lib/providers/task_request_provider/task_job_provider.dart b/lib/providers/task_request_provider/task_job_provider.dart new file mode 100644 index 00000000..deeb2f11 --- /dev/null +++ b/lib/providers/task_request_provider/task_job_provider.dart @@ -0,0 +1,169 @@ +import 'dart:convert'; + +import 'package:http/http.dart'; +import 'package:test_sa/models/lookup.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/providers/loading_list_notifier.dart'; +import '../../controllers/api_routes/api_manager.dart'; +import '../../controllers/api_routes/urls.dart'; + + +class TaskTypeProvider extends LoadingListNotifier { + @override + Future getDate() async { + print('get data called...'); + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.getTaskTypeByUserUrl); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => TaskType.fromJson(item)).toList(); + print('item lenght i got is ${items.length}'); + + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} +class TaskEvaluatorUserProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.getTaskEvaluatorUser); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + List userListJson = json.decode(response.body); + + items = userListJson.map((item) => TaskEvaluatorUser.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} + +class TaskJobTypeOfAlertProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.taskJobTypeOfAlert); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} +class TaskJobRiskLevelProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.taskJobRiskLevel); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} +class TaskJobResourceProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.taskJobResource); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} +class TaskJobActionNeededProvider extends LoadingListNotifier { + @override + Future getDate() async { + if (loading == true) return -2; + loading = true; + notifyListeners(); + try { + Response response = await ApiManager.instance.get(URLs.taskJobActionNeeded); + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + // client's request was successfully received + List categoriesListJson = json.decode(response.body)["data"]; + items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList(); + } + loading = false; + notifyListeners(); + return response.statusCode; + } catch (error) { + loading = false; + stateCode = -1; + notifyListeners(); + return -1; + } + } +} + + + + diff --git a/lib/providers/task_request_provider/task_request_provider.dart b/lib/providers/task_request_provider/task_request_provider.dart new file mode 100644 index 00000000..2936ac35 --- /dev/null +++ b/lib/providers/task_request_provider/task_request_provider.dart @@ -0,0 +1,65 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:fluttertoast/fluttertoast.dart'; +import 'package:http/http.dart'; +import 'package:test_sa/controllers/api_routes/api_manager.dart'; +import 'package:test_sa/controllers/api_routes/urls.dart'; +import 'package:test_sa/extensions/context_extension.dart'; +import 'package:test_sa/extensions/string_extensions.dart'; +import 'package:test_sa/models/lookup.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/models/service_request/service_report.dart'; +import 'package:test_sa/models/service_request/service_request.dart'; +import 'package:test_sa/models/service_request/service_request_search.dart'; +import 'package:test_sa/models/service_request/spare_parts.dart'; +import 'package:test_sa/models/service_request/supp_engineer_work_orders.dart'; +import 'package:test_sa/models/service_request/supplier_engineer_model.dart'; +import 'package:test_sa/models/timer_model.dart'; + +import '../../models/service_request/search_work_order.dart'; +import '../../models/service_request/wo_call_request.dart'; +import '../../models/user.dart'; +import '../../new_views/common_widgets/app_lazy_loading.dart'; + +class TaskRequestProvider extends ChangeNotifier { + // number of items call in each request + final pageItemNumber = 10; + + + // state code of current request to defied error message + // like 400 customer request failed + // 500 service not available + int? stateCode; + + + bool isLoading = false; + + + + Future addTask({ + required BuildContext context, + required AddTaskModel task, + }) async { + showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); + Response response; + try { + response = await ApiManager.instance.post(URLs.addTaskUrl, body: task.toJson()); + + stateCode = response.statusCode; + if (response.statusCode >= 200 && response.statusCode < 300) { + notifyListeners(); + Fluttertoast.showToast(msg: context.translation.successfulRequestMessage); + Navigator.pop(context); + } else { + Fluttertoast.showToast(msg: "${context.translation.failedRequestMessage} :${json.decode(response.body)['message']}"); + } + Navigator.pop(context); + } catch (error) { + print(error); + Navigator.pop(context); + } + } +} diff --git a/lib/views/pages/user/tasks_request/create_task_view.dart b/lib/views/pages/user/tasks_request/create_task_view.dart index f9c30d05..3672893d 100644 --- a/lib/views/pages/user/tasks_request/create_task_view.dart +++ b/lib/views/pages/user/tasks_request/create_task_view.dart @@ -3,28 +3,35 @@ 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/dashboard_latest/dashboard_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/enums/user_types.dart'; -import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.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/service_request_providers/last_situation_provider.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"; @@ -36,103 +43,372 @@ class CreateTaskView extends StatefulWidget { } class _CreateTaskViewState extends State with TickerProviderStateMixin { - final List _deviceImages = []; + 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(); - bool _isLocalUrl(String url) { - if (url.isEmpty != false) return false; - return url.startsWith("/") || url.startsWith("file://") || url.substring(1).startsWith(':\\'); - } @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, appBar: DefaultAppBar(title: context.translation.createTaskRequest), - body: Consumer(builder: (context, serviceRequestProvider, child) { - return SafeArea( - child: Form( - key: _formKey, - child: Column( - children: [ - SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - 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, - //TODO replace with provided lookup.. - SingleItemDropDownMenu( - context: context, - height: 56.toScreenHeight, - title: context.translation.taskType, - showShadow: false, - backgroundColor: AppColor.neutral100, - showAsBottomSheet: true, - initialValue: null, - onSelect: (status) { - if (status != null) { - setState(() {}); - } - }, - ), - 12.height, - AppTextFormField( - initialValue: '', - labelText: context.translation.technicalComment, - backgroundColor: AppColor.neutral100, - showShadow: false, - labelStyle: AppTextStyles.textFieldLabelStyle, - alignLabelWithHint: true, - textInputType: TextInputType.multiline, - onChange: (value) { - //save value to model attribute.. - }, - ), - 23.height, - MultiFilesPicker( - label: context.translation.attachImage, - files: _deviceImages, - buttonColor: AppColor.black10, - onlyImages: true, - buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), - ), + 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(), ], - ).toShadowContainer(context).paddingAll(16), - ).expanded, - FooterActionButton.footerContainer( - child: AppFilledButton( - buttonColor: AppColor.primary10, - label: context.translation.submitRequest, - onPressed: checkPendingRequest ? null : _submit, - // buttonColor: AppColor.primary10, - ), + 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, + ], ); } @@ -145,7 +421,7 @@ class _CreateTaskViewState extends State with TickerProviderStat onPick: (asset) async { pendingAssetServiceRequest = null; _device = asset; - // _serviceRequest.device = asset; + _addTaskModel?.assetIds=[asset.id!.toInt()]; await checkAssetForPendingServiceRequest(asset.id!.toInt()); if (pendingAssetServiceRequest != null && pendingAssetServiceRequest!.details!.isNotEmpty) { showPendingRequestBottomSheet(); @@ -192,28 +468,12 @@ class _CreateTaskViewState extends State with TickerProviderStat if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); - - // List attachement = []; - // for (var item in _deviceImages) { - // attachement.add(WorkOrderAttachments(id: 0, name: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); - // } - - // int status = 0; - // if (status == 200) { - // DashBoardProvider dashBoardProvider = Provider.of(context, listen: false); - // dashBoardProvider.refreshDashboard(context: context, userType: UsersTypes.nurse); - // Navigator.pop(context); - // Navigator.pop(context); - // } else { - // Navigator.pop(context); - // } - - // await _serviceRequestsProvider.createRequest( - // context: context, - // user: _userProvider.user!, - // host: _settingProvider.host!, - // serviceRequest: _serviceRequest, - // ); + _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!); } } }