This commit is contained in:
Hillel Coren 2019-06-14 12:17:56 +03:00
parent e1cf7150af
commit 4ad28040c7
4 changed files with 154 additions and 184 deletions

View File

@ -1,8 +1,15 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:built_collection/built_collection.dart'; import 'package:built_collection/built_collection.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
class ViewClientList implements PersistUI { class ViewClientList implements PersistUI {
ViewClientList(this.context); ViewClientList(this.context);
@ -244,3 +251,46 @@ class FilterClientsByCustom2 implements PersistUI {
final String value; final String value;
} }
void handleClientAction(
ClientEntity client, EntityAction action, BuildContext context) {
final store = StoreProvider.of<AppState>(context);
final state = store.state;
final CompanyEntity company = state.selectedCompany;
final localization = AppLocalization.of(context);
switch (action) {
case EntityAction.edit:
store.dispatch(EditClient(context: context, client: client));
break;
case EntityAction.newInvoice:
store.dispatch(EditInvoice(
invoice: InvoiceEntity(company: company)
.rebuild((b) => b.clientId = client.id),
context: context));
break;
case EntityAction.newExpense:
store.dispatch(EditExpense(
expense: ExpenseEntity(
company: company, client: client, uiState: state.uiState),
context: context));
break;
case EntityAction.enterPayment:
store.dispatch(EditPayment(
payment: PaymentEntity(company: company)
.rebuild((b) => b.clientId = client.id),
context: context));
break;
case EntityAction.restore:
store.dispatch(RestoreClientRequest(
snackBarCompleter(context, localization.restoredClient), client.id));
break;
case EntityAction.archive:
store.dispatch(ArchiveClientRequest(
snackBarCompleter(context, localization.archivedClient), client.id));
break;
case EntityAction.delete:
store.dispatch(DeleteClientRequest(
snackBarCompleter(context, localization.deletedClient), client.id));
break;
}
}

View File

@ -91,6 +91,7 @@ class ClientList extends StatelessWidget {
if (action == EntityAction.more) { if (action == EntityAction.more) {
_showMenu(context, client, viewModel.user); _showMenu(context, client, viewModel.user);
} else { } else {
Navigator.of(context).pop();
viewModel.onEntityAction(context, client, action); viewModel.onEntityAction(context, client, action);
} }
}, },

View File

@ -5,9 +5,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_actions.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_actions.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_actions.dart';
import 'package:invoiceninja_flutter/utils/completers.dart'; import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/localization.dart'; import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:redux/redux.dart'; import 'package:redux/redux.dart';
@ -80,50 +77,9 @@ class ClientListVM {
onClientTap: (context, client) { onClientTap: (context, client) {
store.dispatch(ViewClient(clientId: client.id, context: context)); store.dispatch(ViewClient(clientId: client.id, context: context));
}, },
onEntityAction: (context, client, action) { onEntityAction:
final localization = AppLocalization.of(context); (BuildContext context, ClientEntity client, EntityAction action) =>
switch (action) { handleClientAction(client, action, context),
case EntityAction.edit:
store.dispatch(EditClient(context: context, client: client));
break;
case EntityAction.newInvoice:
store.dispatch(EditInvoice(
invoice: InvoiceEntity(company: state.selectedCompany)
.rebuild((b) => b.clientId = client.id),
context: context));
break;
case EntityAction.newExpense:
store.dispatch(EditExpense(
expense: ExpenseEntity(
company: state.selectedCompany,
client: client,
uiState: state.uiState),
context: context));
break;
case EntityAction.enterPayment:
store.dispatch(EditPayment(
payment: PaymentEntity(company: state.selectedCompany)
.rebuild((b) => b.clientId = client.id),
context: context));
break;
case EntityAction.restore:
store.dispatch(RestoreClientRequest(
snackBarCompleter(context, localization.restoredClient),
client.id));
break;
case EntityAction.archive:
store.dispatch(ArchiveClientRequest(
snackBarCompleter(context, localization.archivedClient),
client.id));
break;
case EntityAction.delete:
store.dispatch(DeleteClientRequest(
snackBarCompleter(context, localization.deletedClient),
client.id));
break;
}
return false;
},
onRefreshed: (context) => _handleRefresh(context), onRefreshed: (context) => _handleRefresh(context),
); );
} }

View File

