attachment fixes

design_3.0_TM_Module
WaseemAbbasi22 3 months ago
parent b4e8e82995
commit 4e665d1959

@ -8,6 +8,7 @@ import 'package:http/http.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart'; import 'package:test_sa/models/plan_preventive_visit/plan_preventive_visit_model.dart';
import 'package:test_sa/models/ppm/ppm.dart'; import 'package:test_sa/models/ppm/ppm.dart';
import 'package:test_sa/models/ppm/ppm_search.dart'; import 'package:test_sa/models/ppm/ppm_search.dart';
@ -38,11 +39,11 @@ class PpmProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
List<File> _ppmPlanAttachments = []; List<GenericAttachmentModel> _ppmPlanAttachments = [];
List<File> get ppmPlanAttachments => _ppmPlanAttachments; List<GenericAttachmentModel> get ppmPlanAttachments => _ppmPlanAttachments;
set ppmPlanAttachments(List<File> value) { set ppmPlanAttachments(List<GenericAttachmentModel> value) {
_ppmPlanAttachments = value; _ppmPlanAttachments = value;
notifyListeners(); notifyListeners();
} }

@ -0,0 +1,26 @@
import 'dart:io';
class GenericAttachmentModel {
GenericAttachmentModel({this.id, this.name,this.originalName,this.createdBy});
int? id;
String? name;
String ?createdBy;
String? originalName;
GenericAttachmentModel.fromJson(Map<String, dynamic> json) {
print('created by here is ${json['createdBy']}');
id = json['id'];
name = json['name'];
createdBy = json['createdBy'];
originalName = json['originalName'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['name'] = name;
data['createdBy'] = createdBy;
data['originalName'] = originalName;
return data;
}
}

@ -53,7 +53,7 @@ class WorkOrderHelperModel {
} }
class WorkOrderAttachments { class WorkOrderAttachments {
WorkOrderAttachments({this.id, this.name}); WorkOrderAttachments({this.id, this.name,this.createdBy});
int? id; int? id;
String? name; String? name;

@ -7,6 +7,7 @@ import 'package:flutter/material.dart';
import 'package:http/src/response.dart'; import 'package:http/src/response.dart';
import 'package:test_sa/controllers/api_routes/api_manager.dart'; import 'package:test_sa/controllers/api_routes/api_manager.dart';
import 'package:test_sa/controllers/api_routes/urls.dart'; import 'package:test_sa/controllers/api_routes/urls.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart'; import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart';
import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart'; import 'package:test_sa/models/helper_data_models/maintenance_request/activity_maintenance_model.dart';
import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart'; import 'package:test_sa/models/helper_data_models/spare_part/activity_spare_part_model.dart';
@ -257,15 +258,15 @@ class ServiceRequestDetailProvider extends ChangeNotifier {
} }
//upload workorder attachment by engineer.. //upload workorder attachment by engineer..
Future addWorkOrderAttachment({required int woId, required List<File> attachments, required List<WorkOrderAttachments> otherAttachment}) async { Future addWorkOrderAttachment({required int woId, required List<GenericAttachmentModel> attachments, required List<WorkOrderAttachments> otherAttachment}) async {
try { try {
List<WorkOrderAttachments> woAttachments = []; List<WorkOrderAttachments> woAttachments = [];
if (otherAttachment.isNotEmpty) { if (otherAttachment.isNotEmpty) {
woAttachments.addAll(otherAttachment); woAttachments.addAll(otherAttachment);
} }
for (var file in attachments) { for (var file in attachments) {
String fileName = ServiceRequestUtils.isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(File(file.path).readAsBytesSync())}") : file.path; String fileName = ServiceRequestUtils.isLocalUrl(file.name??'') ? ("${file.name??''.split("/").last}|${base64Encode(File(file.name??'').readAsBytesSync())}") :file.name??'';
woAttachments.add(WorkOrderAttachments(id: 0, name: fileName)); woAttachments.add(WorkOrderAttachments(id: file.id, name: fileName,createdBy:file.createdBy));
} }
isLoading = true; isLoading = true;

@ -12,6 +12,7 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/enums/work_order_next_step.dart'; import 'package:test_sa/models/enums/work_order_next_step.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart'; import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.dart';
import 'package:test_sa/models/new_models/work_order_detail_model.dart'; import 'package:test_sa/models/new_models/work_order_detail_model.dart';
import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart';
@ -37,7 +38,7 @@ class ServiceRequestDetailView extends StatefulWidget {
} }
class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> { class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
List<File> _userAttachments = []; List<GenericAttachmentModel> _userAttachments = [];
List<WorkOrderAttachments> _attachments = []; List<WorkOrderAttachments> _attachments = [];
@override @override
@ -47,10 +48,20 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//GenericAttachmentModel(
// id: e.id,
// name: e.name,
// createdBy: e.createdBy,
// // originalName: ,
// localFile: File(e.name ?? ''),
//
// )
UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false); UserProvider _userProvider = Provider.of<UserProvider>(context, listen: false);
return Consumer<ServiceRequestDetailProvider>(builder: (pContext, requestProvider, _) { return Consumer<ServiceRequestDetailProvider>(builder: (pContext, requestProvider, _) {
if (_userProvider.user?.type == UsersTypes.engineer) { if (_userProvider.user?.type == UsersTypes.engineer) {
_userAttachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy == _userProvider.user?.userID).map((e) => File(e.name ?? '')).toList() ?? []; // _userAttachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy == _userProvider.user?.userID).map((e) => File(e.name ?? '')).toList() ?? [];
_userAttachments =
requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy == _userProvider.user?.userID).map((e) => GenericAttachmentModel.fromJson(e.toJson())).toList() ?? [];
_attachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy != _userProvider.user?.userID).toList() ?? []; _attachments = requestProvider.currentWorkOrder?.data?.workOrderAttachments.where((e) => e.createdBy != _userProvider.user?.userID).toList() ?? [];
} else { } else {
//show only nurse attachments //show only nurse attachments
@ -336,19 +347,19 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
"Attachments".addTranslation, "Attachments".addTranslation,
style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50), style: AppTextStyles.heading4.copyWith(color: context.isDark ? AppColor.neutral30 : AppColor.neutral50),
), ),
FilesList(images: _attachments.map((toElement) => URLs.getFileUrl(toElement.name!)??'').toList()), FilesList(images: _attachments.map((toElement) => URLs.getFileUrl(toElement.name!) ?? '').toList()),
], ],
if (!requestProvider.isReadOnlyRequest && workOrder.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[ if (!requestProvider.isReadOnlyRequest && workOrder.nextStep?.workOrderNextStepEnum == WorkOrderNextStepEnum.activity) ...[
8.height, 8.height,
const Divider().defaultStyle(context), const Divider().defaultStyle(context),
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
files: _userAttachments, attachment: _userAttachments,
buttonColor: AppColor.primary10, buttonColor: AppColor.primary10,
onlyImages: false, onlyImages: false,
buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10),
onChange: (attachment) { onChange: (attachment) {
requestProvider.addWorkOrderAttachment(woId: workOrder.requestId!, attachments: _userAttachments, otherAttachment: _attachments); requestProvider.addWorkOrderAttachment(woId: workOrder.requestId!, attachments: attachment, otherAttachment: _attachments);
}, },
), ),
], ],

