diff --git a/lib/ui/app/dismissible_entity.dart b/lib/ui/app/dismissible_entity.dart index fb6d7377a..2a39a5597 100644 --- a/lib/ui/app/dismissible_entity.dart +++ b/lib/ui/app/dismissible_entity.dart @@ -1,53 +1,57 @@ - - import 'dart:math'; import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; class DismissibleEntity extends StatelessWidget { - const DismissibleEntity({ - this.entity, - this.child, - this.onDismissed, - this.onTap, + @required this.user, + @required this.entity, + @required this.child, + @required this.onDismissed, }); + final UserEntity user; final BaseEntity entity; final Widget child; final Function onDismissed; - final Function onTap; @override Widget build(BuildContext context) { + if (!user.canEditEntity(entity)) { + return child; + } + return Dismissible( // TODO fix this properly https://github.com/flutter/flutter/issues/11825 //key: Key(entity.entityKey), key: Key(entity.entityKey + Random().nextInt(100000).toString()), onDismissed: onDismissed, child: child, - background: entity.isDeleted ? Container( - color: Colors.blue, - child: const ListTile( - leading: - const Icon(Icons.restore, color: Colors.white, size: 36.0)), - ) : Container( - color: Colors.red, - child: const ListTile( - leading: - const Icon(Icons.delete, color: Colors.white, size: 36.0))), - secondaryBackground: entity.isArchived || entity.isDeleted ? Container( - color: Colors.blue, - child: const ListTile( - trailing: - const Icon(Icons.restore, color: Colors.white, size: 36.0)), - ) : Container( - color: Colors.orange, - child: const ListTile( - trailing: - const Icon(Icons.archive, color: Colors.white, size: 36.0))), + background: entity.isDeleted + ? Container( + color: Colors.blue, + child: const ListTile( + leading: const Icon(Icons.restore, + color: Colors.white, size: 36.0)), + ) + : Container( + color: Colors.red, + child: const ListTile( + leading: const Icon(Icons.delete, + color: Colors.white, size: 36.0))), + secondaryBackground: entity.isArchived || entity.isDeleted + ? Container( + color: Colors.blue, + child: const ListTile( + trailing: const Icon(Icons.restore, + color: Colors.white, size: 36.0)), + ) + : Container( + color: Colors.orange, + child: const ListTile( + trailing: const Icon(Icons.archive, + color: Colors.white, size: 36.0))), ); - } } diff --git a/lib/ui/client/client_list.dart b/lib/ui/client/client_list.dart index a25285a9e..39bef6bcb 100644 --- a/lib/ui/client/client_list.dart +++ b/lib/ui/client/client_list.dart @@ -93,6 +93,7 @@ class ClientList extends StatelessWidget { final client = viewModel.clientMap[clientId]; return Column(children: [ ClientListItem( + user: viewModel.user, filter: viewModel.filter, client: client, onDismissed: (DismissDirection direction) => diff --git a/lib/ui/client/client_list_item.dart b/lib/ui/client/client_list_item.dart index 7473a4afd..cd05944ea 100644 --- a/lib/ui/client/client_list_item.dart +++ b/lib/ui/client/client_list_item.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; class ClientListItem extends StatelessWidget { + final UserEntity user; final DismissDirectionCallback onDismissed; final GestureTapCallback onTap; final GestureTapCallback onLongPress; @@ -16,6 +17,7 @@ class ClientListItem extends StatelessWidget { static final clientItemKey = (int id) => Key('__client_item_${id}__'); const ClientListItem({ + @required this.user, @required this.onDismissed, @required this.onTap, @required this.onLongPress, @@ -32,6 +34,7 @@ class ClientListItem extends StatelessWidget { : null; return DismissibleEntity( + user: user, onDismissed: onDismissed, entity: client, //entityKey: clientItemKey, diff --git a/lib/ui/invoice/invoice_list.dart b/lib/ui/invoice/invoice_list.dart index edfe9f309..ec07b12a3 100644 --- a/lib/ui/invoice/invoice_list.dart +++ b/lib/ui/invoice/invoice_list.dart @@ -155,6 +155,7 @@ class InvoiceList extends StatelessWidget { return Column( children: [ InvoiceListItem( + user: viewModel.user, filter: viewModel.filter, invoice: invoice, client: viewModel.clientMap[invoice.clientId], diff --git a/lib/ui/invoice/invoice_list_item.dart b/lib/ui/invoice/invoice_list_item.dart index 12dc84a29..b07fd0f13 100644 --- a/lib/ui/invoice/invoice_list_item.dart +++ b/lib/ui/invoice/invoice_list_item.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class InvoiceListItem extends StatelessWidget { + final UserEntity user; final DismissDirectionCallback onDismissed; final GestureTapCallback onTap; final GestureTapCallback onLongPress; @@ -16,6 +17,7 @@ class InvoiceListItem extends StatelessWidget { final String filter; const InvoiceListItem({ + @required this.user, @required this.onDismissed, @required this.onTap, @required this.onLongPress, @@ -32,6 +34,7 @@ class InvoiceListItem extends StatelessWidget { : null; return DismissibleEntity( + user: user, entity: invoice, onDismissed: onDismissed, child: ListTile( diff --git a/lib/ui/product/product_list.dart b/lib/ui/product/product_list.dart index 8afc8f7f8..6b33a896c 100644 --- a/lib/ui/product/product_list.dart +++ b/lib/ui/product/product_list.dart @@ -93,6 +93,7 @@ class ProductList extends StatelessWidget { final product = viewModel.productMap[productId]; return Column(children: [ ProductListItem( + user: viewModel.user, filter: viewModel.filter, product: product, onDismissed: (DismissDirection direction) => diff --git a/lib/ui/product/product_list_item.dart b/lib/ui/product/product_list_item.dart index e90212297..e56a42dfd 100644 --- a/lib/ui/product/product_list_item.dart +++ b/lib/ui/product/product_list_item.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; class ProductListItem extends StatelessWidget { + final UserEntity user; final DismissDirectionCallback onDismissed; final GestureTapCallback onTap; final GestureTapCallback onLongPress; @@ -16,6 +17,7 @@ class ProductListItem extends StatelessWidget { static final productItemKey = (int id) => Key('__product_item_${id}__'); const ProductListItem({ + @required this.user, @required this.onDismissed, @required this.onTap, @required this.onLongPress, @@ -32,9 +34,9 @@ class ProductListItem extends StatelessWidget { final subtitle = filterMatch ?? product.notes; return DismissibleEntity( + user: user, entity: product, onDismissed: onDismissed, - onTap: onTap, child: ListTile( onTap: onTap, onLongPress: onLongPress,