User permissions

This commit is contained in:
Hillel Coren 2018-08-17 10:17:55 -07:00
parent 7cf2278de6
commit 22f52537c5
7 changed files with 45 additions and 30 deletions

View File

@ -1,53 +1,57 @@
import 'dart:math'; import 'dart:math';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
class DismissibleEntity extends StatelessWidget { class DismissibleEntity extends StatelessWidget {
const DismissibleEntity({ const DismissibleEntity({
this.entity, @required this.user,
this.child, @required this.entity,
this.onDismissed, @required this.child,
this.onTap, @required this.onDismissed,
}); });
final UserEntity user;
final BaseEntity entity; final BaseEntity entity;
final Widget child; final Widget child;
final Function onDismissed; final Function onDismissed;
final Function onTap;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (!user.canEditEntity(entity)) {
return child;
}
return Dismissible( return Dismissible(
// TODO fix this properly https://github.com/flutter/flutter/issues/11825 // TODO fix this properly https://github.com/flutter/flutter/issues/11825
//key: Key(entity.entityKey), //key: Key(entity.entityKey),
key: Key(entity.entityKey + Random().nextInt(100000).toString()), key: Key(entity.entityKey + Random().nextInt(100000).toString()),
onDismissed: onDismissed, onDismissed: onDismissed,
child: child, child: child,
background: entity.isDeleted ? Container( background: entity.isDeleted
color: Colors.blue, ? Container(
child: const ListTile( color: Colors.blue,
leading: child: const ListTile(
const Icon(Icons.restore, color: Colors.white, size: 36.0)), leading: const Icon(Icons.restore,
) : Container( color: Colors.white, size: 36.0)),
color: Colors.red, )
child: const ListTile( : Container(
leading: color: Colors.red,
const Icon(Icons.delete, color: Colors.white, size: 36.0))), child: const ListTile(
secondaryBackground: entity.isArchived || entity.isDeleted ? Container( leading: const Icon(Icons.delete,
color: Colors.blue, color: Colors.white, size: 36.0))),
child: const ListTile( secondaryBackground: entity.isArchived || entity.isDeleted
trailing: ? Container(
const Icon(Icons.restore, color: Colors.white, size: 36.0)), color: Colors.blue,
) : Container( child: const ListTile(
color: Colors.orange, trailing: const Icon(Icons.restore,
child: const ListTile( color: Colors.white, size: 36.0)),
trailing: )
const Icon(Icons.archive, color: Colors.white, size: 36.0))), : Container(
color: Colors.orange,
child: const ListTile(
trailing: const Icon(Icons.archive,
color: Colors.white, size: 36.0))),
); );
} }
} }

View File

@ -93,6 +93,7 @@ class ClientList extends StatelessWidget {
final client = viewModel.clientMap[clientId]; final client = viewModel.clientMap[clientId];
return Column(children: <Widget>[ return Column(children: <Widget>[
ClientListItem( ClientListItem(
user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
client: client, client: client,
onDismissed: (DismissDirection direction) => onDismissed: (DismissDirection direction) =>

View File

@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart';
class ClientListItem extends StatelessWidget { class ClientListItem extends StatelessWidget {
final UserEntity user;
final DismissDirectionCallback onDismissed; final DismissDirectionCallback onDismissed;
final GestureTapCallback onTap; final GestureTapCallback onTap;
final GestureTapCallback onLongPress; final GestureTapCallback onLongPress;
@ -16,6 +17,7 @@ class ClientListItem extends StatelessWidget {
static final clientItemKey = (int id) => Key('__client_item_${id}__'); static final clientItemKey = (int id) => Key('__client_item_${id}__');
const ClientListItem({ const ClientListItem({
@required this.user,
@required this.onDismissed, @required this.onDismissed,
@required this.onTap, @required this.onTap,
@required this.onLongPress, @required this.onLongPress,
@ -32,6 +34,7 @@ class ClientListItem extends StatelessWidget {
: null; : null;
return DismissibleEntity( return DismissibleEntity(
user: user,
onDismissed: onDismissed, onDismissed: onDismissed,
entity: client, entity: client,
//entityKey: clientItemKey, //entityKey: clientItemKey,

View File

@ -155,6 +155,7 @@ class InvoiceList extends StatelessWidget {
return Column( return Column(
children: <Widget>[ children: <Widget>[
InvoiceListItem( InvoiceListItem(
user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
invoice: invoice, invoice: invoice,
client: viewModel.clientMap[invoice.clientId], client: viewModel.clientMap[invoice.clientId],

View File

@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
class InvoiceListItem extends StatelessWidget { class InvoiceListItem extends StatelessWidget {
final UserEntity user;
final DismissDirectionCallback onDismissed; final DismissDirectionCallback onDismissed;
final GestureTapCallback onTap; final GestureTapCallback onTap;
final GestureTapCallback onLongPress; final GestureTapCallback onLongPress;
@ -16,6 +17,7 @@ class InvoiceListItem extends StatelessWidget {
final String filter; final String filter;
const InvoiceListItem({ const InvoiceListItem({
@required this.user,
@required this.onDismissed, @required this.onDismissed,
@required this.onTap, @required this.onTap,
@required this.onLongPress, @required this.onLongPress,
@ -32,6 +34,7 @@ class InvoiceListItem extends StatelessWidget {
: null; : null;
return DismissibleEntity( return DismissibleEntity(
user: user,
entity: invoice, entity: invoice,
onDismissed: onDismissed, onDismissed: onDismissed,
child: ListTile( child: ListTile(

View File

@ -93,6 +93,7 @@ class ProductList extends StatelessWidget {
final product = viewModel.productMap[productId]; final product = viewModel.productMap[productId];
return Column(children: <Widget>[ return Column(children: <Widget>[
ProductListItem( ProductListItem(
user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
product: product, product: product,
onDismissed: (DismissDirection direction) => onDismissed: (DismissDirection direction) =>

View File

@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart'; import 'package:invoiceninja_flutter/ui/app/dismissible_entity.dart';
class ProductListItem extends StatelessWidget { class ProductListItem extends StatelessWidget {
final UserEntity user;
final DismissDirectionCallback onDismissed; final DismissDirectionCallback onDismissed;
final GestureTapCallback onTap; final GestureTapCallback onTap;
final GestureTapCallback onLongPress; final GestureTapCallback onLongPress;
@ -16,6 +17,7 @@ class ProductListItem extends StatelessWidget {
static final productItemKey = (int id) => Key('__product_item_${id}__'); static final productItemKey = (int id) => Key('__product_item_${id}__');
const ProductListItem({ const ProductListItem({
@required this.user,
@required this.onDismissed, @required this.onDismissed,
@required this.onTap, @required this.onTap,
@required this.onLongPress, @required this.onLongPress,
@ -32,9 +34,9 @@ class ProductListItem extends StatelessWidget {
final subtitle = filterMatch ?? product.notes; final subtitle = filterMatch ?? product.notes;
return DismissibleEntity( return DismissibleEntity(
user: user,
entity: product, entity: product,
onDismissed: onDismissed, onDismissed: onDismissed,
onTap: onTap,
child: ListTile( child: ListTile(
onTap: onTap, onTap: onTap,
onLongPress: onLongPress, onLongPress: onLongPress,