create task flow completed

design_3.0_task_module_new
WaseemAbbasi22 6 months ago
parent 0fdbe8722e
commit 14e55c63e7

@ -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

@ -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()),

@ -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<String, dynamic> 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<String, dynamic> 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<TaskJobContactPerson>? 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<TaskJobAttachment>? taskJobAttachments;
final User? assignedEngineer;
final List<dynamic>? taskJobAssistantEmployees;
final List<dynamic>? taskJobActivityEngineerTimers;
final List<TaskJobHistory>? 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<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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<String, dynamic> json) => User(
userId: json['userId'],
userName: json['userName'],
email: json['email'],
employeeId: json['employeeId'],
languageId: json['languageId'],
);
Map<String, dynamic> 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<String, dynamic> json) => TaskJobContactPerson(
id: json['id'],
user: json['user'] != null ? User.fromJson(json['user']) : null,
);
Map<String, dynamic> toJson() => {
'id': id,
'user': user?.toJson(),
};
}
class TaskTypeModel {
final int? id;
final String? typeName;
final RelatedTo? relatedTo;
final bool? linkWithMultiAssets;
final List<dynamic>? 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<String, dynamic> 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<String, dynamic> 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<String, dynamic> json) => RelatedTo(
id: json['id'],
name: json['name'],
value: json['value'],
);
Map<String, dynamic> 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<String, dynamic> json) => TaskJobStatus(
id: json['id'],
name: json['name'],
value: json['value'],
);
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'value': value,
};
}
class TaskJobAttachment {
final int? id;
final String? name;
TaskJobAttachment({this.id, this.name});
factory TaskJobAttachment.fromJson(Map<String, dynamic> json) => TaskJobAttachment(
id: json['id'],
name: json['name'],
);
Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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<String, dynamic> json) => BuildingData(
id: json['id'],
name: json['name'],
value: json['value'],
);
Map<String, dynamic> toJson() => {
'id': id,
'name': name,
'value': value,
};
}
class AddTaskModel {
int? id;
int? taskTypeId;
List<int>? 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<TaskJobAttachment>? 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<String, dynamic> 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<String, dynamic> json) {
return TaskEvaluatorUser(userId: json['userId'], userName: json['userName'], email: json['email'], employeeId: json['employeeId'], languageId: json['languageId']);
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['userId'] = userId;
data['userName'] = userName;
data['email'] = email;
data['employeeId'] = employeeId;
data['languageId'] = languageId;
return data;
}
}

@ -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<TaskTypeRole>? 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<String, dynamic> 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<dynamic>?)
?.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<String, dynamic> 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<String, dynamic> json) {
return TaskTypeRole(
roleId: json['roleId'] as String?,
roleName: json['roleName'] as String?,
roleValue: json['roleValue'] as String?,
);
}
}

@ -28,9 +28,12 @@ class AppBottomNavigationBar extends StatelessWidget {
items: <BottomNavigationBarItem>[
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,

@ -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: <Widget>[
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: <Widget>[
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,
],
),

@ -115,7 +115,8 @@ class _LandPageState extends State<LandPage> {
})),
// 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<LandPage> {
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,

@ -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<TaskType> {
@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<TaskEvaluatorUser> {
@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<Lookup> {
@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<Lookup> {
@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<Lookup> {
@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<Lookup> {
@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;
}
}
}

@ -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<void> 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);
}
}
}

@ -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<CreateTaskView> with TickerProviderStateMixin {
final List<File> _deviceImages = [];
final List<File> _deviceImages = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
//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<ServiceRequestsProvider>(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<Lookup, LastSituationProvider>(
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<TaskType, TaskTypeProvider>(
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<Site, SiteProvider>(
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<Building, NullableLoadingProvider>(
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<Floor, NullableLoadingProvider>(
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<Department, NullableLoadingProvider>(
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<Rooms, NullableLoadingProvider>(
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<Lookup, TaskJobTypeOfAlertProvider>(
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<Lookup, TaskJobRiskLevelProvider>(
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<Lookup, TaskJobResourceProvider>(
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<Lookup, TaskJobActionNeededProvider>(
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<TaskEvaluatorUser, TaskEvaluatorUserProvider>(
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<CreateTaskView> 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<CreateTaskView> with TickerProviderStat
if (_formKey.currentState!.validate()) {
_formKey.currentState!.save();
// List<WorkOrderAttachments> 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<DashBoardProvider>(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<TaskRequestProvider>(context,listen: false);
taskRequestProvider.addTask(context: context, task: _addTaskModel!);
}
}
}

Loading…
Cancel
Save