Formatting

This commit is contained in:
Hillel Coren 2019-11-17 11:57:41 +02:00
parent c422ebd7bc
commit 758155131a
80 changed files with 230 additions and 225 deletions

View File

@ -424,4 +424,3 @@ const kPageSizes = [
'Letter', 'Letter',
'Tabloid', 'Tabloid',
]; ];

View File

@ -46,8 +46,7 @@ class ClientRepository {
if (Config.DEMO_MODE) { if (Config.DEMO_MODE) {
response = json.decode(kMockClients); response = json.decode(kMockClients);
} else { } else {
response = response = await webClient.get(url, credentials.token);
await webClient.get(url, credentials.token);
} }
final ClientListResponse clientResponse = final ClientListResponse clientResponse =

View File

@ -41,8 +41,7 @@ class DocumentRepository {
if (Config.DEMO_MODE) { if (Config.DEMO_MODE) {
response = json.decode(kMockDocuments); response = json.decode(kMockDocuments);
} else { } else {
response = response = await webClient.get(url, credentials.token);
await webClient.get(url, credentials.token);
} }
final DocumentListResponse documentResponse = final DocumentListResponse documentResponse =

View File

@ -43,8 +43,7 @@ class InvoiceRepository {
if (Config.DEMO_MODE) { if (Config.DEMO_MODE) {
response = json.decode(kMockInvoices); response = json.decode(kMockInvoices);
} else { } else {
response = response = await webClient.get(url, credentials.token);
await webClient.get(url, credentials.token);
} }
final InvoiceListResponse invoiceResponse = final InvoiceListResponse invoiceResponse =

View File

@ -30,8 +30,7 @@ class PaymentRepository {
if (Config.DEMO_MODE) { if (Config.DEMO_MODE) {
response = json.decode(kMockPayments); response = json.decode(kMockPayments);
} else { } else {
response = response = await webClient.get(url, credentials.token);
await webClient.get(url, credentials.token);
} }
final PaymentListResponse paymentResponse = final PaymentListResponse paymentResponse =

View File

@ -120,7 +120,6 @@ Map<String, String> _getHeaders(String token) => {
}; };
void _checkResponse(http.Response response) { void _checkResponse(http.Response response) {
if (Config.DEMO_MODE) { if (Config.DEMO_MODE) {
throw 'Saving is not supported in the demo'; throw 'Saving is not supported in the demo';
} }

View File

@ -226,8 +226,7 @@ class InvoiceNinjaAppState extends State<InvoiceNinjaApp> {
final state = widget.store.state; final state = widget.store.state;
Intl.defaultLocale = localeSelector(state); Intl.defaultLocale = localeSelector(state);
final localization = AppLocalization(Locale(Intl.defaultLocale)); final localization = AppLocalization(Locale(Intl.defaultLocale));
final accentColor = final accentColor = convertHexStringToColor(state.accentColor) ??
convertHexStringToColor(state.accentColor) ??
Colors.lightBlueAccent; Colors.lightBlueAccent;
return MaterialApp( return MaterialApp(
supportedLocales: kLanguages supportedLocales: kLanguages

View File

@ -0,0 +1 @@

View File

@ -314,15 +314,18 @@ void handleClientAction(
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestoreClientRequest( store.dispatch(RestoreClientRequest(
snackBarCompleter<Null>(context, localization.restoredClient), clientIds)); snackBarCompleter<Null>(context, localization.restoredClient),
clientIds));
break; break;
case EntityAction.archive: case EntityAction.archive:
store.dispatch(ArchiveClientRequest( store.dispatch(ArchiveClientRequest(
snackBarCompleter<Null>(context, localization.archivedClient), clientIds)); snackBarCompleter<Null>(context, localization.archivedClient),
clientIds));
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteClientRequest( store.dispatch(DeleteClientRequest(
snackBarCompleter<Null>(context, localization.deletedClient), clientIds)); snackBarCompleter<Null>(context, localization.deletedClient),
clientIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.clientListState.isInMultiselect()) { if (!store.state.clientListState.isInMultiselect()) {

View File

@ -297,7 +297,8 @@ void handleExpenseAction(
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteExpenseRequest( store.dispatch(DeleteExpenseRequest(
snackBarCompleter<Null>(context, localization.deletedExpense), expenseIds)); snackBarCompleter<Null>(context, localization.deletedExpense),
expenseIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.expenseListState.isInMultiselect()) { if (!store.state.expenseListState.isInMultiselect()) {

View File

@ -111,13 +111,12 @@ List<String> filteredExpensesSelector(
return list; return list;
} }
var memoizedExpenseStatsForVendor = memo2((String vendorId, var memoizedExpenseStatsForVendor = memo2(
BuiltMap<String, ExpenseEntity> expenseMap) => (String vendorId, BuiltMap<String, ExpenseEntity> expenseMap) =>
expenseStatsForVendor(vendorId, expenseMap)); expenseStatsForVendor(vendorId, expenseMap));
EntityStats expenseStatsForVendor( EntityStats expenseStatsForVendor(
String vendorId, String vendorId, BuiltMap<String, ExpenseEntity> expenseMap) {
BuiltMap<String, ExpenseEntity> expenseMap) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
expenseMap.forEach((expenseId, expense) { expenseMap.forEach((expenseId, expense) {
@ -133,13 +132,12 @@ EntityStats expenseStatsForVendor(
return EntityStats(countActive: countActive, countArchived: countArchived); return EntityStats(countActive: countActive, countArchived: countArchived);
} }
var memoizedExpenseStatsForClient = memo2((String clientId, var memoizedExpenseStatsForClient = memo2(
BuiltMap<String, ExpenseEntity> expenseMap) => (String clientId, BuiltMap<String, ExpenseEntity> expenseMap) =>
expenseStatsForClient(clientId, expenseMap)); expenseStatsForClient(clientId, expenseMap));
EntityStats expenseStatsForClient( EntityStats expenseStatsForClient(
String clientId, String clientId, BuiltMap<String, ExpenseEntity> expenseMap) {
BuiltMap<String, ExpenseEntity> expenseMap) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
expenseMap.forEach((expenseId, expense) { expenseMap.forEach((expenseId, expense) {

View File

@ -242,7 +242,6 @@ class FilterGroupsByEntity implements PersistUI {
void handleGroupAction( void handleGroupAction(
BuildContext context, List<BaseEntity> groups, EntityAction action) { BuildContext context, List<BaseEntity> groups, EntityAction action) {
if (groups.isEmpty) { if (groups.isEmpty) {
return; return;
} }
@ -267,15 +266,18 @@ void handleGroupAction(
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestoreGroupRequest( store.dispatch(RestoreGroupRequest(
snackBarCompleter<Null>(context, localization.restoredGroup), groupIds)); snackBarCompleter<Null>(context, localization.restoredGroup),
groupIds));
break; break;
case EntityAction.archive: case EntityAction.archive:
store.dispatch(ArchiveGroupRequest( store.dispatch(ArchiveGroupRequest(
snackBarCompleter<Null>(context, localization.archivedGroup), groupIds)); snackBarCompleter<Null>(context, localization.archivedGroup),
groupIds));
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteGroupRequest( store.dispatch(DeleteGroupRequest(
snackBarCompleter<Null>(context, localization.deletedGroup), groupIds)); snackBarCompleter<Null>(context, localization.deletedGroup),
groupIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.groupListState.isInMultiselect()) { if (!store.state.groupListState.isInMultiselect()) {

View File

@ -67,8 +67,8 @@ var memoizedClientStatsForGroup = memo2(
(BuiltMap<String, ClientEntity> clientMap, String groupId) => (BuiltMap<String, ClientEntity> clientMap, String groupId) =>
clientStatsForGroup(clientMap, groupId)); clientStatsForGroup(clientMap, groupId));
EntityStats clientStatsForGroup(BuiltMap<String, ClientEntity> clientMap, EntityStats clientStatsForGroup(
String groupId) { BuiltMap<String, ClientEntity> clientMap, String groupId) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
clientMap.forEach((clientId, client) { clientMap.forEach((clientId, client) {

View File

@ -381,7 +381,8 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
break; break;
case EntityAction.sendEmail: case EntityAction.sendEmail:
store.dispatch(ShowEmailInvoice( store.dispatch(ShowEmailInvoice(
completer: snackBarCompleter<Null>(context, localization.emailedInvoice), completer:
snackBarCompleter<Null>(context, localization.emailedInvoice),
invoice: invoice, invoice: invoice,
context: context)); context: context));
break; break;
@ -408,7 +409,8 @@ void handleInvoiceAction(BuildContext context, List<BaseEntity> invoices,
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteInvoiceRequest( store.dispatch(DeleteInvoiceRequest(
snackBarCompleter<Null>(context, localization.deletedInvoice), invoiceIds)); snackBarCompleter<Null>(context, localization.deletedInvoice),
invoiceIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.invoiceListState.isInMultiselect()) { if (!store.state.invoiceListState.isInMultiselect()) {

View File

@ -19,7 +19,8 @@ EntityUIState invoiceUIReducer(InvoiceUIState state, dynamic action) {
final editingItemIndexReducer = combineReducers<int>([ final editingItemIndexReducer = combineReducers<int>([
TypedReducer<int, EditInvoice>((index, action) => action.invoiceItemIndex), TypedReducer<int, EditInvoice>((index, action) => action.invoiceItemIndex),
TypedReducer<int, EditInvoiceItem>((index, action) => action.invoiceItemIndex), TypedReducer<int, EditInvoiceItem>(
(index, action) => action.invoiceItemIndex),
]); ]);
Reducer<String> dropdownFilterReducer = combineReducers([ Reducer<String> dropdownFilterReducer = combineReducers([

View File

@ -72,7 +72,6 @@ List<String> filteredInvoicesSelector(
} }
} }
if (!invoice.matchesStates(invoiceListState.stateFilters)) { if (!invoice.matchesStates(invoiceListState.stateFilters)) {
return false; return false;
} }
@ -102,13 +101,12 @@ List<String> filteredInvoicesSelector(
return list; return list;
} }
var memoizedInvoiceStatsForClient = memo2((String clientId, var memoizedInvoiceStatsForClient = memo2(
BuiltMap<String, InvoiceEntity> invoiceMap) => (String clientId, BuiltMap<String, InvoiceEntity> invoiceMap) =>
invoiceStatsForClient(clientId, invoiceMap)); invoiceStatsForClient(clientId, invoiceMap));
EntityStats invoiceStatsForClient( EntityStats invoiceStatsForClient(
String clientId, String clientId, BuiltMap<String, InvoiceEntity> invoiceMap) {
BuiltMap<String, InvoiceEntity> invoiceMap) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
invoiceMap.forEach((invoiceId, invoice) { invoiceMap.forEach((invoiceId, invoice) {
@ -124,13 +122,12 @@ EntityStats invoiceStatsForClient(
return EntityStats(countActive: countActive, countArchived: countArchived); return EntityStats(countActive: countActive, countArchived: countArchived);
} }
var memoizedInvoiceStatsForUser = memo2((String userId, var memoizedInvoiceStatsForUser = memo2(
BuiltMap<String, InvoiceEntity> invoiceMap) => (String userId, BuiltMap<String, InvoiceEntity> invoiceMap) =>
invoiceStatsForUser(userId, invoiceMap)); invoiceStatsForUser(userId, invoiceMap));
EntityStats invoiceStatsForUser( EntityStats invoiceStatsForUser(
String userId, String userId, BuiltMap<String, InvoiceEntity> invoiceMap) {
BuiltMap<String, InvoiceEntity> invoiceMap) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
invoiceMap.forEach((invoiceId, invoice) { invoiceMap.forEach((invoiceId, invoice) {

View File

@ -278,7 +278,8 @@ void handlePaymentAction(
break; break;
case EntityAction.sendEmail: case EntityAction.sendEmail:
store.dispatch(EmailPaymentRequest( store.dispatch(EmailPaymentRequest(
snackBarCompleter<Null>(context, localization.emailedPayment), payment)); snackBarCompleter<Null>(context, localization.emailedPayment),
payment));
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestorePaymentRequest( store.dispatch(RestorePaymentRequest(
@ -292,7 +293,8 @@ void handlePaymentAction(
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeletePaymentRequest( store.dispatch(DeletePaymentRequest(
snackBarCompleter<Null>(context, localization.deletedPayment), paymentIds)); snackBarCompleter<Null>(context, localization.deletedPayment),
paymentIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.paymentListState.isInMultiselect()) { if (!store.state.paymentListState.isInMultiselect()) {

View File

@ -245,7 +245,8 @@ void handleProductAction(
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteProductRequest( store.dispatch(DeleteProductRequest(
snackBarCompleter<Null>(context, localization.deletedProduct), productIds)); snackBarCompleter<Null>(context, localization.deletedProduct),
productIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.productListState.isInMultiselect()) { if (!store.state.productListState.isInMultiselect()) {

View File

@ -131,13 +131,12 @@ Duration taskDurationForProject(
return Duration(seconds: total); return Duration(seconds: total);
} }
var memoizedProjectStatsForClient = memo2((String clientId, var memoizedProjectStatsForClient = memo2(
BuiltMap<String, ProjectEntity> projectMap) => (String clientId, BuiltMap<String, ProjectEntity> projectMap) =>
projectStatsForClient(clientId, projectMap)); projectStatsForClient(clientId, projectMap));
EntityStats projectStatsForClient( EntityStats projectStatsForClient(
String clientId, String clientId, BuiltMap<String, ProjectEntity> projectMap) {
BuiltMap<String, ProjectEntity> projectMap) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
projectMap.forEach((projectId, project) { projectMap.forEach((projectId, project) {

View File

@ -409,7 +409,8 @@ Future handleQuoteAction(
break; break;
case EntityAction.sendEmail: case EntityAction.sendEmail:
store.dispatch(ShowEmailQuote( store.dispatch(ShowEmailQuote(
completer: snackBarCompleter<Null>(context, localization.emailedQuote), completer:
snackBarCompleter<Null>(context, localization.emailedQuote),
quote: quote, quote: quote,
context: context)); context: context));
break; break;
@ -422,15 +423,18 @@ Future handleQuoteAction(
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestoreQuoteRequest( store.dispatch(RestoreQuoteRequest(
snackBarCompleter<Null>(context, localization.restoredQuote), quoteIds)); snackBarCompleter<Null>(context, localization.restoredQuote),
quoteIds));
break; break;
case EntityAction.archive: case EntityAction.archive:
store.dispatch(ArchiveQuoteRequest( store.dispatch(ArchiveQuoteRequest(
snackBarCompleter<Null>(context, localization.archivedQuote), quoteIds)); snackBarCompleter<Null>(context, localization.archivedQuote),
quoteIds));
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteQuoteRequest( store.dispatch(DeleteQuoteRequest(
snackBarCompleter<Null>(context, localization.deletedQuote), quoteIds)); snackBarCompleter<Null>(context, localization.deletedQuote),
quoteIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.quoteListState.isInMultiselect()) { if (!store.state.quoteListState.isInMultiselect()) {

View File

@ -24,7 +24,6 @@ List<String> filteredQuotesSelector(
final client = final client =
clientMap[quote.clientId] ?? ClientEntity(id: quote.clientId); clientMap[quote.clientId] ?? ClientEntity(id: quote.clientId);
if (quoteListState.filterEntityType == EntityType.client) { if (quoteListState.filterEntityType == EntityType.client) {
if (!quoteListState.entityMatchesFilter(client)) { if (!quoteListState.entityMatchesFilter(client)) {
return false; return false;
@ -70,13 +69,12 @@ List<String> filteredQuotesSelector(
return list; return list;
} }
var memoizedQuoteStatsForClient = memo2((String clientId, var memoizedQuoteStatsForClient = memo2(
BuiltMap<String, InvoiceEntity> quoteMap) => (String clientId, BuiltMap<String, InvoiceEntity> quoteMap) =>
quoteStatsForClient(clientId, quoteMap)); quoteStatsForClient(clientId, quoteMap));
EntityStats quoteStatsForClient( EntityStats quoteStatsForClient(
String clientId, String clientId, BuiltMap<String, InvoiceEntity> quoteMap) {
BuiltMap<String, InvoiceEntity> quoteMap) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
quoteMap.forEach((quoteId, quote) { quoteMap.forEach((quoteId, quote) {
@ -92,13 +90,14 @@ EntityStats quoteStatsForClient(
return EntityStats(countActive: countActive, countArchived: countArchived); return EntityStats(countActive: countActive, countArchived: countArchived);
} }
var memoizedQuoteStatsForUser = memo2((String userId, var memoizedQuoteStatsForUser = memo2(
BuiltMap<String, InvoiceEntity> quoteMap) => (String userId, BuiltMap<String, InvoiceEntity> quoteMap) =>
quoteStatsForUser(userId, quoteMap)); quoteStatsForUser(userId, quoteMap));
EntityStats quoteStatsForUser( EntityStats quoteStatsForUser(
String userId, String userId,
BuiltMap<String, InvoiceEntity> quoteMap,) { BuiltMap<String, InvoiceEntity> quoteMap,
) {
int countActive = 0; int countActive = 0;
int countArchived = 0; int countArchived = 0;
quoteMap.forEach((quoteId, quote) { quoteMap.forEach((quoteId, quote) {

View File

@ -345,11 +345,13 @@ void handleTaskAction(
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestoreTaskRequest( store.dispatch(RestoreTaskRequest(
snackBarCompleter<Null>(context, localization.restoredTask), taskIds)); snackBarCompleter<Null>(context, localization.restoredTask),
taskIds));
break; break;
case EntityAction.archive: case EntityAction.archive:
store.dispatch(ArchiveTaskRequest( store.dispatch(ArchiveTaskRequest(
snackBarCompleter<Null>(context, localization.archivedTask), taskIds)); snackBarCompleter<Null>(context, localization.archivedTask),
taskIds));
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteTaskRequest( store.dispatch(DeleteTaskRequest(

View File

@ -273,7 +273,8 @@ void handleTaxRateAction(
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteTaxRateRequest( store.dispatch(DeleteTaxRateRequest(
snackBarCompleter<Null>(context, localization.deletedTaxRate), taxRateIds)); snackBarCompleter<Null>(context, localization.deletedTaxRate),
taxRateIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.taxRateListState.isInMultiselect()) { if (!store.state.taxRateListState.isInMultiselect()) {

View File

@ -122,6 +122,4 @@ abstract class UIState implements Built<UIState, UIStateBuilder> {
} }
bool get isEditing => currentRoute.endsWith('edit'); bool get isEditing => currentRoute.endsWith('edit');
} }

View File

@ -244,7 +244,6 @@ class FilterUsersByEntity implements PersistUI {
void handleUserAction( void handleUserAction(
BuildContext context, List<BaseEntity> users, EntityAction action) { BuildContext context, List<BaseEntity> users, EntityAction action) {
if (users.isEmpty) { if (users.isEmpty) {
return; return;
} }
@ -261,11 +260,13 @@ void handleUserAction(
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestoreUserRequest( store.dispatch(RestoreUserRequest(
snackBarCompleter<Null>(context, localization.restoredUser), userIds)); snackBarCompleter<Null>(context, localization.restoredUser),
userIds));
break; break;
case EntityAction.archive: case EntityAction.archive:
store.dispatch(ArchiveUserRequest( store.dispatch(ArchiveUserRequest(
snackBarCompleter<Null>(context, localization.archivedUser), userIds)); snackBarCompleter<Null>(context, localization.archivedUser),
userIds));
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteUserRequest( store.dispatch(DeleteUserRequest(

View File

@ -300,15 +300,18 @@ void handleVendorAction(
break; break;
case EntityAction.restore: case EntityAction.restore:
store.dispatch(RestoreVendorRequest( store.dispatch(RestoreVendorRequest(
snackBarCompleter<Null>(context, localization.restoredVendor), vendorIds)); snackBarCompleter<Null>(context, localization.restoredVendor),
vendorIds));
break; break;
case EntityAction.archive: case EntityAction.archive:
store.dispatch(ArchiveVendorRequest( store.dispatch(ArchiveVendorRequest(
snackBarCompleter<Null>(context, localization.archivedVendor), vendorIds)); snackBarCompleter<Null>(context, localization.archivedVendor),
vendorIds));
break; break;
case EntityAction.delete: case EntityAction.delete:
store.dispatch(DeleteVendorRequest( store.dispatch(DeleteVendorRequest(
snackBarCompleter<Null>(context, localization.deletedVendor), vendorIds)); snackBarCompleter<Null>(context, localization.deletedVendor),
vendorIds));
break; break;
case EntityAction.toggleMultiselect: case EntityAction.toggleMultiselect:
if (!store.state.vendorListState.isInMultiselect()) { if (!store.state.vendorListState.isInMultiselect()) {

View File

@ -29,7 +29,9 @@ class FormCard extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
left: 16.0, top: 16.0, right: 16.0, bottom: 20.0), left: 16.0, top: 16.0, right: 16.0, bottom: 20.0),
child: child != null ? child : Container( child: child != null
? child
: Container(
width: double.infinity, width: double.infinity,
child: Column( child: Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,

View File

@ -97,10 +97,12 @@ class ListScaffold extends StatelessWidget {
builder: (context) => IconButton( builder: (context) => IconButton(
icon: Icon(Icons.menu), icon: Icon(Icons.menu),
onPressed: () { onPressed: () {
if (isMobile(context) || state.prefState.isHistoryFloated) { if (isMobile(context) ||
state.prefState.isHistoryFloated) {
Scaffold.of(context).openEndDrawer(); Scaffold.of(context).openEndDrawer();
} else { } else {
store.dispatch(UserSettingsChanged(sidebar: AppSidebar.history)); store.dispatch(
UserSettingsChanged(sidebar: AppSidebar.history));
} }
}, },
), ),

View File

@ -74,7 +74,9 @@ class ClientList extends StatelessWidget {
onTap: () => onTap: () =>
viewModel.onClientTap(context, client), viewModel.onClientTap(context, client),
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = store.state.prefState final longPressIsSelection = store
.state
.prefState
.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {

View File

@ -90,9 +90,7 @@ class ClientScreen extends StatelessWidget {
.toList(); .toList();
await showEntityActionsDialog( await showEntityActionsDialog(
entities: clients, entities: clients, context: context, multiselect: true);
context: context,
multiselect: true);
store.dispatch(ClearClientMultiselect(context: context)); store.dispatch(ClearClientMultiselect(context: context));
}, },
), ),

View File

@ -103,10 +103,10 @@ class ClientEditNotesState extends State<ClientEditNotes> {
labelText: localization.size, labelText: localization.size,
items: memoizedSizeList(state.staticState.sizeMap) items: memoizedSizeList(state.staticState.sizeMap)
.map((sizeId) => DropdownMenuItem( .map((sizeId) => DropdownMenuItem(
child: Text( child: Text(state.staticState.sizeMap[sizeId].name),
state.staticState.sizeMap[sizeId].name),
value: sizeId, value: sizeId,
)).toList(), ))
.toList(),
onChanged: (dynamic sizeId) => viewModel.onChanged( onChanged: (dynamic sizeId) => viewModel.onChanged(
client.rebuild((b) => b..sizeId = sizeId), client.rebuild((b) => b..sizeId = sizeId),
), ),

View File

@ -118,8 +118,8 @@ class ClientEditVM {
Navigator.of(context).pop(savedClient); Navigator.of(context).pop(savedClient);
} }
} else { } else {
store.dispatch( store.dispatch(ViewClient(
ViewClient(context: context, clientId: savedClient.id, force: true)); context: context, clientId: savedClient.id, force: true));
} }
}).catchError((Object error) { }).catchError((Object error) {
showDialog<ErrorDialog>( showDialog<ErrorDialog>(

View File

@ -32,9 +32,7 @@ class ClientOverview extends StatelessWidget {
final localization = AppLocalization.of(context); final localization = AppLocalization.of(context);
final client = viewModel.client; final client = viewModel.client;
final company = viewModel.company; final company = viewModel.company;
final state = StoreProvider final state = StoreProvider.of<AppState>(context).state;
.of<AppState>(context)
.state;
final statics = state.staticState; final statics = state.staticState;
final fields = <String, String>{}; final fields = <String, String>{};
final group = client.hasGroup ? state.groupState.map[client.groupId] : null; final group = client.hasGroup ? state.groupState.map[client.groupId] : null;
@ -73,9 +71,7 @@ class ClientOverview extends StatelessWidget {
: Container(), : Container(),
if (client.hasGroup) ...[ if (client.hasGroup) ...[
Material( Material(
color: Theme color: Theme.of(context).canvasColor,
.of(context)
.canvasColor,
child: ListTile( child: ListTile(
title: EntityStateTitle(entity: group), title: EntityStateTitle(entity: group),
leading: Icon(getEntityIcon(EntityType.group), size: 18.0), leading: Icon(getEntityIcon(EntityType.group), size: 18.0),
@ -167,7 +163,8 @@ class ClientOverview extends StatelessWidget {
} }
class EntityListTile extends StatelessWidget { class EntityListTile extends StatelessWidget {
const EntityListTile({this.icon, const EntityListTile(
{this.icon,
this.onTap, this.onTap,
this.onLongPress, this.onLongPress,
this.title, this.title,
@ -186,9 +183,7 @@ class EntityListTile extends StatelessWidget {
return Column( return Column(
children: <Widget>[ children: <Widget>[
Material( Material(
color: Theme color: Theme.of(context).canvasColor,
.of(context)
.canvasColor,
child: ListTile( child: ListTile(
title: Text(title), title: Text(title),
subtitle: Text(subtitle), subtitle: Text(subtitle),

View File

@ -110,8 +110,7 @@ class ClientViewVM {
if (longPress && client.isActive) { if (longPress && client.isActive) {
store.dispatch(EditQuote( store.dispatch(EditQuote(
context: context, context: context,
quote: InvoiceEntity( quote: InvoiceEntity(company: state.company, isQuote: true)));
company: state.company, isQuote: true)));
store.dispatch(UpdateQuoteClient(client: client)); store.dispatch(UpdateQuoteClient(client: client));
} else { } else {
store.dispatch(FilterQuotesByEntity( store.dispatch(FilterQuotesByEntity(

View File

@ -59,7 +59,9 @@ class CompanyGatewayListItem extends StatelessWidget {
? () => onEntityAction(EntityAction.toggleMultiselect) ? () => onEntityAction(EntityAction.toggleMultiselect)
: onTap, : onTap,
onLongPress: onLongPress, onLongPress: onLongPress,
trailing: onRemovePressed == null ? null : FlatButton( trailing: onRemovePressed == null
? null
: FlatButton(
child: Text(AppLocalization.of(context).remove), child: Text(AppLocalization.of(context).remove),
onPressed: onRemovePressed, onPressed: onRemovePressed,
), ),

View File

@ -184,12 +184,8 @@ class DashboardPanels extends StatelessWidget {
final isLoaded = viewModel.state.invoiceState.isLoaded; final isLoaded = viewModel.state.invoiceState.isLoaded;
final settings = viewModel.dashboardUIState; final settings = viewModel.dashboardUIState;
final state = viewModel.state; final state = viewModel.state;
final currentData = memoizedChartInvoices( final currentData = memoizedChartInvoices(state.staticState.currencyMap,
state.staticState.currencyMap, state.company, settings, state.invoiceState.map, state.clientState.map);
state.company,
settings,
state.invoiceState.map,
state.clientState.map);
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {
@ -244,12 +240,8 @@ class DashboardPanels extends StatelessWidget {
final settings = viewModel.dashboardUIState; final settings = viewModel.dashboardUIState;
final state = viewModel.state; final state = viewModel.state;
final isLoaded = state.quoteState.isLoaded; final isLoaded = state.quoteState.isLoaded;
final currentData = memoizedChartQuotes( final currentData = memoizedChartQuotes(state.staticState.currencyMap,
state.staticState.currencyMap, state.company, settings, state.quoteState.map, state.clientState.map);
state.company,
settings,
state.quoteState.map,
state.clientState.map);
List<ChartDataGroup> previousData; List<ChartDataGroup> previousData;
if (settings.enableComparison) { if (settings.enableComparison) {

View File

@ -70,8 +70,8 @@ class _DashboardScreenState extends State<DashboardScreen>
? null ? null
: IconButton( : IconButton(
icon: Icon(Icons.menu), icon: Icon(Icons.menu),
onPressed: () => onPressed: () => store
store.dispatch(UserSettingsChanged(sidebar: AppSidebar.menu)), .dispatch(UserSettingsChanged(sidebar: AppSidebar.menu)),
), ),
title: ListFilter( title: ListFilter(
title: AppLocalization.of(context).dashboard, title: AppLocalization.of(context).dashboard,
@ -96,7 +96,8 @@ class _DashboardScreenState extends State<DashboardScreen>
if (isMobile(context) || state.prefState.isHistoryFloated) { if (isMobile(context) || state.prefState.isHistoryFloated) {
Scaffold.of(context).openEndDrawer(); Scaffold.of(context).openEndDrawer();
} else { } else {
store.dispatch(UserSettingsChanged(sidebar: AppSidebar.history)); store.dispatch(
UserSettingsChanged(sidebar: AppSidebar.history));
} }
}, },
), ),

View File

@ -80,8 +80,7 @@ class DashboardVM {
onCurrencyChanged: (currencyId) => onCurrencyChanged: (currencyId) =>
store.dispatch(UpdateDashboardSettings(currencyId: currencyId)), store.dispatch(UpdateDashboardSettings(currencyId: currencyId)),
filter: filter, filter: filter,
filteredList: filteredList: memoizedFilteredSelector(filter, state.userCompanyState),
memoizedFilteredSelector(filter, state.userCompanyState),
); );
} }

View File

@ -71,7 +71,9 @@ class DocumentList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = store.state.prefState final longPressIsSelection = store
.state
.prefState
.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {

View File

@ -82,7 +82,8 @@ class DocumentEditVM {
Navigator.of(context).pop(savedDocument); Navigator.of(context).pop(savedDocument);
} }
} else { } else {
store.dispatch(ViewDocument(context: context, documentId: savedDocument.id, force: true)); store.dispatch(ViewDocument(
context: context, documentId: savedDocument.id, force: true));
} }
}).catchError((Object error) { }).catchError((Object error) {
showDialog<ErrorDialog>( showDialog<ErrorDialog>(

View File

@ -86,8 +86,8 @@ class GroupEditVM {
Navigator.of(context).pop(savedGroup); Navigator.of(context).pop(savedGroup);
} }
} else { } else {
store.dispatch( store.dispatch(ViewGroup(
ViewGroup(context: context, groupId: savedGroup.id, force: true)); context: context, groupId: savedGroup.id, force: true));
} }
}).catchError((Object error) { }).catchError((Object error) {
showDialog<ErrorDialog>( showDialog<ErrorDialog>(

View File

@ -68,7 +68,9 @@ class GroupList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = store.state.prefState final longPressIsSelection = store
.state
.prefState
.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {

View File

@ -93,9 +93,7 @@ class GroupSettingsScreen extends StatelessWidget {
.toList(); .toList();
await showEntityActionsDialog( await showEntityActionsDialog(
entities: groups, entities: groups, context: context, multiselect: true);
context: context,
multiselect: true);
store.dispatch(ClearGroupMultiselect(context: context)); store.dispatch(ClearGroupMultiselect(context: context));
}, },
), ),

View File

@ -281,10 +281,8 @@ class SettingsViewer extends StatelessWidget {
settings.requireInvoiceSignature?.toString(), settings.requireInvoiceSignature?.toString(),
localization.requireQuoteSignature: localization.requireQuoteSignature:
settings.requireQuoteSignature?.toString(), settings.requireQuoteSignature?.toString(),
localization.allPagesHeader: localization.allPagesHeader: settings.allPagesHeader?.toString(),
settings.allPagesHeader?.toString(), localization.allPagesFooter: settings.allPagesFooter?.toString(),
localization.allPagesFooter:
settings.allPagesFooter?.toString(),
//localization.enableReminder1: settings.enableReminder1, //localization.enableReminder1: settings.enableReminder1,
//localization.enableReminder2: settings.enableReminder2, //localization.enableReminder2: settings.enableReminder2,
//localization.enableReminder3: settings.enableReminder3, //localization.enableReminder3: settings.enableReminder3,

View File

@ -166,8 +166,8 @@ class InvoiceEditDetailsState extends State<InvoiceEditDetails> {
), ),
UserPicker( UserPicker(
userId: invoice.assignedUserId, userId: invoice.assignedUserId,
onChanged: (userId) => viewModel onChanged: (userId) => viewModel.onChanged(
.onChanged(invoice.rebuild((b) => b..assignedUserId = userId)), invoice.rebuild((b) => b..assignedUserId = userId)),
), ),
DatePicker( DatePicker(
validator: (String val) => val.trim().isEmpty validator: (String val) => val.trim().isEmpty

View File

@ -69,7 +69,8 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector>
items.add( items.add(
convertProductToInvoiceItem(product: product, context: context)); convertProductToInvoiceItem(product: product, context: context));
} else { } else {
items.add(InvoiceItemEntity(productKey: product.productKey, quantity: 1)); items.add(
InvoiceItemEntity(productKey: product.productKey, quantity: 1));
} }
} else if (entity.entityType == EntityType.task) { } else if (entity.entityType == EntityType.task) {
final task = entity as TaskEntity; final task = entity as TaskEntity;

View File

@ -80,8 +80,8 @@ class InvoiceList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = final longPressIsSelection = state.prefState
state.prefState.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {
handleInvoiceAction(context, [invoice], handleInvoiceAction(context, [invoice],

View File

@ -160,7 +160,8 @@ class InvoiceOverview extends StatelessWidget {
invoice: invoice, invoice: invoice,
invoiceItem: invoiceItem, invoiceItem: invoiceItem,
onTap: () => userCompany.canEditEntity(invoice) onTap: () => userCompany.canEditEntity(invoice)
? viewModel.onEditPressed(context, invoice.lineItems.indexOf(invoiceItem)) ? viewModel.onEditPressed(
context, invoice.lineItems.indexOf(invoiceItem))
: null, : null,
); );
}, },

View File

@ -76,8 +76,8 @@ class PaymentList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = final longPressIsSelection = state.prefState
state.prefState.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {
handlePaymentAction(context, [payment], handlePaymentAction(context, [payment],

View File

@ -77,7 +77,9 @@ class ProjectList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = store.state.prefState final longPressIsSelection = store
.state
.prefState
.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {

View File

@ -82,7 +82,8 @@ class ProjectViewVM {
if (longPress) { if (longPress) {
showEntityActionsDialog( showEntityActionsDialog(
context: context, context: context,
entities: [client],); entities: [client],
);
} else { } else {
store.dispatch(ViewClient(clientId: client.id, context: context)); store.dispatch(ViewClient(clientId: client.id, context: context));
} }
@ -103,8 +104,8 @@ class ProjectViewVM {
}, },
onAddTaskPressed: (context) => store.dispatch(EditTask( onAddTaskPressed: (context) => store.dispatch(EditTask(
context: context, context: context,
task: task: TaskEntity(isRunning: state.prefState.autoStartTasks)
TaskEntity(isRunning: state.prefState.autoStartTasks).rebuild((b) => b .rebuild((b) => b
..projectId = project.id ..projectId = project.id
..clientId = project.clientId), ..clientId = project.clientId),
force: true, force: true,

View File

@ -126,8 +126,8 @@ class _ClientPortalState extends State<ClientPortal>
AppDropdownButton( AppDropdownButton(
labelText: localization.portalMode, labelText: localization.portalMode,
value: viewModel.company.portalMode, value: viewModel.company.portalMode,
onChanged: (dynamic value) => viewModel.onCompanyChanged(viewModel onChanged: (dynamic value) => viewModel.onCompanyChanged(
.company viewModel.company
.rebuild((b) => b..portalMode = value)), .rebuild((b) => b..portalMode = value)),
items: [ items: [
DropdownMenuItem( DropdownMenuItem(

View File

@ -292,7 +292,8 @@ class _CompanyDetailsState extends State<CompanyDetails>
child: Text( child: Text(
state.staticState.sizeMap[sizeId].name), state.staticState.sizeMap[sizeId].name),
value: sizeId, value: sizeId,
)).toList(), ))
.toList(),
onChanged: (dynamic sizeId) => viewModel.onCompanyChanged( onChanged: (dynamic sizeId) => viewModel.onCompanyChanged(
company.rebuild((b) => b..sizeId = sizeId), company.rebuild((b) => b..sizeId = sizeId),
), ),

View File

@ -140,7 +140,8 @@ class _EmailSettingsState extends State<EmailSettings>
label: localization.enableMarkup, label: localization.enableMarkup,
helpLabel: localization.enableMarkupHelp, helpLabel: localization.enableMarkupHelp,
value: settings.enableEmailMarkup, value: settings.enableEmailMarkup,
iconData: kIsWeb ? Icons.email : FontAwesomeIcons.solidEnvelope, iconData:
kIsWeb ? Icons.email : FontAwesomeIcons.solidEnvelope,
onChanged: (value) => viewModel.onSettingsChanged( onChanged: (value) => viewModel.onSettingsChanged(
settings.rebuild((b) => b..enableEmailMarkup = value)), settings.rebuild((b) => b..enableEmailMarkup = value)),
), ),

View File

@ -158,8 +158,9 @@ class _GeneratedNumbersState extends State<GeneratedNumbers>
AppDropdownButton( AppDropdownButton(
labelText: localization.resetCounter, labelText: localization.resetCounter,
value: settings.resetCounterFrequencyId, value: settings.resetCounterFrequencyId,
onChanged: (dynamic value) => viewModel.onSettingsChanged(settings onChanged: (dynamic value) => viewModel.onSettingsChanged(
.rebuild((b) => b..resetCounterFrequencyId = value)), settings.rebuild(
(b) => b..resetCounterFrequencyId = value)),
items: [ items: [
DropdownMenuItem<String>( DropdownMenuItem<String>(
child: Text(localization.never), child: Text(localization.never),

View File

@ -83,7 +83,8 @@ class _InvoiceDesignState extends State<InvoiceDesign>
AppDropdownButton( AppDropdownButton(
labelText: localization.invoiceDesign, labelText: localization.invoiceDesign,
value: settings.defaultInvoiceDesignId, value: settings.defaultInvoiceDesignId,
onChanged: (dynamic value) => viewModel.onSettingsChanged(settings onChanged: (dynamic value) => viewModel.onSettingsChanged(
settings
.rebuild((b) => b..defaultInvoiceDesignId = value)), .rebuild((b) => b..defaultInvoiceDesignId = value)),
items: designs items: designs
.map((designId) => DropdownMenuItem<String>( .map((designId) => DropdownMenuItem<String>(

View File

@ -25,9 +25,7 @@ class SettingsScreenBuilder extends StatelessWidget {
} }
class SettingsScreenVM { class SettingsScreenVM {
SettingsScreenVM({ SettingsScreenVM({@required this.state});
@required this.state
});
final AppState state; final AppState state;
static SettingsScreenVM fromStore(Store<AppState> store) { static SettingsScreenVM fromStore(Store<AppState> store) {

View File

@ -315,8 +315,8 @@ class _TemplatesAndRemindersState extends State<TemplatesAndReminders>
AppDropdownButton( AppDropdownButton(
labelText: localization.frequency, labelText: localization.frequency,
value: settings.endlessReminderFrequencyId, value: settings.endlessReminderFrequencyId,
onChanged: (dynamic value) => viewModel.onSettingsChanged( onChanged: (dynamic value) =>
settings.rebuild( viewModel.onSettingsChanged(settings.rebuild(
(b) => b..endlessReminderFrequencyId = value)), (b) => b..endlessReminderFrequencyId = value)),
items: kFrequencies items: kFrequencies
.map((id, frequency) => .map((id, frequency) =>

View File

@ -75,8 +75,8 @@ class TaskList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = final longPressIsSelection = state.prefState
state.prefState.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {
handleTaskAction(context, [task], handleTaskAction(context, [task],

View File

@ -90,9 +90,7 @@ class TaskScreen extends StatelessWidget {
.toList(); .toList();
await showEntityActionsDialog( await showEntityActionsDialog(
entities: tasks, entities: tasks, context: context, multiselect: true);
context: context,
multiselect: true);
store.dispatch(ClearTaskMultiselect(context: context)); store.dispatch(ClearTaskMultiselect(context: context));
}, },
), ),

View File

@ -63,7 +63,9 @@ class TaxRateList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = store.state.prefState final longPressIsSelection = store
.state
.prefState
.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {

View File

@ -94,9 +94,7 @@ class UserScreen extends StatelessWidget {
.toList(); .toList();
await showEntityActionsDialog( await showEntityActionsDialog(
entities: users, entities: users, context: context, multiselect: true);
context: context,
multiselect: true);
store.dispatch(ClearUserMultiselect(context: context)); store.dispatch(ClearUserMultiselect(context: context));
}, },
), ),

View File

@ -109,8 +109,7 @@ class UserViewVM {
if (longPress && user.isActive) { if (longPress && user.isActive) {
store.dispatch(EditQuote( store.dispatch(EditQuote(
context: context, context: context,
quote: InvoiceEntity( quote: InvoiceEntity(company: state.company, isQuote: true)));
company: state.company, isQuote: true)));
} else { } else {
store.dispatch(FilterQuotesByEntity( store.dispatch(FilterQuotesByEntity(
entityId: user.id, entityType: EntityType.user)); entityId: user.id, entityType: EntityType.user));

View File

@ -100,8 +100,8 @@ class VendorEditVM {
Navigator.of(context).pop(savedVendor); Navigator.of(context).pop(savedVendor);
} }
} else { } else {
store.dispatch( store.dispatch(ViewVendor(
ViewVendor(context: context, vendorId: savedVendor.id, force: true)); context: context, vendorId: savedVendor.id, force: true));
} }
}).catchError((Object error) { }).catchError((Object error) {
showDialog<ErrorDialog>( showDialog<ErrorDialog>(

View File

@ -62,7 +62,9 @@ class VendorList extends StatelessWidget {
} }
}, },
onLongPress: () async { onLongPress: () async {
final longPressIsSelection = store.state.prefState final longPressIsSelection = store
.state
.prefState
.longPressSelectionIsDefault ?? .longPressSelectionIsDefault ??
true; true;
if (longPressIsSelection && !isInMultiselect) { if (longPressIsSelection && !isInMultiselect) {

View File

@ -95,8 +95,8 @@ class VendorViewVM {
if (longPress && vendor.isActive) { if (longPress && vendor.isActive) {
store.dispatch(EditExpense( store.dispatch(EditExpense(
context: context, context: context,
expense: ExpenseEntity( expense:
company: state.company, vendor: vendor))); ExpenseEntity(company: state.company, vendor: vendor)));
} else { } else {
store.dispatch(FilterExpensesByEntity( store.dispatch(FilterExpensesByEntity(
entityId: vendor.id, entityType: EntityType.vendor)); entityId: vendor.id, entityType: EntityType.vendor));

View File

@ -64,8 +64,7 @@ String formatNumber(
final state = StoreProvider.of<AppState>(context).state; final state = StoreProvider.of<AppState>(context).state;
final CompanyEntity company = state.company; final CompanyEntity company = state.company;
final ClientEntity client = final ClientEntity client = state.userCompanyState.clientState.map[clientId];
state.userCompanyState.clientState.map[clientId];
String countryId; String countryId;

View File

@ -81,7 +81,6 @@ IconData getEntityIcon(EntityType entityType) {
} }
} }
switch (entityType) { switch (entityType) {
case EntityType.product: case EntityType.product:
return FontAwesomeIcons.cube; return FontAwesomeIcons.cube;