Vaibhav_Feature-#768 #59
@ -10,15 +10,27 @@ import 'package:url_launcher/url_launcher_string.dart';
|
|||||||
import 'package:marco/helpers/widgets/my_snackbar.dart';
|
import 'package:marco/helpers/widgets/my_snackbar.dart';
|
||||||
import 'package:marco/helpers/widgets/image_viewer_dialog.dart';
|
import 'package:marco/helpers/widgets/image_viewer_dialog.dart';
|
||||||
|
|
||||||
Future<T?> showAddExpenseBottomSheet<T>() {
|
Future<T?> showAddExpenseBottomSheet<T>({
|
||||||
|
bool isEdit = false,
|
||||||
|
Map<String, dynamic>? existingExpense,
|
||||||
|
}) {
|
||||||
return Get.bottomSheet<T>(
|
return Get.bottomSheet<T>(
|
||||||
const _AddExpenseBottomSheet(),
|
_AddExpenseBottomSheet(
|
||||||
|
isEdit: isEdit,
|
||||||
|
existingExpense: existingExpense,
|
||||||
|
),
|
||||||
isScrollControlled: true,
|
isScrollControlled: true,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
class _AddExpenseBottomSheet extends StatefulWidget {
|
class _AddExpenseBottomSheet extends StatefulWidget {
|
||||||
const _AddExpenseBottomSheet();
|
final bool isEdit;
|
||||||
|
final Map<String, dynamic>? existingExpense;
|
||||||
|
|
||||||
|
const _AddExpenseBottomSheet({
|
||||||
|
this.isEdit = false,
|
||||||
|
this.existingExpense,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<_AddExpenseBottomSheet> createState() => _AddExpenseBottomSheetState();
|
State<_AddExpenseBottomSheet> createState() => _AddExpenseBottomSheetState();
|
||||||
@ -91,7 +103,7 @@ class _AddExpenseBottomSheetState extends State<_AddExpenseBottomSheet> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Obx(() {
|
return Obx(() {
|
||||||
return BaseBottomSheet(
|
return BaseBottomSheet(
|
||||||
title: "Add Expense",
|
title: widget.isEdit ? "Edit Expense" : "Add Expense",
|
||||||
isSubmitting: controller.isSubmitting.value,
|
isSubmitting: controller.isSubmitting.value,
|
||||||
onCancel: Get.back,
|
onCancel: Get.back,
|
||||||
onSubmit: () {
|
onSubmit: () {
|
||||||
@ -485,7 +497,8 @@ class _AttachmentsSection extends StatelessWidget {
|
|||||||
runSpacing: 8,
|
runSpacing: 8,
|
||||||
children: existingAttachments.map((doc) {
|
children: existingAttachments.map((doc) {
|
||||||
final isImage =
|
final isImage =
|
||||||
doc['contentType']?.toString().startsWith('image/') ?? false;
|
doc['contentType']?.toString().startsWith('image/') ??
|
||||||
|
false;
|
||||||
final url = doc['url'];
|
final url = doc['url'];
|
||||||
final fileName = doc['fileName'] ?? 'Unnamed';
|
final fileName = doc['fileName'] ?? 'Unnamed';
|
||||||
|
|
||||||
@ -501,11 +514,13 @@ class _AttachmentsSection extends StatelessWidget {
|
|||||||
.startsWith('image/') ??
|
.startsWith('image/') ??
|
||||||
false))
|
false))
|
||||||
.toList();
|
.toList();
|
||||||
final initialIndex = imageDocs.indexWhere((d) => d == doc);
|
final initialIndex =
|
||||||
|
imageDocs.indexWhere((d) => d == doc);
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (_) => ImageViewerDialog(
|
builder: (_) => ImageViewerDialog(
|
||||||
imageSources: imageDocs.map((e) => e['url']).toList(),
|
imageSources:
|
||||||
|
imageDocs.map((e) => e['url']).toList(),
|
||||||
initialIndex: initialIndex,
|
initialIndex: initialIndex,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -540,7 +555,8 @@ class _AttachmentsSection extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(width: 7),
|
const SizedBox(width: 7),
|
||||||
ConstrainedBox(
|
ConstrainedBox(
|
||||||
constraints: const BoxConstraints(maxWidth: 120),
|
constraints:
|
||||||
|
const BoxConstraints(maxWidth: 120),
|
||||||
child: Text(
|
child: Text(
|
||||||
fileName,
|
fileName,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
@ -556,7 +572,8 @@ class _AttachmentsSection extends StatelessWidget {
|
|||||||
top: -6,
|
top: -6,
|
||||||
right: -6,
|
right: -6,
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
icon: const Icon(Icons.close, color: Colors.red, size: 18),
|
icon: const Icon(Icons.close,
|
||||||
|
color: Colors.red, size: 18),
|
||||||
onPressed: () => onRemoveExisting!(doc),
|
onPressed: () => onRemoveExisting!(doc),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -146,7 +146,7 @@ class ExpenseDetailScreen extends StatelessWidget {
|
|||||||
await addCtrl.loadMasterData();
|
await addCtrl.loadMasterData();
|
||||||
addCtrl.populateFieldsForEdit(editData);
|
addCtrl.populateFieldsForEdit(editData);
|
||||||
|
|
||||||
await showAddExpenseBottomSheet();
|
await showAddExpenseBottomSheet( isEdit: true,);
|
||||||
|
|
||||||
// Refresh expense details after editing
|
// Refresh expense details after editing
|
||||||
await controller.fetchExpenseDetails();
|
await controller.fetchExpenseDetails();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user