diff --git a/lib/models/new_models/task_request/task_request_model.dart b/lib/models/new_models/task_request/task_request_model.dart index ffe1cace..b3892f3d 100644 --- a/lib/models/new_models/task_request/task_request_model.dart +++ b/lib/models/new_models/task_request/task_request_model.dart @@ -50,7 +50,7 @@ class TaskData { int? id; int? statusValue; String? taskJobNo; - User? userCreated; + TaskContactUser? userCreated; List? taskJobContactPersons; TaskTypeModel? taskType; TaskJobStatus? taskJobStatus; @@ -62,7 +62,7 @@ class TaskData { Rooms? room; String? callComment; List? taskJobAttachments; - User? assignedEngineer; + TaskContactUser? assignedEngineer; List? taskJobAssistantEmployees; TaskJobAssistantEmployees? modelAssistantEmployees; List? assistantEmployees; @@ -83,7 +83,7 @@ class TaskData { String? estimationDeliveryDate; String? reasonOfFSCA; String? correctiveActionDescription; - User? evaluatorUser; + TaskContactUser? evaluatorUser; List? taskJobActivityEngineerTimers = []; TimerModel? taskTimerModel = TimerModel(); double? totalWorkingHours = 0.0; @@ -133,7 +133,8 @@ class TaskData { TaskData.fromJson(Map json) { id = json['id']; taskJobNo = json['taskJobNo']; - userCreated = json['userCreated'] != null ? User.fromJson(json['userCreated']) : null; + userCreated = json['userCreated'] != null ? TaskContactUser.fromJson(json['userCreated']) : null; + if (json['taskJobContactPersons'] != null) { taskJobContactPersons = []; json['taskJobContactPersons'].forEach((v) { @@ -155,7 +156,8 @@ class TaskData { taskJobAttachments!.add(TaskJobAttachment.fromJson(v)); }); } - assignedEngineer = json['assignedEngineer'] != null ? User.fromJson(json['assignedEngineer']) : null; + assignedEngineer = json['assignedEngineer'] != null ? TaskContactUser.fromJson(json['assignedEngineer']) : null; + asset = json['asset'] != null ? TaskAsset.fromJson(json['asset']) : null; if (json['taskJobAssistantEmployees'] != null) { taskJobAssistantEmployees = []; @@ -205,7 +207,7 @@ class TaskData { estimationDeliveryDate = json['estimationDeliveryDate']; reasonOfFSCA = json['reasonOfFSCA']; correctiveActionDescription = json['correctiveActionDescription']; - evaluatorUser = json['evaluatorUser'] != null ? User.fromJson(json['evaluatorUser']) : null; + evaluatorUser = json['evaluatorUser'] != null ? TaskContactUser.fromJson(json['evaluatorUser']) : null; site = json["site"] == null ? null : Site.fromJson(json["site"]); building = json["building"] == null ? null : Building.fromJson(json["building"]); @@ -248,6 +250,7 @@ class TaskData { if (assignedEngineer != null) { data['assignedEngineer'] = assignedEngineer!.toJson(); } + if (taskJobAssistantEmployees != null) { data['taskJobAssistantEmployees'] = taskJobAssistantEmployees!.map((v) => v.toJson()).toList(); } @@ -349,41 +352,57 @@ class TaskJobActivityEngineerTimer { } } -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'], - ); +class TaskContactUser { + String? userId; + String? userName; + String? email; + String? employeeId; + int? languageId; + String? extensionNo; + String? phoneNumber; + + TaskContactUser({ + this.userId, + this.userName, + this.email, + this.employeeId, + this.languageId, + this.extensionNo, + this.phoneNumber, + }); - Map toJson() => { - 'userId': userId, - 'userName': userName, - 'email': email, - 'employeeId': employeeId, - 'languageId': languageId, - }; + TaskContactUser.fromJson(Map json) { + userId = json['userId']; + userName = json['userName']; + email = json['email']; + employeeId = json['employeeId']; + languageId = json['languageId']; + extensionNo = json['extensionNo']; + phoneNumber = json['phoneNumber']; + } + + Map toJson() { + return { + 'userId': userId, + 'userName': userName, + 'email': email, + 'employeeId': employeeId, + 'languageId': languageId, + 'extensionNo': extensionNo, + 'phoneNumber': phoneNumber, + }; + } } class TaskJobContactPerson { final int? id; - final User? user; + final TaskContactUser? user; TaskJobContactPerson({this.id, this.user}); factory TaskJobContactPerson.fromJson(Map json) => TaskJobContactPerson( id: json['id'], - user: json['user'] != null ? User.fromJson(json['user']) : null, + user: json['user'] != null ? TaskContactUser.fromJson(json['user']) : null, ); Map toJson() => { @@ -475,17 +494,20 @@ class TaskJobStatus { class TaskJobAttachment { final int? id; final String? name; + String ?createdBy; - TaskJobAttachment({this.id, this.name}); + TaskJobAttachment({this.id, this.name,this.createdBy}); factory TaskJobAttachment.fromJson(Map json) => TaskJobAttachment( id: json['id'], name: json['name'], + createdBy: json['createdBy'], ); Map toJson() => { 'id': id, 'name': name, + 'createdBy': createdBy, }; } @@ -531,12 +553,12 @@ class TaskJobHistory { final int? id; final RelatedTo? action; final TaskJobStatus? taskJobStatus; - final User? user; + final TaskContactUser? user; final dynamic typeOfAlert; final dynamic riskLevel; final dynamic resource; final dynamic actionNeeded; - final User? assignedEmployee; + final TaskContactUser? assignedEmployee; final dynamic alertNo; final String? estimationDeliveryDate; final String? createdDate; @@ -570,12 +592,12 @@ class 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, + user: json['user'] != null ? TaskContactUser.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, + assignedEmployee: json['assignedEmployee'] != null ? TaskContactUser.fromJson(json['assignedEmployee']) : null, alertNo: json['alertNo'], estimationDeliveryDate: json['estimationDeliveryDate'], createdDate: json['createdDate'], diff --git a/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart b/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart index d33bd9c8..fe96070f 100644 --- a/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart +++ b/lib/modules/tm_module/tasks_wo/task_request_detail_view.dart @@ -121,6 +121,7 @@ class _TaskRequestDetailsViewState extends State { ], ), ], + if (taskProvider.taskRequestModel!.taskJobContactPersons!.isNotEmpty) contactInfoCard(context, taskProvider.taskRequestModel), if (taskProvider.taskRequestModel?.callComment != null) ...[ const Divider().defaultStyle(context), Text( @@ -160,6 +161,38 @@ class _TaskRequestDetailsViewState extends State { ); } + Widget contactInfoCard(BuildContext context, TaskData? taskModel) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 8.height, + const Divider().defaultStyle(context), + Text( + "Contact Info", + style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), + ), + // 8.height, + ListView.separated( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + padding: EdgeInsets.zero, + itemBuilder: (cxt, index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + '${context.translation.name}: ${taskModel.taskJobContactPersons?[index].user?.userName ?? '-'}'.bodyText(context), + '${context.translation.employeeId}: ${taskModel.taskJobContactPersons?[index].user?.employeeId ?? '-'}'.bodyText(context), + '${context.translation.telephone}: ${taskModel.taskJobContactPersons?[index].user?.phoneNumber ?? '-'}'.bodyText(context), + '${context.translation.email}: ${taskModel.taskJobContactPersons?[index].user?.email ?? '-'}'.bodyText(context), + 'Extension: ${taskModel.taskJobContactPersons?[index].user?.extensionNo ?? '-'}'.bodyText(context), + ], + ), + separatorBuilder: (cxt, index) => const Divider().defaultStyle(context), + itemCount: taskModel!.taskJobContactPersons!.length), + ], + ); + } + Widget installationWidget({required TaskData taskModel}) { return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/modules/tm_module/tasks_wo/update_task_request_view.dart b/lib/modules/tm_module/tasks_wo/update_task_request_view.dart index 242bbe55..9ab50370 100644 --- a/lib/modules/tm_module/tasks_wo/update_task_request_view.dart +++ b/lib/modules/tm_module/tasks_wo/update_task_request_view.dart @@ -6,6 +6,7 @@ import 'package:fluttertoast/fluttertoast.dart'; import 'package:provider/provider.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/providers/api/all_requests_provider.dart'; +import 'package:test_sa/controllers/providers/api/user_provider.dart'; import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart'; @@ -56,6 +57,8 @@ class _UpdateTaskRequestState extends State { List _files = []; bool installationType = true; String comments = ''; + List _userAttachments = []; + List _readOnlyAttachments = []; @override void initState() { @@ -68,14 +71,14 @@ class _UpdateTaskRequestState extends State { Future assignData() async { _taskProvider = Provider.of(context, listen: false); + UserProvider _userProvider = Provider.of(context, listen: false); + TaskData? taskModel = _taskProvider!.taskRequestModel; + _userAttachments = _taskProvider?.taskRequestModel?.taskJobAttachments?.where((e) => e.createdBy == _userProvider.user?.userID).map((e) => File(e.name ?? '')).toList() ?? []; + _readOnlyAttachments = _taskProvider?.taskRequestModel?.taskJobAttachments?.where((e) => e.createdBy != _userProvider.user?.userID).toList() ?? []; + + _taskProvider?.updateTaskModel(taskModel); - if (taskModel != null) { - _files.addAll(taskModel.taskJobAttachments!.map((e) => File(e.name ?? '')).toList()); - // if (taskModel.taskType?.isInstallation == true) { - // await _taskProvider!.getSiteData(siteId: taskModel.asset?.siteId); - // } - } } @override @@ -137,7 +140,7 @@ class _UpdateTaskRequestState extends State { 20.height, MultiFilesPicker( label: context.translation.attachFiles, - files: _files, + files: _userAttachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), @@ -187,8 +190,12 @@ class _UpdateTaskRequestState extends State { if (validate(model: taskModel)) { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); List attachment = []; - for (var item in _files) { - attachment.add(TaskJobAttachment(id: 0, name: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); + if (_readOnlyAttachments.isNotEmpty) { + attachment.addAll(_readOnlyAttachments); + } + for (var file in _userAttachments) { + String fileName = ServiceRequestUtils.isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(File(file.path).readAsBytesSync())}") : file.path; + attachment.add(TaskJobAttachment(id: 0, name: fileName)); } taskModel?.taskJobAttachments = attachment; if (taskModel?.taskTimePicker != null) {