diff --git a/lib/controllers/providers/api/ppm_provider.dart b/lib/controllers/providers/api/ppm_provider.dart index 900f88bc..81a7e066 100644 --- a/lib/controllers/providers/api/ppm_provider.dart +++ b/lib/controllers/providers/api/ppm_provider.dart @@ -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/urls.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/ppm/ppm.dart'; import 'package:test_sa/models/ppm/ppm_search.dart'; @@ -38,11 +39,11 @@ class PpmProvider extends ChangeNotifier { notifyListeners(); } - List _ppmPlanAttachments = []; + List _ppmPlanAttachments = []; - List get ppmPlanAttachments => _ppmPlanAttachments; + List get ppmPlanAttachments => _ppmPlanAttachments; - set ppmPlanAttachments(List value) { + set ppmPlanAttachments(List value) { _ppmPlanAttachments = value; notifyListeners(); } diff --git a/lib/models/generic_attachment_model.dart b/lib/models/generic_attachment_model.dart new file mode 100644 index 00000000..1d3cd5ea --- /dev/null +++ b/lib/models/generic_attachment_model.dart @@ -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 json) { + print('created by here is ${json['createdBy']}'); + id = json['id']; + name = json['name']; + createdBy = json['createdBy']; + originalName = json['originalName']; + } + + Map toJson() { + final Map data = {}; + data['id'] = id; + data['name'] = name; + data['createdBy'] = createdBy; + data['originalName'] = originalName; + return data; + } +} \ No newline at end of file diff --git a/lib/models/helper_data_models/workorder/work_order_helper_models.dart b/lib/models/helper_data_models/workorder/work_order_helper_models.dart index 76bf3767..b15924d6 100644 --- a/lib/models/helper_data_models/workorder/work_order_helper_models.dart +++ b/lib/models/helper_data_models/workorder/work_order_helper_models.dart @@ -53,7 +53,7 @@ class WorkOrderHelperModel { } class WorkOrderAttachments { - WorkOrderAttachments({this.id, this.name}); + WorkOrderAttachments({this.id, this.name,this.createdBy}); int? id; String? name; diff --git a/lib/modules/cm_module/service_request_detail_provider.dart b/lib/modules/cm_module/service_request_detail_provider.dart index 743dad6a..5a40ccd8 100644 --- a/lib/modules/cm_module/service_request_detail_provider.dart +++ b/lib/modules/cm_module/service_request_detail_provider.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:http/src/response.dart'; import 'package:test_sa/controllers/api_routes/api_manager.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/maintenance_request/activity_maintenance_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.. - Future addWorkOrderAttachment({required int woId, required List attachments, required List otherAttachment}) async { + Future addWorkOrderAttachment({required int woId, required List attachments, required List otherAttachment}) async { try { List woAttachments = []; if (otherAttachment.isNotEmpty) { woAttachments.addAll(otherAttachment); } for (var file in attachments) { - String fileName = ServiceRequestUtils.isLocalUrl(file.path) ? ("${file.path.split("/").last}|${base64Encode(File(file.path).readAsBytesSync())}") : file.path; - woAttachments.add(WorkOrderAttachments(id: 0, name: fileName)); + String fileName = ServiceRequestUtils.isLocalUrl(file.name??'') ? ("${file.name??''.split("/").last}|${base64Encode(File(file.name??'').readAsBytesSync())}") :file.name??''; + woAttachments.add(WorkOrderAttachments(id: file.id, name: fileName,createdBy:file.createdBy)); } isLoading = true; diff --git a/lib/modules/cm_module/views/components/service_request_detail_view.dart b/lib/modules/cm_module/views/components/service_request_detail_view.dart index b366a1ce..52ee941e 100644 --- a/lib/modules/cm_module/views/components/service_request_detail_view.dart +++ b/lib/modules/cm_module/views/components/service_request_detail_view.dart @@ -12,6 +12,7 @@ import 'package:test_sa/extensions/text_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/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/new_models/work_order_detail_model.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 { - List _userAttachments = []; + List _userAttachments = []; List _attachments = []; @override @@ -47,10 +48,20 @@ class _ServiceRequestDetailViewState extends State { @override Widget build(BuildContext context) { + //GenericAttachmentModel( + // id: e.id, + // name: e.name, + // createdBy: e.createdBy, + // // originalName: , + // localFile: File(e.name ?? ''), + // + // ) UserProvider _userProvider = Provider.of(context, listen: false); return Consumer(builder: (pContext, requestProvider, _) { 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() ?? []; } else { //show only nurse attachments @@ -336,19 +347,19 @@ class _ServiceRequestDetailViewState extends State { "Attachments".addTranslation, 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) ...[ 8.height, const Divider().defaultStyle(context), - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachments, - files: _userAttachments, + attachment: _userAttachments, buttonColor: AppColor.primary10, onlyImages: false, buttonIcon: 'quotation_icon'.toSvgAsset(color: AppColor.primary10), onChange: (attachment) { - requestProvider.addWorkOrderAttachment(woId: workOrder.requestId!, attachments: _userAttachments, otherAttachment: _attachments); + requestProvider.addWorkOrderAttachment(woId: workOrder.requestId!, attachments: attachment, otherAttachment: _attachments); }, ), ], diff --git a/lib/modules/cm_module/views/forms/asset_retired/asset_retired.dart b/lib/modules/cm_module/views/forms/asset_retired/asset_retired.dart index 283ed269..0ef11bed 100644 --- a/lib/modules/cm_module/views/forms/asset_retired/asset_retired.dart +++ b/lib/modules/cm_module/views/forms/asset_retired/asset_retired.dart @@ -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/text_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/lookup.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/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; @@ -52,7 +54,7 @@ class _AssetRetiredState extends State with TickerProviderStateMix @override Widget build(BuildContext context) { - final List _files = []; + final List attachments = []; return Scaffold( key: _scaffoldKey, @@ -103,9 +105,9 @@ class _AssetRetiredState extends State with TickerProviderStateMix }, ), 23.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachFiles, - files: _files, + attachment: attachments, buttonIcon: 'image-plus'.toSvgAsset(), ), ], @@ -119,9 +121,10 @@ class _AssetRetiredState extends State with TickerProviderStateMix loading: requestDetailProvider.isLoading, onPressed: () async { 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 - ?.add(ActivityAssetToBeRetiredAttachments(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + ?.add(ActivityAssetToBeRetiredAttachments(id: attachment.id, name: fileName)); } int status = await requestDetailProvider.createActivityAssetToBeRetired(); if (status == 200) { diff --git a/lib/modules/cm_module/views/forms/work_order/components/attachments_view.dart b/lib/modules/cm_module/views/forms/work_order/components/attachments_view.dart index 297a0fd3..253c2d31 100644 --- a/lib/modules/cm_module/views/forms/work_order/components/attachments_view.dart +++ b/lib/modules/cm_module/views/forms/work_order/components/attachments_view.dart @@ -1,39 +1,41 @@ -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/extensions/context_extension.dart'; -import 'package:test_sa/extensions/int_extensions.dart'; -import 'package:test_sa/extensions/text_extensions.dart'; -import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +// 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/extensions/context_extension.dart'; +// import 'package:test_sa/extensions/int_extensions.dart'; +// import 'package:test_sa/extensions/text_extensions.dart'; -class AttachmentView extends StatelessWidget { - const AttachmentView({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - //TODO user the same form key everywhere.... - final GlobalKey _formKey = GlobalKey(); - final List _files = []; - return Consumer(builder: (context, serviceRequestProvider, child) { - serviceRequestProvider.currentSelectedRequest?.visitDate = ''; - return Form( - key: _formKey, - child: SingleChildScrollView( - child: Column( - children: [ - MultiFilesPicker( - label: context.translation.attachImage, - buttonHeight: 108.toScreenHeight, - buttonIcon: 'image_icon'?.toSvgAsset(), - files: _files, - onlyImages: true, - ), - 16.height, - ], - ), - ), - ); - }); - } -} +//TODO need to delete.. +// import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; +// +// class AttachmentView extends StatelessWidget { +// const AttachmentView({Key? key}) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// //TODO user the same form key everywhere.... +// final GlobalKey _formKey = GlobalKey(); +// final List _files = []; +// return Consumer(builder: (context, serviceRequestProvider, child) { +// serviceRequestProvider.currentSelectedRequest?.visitDate = ''; +// return Form( +// key: _formKey, +// child: SingleChildScrollView( +// child: Column( +// children: [ +// MultiFilesPicker( +// label: context.translation.attachImage, +// buttonHeight: 108.toScreenHeight, +// buttonIcon: 'image_icon'?.toSvgAsset(), +// files: _files, +// onlyImages: true, +// ), +// 16.height, +// ], +// ), +// ), +// ); +// }); +// } +// } diff --git a/lib/modules/cm_module/views/nurse/create_new_request_view.dart b/lib/modules/cm_module/views/nurse/create_new_request_view.dart index 6c276072..4f18a203 100644 --- a/lib/modules/cm_module/views/nurse/create_new_request_view.dart +++ b/lib/modules/cm_module/views/nurse/create_new_request_view.dart @@ -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/widget_extensions.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/lookup.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/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/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; @@ -52,7 +54,7 @@ class _CreateNewRequestState extends State with TickerProvider late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequestDetailProvider _requestDetailProvider; late ServiceRequest _serviceRequest; - final List _deviceImages = []; + final List _deviceImages = []; final bool _isLoading = false; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); @@ -72,7 +74,7 @@ class _CreateNewRequestState extends State with TickerProvider getInitialData(); if (_serviceRequestsProvider.currentSelectedRequest != null) { _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"; if (_showDatePicker && _serviceRequest.visitDate != null) { _dateTime = DateTime.tryParse(_serviceRequest.visitDate!); @@ -154,9 +156,9 @@ class _CreateNewRequestState extends State with TickerProvider 16.height, assetStatusWidget(context), 24.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachImage, - files: _deviceImages, + attachment: _deviceImages, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), @@ -351,7 +353,8 @@ class _CreateNewRequestState extends State with TickerProvider } List attachement = []; 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( assetId: _serviceRequest.device?.id, diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart b/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart index 16899bb9..08156206 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/update_ppm.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -46,8 +47,9 @@ class _UpdatePpmState extends State with TickerProviderStateMixin { showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading()); ppmProvider.planPreventiveVisit?.preventiveVisitAttachments = []; 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 - ?.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 ?? []; diff --git a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart index 0e12c5dc..a010f25c 100644 --- a/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart +++ b/lib/modules/pm_module/ppm_wo/update_ppm/wo_info_form.dart @@ -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/model_definition.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/new_models/building.dart'; import 'package:test_sa/models/new_models/department.dart'; @@ -51,7 +52,7 @@ class _WoInfoFormState extends State { PpmProvider ppmProvider = Provider.of(context, listen: false); if (widget.planPreventiveVisit.preventiveVisitAttachments != null && widget.planPreventiveVisit.preventiveVisitAttachments!.isNotEmpty) { 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 { }, ), 16.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachments, - files: ppmProvider.ppmPlanAttachments, + attachment: ppmProvider.ppmPlanAttachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), diff --git a/lib/modules/tm_module/tasks_wo/create_task_view.dart b/lib/modules/tm_module/tasks_wo/create_task_view.dart index 95b9d17a..6b60eea0 100644 --- a/lib/modules/tm_module/tasks_wo/create_task_view.dart +++ b/lib/modules/tm_module/tasks_wo/create_task_view.dart @@ -10,12 +10,14 @@ 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/generic_attachment_model.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/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/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/new_views/app_style/app_color.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 with TickerProviderStateMixin { - final List _deviceImages = []; + final List attachments = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); List _deviceList = []; @@ -111,12 +113,17 @@ class _CreateTaskViewState extends State with TickerProviderStat }, ), 23.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachImage, - files: _deviceImages, + attachment: attachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), + //verify this if not required delete this .. + onChange: (attachments) { + attachments = attachments; + setState(() {}); + }, ), ], ).toShadowContainer(context).paddingAll(16), @@ -444,8 +451,9 @@ class _CreateTaskViewState extends State with TickerProviderStat _addTaskModel!.assetIds?.add(int.parse(device!.id.toString())); } } - for (var item in _deviceImages) { - _addTaskModel?.attachments?.add(TaskJobAttachment(id: 0, name: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); + for (var item in attachments) { + 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(context, listen: false); await taskRequestProvider.addTask(context: context, task: _addTaskModel!); 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 4bae9bd5..08070b76 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 @@ -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/text_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/new_models/building.dart'; import 'package:test_sa/models/new_models/department.dart'; @@ -52,7 +53,7 @@ class _UpdateTaskRequestState extends State { final TextEditingController _requestedQuantityController = TextEditingController(); final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - List _files = []; + List attachments = []; bool installationType = true; String comments = ''; @@ -70,7 +71,7 @@ class _UpdateTaskRequestState extends State { TaskData? taskModel = _taskProvider!.taskRequestModel; _taskProvider?.updateTaskModel(taskModel); 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) { // await _taskProvider!.getSiteData(siteId: taskModel.asset?.siteId); // } @@ -135,9 +136,9 @@ class _UpdateTaskRequestState extends State { onSaved: (value) {}, ), 20.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachFiles, - files: _files, + attachment: attachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), @@ -188,8 +189,9 @@ 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)); + for (var item in attachments) { + 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; if (taskModel?.taskTimePicker != null) { diff --git a/lib/new_views/app_style/app_color.dart b/lib/new_views/app_style/app_color.dart index 847b6b59..47b65712 100644 --- a/lib/new_views/app_style/app_color.dart +++ b/lib/new_views/app_style/app_color.dart @@ -180,6 +180,8 @@ static Color getActivityTypeTextColor(String type) { return red30; case "canceled": return red30; + case "returned": + return red30; default: return Colors.white; } diff --git a/lib/new_views/pages/gas_refill_request_form.dart b/lib/new_views/pages/gas_refill_request_form.dart index 64314fe4..b73bc1c5 100644 --- a/lib/new_views/pages/gas_refill_request_form.dart +++ b/lib/new_views/pages/gas_refill_request_form.dart @@ -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/widget_extensions.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/new_models/gas_refill_model.dart'; import 'package:test_sa/models/new_models/mapped_sites.dart'; @@ -43,7 +44,7 @@ class _GasRefillRequestFormState extends State { Lookup? _requestedQuantity; final TextEditingController _commentController = TextEditingController(); GasRefillProvider? _gasRefillProvider; - List _files = []; + List attachments = []; static List gasQuantity = [ Lookup(name: "1", id: 1, value: 1), @@ -213,9 +214,9 @@ class _GasRefillRequestFormState extends State { onSaved: (value) {}, ), 8.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachFiles, - files: _files, + attachment: attachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), @@ -235,9 +236,10 @@ class _GasRefillRequestFormState extends State { _gasModel.gasRefillDetails = []; _gasModel.gasRefillDetails?.add(_currentDetails); _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( - 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( context: context, @@ -380,7 +382,7 @@ class _GasRefillRequestFormState extends State { // Lookup? _requestedQuantity; // final TextEditingController _commentController = TextEditingController(); // GasRefillProvider? _gasRefillProvider; -// List _files = []; +// List attachments = []; // // static List gasQuantity = [ // Lookup(name: "1", id: 1, value: 1), @@ -397,7 +399,7 @@ class _GasRefillRequestFormState extends State { // _currentDetails = widget.gasRefillDetails ?? GasRefillDetails(); // _gasModel = widget.gasModel ?? GasRefillModel(gasRefillDetails: []); // 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) { // _requestedQuantity = Lookup(name: "1", id: 1, value: int.parse(widget.gasRefillDetails!.requestedQty!.toStringAsFixed(0))); @@ -561,7 +563,7 @@ class _GasRefillRequestFormState extends State { // 8.height, // MultiFilesPicker( // label: context.translation.attachFiles, -// files: _files, +// files: attachments, // buttonColor: AppColor.black10, // onlyImages: false, // buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), @@ -582,7 +584,7 @@ class _GasRefillRequestFormState extends State { // _gasModel.gasRefillDetails = []; // _gasModel.gasRefillDetails?.add(_currentDetails); // _gasModel.gasRefillAttachments = []; -// for (var item in _files) { +// for (var item in attachments) { // _gasModel.gasRefillAttachments?.add(GasRefillAttachments( // id: 0, gasRefillId: _gasModel.id ?? 0, attachmentName: ServiceRequestUtils.isLocalUrl(item.path) ? "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}" : item.path)); // } diff --git a/lib/views/pages/device_transfer/create__device_transfer_request.dart b/lib/views/pages/device_transfer/create__device_transfer_request.dart index 1e6a727f..493077ce 100644 --- a/lib/views/pages/device_transfer/create__device_transfer_request.dart +++ b/lib/views/pages/device_transfer/create__device_transfer_request.dart @@ -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/device_transfer.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/floor.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/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart'; @@ -49,7 +51,7 @@ class _CreateDeviceTransferRequestState extends State _scaffoldKey = GlobalKey(); Asset _assetDestination = Asset(); Asset? _pickedAsset; - final List _deviceImages = []; + final List attachments = []; bool isInternal = true; PendingAssetServiceRequest? pendingAssetServiceRequest; @@ -77,8 +79,9 @@ class _CreateDeviceTransferRequestState extends State attachement = []; - for (var item in _deviceImages) { - attachement.add(AssetTransferAttachment(id: 0, attachmentName: "${item.path.split("/").last}|${base64Encode(item.readAsBytesSync())}")); + for (var item in attachments) { + 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; @@ -236,9 +239,9 @@ class _CreateDeviceTransferRequestState extends State { final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); - List _files = []; + List attachments = []; _update({required int status}) async { _formKey.currentState!.save(); @@ -110,13 +111,9 @@ class _UpdateDeviceTransferState extends State { _formModel.assetTransferEngineerTimers = _formModel.receiverVisitTimers; } try { - for (var file in _files) { - String attachmentName = file.path; - if (attachmentName.contains("/")) { - attachmentName = file.path.split("/").last; - attachmentName = "$attachmentName|${base64Encode(file.readAsBytesSync())}"; - } - _formModel.assetTransferAttachments!.add(AssetTransferAttachment(id: 0, attachmentName: attachmentName)); + for (var item in attachments) { + String fileName = ServiceRequestUtils.isLocalUrl(item.name ?? '') ? ("${item.name ?? ''.split("/").last}|${base64Encode(File(item.name ?? '').readAsBytesSync())}") : item.name ?? ''; + _formModel.assetTransferAttachments!.add(AssetTransferAttachment(id: item.id, attachmentName: fileName)); _formModel.attachments = _formModel.assetTransferAttachments; } } catch (error) { @@ -202,7 +199,7 @@ class _UpdateDeviceTransferState extends State { @override void initState() { _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(); } @@ -262,9 +259,9 @@ class _UpdateDeviceTransferState extends State { }, ), 8.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachFiles, - files: _files, + attachment: attachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), @@ -275,9 +272,9 @@ class _UpdateDeviceTransferState extends State { 16.height, DeviceTransferAssistantEmployeeList( assetId: _formModel.assetId, - createdDate: _formModel.createdDate??'', - assistantEmployeeList: widget.isSender?_formModel.assetTransferAssistantEmployeesSender:_formModel.assetTransferAssistantEmployeesReceiver, - cardPadding: 0, + createdDate: _formModel.createdDate ?? '', + assistantEmployeeList: widget.isSender ? _formModel.assetTransferAssistantEmployeesSender : _formModel.assetTransferAssistantEmployeesReceiver, + cardPadding: 0, onListChanged: (updatedList) { setState(() { _formModel.assistantEmployList = updatedList; @@ -381,16 +378,12 @@ class _UpdateDeviceTransferState extends State { } } - - - - class DeviceTransferAssistantEmployeeList extends StatefulWidget { final List? assistantEmployeeList; final ValueChanged>? onListChanged; - final double ?cardPadding; - final dynamic assetId; - final String createdDate; + final double? cardPadding; + final dynamic assetId; + final String createdDate; const DeviceTransferAssistantEmployeeList({ super.key, @@ -444,7 +437,7 @@ class _DeviceTransferAssistantEmployeeListState extends State { bool _firstTime = true; Lookup? _deliveredQuantity; - List _attachments = []; + List _attachments = []; static List deliveredQuantity = [ Lookup(name: "1", id: 1, value: 1), @@ -82,7 +83,7 @@ class _UpdateGasRefillRequestState extends State { } catch (ex) {} } 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 { }); _formModel.gasRefillAttachments = []; 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( - 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) { @@ -258,9 +260,9 @@ class _UpdateGasRefillRequestState extends State { onSaved: (value) {}, ), 16.height, - MultiFilesPicker( + AttachmentPicker( label: context.translation.attachFiles, - files: _attachments, + attachment: _attachments, buttonColor: AppColor.black10, onlyImages: false, buttonIcon: 'image-plus'.toSvgAsset(color: AppColor.neutral120), diff --git a/lib/views/pages/user/requests/create_service_request_page.dart b/lib/views/pages/user/requests/create_service_request_page.dart index 791c5b57..3362b874 100644 --- a/lib/views/pages/user/requests/create_service_request_page.dart +++ b/lib/views/pages/user/requests/create_service_request_page.dart @@ -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/int_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/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/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/requested_through_provider.dart'; @@ -45,7 +47,7 @@ class CreateServiceRequestPageState extends State { late SettingProvider _settingProvider; late ServiceRequestsProvider _serviceRequestsProvider; late ServiceRequest _serviceRequest; - final List _deviceImages = []; + final List attachments = []; final bool _isLoading = false; bool _showDatePicker = false; final GlobalKey _formKey = GlobalKey(); @@ -59,7 +61,7 @@ class CreateServiceRequestPageState extends State { _commentController = TextEditingController(); if (widget.serviceRequest != null) { _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"; if (_showDatePicker && _serviceRequest.visitDate != null) { _dateTime = DateTime.tryParse(_serviceRequest.visitDate!); @@ -77,7 +79,7 @@ class CreateServiceRequestPageState extends State { // ServiceRequest request = await _serviceRequestsProvider.getServiceRequestObjectById(requestId: id) ?? ""; // _serviceRequest = request; // _device = _serviceRequest.device; - // _deviceImages.addAll(_serviceRequest.devicePhotos.map((e) { + // attachments.addAll(_serviceRequest.devicePhotos.map((e) { // return File(e); // }).toList()); // _showDatePicker = _serviceRequest.firstAction != null && _serviceRequest.firstAction.name == "Need a visit"; @@ -244,7 +246,7 @@ class CreateServiceRequestPageState extends State { ); }), 16.height, - MultiFilesPicker(label: context.translation.attachImage, files: _deviceImages, showAsGrid: true), + AttachmentPicker(label: context.translation.attachImage, attachment: attachments, showAsGrid: true), ], ).toShadowContainer(context), @@ -386,7 +388,8 @@ class CreateServiceRequestPageState extends State { // 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 (_isLocalUrl(_serviceRequest.audio!)) { final File file = File(_serviceRequest.audio!); diff --git a/lib/views/pages/user/requests/work_order/create_service_report.dart b/lib/views/pages/user/requests/work_order/create_service_report.dart index 2c7e7fc9..f1ec7b49 100644 --- a/lib/views/pages/user/requests/work_order/create_service_report.dart +++ b/lib/views/pages/user/requests/work_order/create_service_report.dart @@ -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/widget_extensions.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_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/providers/service_request_providers/equipment_status_provider.dart'; import 'package:test_sa/providers/service_request_providers/loan_availability_provider.dart'; @@ -61,7 +63,7 @@ class _CreateServiceReportState extends State with TickerPr bool _isLoading = false; List _spareParts = []; - final List _files = []; + final List attachments = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); final TextEditingController _faultController = TextEditingController(); @@ -363,7 +365,7 @@ class _CreateServiceReportState extends State with TickerPr }, ), 8.height, - MultiFilesPicker(label: context.translation.attachImage, files: _files), + AttachmentPicker(label: context.translation.attachImage, attachment: attachments), 8.height, ESignature( title: context.translation.engSign, @@ -407,9 +409,10 @@ class _CreateServiceReportState extends State with TickerPr } _formKey.currentState!.save(); _serviceReport.attachmentsWorkOrder ??= []; - if (_files.isEmpty) _serviceReport.attachmentsWorkOrder = []; - for (var file in _files) { - _serviceReport.attachmentsWorkOrder!.add(Attachment(id: 0, name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + if (attachments.isEmpty) _serviceReport.attachmentsWorkOrder = []; + for (var item in attachments) { + 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(context, listen: false).user!; await _serviceRequestsProvider.createServiceReport(context, report: _serviceReport, request: widget.request, user: user); diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index aa1c97b6..470471a1 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -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/text_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 '../../../new_views/common_widgets/app_dashed_button.dart'; @@ -17,7 +18,7 @@ class MultiFilesPicker extends StatefulWidget { final String label; final bool error; final List files; - final List attachment; + final List attachment; final bool enabled, onlyImages; double? buttonHeight; @@ -29,7 +30,7 @@ class MultiFilesPicker extends StatefulWidget { MultiFilesPicker( {Key? key, this.files = const [], - this.attachment = const [], + this.attachment = const [], required this.label, this.error = false, this.buttonHeight, @@ -311,18 +312,18 @@ class AttachmentModel { class AttachmentPicker extends StatefulWidget { final String label; final bool error; - final List attachment; + final List attachment; final bool enabled, onlyImages; double? buttonHeight; Widget? buttonIcon; Color? buttonColor; - final Function(List)? onChange; + final Function(List)? onChange; final bool showAsGrid; AttachmentPicker( {Key? key, - this.attachment = const [], + this.attachment = const [], required this.label, this.error = false, this.buttonHeight, @@ -361,7 +362,7 @@ class _AttachmentPickerState extends State { children: List.generate( widget.attachment.length, (index) { - File image = widget.attachment[index].file!; + File image = File(widget.attachment[index].name!); return MultiFilesPickerItem( file: image, enabled: widget.enabled, @@ -369,7 +370,7 @@ class _AttachmentPickerState extends State { if (!widget.enabled) { return; } - widget.attachment.remove(image); + widget.attachment.removeAt(index); if (widget.onChange != null) { widget.onChange!(widget.attachment); } @@ -391,7 +392,10 @@ class _AttachmentPickerState extends State { ); if (result != null) { 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(() {}); } @@ -440,7 +444,7 @@ class _AttachmentPickerState extends State { if (pickedFile != null) { File fileImage = File(pickedFile.path); - widget.attachment.add(AttachmentModel(0, fileImage)); + widget.attachment.add(GenericAttachmentModel(id: 0,name: fileImage.path)); if (widget.onChange != null) { widget.onChange!(widget.attachment); } @@ -562,7 +566,7 @@ class _AttachmentPickerState extends State { if (pickedFile != null) { File fileImage = File(pickedFile.path); - widget.attachment.add(AttachmentModel(0, fileImage)); + widget.attachment.add(GenericAttachmentModel(id: 0, name: fileImage.path)); if (widget.onChange != null) { widget.onChange!(widget.attachment); } diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index ee2d0753..896fe571 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -67,7 +67,7 @@ class MultiFilesPickerItem extends StatelessWidget { } else if (_isLocalUrl(file.path)) { OpenFile.open(file.path); } 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."); throw Exception('Could not launch'); } diff --git a/lib/views/widgets/images/new_multi_image_picker.dart b/lib/views/widgets/images/new_multi_image_picker.dart index 10487230..fba3c3f6 100644 --- a/lib/views/widgets/images/new_multi_image_picker.dart +++ b/lib/views/widgets/images/new_multi_image_picker.dart @@ -72,7 +72,7 @@ class _MultiFilesPickerState extends State { children: List.generate( widget.files!.length, (index) { - File image = widget.files![index].file; + File image = widget.files[index].file; return MultiFilesPickerItem( file: image, enabled: widget.enabled,