This commit is contained in:
Hillel Coren 2019-06-13 16:10:24 +03:00
parent 52cfaad2b9
commit 4c5c250698
10 changed files with 192 additions and 327 deletions

View File

@ -0,0 +1,10 @@
import 'package:flutter/material.dart';
class ListDivider extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Divider(
height: 1,
);
}
}

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
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';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/client/client_list_vm.dart'; import 'package:invoiceninja_flutter/ui/client/client_list_vm.dart';
@ -77,9 +78,7 @@ class ClientList extends StatelessWidget {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () => viewModel.onRefreshed(context), onRefresh: () => viewModel.onRefreshed(context),
child: ListView.separated( child: ListView.separated(
separatorBuilder: (context, index) => Divider( separatorBuilder: (context, index) => ListDivider(),
height: 1,
),
itemCount: viewModel.clientList.length, itemCount: viewModel.clientList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final clientId = viewModel.clientList[index]; final clientId = viewModel.clientList[index];

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
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';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/expense/expense_list_item.dart'; import 'package:invoiceninja_flutter/ui/expense/expense_list_item.dart';
@ -113,8 +114,9 @@ class ExpenseList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.expenseList.length, itemCount: viewModel.expenseList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final expenseId = viewModel.expenseList[index]; final expenseId = viewModel.expenseList[index];
@ -123,30 +125,22 @@ class ExpenseList extends StatelessWidget {
viewModel.state.clientState.map[expense.clientId]; viewModel.state.clientState.map[expense.clientId];
final vendor = final vendor =
viewModel.state.vendorState.map[expense.vendorId]; viewModel.state.vendorState.map[expense.vendorId];
return Column( return ExpenseListItem(
children: <Widget>[ user: viewModel.user,
ExpenseListItem( filter: viewModel.filter,
user: viewModel.user, expense: expense,
filter: viewModel.filter, client: client,
expense: expense, vendor: vendor,
client: client, onTap: () => viewModel.onExpenseTap(context, expense),
vendor: vendor, onEntityAction: (EntityAction action) {
onTap: () => if (action == EntityAction.more) {
viewModel.onExpenseTap(context, expense), _showMenu(context, expense);
onEntityAction: (EntityAction action) { } else {
if (action == EntityAction.more) { viewModel.onEntityAction(
_showMenu(context, expense); context, expense, action);
} else { }
viewModel.onEntityAction( },
context, expense, action); onLongPress: () => _showMenu(context, expense),
}
},
onLongPress: () => _showMenu(context, expense),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),

View File

@ -2,6 +2,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/invoice/invoice_list_item.dart'; import 'package:invoiceninja_flutter/ui/invoice/invoice_list_item.dart';
@ -111,8 +112,9 @@ class InvoiceList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.invoiceList.length, itemCount: viewModel.invoiceList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final invoiceId = viewModel.invoiceList[index]; final invoiceId = viewModel.invoiceList[index];
@ -120,32 +122,24 @@ class InvoiceList extends StatelessWidget {
final client = final client =
viewModel.clientMap[invoice.clientId] ?? viewModel.clientMap[invoice.clientId] ??
ClientEntity(); ClientEntity();
return Column( return InvoiceListItem(
children: <Widget>[ user: viewModel.user,
InvoiceListItem( filter: viewModel.filter,
user: viewModel.user, invoice: invoice,
filter: viewModel.filter, client: viewModel.clientMap[invoice.clientId] ??
invoice: invoice, ClientEntity(),
client: onTap: () =>
viewModel.clientMap[invoice.clientId] ?? viewModel.onInvoiceTap(context, invoice),
ClientEntity(), onEntityAction: (EntityAction action) {
onTap: () => if (action == EntityAction.more) {
viewModel.onInvoiceTap(context, invoice), _showMenu(context, invoice, client);
onEntityAction: (EntityAction action) { } else {
if (action == EntityAction.more) { viewModel.onEntityAction(
_showMenu(context, invoice, client); context, invoice, action);
} else { }
viewModel.onEntityAction( },
context, invoice, action); onLongPress: () =>
} _showMenu(context, invoice, client),
},
onLongPress: () =>
_showMenu(context, invoice, client),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),

View File

@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/payment_model.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart'; import 'package:invoiceninja_flutter/redux/payment/payment_selectors.dart';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/payment/payment_list_item.dart'; import 'package:invoiceninja_flutter/ui/payment/payment_list_item.dart';
@ -128,37 +129,31 @@ class PaymentList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.paymentList.length, itemCount: viewModel.paymentList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final paymentId = viewModel.paymentList[index]; final paymentId = viewModel.paymentList[index];
final payment = state.paymentState.map[paymentId]; final payment = state.paymentState.map[paymentId];
final client = final client =
paymentClientSelector(paymentId, state); paymentClientSelector(paymentId, state);
return Column( return PaymentListItem(
children: <Widget>[ user: viewModel.user,
PaymentListItem( filter: viewModel.filter,
user: viewModel.user, payment: payment,
filter: viewModel.filter, onTap: () =>
payment: payment, viewModel.onPaymentTap(context, payment),
onTap: () => onEntityAction: (EntityAction action) {
viewModel.onPaymentTap(context, payment), if (action == EntityAction.more) {
onEntityAction: (EntityAction action) { _showMenu(context, payment, client);
if (action == EntityAction.more) { } else {
_showMenu(context, payment, client); viewModel.onEntityAction(
} else { context, payment, action);
viewModel.onEntityAction( }
context, payment, action); },
} onLongPress: () =>
}, _showMenu(context, payment, client),
onLongPress: () =>
_showMenu(context, payment, client),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
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';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/product/product_list_item.dart'; import 'package:invoiceninja_flutter/ui/product/product_list_item.dart';
@ -74,30 +75,26 @@ class ProductList extends StatelessWidget {
Widget _buildListView(BuildContext context) { Widget _buildListView(BuildContext context) {
return RefreshIndicator( return RefreshIndicator(
onRefresh: () => viewModel.onRefreshed(context), onRefresh: () => viewModel.onRefreshed(context),
child: ListView.builder( child: ListView.separated(
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.productList.length, itemCount: viewModel.productList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final productId = viewModel.productList[index]; final productId = viewModel.productList[index];
final product = viewModel.productMap[productId]; final product = viewModel.productMap[productId];
return Column(children: <Widget>[ return ProductListItem(
ProductListItem( user: viewModel.user,
user: viewModel.user, filter: viewModel.filter,
filter: viewModel.filter, product: product,
product: product, onEntityAction: (EntityAction action) {
onEntityAction: (EntityAction action) { if (action == EntityAction.more) {
if (action == EntityAction.more) { _showMenu(context, product);
_showMenu(context, product); } else {
} else { viewModel.onEntityAction(context, product, action);
viewModel.onEntityAction(context, product, action); }
} },
}, onTap: () => viewModel.onProductTap(context, product),
onTap: () => viewModel.onProductTap(context, product), onLongPress: () => _showMenu(context, product),
onLongPress: () => _showMenu(context, product), );
),
Divider(
height: 1.0,
),
]);
}), }),
); );
} }

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
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';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/project/project_list_item.dart'; import 'package:invoiceninja_flutter/ui/project/project_list_item.dart';
@ -110,8 +111,9 @@ class ProjectList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.projectList.length, itemCount: viewModel.projectList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final projectId = viewModel.projectList[index]; final projectId = viewModel.projectList[index];
@ -119,32 +121,25 @@ class ProjectList extends StatelessWidget {
final client = final client =
viewModel.clientMap[project.clientId] ?? viewModel.clientMap[project.clientId] ??
ClientEntity(id: project.clientId); ClientEntity(id: project.clientId);
return Column( return ProjectListItem(
children: <Widget>[ user: viewModel.user,
ProjectListItem( filter: viewModel.filter,
user: viewModel.user, project: project,
filter: viewModel.filter, client:
project: project, viewModel.clientMap[project.clientId] ??
client: ClientEntity(),
viewModel.clientMap[project.clientId] ?? onTap: () =>
ClientEntity(), viewModel.onProjectTap(context, project),
onTap: () => onEntityAction: (EntityAction action) {
viewModel.onProjectTap(context, project), if (action == EntityAction.more) {
onEntityAction: (EntityAction action) { _showMenu(context, project, client);
if (action == EntityAction.more) { } else {
_showMenu(context, project, client); viewModel.onEntityAction(
} else { context, project, action);
viewModel.onEntityAction( }
context, project, action); },
} onLongPress: () =>
}, _showMenu(context, project, client),
onLongPress: () =>
_showMenu(context, project, client),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
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';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/task/task_list_item.dart'; import 'package:invoiceninja_flutter/ui/task/task_list_item.dart';
@ -121,41 +122,35 @@ class TaskList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.taskList.length, itemCount: viewModel.taskList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final taskId = viewModel.taskList[index]; final taskId = viewModel.taskList[index];
final task = viewModel.taskMap[taskId]; final task = viewModel.taskMap[taskId];
final client = viewModel.clientMap[task.clientId] ?? final client = viewModel.clientMap[task.clientId] ??
ClientEntity(); ClientEntity();
return Column( return TaskListItem(
children: <Widget>[ user: viewModel.user,
TaskListItem( filter: viewModel.filter,
user: viewModel.user, task: task,
filter: viewModel.filter, client: viewModel.clientMap[task.clientId] ??
task: task, ClientEntity(),
client: viewModel.clientMap[task.clientId] ?? project: viewModel
ClientEntity(), .state.projectState.map[task.projectId],
project: viewModel onTap: () =>
.state.projectState.map[task.projectId], viewModel.onTaskTap(context, task),
onTap: () => onEntityAction: (EntityAction action) {
viewModel.onTaskTap(context, task), if (action == EntityAction.more) {
onEntityAction: (EntityAction action) { _showMenu(context, task, client);
if (action == EntityAction.more) { } else {
_showMenu(context, task, client); viewModel.onEntityAction(
} else { context, task, action);
viewModel.onEntityAction( }
context, task, action); },
} onLongPress: () =>
}, _showMenu(context, task, client),
onLongPress: () =>
_showMenu(context, task, client),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
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';
import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart';
import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart'; import 'package:invoiceninja_flutter/ui/app/loading_indicator.dart';
import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart'; import 'package:invoiceninja_flutter/ui/app/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/vendor/vendor_list_item.dart'; import 'package:invoiceninja_flutter/ui/vendor/vendor_list_item.dart';
@ -53,14 +54,6 @@ class VendorList extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
/*
final localization = AppLocalization.of(context);
final listState = viewModel.listState;
final filteredClientId = listState.filterEntityId;
final filteredClient =
filteredClientId != null ? viewModel.clientMap[filteredClientId] : null;
*/
return Column( return Column(
children: <Widget>[ children: <Widget>[
Expanded( Expanded(
@ -80,128 +73,33 @@ class VendorList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.vendorList.length, itemCount: viewModel.vendorList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final vendorId = viewModel.vendorList[index]; final vendorId = viewModel.vendorList[index];
final vendor = viewModel.vendorMap[vendorId]; final vendor = viewModel.vendorMap[vendorId];
return Column( return VendorListItem(
children: <Widget>[ user: viewModel.user,
VendorListItem( filter: viewModel.filter,
user: viewModel.user, vendor: vendor,
filter: viewModel.filter, onTap: () =>
vendor: vendor, viewModel.onVendorTap(context, vendor),
onTap: () => onEntityAction: (EntityAction action) {
viewModel.onVendorTap(context, vendor), if (action == EntityAction.more) {
onEntityAction: (EntityAction action) { _showMenu(context, vendor);
if (action == EntityAction.more) { } else {
_showMenu(context, vendor); viewModel.onEntityAction(
} else { context, vendor, action);
viewModel.onEntityAction( }
context, vendor, action); },
} onLongPress: () => _showMenu(context, vendor),
},
onLongPress: () => _showMenu(context, vendor),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),
), ),
), ),
/*
filteredClient != null
? Material(
color: Colors.orangeAccent,
elevation: 6.0,
child: InkWell(
onTap: () => viewModel.onViewEntityFilterPressed(context),
child: Row(
children: <Widget>[
SizedBox(width: 18.0),
Expanded(
child: Text(
'${localization.filteredBy} ${filteredClient.listDisplayName}',
style: TextStyle(
color: Colors.white,
fontSize: 16.0,
),
),
),
IconButton(
icon: Icon(
Icons.close,
color: Colors.white,
),
onPressed: () => viewModel.onClearEntityFilterPressed(),
)
],
),
),
)
: Container(),
Expanded(
child: !viewModel.isLoaded
? LoadingIndicator()
: RefreshIndicator(
onRefresh: () => viewModel.onRefreshed(context),
child: viewModel.vendorList.isEmpty
? Opacity(
opacity: 0.5,
child: Center(
child: Text(
AppLocalization.of(context).noRecordsFound,
style: TextStyle(
fontSize: 18.0,
),
),
),
)
: ListView.builder(
shrinkWrap: true,
itemCount: viewModel.vendorList.length,
itemBuilder: (BuildContext context, index) {
final vendorId = viewModel.vendorList[index];
final vendor = viewModel.vendorMap[vendorId];
final client =
viewModel.clientMap[vendor.clientId] ??
ClientEntity();
return Column(
children: <Widget>[
VendorListItem(
user: viewModel.user,
filter: viewModel.filter,
vendor: vendor,
client:
viewModel.clientMap[vendor.clientId] ??
ClientEntity(),
onTap: () =>
viewModel.onVendorTap(context, vendor),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, vendor, client);
} else {
viewModel.onEntityAction(
context, vendor, action);
}
},
onLongPress: () =>
_showMenu(context, vendor, client),
),
Divider(
height: 1.0,
),
],
);
},
),
),
),*/
], ],
); );
} }

View File

@ -82,36 +82,30 @@ class StubList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.stubList.length, itemCount: viewModel.stubList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final stubId = viewModel.stubList[index]; final stubId = viewModel.stubList[index];
final stub = viewModel.stubMap[stubId]; final stub = viewModel.stubMap[stubId];
return Column( return StubListItem(
children: <Widget>[ user: viewModel.user,
StubListItem( filter: viewModel.filter,
user: viewModel.user, stub: stub,
filter: viewModel.filter, onTap: () =>
stub: stub, viewModel.onStubTap(context, stub),
onTap: () => onEntityAction: (EntityAction action) {
viewModel.onStubTap(context, stub), if (action == EntityAction.more) {
onEntityAction: (EntityAction action) { _showMenu(context, stub, null);
if (action == EntityAction.more) { } else {
_showMenu(context, stub, null); viewModel.onEntityAction(
} else { context, stub, action);
viewModel.onEntityAction( }
context, stub, action); },
} onLongPress: () =>
}, _showMenu(context, stub, null),
onLongPress: () => );
_showMenu(context, stub, null),
),
Divider(
height: 1.0,
),
],
);
}, },
), ),
), ),
@ -166,8 +160,9 @@ class StubList extends StatelessWidget {
), ),
), ),
) )
: ListView.builder( : ListView.separated(
shrinkWrap: true, shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.stubList.length, itemCount: viewModel.stubList.length,
itemBuilder: (BuildContext context, index) { itemBuilder: (BuildContext context, index) {
final stubId = viewModel.stubList[index]; final stubId = viewModel.stubList[index];
@ -175,33 +170,26 @@ class StubList extends StatelessWidget {
final client = final client =
viewModel.clientMap[stub.clientId] ?? viewModel.clientMap[stub.clientId] ??
ClientEntity(); ClientEntity();
return Column( return StubListItem(
children: <Widget>[ user: viewModel.user,
StubListItem( filter: viewModel.filter,
user: viewModel.user, stub: stub,
filter: viewModel.filter, client:
stub: stub, viewModel.clientMap[stub.clientId] ??
client: ClientEntity(),
viewModel.clientMap[stub.clientId] ?? onTap: () =>
ClientEntity(), viewModel.onStubTap(context, stub),
onTap: () => onEntityAction: (EntityAction action) {
viewModel.onStubTap(context, stub), if (action == EntityAction.more) {
onEntityAction: (EntityAction action) { _showMenu(context, stub, client);
if (action == EntityAction.more) { } else {
_showMenu(context, stub, client); viewModel.onEntityAction(
} else { context, stub, action);
viewModel.onEntityAction( }
context, stub, action); },
} onLongPress: () =>
}, _showMenu(context, stub, client),
onLongPress: () => );
_showMenu(context, stub, client),
),
Divider(
height: 1.0,
),
],
);
}, },
), ),
), ),