diff --git a/lib/models/pantry/pentry.dart b/lib/models/pantry/pentry.dart index e1bb74fd..f2b5dfee 100644 --- a/lib/models/pantry/pentry.dart +++ b/lib/models/pantry/pentry.dart @@ -18,7 +18,7 @@ class Pentry { DateTime expectedVisitDate; String travelingHours; String image; - File file; + List files = []; // List contacts; List ppmCheckLists; @@ -37,7 +37,7 @@ class Pentry { this.actualVisitDate, this.expectedVisitDate, this.image, - this.file, + this.files, // this.contacts, this.ppmCheckLists, this.calibrationTools, @@ -86,10 +86,8 @@ class Pentry { map["endDate"] = timer.endAt?.toIso8601String() ?? DateTime.now().toIso8601String(); map["workingHours"] = (timer.durationInSecond / 60 / 60).toStringAsFixed(5); } - if (file != null) { - map["vAttachments"] = [ - {"attachmentName": (file.path.split("/").last + base64Encode(file.readAsBytesSync()))} - ]; + if (files?.isNotEmpty ?? false) { + map["vAttachments"] = files.map((file) => {"attachmentName": (file.path.split("/").last + base64Encode(file.readAsBytesSync()))}).toList(); } map["travelingHours"] = travelingHours; // if(contacts?.isNotEmpty == true) { @@ -157,7 +155,7 @@ class Pentry { DateTime expectedVisitDate, String travelingHours, String image, - File imageFile, + List files, List ppmCheckLists, List calibrationTools, List pmKits, @@ -172,7 +170,7 @@ class Pentry { expectedVisitDate: expectedVisitDate ?? this.expectedVisitDate, travelingHours: travelingHours ?? this.travelingHours, image: image ?? this.image, - file: imageFile ?? this.file, + files: files ?? this.files, ppmCheckLists: ppmCheckLists ?? this.ppmCheckLists?.map((e) => e.copyWith())?.toList(), calibrationTools: calibrationTools ?? this.calibrationTools?.map((e) => e.copyWith())?.toList(), pmKits: pmKits ?? this.pmKits.map((e) => e.copyWith()).toList(), diff --git a/lib/models/service_report.dart b/lib/models/service_report.dart index 020ef0a5..2f3da26c 100644 --- a/lib/models/service_report.dart +++ b/lib/models/service_report.dart @@ -198,6 +198,11 @@ class ServiceReport { _parts = partsList.map((e) => Part.fromJson(e["sparePart"], reportJson: e)).toList(); } } + List _files = []; + if (parsedJson["attachmentsWorkOrder"] != null && parsedJson["attachmentsWorkOrder"] is List) { + List list = parsedJson["attachmentsWorkOrder"]; + _files = list.map((e) => (URLs.getFileUrl(e["name"]))).toList(); + } return ServiceReport( id: id, assetType: Lookup.fromJson(parsedJson["assetType"]), @@ -208,7 +213,7 @@ class ServiceReport { equipmentStatus: Lookup.fromJson(parsedJson["equipmentStatus"]), type: Lookup.fromJson(parsedJson["typeOfWO"]), faultDescription: parsedJson['faultDescription'] != null ? FaultDescription.fromJson(parsedJson['faultDescription']) : null, - + files: _files, // faultDescription: parsedJson["faultDescription"], // startDate: DateTime.tryParse(parsedJson["startofWorkTime"] ?? ""), // endDate: DateTime.tryParse(parsedJson["endofWorkTime"] ?? ""), diff --git a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart index 129790b7..056707af 100644 --- a/lib/views/pages/sub_workorder/create_sub_workorder_page.dart +++ b/lib/views/pages/sub_workorder/create_sub_workorder_page.dart @@ -16,6 +16,7 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/pages/sub_workorder/spare_parts_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/work_order_details_bottom_sheet.dart'; import 'package:test_sa/views/pages/sub_workorder/workorder_details.dart'; +import 'package:test_sa/views/widgets/images/multi_image_picker.dart'; import 'package:test_sa/views/widgets/loaders/app_loading.dart'; import 'package:test_sa/views/widgets/status/service_request/service_request_defect_types_mune.dart'; @@ -27,7 +28,6 @@ import '../../widgets/app_text_form_field.dart'; import '../../widgets/buttons/app_back_button.dart'; import '../../widgets/buttons/app_button.dart'; import '../../widgets/date_and_time/date_picker.dart'; -import '../../widgets/images/mini_one_file_picker.dart'; import '../../widgets/status/report/service_report_fault_description.dart'; import '../../widgets/status/report/service_report_reasons.dart'; import '../../widgets/titles/app_sub_title.dart'; @@ -47,7 +47,7 @@ class _CreateSubWorkOrderPageState extends State { SearchWorkOrder _subWorkOrders; Lookup _serviceReportReason = const Lookup(); ServiceReport _serviceReport; - File _file; + final List _files = []; bool _isLoading = false; bool _validate = false; @@ -249,6 +249,8 @@ class _CreateSubWorkOrderPageState extends State { ], ), const SizedBox(height: 8), + MultiFilesPicker(label: subtitle.deviceFiles, files: _files), + const SizedBox(height: 8), InkWell( onTap: () async { await showModalBottomSheet( @@ -302,15 +304,14 @@ class _CreateSubWorkOrderPageState extends State { ), ), ), - const SizedBox(height: 8), - AMiniOneFilePicker( - file: _file, - onPick: (file) { - _file = file; - _subWorkOrders.attachmentsWorkOrder ??= []; - _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); - }, - ), + // AMiniOneFilePicker( + // file: _file, + // onPick: (file) { + // _file = file; + // _subWorkOrders.attachmentsWorkOrder ??= []; + // _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + // }, + // ), const SizedBox(height: 50), ], ), @@ -327,6 +328,10 @@ class _CreateSubWorkOrderPageState extends State { _validate = true; setState(() {}); if (validate()) { + _subWorkOrders.attachmentsWorkOrder ??= []; + for (var file in _files) { + _subWorkOrders.attachmentsWorkOrder.add(AttachmentsWorkOrder(name: "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}")); + } if (_subWorkOrders.timer?.startAt == null || _subWorkOrders.timer?.endAt == null) { Fluttertoast.showToast(msg: "Working hours required"); return; diff --git a/lib/views/pages/user/requests/report/create_service_report.dart b/lib/views/pages/user/requests/report/create_service_report.dart index 3ef3f758..bdd295e0 100644 --- a/lib/views/pages/user/requests/report/create_service_report.dart +++ b/lib/views/pages/user/requests/report/create_service_report.dart @@ -24,7 +24,6 @@ import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_button.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; import 'package:test_sa/views/widgets/equipment/auto_complete_devices_field.dart'; -import 'package:test_sa/views/widgets/images/mini_one_file_picker.dart'; import 'package:test_sa/views/widgets/loaders/loading_manager.dart'; import 'package:test_sa/views/widgets/parts/auto_complete_parts_field.dart'; import 'package:test_sa/views/widgets/parts/part_item.dart'; @@ -35,6 +34,7 @@ import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; import '../../../../../controllers/providers/api/status_drop_down/report/service_types_provider.dart'; import '../../../../widgets/date_and_time/date_picker.dart'; +import '../../../../widgets/images/multi_image_picker.dart'; import '../../../../widgets/status/report/service_report_fault_description.dart'; import '../../../../widgets/status/report/service_report_repair_location.dart'; import '../../../../widgets/timer/app_timer.dart'; @@ -60,7 +60,7 @@ class _CreateServiceReportState extends State with TickerPr bool _showCommentField = false; Subtitle _subtitle; - File _file; + final List _files = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); final TextEditingController _faultController = TextEditingController(); @@ -628,25 +628,27 @@ class _CreateServiceReportState extends State with TickerPr ), ), const SizedBox(width: 8), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const ASubTitle("Attachment"), - AMiniOneFilePicker( - //error: _validate && _serviceReport.image == null, - file: _file, - onPick: (file) { - _file = file; - _serviceReport.files[0] = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; - }, - ), - ], - ), - ), + // Expanded( + // child: Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const ASubTitle("Attachments"), + // AMiniOneFilePicker( + // //error: _validate && _serviceReport.image == null, + // file: _file, + // onPick: (file) { + // _file = file; + // _serviceReport.files[0] = "${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"; + // }, + // ), + // ], + // ), + // ), ], ), const SizedBox(height: 8), + MultiFilesPicker(label: "Attachments", files: _files), + const SizedBox(height: 8), ASubTitle(_subtitle.repairLocation), const SizedBox(height: 4), ServiceReportRepairLocation( @@ -924,7 +926,10 @@ class _CreateServiceReportState extends State with TickerPr _isLoading = true; setState(() {}); - + _serviceReport.files ??= []; + for (var file in _files) { + _serviceReport.files.add("${file.path.split("/").last}|${base64Encode(file.readAsBytesSync())}"); + } int status = await _serviceRequestsProvider.createServiceReport( user: _userProvider.user, host: _settingProvider.host, diff --git a/lib/views/pages/user/requests/report/edit_service_report.dart b/lib/views/pages/user/requests/report/edit_service_report.dart index 6aa64bdf..dc3d6d41 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -61,7 +61,7 @@ class _EditServiceReportState extends State with TickerProvid bool _showCommentField = false; Subtitle _subtitle; - final List _images = []; + List _images = []; final GlobalKey _formKey = GlobalKey(); final GlobalKey _scaffoldKey = GlobalKey(); TextEditingController _faultController = TextEditingController(); @@ -74,6 +74,7 @@ class _EditServiceReportState extends State with TickerProvid @override void initState() { _serviceReport = widget.report; + _images = widget.report?.files?.map((e) => File(e))?.toList(); super.initState(); } diff --git a/lib/views/pages/user/visits/visit_details.dart b/lib/views/pages/user/visits/visit_details.dart index 7fb05200..ddc88782 100644 --- a/lib/views/pages/user/visits/visit_details.dart +++ b/lib/views/pages/user/visits/visit_details.dart @@ -9,12 +9,12 @@ import 'package:test_sa/views/pages/user/visits/pantry/edit_pentry.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; import 'package:test_sa/views/widgets/buttons/app_icon_button.dart'; import 'package:test_sa/views/widgets/images/images_list.dart'; -import 'package:test_sa/views/widgets/loaders/image_loader.dart'; import 'package:test_sa/views/widgets/requests/info_row.dart'; import 'package:test_sa/views/widgets/visits/visit_status.dart'; import '../../../../controllers/providers/api/user_provider.dart'; import '../../../../models/enums/user_types.dart'; +import '../../../widgets/loaders/image_loader.dart'; class VisitDetailsPage extends StatelessWidget { static const String id = "/visit-details"; @@ -51,11 +51,14 @@ class VisitDetailsPage extends StatelessWidget { buttonSize: 42, backgroundColor: AColors.green, onPressed: () async { - Navigator.of(context).push(MaterialPageRoute( + Navigator.of(context).push( + MaterialPageRoute( builder: (_) => EditPentry( - visit: visit, - pentry: visit.pentry, - ))); + visit: visit, + pentry: visit.pentry, + ), + ), + ); }, ), const SizedBox(width: 42) @@ -66,24 +69,25 @@ class VisitDetailsPage extends StatelessWidget { child: ListView( padding: const EdgeInsets.symmetric(horizontal: 16), children: [ - const SizedBox( - height: 8, - ), + const SizedBox(height: 8), MaterialButton( padding: EdgeInsets.zero, onPressed: () { - if (visit.images.isEmpty || (visit.images?.first?.isEmpty ?? false)) { - Navigator.of(context).push(MaterialPageRoute( + if ((visit.images?.isNotEmpty ?? false) && (visit.images?.first?.isNotEmpty ?? false)) { + Navigator.of(context).push( + MaterialPageRoute( builder: (_) => Scaffold( - body: InteractiveViewer( - child: Center( - child: ImageLoader( - url: visit.images.first, - boxFit: BoxFit.contain, - ), - ), + body: InteractiveViewer( + child: Center( + child: ImageLoader( + url: visit.images.first, + boxFit: BoxFit.contain, ), - ))); + ), + ), + ), + ), + ); } }, child: SizedBox( diff --git a/lib/views/widgets/pentry/pentry_info_form.dart b/lib/views/widgets/pentry/pentry_info_form.dart index 1484a2ca..73c4364f 100644 --- a/lib/views/widgets/pentry/pentry_info_form.dart +++ b/lib/views/widgets/pentry/pentry_info_form.dart @@ -9,11 +9,11 @@ import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/app_text_form_field.dart'; import 'package:test_sa/views/widgets/date_and_time/date_picker.dart'; import 'package:test_sa/views/widgets/e_signature/e_signature.dart'; -import 'package:test_sa/views/widgets/images/mini_one_file_picker.dart'; import 'package:test_sa/views/widgets/status/pentry/pentry_visit_status_mune.dart'; import 'package:test_sa/views/widgets/timer/app_timer.dart'; import 'package:test_sa/views/widgets/titles/app_sub_title.dart'; +import '../images/multi_image_picker.dart'; import '../status/pentry/pentry_status_mune.dart'; class PentryInfoForm extends StatefulWidget { @@ -33,6 +33,7 @@ class PentryInfoForm extends StatefulWidget { class _PentryInfoFormState extends State { @override Widget build(BuildContext context) { + widget.model?.files ??= []; final subtitle = AppLocalization.of(context).subtitle; final userProvider = Provider.of(context); return ListView( @@ -149,23 +150,21 @@ class _PentryInfoFormState extends State { ATextFormField( initialValue: (widget.model.travelingHours ?? "").toString(), textAlign: TextAlign.center, - style: Theme.of(context).textTheme.subtitle1, + style: Theme.of(context).textTheme.titleMedium, textInputType: TextInputType.number, onChange: (value) { widget.model.travelingHours = value; }, ), - const SizedBox( - height: 12, - ), - const ASubTitle("PPM Attachment"), - AMiniOneFilePicker( - //error: _validate && _serviceReport.image == null, - file: widget.model.file, - onPick: (file) { - widget.model.file = file; - }, - ), + const SizedBox(height: 12), + MultiFilesPicker(label: "PPM Attachments", files: widget.model.files), + // AMiniOneFilePicker( + // //error: _validate && _serviceReport.image == null, + // file: widget.model.file, + // onPick: (file) { + // widget.model.file = file; + // }, + // ), const SizedBox( height: 8, ),