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,16 +125,13 @@ 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>[
ExpenseListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
expense: expense, expense: expense,
client: client, client: client,
vendor: vendor, vendor: vendor,
onTap: () => onTap: () => viewModel.onExpenseTap(context, expense),
viewModel.onExpenseTap(context, expense),
onEntityAction: (EntityAction action) { onEntityAction: (EntityAction action) {
if (action == EntityAction.more) { if (action == EntityAction.more) {
_showMenu(context, expense); _showMenu(context, expense);
@ -142,11 +141,6 @@ class ExpenseList extends StatelessWidget {
} }
}, },
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,14 +122,11 @@ class InvoiceList extends StatelessWidget {
final client = final client =
viewModel.clientMap[invoice.clientId] ?? viewModel.clientMap[invoice.clientId] ??
ClientEntity(); ClientEntity();
return Column( return InvoiceListItem(
children: <Widget>[
InvoiceListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
invoice: invoice, invoice: invoice,
client: client: viewModel.clientMap[invoice.clientId] ??
viewModel.clientMap[invoice.clientId] ??
ClientEntity(), ClientEntity(),
onTap: () => onTap: () =>
viewModel.onInvoiceTap(context, invoice), viewModel.onInvoiceTap(context, invoice),
@ -141,11 +140,6 @@ class InvoiceList extends StatelessWidget {
}, },
onLongPress: () => onLongPress: () =>
_showMenu(context, invoice, client), _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,17 +129,16 @@ 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>[
PaymentListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
payment: payment, payment: payment,
@ -154,11 +154,6 @@ class PaymentList extends StatelessWidget {
}, },
onLongPress: () => onLongPress: () =>
_showMenu(context, payment, client), _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,13 +75,13 @@ 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,
@ -93,11 +94,7 @@ class ProductList extends StatelessWidget {
}, },
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,9 +121,7 @@ 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>[
ProjectListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
project: project, project: project,
@ -140,11 +140,6 @@ class ProjectList extends StatelessWidget {
}, },
onLongPress: () => onLongPress: () =>
_showMenu(context, project, client), _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,17 +122,16 @@ 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>[
TaskListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
task: task, task: task,
@ -151,11 +151,6 @@ class TaskList extends StatelessWidget {
}, },
onLongPress: () => onLongPress: () =>
_showMenu(context, task, client), _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,15 +73,14 @@ 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>[
VendorListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
vendor: vendor, vendor: vendor,
@ -103,105 +95,11 @@ class VendorList extends StatelessWidget {
} }
}, },
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,15 +82,14 @@ 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>[
StubListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
stub: stub, stub: stub,
@ -106,11 +105,6 @@ class StubList extends StatelessWidget {
}, },
onLongPress: () => onLongPress: () =>
_showMenu(context, stub, null), _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,9 +170,7 @@ class StubList extends StatelessWidget {
final client = final client =
viewModel.clientMap[stub.clientId] ?? viewModel.clientMap[stub.clientId] ??
ClientEntity(); ClientEntity();
return Column( return StubListItem(
children: <Widget>[
StubListItem(
user: viewModel.user, user: viewModel.user,
filter: viewModel.filter, filter: viewModel.filter,
stub: stub, stub: stub,
@ -196,11 +189,6 @@ class StubList extends StatelessWidget {
}, },
onLongPress: () => onLongPress: () =>
_showMenu(context, stub, client), _showMenu(context, stub, client),
),
Divider(
height: 1.0,
),
],
); );
}, },
), ),