Improve edit page actions
This commit is contained in:
parent
c4cc156918
commit
da7ac8ebf4
|
|
@ -351,19 +351,18 @@ abstract class ExpenseEntity extends Object
|
|||
}
|
||||
}
|
||||
|
||||
if (userCompany.canCreate(EntityType.expense) &&
|
||||
!multiselect &&
|
||||
!isRecurring) {
|
||||
actions.add(EntityAction.cloneToExpense);
|
||||
}
|
||||
if (!multiselect && isOld) {
|
||||
if (userCompany.canCreate(EntityType.expense) && !isRecurring) {
|
||||
actions.add(EntityAction.cloneToExpense);
|
||||
}
|
||||
|
||||
if (userCompany.canCreate(EntityType.recurringExpense) && !multiselect) {
|
||||
actions.add(EntityAction.cloneToRecurring);
|
||||
}
|
||||
if (userCompany.canCreate(EntityType.expense) &&
|
||||
!multiselect &&
|
||||
isRecurring) {
|
||||
actions.add(EntityAction.cloneToExpense);
|
||||
if (userCompany.canCreate(EntityType.recurringExpense)) {
|
||||
actions.add(EntityAction.cloneToRecurring);
|
||||
}
|
||||
|
||||
if (userCompany.canCreate(EntityType.expense) && isRecurring) {
|
||||
actions.add(EntityAction.cloneToExpense);
|
||||
}
|
||||
}
|
||||
|
||||
if (actions.isNotEmpty && actions.last != null) {
|
||||
|
|
|
|||
|
|
@ -955,7 +955,7 @@ abstract class InvoiceEntity extends Object
|
|||
actions.add(null);
|
||||
}
|
||||
|
||||
if (!multiselect) {
|
||||
if (!multiselect && isOld) {
|
||||
int countOtherTypes = 0;
|
||||
if (userCompany.canCreate(EntityType.invoice)) {
|
||||
countOtherTypes++;
|
||||
|
|
|
|||
|
|
@ -115,6 +115,17 @@ class EntityAction extends EnumClass {
|
|||
|
||||
bool get isEmail => toString().startsWith('email');
|
||||
|
||||
bool get isServerSide => [
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.markPaid,
|
||||
EntityAction.markSent,
|
||||
EntityAction.convertToInvoice,
|
||||
EntityAction.approve,
|
||||
].contains(this);
|
||||
|
||||
bool get isClientSide => !isServerSide;
|
||||
|
||||
String toApiParam() {
|
||||
final value = toString();
|
||||
|
||||
|
|
|
|||
|
|
@ -606,7 +606,7 @@ abstract class TaskEntity extends Object
|
|||
}
|
||||
}
|
||||
|
||||
if (!multiselect) {
|
||||
if (!multiselect && isOld) {
|
||||
if (userCompany.canCreate(EntityType.task)) {
|
||||
actions.add(EntityAction.clone);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -179,23 +179,29 @@ class EditScaffold extends StatelessWidget {
|
|||
//size: iconSize,
|
||||
//color: color,
|
||||
),
|
||||
itemBuilder: (BuildContext context) => actions
|
||||
.map((action) => PopupMenuItem<EntityAction>(
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Icon(
|
||||
getEntityActionIcon(action),
|
||||
color:
|
||||
Theme.of(context).colorScheme.secondary,
|
||||
itemBuilder: (BuildContext context) =>
|
||||
<PopupMenuEntry<EntityAction>>[
|
||||
...actions
|
||||
.map((action) => action == null
|
||||
? PopupMenuDivider()
|
||||
: PopupMenuItem<EntityAction>(
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Icon(
|
||||
getEntityActionIcon(action),
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary,
|
||||
),
|
||||
SizedBox(width: 16.0),
|
||||
Text(AppLocalization.of(context)
|
||||
.lookup(action.toString())),
|
||||
],
|
||||
),
|
||||
SizedBox(width: 16.0),
|
||||
Text(AppLocalization.of(context)
|
||||
.lookup(action.toString())),
|
||||
],
|
||||
),
|
||||
value: action,
|
||||
))
|
||||
.toList(),
|
||||
value: action,
|
||||
))
|
||||
.toList()
|
||||
],
|
||||
onSelected: (action) => onActionPressed(context, action),
|
||||
enabled: isEnabled,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ class _CreditEditState extends State<CreditEdit>
|
|||
final state = viewModel.state;
|
||||
final prefState = state.prefState;
|
||||
final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice);
|
||||
final client = state.clientState.get(invoice.clientId);
|
||||
|
||||
return EditScaffold(
|
||||
isFullscreen: isFullscreen,
|
||||
|
|
@ -95,13 +96,10 @@ class _CreditEditState extends State<CreditEdit>
|
|||
title: invoice.isNew ? localization.newCredit : localization.editCredit,
|
||||
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||
onSavePressed: (context) => _onSavePressed(context),
|
||||
actions: [
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.emailCredit,
|
||||
if (!invoice.isSent) EntityAction.markSent,
|
||||
if (invoice.isOld) EntityAction.clone,
|
||||
],
|
||||
actions: invoice.getActions(
|
||||
userCompany: state.userCompany,
|
||||
client: client,
|
||||
),
|
||||
onActionPressed: (context, action) => _onSavePressed(context, action),
|
||||
appBarBottom: TabBar(
|
||||
controller: _controller,
|
||||
|
|
|
|||
|
|
@ -94,12 +94,8 @@ class CreditEditVM extends AbstractInvoiceEditVM {
|
|||
|
||||
if (credit.isOld &&
|
||||
!hasCreditChanges(credit, state.creditState.map) &&
|
||||
[
|
||||
EntityAction.emailCredit,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(credit, action);
|
||||
} else {
|
||||
final Completer<InvoiceEntity> completer =
|
||||
|
|
@ -131,12 +127,7 @@ class CreditEditVM extends AbstractInvoiceEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.emailCredit,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedCredit, action);
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ class _ExpenseEditState extends State<ExpenseEdit>
|
|||
final expense = viewModel.expense;
|
||||
final state = viewModel.state;
|
||||
final store = StoreProvider.of<AppState>(context);
|
||||
final client = state.clientState.get(expense.clientId);
|
||||
final prefState = state.prefState;
|
||||
final isFullscreen = prefState.isEditorFullScreen(EntityType.expense);
|
||||
final footer = localization.expenseTotal +
|
||||
|
|
@ -96,13 +97,10 @@ class _ExpenseEditState extends State<ExpenseEdit>
|
|||
: localization.editExpense),
|
||||
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||
onSavePressed: (context) => _onSavePressed(context),
|
||||
actions: [
|
||||
if (expense.isRecurring)
|
||||
if (expense.isRunning) EntityAction.stop else EntityAction.start,
|
||||
if (expense.isOld) EntityAction.clone,
|
||||
if (!expense.isRecurring && !expense.isInvoiced)
|
||||
EntityAction.invoiceExpense,
|
||||
],
|
||||
actions: expense.getActions(
|
||||
userCompany: state.userCompany,
|
||||
client: client,
|
||||
),
|
||||
onActionPressed: (context, action) => _onSavePressed(context, action),
|
||||
appBarBottom: TabBar(
|
||||
controller: _controller,
|
||||
|
|
|
|||
|
|
@ -144,10 +144,8 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
|
|||
|
||||
if (expense.isOld &&
|
||||
!hasExpenseChanges(expense, state.expenseState.map) &&
|
||||
[
|
||||
EntityAction.invoiceExpense,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(expense, action);
|
||||
} else {
|
||||
final Completer<ExpenseEntity> completer =
|
||||
|
|
@ -176,10 +174,7 @@ class ExpenseEditVM extends AbstractExpenseEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.invoiceExpense,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedExpense, action);
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ class _InvoiceEditState extends State<InvoiceEdit>
|
|||
final viewModel = widget.viewModel;
|
||||
final invoice = viewModel.invoice;
|
||||
final state = viewModel.state;
|
||||
final client = state.clientState.get(invoice.clientId);
|
||||
final prefState = state.prefState;
|
||||
final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice);
|
||||
|
||||
|
|
@ -119,15 +120,10 @@ class _InvoiceEditState extends State<InvoiceEdit>
|
|||
title: invoice.isNew ? localization.newInvoice : localization.editInvoice,
|
||||
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||
onSavePressed: (context) => _onSavePressed(context),
|
||||
actions: [
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.emailInvoice,
|
||||
if (!invoice.isSent) EntityAction.markSent,
|
||||
if (!invoice.isPaid) EntityAction.markPaid,
|
||||
if (!invoice.isPaid) EntityAction.newPayment,
|
||||
if (invoice.isOld) EntityAction.clone,
|
||||
],
|
||||
actions: invoice.getActions(
|
||||
userCompany: state.userCompany,
|
||||
client: client,
|
||||
),
|
||||
onActionPressed: (context, action) => _onSavePressed(context, action),
|
||||
appBarBottom: TabBar(
|
||||
controller: _controller,
|
||||
|
|
|
|||
|
|
@ -143,13 +143,8 @@ class InvoiceEditVM extends AbstractInvoiceEditVM {
|
|||
|
||||
if (invoice.isOld &&
|
||||
!hasInvoiceChanges(invoice, state.invoiceState.map) &&
|
||||
[
|
||||
EntityAction.newPayment,
|
||||
EntityAction.emailInvoice,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(invoice, action);
|
||||
} else {
|
||||
final Completer<InvoiceEntity> completer =
|
||||
|
|
@ -181,13 +176,7 @@ class InvoiceEditVM extends AbstractInvoiceEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.newPayment,
|
||||
EntityAction.emailInvoice,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedInvoice, action);
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
|
|
|
|||
|
|
@ -93,13 +93,8 @@ class QuoteEditVM extends AbstractInvoiceEditVM {
|
|||
}
|
||||
if (quote.isOld &&
|
||||
!hasQuoteChanges(quote, state.quoteState.map) &&
|
||||
[
|
||||
EntityAction.emailQuote,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.viewInvoice,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(quote, action);
|
||||
} else {
|
||||
final Completer<InvoiceEntity> completer =
|
||||
|
|
@ -130,13 +125,7 @@ class QuoteEditVM extends AbstractInvoiceEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.emailQuote,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.viewInvoice,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedQuote, action);
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ class _QuoteEditState extends State<QuoteEdit>
|
|||
final invoice = viewModel.invoice;
|
||||
final state = viewModel.state;
|
||||
final prefState = state.prefState;
|
||||
final client = state.clientState.get(invoice.clientId);
|
||||
final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice);
|
||||
|
||||
return EditScaffold(
|
||||
|
|
@ -95,16 +96,10 @@ class _QuoteEditState extends State<QuoteEdit>
|
|||
title: invoice.isNew ? localization.newQuote : localization.editQuote,
|
||||
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||
onSavePressed: (context) => _onSavePressed(context),
|
||||
actions: [
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.download,
|
||||
EntityAction.emailQuote,
|
||||
if (!invoice.isSent) EntityAction.markSent,
|
||||
invoice.invoiceId.isEmpty
|
||||
? EntityAction.convertToInvoice
|
||||
: EntityAction.viewInvoice,
|
||||
if (invoice.isOld) EntityAction.clone,
|
||||
],
|
||||
actions: invoice.getActions(
|
||||
userCompany: state.userCompany,
|
||||
client: client,
|
||||
),
|
||||
onActionPressed: (context, action) => _onSavePressed(context, action),
|
||||
appBarBottom: TabBar(
|
||||
controller: _controller,
|
||||
|
|
|
|||
|
|
@ -130,15 +130,9 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
|
|||
if (recurringExpense.isOld &&
|
||||
!hasRecurringExpenseChanges(
|
||||
recurringExpense, state.recurringExpenseState.map) &&
|
||||
[
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(recurringExpense, action);
|
||||
if ([EntityAction.start, EntityAction.stop].contains(action)) {
|
||||
viewEntity(entity: recurringExpense, force: true);
|
||||
}
|
||||
} else {
|
||||
final Completer<ExpenseEntity> completer =
|
||||
new Completer<ExpenseEntity>();
|
||||
|
|
@ -167,16 +161,8 @@ class RecurringExpenseEditVM extends AbstractExpenseEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.clone,
|
||||
EntityAction.viewPdf,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedRecurringExpense, action);
|
||||
if ([EntityAction.start, EntityAction.stop].contains(action)) {
|
||||
viewEntity(entity: savedRecurringExpense, force: true);
|
||||
}
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
showDialog<ErrorDialog>(
|
||||
|
|
|
|||
|
|
@ -87,6 +87,7 @@ class _RecurringInvoiceEditState extends State<RecurringInvoiceEdit>
|
|||
final state = viewModel.state;
|
||||
final invoice = viewModel.invoice;
|
||||
final prefState = state.prefState;
|
||||
final client = state.clientState.get(invoice.clientId);
|
||||
final isFullscreen = prefState.isEditorFullScreen(EntityType.invoice);
|
||||
|
||||
return EditScaffold(
|
||||
|
|
@ -97,14 +98,10 @@ class _RecurringInvoiceEditState extends State<RecurringInvoiceEdit>
|
|||
: localization.editRecurringInvoice,
|
||||
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||
onSavePressed: (context) => _onSavePressed(context),
|
||||
actions: [
|
||||
if (!recurringInvoice.isRunning)
|
||||
EntityAction.start
|
||||
else
|
||||
EntityAction.stop,
|
||||
EntityAction.viewPdf,
|
||||
if (invoice.isOld) EntityAction.clone,
|
||||
],
|
||||
actions: invoice.getActions(
|
||||
userCompany: state.userCompany,
|
||||
client: client,
|
||||
),
|
||||
onActionPressed: (context, action) => _onSavePressed(context, action),
|
||||
appBarBottom: TabBar(
|
||||
controller: _controller,
|
||||
|
|
|
|||
|
|
@ -95,16 +95,9 @@ class RecurringInvoiceEditVM extends AbstractInvoiceEditVM {
|
|||
if (recurringInvoice.isOld &&
|
||||
!hasRecurringInvoiceChanges(
|
||||
recurringInvoice, state.recurringInvoiceState.map) &&
|
||||
[
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(recurringInvoice, action);
|
||||
if ([EntityAction.start, EntityAction.stop].contains(action)) {
|
||||
viewEntity(entity: recurringInvoice, force: true);
|
||||
}
|
||||
} else {
|
||||
final Completer<InvoiceEntity> completer =
|
||||
Completer<InvoiceEntity>();
|
||||
|
|
@ -136,16 +129,8 @@ class RecurringInvoiceEditVM extends AbstractInvoiceEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.viewPdf,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedRecurringInvoice, action);
|
||||
if ([EntityAction.start, EntityAction.stop].contains(action)) {
|
||||
viewEntity(entity: savedRecurringInvoice, force: true);
|
||||
}
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
showDialog<ErrorDialog>(
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ class _TaskEditState extends State<TaskEdit>
|
|||
final viewModel = widget.viewModel;
|
||||
final task = viewModel.task;
|
||||
final state = viewModel.state;
|
||||
final client = state.clientState.get(task.clientId);
|
||||
final isFullscreen = state.prefState.isEditorFullScreen(EntityType.task);
|
||||
|
||||
return EditScaffold(
|
||||
|
|
@ -102,13 +103,10 @@ class _TaskEditState extends State<TaskEdit>
|
|||
onCancelPressed: (context) => viewModel.onCancelPressed(context),
|
||||
onSavePressed: (context, [EntityAction action]) =>
|
||||
_onSavePressed(context, action),
|
||||
actions: [
|
||||
if (!task.isInvoiced) ...[
|
||||
task.isRunning ? EntityAction.stop : EntityAction.start,
|
||||
EntityAction.invoiceTask,
|
||||
],
|
||||
if (task.isOld) EntityAction.clone,
|
||||
],
|
||||
actions: task.getActions(
|
||||
userCompany: state.userCompany,
|
||||
client: client,
|
||||
),
|
||||
onActionPressed: (context, action) => _onSavePressed(context, action),
|
||||
appBarBottom: TabBar(
|
||||
controller: _controller,
|
||||
|
|
|
|||
|
|
@ -98,16 +98,9 @@ class TaskEditVM {
|
|||
|
||||
if (task.isOld &&
|
||||
!hasTaskChanges(task, state.taskState.map) &&
|
||||
[
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.invoiceTask,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
action != null &&
|
||||
action.isClientSide) {
|
||||
handleEntityAction(task, action);
|
||||
if ([EntityAction.start, EntityAction.stop].contains(action)) {
|
||||
viewEntity(entity: task, force: true);
|
||||
}
|
||||
} else {
|
||||
final Completer<TaskEntity> completer = new Completer<TaskEntity>();
|
||||
store.dispatch(SaveTaskRequest(completer: completer, task: task));
|
||||
|
|
@ -132,16 +125,8 @@ class TaskEditVM {
|
|||
}
|
||||
}
|
||||
|
||||
if ([
|
||||
EntityAction.start,
|
||||
EntityAction.stop,
|
||||
EntityAction.invoiceTask,
|
||||
EntityAction.clone,
|
||||
].contains(action)) {
|
||||
if (action != null && action.isClientSide) {
|
||||
handleEntityAction(savedTask, action);
|
||||
if ([EntityAction.start, EntityAction.stop].contains(action)) {
|
||||
viewEntity(entity: task, force: true);
|
||||
}
|
||||
}
|
||||
}).catchError((Object error) {
|
||||
showDialog<ErrorDialog>(
|
||||
|
|
|
|||
Loading…
Reference in New Issue