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/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<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;
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 {
WorkOrderAttachments({this.id, this.name});
WorkOrderAttachments({this.id, this.name,this.createdBy});
int? id;
String? name;

@ -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<File> attachments, required List<WorkOrderAttachments> otherAttachment}) async {
Future addWorkOrderAttachment({required int woId, required List<GenericAttachmentModel> attachments, required List<WorkOrderAttachments> otherAttachment}) async {
try {
List<WorkOrderAttachments> 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;

@ -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<ServiceRequestDetailView> {
List<File> _userAttachments = [];
List<GenericAttachmentModel> _userAttachments = [];
List<WorkOrderAttachments> _attachments = [];
@override
@ -47,10 +48,20 @@ class _ServiceRequestDetailViewState extends State<ServiceRequestDetailView> {
@override
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);
return Consumer<ServiceRequestDetailProvider>(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<ServiceRequestDetailView> {
"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);
},
),
],

@ -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<AssetRetired> with TickerProviderStateMix
@override
Widget build(BuildContext context) {
final List<File> _files = [];
final List<GenericAttachmentModel> attachments = [];
return Scaffold(
key: _scaffoldKey,
@ -103,9 +105,9 @@ class _AssetRetiredState extends State<AssetRetired> 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<AssetRetired> 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) {

@ -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<FormState> _formKey = GlobalKey<FormState>();
final List<File> _files = [];
return Consumer<ServiceRequestsProvider>(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<FormState> _formKey = GlobalKey<FormState>();
// final List<File> _files = [];
// return Consumer<ServiceRequestsProvider>(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,
// ],
// ),
// ),
// );
// });
// }
// }

@ -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<CreateNewRequest> with TickerProvider
late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceRequestDetailProvider _requestDetailProvider;
late ServiceRequest _serviceRequest;
final List<File> _deviceImages = [];
final List<GenericAttachmentModel> _deviceImages = [];
final bool _isLoading = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@ -72,7 +74,7 @@ class _CreateNewRequestState extends State<CreateNewRequest> 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<CreateNewRequest> 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<CreateNewRequest> with TickerProvider
}
List<WorkOrderAttachments> 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,

@ -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<UpdatePpm> 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 ?? [];

@ -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<WoInfoForm> {
PpmProvider ppmProvider = Provider.of<PpmProvider>(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<WoInfoForm> {
},
),
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),

@ -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<CreateTaskView> with TickerProviderStateMixin {
final List<File> _deviceImages = [];
final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<Asset> _deviceList = [];
@ -111,12 +113,17 @@ class _CreateTaskViewState extends State<CreateTaskView> 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<CreateTaskView> 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<TaskRequestProvider>(context, listen: false);
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/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<UpdateTaskRequest> {
final TextEditingController _requestedQuantityController = TextEditingController();
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<File> _files = [];
List<GenericAttachmentModel> attachments = [];
bool installationType = true;
String comments = '';
@ -70,7 +71,7 @@ class _UpdateTaskRequestState extends State<UpdateTaskRequest> {
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<UpdateTaskRequest> {
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<UpdateTaskRequest> {
if (validate(model: taskModel)) {
showDialog(context: context, barrierDismissible: false, builder: (context) => const AppLazyLoading());
List<TaskJobAttachment> 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) {

@ -180,6 +180,8 @@ static Color getActivityTypeTextColor(String type) {
return red30;
case "canceled":
return red30;
case "returned":
return red30;
default:
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/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<GasRefillRequestForm> {
Lookup? _requestedQuantity;
final TextEditingController _commentController = TextEditingController();
GasRefillProvider? _gasRefillProvider;
List<File> _files = [];
List<GenericAttachmentModel> attachments = [];
static List<Lookup> gasQuantity = [
Lookup(name: "1", id: 1, value: 1),
@ -213,9 +214,9 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
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<GasRefillRequestForm> {
_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<GasRefillRequestForm> {
// Lookup? _requestedQuantity;
// final TextEditingController _commentController = TextEditingController();
// GasRefillProvider? _gasRefillProvider;
// List<File> _files = [];
// List<File> attachments = [];
//
// static List<Lookup> gasQuantity = [
// Lookup(name: "1", id: 1, value: 1),
@ -397,7 +399,7 @@ class _GasRefillRequestFormState extends State<GasRefillRequestForm> {
// _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<GasRefillRequestForm> {
// 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<GasRefillRequestForm> {
// _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));
// }

@ -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<CreateDeviceTransferReques
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
Asset _assetDestination = Asset();
Asset? _pickedAsset;
final List<File> _deviceImages = [];
final List<GenericAttachmentModel> attachments = [];
bool isInternal = true;
PendingAssetServiceRequest? pendingAssetServiceRequest;
@ -77,8 +79,9 @@ class _CreateDeviceTransferRequestState extends State<CreateDeviceTransferReques
}
_formKey.currentState!.save();
List<AssetTransferAttachment> 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<CreateDeviceTransferReques
),
8.height,
23.height,
MultiFilesPicker(
AttachmentPicker(
label: context.translation.attachImage,
files: _deviceImages,
attachment: attachments,
buttonColor: AppColor.black10,
onlyImages: false,
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/models/device/asset_transfer_attachment.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/assistant_employee.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<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
List<File> _files = [];
List<GenericAttachmentModel> attachments = [];
_update({required int status}) async {
_formKey.currentState!.save();
@ -110,13 +111,9 @@ class _UpdateDeviceTransferState extends State<UpdateDeviceTransfer> {
_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<UpdateDeviceTransfer> {
@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<UpdateDeviceTransfer> {
},
),
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<UpdateDeviceTransfer> {
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<UpdateDeviceTransfer> {
}
}
class DeviceTransferAssistantEmployeeList extends StatefulWidget {
final List<AssetTransferAssistantEmployees>? assistantEmployeeList;
final ValueChanged<List<AssetTransferAssistantEmployees>>? 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<DeviceTransferAssi
itemCount: _list.length + 1,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: EdgeInsets.all(widget.cardPadding??16),
padding: EdgeInsets.all(widget.cardPadding ?? 16),
itemBuilder: (context, index) {
if (index == _list.length) {
return AppFilledButton(
@ -463,7 +456,7 @@ class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssi
id: _list[index].employeeId,
name: _list[index].employeeName,
);
selectedEmployee = AssistantEmployees( userId: assignedUser.id, user: assignedUser);
selectedEmployee = AssistantEmployees(userId: assignedUser.id, user: assignedUser);
return EmployeeCard(
model: _list[index],
assetId: widget.assetId,
@ -479,17 +472,18 @@ class _DeviceTransferAssistantEmployeeListState extends State<DeviceTransferAssi
}
}
class EmployeeCard extends StatelessWidget {
final AssetTransferAssistantEmployees model;
final int index;
final dynamic assetId ;
final String ? createdDate;
final dynamic assetId;
final String? createdDate;
AssistantEmployees? selectedEmployee;
final void Function(void Function(AssetTransferAssistantEmployees model)) onUpdate;
final VoidCallback onRemove;
final TextEditingController workingHoursController;
EmployeeCard({
EmployeeCard({
super.key,
required this.model,
required this.assetId,
@ -504,19 +498,18 @@ class EmployeeCard extends StatelessWidget {
// AssistantEmployees selectedEmployee = AssistantEmployees();
@override
Widget build(BuildContext context) {
return Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
context.translation.assistantEmployee.bodyText(context).custom(color: AppColor.black20),
Container(
height: 32,
width: 32,
padding: const EdgeInsets.all(6),
child: "trash".toSvgAsset(height: 20, width: 20),
).onPress(onRemove),
Container(
height: 32,
width: 32,
padding: const EdgeInsets.all(6),
child: "trash".toSvgAsset(height: 20, width: 20),
).onPress(onRemove),
],
),
8.height,
@ -526,7 +519,7 @@ class EmployeeCard extends StatelessWidget {
ServiceReportAssistantEmployeeMenu(
title: context.translation.select,
backgroundColor: AppColor.neutral100,
assetId:assetId,
assetId: assetId,
initialValue: selectedEmployee,
onSelect: (employee) {
if (employee != null) {
@ -665,8 +658,7 @@ class EmployeeCard extends StatelessWidget {
],
)
],
).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 12))
.paddingOnly(bottom: 12);
).toShadowContainer(context, paddingObject: const EdgeInsets.symmetric(horizontal: 16, vertical: 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/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/lookup.dart';
import 'package:test_sa/models/timer_model.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;
Lookup? _deliveredQuantity;
List<File> _attachments = [];
List<GenericAttachmentModel> _attachments = [];
static List<Lookup> deliveredQuantity = [
Lookup(name: "1", id: 1, value: 1),
@ -82,7 +83,7 @@ class _UpdateGasRefillRequestState extends State<UpdateGasRefillRequest> {
} 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<UpdateGasRefillRequest> {
});
_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<UpdateGasRefillRequest> {
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),

@ -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<CreateServiceRequestPage> {
late SettingProvider _settingProvider;
late ServiceRequestsProvider _serviceRequestsProvider;
late ServiceRequest _serviceRequest;
final List<File> _deviceImages = [];
final List<GenericAttachmentModel> attachments = [];
final bool _isLoading = false;
bool _showDatePicker = false;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
@ -59,7 +61,7 @@ class CreateServiceRequestPageState extends State<CreateServiceRequestPage> {
_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<CreateServiceRequestPage> {
// 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<CreateServiceRequestPage> {
);
}),
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<CreateServiceRequestPage> {
// 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!);

@ -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<CreateServiceReport> with TickerPr
bool _isLoading = false;
List<SparePart> _spareParts = [];
final List<File> _files = [];
final List<GenericAttachmentModel> attachments = [];
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
final TextEditingController _faultController = TextEditingController();
@ -363,7 +365,7 @@ class _CreateServiceReportState extends State<CreateServiceReport> 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<CreateServiceReport> 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<UserProvider>(context, listen: false).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/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<File> files;
final List<AttachmentModel> attachment;
final List<GenericAttachmentModel> attachment;
final bool enabled, onlyImages;
double? buttonHeight;
@ -29,7 +30,7 @@ class MultiFilesPicker extends StatefulWidget {
MultiFilesPicker(
{Key? key,
this.files = const <File>[],
this.attachment = const <AttachmentModel>[],
this.attachment = const <GenericAttachmentModel>[],
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<AttachmentModel> attachment;
final List<GenericAttachmentModel> attachment;
final bool enabled, onlyImages;
double? buttonHeight;
Widget? buttonIcon;
Color? buttonColor;
final Function(List<AttachmentModel>)? onChange;
final Function(List<GenericAttachmentModel>)? onChange;
final bool showAsGrid;
AttachmentPicker(
{Key? key,
this.attachment = const <AttachmentModel>[],
this.attachment = const <GenericAttachmentModel>[],
required this.label,
this.error = false,
this.buttonHeight,
@ -361,7 +362,7 @@ class _AttachmentPickerState extends State<AttachmentPicker> {
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<AttachmentPicker> {
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<AttachmentPicker> {
);
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<AttachmentPicker> {
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<AttachmentPicker> {
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);
}

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

@ -72,7 +72,7 @@ class _MultiFilesPickerState extends State<NewMultiFilesPicker> {
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,

Loading…
Cancel
Save