Expenses
This commit is contained in:
parent
e1cf7150af
commit
4ad28040c7
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue