From 5d54c5e9b74de7c02d21776aa2febb6502fa2009 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 6 Aug 2018 22:29:38 +0300 Subject: [PATCH] Support cloning --- lib/data/models/product_model.dart | 4 ++++ lib/ui/product/edit/product_edit.dart | 8 ++++++++ lib/ui/product/edit/product_edit_vm.dart | 5 ++++- lib/utils/localization.dart | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/data/models/product_model.dart b/lib/data/models/product_model.dart index a51a6e25b..bc7b4cd23 100644 --- a/lib/data/models/product_model.dart +++ b/lib/data/models/product_model.dart @@ -65,6 +65,10 @@ abstract class ProductEntity extends Object } ProductEntity._(); + ProductEntity get clone => rebuild((b) => b + ..id = --ProductEntity.counter + ); + @override EntityType get entityType { return EntityType.product; diff --git a/lib/ui/product/edit/product_edit.dart b/lib/ui/product/edit/product_edit.dart index 3659b90c2..5639bc292 100644 --- a/lib/ui/product/edit/product_edit.dart +++ b/lib/ui/product/edit/product_edit.dart @@ -1,4 +1,5 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; +import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/forms/custom_field.dart'; import 'package:invoiceninja_flutter/ui/app/invoice/tax_rate_dropdown.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; @@ -127,6 +128,13 @@ class _ProductEditState extends State { : ActionMenuButton( entity: viewModel.product, onSelected: viewModel.onActionSelected, + customActions: [ + ActionMenuChoice( + label: localization.clone, + icon: Icons.control_point_duplicate, + action: EntityAction.clone, + ), + ], ) ], ), diff --git a/lib/ui/product/edit/product_edit_vm.dart b/lib/ui/product/edit/product_edit_vm.dart index cc8c14e3c..1978f760a 100644 --- a/lib/ui/product/edit/product_edit_vm.dart +++ b/lib/ui/product/edit/product_edit_vm.dart @@ -106,11 +106,14 @@ class ProductEditVM { store.dispatch(RestoreProductRequest(completer, product.id)); message = AppLocalization.of(context).successfullyRestoredProduct; break; + case EntityAction.clone: + store.dispatch(UpdateProduct(product.clone)); + break; } return completer.future.then((_) { if ([EntityAction.archive, EntityAction.delete].contains(action)) { Navigator.of(context).pop(message); - } else { + } else if (message.isNotEmpty) { Scaffold.of(context).showSnackBar(SnackBar( content: SnackBarRow( message: message, diff --git a/lib/utils/localization.dart b/lib/utils/localization.dart index 0e98102d7..a301afd00 100644 --- a/lib/utils/localization.dart +++ b/lib/utils/localization.dart @@ -177,6 +177,7 @@ class AppLocalization { 'blank_contact': 'Blank Contact', 'activity': 'Activity', 'no_records_found': 'No records found', + 'clone': 'Clone', 'payment': 'Payment', 'payments': 'Payments', @@ -409,6 +410,7 @@ class AppLocalization { String get blankContact => _localizedValues[locale.languageCode]['blank_contact']; String get activity => _localizedValues[locale.languageCode]['activity']; String get noRecordsFound => _localizedValues[locale.languageCode]['no_records_found']; + String get clone => _localizedValues[locale.languageCode]['clone']; String get payment => _localizedValues[locale.languageCode]['payment']; String get payments => _localizedValues[locale.languageCode]['payments'];