@ -70,149 +70,112 @@ class ClientViewVM {
} }
return ClientViewVM( return ClientViewVM(
isSaving: state.isSaving, isSaving: state.isSaving,
isLoading: state.isLoading, isLoading: state.isLoading,
isDirty: client.isNew, isDirty: client.isNew,
client: client, client: client,
company: state.selectedCompany, company: state.selectedCompany,
onEditPressed: (BuildContext context) { onEditPressed: (BuildContext context) {
final Completer<ClientEntity> completer = Completer<ClientEntity>(); final Completer<ClientEntity> completer = Completer<ClientEntity>();
store.dispatch(EditClient( store.dispatch(
client: client, context: context, completer: completer)); EditClient(client: client, context: context, completer: completer));
completer.future.then((client) { completer.future.then((client) {
Scaffold.of(context).showSnackBar(SnackBar( Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow( content: SnackBarRow(
message: AppLocalization.of(context).updatedClient, message: AppLocalization.of(context).updatedClient,
))); )));
}); });
}, },
onEntityPressed: (BuildContext context, EntityType entityType, onEntityPressed: (BuildContext context, EntityType entityType,
[longPress = false]) { [longPress = false]) {
switch (entityType) { switch (entityType) {
case EntityType.invoice: case EntityType.invoice:
if (longPress) { if (longPress) {
store.dispatch(EditInvoice(
context: context,
invoice: InvoiceEntity(company: state.selectedCompany)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterInvoicesByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewInvoiceList(context));
}
break;
case EntityType.quote:
if (longPress) {
store.dispatch(EditQuote(
context: context,
quote: InvoiceEntity(
company: state.selectedCompany, isQuote: true)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterQuotesByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewQuoteList(context));
}
break;
case EntityType.payment:
if (longPress) {
store.dispatch(EditPayment(
context: context,
payment: PaymentEntity(company: state.selectedCompany)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterPaymentsByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewPaymentList(context));
}
break;
case EntityType.project:
if (longPress) {
store.dispatch(EditProject(
context: context,
project: ProjectEntity()
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterProjectsByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewProjectList(context));
}
break;
case EntityType.task:
if (longPress) {
store.dispatch(EditTask(
context: context,
task: TaskEntity(isRunning: state.uiState.autoStartTasks)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterTasksByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewTaskList(context));
}
break;
case EntityType.expense:
if (longPress) {
store.dispatch(EditExpense(
context: context,
expense: ExpenseEntity(
company: state.selectedCompany,
client: client,
uiState: state.uiState)));
} else {
store.dispatch(FilterExpensesByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewExpenseList(context));
}
break;
}
},
onRefreshed: (context, loadActivities) =>
_handleRefresh(context, loadActivities),
onBackPressed: () {
if (state.uiState.currentRoute.contains(ClientScreen.route)) {
store.dispatch(UpdateCurrentRoute(ClientScreen.route));
}
},
onActionSelected: (BuildContext context, EntityAction action) {
final localization = AppLocalization.of(context);
switch (action) {
case EntityAction.newInvoice:
store.dispatch(EditInvoice( store.dispatch(EditInvoice(
context: context,
invoice: InvoiceEntity(company: state.selectedCompany) invoice: InvoiceEntity(company: state.selectedCompany)
.rebuild((b) => b.clientId = client.id), .rebuild((b) => b..clientId = client.id)));
context: context)); } else {
break; store.dispatch(FilterInvoicesByEntity(
case EntityAction.newExpense: entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewInvoiceList(context));
}
break;
case EntityType.quote:
if (longPress) {
store.dispatch(EditQuote(
context: context,
quote: InvoiceEntity(
company: state.selectedCompany, isQuote: true)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterQuotesByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewQuoteList(context));
}
break;
case EntityType.payment:
if (longPress) {
store.dispatch(EditPayment(
context: context,
payment: PaymentEntity(company: state.selectedCompany)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterPaymentsByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewPaymentList(context));
}
break;
case EntityType.project:
if (longPress) {
store.dispatch(EditProject(
context: context,
project:
ProjectEntity().rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterProjectsByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewProjectList(context));
}
break;
case EntityType.task:
if (longPress) {
store.dispatch(EditTask(
context: context,
task: TaskEntity(isRunning: state.uiState.autoStartTasks)
.rebuild((b) => b..clientId = client.id)));
} else {
store.dispatch(FilterTasksByEntity(
entityId: client.id, entityType: EntityType.client));
store.dispatch(ViewTaskList(context));
}
break;
case EntityType.expense:
if (longPress) {
store.dispatch(EditExpense( store.dispatch(EditExpense(
context: context,
expense: ExpenseEntity( expense: ExpenseEntity(
company: state.selectedCompany, company: state.selectedCompany,
client: client, client: client,
uiState: state.uiState), uiState: state.uiState)));
context: context)); } else {
break; store.dispatch(FilterExpensesByEntity(
case EntityAction.enterPayment: entityId: client.id, entityType: EntityType.client));
store.dispatch(EditPayment( store.dispatch(ViewExpenseList(context));
payment: PaymentEntity(company: state.selectedCompany) }
.rebuild((b) => b.clientId = client.id), break;
context: context)); }
break; },
case EntityAction.archive: onRefreshed: (context, loadActivities) =>
store.dispatch(ArchiveClientRequest( _handleRefresh(context, loadActivities),
popCompleter(context, localization.archivedClient), onBackPressed: () {
client.id)); if (state.uiState.currentRoute.contains(ClientScreen.route)) {
break; store.dispatch(UpdateCurrentRoute(ClientScreen.route));
case EntityAction.delete: }
store.dispatch(DeleteClientRequest( },
popCompleter(context, localization.deletedClient), onActionSelected: (BuildContext context, EntityAction action) =>
client.id)); handleClientAction(client, action, context),
break; );
case EntityAction.restore:
store.dispatch(RestoreClientRequest(
snackBarCompleter(context, localization.restoredClient),
client.id));
break;
}
});
} }
final ClientEntity client; final ClientEntity client;