diff --git a/lib/modules/loan_module/pages/create_loan_request_page.dart b/lib/modules/loan_module/pages/create_loan_request_page.dart index bdd03dd7..734b39c5 100644 --- a/lib/modules/loan_module/pages/create_loan_request_page.dart +++ b/lib/modules/loan_module/pages/create_loan_request_page.dart @@ -134,6 +134,7 @@ class _CreateLoanRequestPageState extends State with Tick attachment: attachments, buttonColor: AppColor.black10, onlyImages: false, + showAsListView: true, buttonIcon: 'image-plus'.toSvgAsset(color: context.isDark ? AppColor.primary10 : AppColor.neutral120), onChange: (attachments) { attachments = attachments; diff --git a/lib/views/widgets/images/multi_image_picker.dart b/lib/views/widgets/images/multi_image_picker.dart index fbeeb9ce..7105721e 100644 --- a/lib/views/widgets/images/multi_image_picker.dart +++ b/lib/views/widgets/images/multi_image_picker.dart @@ -320,6 +320,7 @@ class AttachmentPicker extends StatefulWidget { Color? buttonColor; final Function(List)? onChange; final bool showAsGrid; + final bool showAsListView; AttachmentPicker( {Key? key, @@ -332,6 +333,7 @@ class AttachmentPicker extends StatefulWidget { this.onlyImages = false, this.onChange, this.showAsGrid = false, + this.showAsListView = false, this.buttonColor}) : super(key: key); @@ -357,29 +359,53 @@ class _AttachmentPickerState extends State { : onFilePicker), 16.height, if (widget.attachment.isNotEmpty) - Wrap( - spacing: 8.toScreenWidth, - children: List.generate( - widget.attachment.length, - (index) { - File image = File(widget.attachment[index].name!); - return MultiFilesPickerItem( - file: image, - enabled: widget.enabled, - onRemoveTap: (image) { - if (!widget.enabled) { - return; - } - widget.attachment.removeAt(index); - if (widget.onChange != null) { - widget.onChange!(widget.attachment); - } - setState(() {}); + widget.showAsListView + ? ListView.separated( + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (cxt, index) { + File image = File(widget.attachment[index].name!); + return MultiFilesPickerItem( + file: image, + showAsListView: widget.showAsListView, + enabled: widget.enabled, + onRemoveTap: (image) { + if (!widget.enabled) { + return; + } + widget.attachment.removeAt(index); + if (widget.onChange != null) { + widget.onChange!(widget.attachment); + } + setState(() {}); + }, + ); }, - ); - }, - ), - ), + separatorBuilder: (cxt, index) => 8.height, + itemCount: widget.attachment.length) + : Wrap( + spacing: 8.toScreenWidth, + children: List.generate( + widget.attachment.length, + (index) { + File image = File(widget.attachment[index].name!); + return MultiFilesPickerItem( + file: image, + enabled: widget.enabled, + onRemoveTap: (image) { + if (!widget.enabled) { + return; + } + widget.attachment.removeAt(index); + if (widget.onChange != null) { + widget.onChange!(widget.attachment); + } + setState(() {}); + }, + ); + }, + ), + ), ], ); } @@ -402,11 +428,6 @@ class _AttachmentPickerState extends State { } void showFileSourceSheet() async { - // if (widget.attachment.length >= 5) { - // Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5); - // return; - // } - ImageSource source = (await showModalBottomSheet( context: context, shape: const RoundedRectangleBorder( @@ -475,11 +496,6 @@ class _AttachmentPickerState extends State { } onFilePicker() async { - //TODO removed on request by Backend as they don't have anyissue with large number of files - // if (widget.attachment.length >= 5) { - // Fluttertoast.showToast(msg: context.translation.maxImagesNumberIs5); - // return; - // } ImageSource? source = await showModalBottomSheet( context: context, builder: (BuildContext context) { diff --git a/lib/views/widgets/images/multi_image_picker_item.dart b/lib/views/widgets/images/multi_image_picker_item.dart index 4669440e..2a794125 100644 --- a/lib/views/widgets/images/multi_image_picker_item.dart +++ b/lib/views/widgets/images/multi_image_picker_item.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:open_file/open_file.dart'; @@ -18,8 +19,16 @@ class MultiFilesPickerItem extends StatelessWidget { final bool enabled; final Function(File) onRemoveTap; final VoidCallback? onRemove; + final bool showAsListView; - const MultiFilesPickerItem({Key? key, required this.file, required this.enabled, required this.onRemoveTap, this.onRemove}) : super(key: key); + const MultiFilesPickerItem({ + Key? key, + required this.file, + required this.enabled, + required this.onRemoveTap, + this.onRemove, + this.showAsListView = false, + }) : super(key: key); @override Widget build(BuildContext context) { @@ -27,6 +36,97 @@ class MultiFilesPickerItem extends StatelessWidget { bool isPdf = file.path.split(".").last.toLowerCase() == "pdf"; bool isExcel = file.path.split(".").last.toLowerCase() == "xlsx"; + if (showAsListView) { + return Row( + children: [ + Container( + width: 48.toScreenWidth, + height: 48.toScreenWidth, + decoration: BoxDecoration( + color: AppColor.neutral90, + border: Border.all(width: 1, color: context.isDark ? AppColor.neutral30 : AppColor.neutral30), + image: DecorationImage( + image: getImage(isImage, isPdf, isExcel, file), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(8), + ), + ), + 8.width, + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Flexible( + child: Text( + file.path.split("/").last, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: AppTextStyles.heading6.copyWith(color: AppColor.black10), + ), + ), + 8.width, + if (enabled) + InkWell( + child: "remove".toSvgAsset(width: 16), + onTap: () { + onRemoveTap(file); + if (onRemove != null) { + onRemove!(); + } + }, + ) + ], + ), + 4.height, + RichText( + text: TextSpan( + text: 'Asset Guide | ', + style: AppTextStyles.bodyText.copyWith(color: AppColor.neutral120), + children: [ + TextSpan( + text: 'View', + recognizer: TapGestureRecognizer() + ..onTap = () async { + if (isImage) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (_) => Scaffold( + appBar: const DefaultAppBar(), + body: SafeArea( + child: InteractiveViewer( + child: _isLocalUrl(file.path) + ? Image.file(file) + : ImageLoader( + url: URLs.getFileUrl(file.path), + boxFit: BoxFit.cover, + ), + ).center, + ), + ), + ), + ); + } else if (_isLocalUrl(file.path)) { + OpenFile.open(file.path); + } else { + if (!await launchUrl(Uri.parse(URLs.getFileUrl(file.path)!), mode: LaunchMode.externalApplication)) { + Fluttertoast.showToast(msg: "UnExpected Error with file."); + throw Exception('Could not launch'); + } + } + }, + style: AppTextStyles.bodyText.copyWith(color: AppColor.primary10, decoration: TextDecoration.underline), + ), + ], + ), + ), + ], + ).expanded + ], + ); + } + return SizedBox( width: 60.toScreenWidth, height: 60.toScreenWidth,