@ -7,9 +7,11 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart'; import 'package:test_sa/models/helper_data_models/asset_retired/asset_retired_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/new_views/app_style/app_color.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_filled_button.dart';
@ -52,7 +54,7 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final List<File> _files = []; final List<GenericAttachmentModel> attachments = [];
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
@ -103,9 +105,9 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
}, },
), ),
23.height, 23.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
files: _files, attachment: attachments,
buttonIcon: 'image-plus'.toSvgAsset(), buttonIcon: 'image-plus'.toSvgAsset(),
), ),
], ],
@ -119,9 +121,10 @@ class _AssetRetiredState extends State<AssetRetired> with TickerProviderStateMix
loading: requestDetailProvider.isLoading, loading: requestDetailProvider.isLoading,
onPressed: () async { onPressed: () async {
requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments = []; requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments = [];
for (var file in _files) { for (var attachment in attachments) {
String fileName = ServiceRequestUtils.isLocalUrl(attachment.name??'') ? ("${attachment.name??''.split("/").last}|${base64Encode(File(attachment.name??'').readAsBytesSync())}") :attachment.name??'';
requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments requestDetailProvider.assetRetiredHelperModel?.activityAssetToBeRetiredAttachments
?.add(ActivityAssetToBeRetiredAttachments(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); ?.add(ActivityAssetToBeRetiredAttachments(id: attachment.id, name: fileName));
} }
int status = await requestDetailProvider.createActivityAssetToBeRetired(); int status = await requestDetailProvider.createActivityAssetToBeRetired();
if (status == 200) { if (status == 200) {

@ -1,39 +1,41 @@
import 'dart:io'; // import 'dart:io';
import 'package:flutter/material.dart'; // import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; // import 'package:provider/provider.dart';
import 'package:test_sa/controllers/providers/api/service_requests_provider.dart'; // import 'package:test_sa/controllers/providers/api/service_requests_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; // import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; // import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; // import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
class AttachmentView extends StatelessWidget { //TODO need to delete..
const AttachmentView({Key? key}) : super(key: key); // import 'package:test_sa/views/widgets/images/multi_image_picker.dart';
//
@override // class AttachmentView extends StatelessWidget {
Widget build(BuildContext context) { // const AttachmentView({Key? key}) : super(key: key);
//TODO user the same form key everywhere.... //
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); // @override
final List<File> _files = []; // Widget build(BuildContext context) {
return Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) { // //TODO user the same form key everywhere....
serviceRequestProvider.currentSelectedRequest?.visitDate = ''; // final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
return Form( // final List<File> _files = [];
key: _formKey, // return Consumer<ServiceRequestsProvider>(builder: (context, serviceRequestProvider, child) {
child: SingleChildScrollView( // serviceRequestProvider.currentSelectedRequest?.visitDate = '';
child: Column( // return Form(
children: [ // key: _formKey,
MultiFilesPicker( // child: SingleChildScrollView(
label: context.translation.attachImage, // child: Column(
buttonHeight: 108.toScreenHeight, // children: [
buttonIcon: 'image_icon'?.toSvgAsset(), // MultiFilesPicker(
files: _files, // label: context.translation.attachImage,
onlyImages: true, // buttonHeight: 108.toScreenHeight,
), // buttonIcon: 'image_icon'?.toSvgAsset(),
16.height, // files: _files,
], // onlyImages: true,
), // ),
), // 16.height,
); // ],
}); // ),
} // ),
} // );
// });
// }
// }

@ -13,11 +13,13 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/helper_data_models/workorder/work_order_helper_models.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/lookup.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart'; import 'package:test_sa/modules/cm_module/service_request_detail_provider.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/new_views/app_style/app_color.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_filled_button.dart';
@ -52,7 +54,7 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceRequestDetailProvider _requestDetailProvider; late ServiceRequestDetailProvider _requestDetailProvider;
late ServiceRequest _serviceRequest; late ServiceRequest _serviceRequest;
final List<File> _deviceImages = []; final List<GenericAttachmentModel> _deviceImages = [];
final bool _isLoading = false; final bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -72,7 +74,7 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
getInitialData(); getInitialData();
if (_serviceRequestsProvider.currentSelectedRequest != null) { if (_serviceRequestsProvider.currentSelectedRequest != null) {
_serviceRequest = _serviceRequestsProvider.currentSelectedRequest!; _serviceRequest = _serviceRequestsProvider.currentSelectedRequest!;
_deviceImages.addAll(_serviceRequest.devicePhotos!.map((e) => File(e)).toList()); _deviceImages.addAll(_serviceRequest.devicePhotos!.map((e) => GenericAttachmentModel(name: e)).toList());
_showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction?.name == "Need a visit"; _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction?.name == "Need a visit";
if (_showDatePicker && _serviceRequest.visitDate != null) { if (_showDatePicker && _serviceRequest.visitDate != null) {
_dateTime = DateTime.tryParse(_serviceRequest.visitDate!); _dateTime = DateTime.tryParse(_serviceRequest.visitDate!);
@ -154,9 +156,9 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
16.height, 16.height,
assetStatusWidget(context), assetStatusWidget(context),
24.height, 24.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
files: _deviceImages, attachment: _deviceImages,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
@ -351,7 +353,8 @@ class _CreateNewRequestState extends State<CreateNewRequest> with TickerProvider
} }
List<WorkOrderAttachments> attachement = []; List<WorkOrderAttachments> attachement = [];
for (var item in _deviceImages) { for (var item in _deviceImages) {
attachement.add(WorkOrderAttachments(id: 0, name: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
attachement.add(WorkOrderAttachments(id: 0, name: fileName));
} }
_requestDetailProvider.workOrderHelperModel = WorkOrderHelperModel( _requestDetailProvider.workOrderHelperModel = WorkOrderHelperModel(
assetId: _serviceRequest.device?.id, assetId: _serviceRequest.device?.id,

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -46,8 +47,9 @@ class _UpdatePpmState extends State<UpdatePpm> with TickerProviderStateMixin {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
ppmProvider.planPreventiveVisit?.preventiveVisitAttachments = []; ppmProvider.planPreventiveVisit?.preventiveVisitAttachments = [];
for (var item in ppmProvider.ppmPlanAttachments) { for (var item in ppmProvider.ppmPlanAttachments) {
String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
ppmProvider.planPreventiveVisit?.preventiveVisitAttachments ppmProvider.planPreventiveVisit?.preventiveVisitAttachments
?.add(PreventiveVisitAttachments(id: 0, attachmentName: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); ?.add(PreventiveVisitAttachments(id: item.id, attachmentName: fileName));
} }
ppmProvider.planPreventiveVisit?.preventiveVisitTimers = ppmProvider.planPreventiveVisit?.preventiveVisitTimers ?? []; ppmProvider.planPreventiveVisit?.preventiveVisitTimers = ppmProvider.planPreventiveVisit?.preventiveVisitTimers ?? [];

@ -12,6 +12,7 @@ import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/model_definition.dart'; import 'package:test_sa/models/device/model_definition.dart';
import 'package:test_sa/models/device/supplier.dart'; import 'package:test_sa/models/device/supplier.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/department.dart';
@ -51,7 +52,7 @@ class _WoInfoFormState extends State<WoInfoForm> {
PpmProvider ppmProvider = Provider.of<PpmProvider>(context, listen: false); PpmProvider ppmProvider = Provider.of<PpmProvider>(context, listen: false);
if (widget.planPreventiveVisit.preventiveVisitAttachments != null && widget.planPreventiveVisit.preventiveVisitAttachments!.isNotEmpty) { if (widget.planPreventiveVisit.preventiveVisitAttachments != null && widget.planPreventiveVisit.preventiveVisitAttachments!.isNotEmpty) {
ppmProvider.ppmPlanAttachments = []; ppmProvider.ppmPlanAttachments = [];
ppmProvider.ppmPlanAttachments.addAll(widget.planPreventiveVisit.preventiveVisitAttachments!.map((e) => File(e.attachmentName!)).toList()); ppmProvider.ppmPlanAttachments.addAll(widget.planPreventiveVisit.preventiveVisitAttachments!.map((e) => GenericAttachmentModel(id:e.id,name:e.attachmentName!)).toList());
} }
}); });
@ -291,9 +292,9 @@ class _WoInfoFormState extends State<WoInfoForm> {
}, },
), ),
16.height, 16.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachments, label: context.translation.attachments,
files: ppmProvider.ppmPlanAttachments, attachment: ppmProvider.ppmPlanAttachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),

@ -10,12 +10,14 @@ import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/mapped_sites.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart';
import 'package:test_sa/models/new_models/room_model.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_request_model.dart';
import 'package:test_sa/models/new_models/task_request/task_type_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/pending_service_request_model.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/new_views/app_style/app_color.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_filled_button.dart';
@ -41,7 +43,7 @@ class CreateTaskView extends StatefulWidget {
} }
class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStateMixin { class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStateMixin {
final List<File> _deviceImages = []; final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<Asset> _deviceList = []; List<Asset> _deviceList = [];
@ -111,12 +113,17 @@ class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStat
}, },
), ),
23.height, 23.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
files: _deviceImages, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
//verify this if not required delete this ..
onChange: (attachments) {
attachments = attachments;
setState(() {});
},
), ),
], ],
).toShadowContainer(context).paddingAll(16), ).toShadowContainer(context).paddingAll(16),
@ -444,8 +451,9 @@ class _CreateTaskViewState extends State<CreateTaskView> with TickerProviderStat
_addTaskModel!.assetIds?.add(int.parse(device!.id.toString())); _addTaskModel!.assetIds?.add(int.parse(device!.id.toString()));
} }
} }
for (var item in _deviceImages) { for (var item in attachments) {
_addTaskModel?.attachments?.add(TaskJobAttachment(id: 0, name: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); String fileName = ServiceRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
_addTaskModel?.attachments?.add(TaskJobAttachment(id: item.id, name: fileName));
} }
TaskRequestProvider taskRequestProvider = Provider.of<TaskRequestProvider>(context, listen: false); TaskRequestProvider taskRequestProvider = Provider.of<TaskRequestProvider>(context, listen: false);
await taskRequestProvider.addTask(context: context, task: _addTaskModel!); await taskRequestProvider.addTask(context: context, task: _addTaskModel!);

@ -10,6 +10,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/string_extensions.dart'; import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/building.dart'; import 'package:test_sa/models/new_models/building.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/department.dart';
@ -52,7 +53,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
final TextEditingController _requestedQuantityController = TextEditingController(); final TextEditingController _requestedQuantityController = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<File> _files = []; List<GenericAttachmentModel> attachments = [];
bool installationType = true; bool installationType = true;
String comments = ''; String comments = '';
@ -70,7 +71,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
TaskData? taskModel = _taskProvider!.taskRequestModel; TaskData? taskModel = _taskProvider!.taskRequestModel;
_taskProvider?.updateTaskModel(taskModel); _taskProvider?.updateTaskModel(taskModel);
if (taskModel != null) { if (taskModel != null) {
_files.addAll(taskModel.taskJobAttachments!.map((e) => File(e.name ?? '')).toList()); attachments.addAll(taskModel.taskJobAttachments!.map((e) => GenericAttachmentModel(id:e.id,name:e.name ?? '')).toList());
// if (taskModel.taskType?.isInstallation == true) { // if (taskModel.taskType?.isInstallation == true) {
// await _taskProvider!.getSiteData(siteId: taskModel.asset?.siteId); // await _taskProvider!.getSiteData(siteId: taskModel.asset?.siteId);
// } // }
@ -135,9 +136,9 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
onSaved: (value) {}, onSaved: (value) {},
), ),
20.height, 20.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
files: _files, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
@ -188,8 +189,9 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
if (validate(model: taskModel)) { if (validate(model: taskModel)) {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
List<TaskJobAttachment> attachment = []; List<TaskJobAttachment> attachment = [];
for (var item in _files) { for (var item in attachments) {
attachment.add(TaskJobAttachment(id: 0, name: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
attachment.add(TaskJobAttachment(id: item.id, name: fileName));
} }
taskModel?.taskJobAttachments = attachment; taskModel?.taskJobAttachments = attachment;
if (taskModel?.taskTimePicker != null) { if (taskModel?.taskTimePicker != null) {

@ -180,6 +180,8 @@ static Color getActivityTypeTextColor(String type) {
return red30; return red30;
case "canceled": case "canceled":
return red30; return red30;
case "returned":
return red30;
default: default:
return Colors.white; return Colors.white;
} }

@ -11,6 +11,7 @@ import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/new_models/gas_refill_model.dart'; import 'package:test_sa/models/new_models/gas_refill_model.dart';
import 'package:test_sa/models/new_models/mapped_sites.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart';
@ -43,7 +44,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
Lookup? _requestedQuantity; Lookup? _requestedQuantity;
final TextEditingController _commentController = TextEditingController(); final TextEditingController _commentController = TextEditingController();
GasRefillProvider? _gasRefillProvider; GasRefillProvider? _gasRefillProvider;
List<File> _files = []; List<GenericAttachmentModel> attachments = [];
static List<Lookup> gasQuantity = [ static List<Lookup> gasQuantity = [
Lookup(name: "1", id: 1, value: 1), Lookup(name: "1", id: 1, value: 1),
@ -213,9 +214,9 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
onSaved: (value) {}, onSaved: (value) {},
), ),
8.height, 8.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
files: _files, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
@ -235,9 +236,10 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
_gasModel.gasRefillDetails = []; _gasModel.gasRefillDetails = [];
_gasModel.gasRefillDetails?.add(_currentDetails); _gasModel.gasRefillDetails?.add(_currentDetails);
_gasModel.gasRefillAttachments = []; _gasModel.gasRefillAttachments = [];
for (var item in _files) { for (var item in attachments) {
String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
_gasModel.gasRefillAttachments?.add(GasRefillAttachments( _gasModel.gasRefillAttachments?.add(GasRefillAttachments(
id: 0, gasRefillId: _gasModel.id ?? 0, attachmentName: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); id: item.id, gasRefillId: _gasModel.id ?? 0, attachmentName: fileName));
} }
await _gasRefillProvider?.addGasRefillRequest( await _gasRefillProvider?.addGasRefillRequest(
context: context, context: context,
@ -380,7 +382,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
// Lookup? _requestedQuantity; // Lookup? _requestedQuantity;
// final TextEditingController _commentController = TextEditingController(); // final TextEditingController _commentController = TextEditingController();
// GasRefillProvider? _gasRefillProvider; // GasRefillProvider? _gasRefillProvider;
// List<File> _files = []; // List<File> attachments = [];
// //
// static List<Lookup> gasQuantity = [ // static List<Lookup> gasQuantity = [
// Lookup(name: "1", id: 1, value: 1), // Lookup(name: "1", id: 1, value: 1),
@ -397,7 +399,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
// _currentDetails = widget.gasRefillDetails ?? GasRefillDetails(); // _currentDetails = widget.gasRefillDetails ?? GasRefillDetails();
// _gasModel = widget.gasModel ?? GasRefillModel(gasRefillDetails: []); // _gasModel = widget.gasModel ?? GasRefillModel(gasRefillDetails: []);
// if (_gasModel.gasRefillAttachments != null && _gasModel.gasRefillAttachments!.isNotEmpty) { // if (_gasModel.gasRefillAttachments != null && _gasModel.gasRefillAttachments!.isNotEmpty) {
// _files.addAll(_gasModel.gasRefillAttachments!.map((e) => File(e.attachmentName!)).toList()); // attachments.addAll(_gasModel.gasRefillAttachments!.map((e) => File(e.attachmentName!)).toList());
// } // }
// if (widget.gasRefillDetails != null && widget.gasRefillDetails?.requestedQty != null) { // if (widget.gasRefillDetails != null && widget.gasRefillDetails?.requestedQty != null) {
// _requestedQuantity = Lookup(name: "1", id: 1, value: int.parse(widget.gasRefillDetails!.requestedQty!.toStringAsFixed(0))); // _requestedQuantity = Lookup(name: "1", id: 1, value: int.parse(widget.gasRefillDetails!.requestedQty!.toStringAsFixed(0)));
@ -561,7 +563,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
// 8.height, // 8.height,
// MultiFilesPicker( // MultiFilesPicker(
// label: context.translation.attachFiles, // label: context.translation.attachFiles,
// files: _files, // files: attachments,
// buttonColor: AppColor.black10, // buttonColor: AppColor.black10,
// onlyImages: false, // onlyImages: false,
// buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), // buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
@ -582,7 +584,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
// _gasModel.gasRefillDetails = []; // _gasModel.gasRefillDetails = [];
// _gasModel.gasRefillDetails?.add(_currentDetails); // _gasModel.gasRefillDetails?.add(_currentDetails);
// _gasModel.gasRefillAttachments = []; // _gasModel.gasRefillAttachments = [];
// for (var item in _files) { // for (var item in attachments) {
// _gasModel.gasRefillAttachments?.add(GasRefillAttachments( // _gasModel.gasRefillAttachments?.add(GasRefillAttachments(
// id: 0, gasRefillId: _gasModel.id ?? 0, attachmentName: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); // id: 0, gasRefillId: _gasModel.id ?? 0, attachmentName: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path));
// } // }

@ -14,9 +14,11 @@ import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/enums/user_types.dart'; import 'package:test_sa/models/enums/user_types.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/new_models/department.dart'; import 'package:test_sa/models/new_models/department.dart';
import 'package:test_sa/models/new_models/floor.dart'; import 'package:test_sa/models/new_models/floor.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
@ -49,7 +51,7 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
Asset _assetDestination = Asset(); Asset _assetDestination = Asset();
Asset? _pickedAsset; Asset? _pickedAsset;
final List<File> _deviceImages = []; final List<GenericAttachmentModel> attachments = [];
bool isInternal = true; bool isInternal = true;
PendingAssetServiceRequest? pendingAssetServiceRequest; PendingAssetServiceRequest? pendingAssetServiceRequest;
@ -77,8 +79,9 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
} }
_formKey.currentState!.save(); _formKey.currentState!.save();
List<AssetTransferAttachment> attachement = []; List<AssetTransferAttachment> attachement = [];
for (var item in _deviceImages) { for (var item in attachments) {
attachement.add(AssetTransferAttachment(id: 0, attachmentName: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
attachement.add(AssetTransferAttachment(id: item.id, attachmentName: fileName));
} }
_transferModel.attachments = attachement; _transferModel.attachments = attachement;
@ -236,9 +239,9 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
), ),
8.height, 8.height,
23.height, 23.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachImage, label: context.translation.attachImage,
files: _deviceImages, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),

@ -13,6 +13,7 @@ import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/helper/utils.dart'; import 'package:test_sa/helper/utils.dart';
import 'package:test_sa/models/device/asset_transfer_attachment.dart'; import 'package:test_sa/models/device/asset_transfer_attachment.dart';
import 'package:test_sa/models/device/device_transfer.dart'; import 'package:test_sa/models/device/device_transfer.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/new_models/assigned_employee.dart'; import 'package:test_sa/models/new_models/assigned_employee.dart';
import 'package:test_sa/models/new_models/assistant_employee.dart'; import 'package:test_sa/models/new_models/assistant_employee.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
@ -53,7 +54,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<File> _files = []; List<GenericAttachmentModel> attachments = [];
_update({required int status}) async { _update({required int status}) async {
_formKey.currentState!.save(); _formKey.currentState!.save();
@ -110,13 +111,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers; _formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers;
} }
try { try {
for (var file in _files) { for (var item in attachments) {
String attachmentName = file.path; String fileName = ServiceRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? '';
if (attachmentName.contains("/")) { _formModel.assetTransferAttachments!.add(AssetTransferAttachment(id: item.id, attachmentName: fileName));
attachmentName = file.path.split("/").last;
attachmentName = "$attachmentName|${base64Encode(file.readAsBytesSync())}";
}
_formModel.assetTransferAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName));
_formModel.attachments = _formModel.assetTransferAttachments; _formModel.attachments = _formModel.assetTransferAttachments;
} }
} catch (error) { } catch (error) {
@ -202,7 +199,7 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
@override @override
void initState() { void initState() {
_formModel.fromDetails(widget.model); _formModel.fromDetails(widget.model);
_files = widget.model.assetTransferAttachments?.map((e) => File(e.attachmentName!)).toList() ?? []; attachments = widget.model.assetTransferAttachments?.map((e) => GenericAttachmentModel(id: e.id?.toInt()??0, name: e.attachmentName!)).toList() ?? [];
super.initState(); super.initState();
} }
@ -262,9 +259,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
}, },
), ),
8.height, 8.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
files: _files, attachment: attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),
@ -275,9 +272,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
16.height, 16.height,
DeviceTransferAssistantEmployeeList( DeviceTransferAssistantEmployeeList(
assetId: _formModel.assetId, assetId: _formModel.assetId,
createdDate: _formModel.createdDate??'', createdDate: _formModel.createdDate ?? '',
assistantEmployeeList: widget.isSender?_formModel.assetTransferAssistantEmployeesSender:_formModel.assetTransferAssistantEmployeesReceiver, assistantEmployeeList: widget.isSender ? _formModel.assetTransferAssistantEmployeesSender : _formModel.assetTransferAssistantEmployeesReceiver,
cardPadding: 0, cardPadding: 0,
onListChanged: (updatedList) { onListChanged: (updatedList) {
setState(() { setState(() {
_formModel.assistantEmployList = updatedList; _formModel.assistantEmployList = updatedList;
@ -381,16 +378,12 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
} }
} }
class DeviceTransferAssistantEmployeeList extends StatefulWidget { class DeviceTransferAssistantEmployeeList extends StatefulWidget {
final List<AssetTransferAssistantEmployees>? assistantEmployeeList; final List<AssetTransferAssistantEmployees>? assistantEmployeeList;
final ValueChanged<List<AssetTransferAssistantEmployees>>? onListChanged; final ValueChanged<List<AssetTransferAssistantEmployees>>? onListChanged;
final double ?cardPadding; final double? cardPadding;
final dynamic assetId; final dynamic assetId;
final String createdDate; final String createdDate;
const DeviceTransferAssistantEmployeeList({ const DeviceTransferAssistantEmployeeList({
super.key, super.key,
@ -444,7 +437,7 @@ class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssi
itemCount: _list.length + 1, itemCount: _list.length + 1,
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.all(widget.cardPadding??16), padding: EdgeInsets.all(widget.cardPadding ?? 16),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == _list.length) { if (index == _list.length) {
return AppFilledButton( return AppFilledButton(
@ -463,7 +456,7 @@ class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssi
id: _list[index].employeeId, id: _list[index].employeeId,
name: _list[index].employeeName, name: _list[index].employeeName,
); );
selectedEmployee = AssistantEmployees( userId: assignedUser.id, user: assignedUser); selectedEmployee = AssistantEmployees(userId: assignedUser.id, user: assignedUser);
return EmployeeCard( return EmployeeCard(
model: _list[index], model: _list[index],
assetId: widget.assetId, assetId: widget.assetId,
@ -479,17 +472,18 @@ class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssi
} }
} }
class EmployeeCard extends StatelessWidget { class EmployeeCard extends StatelessWidget {
final AssetTransferAssistantEmployees model; final AssetTransferAssistantEmployees model;
final int index; final int index;
final dynamic assetId ; final dynamic assetId;
final String ? createdDate;
final String? createdDate;
AssistantEmployees? selectedEmployee; AssistantEmployees? selectedEmployee;
final void Function(void Function(AssetTransferAssistantEmployees model)) onUpdate; final void Function(void Function(AssetTransferAssistantEmployees model)) onUpdate;
final VoidCallback onRemove; final VoidCallback onRemove;
final TextEditingController workingHoursController; final TextEditingController workingHoursController;
EmployeeCard({
EmployeeCard({
super.key, super.key,
required this.model, required this.model,
required this.assetId, required this.assetId,
@ -504,19 +498,18 @@ class EmployeeCard extends StatelessWidget {
// AssistantEmployees selectedEmployee = AssistantEmployees(); // AssistantEmployees selectedEmployee = AssistantEmployees();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column( return Column(
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20), context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20),
Container( Container(
height: 32, height: 32,
width: 32, width: 32,
padding: const EdgeInsets.all(6), padding: const EdgeInsets.all(6),
child: "trash".toSvgAsset(height: 20, width: 20), child: "trash".toSvgAsset(height: 20, width: 20),
).onPress(onRemove), ).onPress(onRemove),
], ],
), ),
8.height, 8.height,
@ -526,7 +519,7 @@ class EmployeeCard extends StatelessWidget {
ServiceReportAssistantEmployeeMenu( ServiceReportAssistantEmployeeMenu(
title: context.translation.select, title: context.translation.select,
backgroundColor: AppColor.neutral100, backgroundColor: AppColor.neutral100,
assetId:assetId, assetId: assetId,
initialValue: selectedEmployee, initialValue: selectedEmployee,
onSelect: (employee) { onSelect: (employee) {
if (employee != null) { if (employee != null) {
@ -665,8 +658,7 @@ class EmployeeCard extends StatelessWidget {
], ],
) )
], ],
).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12)) ).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12)).paddingOnly(bottom: 12);
.paddingOnly(bottom: 12);
} }
} }

@ -11,6 +11,7 @@ import 'package:test_sa/controllers/providers/api/user_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/lookup.dart'; import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/models/timer_model.dart'; import 'package:test_sa/models/timer_model.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart'; import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
@ -56,7 +57,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
bool _firstTime = true; bool _firstTime = true;
Lookup? _deliveredQuantity; Lookup? _deliveredQuantity;
List<File> _attachments = []; List<GenericAttachmentModel> _attachments = [];
static List<Lookup> deliveredQuantity = [ static List<Lookup> deliveredQuantity = [
Lookup(name: "1", id: 1, value: 1), Lookup(name: "1", id: 1, value: 1),
@ -82,7 +83,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
} catch (ex) {} } catch (ex) {}
} }
if (_formModel.gasRefillAttachments != null && _formModel.gasRefillAttachments!.isNotEmpty) { if (_formModel.gasRefillAttachments != null && _formModel.gasRefillAttachments!.isNotEmpty) {
_attachments.addAll(_formModel.gasRefillAttachments!.map((e) => File(e.attachmentName!)).toList()); _attachments.addAll(_formModel.gasRefillAttachments!.map((e) => GenericAttachmentModel(id:e.id,name:e.attachmentName!)).toList());
} }
} }
@ -153,8 +154,9 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
}); });
_formModel.gasRefillAttachments = []; _formModel.gasRefillAttachments = [];
for (var item in _attachments) { for (var item in _attachments) {
String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
_formModel.gasRefillAttachments?.add(GasRefillAttachments( _formModel.gasRefillAttachments?.add(GasRefillAttachments(
id: 0, gasRefillId: _formModel.id ?? 0, attachmentName: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); id: item.id, gasRefillId: _formModel.id ?? 0, attachmentName: fileName));
} }
await _gasRefillProvider?.updateGasRefill(status: status, model: _formModel).then((success) { await _gasRefillProvider?.updateGasRefill(status: status, model: _formModel).then((success) {
@ -258,9 +260,9 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
onSaved: (value) {}, onSaved: (value) {},
), ),
16.height, 16.height,
MultiFilesPicker( AttachmentPicker(
label: context.translation.attachFiles, label: context.translation.attachFiles,
files: _attachments, attachment: _attachments,
buttonColor: AppColor.black10, buttonColor: AppColor.black10,
onlyImages: false, onlyImages: false,
buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120),

@ -10,8 +10,10 @@ import 'package:test_sa/controllers/providers/settings/setting_provider.dart';
import 'package:test_sa/extensions/context_extension.dart'; import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/service_request/pending_service_request_model.dart'; import 'package:test_sa/models/service_request/pending_service_request_model.dart';
import 'package:test_sa/models/service_request/service_request.dart'; import 'package:test_sa/models/service_request/service_request.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart';
@ -45,7 +47,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
late SettingProvider _settingProvider; late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceRequest _serviceRequest; late ServiceRequest _serviceRequest;
final List<File> _deviceImages = []; final List<GenericAttachmentModel> attachments = [];
final bool _isLoading = false; final bool _isLoading = false;
bool _showDatePicker = false; bool _showDatePicker = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -59,7 +61,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
_commentController = TextEditingController(); _commentController = TextEditingController();
if (widget.serviceRequest != null) { if (widget.serviceRequest != null) {
_serviceRequest = widget.serviceRequest!; _serviceRequest = widget.serviceRequest!;
_deviceImages.addAll(_serviceRequest.devicePhotos!.map((e) => File(e)).toList()); attachments.addAll(_serviceRequest.devicePhotos!.map((e) => GenericAttachmentModel(name: e)).toList());
_showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction?.name == "Need a visit"; _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction?.name == "Need a visit";
if (_showDatePicker && _serviceRequest.visitDate != null) { if (_showDatePicker && _serviceRequest.visitDate != null) {
_dateTime = DateTime.tryParse(_serviceRequest.visitDate!); _dateTime = DateTime.tryParse(_serviceRequest.visitDate!);
@ -77,7 +79,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
// ServiceRequest request = await _serviceRequestsProvider.getServiceRequestObjectById(requestId: id) ?? ""; // ServiceRequest request = await _serviceRequestsProvider.getServiceRequestObjectById(requestId: id) ?? "";
// _serviceRequest = request; // _serviceRequest = request;
// _device = _serviceRequest.device; // _device = _serviceRequest.device;
// _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) { // attachments.addAll(_serviceRequest.devicePhotos.map((e) {
// return File(e); // return File(e);
// }).toList()); // }).toList());
// _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; // _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit";
@ -244,7 +246,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
); );
}), }),
16.height, 16.height,
MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages, showAsGrid: true), AttachmentPicker(label: context.translation.attachImage, attachment: attachments, showAsGrid: true),
], ],
).toShadowContainer(context), ).toShadowContainer(context),
@ -386,7 +388,8 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
// return; // return;
// } // }
_serviceRequest.devicePhotos = _deviceImages.map((e) => _isLocalUrl(e.path) ? "${e.path.split("/").last}|${base64Encode(e.readAsBytesSync())}" : e.path).toList();
_serviceRequest.devicePhotos = attachments.map((item) => ServiceRequestUtils.isLocalUrl(item.name??'') ? "${item.name?.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}" : item.name??'').toList();
if (_serviceRequest.audio != null) { if (_serviceRequest.audio != null) {
if (_isLocalUrl(_serviceRequest.audio!)) { if (_isLocalUrl(_serviceRequest.audio!)) {
final File file = File(_serviceRequest.audio!); final File file = File(_serviceRequest.audio!);

@ -14,8 +14,10 @@ import 'package:test_sa/extensions/string_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/device/asset.dart'; import 'package:test_sa/models/device/asset.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/models/service_request/service_report.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.dart';
import 'package:test_sa/modules/cm_module/utilities/service_request_utils.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/equipment_status_provider.dart';
import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart'; import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart';
@ -61,7 +63,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
bool _isLoading = false; bool _isLoading = false;
List<SparePart> _spareParts = []; List<SparePart> _spareParts = [];
final List<File> _files = []; final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>(); final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _faultController = TextEditingController(); final TextEditingController _faultController = TextEditingController();
@ -363,7 +365,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
}, },
), ),
8.height, 8.height,
MultiFilesPicker(label: context.translation.attachImage, files: _files), AttachmentPicker(label: context.translation.attachImage, attachment: attachments),
8.height, 8.height,
ESignature( ESignature(
title: context.translation.engSign, title: context.translation.engSign,
@ -407,9 +409,10 @@ class _CreateServiceReportState extends State<CreateServiceReport> with TickerPr
} }
_formKey.currentState!.save(); _formKey.currentState!.save();
_serviceReport.attachmentsWorkOrder ??= []; _serviceReport.attachmentsWorkOrder ??= [];
if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; if (attachments.isEmpty) _serviceReport.attachmentsWorkOrder = [];
for (var file in _files) { for (var item in attachments) {
_serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); String fileName = ServiceRequestUtils.isLocalUrl(item.name??'') ? ("${item.name??''.split("/").last}|${base64Encode(File(item.name??'').readAsBytesSync())}") :item.name??'';
_serviceReport.attachmentsWorkOrder!.add(Attachment(id: item.id, name: fileName));
} }
final user = Provider.of<UserProvider>(context, listen: false).user!; final user = Provider.of<UserProvider>(context, listen: false).user!;
await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: widget.request, user: user); await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: widget.request, user: user);

@ -8,6 +8,7 @@ import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart';
import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart';
import 'package:test_sa/models/generic_attachment_model.dart';
import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/app_style/app_color.dart';
import '../../../new_views/common_widgets/app_dashed_button.dart'; import '../../../new_views/common_widgets/app_dashed_button.dart';
@ -17,7 +18,7 @@ class MultiFilesPicker extends StatefulWidget {
final String label; final String label;
final bool error; final bool error;
final List<File> files; final List<File> files;
final List<AttachmentModel> attachment; final List<GenericAttachmentModel> attachment;
final bool enabled, onlyImages; final bool enabled, onlyImages;
double? buttonHeight; double? buttonHeight;
@ -29,7 +30,7 @@ class MultiFilesPicker extends StatefulWidget {
MultiFilesPicker( MultiFilesPicker(
{Key? key, {Key? key,
this.files = const <File>[], this.files = const <File>[],
this.attachment = const <AttachmentModel>[], this.attachment = const <GenericAttachmentModel>[],
required this.label, required this.label,
this.error = false, this.error = false,
this.buttonHeight, this.buttonHeight,
@ -311,18 +312,18 @@ class AttachmentModel {
class AttachmentPicker extends StatefulWidget { class AttachmentPicker extends StatefulWidget {
final String label; final String label;
final bool error; final bool error;
final List<AttachmentModel> attachment; final List<GenericAttachmentModel> attachment;
final bool enabled, onlyImages; final bool enabled, onlyImages;
double? buttonHeight; double? buttonHeight;
Widget? buttonIcon; Widget? buttonIcon;
Color? buttonColor; Color? buttonColor;
final Function(List<AttachmentModel>)? onChange; final Function(List<GenericAttachmentModel>)? onChange;
final bool showAsGrid; final bool showAsGrid;
AttachmentPicker( AttachmentPicker(
{Key? key, {Key? key,
this.attachment = const <AttachmentModel>[], this.attachment = const <GenericAttachmentModel>[],
required this.label, required this.label,
this.error = false, this.error = false,
this.buttonHeight, this.buttonHeight,
@ -361,7 +362,7 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
children: List.generate( children: List.generate(
widget.attachment.length, widget.attachment.length,
(index) { (index) {
File image = widget.attachment[index].file!; File image = File(widget.attachment[index].name!);
return MultiFilesPickerItem( return MultiFilesPickerItem(
file: image, file: image,
enabled: widget.enabled, enabled: widget.enabled,
@ -369,7 +370,7 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
if (!widget.enabled) { if (!widget.enabled) {
return; return;
} }
widget.attachment.remove(image); widget.attachment.removeAt(index);
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange!(widget.attachment); widget.onChange!(widget.attachment);
} }
@ -391,7 +392,10 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
); );
if (result != null) { if (result != null) {
for (var path in result.paths) { for (var path in result.paths) {
widget.attachment.add(AttachmentModel(0, File(path!))); widget.attachment.add(GenericAttachmentModel(id: 0,name: File(path!).path));
}
if (widget.onChange != null) {
widget.onChange!(widget.attachment);
} }
setState(() {}); setState(() {});
} }
@ -440,7 +444,7 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
if (pickedFile != null) { if (pickedFile != null) {
File fileImage = File(pickedFile.path); File fileImage = File(pickedFile.path);
widget.attachment.add(AttachmentModel(0, fileImage)); widget.attachment.add(GenericAttachmentModel(id: 0,name: fileImage.path));
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange!(widget.attachment); widget.onChange!(widget.attachment);
} }
@ -562,7 +566,7 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
if (pickedFile != null) { if (pickedFile != null) {
File fileImage = File(pickedFile.path); File fileImage = File(pickedFile.path);
widget.attachment.add(AttachmentModel(0, fileImage)); widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path));
if (widget.onChange != null) { if (widget.onChange != null) {
widget.onChange!(widget.attachment); widget.onChange!(widget.attachment);
} }

@ -67,7 +67,7 @@ class MultiFilesPickerItem extends StatelessWidget {
} else if (_isLocalUrl(file.path)) { } else if (_isLocalUrl(file.path)) {
OpenFile.open(file.path); OpenFile.open(file.path);
} else { } else {
if (!await launchUrl(Uri.parse(file.path), mode: LaunchMode.externalApplication)) { if (!await launchUrl(Uri.parse(URLs.getFileUrl(file.path)!), mode: LaunchMode.externalApplication)) {
Fluttertoast.showToast(msg: "UnExpected Error with file."); Fluttertoast.showToast(msg: "UnExpected Error with file.");
throw Exception('Could not launch'); throw Exception('Could not launch');
} }

@ -72,7 +72,7 @@ class _MultiFilesPickerState extends State<NewMultiFilesPicker> {
children: List.generate( children: List.generate(
widget.files!.length, widget.files!.length,
(index) { (index) {
File image = widget.files![index].file; File image = widget.files[index].file;
return MultiFilesPickerItem( return MultiFilesPickerItem(
file: image, file: image,
enabled: widget.enabled, enabled: widget.enabled,

Loading…
Cancel
Save