Improve edit page actions

This commit is contained in:
Hillel Coren 2022-03-15 14:52:13 +02:00
parent c4cc156918
commit da7ac8ebf4
18 changed files with 97 additions and 179 deletions

View File

@ -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) {

View File

@ -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++;

View File

@ -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();

View File

@ -606,7 +606,7 @@ abstract class TaskEntity extends Object
}
}
if (!multiselect) {
if (!multiselect && isOld) {
if (userCompany.canCreate(EntityType.task)) {
actions.add(EntityAction.clone);
}

View File

@ -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,
)

View File

@ -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,

View File

@ -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) {

View File

@ -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,

View File

@ -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) {

View File

@ -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,

View File

@ -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) {

View File

@ -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) {

View File

@ -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,

View File

@ -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>(

View File

@ -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,

View File

@ -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>(

View File

@ -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,

View File

@ -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>(