From a3264f4f1c29ccf985561fe9c4ebda806188f031 Mon Sep 17 00:00:00 2001 From: zaid_daoud Date: Mon, 21 Aug 2023 09:29:05 +0300 Subject: [PATCH] Multiple types of attachments --- assets/images/doc.png | Bin 0 -> 4330 bytes assets/images/excel.png | Bin 0 -> 8159 bytes assets/images/pdf.png | Bin 0 -> 21118 bytes assets/subtitles/ar_subtitle.json | 3 +- assets/subtitles/en_subtitle.json | 3 +- ios/Runner/Info.plist | 4 + lib/models/subtitle.dart | 3 + .../pages/user/requests/create_request.dart | 6 +- .../requests/report/edit_service_report.dart | 4 +- .../widgets/images/multi_image_picker.dart | 83 +++++++++++------- .../images/multi_image_picker_item.dart | 81 ++++++++++------- pubspec.yaml | 2 +- 12 files changed, 114 insertions(+), 75 deletions(-) create mode 100644 assets/images/doc.png create mode 100644 assets/images/excel.png create mode 100644 assets/images/pdf.png diff --git a/assets/images/doc.png b/assets/images/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..e7418db8b7b4ea6e468a4ce306456523e612bfa4 GIT binary patch literal 4330 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 literal 0 HcmV?d00001 diff --git a/assets/images/pdf.png b/assets/images/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..3102284f5ba086a43aeb4f773ff33cc81ffe7246 GIT binary patch literal 21118 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 app requires permission to access photo gallery to allow user to attach images NSSpeechRecognitionUsageDescription This app requires permission for Speech Recognition for speech to text functionality. + LSSupportsOpeningDocumentsInPlace + + UISupportsDocumentBrowser + UIBackgroundModes fetch diff --git a/lib/models/subtitle.dart b/lib/models/subtitle.dart index 6786ddd1..fe71b3c3 100644 --- a/lib/models/subtitle.dart +++ b/lib/models/subtitle.dart @@ -84,6 +84,7 @@ class Subtitle { String hospital; String device; String deviceImages; + String deviceFiles; String pickDevice; String maintenanceIssue; String create; @@ -359,6 +360,7 @@ class Subtitle { @required this.createServiceRequest, @required this.delete, @required this.deviceImages, + @required this.deviceFiles, @required this.deviceRequired, @required this.general, @required this.maintenanceIssueRequired, @@ -520,6 +522,7 @@ class Subtitle { device: parsedJson["device"], deviceArName: parsedJson["deviceArName"], deviceImages: parsedJson["deviceImages"], + deviceFiles: parsedJson["deviceFiles"], deviceModel: parsedJson["deviceModel"], deviceName: parsedJson["deviceName"], deviceRequired: parsedJson["deviceRequired"], diff --git a/lib/views/pages/user/requests/create_request.dart b/lib/views/pages/user/requests/create_request.dart index 4aaf65bc..9201149b 100644 --- a/lib/views/pages/user/requests/create_request.dart +++ b/lib/views/pages/user/requests/create_request.dart @@ -291,9 +291,9 @@ class CreateRequestPageState extends State { enable: widget.serviceRequest != null ? false : true, ), 12.height, - MultiImagesPicker( - label: _subtitle.deviceImages, - images: _deviceImages, + MultiFilesPicker( + label: _subtitle.deviceFiles, + files: _deviceImages, enabled: widget.serviceRequest == null ? true : false, ), 12.height, 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 b783e5a6..828e6b11 100644 --- a/lib/views/pages/user/requests/report/edit_service_report.dart +++ b/lib/views/pages/user/requests/report/edit_service_report.dart @@ -754,9 +754,9 @@ class _EditServiceReportState extends State with TickerProvid const SizedBox( height: 4, ), - MultiImagesPicker( + MultiFilesPicker( label: "", - images: _images, + files: _images, ), // AMiniOneImagePicker( // //error: _validate && _serviceReport.image == null, diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index fe200bd9..784c42b2 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:file_picker/file_picker.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; @@ -13,31 +14,31 @@ import 'package:test_sa/views/widgets/buttons/app_flat_button.dart'; import 'multi_image_picker_item.dart'; -class MultiImagesPicker extends StatefulWidget { +class MultiFilesPicker extends StatefulWidget { final String label; final bool error; - final List images; + final List files; final bool enabled; - const MultiImagesPicker({Key key, this.images, this.label, this.error = false, this.enabled = true}) : super(key: key); + const MultiFilesPicker({Key key, this.files, this.label, this.error = false, this.enabled = true}) : super(key: key); @override - _MultiImagesPickerState createState() => _MultiImagesPickerState(); + _MultiFilesPickerState createState() => _MultiFilesPickerState(); } -class _MultiImagesPickerState extends State with TickerProviderStateMixin { +class _MultiFilesPickerState extends State with TickerProviderStateMixin { Size _size; @override Widget build(BuildContext context) { _size = MediaQuery.of(context).size; - Subtitle _subtitle = AppLocalization.of(context).subtitle; + Subtitle subtitle = AppLocalization.of(context).subtitle; return Container( - padding: EdgeInsets.all(12), + padding: const EdgeInsets.all(12), decoration: BoxDecoration( - color: Color(0xfff5f5f5), + color: const Color(0xfff5f5f5), border: Border.all( - color: Color(0xffefefef), + color: const Color(0xffefefef), ), borderRadius: BorderRadius.circular(AppStyle.borderRadius * AppStyle.getScaleFactor(context)), ), @@ -49,7 +50,7 @@ class _MultiImagesPickerState extends State with TickerProvid children: [ Expanded( child: Text( - widget.label ?? _subtitle.images, + widget.label ?? subtitle.images, style: Theme.of(context).textTheme.headline6.copyWith( fontSize: 14, ), @@ -57,10 +58,11 @@ class _MultiImagesPickerState extends State with TickerProvid ), ), AFlatButton( - text: _subtitle.add, + text: subtitle.add, onPressed: widget.enabled ? () { - onImagePick(_subtitle); + // onImagePick(_subtitle); + onFilePicker(subtitle); } : null, ), @@ -68,14 +70,14 @@ class _MultiImagesPickerState extends State with TickerProvid ), 12.height, AnimatedSize( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: !widget.error - ? SizedBox.shrink() + ? const SizedBox.shrink() : Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - _subtitle.imagesRequired, + subtitle.imagesRequired, style: Theme.of(context).textTheme.headline6.copyWith( fontSize: 14, color: AColors.red, @@ -89,9 +91,9 @@ class _MultiImagesPickerState extends State with TickerProvid ), ), AnimatedSwitcher( - duration: Duration(milliseconds: 400), + duration: const Duration(milliseconds: 400), child: Container( - key: ValueKey(widget.images.length), + key: ValueKey(widget.files.length), width: _size.width, height: 200 * AppStyle.getScaleFactor(context), padding: EdgeInsets.all( @@ -102,16 +104,17 @@ class _MultiImagesPickerState extends State with TickerProvid border: Border.all(color: Theme.of(context).primaryColor, width: 2), borderRadius: BorderRadius.circular(8 * AppStyle.getScaleFactor(context)), ), - child: widget.images.isEmpty + child: widget.files.isEmpty ? MaterialButton( onPressed: widget.enabled ? () { - onImagePick(_subtitle); + // onImagePick(_subtitle); + onFilePicker(subtitle); } : null, child: Center( child: Icon( - Icons.add_a_photo_outlined, + Icons.file_upload, size: 48 * AppStyle.getScaleFactor(context), color: Theme.of(context).primaryColor, )), @@ -122,12 +125,12 @@ class _MultiImagesPickerState extends State with TickerProvid scrollDirection: Axis.horizontal, mainAxisSpacing: 10, crossAxisSpacing: 10, - children: List.generate(widget.images.length, (index) { - File _image = widget.images[index]; - return MultiImagesPickerItem( - image: _image, + children: List.generate(widget.files.length, (index) { + File _image = widget.files[index]; + return MultiFilesPickerItem( + file: _image, onRemoveTap: (image) { - widget.images.remove(image); + widget.files.remove(image); setState(() {}); }, ); @@ -140,9 +143,23 @@ class _MultiImagesPickerState extends State with TickerProvid ); } - onImagePick(Subtitle _subtitle) async { - if (widget.images.length >= 5) { - Fluttertoast.showToast(msg: _subtitle.maxImagesNumberIs5); + onFilePicker(Subtitle subtitle) async { + FilePickerResult result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowMultiple: true, + allowedExtensions: ['jpg', 'png', 'pdf', 'doc', 'docx', 'xlsx', 'pptx'], + ); + if (result != null) { + for (var path in result.paths) { + widget.files.insert(0, File(path)); + } + setState(() {}); + } + } + + onImagePick(Subtitle subtitle) async { + if (widget.files.length >= 5) { + Fluttertoast.showToast(msg: subtitle.maxImagesNumberIs5); return; } ImageSource source = await showDialog( @@ -150,13 +167,13 @@ class _MultiImagesPickerState extends State with TickerProvid builder: (dialogContext) => CupertinoAlertDialog( actions: [ TextButton( - child: Text(_subtitle.pickFromCamera), + child: Text(subtitle.pickFromCamera), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.camera); }, ), TextButton( - child: Text(_subtitle.pickFromGallery), + child: Text(subtitle.pickFromGallery), onPressed: () { Navigator.of(dialogContext).pop(ImageSource.gallery); }, @@ -168,9 +185,9 @@ class _MultiImagesPickerState extends State with TickerProvid final pickedFile = await ImagePicker().pickImage(source: source, imageQuality: 70, maxWidth: 800, maxHeight: 800); if (pickedFile != null) { - File _fileImage = File(pickedFile.path); - if (_fileImage != null) { - widget.images.insert(0, _fileImage); + File fileImage = File(pickedFile.path); + if (fileImage != null) { + widget.files.insert(0, fileImage); setState(() {}); } } diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index e540cc2b..3f1d5805 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -5,54 +5,67 @@ import 'package:test_sa/views/app_style/colors.dart'; import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/widgets/buttons/app_back_button.dart'; -class MultiImagesPickerItem extends StatelessWidget { - final File image; +class MultiFilesPickerItem extends StatelessWidget { + final File file; final Function(File) onRemoveTap; - const MultiImagesPickerItem({Key key, this.image, this.onRemoveTap}) : super(key: key); + const MultiFilesPickerItem({Key key, this.file, this.onRemoveTap}) : super(key: key); @override Widget build(BuildContext context) { + var isImage = file.path.split(".").last.toLowerCase() == "png" || file.path.split(".").last.toLowerCase() == "jpg"; + var isPdf = file.path.split(".").last.toLowerCase() == "pdf"; + var isExcel = file.path.split(".").last.toLowerCase() == "xlsx"; return Container( width: 80 * AppStyle.getScaleFactor(context), height: 80 * AppStyle.getScaleFactor(context), - decoration: - BoxDecoration(boxShadow: [BoxShadow(color: Colors.black38, blurRadius: 2)], image: DecorationImage(image: FileImage(image), fit: BoxFit.cover), borderRadius: BorderRadius.circular(8)), + decoration: BoxDecoration( + boxShadow: [BoxShadow(color: isImage ? Colors.black38 : AColors.cyan.withOpacity(0.5), blurRadius: 2)], + image: DecorationImage( + image: isImage + ? FileImage(file) + : AssetImage("assets/images/${isPdf ? "pdf" : isExcel ? "excel" : "doc"}.png"), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(8), + ), child: MaterialButton( padding: EdgeInsets.zero, onPressed: () { - Navigator.of(context).push(MaterialPageRoute( - builder: (_) => Scaffold( - body: SafeArea( - child: Stack( - children: [ - Center( - child: InteractiveViewer( - child: Image( - image: FileImage(image), - )), - ), - ABackButton(), - ], - ), + if (isImage) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => Scaffold( + body: SafeArea( + child: Stack( + children: [ + Center(child: isImage ? InteractiveViewer(child: Image(image: FileImage(file))) : const SizedBox.shrink()), + const ABackButton(), + ], ), - ))); + ), + ), + ), + ); + } }, child: Align( - alignment: Alignment.topRight, - child: IconButton( - padding: const EdgeInsets.all(2.0), - icon: Container( - padding: EdgeInsets.all(1), - decoration: BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), borderRadius: BorderRadius.circular(8)), - child: Icon( - Icons.remove_circle, - color: AColors.red, - )), - onPressed: () { - onRemoveTap(image); - }, - )), + alignment: Alignment.topRight, + child: IconButton( + padding: const EdgeInsets.all(2.0), + icon: Container( + padding: const EdgeInsets.all(1), + decoration: BoxDecoration(color: Theme.of(context).scaffoldBackgroundColor.withOpacity(.3), borderRadius: BorderRadius.circular(8)), + child: const Icon( + Icons.remove_circle, + color: AColors.red, + ), + ), + onPressed: () { + onRemoveTap(file); + }, + ), + ), ), ); } diff --git a/pubspec.yaml b/pubspec.yaml index 4f82161b..076379b6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -61,7 +61,7 @@ dependencies: flare_flutter: ^3.0.2 signature: ^5.3.0 flutter_svg: ^1.1.6 - + file_picker: ^5.2.5 dev_dependencies: flutter_test: