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

View File

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

View File

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

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/redux/app/app_state.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/snackbar_row.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,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.paymentList.length,
itemBuilder: (BuildContext context, index) {
final paymentId = viewModel.paymentList[index];
final payment = state.paymentState.map[paymentId];
final client =
paymentClientSelector(paymentId, state);
return Column(
children: <Widget>[
PaymentListItem(
user: viewModel.user,
filter: viewModel.filter,
payment: payment,
onTap: () =>
viewModel.onPaymentTap(context, payment),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, payment, client);
} else {
viewModel.onEntityAction(
context, payment, action);
}
},
onLongPress: () =>
_showMenu(context, payment, client),
),
Divider(
height: 1.0,
),
],
return PaymentListItem(
user: viewModel.user,
filter: viewModel.filter,
payment: payment,
onTap: () =>
viewModel.onPaymentTap(context, payment),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, payment, client);
} else {
viewModel.onEntityAction(
context, payment, action);
}
},
onLongPress: () =>
_showMenu(context, payment, client),
);
},
),

View File

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

View File

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

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.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/snackbar_row.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,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.taskList.length,
itemBuilder: (BuildContext context, index) {
final taskId = viewModel.taskList[index];
final task = viewModel.taskMap[taskId];
final client = viewModel.clientMap[task.clientId] ??
ClientEntity();
return Column(
children: <Widget>[
TaskListItem(
user: viewModel.user,
filter: viewModel.filter,
task: task,
client: viewModel.clientMap[task.clientId] ??
ClientEntity(),
project: viewModel
.state.projectState.map[task.projectId],
onTap: () =>
viewModel.onTaskTap(context, task),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, task, client);
} else {
viewModel.onEntityAction(
context, task, action);
}
},
onLongPress: () =>
_showMenu(context, task, client),
),
Divider(
height: 1.0,
),
],
return TaskListItem(
user: viewModel.user,
filter: viewModel.filter,
task: task,
client: viewModel.clientMap[task.clientId] ??
ClientEntity(),
project: viewModel
.state.projectState.map[task.projectId],
onTap: () =>
viewModel.onTaskTap(context, task),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, task, client);
} else {
viewModel.onEntityAction(
context, task, action);
}
},
onLongPress: () =>
_showMenu(context, task, client),
);
},
),

View File

@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.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/snackbar_row.dart';
import 'package:invoiceninja_flutter/ui/vendor/vendor_list_item.dart';
@ -53,14 +54,6 @@ class VendorList extends StatelessWidget {
@override
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(
children: <Widget>[
Expanded(
@ -80,128 +73,33 @@ class VendorList extends StatelessWidget {
),
),
)
: ListView.builder(
: ListView.separated(
shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.vendorList.length,
itemBuilder: (BuildContext context, index) {
final vendorId = viewModel.vendorList[index];
final vendor = viewModel.vendorMap[vendorId];
return Column(
children: <Widget>[
VendorListItem(
user: viewModel.user,
filter: viewModel.filter,
vendor: vendor,
onTap: () =>
viewModel.onVendorTap(context, vendor),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, vendor);
} else {
viewModel.onEntityAction(
context, vendor, action);
}
},
onLongPress: () => _showMenu(context, vendor),
),
Divider(
height: 1.0,
),
],
return VendorListItem(
user: viewModel.user,
filter: viewModel.filter,
vendor: vendor,
onTap: () =>
viewModel.onVendorTap(context, vendor),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, vendor);
} else {
viewModel.onEntityAction(
context, vendor, action);
}
},
onLongPress: () => _showMenu(context, vendor),
);
},
),
),
),
/*
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,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.stubList.length,
itemBuilder: (BuildContext context, index) {
final stubId = viewModel.stubList[index];
final stub = viewModel.stubMap[stubId];
return Column(
children: <Widget>[
StubListItem(
user: viewModel.user,
filter: viewModel.filter,
stub: stub,
onTap: () =>
viewModel.onStubTap(context, stub),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, stub, null);
} else {
viewModel.onEntityAction(
context, stub, action);
}
},
onLongPress: () =>
_showMenu(context, stub, null),
),
Divider(
height: 1.0,
),
],
);
return StubListItem(
user: viewModel.user,
filter: viewModel.filter,
stub: stub,
onTap: () =>
viewModel.onStubTap(context, stub),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, stub, null);
} else {
viewModel.onEntityAction(
context, stub, action);
}
},
onLongPress: () =>
_showMenu(context, stub, null),
);
},
),
),
@ -166,8 +160,9 @@ class StubList extends StatelessWidget {
),
),
)
: ListView.builder(
: ListView.separated(
shrinkWrap: true,
separatorBuilder: (context, index) => ListDivider(),
itemCount: viewModel.stubList.length,
itemBuilder: (BuildContext context, index) {
final stubId = viewModel.stubList[index];
@ -175,33 +170,26 @@ class StubList extends StatelessWidget {
final client =
viewModel.clientMap[stub.clientId] ??
ClientEntity();
return Column(
children: <Widget>[
StubListItem(
user: viewModel.user,
filter: viewModel.filter,
stub: stub,
client:
viewModel.clientMap[stub.clientId] ??
ClientEntity(),
onTap: () =>
viewModel.onStubTap(context, stub),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, stub, client);
} else {
viewModel.onEntityAction(
context, stub, action);
}
},
onLongPress: () =>
_showMenu(context, stub, client),
),
Divider(
height: 1.0,
),
],
);
return StubListItem(
user: viewModel.user,
filter: viewModel.filter,
stub: stub,
client:
viewModel.clientMap[stub.clientId] ??
ClientEntity(),
onTap: () =>
viewModel.onStubTap(context, stub),
onEntityAction: (EntityAction action) {
if (action == EntityAction.more) {
_showMenu(context, stub, client);
} else {
viewModel.onEntityAction(
context, stub, action);
}
},
onLongPress: () =>
_showMenu(context, stub, client),
);
},
),
),