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 'package:flutter/widgets.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/data/models/models.dart';
import 'package:built_collection/built_collection.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 {
ViewClientList(this.context);
@ -244,3 +251,46 @@ class FilterClientsByCustom2 implements PersistUI {
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) {
_showMenu(context, client, viewModel.user);
} else {
Navigator.of(context).pop();
viewModel.onEntityAction(context, client, action);
}
},

View File

@ -5,9 +5,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.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/localization.dart';
import 'package:redux/redux.dart';
@ -80,50 +77,9 @@ class ClientListVM {
onClientTap: (context, client) {
store.dispatch(ViewClient(clientId: client.id, context: context));
},
onEntityAction: (context, client, action) {
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: 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;
},
onEntityAction:
(BuildContext context, ClientEntity client, EntityAction action) =>
handleClientAction(client, action, context),
onRefreshed: (context) => _handleRefresh(context),
);
}

View File

@ -70,149 +70,112 @@ class ClientViewVM {
}
return ClientViewVM(
isSaving: state.isSaving,
isLoading: state.isLoading,
isDirty: client.isNew,
client: client,
company: state.selectedCompany,
onEditPressed: (BuildContext context) {
final Completer<ClientEntity> completer = Completer<ClientEntity>();
store.dispatch(EditClient(
client: client, context: context, completer: completer));
completer.future.then((client) {
Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow(
message: AppLocalization.of(context).updatedClient,
)));
});
},
onEntityPressed: (BuildContext context, EntityType entityType,
[longPress = false]) {
switch (entityType) {
case EntityType.invoice:
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:
isSaving: state.isSaving,
isLoading: state.isLoading,
isDirty: client.isNew,
client: client,
company: state.selectedCompany,
onEditPressed: (BuildContext context) {
final Completer<ClientEntity> completer = Completer<ClientEntity>();
store.dispatch(
EditClient(client: client, context: context, completer: completer));
completer.future.then((client) {
Scaffold.of(context).showSnackBar(SnackBar(
content: SnackBarRow(
message: AppLocalization.of(context).updatedClient,
)));
});
},
onEntityPressed: (BuildContext context, EntityType entityType,
[longPress = false]) {
switch (entityType) {
case EntityType.invoice:
if (longPress) {
store.dispatch(EditInvoice(
context: context,
invoice: InvoiceEntity(company: state.selectedCompany)
.rebuild((b) => b.clientId = client.id),
context: context));
break;
case EntityAction.newExpense:
.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),
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.archive:
store.dispatch(ArchiveClientRequest(
popCompleter(context, localization.archivedClient),
client.id));
break;
case EntityAction.delete:
store.dispatch(DeleteClientRequest(
popCompleter(context, localization.deletedClient),
client.id));
break;
case EntityAction.restore:
store.dispatch(RestoreClientRequest(
snackBarCompleter(context, localization.restoredClient),
client.id));
break;
}
});
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) =>
handleClientAction(client, action, context),
);
}
final ClientEntity client;